diff --git a/cmake/FindMantleAPI.cmake b/cmake/FindMantleAPI.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..e9b284ea3e9a2d12cde8989d336a62840b044103
--- /dev/null
+++ b/cmake/FindMantleAPI.cmake
@@ -0,0 +1,14 @@
+# - Find MANTLE
+# Find the MANTLE includes and library
+#
+#  MANTLE_INCLUDE_DIR - Where to find MANTLE includes
+
+FIND_PATH(MANTLE_INCLUDE_DIR "MantleAPI/Execution/i_environment.h"
+  PATHS
+    ${PREFIX_PATH}
+  DOC "MANTLE - Headers"
+)
+
+set(MANTLE_TEST_INCLUDE_DIR ${MANTLE_INCLUDE_DIR}/../test CACHE PATH "MANTLE - Mocks for testing")
+
+message(STATUS "Found MantleAPI: ${MANTLE_INCLUDE_DIR}")
diff --git a/cmake/FindOpenScenarioEngine.cmake b/cmake/FindOpenScenarioEngine.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..7fe12f4b8cf44579c2683c9b147bb5173a142584
--- /dev/null
+++ b/cmake/FindOpenScenarioEngine.cmake
@@ -0,0 +1,19 @@
+# - Find OPENSCENARIOENGINE
+# Find the OPENSCENARIOENGINE includes and library
+#
+#  OPENSCENARIOENGINE_INCLUDE_DIR - Where to find OPENSCENARIOENGINE includes
+
+FIND_PATH(OPENSCENARIOENGINE_INCLUDE_DIR "OpenScenarioEngine/OpenScenarioEngine.h"
+  PATHS
+    ${PREFIX_PATH}
+  DOC "OPENSCENARIOENGINE - Headers"
+)
+
+FIND_PATH(OPENSCENARIOENGINE_SRC_INCLUDE_DIR "EntityCreator.h"
+  PATHS
+    ${PREFIX_PATH}
+  DOC "OPENSCENARIOENGINE - SRC Headers"
+)
+
+message(STATUS "Found OSC Engine includes: ${OPENSCENARIOENGINE_INCLUDE_DIR}")
+message(STATUS "Found OSC Engine src includes: ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}")
diff --git a/cmake/FindOpenScenarioParser.cmake b/cmake/FindOpenScenarioParser.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..217b993e79566de2f3dea47c3e721589a986db9e
--- /dev/null
+++ b/cmake/FindOpenScenarioParser.cmake
@@ -0,0 +1,12 @@
+# - Find OPENSCENARIOPARSER
+# Find the OPENSCENARIOPARSER includes and library
+#
+#  OPENSCENARIOPARSER_INCLUDE_DIR - Where to find OPENSCENARIOPARSER includes
+
+FIND_PATH(OPENSCENARIOPARSER_INCLUDE_DIR "openScenarioLib/generated/v1_1/api/ApiClassInterfacesV1_1.h"
+  PATHS
+    ${PREFIX_PATH}
+  DOC "OPENSCENARIOPARSER - Headers"
+)
+
+message(STATUS "Found OSC Parser: ${OPENSCENARIOPARSER_INCLUDE_DIR}")
diff --git a/cmake/FindUnits.cmake b/cmake/FindUnits.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..8d72a93d7ec77bdaf8ad0437d4ff1b4504655257
--- /dev/null
+++ b/cmake/FindUnits.cmake
@@ -0,0 +1,10 @@
+# - Find UNITS
+# Find the UNITS includes and library
+#
+#  UNITS_INCLUDE_DIR - Where to find UNITS includes
+
+FIND_PATH(UNITS_INCLUDE_DIR "units.h"
+  PATHS
+    ${PREFIX_PATH}
+  DOC "UNITS - Headers"
+)
diff --git a/cmake/HelperMacros.cmake b/cmake/HelperMacros.cmake
index 586e53b537ac9a1405c669e6daabdc54da6e949d..3472de0e9c267f51db6ccef62e2f59f25857aa2f 100644
--- a/cmake/HelperMacros.cmake
+++ b/cmake/HelperMacros.cmake
@@ -232,7 +232,11 @@ function(add_openpass_target)
       endif()
 
       add_executable(${PARSED_ARG_NAME} EXCLUDE_FROM_ALL ${PARSED_ARG_HEADERS} ${PARSED_ARG_SOURCES} ${PARSED_ARG_UIS})
-
+	    
+      target_include_directories(${PARSED_ARG_NAME} PRIVATE
+        ${MANTLE_TEST_INCLUDE_DIR}
+      )
+	
       target_link_libraries(${PARSED_ARG_NAME}
         GTest::gtest
         GTest::gmock
diff --git a/cmake/global.cmake b/cmake/global.cmake
index aa9b4bc4ee4745c2af1168300ba8602a9a7b5dd8..19d384fc6e56aff34b12201f8c3ecf0774d39d5c 100644
--- a/cmake/global.cmake
+++ b/cmake/global.cmake
@@ -97,6 +97,13 @@ if(WITH_SIMCORE OR WITH_TESTS)
   endif()
 endif()
 
+include(FindMantleAPI)
+include(FindOpenScenarioEngine)
+include(FindOpenScenarioParser)
+include(FindUnits)
+
+include_directories(SYSTEM ${MANTLE_INCLUDE_DIR} ${UNITS_INCLUDE_DIR})
+
 if(WITH_TESTS)
   find_package(GTest REQUIRED CONFIG)   # force config mode for better lookup consistency with newer gtest versions
   message(STATUS "Found GTest: ${GTest_DIR}")
@@ -185,4 +192,3 @@ if(WITH_DOC)
 endif()
 
 ###############################################################################
-
diff --git a/gui/common/pcm/PCM_Data/pcm_definitions.h b/gui/common/pcm/PCM_Data/pcm_definitions.h
index e0ad8a9bc6ccf4f7c2bfab97414b893963ae627a..073adfcdfd2f696fb1dd251b884c5c15e7665e92 100644
--- a/gui/common/pcm/PCM_Data/pcm_definitions.h
+++ b/gui/common/pcm/PCM_Data/pcm_definitions.h
@@ -47,7 +47,7 @@ inline AgentVehicleType GetAgentVehicleType(const std::string &strVehicleType)
 {
     if (0 == strVehicleType.compare("car"))
     {
-        return AgentVehicleType::Car;
+        return mantle_api::VehicleClass::kMedium_car;
     }
     else if (0 == strVehicleType.compare("pedestrian"))
     {
@@ -63,7 +63,7 @@ inline AgentVehicleType GetAgentVehicleType(const std::string &strVehicleType)
     }
     else if (0 == strVehicleType.compare("truck"))
     {
-        return AgentVehicleType::Truck;
+        return mantle_api::VehicleClass::kHeavy_truck;
     }
     return AgentVehicleType::Undefined;
 }
@@ -99,7 +99,7 @@ inline std::string GetAgentVehicleTypeStr(const int vehicleTypeCode)
         resultString = GetAgentVehicleTypeStr(AgentVehicleType::Undefined);
         break;
     case 0:
-        resultString = GetAgentVehicleTypeStr(AgentVehicleType::Car);
+        resultString = GetAgentVehicleTypeStr(mantle_api::VehicleClass::kMedium_car);
         break;
     case 1:
         resultString = GetAgentVehicleTypeStr(AgentVehicleType::Pedestrian);
@@ -111,7 +111,7 @@ inline std::string GetAgentVehicleTypeStr(const int vehicleTypeCode)
         resultString = GetAgentVehicleTypeStr(AgentVehicleType::Bicycle);
         break;
     case 4:
-        resultString = GetAgentVehicleTypeStr(AgentVehicleType::Truck);
+        resultString = GetAgentVehicleTypeStr(mantle_api::VehicleClass::kHeavy_truck);
         break;
     default:
         resultString = "unknown type";
diff --git a/gui/common/pcm/PCM_Importer/vehicleModelImporter.cpp b/gui/common/pcm/PCM_Importer/vehicleModelImporter.cpp
index 252d5bad9b161c87fb3c492a5ad6a3842a275f1d..7b27994799dad8bb6350f8f23fa251ce656d99e2 100644
--- a/gui/common/pcm/PCM_Importer/vehicleModelImporter.cpp
+++ b/gui/common/pcm/PCM_Importer/vehicleModelImporter.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2021 ITK Engineering GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -67,9 +68,9 @@ bool VehicleModelImporter::ParseParticipants(int id, QDomNode vehicleNode,
     AgentVehicleType agentVehicleType = GetAgentVehicleType(vehicleString);
     int vehicleTypeId = static_cast<int>(agentVehicleType);
     QString vehicleTypeIdString = QString::number(vehicleTypeId);
+    QString weight = vehicleNode.toElement().attribute("mass");
 
     QString mue = "";
-    QString weight = "";
     QString ixx = "";
     QString iyy = "";
     QString izz = "";
@@ -84,8 +85,6 @@ bool VehicleModelImporter::ParseParticipants(int id, QDomNode vehicleNode,
 
             if( name == "FrictionCoefficient"){
                 mue = value;
-            }else if (name == "Mass") {
-                weight = value;
             }
             else if (name == "MomentInertiaRoll")
             {
diff --git a/gui/plugins/pcmSimulation/Models/ConfigurationGeneratorPcm/DataStructuresXml/XmlModelsConfig.cpp b/gui/plugins/pcmSimulation/Models/ConfigurationGeneratorPcm/DataStructuresXml/XmlModelsConfig.cpp
index 14d176817f0a0760477c529e7bba3f1f5dd4fa5e..ddb6e231890f8e7b6355564c8135fa9d3eaebbea 100644
--- a/gui/plugins/pcmSimulation/Models/ConfigurationGeneratorPcm/DataStructuresXml/XmlModelsConfig.cpp
+++ b/gui/plugins/pcmSimulation/Models/ConfigurationGeneratorPcm/DataStructuresXml/XmlModelsConfig.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2017-2021 ITK Engineering GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -67,6 +68,7 @@ bool XmlModelsConfig::WriteToXml(QXmlStreamWriter *xmlWriter)
     for (XmlAgent agent : agents)
     {
         xmlWriter->writeStartElement("Vehicle");
+        xmlWriter->writeAttribute("mass", agent.weight);
         xmlWriter->writeAttribute("name","Agent_" + QString::number(agent.id));
         xmlWriter->writeAttribute("vehicleCategory", "car"); // always "car"
         xmlWriter->writeStartElement("Properties");
@@ -95,10 +97,6 @@ bool XmlModelsConfig::WriteToXml(QXmlStreamWriter *xmlWriter)
         xmlWriter->writeAttribute("value","1.0");
         xmlWriter->writeEndElement(); // Property
         xmlWriter->writeStartElement("Property");
-        xmlWriter->writeAttribute("name","Mass");
-        xmlWriter->writeAttribute("value",agent.weight);
-        xmlWriter->writeEndElement(); // Property
-        xmlWriter->writeStartElement("Property");
         xmlWriter->writeAttribute("name","MaximumEngineSpeed");
         xmlWriter->writeAttribute("value","10000.0");
         xmlWriter->writeEndElement(); // Property
diff --git a/sim/CMakeLists.txt b/sim/CMakeLists.txt
index e757142f04d232a79913c13912f59a541313c9aa..0ea93de68642b8ceb490eb8f6bf037b266776991 100644
--- a/sim/CMakeLists.txt
+++ b/sim/CMakeLists.txt
@@ -26,6 +26,7 @@ configure_file(
 include_directories(
   ${CMAKE_CURRENT_LIST_DIR}
   ${CMAKE_CURRENT_LIST_DIR}/..
+  ${MANTLE_INCLUDE_DIR}
 )
 
 if(WITH_SIMCORE)
diff --git a/sim/contrib/examples/Common/ProfilesCatalog.xml b/sim/contrib/examples/Common/ProfilesCatalog.xml
index 50cbbd81c2951aa2a42583609b95b0ed751474c0..ec83791758193ab9460d6a71b6cdfb522098d96a 100644
--- a/sim/contrib/examples/Common/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Common/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Common/Scenario.xosc b/sim/contrib/examples/Common/Scenario.xosc
index 328696579c10725aa27877b015e029492e5c1669..09e8e2dbe20a626bf66a29cc675c5a3abc82602b 100644
--- a/sim/contrib/examples/Common/Scenario.xosc
+++ b/sim/contrib/examples/Common/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="43.5"/>
                 </SpeedActionTarget>
@@ -66,7 +73,11 @@
         </Private>
       </Actions>
     </Init>
-    <Story/>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Common/VehicleModelsCatalog.xosc b/sim/contrib/examples/Common/VehicleModelsCatalog.xosc
deleted file mode 100644
index 01e51226d74a35c6c530d02fd15341203ea8b602..0000000000000000000000000000000000000000
--- a/sim/contrib/examples/Common/VehicleModelsCatalog.xosc
+++ /dev/null
@@ -1,284 +0,0 @@
-<?xml version="1.0"?>
-<OpenSCENARIO>
-  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS vehicle models" author="in-tech GmbH"/>
-  <Catalog name="VehicleCatalog">
-    <Vehicle name="car_bmw_i3" vehicleCategory="car">
-      <Properties>
-        <Property name="AirDragCoefficient" value="0.3"/>
-        <Property name="AxleRatio" value="1.0"/>
-        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
-        <Property name="FrictionCoefficient" value="1.0"/>
-        <Property name="FrontSurface" value="2.38"/>
-        <Property name="GearRatio1" value="9.665"/>
-        <Property name="Mass" value="1320.0"/>
-        <Property name="MaximumEngineSpeed" value="6000.0"/>
-        <Property name="MaximumEngineTorque" value="250.0"/>
-        <Property name="MinimumEngineSpeed" value="900.0"/>
-        <Property name="MinimumEngineTorque" value="-54.0"/>
-        <Property name="MomentInertiaPitch" value="0.0"/>
-        <Property name="MomentInertiaRoll" value="0.0"/>
-        <Property name="MomentInertiaYaw" value="0.0"/>
-        <Property name="NumberOfGears" value="1"/>
-        <Property name="SteeringRatio" value="10.7"/>
-      </Properties>
-      <BoundingBox>
-        <Center x="1.25" y="0.0" z="0.84"/>
-        <Dimensions width="2.04" length="3.96" height="1.68"/>
-      </BoundingBox>
-      <Performance maxSpeed="41.67" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
-      <Axles>
-        <FrontAxle maxSteering="0.5282" wheelDiameter="0.682" trackWidth="1.8" positionX="2.52" positionZ="0.341"/>
-        <RearAxle maxSteering="0.0" wheelDiameter="0.682" trackWidth="1.8" positionX="0.0" positionZ="0.341"/>
-      </Axles>
-    </Vehicle>
-    <Vehicle name="car_bmw_3" vehicleCategory="car">
-      <Properties>
-        <Property name="AirDragCoefficient" value="0.3"/>
-        <Property name="AxleRatio" value="2.813"/>
-        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
-        <Property name="FrictionCoefficient" value="1.0"/>
-        <Property name="FrontSurface" value="2.2"/>
-        <Property name="GearRatio1" value="5.0"/>
-        <Property name="GearRatio2" value="3.2"/>
-        <Property name="GearRatio3" value="2.143"/>
-        <Property name="GearRatio4" value="1.72"/>
-        <Property name="GearRatio5" value="1.314"/>
-        <Property name="GearRatio6" value="1.0"/>
-        <Property name="GearRatio7" value="0.822"/>
-        <Property name="GearRatio8" value="0.64"/>
-        <Property name="Mass" value="1525.0"/>
-        <Property name="MaximumEngineSpeed" value="6000.0"/>
-        <Property name="MaximumEngineTorque" value="270.0"/>
-        <Property name="MinimumEngineSpeed" value="900.0"/>
-        <Property name="MinimumEngineTorque" value="-54.0"/>
-        <Property name="MomentInertiaPitch" value="0.0"/>
-        <Property name="MomentInertiaRoll" value="0.0"/>
-        <Property name="MomentInertiaYaw" value="0.0"/>
-        <Property name="NumberOfGears" value="8"/>
-        <Property name="SteeringRatio" value="10.7"/>
-      </Properties>
-      <BoundingBox>
-        <Center x="1.285" y="0.0" z="0.72"/>
-        <Dimensions width="1.96" length="4.63" height="1.44"/>
-      </BoundingBox>
-      <Performance maxSpeed="69.44" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
-      <Axles>
-        <FrontAxle maxSteering="0.5012" wheelDiameter="0.634" trackWidth="1.8" positionX="2.81" positionZ="0.317"/>
-        <RearAxle maxSteering="0.0" wheelDiameter="0.634" trackWidth="1.8" positionX="0.0" positionZ="0.317"/>
-      </Axles>
-    </Vehicle>
-    <Vehicle name="car_bmw_7_1" vehicleCategory="car">
-      <Properties>
-        <Property name="AirDragCoefficient" value="0.3"/>
-        <Property name="AxleRatio" value="3.077"/>
-        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
-        <Property name="FrictionCoefficient" value="1.0"/>
-        <Property name="FrontSurface" value="2.42"/>
-        <Property name="GearRatio1" value="5.0"/>
-        <Property name="GearRatio2" value="3.2"/>
-        <Property name="GearRatio3" value="2.143"/>
-        <Property name="GearRatio4" value="1.72"/>
-        <Property name="GearRatio5" value="1.314"/>
-        <Property name="GearRatio6" value="1.0"/>
-        <Property name="GearRatio7" value="0.822"/>
-        <Property name="GearRatio8" value="0.64"/>
-        <Property name="Mass" value="1845.0"/>
-        <Property name="MaximumEngineSpeed" value="6000.0"/>
-        <Property name="MaximumEngineTorque" value="450.0"/>
-        <Property name="MinimumEngineSpeed" value="900.0"/>
-        <Property name="MinimumEngineTorque" value="-54.0"/>
-        <Property name="MomentInertiaPitch" value="0.0"/>
-        <Property name="MomentInertiaRoll" value="0.0"/>
-        <Property name="MomentInertiaYaw" value="0.0"/>
-        <Property name="NumberOfGears" value="8"/>
-        <Property name="SteeringRatio" value="10.7"/>
-      </Properties>
-      <BoundingBox>
-        <Center x="1.46" y="0.0" z="0.755"/>
-        <Dimensions width="2.18" length="5.26" height="1.51"/>
-      </BoundingBox>
-      <Performance maxSpeed="69.44" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
-      <Axles>
-        <FrontAxle maxSteering="0.5226" wheelDiameter="0.682" trackWidth="1.8" positionX="3.22" positionZ="0.341"/>
-        <RearAxle maxSteering="0.0" wheelDiameter="0.682" trackWidth="1.8" positionX="0.0" positionZ="0.341"/>
-      </Axles>
-    </Vehicle>
-    <Vehicle name="car_bmw_7_2" vehicleCategory="car">
-      <Properties>
-        <Property name="AirDragCoefficient" value="0.3"/>
-        <Property name="AxleRatio" value="3.077"/>
-        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
-        <Property name="FrictionCoefficient" value="1.0"/>
-        <Property name="FrontSurface" value="2.42"/>
-        <Property name="GearRatio1" value="4.714"/>
-        <Property name="GearRatio2" value="3.143"/>
-        <Property name="GearRatio3" value="2.106"/>
-        <Property name="GearRatio4" value="1.667"/>
-        <Property name="GearRatio5" value="1.285"/>
-        <Property name="GearRatio6" value="1.0"/>
-        <Property name="GearRatio7" value="0.839"/>
-        <Property name="GearRatio8" value="0.667"/>
-        <Property name="Mass" value="1900.0"/>
-        <Property name="MaximumEngineSpeed" value="6000.0"/>
-        <Property name="MaximumEngineTorque" value="450.0"/>
-        <Property name="MinimumEngineSpeed" value="900.0"/>
-        <Property name="MinimumEngineTorque" value="-54.0"/>
-        <Property name="MomentInertiaPitch" value="0.0"/>
-        <Property name="MomentInertiaRoll" value="0.0"/>
-        <Property name="MomentInertiaYaw" value="0.0"/>
-        <Property name="NumberOfGears" value="8"/>
-        <Property name="SteeringRatio" value="10.7"/>
-      </Properties>
-      <BoundingBox>
-        <Center x="1.485" y="0.0" z="0.745"/>
-        <Dimensions width="2.16" length="5.27" height="1.49"/>
-      </BoundingBox>
-      <Performance maxSpeed="69.44" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
-      <Axles>
-        <FrontAxle maxSteering="0.5279" wheelDiameter="0.682" trackWidth="1.8" positionX="3.25" positionZ="0.341"/>
-        <RearAxle maxSteering="0.0" wheelDiameter="0.682" trackWidth="1.8" positionX="0.0" positionZ="0.341"/>
-      </Axles>
-    </Vehicle>
-    <Vehicle name="car_mini_cooper" vehicleCategory="car">
-      <Properties>
-        <Property name="AirDragCoefficient" value="0.3"/>
-        <Property name="AxleRatio" value="3.789"/>
-        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
-        <Property name="FrictionCoefficient" value="1.0"/>
-        <Property name="FrontSurface" value="2.07"/>
-        <Property name="GearRatio1" value="4.154"/>
-        <Property name="GearRatio2" value="2.45"/>
-        <Property name="GearRatio3" value="1.557"/>
-        <Property name="GearRatio4" value="1.09"/>
-        <Property name="GearRatio5" value="0.843"/>
-        <Property name="GearRatio6" value="0.675"/>
-        <Property name="GearRatio7" value="0.547"/>
-        <Property name="Mass" value="1235.0"/>
-        <Property name="MaximumEngineSpeed" value="6000.0"/>
-        <Property name="MaximumEngineTorque" value="220.0"/>
-        <Property name="MinimumEngineSpeed" value="900.0"/>
-        <Property name="MinimumEngineTorque" value="-54.0"/>
-        <Property name="MomentInertiaPitch" value="0.0"/>
-        <Property name="MomentInertiaRoll" value="0.0"/>
-        <Property name="MomentInertiaYaw" value="0.0"/>
-        <Property name="NumberOfGears" value="7"/>
-        <Property name="SteeringRatio" value="10.7"/>
-      </Properties>
-      <BoundingBox>
-        <Center x="1.35" y="0.0" z="0.71"/>
-        <Dimensions width="1.89" length="3.8" height="1.42"/>
-      </BoundingBox>
-      <Performance maxSpeed="58.33" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
-      <Axles>
-        <FrontAxle maxSteering="0.4766" wheelDiameter="0.59" trackWidth="1.8" positionX="2.48" positionZ="0.295"/>
-        <RearAxle maxSteering="0.0" wheelDiameter="0.59" trackWidth="1.8" positionX="0.0" positionZ="0.295"/>
-      </Axles>
-    </Vehicle>
-    <Vehicle name="bus" vehicleCategory="truck">
-      <Properties>
-        <Property name="AirDragCoefficient" value="0.8"/>
-        <Property name="AxleRatio" value="4.0"/>
-        <Property name="DecelerationFromPowertrainDrag" value="1.0"/>
-        <Property name="FrictionCoefficient" value="1.0"/>
-        <Property name="FrontSurface" value="9.0"/>
-        <Property name="GearRatio1" value="6.316"/>
-        <Property name="GearRatio2" value="4.554"/>
-        <Property name="GearRatio3" value="3.269"/>
-        <Property name="GearRatio4" value="2.352"/>
-        <Property name="GearRatio5" value="1.692"/>
-        <Property name="GearRatio6" value="1.217"/>
-        <Property name="GearRatio7" value="0.876"/>
-        <Property name="GearRatio8" value="0.630"/>
-        <Property name="Mass" value="25000.0"/>
-        <Property name="MaximumEngineSpeed" value="2500.0"/>
-        <Property name="MaximumEngineTorque" value="1400.0"/>
-        <Property name="MinimumEngineSpeed" value="600.0"/>
-        <Property name="MinimumEngineTorque" value="-140.0"/>
-        <Property name="MomentInertiaPitch" value="0.0"/>
-        <Property name="MomentInertiaRoll" value="0.0"/>
-        <Property name="MomentInertiaYaw" value="0.0"/>
-        <Property name="NumberOfGears" value="8"/>
-        <Property name="SteeringRatio" value="15.0"/>
-      </Properties>
-      <BoundingBox>
-        <Center x="2.815" y="0.0" z="1.92"/>
-        <Dimensions width="2.91" length="13.23" height="3.84"/>
-      </BoundingBox>
-      <Performance maxSpeed="33.33" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
-      <Axles>
-        <FrontAxle maxSteering="0.6972" wheelDiameter="0.808" trackWidth="1.8" positionX="6.64" positionZ="0.404"/>
-        <RearAxle maxSteering="0.0" wheelDiameter="0.808" trackWidth="1.8" positionX="0.0" positionZ="0.404"/>
-      </Axles>
-    </Vehicle>
-    <Vehicle name="truck" vehicleCategory="truck">
-      <Properties>
-        <Property name="AirDragCoefficient" value="0.8"/>
-        <Property name="AxleRatio" value="4.0"/>
-        <Property name="DecelerationFromPowertrainDrag" value="1.0"/>
-        <Property name="FrictionCoefficient" value="1.0"/>
-        <Property name="FrontSurface" value="9.0"/>
-        <Property name="GearRatio1" value="6.316"/>
-        <Property name="GearRatio2" value="4.554"/>
-        <Property name="GearRatio3" value="3.269"/>
-        <Property name="GearRatio4" value="2.352"/>
-        <Property name="GearRatio5" value="1.692"/>
-        <Property name="GearRatio6" value="1.217"/>
-        <Property name="GearRatio7" value="0.876"/>
-        <Property name="GearRatio8" value="0.630"/>
-        <Property name="Mass" value="30000.0"/>
-        <Property name="MaximumEngineSpeed" value="2500.0"/>
-        <Property name="MaximumEngineTorque" value="1400.0"/>
-        <Property name="MinimumEngineSpeed" value="600.0"/>
-        <Property name="MinimumEngineTorque" value="-140.0"/>
-        <Property name="MomentInertiaPitch" value="0.0"/>
-        <Property name="MomentInertiaRoll" value="0.0"/>
-        <Property name="MomentInertiaYaw" value="0.0"/>
-        <Property name="NumberOfGears" value="8"/>
-        <Property name="SteeringRatio" value="15.0"/>
-      </Properties>
-      <BoundingBox>
-        <Center x="2.685" y="0.0" z="1.74"/>
-        <Dimensions width="3.16" length="8.83" height="3.48"/>
-      </BoundingBox>
-      <Performance maxSpeed="25.0" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
-      <Axles>
-        <FrontAxle maxSteering="0.4352" wheelDiameter="0.808" trackWidth="1.8" positionX="4.36" positionZ="0.404"/>
-        <RearAxle maxSteering="0.0" wheelDiameter="0.808" trackWidth="1.8" positionX="0.0" positionZ="0.404"/>
-      </Axles>
-    </Vehicle>
-    <Vehicle name="bicycle" vehicleCategory="bicycle">
-      <Properties>
-        <Property name="AirDragCoefficient" value="0.3"/>
-        <Property name="AxleRatio" value="3.0"/>
-        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
-        <Property name="FrictionCoefficient" value="1.0"/>
-        <Property name="FrontSurface" value="1.9"/>
-        <Property name="GearRatio1" value="4.350"/>
-        <Property name="GearRatio2" value="2.496"/>
-        <Property name="GearRatio3" value="1.665"/>
-        <Property name="GearRatio4" value="1.230"/>
-        <Property name="GearRatio5" value="1.0"/>
-        <Property name="GearRatio6" value="0.851"/>
-        <Property name="Mass" value="90.0"/>
-        <Property name="MaximumEngineSpeed" value="6000.0"/>
-        <Property name="MaximumEngineTorque" value="540.0"/>
-        <Property name="MinimumEngineSpeed" value="900.0"/>
-        <Property name="MinimumEngineTorque" value="-54.0"/>
-        <Property name="MomentInertiaPitch" value="0.0"/>
-        <Property name="MomentInertiaRoll" value="0.0"/>
-        <Property name="MomentInertiaYaw" value="0.0"/>
-        <Property name="NumberOfGears" value="6"/>
-        <Property name="SteeringRatio" value="10.7"/>
-      </Properties>
-      <BoundingBox>
-        <Center x="0.175" y="0.0" z="0.9325"/>
-        <Dimensions width="0.5" length="1.89" height="1.865"/>
-      </BoundingBox>
-      <Performance maxSpeed="10.0" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
-      <Axles>
-        <FrontAxle maxSteering="1.5708" wheelDiameter="0.636" trackWidth="0.1" positionX="1.04" positionZ="0.318"/>
-        <RearAxle maxSteering="0.0" wheelDiameter="0.636" trackWidth="0.1" positionX="0.0" positionZ="0.318"/>
-      </Axles>
-    </Vehicle>
-  </Catalog>
-</OpenSCENARIO>
diff --git a/sim/contrib/examples/Common/PedestrianModelsCatalog.xosc b/sim/contrib/examples/Common/Vehicles/PedestrianModelsCatalog.xosc
similarity index 84%
rename from sim/contrib/examples/Common/PedestrianModelsCatalog.xosc
rename to sim/contrib/examples/Common/Vehicles/PedestrianModelsCatalog.xosc
index bbda0b044d1890917d13fe64da9e7e3c14ff176c..84c1ac67df3189c1fcb287113dcd8d2377ba784b 100644
--- a/sim/contrib/examples/Common/PedestrianModelsCatalog.xosc
+++ b/sim/contrib/examples/Common/Vehicles/PedestrianModelsCatalog.xosc
@@ -4,9 +4,6 @@
   <Catalog name="PedestrianCatalog">
     <Pedestrian model="pedestrian_child" mass="30.0" name="pedestrian_child" pedestrianCategory="pedestrian">
       <ParameterDeclarations/>
-      <Properties>
-        <Property name="Mass" value="40.0"/>
-      </Properties>
       <BoundingBox>
         <Center x="0.0645" y="0.0" z="0.577"/>
         <Dimensions width="0.298" length="0.711" height="1.154"/>
@@ -15,9 +12,6 @@
     </Pedestrian>
     <Pedestrian model="pedestrian_adult" mass="80.0" name="pedestrian_adult" pedestrianCategory="pedestrian">
       <ParameterDeclarations/>
-      <Properties>
-        <Property name="Mass" value="70.0"/>
-      </Properties>
       <BoundingBox>
         <Center x="0.1" y="0.0" z="0.9"/>
         <Dimensions width="0.5" length="0.6" height="1.8"/>
diff --git a/sim/contrib/examples/Common/Vehicles/VehicleModelsCatalog.xosc b/sim/contrib/examples/Common/Vehicles/VehicleModelsCatalog.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..5096e6b6c2e5a797d5d156df59d455f6e4805a90
--- /dev/null
+++ b/sim/contrib/examples/Common/Vehicles/VehicleModelsCatalog.xosc
@@ -0,0 +1,546 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS vehicle models" author="in-tech GmbH"/>
+  <Catalog name="VehicleCatalog">
+    <Vehicle mass="1320.0" name="car_bmw_i3" vehicleCategory="car">
+      <Properties>
+        <Property name="AirDragCoefficient" value="0.3"/>
+        <Property name="AxleRatio" value="1.0"/>
+        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
+        <Property name="FrictionCoefficient" value="1.0"/>
+        <Property name="FrontSurface" value="2.38"/>
+        <Property name="GearRatio1" value="9.665"/>
+        <Property name="MaximumEngineSpeed" value="6000.0"/>
+        <Property name="MaximumEngineTorque" value="250.0"/>
+        <Property name="MinimumEngineSpeed" value="900.0"/>
+        <Property name="MinimumEngineTorque" value="-54.0"/>
+        <Property name="MomentInertiaPitch" value="0.0"/>
+        <Property name="MomentInertiaRoll" value="0.0"/>
+        <Property name="MomentInertiaYaw" value="0.0"/>
+        <Property name="NumberOfGears" value="1"/>
+        <Property name="SteeringRatio" value="10.7"/>
+        <Property name="SensorPosition/FrontWindow/Lateral" value="1.9"/>
+        <Property name="SensorPosition/FrontWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Height" value="1.45"/>
+        <Property name="SensorPosition/FrontWindow/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Lateral" value="-0.21"/>
+        <Property name="SensorPosition/RearWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Height" value="1.39"/>
+        <Property name="SensorPosition/RearWindow/Pitch" value="3.141592"/>
+        <Property name="SensorPosition/RearWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Lateral" value="3.26"/>
+        <Property name="SensorPosition/FrontCenter/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Height" value="0.66"/>
+        <Property name="SensorPosition/FrontCenter/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Lateral" value="2.98"/>
+        <Property name="SensorPosition/FrontLeft/Longitudinal" value="0.68"/>
+        <Property name="SensorPosition/FrontLeft/Height" value="0.82"/>
+        <Property name="SensorPosition/FrontLeft/Pitch" value="1.134464"/>
+        <Property name="SensorPosition/FrontLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Lateral" value="2.98"/>
+        <Property name="SensorPosition/FrontRight/Longitudinal" value="-0.68"/>
+        <Property name="SensorPosition/FrontRight/Height" value="0.82"/>
+        <Property name="SensorPosition/FrontRight/Pitch" value="-1.134464"/>
+        <Property name="SensorPosition/FrontRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Lateral" value="1.2"/>
+        <Property name="SensorPosition/SideLeft/Longitudinal" value="0.8"/>
+        <Property name="SensorPosition/SideLeft/Height" value="0.3"/>
+        <Property name="SensorPosition/SideLeft/Pitch" value="1.570796"/>
+        <Property name="SensorPosition/SideLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Lateral" value="1.2"/>
+        <Property name="SensorPosition/SideRight/Longitudinal" value="-0.8"/>
+        <Property name="SensorPosition/SideRight/Height" value="0.3"/>
+        <Property name="SensorPosition/SideRight/Pitch" value="-1.570796"/>
+        <Property name="SensorPosition/SideRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Lateral" value="-0.49"/>
+        <Property name="SensorPosition/RearLeft/Longitudinal" value="0.64"/>
+        <Property name="SensorPosition/RearLeft/Height" value="0.64"/>
+        <Property name="SensorPosition/RearLeft/Pitch" value="2.146755"/>
+        <Property name="SensorPosition/RearLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Lateral" value="-0.49"/>
+        <Property name="SensorPosition/RearRight/Longitudinal" value="-0.64"/>
+        <Property name="SensorPosition/RearRight/Height" value="0.64"/>
+        <Property name="SensorPosition/RearRight/Pitch" value="-2.146755"/>
+        <Property name="SensorPosition/RearRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Yaw" value="0.0"/>
+      </Properties>
+      <BoundingBox>
+        <Center x="1.25" y="0.0" z="0.84"/>
+        <Dimensions width="2.04" length="3.96" height="1.68"/>
+      </BoundingBox>
+      <Performance maxSpeed="41.67" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
+      <Axles>
+        <FrontAxle maxSteering="0.5282" wheelDiameter="0.682" trackWidth="1.8" positionX="2.52" positionZ="0.341"/>
+        <RearAxle maxSteering="0.0" wheelDiameter="0.682" trackWidth="1.8" positionX="0.0" positionZ="0.341"/>
+      </Axles>
+    </Vehicle>
+    <Vehicle mass="1525.0" name="car_bmw_3" vehicleCategory="car">
+      <Properties>
+        <Property name="AirDragCoefficient" value="0.3"/>
+        <Property name="AxleRatio" value="2.813"/>
+        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
+        <Property name="FrictionCoefficient" value="1.0"/>
+        <Property name="FrontSurface" value="2.2"/>
+        <Property name="GearRatio1" value="5.0"/>
+        <Property name="GearRatio2" value="3.2"/>
+        <Property name="GearRatio3" value="2.143"/>
+        <Property name="GearRatio4" value="1.72"/>
+        <Property name="GearRatio5" value="1.314"/>
+        <Property name="GearRatio6" value="1.0"/>
+        <Property name="GearRatio7" value="0.822"/>
+        <Property name="GearRatio8" value="0.64"/>
+        <Property name="MaximumEngineSpeed" value="6000.0"/>
+        <Property name="MaximumEngineTorque" value="270.0"/>
+        <Property name="MinimumEngineSpeed" value="900.0"/>
+        <Property name="MinimumEngineTorque" value="-54.0"/>
+        <Property name="MomentInertiaPitch" value="0.0"/>
+        <Property name="MomentInertiaRoll" value="0.0"/>
+        <Property name="MomentInertiaYaw" value="0.0"/>
+        <Property name="NumberOfGears" value="8"/>
+        <Property name="SteeringRatio" value="10.7"/>
+        <Property name="SensorPosition/FrontWindow/Lateral" value="1.82"/>
+        <Property name="SensorPosition/FrontWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Height" value="1.27"/>
+        <Property name="SensorPosition/FrontWindow/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Lateral" value="0.16"/>
+        <Property name="SensorPosition/RearWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Height" value="1.31"/>
+        <Property name="SensorPosition/RearWindow/Pitch" value="3.141592"/>
+        <Property name="SensorPosition/RearWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Lateral" value="3.71"/>
+        <Property name="SensorPosition/FrontCenter/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Height" value="0.56"/>
+        <Property name="SensorPosition/FrontCenter/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Lateral" value="3.33"/>
+        <Property name="SensorPosition/FrontLeft/Longitudinal" value="0.78"/>
+        <Property name="SensorPosition/FrontLeft/Height" value="0.68"/>
+        <Property name="SensorPosition/FrontLeft/Pitch" value="1.134464"/>
+        <Property name="SensorPosition/FrontLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Lateral" value="3.33"/>
+        <Property name="SensorPosition/FrontRight/Longitudinal" value="-0.78"/>
+        <Property name="SensorPosition/FrontRight/Height" value="0.68"/>
+        <Property name="SensorPosition/FrontRight/Pitch" value="-1.134464"/>
+        <Property name="SensorPosition/FrontRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Lateral" value="1.21"/>
+        <Property name="SensorPosition/SideLeft/Longitudinal" value="0.81"/>
+        <Property name="SensorPosition/SideLeft/Height" value="0.21"/>
+        <Property name="SensorPosition/SideLeft/Pitch" value="1.570796"/>
+        <Property name="SensorPosition/SideLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Lateral" value="1.21"/>
+        <Property name="SensorPosition/SideRight/Longitudinal" value="-0.81"/>
+        <Property name="SensorPosition/SideRight/Height" value="0.21"/>
+        <Property name="SensorPosition/SideRight/Pitch" value="-1.570796"/>
+        <Property name="SensorPosition/SideRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Lateral" value="-0.65"/>
+        <Property name="SensorPosition/RearLeft/Longitudinal" value="0.675"/>
+        <Property name="SensorPosition/RearLeft/Height" value="0.65"/>
+        <Property name="SensorPosition/RearLeft/Pitch" value="2.146755"/>
+        <Property name="SensorPosition/RearLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Lateral" value="-0.65"/>
+        <Property name="SensorPosition/RearRight/Longitudinal" value="-0.75"/>
+        <Property name="SensorPosition/RearRight/Height" value="0.65"/>
+        <Property name="SensorPosition/RearRight/Pitch" value="-2.146755"/>
+        <Property name="SensorPosition/RearRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Yaw" value="0.0"/>
+      </Properties>
+      <BoundingBox>
+        <Center x="1.285" y="0.0" z="0.72"/>
+        <Dimensions width="1.96" length="4.63" height="1.44"/>
+      </BoundingBox>
+      <Performance maxSpeed="69.44" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
+      <Axles>
+        <FrontAxle maxSteering="0.5012" wheelDiameter="0.634" trackWidth="1.8" positionX="2.81" positionZ="0.317"/>
+        <RearAxle maxSteering="0.0" wheelDiameter="0.634" trackWidth="1.8" positionX="0.0" positionZ="0.317"/>
+      </Axles>
+    </Vehicle>
+    <Vehicle mass="1845.0" name="car_bmw_7_1" vehicleCategory="car">
+      <Properties>
+        <Property name="AirDragCoefficient" value="0.3"/>
+        <Property name="AxleRatio" value="3.077"/>
+        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
+        <Property name="FrictionCoefficient" value="1.0"/>
+        <Property name="FrontSurface" value="2.42"/>
+        <Property name="GearRatio1" value="5.0"/>
+        <Property name="GearRatio2" value="3.2"/>
+        <Property name="GearRatio3" value="2.143"/>
+        <Property name="GearRatio4" value="1.72"/>
+        <Property name="GearRatio5" value="1.314"/>
+        <Property name="GearRatio6" value="1.0"/>
+        <Property name="GearRatio7" value="0.822"/>
+        <Property name="GearRatio8" value="0.64"/>
+        <Property name="MaximumEngineSpeed" value="6000.0"/>
+        <Property name="MaximumEngineTorque" value="450.0"/>
+        <Property name="MinimumEngineSpeed" value="900.0"/>
+        <Property name="MinimumEngineTorque" value="-54.0"/>
+        <Property name="MomentInertiaPitch" value="0.0"/>
+        <Property name="MomentInertiaRoll" value="0.0"/>
+        <Property name="MomentInertiaYaw" value="0.0"/>
+        <Property name="NumberOfGears" value="8"/>
+        <Property name="SteeringRatio" value="10.7"/>
+        <Property name="SensorPosition/FrontWindow/Lateral" value="2.05"/>
+        <Property name="SensorPosition/FrontWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Height" value="1.36"/>
+        <Property name="SensorPosition/FrontWindow/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Lateral" value="0.26"/>
+        <Property name="SensorPosition/RearWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Height" value="1.41"/>
+        <Property name="SensorPosition/RearWindow/Pitch" value="3.141592"/>
+        <Property name="SensorPosition/RearWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Lateral" value="4.16"/>
+        <Property name="SensorPosition/FrontCenter/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Height" value="0.6"/>
+        <Property name="SensorPosition/FrontCenter/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Lateral" value="3.75"/>
+        <Property name="SensorPosition/FrontLeft/Longitudinal" value="0.84"/>
+        <Property name="SensorPosition/FrontLeft/Height" value="0.77"/>
+        <Property name="SensorPosition/FrontLeft/Pitch" value="1.134464"/>
+        <Property name="SensorPosition/FrontLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Lateral" value="3.75"/>
+        <Property name="SensorPosition/FrontRight/Longitudinal" value="-0.84"/>
+        <Property name="SensorPosition/FrontRight/Height" value="0.77"/>
+        <Property name="SensorPosition/FrontRight/Pitch" value="-1.134464"/>
+        <Property name="SensorPosition/FrontRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Lateral" value="1.34"/>
+        <Property name="SensorPosition/SideLeft/Longitudinal" value="0.9"/>
+        <Property name="SensorPosition/SideLeft/Height" value="0.23"/>
+        <Property name="SensorPosition/SideLeft/Pitch" value="1.570796"/>
+        <Property name="SensorPosition/SideLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Lateral" value="1.34"/>
+        <Property name="SensorPosition/SideRight/Longitudinal" value="-0.9"/>
+        <Property name="SensorPosition/SideRight/Height" value="0.23"/>
+        <Property name="SensorPosition/SideRight/Pitch" value="-1.570796"/>
+        <Property name="SensorPosition/SideRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Lateral" value="-0.75"/>
+        <Property name="SensorPosition/RearLeft/Longitudinal" value="0.84"/>
+        <Property name="SensorPosition/RearLeft/Height" value="0.73"/>
+        <Property name="SensorPosition/RearLeft/Pitch" value="2.146755"/>
+        <Property name="SensorPosition/RearLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Lateral" value="-0.475"/>
+        <Property name="SensorPosition/RearRight/Longitudinal" value="-0.84"/>
+        <Property name="SensorPosition/RearRight/Height" value="0.73"/>
+        <Property name="SensorPosition/RearRight/Pitch" value="-2.146755"/>
+        <Property name="SensorPosition/RearRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Yaw" value="0.0"/>
+      </Properties>
+      <BoundingBox>
+        <Center x="1.46" y="0.0" z="0.755"/>
+        <Dimensions width="2.18" length="5.26" height="1.51"/>
+      </BoundingBox>
+      <Performance maxSpeed="69.44" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
+      <Axles>
+        <FrontAxle maxSteering="0.5226" wheelDiameter="0.682" trackWidth="1.8" positionX="3.22" positionZ="0.341"/>
+        <RearAxle maxSteering="0.0" wheelDiameter="0.682" trackWidth="1.8" positionX="0.0" positionZ="0.341"/>
+      </Axles>
+    </Vehicle>
+    <Vehicle mass="1900.0" name="car_bmw_7_2" vehicleCategory="car">
+      <Properties>
+        <Property name="AirDragCoefficient" value="0.3"/>
+        <Property name="AxleRatio" value="3.077"/>
+        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
+        <Property name="FrictionCoefficient" value="1.0"/>
+        <Property name="FrontSurface" value="2.42"/>
+        <Property name="GearRatio1" value="4.714"/>
+        <Property name="GearRatio2" value="3.143"/>
+        <Property name="GearRatio3" value="2.106"/>
+        <Property name="GearRatio4" value="1.667"/>
+        <Property name="GearRatio5" value="1.285"/>
+        <Property name="GearRatio6" value="1.0"/>
+        <Property name="GearRatio7" value="0.839"/>
+        <Property name="GearRatio8" value="0.667"/>
+        <Property name="MaximumEngineSpeed" value="6000.0"/>
+        <Property name="MaximumEngineTorque" value="450.0"/>
+        <Property name="MinimumEngineSpeed" value="900.0"/>
+        <Property name="MinimumEngineTorque" value="-54.0"/>
+        <Property name="MomentInertiaPitch" value="0.0"/>
+        <Property name="MomentInertiaRoll" value="0.0"/>
+        <Property name="MomentInertiaYaw" value="0.0"/>
+        <Property name="NumberOfGears" value="8"/>
+        <Property name="SteeringRatio" value="10.7"/>
+        <Property name="SensorPosition/FrontWindow/Lateral" value="2.09"/>
+        <Property name="SensorPosition/FrontWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Height" value="1.34"/>
+        <Property name="SensorPosition/FrontWindow/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Lateral" value="0.28"/>
+        <Property name="SensorPosition/RearWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Height" value="1.38"/>
+        <Property name="SensorPosition/RearWindow/Pitch" value="3.141592"/>
+        <Property name="SensorPosition/RearWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Lateral" value="4.2"/>
+        <Property name="SensorPosition/FrontCenter/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Height" value="0.55"/>
+        <Property name="SensorPosition/FrontCenter/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Lateral" value="3.84"/>
+        <Property name="SensorPosition/FrontLeft/Longitudinal" value="0.86"/>
+        <Property name="SensorPosition/FrontLeft/Height" value="0.75"/>
+        <Property name="SensorPosition/FrontLeft/Pitch" value="1.134464"/>
+        <Property name="SensorPosition/FrontLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Lateral" value="3.84"/>
+        <Property name="SensorPosition/FrontRight/Longitudinal" value="-0.86"/>
+        <Property name="SensorPosition/FrontRight/Height" value="0.75"/>
+        <Property name="SensorPosition/FrontRight/Pitch" value="-1.134464"/>
+        <Property name="SensorPosition/FrontRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Lateral" value="1.46"/>
+        <Property name="SensorPosition/SideLeft/Longitudinal" value="0.91"/>
+        <Property name="SensorPosition/SideLeft/Height" value="0.24"/>
+        <Property name="SensorPosition/SideLeft/Pitch" value="1.570796"/>
+        <Property name="SensorPosition/SideLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Lateral" value="1.46"/>
+        <Property name="SensorPosition/SideRight/Longitudinal" value="-0.91"/>
+        <Property name="SensorPosition/SideRight/Height" value="0.24"/>
+        <Property name="SensorPosition/SideRight/Pitch" value="-1.570796"/>
+        <Property name="SensorPosition/SideRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Lateral" value="-0.84"/>
+        <Property name="SensorPosition/RearLeft/Longitudinal" value="0.79"/>
+        <Property name="SensorPosition/RearLeft/Height" value="0.69"/>
+        <Property name="SensorPosition/RearLeft/Pitch" value="2.146755"/>
+        <Property name="SensorPosition/RearLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Lateral" value="-0.84"/>
+        <Property name="SensorPosition/RearRight/Longitudinal" value="-0.79"/>
+        <Property name="SensorPosition/RearRight/Height" value="0.69"/>
+        <Property name="SensorPosition/RearRight/Pitch" value="-2.146755"/>
+        <Property name="SensorPosition/RearRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Yaw" value="0.0"/>
+      </Properties>
+      <BoundingBox>
+        <Center x="1.485" y="0.0" z="0.745"/>
+        <Dimensions width="2.16" length="5.27" height="1.49"/>
+      </BoundingBox>
+      <Performance maxSpeed="69.44" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
+      <Axles>
+        <FrontAxle maxSteering="0.5279" wheelDiameter="0.682" trackWidth="1.8" positionX="3.25" positionZ="0.341"/>
+        <RearAxle maxSteering="0.0" wheelDiameter="0.682" trackWidth="1.8" positionX="0.0" positionZ="0.341"/>
+      </Axles>
+    </Vehicle>
+    <Vehicle mass="1235.0" name="car_mini_cooper" vehicleCategory="car">
+      <Properties>
+        <Property name="AirDragCoefficient" value="0.3"/>
+        <Property name="AxleRatio" value="3.789"/>
+        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
+        <Property name="FrictionCoefficient" value="1.0"/>
+        <Property name="FrontSurface" value="2.07"/>
+        <Property name="GearRatio1" value="4.154"/>
+        <Property name="GearRatio2" value="2.45"/>
+        <Property name="GearRatio3" value="1.557"/>
+        <Property name="GearRatio4" value="1.09"/>
+        <Property name="GearRatio5" value="0.843"/>
+        <Property name="GearRatio6" value="0.675"/>
+        <Property name="GearRatio7" value="0.547"/>
+        <Property name="MaximumEngineSpeed" value="6000.0"/>
+        <Property name="MaximumEngineTorque" value="220.0"/>
+        <Property name="MinimumEngineSpeed" value="900.0"/>
+        <Property name="MinimumEngineTorque" value="-54.0"/>
+        <Property name="MomentInertiaPitch" value="0.0"/>
+        <Property name="MomentInertiaRoll" value="0.0"/>
+        <Property name="MomentInertiaYaw" value="0.0"/>
+        <Property name="NumberOfGears" value="7"/>
+        <Property name="SteeringRatio" value="10.7"/>
+        <Property name="SensorPosition/FrontWindow/Lateral" value="1.83"/>
+        <Property name="SensorPosition/FrontWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Height" value="1.28"/>
+        <Property name="SensorPosition/FrontWindow/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Lateral" value="-0.08"/>
+        <Property name="SensorPosition/RearWindow/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Height" value="1.33"/>
+        <Property name="SensorPosition/RearWindow/Pitch" value="3.141592"/>
+        <Property name="SensorPosition/RearWindow/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearWindow/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Lateral" value="3.22"/>
+        <Property name="SensorPosition/FrontCenter/Longitudinal" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Height" value="0.57"/>
+        <Property name="SensorPosition/FrontCenter/Pitch" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontCenter/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Lateral" value="3.05"/>
+        <Property name="SensorPosition/FrontLeft/Longitudinal" value="0.65"/>
+        <Property name="SensorPosition/FrontLeft/Height" value="0.65"/>
+        <Property name="SensorPosition/FrontLeft/Pitch" value="1.134464"/>
+        <Property name="SensorPosition/FrontLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Lateral" value="3.05"/>
+        <Property name="SensorPosition/FrontRight/Longitudinal" value="-0.65"/>
+        <Property name="SensorPosition/FrontRight/Height" value="0.65"/>
+        <Property name="SensorPosition/FrontRight/Pitch" value="-1.134464"/>
+        <Property name="SensorPosition/FrontRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/FrontRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Lateral" value="1.06"/>
+        <Property name="SensorPosition/SideLeft/Longitudinal" value="0.81"/>
+        <Property name="SensorPosition/SideLeft/Height" value="0.26"/>
+        <Property name="SensorPosition/SideLeft/Pitch" value="1.570796"/>
+        <Property name="SensorPosition/SideLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Lateral" value="1.06"/>
+        <Property name="SensorPosition/SideRight/Longitudinal" value="-0.81"/>
+        <Property name="SensorPosition/SideRight/Height" value="0.26"/>
+        <Property name="SensorPosition/SideRight/Pitch" value="-1.570796"/>
+        <Property name="SensorPosition/SideRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/SideRight/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Lateral" value="-0.35"/>
+        <Property name="SensorPosition/RearLeft/Longitudinal" value="0.7"/>
+        <Property name="SensorPosition/RearLeft/Height" value="0.6"/>
+        <Property name="SensorPosition/RearLeft/Pitch" value="2.146755"/>
+        <Property name="SensorPosition/RearLeft/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearLeft/Yaw" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Lateral" value="-0.35"/>
+        <Property name="SensorPosition/RearRight/Longitudinal" value="-0.7"/>
+        <Property name="SensorPosition/RearRight/Height" value="0.6"/>
+        <Property name="SensorPosition/RearRight/Pitch" value="-2.146755"/>
+        <Property name="SensorPosition/RearRight/Roll" value="0.0"/>
+        <Property name="SensorPosition/RearRight/Yaw" value="0.0"/>
+      </Properties>
+      <BoundingBox>
+        <Center x="1.35" y="0.0" z="0.71"/>
+        <Dimensions width="1.89" length="3.8" height="1.42"/>
+      </BoundingBox>
+      <Performance maxSpeed="58.33" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
+      <Axles>
+        <FrontAxle maxSteering="0.4766" wheelDiameter="0.59" trackWidth="1.8" positionX="2.48" positionZ="0.295"/>
+        <RearAxle maxSteering="0.0" wheelDiameter="0.59" trackWidth="1.8" positionX="0.0" positionZ="0.295"/>
+      </Axles>
+    </Vehicle>
+    <Vehicle mass="25000.0" name="bus" vehicleCategory="truck">
+      <Properties>
+        <Property name="AirDragCoefficient" value="0.8"/>
+        <Property name="AxleRatio" value="4.0"/>
+        <Property name="DecelerationFromPowertrainDrag" value="1.0"/>
+        <Property name="FrictionCoefficient" value="1.0"/>
+        <Property name="FrontSurface" value="9.0"/>
+        <Property name="GearRatio1" value="6.316"/>
+        <Property name="GearRatio2" value="4.554"/>
+        <Property name="GearRatio3" value="3.269"/>
+        <Property name="GearRatio4" value="2.352"/>
+        <Property name="GearRatio5" value="1.692"/>
+        <Property name="GearRatio6" value="1.217"/>
+        <Property name="GearRatio7" value="0.876"/>
+        <Property name="GearRatio8" value="0.630"/>
+        <Property name="MaximumEngineSpeed" value="2500.0"/>
+        <Property name="MaximumEngineTorque" value="1400.0"/>
+        <Property name="MinimumEngineSpeed" value="600.0"/>
+        <Property name="MinimumEngineTorque" value="-140.0"/>
+        <Property name="MomentInertiaPitch" value="0.0"/>
+        <Property name="MomentInertiaRoll" value="0.0"/>
+        <Property name="MomentInertiaYaw" value="0.0"/>
+        <Property name="NumberOfGears" value="8"/>
+        <Property name="SteeringRatio" value="15.0"/>
+      </Properties>
+      <BoundingBox>
+        <Center x="2.815" y="0.0" z="1.92"/>
+        <Dimensions width="2.91" length="13.23" height="3.84"/>
+      </BoundingBox>
+      <Performance maxSpeed="33.33" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
+      <Axles>
+        <FrontAxle maxSteering="0.6972" wheelDiameter="0.808" trackWidth="1.8" positionX="6.64" positionZ="0.404"/>
+        <RearAxle maxSteering="0.0" wheelDiameter="0.808" trackWidth="1.8" positionX="0.0" positionZ="0.404"/>
+      </Axles>
+    </Vehicle>
+    <Vehicle mass="30000.0" name="truck" vehicleCategory="truck">
+      <Properties>
+        <Property name="AirDragCoefficient" value="0.8"/>
+        <Property name="AxleRatio" value="4.0"/>
+        <Property name="DecelerationFromPowertrainDrag" value="1.0"/>
+        <Property name="FrictionCoefficient" value="1.0"/>
+        <Property name="FrontSurface" value="9.0"/>
+        <Property name="GearRatio1" value="6.316"/>
+        <Property name="GearRatio2" value="4.554"/>
+        <Property name="GearRatio3" value="3.269"/>
+        <Property name="GearRatio4" value="2.352"/>
+        <Property name="GearRatio5" value="1.692"/>
+        <Property name="GearRatio6" value="1.217"/>
+        <Property name="GearRatio7" value="0.876"/>
+        <Property name="GearRatio8" value="0.630"/>
+        <Property name="MaximumEngineSpeed" value="2500.0"/>
+        <Property name="MaximumEngineTorque" value="1400.0"/>
+        <Property name="MinimumEngineSpeed" value="600.0"/>
+        <Property name="MinimumEngineTorque" value="-140.0"/>
+        <Property name="MomentInertiaPitch" value="0.0"/>
+        <Property name="MomentInertiaRoll" value="0.0"/>
+        <Property name="MomentInertiaYaw" value="0.0"/>
+        <Property name="NumberOfGears" value="8"/>
+        <Property name="SteeringRatio" value="15.0"/>
+      </Properties>
+      <BoundingBox>
+        <Center x="2.685" y="0.0" z="1.74"/>
+        <Dimensions width="3.16" length="8.83" height="3.48"/>
+      </BoundingBox>
+      <Performance maxSpeed="25.0" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
+      <Axles>
+        <FrontAxle maxSteering="0.4352" wheelDiameter="0.808" trackWidth="1.8" positionX="4.36" positionZ="0.404"/>
+        <RearAxle maxSteering="0.0" wheelDiameter="0.808" trackWidth="1.8" positionX="0.0" positionZ="0.404"/>
+      </Axles>
+    </Vehicle>
+    <Vehicle mass="90.0" name="bicycle" vehicleCategory="bicycle">
+      <Properties>
+        <Property name="AirDragCoefficient" value="0.3"/>
+        <Property name="AxleRatio" value="3.0"/>
+        <Property name="DecelerationFromPowertrainDrag" value="0.5"/>
+        <Property name="FrictionCoefficient" value="1.0"/>
+        <Property name="FrontSurface" value="1.9"/>
+        <Property name="GearRatio1" value="4.350"/>
+        <Property name="GearRatio2" value="2.496"/>
+        <Property name="GearRatio3" value="1.665"/>
+        <Property name="GearRatio4" value="1.230"/>
+        <Property name="GearRatio5" value="1.0"/>
+        <Property name="GearRatio6" value="0.851"/>
+        <Property name="MaximumEngineSpeed" value="6000.0"/>
+        <Property name="MaximumEngineTorque" value="540.0"/>
+        <Property name="MinimumEngineSpeed" value="900.0"/>
+        <Property name="MinimumEngineTorque" value="-54.0"/>
+        <Property name="MomentInertiaPitch" value="0.0"/>
+        <Property name="MomentInertiaRoll" value="0.0"/>
+        <Property name="MomentInertiaYaw" value="0.0"/>
+        <Property name="NumberOfGears" value="6"/>
+        <Property name="SteeringRatio" value="10.7"/>
+      </Properties>
+      <BoundingBox>
+        <Center x="0.175" y="0.0" z="0.9325"/>
+        <Dimensions width="0.5" length="1.89" height="1.865"/>
+      </BoundingBox>
+      <Performance maxSpeed="10.0" maxAcceleration="9.80665" maxDeceleration="9.80665"/>
+      <Axles>
+        <FrontAxle maxSteering="1.5708" wheelDiameter="0.636" trackWidth="0.1" positionX="1.04" positionZ="0.318"/>
+        <RearAxle maxSteering="0.0" wheelDiameter="0.636" trackWidth="0.1" positionX="0.0" positionZ="0.318"/>
+      </Axles>
+    </Vehicle>
+  </Catalog>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Common/simulationConfig.xml b/sim/contrib/examples/Common/simulationConfig.xml
index 0a84bfef937297c6fb8cc2f1cdc9588f5ccee9ee..e231533a44c0d6bbe04545355951f57eddf5278e 100644
--- a/sim/contrib/examples/Common/simulationConfig.xml
+++ b/sim/contrib/examples/Common/simulationConfig.xml
@@ -60,11 +60,6 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
     <Spawner>
       <Library>SpawnerPreRunCommon</Library>
       <Type>PreRun</Type>
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/ProfilesCatalog.xml
index 3d3a528011343574e63cd85e20f9618646996992..d42e2ffd578f38d5c9fb33d8afda31e104aff470 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/ProfilesCatalog.xml
@@ -1,53 +1,71 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="EgoAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="EgoDriver" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="EgoVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="EgoVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="0.5"/>
-        <VehicleProfile Name="Bus" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="0.5"/>
+        <SystemProfile Name="Bus" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="0.5"/>
+        <VehicleModel Name="bus" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="EgoVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="EgoVehicle">
       <Components>
         <Component Type="AEB">
           <Profiles>
@@ -60,18 +78,15 @@
         </Component>
       </Components>
       <Sensors>
-        <Sensor Id="0">
-          <Position Name="Default" Longitudinal="3.7" Lateral="1.09" Height="0.5" Pitch="0.0" Yaw="0.0" Roll="0.0"/>
+        <Sensor Id="0" Position="FrontWindow">
           <Profile Type="Geometric2D" Name="Standard"/>
         </Sensor>
-        <Sensor Id="1">
-          <Position Name="Default" Longitudinal="3.7" Lateral="-1.09" Height="0.5" Pitch="0.0" Yaw="0.0" Roll="0.0"/>
+        <Sensor Id="1" Position="FrontWindow">
           <Profile Type="Geometric2D" Name="Standard"/>
         </Sensor>
       </Sensors>
-    </VehicleProfile>
-    <VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+    </SystemProfile>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -80,43 +95,36 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="EgoDriver">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/Scenario.xosc b/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/Scenario.xosc
index 4081cb626765802a51cf8269803e65cf1db35baa..2366002750a345e8ccb5a8d8db74329455b5e22e 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,19 +36,54 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="EgoAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="EgoAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="TF">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="TF">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="S1">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="LuxuryClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="S1">
+          <Properties>
+            <Property name="AgentProfile" value="LuxuryClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="S2">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="LuxuryClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="S2">
+          <Properties>
+            <Property name="AgentProfile" value="LuxuryClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="S3">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="LuxuryClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="S3">
+          <Properties>
+            <Property name="AgentProfile" value="LuxuryClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members>
@@ -73,7 +108,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="40"/>
                 </SpeedActionTarget>
@@ -92,7 +127,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="40"/>
                 </SpeedActionTarget>
@@ -111,7 +146,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="10.0"/>
                 </SpeedActionTarget>
@@ -130,7 +165,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="40"/>
                 </SpeedActionTarget>
@@ -149,7 +184,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="40"/>
                 </SpeedActionTarget>
@@ -171,367 +206,369 @@
                 <PrivateAction>
                   <RoutingAction>
                     <FollowTrajectoryAction>
-                      <Trajectory name="LaneChange" closed="false">
-                        <Shape>
-                          <Polyline>
-                            <Vertex time="0">
-                              <Position>
-                                <WorldPosition x="76.17" y="5.625" z="0" h="0.0" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.1">
-                              <Position>
-                                <WorldPosition x="79.17" y="5.62485" z="0" h="-0.00005" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.2">
-                              <Position>
-                                <WorldPosition x="82.17" y="5.6247" z="0" h="-0.00005" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.3">
-                              <Position>
-                                <WorldPosition x="85.17" y="5.62172" z="0" h="-0.00099" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.4">
-                              <Position>
-                                <WorldPosition x="88.17" y="5.62092" z="0" h="-0.00027" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.5">
-                              <Position>
-                                <WorldPosition x="91.17" y="5.61893" z="0" h="-0.00066" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.6">
-                              <Position>
-                                <WorldPosition x="94.16999" y="5.61087" z="0" h="-0.00269" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.7">
-                              <Position>
-                                <WorldPosition x="97.16995" y="5.59695" z="0" h="-0.00464" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.8">
-                              <Position>
-                                <WorldPosition x="100.16989" y="5.57685" z="0" h="-0.0067" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="0.9">
-                              <Position>
-                                <WorldPosition x="103.16977" y="5.55009" z="0" h="-0.00892" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.0">
-                              <Position>
-                                <WorldPosition x="106.16958" y="5.51666" z="0" h="-0.01114" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.1">
-                              <Position>
-                                <WorldPosition x="109.16931" y="5.47657" z="0" h="-0.01336" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.2">
-                              <Position>
-                                <WorldPosition x="112.16894" y="5.42952" z="0" h="-0.01569" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.3">
-                              <Position>
-                                <WorldPosition x="115.16847" y="5.37599" z="0" h="-0.01784" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.4">
-                              <Position>
-                                <WorldPosition x="118.16782" y="5.31362" z="0" h="-0.02079" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.5">
-                              <Position>
-                                <WorldPosition x="121.16705" y="5.24557" z="0" h="-0.02268" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.6">
-                              <Position>
-                                <WorldPosition x="124.16613" y="5.17146" z="0" h="-0.02471" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.7">
-                              <Position>
-                                <WorldPosition x="127.16503" y="5.09018" z="0" h="-0.02710" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.8">
-                              <Position>
-                                <WorldPosition x="130.16376" y="5.00284" z="0" h="-0.02912" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="1.9">
-                              <Position>
-                                <WorldPosition x="133.16234" y="4.91071" z="0" h="-0.03071" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.0">
-                              <Position>
-                                <WorldPosition x="136.16070" y="4.81133" z="0" h="-0.03313" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.1">
-                              <Position>
-                                <WorldPosition x="139.15896" y="4.70916" z="0" h="-0.03406" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.2">
-                              <Position>
-                                <WorldPosition x="142.15699" y="4.60043" z="0" h="-0.03625" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.3">
-                              <Position>
-                                <WorldPosition x="145.15489" y="4.48821" z="0" h="-0.03741" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.4">
-                              <Position>
-                                <WorldPosition x="148.15264" y="4.37212" z="0" h="-0.03871" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.5">
-                              <Position>
-                                <WorldPosition x="151.15031" y="4.25383" z="0" h="-0.03944" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.6">
-                              <Position>
-                                <WorldPosition x="154.14791" y="4.13385" z="0" h="-0.04000" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.7">
-                              <Position>
-                                <WorldPosition x="157.14539" y="4.01109" z="0" h="-0.04093" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.8">
-                              <Position>
-                                <WorldPosition x="160.14284" y="3.88744" z="0" h="-0.04123" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="2.9">
-                              <Position>
-                                <WorldPosition x="163.14034" y="3.76487" z="0" h="-0.04087" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.0">
-                              <Position>
-                                <WorldPosition x="166.13781" y="3.64161" z="0" h="-0.04110" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.1">
-                              <Position>
-                                <WorldPosition x="169.13538" y="3.52094" z="0" h="-0.04024" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.2">
-                              <Position>
-                                <WorldPosition x="172.13304" y="3.40256" z="0" h="-0.03947" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.3">
-                              <Position>
-                                <WorldPosition x="175.13081" y="3.28686" z="0" h="-0.03858" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.4">
-                              <Position>
-                                <WorldPosition x="178.12874" y="3.17544" z="0" h="-0.03715" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.5">
-                              <Position>
-                                <WorldPosition x="181.12685" y="3.06899" z="0" h="-0.03549" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.6">
-                              <Position>
-                                <WorldPosition x="184.12512" y="2.96702" z="0" h="-0.03400" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.7">
-                              <Position>
-                                <WorldPosition x="187.12360" y="2.87152" z="0" h="-0.03184" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.8">
-                              <Position>
-                                <WorldPosition x="190.12216" y="2.77880" z="0" h="-0.03091" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="3.9">
-                              <Position>
-                                <WorldPosition x="193.12099" y="2.69484" z="0" h="-0.02799" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.0">
-                              <Position>
-                                <WorldPosition x="196.11992" y="2.61495" z="0" h="-0.02663" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.1">
-                              <Position>
-                                <WorldPosition x="199.11902" y="2.54134" z="0" h="-0.02454" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.2">
-                              <Position>
-                                <WorldPosition x="202.11822" y="2.47190" z="0" h="-0.02315" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.3">
-                              <Position>
-                                <WorldPosition x="205.11755" y="2.40872" z="0" h="-0.02106" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.4">
-                              <Position>
-                                <WorldPosition x="208.11702" y="2.35222" z="0" h="-0.01884" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.5">
-                              <Position>
-                                <WorldPosition x="211.11652" y="2.29760" z="0" h="-0.01821" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.6">
-                              <Position>
-                                <WorldPosition x="214.11613" y="2.24886" z="0" h="-0.01625" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.7">
-                              <Position>
-                                <WorldPosition x="217.11578" y="2.20319" z="0" h="-0.01522" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.8">
-                              <Position>
-                                <WorldPosition x="220.11551" y="2.16310" z="0" h="-0.01336" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="4.9">
-                              <Position>
-                                <WorldPosition x="223.11528" y="2.12609" z="0" h="-0.01234" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.0">
-                              <Position>
-                                <WorldPosition x="226.11510" y="2.09317" z="0" h="-0.01098" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.1">
-                              <Position>
-                                <WorldPosition x="229.11496" y="2.06432" z="0" h="-0.00962" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.2">
-                              <Position>
-                                <WorldPosition x="232.11485" y="2.03775" z="0" h="-0.00885" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.3">
-                              <Position>
-                                <WorldPosition x="235.11476" y="2.01547" z="0" h="-0.00743" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.4">
-                              <Position>
-                                <WorldPosition x="238.11469" y="1.99498" z="0" h="-0.00683" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.5">
-                              <Position>
-                                <WorldPosition x="241.11464" y="1.97777" z="0" h="-0.00574" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.6">
-                              <Position>
-                                <WorldPosition x="244.11460" y="1.96235" z="0" h="-0.00514" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.7">
-                              <Position>
-                                <WorldPosition x="247.11458" y="1.95001" z="0" h="-0.00411" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.8">
-                              <Position>
-                                <WorldPosition x="250.11455" y="1.93787" z="0" h="-0.00405" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.9">
-                              <Position>
-                                <WorldPosition x="253.11454" y="1.92822" z="0" h="-0.00322" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.0">
-                              <Position>
-                                <WorldPosition x="256.11453" y="1.92116" z="0" h="-0.00235" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.1">
-                              <Position>
-                                <WorldPosition x="259.11452" y="1.91360" z="0" h="-0.00252" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.2">
-                              <Position>
-                                <WorldPosition x="262.11451" y="1.90624" z="0" h="-0.00245" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.3">
-                              <Position>
-                                <WorldPosition x="265.11451" y="1.90007" z="0" h="-0.00206" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.4">
-                              <Position>
-                                <WorldPosition x="268.11450" y="1.89490" z="0" h="-0.00172" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.5">
-                              <Position>
-                                <WorldPosition x="271.11450" y="1.89082" z="0" h="-0.00136" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.6">
-                              <Position>
-                                <WorldPosition x="274.11450" y="1.88654" z="0" h="-0.00143" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.7">
-                              <Position>
-                                <WorldPosition x="277.11449" y="1.88316" z="0" h="-0.00113" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.8">
-                              <Position>
-                                <WorldPosition x="280.11449" y="1.87918" z="0" h="-0.00133" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="6.9">
-                              <Position>
-                                <WorldPosition x="283.11449" y="1.87619" z="0" h="-0.00099" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="7.0">
-                              <Position>
-                                <WorldPosition x="286.11449" y="1.87500" z="0" h="-0.00040" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                          </Polyline>
-                        </Shape>
-                      </Trajectory>
+                      <TrajectoryRef>
+                        <Trajectory name="LaneChange" closed="false">
+                          <Shape>
+                            <Polyline>
+                              <Vertex time="0">
+                                <Position>
+                                  <WorldPosition x="76.17" y="5.625" z="0" h="0.0" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.1">
+                                <Position>
+                                  <WorldPosition x="79.17" y="5.62485" z="0" h="-0.00005" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.2">
+                                <Position>
+                                  <WorldPosition x="82.17" y="5.6247" z="0" h="-0.00005" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.3">
+                                <Position>
+                                  <WorldPosition x="85.17" y="5.62172" z="0" h="-0.00099" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.4">
+                                <Position>
+                                  <WorldPosition x="88.17" y="5.62092" z="0" h="-0.00027" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.5">
+                                <Position>
+                                  <WorldPosition x="91.17" y="5.61893" z="0" h="-0.00066" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.6">
+                                <Position>
+                                  <WorldPosition x="94.16999" y="5.61087" z="0" h="-0.00269" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.7">
+                                <Position>
+                                  <WorldPosition x="97.16995" y="5.59695" z="0" h="-0.00464" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.8">
+                                <Position>
+                                  <WorldPosition x="100.16989" y="5.57685" z="0" h="-0.0067" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="0.9">
+                                <Position>
+                                  <WorldPosition x="103.16977" y="5.55009" z="0" h="-0.00892" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.0">
+                                <Position>
+                                  <WorldPosition x="106.16958" y="5.51666" z="0" h="-0.01114" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.1">
+                                <Position>
+                                  <WorldPosition x="109.16931" y="5.47657" z="0" h="-0.01336" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.2">
+                                <Position>
+                                  <WorldPosition x="112.16894" y="5.42952" z="0" h="-0.01569" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.3">
+                                <Position>
+                                  <WorldPosition x="115.16847" y="5.37599" z="0" h="-0.01784" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.4">
+                                <Position>
+                                  <WorldPosition x="118.16782" y="5.31362" z="0" h="-0.02079" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.5">
+                                <Position>
+                                  <WorldPosition x="121.16705" y="5.24557" z="0" h="-0.02268" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.6">
+                                <Position>
+                                  <WorldPosition x="124.16613" y="5.17146" z="0" h="-0.02471" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.7">
+                                <Position>
+                                  <WorldPosition x="127.16503" y="5.09018" z="0" h="-0.02710" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.8">
+                                <Position>
+                                  <WorldPosition x="130.16376" y="5.00284" z="0" h="-0.02912" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="1.9">
+                                <Position>
+                                  <WorldPosition x="133.16234" y="4.91071" z="0" h="-0.03071" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.0">
+                                <Position>
+                                  <WorldPosition x="136.16070" y="4.81133" z="0" h="-0.03313" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.1">
+                                <Position>
+                                  <WorldPosition x="139.15896" y="4.70916" z="0" h="-0.03406" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.2">
+                                <Position>
+                                  <WorldPosition x="142.15699" y="4.60043" z="0" h="-0.03625" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.3">
+                                <Position>
+                                  <WorldPosition x="145.15489" y="4.48821" z="0" h="-0.03741" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.4">
+                                <Position>
+                                  <WorldPosition x="148.15264" y="4.37212" z="0" h="-0.03871" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.5">
+                                <Position>
+                                  <WorldPosition x="151.15031" y="4.25383" z="0" h="-0.03944" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.6">
+                                <Position>
+                                  <WorldPosition x="154.14791" y="4.13385" z="0" h="-0.04000" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.7">
+                                <Position>
+                                  <WorldPosition x="157.14539" y="4.01109" z="0" h="-0.04093" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.8">
+                                <Position>
+                                  <WorldPosition x="160.14284" y="3.88744" z="0" h="-0.04123" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="2.9">
+                                <Position>
+                                  <WorldPosition x="163.14034" y="3.76487" z="0" h="-0.04087" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.0">
+                                <Position>
+                                  <WorldPosition x="166.13781" y="3.64161" z="0" h="-0.04110" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.1">
+                                <Position>
+                                  <WorldPosition x="169.13538" y="3.52094" z="0" h="-0.04024" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.2">
+                                <Position>
+                                  <WorldPosition x="172.13304" y="3.40256" z="0" h="-0.03947" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.3">
+                                <Position>
+                                  <WorldPosition x="175.13081" y="3.28686" z="0" h="-0.03858" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.4">
+                                <Position>
+                                  <WorldPosition x="178.12874" y="3.17544" z="0" h="-0.03715" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.5">
+                                <Position>
+                                  <WorldPosition x="181.12685" y="3.06899" z="0" h="-0.03549" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.6">
+                                <Position>
+                                  <WorldPosition x="184.12512" y="2.96702" z="0" h="-0.03400" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.7">
+                                <Position>
+                                  <WorldPosition x="187.12360" y="2.87152" z="0" h="-0.03184" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.8">
+                                <Position>
+                                  <WorldPosition x="190.12216" y="2.77880" z="0" h="-0.03091" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="3.9">
+                                <Position>
+                                  <WorldPosition x="193.12099" y="2.69484" z="0" h="-0.02799" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.0">
+                                <Position>
+                                  <WorldPosition x="196.11992" y="2.61495" z="0" h="-0.02663" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.1">
+                                <Position>
+                                  <WorldPosition x="199.11902" y="2.54134" z="0" h="-0.02454" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.2">
+                                <Position>
+                                  <WorldPosition x="202.11822" y="2.47190" z="0" h="-0.02315" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.3">
+                                <Position>
+                                  <WorldPosition x="205.11755" y="2.40872" z="0" h="-0.02106" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.4">
+                                <Position>
+                                  <WorldPosition x="208.11702" y="2.35222" z="0" h="-0.01884" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.5">
+                                <Position>
+                                  <WorldPosition x="211.11652" y="2.29760" z="0" h="-0.01821" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.6">
+                                <Position>
+                                  <WorldPosition x="214.11613" y="2.24886" z="0" h="-0.01625" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.7">
+                                <Position>
+                                  <WorldPosition x="217.11578" y="2.20319" z="0" h="-0.01522" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.8">
+                                <Position>
+                                  <WorldPosition x="220.11551" y="2.16310" z="0" h="-0.01336" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="4.9">
+                                <Position>
+                                  <WorldPosition x="223.11528" y="2.12609" z="0" h="-0.01234" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.0">
+                                <Position>
+                                  <WorldPosition x="226.11510" y="2.09317" z="0" h="-0.01098" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.1">
+                                <Position>
+                                  <WorldPosition x="229.11496" y="2.06432" z="0" h="-0.00962" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.2">
+                                <Position>
+                                  <WorldPosition x="232.11485" y="2.03775" z="0" h="-0.00885" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.3">
+                                <Position>
+                                  <WorldPosition x="235.11476" y="2.01547" z="0" h="-0.00743" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.4">
+                                <Position>
+                                  <WorldPosition x="238.11469" y="1.99498" z="0" h="-0.00683" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.5">
+                                <Position>
+                                  <WorldPosition x="241.11464" y="1.97777" z="0" h="-0.00574" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.6">
+                                <Position>
+                                  <WorldPosition x="244.11460" y="1.96235" z="0" h="-0.00514" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.7">
+                                <Position>
+                                  <WorldPosition x="247.11458" y="1.95001" z="0" h="-0.00411" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.8">
+                                <Position>
+                                  <WorldPosition x="250.11455" y="1.93787" z="0" h="-0.00405" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.9">
+                                <Position>
+                                  <WorldPosition x="253.11454" y="1.92822" z="0" h="-0.00322" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.0">
+                                <Position>
+                                  <WorldPosition x="256.11453" y="1.92116" z="0" h="-0.00235" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.1">
+                                <Position>
+                                  <WorldPosition x="259.11452" y="1.91360" z="0" h="-0.00252" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.2">
+                                <Position>
+                                  <WorldPosition x="262.11451" y="1.90624" z="0" h="-0.00245" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.3">
+                                <Position>
+                                  <WorldPosition x="265.11451" y="1.90007" z="0" h="-0.00206" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.4">
+                                <Position>
+                                  <WorldPosition x="268.11450" y="1.89490" z="0" h="-0.00172" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.5">
+                                <Position>
+                                  <WorldPosition x="271.11450" y="1.89082" z="0" h="-0.00136" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.6">
+                                <Position>
+                                  <WorldPosition x="274.11450" y="1.88654" z="0" h="-0.00143" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.7">
+                                <Position>
+                                  <WorldPosition x="277.11449" y="1.88316" z="0" h="-0.00113" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.8">
+                                <Position>
+                                  <WorldPosition x="280.11449" y="1.87918" z="0" h="-0.00133" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="6.9">
+                                <Position>
+                                  <WorldPosition x="283.11449" y="1.87619" z="0" h="-0.00099" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="7.0">
+                                <Position>
+                                  <WorldPosition x="286.11449" y="1.87500" z="0" h="-0.00040" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                            </Polyline>
+                          </Shape>
+                        </Trajectory>
+                      </TrajectoryRef>
                       <TimeReference>
                         <None/>
                       </TimeReference>
@@ -542,7 +579,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="-1" rule="greaterThan"/>
                     </ByValueCondition>
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/simulationConfig.xml b/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/simulationConfig.xml
index f8f899ab4d11c3728334e0c797a8a7a8c023adf4..fac7cc98fbfffe93b8c748132e6941e4a8be2bbd 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_CutIn/simulationConfig.xml
@@ -52,11 +52,6 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
     <Spawner>
       <Library>SpawnerPreRunCommon</Library>
       <Type>PreRun</Type>
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/ProfilesCatalog.xml
index 9e85ff16b9455a6afb3020cd754d37cd61db8e95..1588bd7109252c1cc40208f74fe563d14c2ccc9c 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/ProfilesCatalog.xml
@@ -1,26 +1,31 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="CantStop" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="ScenarioAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="StandingStill" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 3" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 3" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_3" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
-       <Components>
+  <SystemProfiles>
+    <SystemProfile Name="Mini Cooper">
+      <Components>
         <Component Type="AEB">
           <Profiles>
             <Profile Name="AEB1" Probability="1.0"/>
@@ -31,18 +36,16 @@
         </Component>
       </Components>
       <Sensors>
-        <Sensor Id="0">
-          <Position Height="0.5" Lateral="0.0" Longitudinal="0.0" Name="Default" Pitch="0.0" Roll="0.0" Yaw="0.0"/>
+        <Sensor Id="0" Position="FrontWindow">
           <Profile Name="Standard" Type="Geometric2D"/>
         </Sensor>
       </Sensors>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="CantStop">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/Scenario.xosc b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/Scenario.xosc
index 40e86a64f6834469e2926ae076b3889954f6c3ae..d6a55b36f9aedbe0ad793ef16fd1d03e1d6dd298 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
   </Entities>
   <Storyboard>
@@ -53,7 +60,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -63,6 +70,11 @@
         </Private>
       </Actions>
     </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/simulationConfig.xml b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/simulationConfig.xml
index 7527cc3b0724c0f1ca61352d6b89cfeefa2f7d88..40bc42a797e5c62b10108256d32973bad4c61136 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/simulationConfig.xml
@@ -42,11 +42,5 @@
       </Parameters>
     </Observation>
   </Observations>
-  <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
-  </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/ProfilesCatalog.xml
index dc51f6540063f2c4ed071e6554f42a36f80fa11b..a28b7574b53fcab0b8d6a6c232dd7a7b24000916 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="EgoAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="EgoDriver" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="EgoVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="EgoVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_2" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="EgoVehicle">
-      <Model Name="car_bmw_7_2"/>
+  <SystemProfiles>
+    <SystemProfile Name="EgoVehicle">
       <Components>
         <Component Type="AEB">
           <Profiles>
@@ -24,17 +26,15 @@
         </Component>
       </Components>
       <Sensors>
-        <Sensor Id="0">
-          <Position Name="Default" Longitudinal="3.7" Lateral="1.09" Height="0.5" Pitch="0.0" Yaw="0.0" Roll="0.0"/>
+        <Sensor Id="0" Position="FrontWindow">
           <Profile Type="Geometric2D" Name="Standard"/>
         </Sensor>
-        <Sensor Id="1">
-          <Position Name="Default" Longitudinal="3.7" Lateral="-1.09" Height="0.5" Pitch="0.0" Yaw="0.0" Roll="0.0"/>
+        <Sensor Id="1" Position="FrontWindow">
           <Profile Type="Geometric2D" Name="Standard"/>
         </Sensor>
       </Sensors>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="EgoDriver">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/Scenario.xosc b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/Scenario.xosc
index 983544ebe152d64bc5826ec881184ea4e6305a73..954ce141a4bec7e6def45b9a157b6d81a6220e88 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="EgoAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_2"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="EgoAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="40"/>
                 </SpeedActionTarget>
@@ -66,6 +73,11 @@
         </Private>
       </Actions>
     </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/simulationConfig.xml b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/simulationConfig.xml
index 9faaba62e512ae8e5379f4da34654b6afd6124f7..ea95714c05253844d48b70b34b1823894b3228fc 100644
--- a/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacleInCurve/simulationConfig.xml
@@ -45,11 +45,5 @@
       </Parameters>
     </Observation>
   </Observations>
-  <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
-  </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/AFDM_TJunction/Scenario.xosc b/sim/contrib/examples/Configurations/AFDM_TJunction/Scenario.xosc
index 37b6624a5db12ef327d5ba4d1a51383be9571373..7c204f411a0f15a25da066e16eaa25e625b42c8e 100644
--- a/sim/contrib/examples/Configurations/AFDM_TJunction/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/AFDM_TJunction/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,10 +36,24 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent1">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent1">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -59,7 +73,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>	
                   <AbsoluteTargetSpeed value="8.0"/>
                 </SpeedActionTarget>
@@ -78,7 +92,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>	
                   <AbsoluteTargetSpeed value="8.0"/>
                 </SpeedActionTarget>
@@ -88,8 +102,12 @@
         </Private>
       </Actions>
     </Init>
-    <Story/>
-	<StopTrigger>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
           <ByValueCondition>
diff --git a/sim/contrib/examples/Configurations/AFDM_TJunction/simulationConfig.xml b/sim/contrib/examples/Configurations/AFDM_TJunction/simulationConfig.xml
index c8211a325864234c285091dc0954402c444cb89c..7ad1a66ad5ecce7e3f04f466b0e0142be9c7473b 100644
--- a/sim/contrib/examples/Configurations/AFDM_TJunction/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/AFDM_TJunction/simulationConfig.xml
@@ -42,11 +42,5 @@
       </Parameters>
     </Observation>
   </Observations>
-  <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
-  </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/ProfilesCatalog.xml
index 9ee0a84a3fd2411b73924d36ffa9f43ba027dcfe..6597074bfe6ea566b6432f1128ad009a49455bbb 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/ProfilesCatalog.xml
@@ -1,25 +1,30 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="StandingAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Standing" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="StandingVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="StandingVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_i3" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -28,13 +33,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="StandingVehicle">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/Scenario.xosc b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/Scenario.xosc
old mode 100755
new mode 100644
index a96b9e9f4194057c1f60c0e4a11cb6df51c4602d..4ef4c22709f8e6385276369715ac8950f879a250
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="openPASS ByEntityCondition_RelativeLane"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS ByEntityCondition_RelativeLane" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,10 +36,24 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="StandingAgent">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="StandingAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_i3"/>
+      <ObjectController>
+        <Controller name="StandingAgent">
+          <Properties>
+            <Property name="AgentProfile" value="StandingAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -63,7 +73,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -82,7 +92,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="0.0"/>
                 </SpeedActionTarget>
@@ -115,7 +125,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="RelativeLanePosition">
+                  <Condition name="RelativeLanePosition" delay="0" conditionEdge="rising">
                     <ByEntityCondition>
                       <TriggeringEntities triggeringEntitiesRule="any">
                         <EntityRef entityRef="Ego"/>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/simulationConfig.xml b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeLane/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/ProfilesCatalog.xml
index 7278514e7737a7c21fe68e7431bc49c6aba6d543..ef0f4ebfa3ba7acc0f112fda555ee0e65147632e 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/ProfilesCatalog.xml
@@ -1,25 +1,30 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="StandingAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Standing" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="StandingVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="StandingVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_i3" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -28,13 +33,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="StandingVehicle">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/Scenario.xosc b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/Scenario.xosc
old mode 100755
new mode 100644
index 2f4ebb20ccc00f7da7caf3488f10aa09195de5ee..894072b937f8efe96588b9b314fb7f35ab4942d3
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="openPASS ByEntityCondition_RelativeSpeed"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS ByEntityCondition_RelativeSpeed" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,10 +36,24 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="StandingAgent">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="StandingAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_i3"/>
+      <ObjectController>
+        <Controller name="StandingAgent">
+          <Properties>
+            <Property name="AgentProfile" value="StandingAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -63,7 +73,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -82,7 +92,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -115,7 +125,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="RelativeSpeed">
+                  <Condition name="RelativeSpeed" delay="0" conditionEdge="rising">
                     <ByEntityCondition>
                       <TriggeringEntities triggeringEntitiesRule="any">
                         <EntityRef entityRef="Ego"/>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/simulationConfig.xml b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/Scenario.xosc b/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/Scenario.xosc
old mode 100755
new mode 100644
index e64983a76b1d444b71a5cfe60760055ed242ac60..32017d22d84343b53a87ed490f37a46a87eb3eda
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="openPASS ByEntityCondition_RoadPosition"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS ByEntityCondition_RoadPosition" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -60,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -92,7 +95,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="RoadPosition">
+                  <Condition name="RoadPosition" delay="0" conditionEdge="rising">
                     <ByEntityCondition>
                       <TriggeringEntities triggeringEntitiesRule="any">
                         <EntityRef entityRef="Ego"/>
@@ -123,4 +126,4 @@
       </ConditionGroup>
     </StopTrigger>
   </Storyboard>
-</OpenSCENARIO>
\ No newline at end of file
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/simulationConfig.xml b/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_RoadPosition/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/ProfilesCatalog.xml
index 9ee0a84a3fd2411b73924d36ffa9f43ba027dcfe..6597074bfe6ea566b6432f1128ad009a49455bbb 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/ProfilesCatalog.xml
@@ -1,25 +1,30 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="StandingAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Standing" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="StandingVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="StandingVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_i3" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -28,13 +33,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="StandingVehicle">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/Scenario.xosc b/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/Scenario.xosc
old mode 100755
new mode 100644
index 88b3478e49a135acd0bd85ea71b9c185387b6ad9..6960c432d8fa2790dcde5678b1e74d0c272ef5ba
--- a/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="openPASS ByEntityCondition_TimeHeadway"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS ByEntityCondition_TimeHeadway" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,10 +36,24 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="StandingAgent">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="StandingAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_i3"/>
+      <ObjectController>
+        <Controller name="StandingAgent">
+          <Properties>
+            <Property name="AgentProfile" value="StandingAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -63,7 +73,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -82,7 +92,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="0.0"/>
                 </SpeedActionTarget>
@@ -115,17 +125,13 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="TimeHeadway">
+                  <Condition name="TimeHeadway" delay="0" conditionEdge="rising">
                     <ByEntityCondition>
                       <TriggeringEntities triggeringEntitiesRule="any">
                         <EntityRef entityRef="Ego"/>
                       </TriggeringEntities>
                       <EntityCondition>
-                        <TimeHeadwayCondition value="3.0"
-                          rule="lessThan"
-                          entityRef="StandingAgent"
-                          freespace="true"
-                          alongRoute="true"/>
+                        <TimeHeadwayCondition value="3.0" rule="lessThan" entityRef="StandingAgent" freespace="true" alongRoute="true"/>
                       </EntityCondition>
                     </ByEntityCondition>
                   </Condition>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/simulationConfig.xml b/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/ProfilesCatalog.xml
index 9ee0a84a3fd2411b73924d36ffa9f43ba027dcfe..6597074bfe6ea566b6432f1128ad009a49455bbb 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/ProfilesCatalog.xml
@@ -1,25 +1,30 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="StandingAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Standing" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="StandingVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="StandingVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_i3" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -28,13 +33,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="StandingVehicle">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/Scenario.xosc b/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/Scenario.xosc
old mode 100755
new mode 100644
index e46709388e36e55958e8c825cc4b6b77f011d87a..60542fe497d95170eccff7848aeb5c9089a592ca
--- a/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="openPASS ByEntityCondition_TimeToCollision"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS ByEntityCondition_TimeToCollision" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,10 +36,24 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="StandingAgent">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="StandingAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_i3"/>
+      <ObjectController>
+        <Controller name="StandingAgent">
+          <Properties>
+            <Property name="AgentProfile" value="StandingAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -63,7 +73,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -82,7 +92,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="0.0"/>
                 </SpeedActionTarget>
@@ -115,13 +125,13 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="TimeToCollision">
+                  <Condition name="TimeToCollision" delay="0" conditionEdge="rising">
                     <ByEntityCondition>
                       <TriggeringEntities triggeringEntitiesRule="any">
                         <EntityRef entityRef="Ego"/>
                       </TriggeringEntities>
                       <EntityCondition>
-                        <TimeToCollisionCondition value="3.0" rule="lessThan">
+                        <TimeToCollisionCondition value="3.0" rule="lessThan" freespace="true">
                           <TimeToCollisionConditionTarget>
                             <EntityRef entityRef="StandingAgent"/>
                           </TimeToCollisionConditionTarget>
@@ -140,7 +150,7 @@
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
           <ByValueCondition>
-            <SimulationTimeCondition value="15.0" rule="greaterThan"/>
+            <SimulationTimeCondition value="11" rule="greaterThan"/>
           </ByValueCondition>
         </Condition>
       </ConditionGroup>
diff --git a/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/simulationConfig.xml b/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/LocalizationOnJunction/Scenario.xosc b/sim/contrib/examples/Configurations/LocalizationOnJunction/Scenario.xosc
index 91b3f99a7a36aaf959f219434c46b95c53dc9af3..ddc483f1105a8a400933dd9253e651657655e71f 100644
--- a/sim/contrib/examples/Configurations/LocalizationOnJunction/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/LocalizationOnJunction/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="43.5"/>
                 </SpeedActionTarget>
@@ -66,18 +73,18 @@
           <PrivateAction>
             <RoutingAction>
               <AssignRouteAction>
-                <Route>
-                  <Waypoint>
+                <Route closed="false" name="">
+                  <Waypoint routeStrategy="shortest">
                     <Position>
                       <RoadPosition roadId="R1" s="0" t="-1.0"/>
                     </Position>
                   </Waypoint>
-                  <Waypoint>
+                  <Waypoint routeStrategy="shortest">
                     <Position>
                       <RoadPosition roadId="R1_3" s="0" t="-1.0"/>
                     </Position>
                   </Waypoint>
-                  <Waypoint>
+                  <Waypoint routeStrategy="shortest">
                     <Position>
                       <RoadPosition roadId="R3" s="0" t="1.0"/>
                     </Position>
@@ -89,12 +96,16 @@
         </Private>
       </Actions>
     </Init>
-    <Story/>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
           <ByValueCondition>
-            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+            <SimulationTimeCondition value="30" rule="greaterThan"/>
           </ByValueCondition>
         </Condition>
       </ConditionGroup>
diff --git a/sim/contrib/examples/Configurations/LocalizationOnJunction/simulationConfig.xml b/sim/contrib/examples/Configurations/LocalizationOnJunction/simulationConfig.xml
index 9a55c36d4fe485353a026b306b808ab3eedcd6c4..a0b7937309a7affa95611df101aa154f8854b118 100644
--- a/sim/contrib/examples/Configurations/LocalizationOnJunction/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/LocalizationOnJunction/simulationConfig.xml
@@ -40,11 +40,5 @@
       </Parameters>
     </Observation>
   </Observations>
-  <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
-  </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/Scenario.xosc
old mode 100755
new mode 100644
index 50a82444f9c965b9e98280629d323ff076671ecb..e22917ac2be577fcb57c2dc08b93bae92a264a81
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -66,7 +73,7 @@
         </Private>
       </Actions>
     </Init>
-	<Story name="LaneChange">
+    <Story name="LaneChange">
       <Act name="Act1">
         <ManeuverGroup maximumExecutionCount="1" name="StateChangeSequenceA">
           <Actors selectTriggeringEntities="false">
@@ -88,7 +95,7 @@
 				</Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="3.0" rule="greaterThan"/>
                     </ByValueCondition>
@@ -99,7 +106,7 @@
           </Maneuver>
         </ManeuverGroup>
       </Act>
-    </Story>					  
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Absolute/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/Scenario.xosc
old mode 100755
new mode 100644
index 384d4995b4d2048f32ea9e776cefa45cad23c996..5e1517cf801610d05567b6a7adaa73d6fc40112b
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -66,7 +73,7 @@
         </Private>
       </Actions>
     </Init>
-	<Story name="LaneChange">
+    <Story name="LaneChange">
       <Act name="Act1">
         <ManeuverGroup maximumExecutionCount="1" name="StateChangeSequenceA">
           <Actors selectTriggeringEntities="false">
@@ -88,7 +95,7 @@
 				</Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="3.0" rule="greaterThan"/>
                     </ByValueCondition>
@@ -99,7 +106,7 @@
           </Maneuver>
         </ManeuverGroup>
       </Act>
-    </Story>					  
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeLeft_Relative/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/Scenario.xosc
old mode 100755
new mode 100644
index b5b89514cdb4f02e494e1ba42895c530854ab572..58dcc5d339b27e4cc1f36b0edf26d50e1ae4c8b5
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -66,7 +73,7 @@
         </Private>
       </Actions>
     </Init>
-	<Story name="LaneChange">
+    <Story name="LaneChange">
       <Act name="Act1">
         <ManeuverGroup maximumExecutionCount="1" name="StateChangeSequenceA">
           <Actors selectTriggeringEntities="false">
@@ -88,7 +95,7 @@
 				</Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="3.0" rule="greaterThan"/>
                     </ByValueCondition>
@@ -99,7 +106,7 @@
           </Maneuver>
         </ManeuverGroup>
       </Act>
-    </Story>					  
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Absolute/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/Scenario.xosc
old mode 100755
new mode 100644
index e9cdc3d341c9c3f9cef7545f56e0f7688f495b0b..b39c79bbe83055c5168ffe5deae3324751e45e57
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -66,7 +73,7 @@
         </Private>
       </Actions>
     </Init>
-	<Story name="LaneChange">
+    <Story name="LaneChange">
       <Act name="Act1">
         <ManeuverGroup maximumExecutionCount="1" name="StateChangeSequenceA">
           <Actors selectTriggeringEntities="false">
@@ -88,7 +95,7 @@
 				</Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="3.0" rule="greaterThan"/>
                     </ByValueCondition>
@@ -99,7 +106,7 @@
           </Maneuver>
         </ManeuverGroup>
       </Act>
-    </Story>					  
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_DoubleSinusoidalLaneChangeRight_Relative/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_FollowRouteAction/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_FollowRouteAction/ProfilesCatalog.xml
index a4b4bd4b3a4643cb38aed5947cb8f82e0b7447ce..a8a623be8f45dd4cb7fbb00c01dace756da5f033 100644
--- a/sim/contrib/examples/Configurations/OSCAction_FollowRouteAction/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_FollowRouteAction/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/OSCAction_FollowRouteAction/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_FollowRouteAction/Scenario.xosc
index 3073d0eb93de162b5cb9c6a09d78df6b59b2588d..e2959ebddad860d350bccf84215eeca9c143d462 100644
--- a/sim/contrib/examples/Configurations/OSCAction_FollowRouteAction/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_FollowRouteAction/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,21 +63,21 @@
 		  <PrivateAction>
 			  <RoutingAction>
 				  <AssignRouteAction>
-					<Route>
-					  <Waypoint>
-						<Position>
-						  <RoadPosition roadId="1472558076" t="-1.0" s="230"/>
-						</Position>
+					<Route closed="true" name="">
+					  <Waypoint routeStrategy="shortest">
+              <Position>
+                <RoadPosition roadId="1472558076" t="-1.0" s="230"/>
+              </Position>
 					  </Waypoint>
-					  <Waypoint>
-						<Position>
-						  <RoadPosition roadId="3083973" t="0" s="8.5"/>
-						</Position>
+					  <Waypoint routeStrategy="shortest">
+              <Position>
+                <RoadPosition roadId="3083973" t="0" s="8.5"/>
+              </Position>
 					  </Waypoint>
-					  <Waypoint>
-						<Position>
-						  <RoadPosition roadId="2015840166" t="-0.2" s="100"/>
-						</Position>
+					  <Waypoint routeStrategy="shortest">
+              <Position>
+                <RoadPosition roadId="2015840166" t="-0.2" s="100"/>
+              </Position>
 					  </Waypoint>
 					</Route>
 				  </AssignRouteAction>
@@ -79,12 +86,16 @@
         </Private>
       </Actions>
     </Init>
-    <Story/>
-	<StopTrigger>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
           <ByValueCondition>
-            <SimulationTimeCondition value="33.0" rule="greaterThan"/>
+            <SimulationTimeCondition value="33" rule="greaterThan"/>
           </ByValueCondition>
         </Condition>
       </ConditionGroup>
diff --git a/sim/contrib/examples/Configurations/OSCAction_FullSetParameterVariation/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_FullSetParameterVariation/Scenario.xosc
index 53b78ae1897c629917df86178c6543c68d343507..c0cbc0ae8ecae7e7acad6da8c8c02dfb222ea913 100644
--- a/sim/contrib/examples/Configurations/OSCAction_FullSetParameterVariation/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_FullSetParameterVariation/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -60,7 +67,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="25.0"/>
                 </SpeedActionTarget>
@@ -72,6 +79,11 @@
         </Private>
       </Actions>
     </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/ProfilesCatalog.xml
index 37c68a519fcdec593c2786bdd722236545391a08..4837af243fecc26aba4450b5da11a8f14025b899 100644
--- a/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/ProfilesCatalog.xml
@@ -1,21 +1,23 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="AgentFollowingDriver" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 g12 2016" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 g12 2016" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 g12 2016">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 g12 2016">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="AgentFollowingDriver">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/Scenario.xosc
index 107ec6f75c3f3bec6a09129c602049ff920966f2..2b4d01c84c751ffae5a806b5467ddf230af9ca7e 100644
--- a/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="OSCAction_RemoveAgent"
-    author="in-tech GmbH"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="OSCAction_RemoveAgent" author="in-tech GmbH"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="LuxuryClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="LuxuryClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
   </Entities>
   <Storyboard>
@@ -57,7 +60,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="43.5"/>
                 </SpeedActionTarget>
@@ -84,7 +87,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="TimeTrigger">
+                  <Condition name="TimeTrigger" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value=".999" rule="greaterThan"/>
                     </ByValueCondition>
@@ -106,4 +109,4 @@
       </ConditionGroup>
     </StopTrigger>
   </Storyboard>
-</OpenSCENARIO>
\ No newline at end of file
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_RemoveAgent/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/Scenario.xosc
old mode 100755
new mode 100644
index 5134bce6650ca50b9a79f66f75ed022f14a1cb82..822f019650a7a00921117dd754d7317fa4494a11
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="OSCAction_SinusoidalLaneChangeLeft_Absolute"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="OSCAction_SinusoidalLaneChangeLeft_Absolute" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -60,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -92,7 +95,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="3.0" rule="greaterThan"/>
                     </ByValueCondition>
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/Scenario.xosc
old mode 100755
new mode 100644
index c9c7bcd28fb30abe3e01285a1529a1f0d5c98a21..f546bce4174e91bd039ca94f9845c38c19e91694
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="OSCAction_SinusoidalLaneChangeLeft_Relative"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="OSCAction_SinusoidalLaneChangeLeft_Relative" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -60,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -92,7 +95,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="3.0" rule="greaterThan"/>
                     </ByValueCondition>
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/Scenario.xosc
old mode 100755
new mode 100644
index 00086195f9563680dcf7717d53a051fbc80b1876..7f5850035aaa55504390744c74b3ee6dfa1d25de
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="OSCAction_SinusoidalLaneChangeRight_Absolute"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="OSCAction_SinusoidalLaneChangeRight_Absolute" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -60,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -92,7 +95,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="3.0" rule="greaterThan"/>
                     </ByValueCondition>
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Absolute/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/Scenario.xosc b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/Scenario.xosc
old mode 100755
new mode 100644
index 9920a2f3133ba46b932dc9461ccdf299c38b6a0a..f5ea111fe1dcdc591e76eff052382f109308425f
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/Scenario.xosc
@@ -1,19 +1,15 @@
 <?xml version="1.0"?>
 <OpenSCENARIO>
-  <FileHeader revMajor="1"
-    revMinor="0"
-    date="2020-06-26T00:17:00"
-    description="OSCAction_SinusoidalLaneChangeRight_Relative"
-    author="BMW AG"/>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="OSCAction_SinusoidalLaneChangeRight_Relative" author="BMW AG"/>
   <ParameterDeclarations>
     <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -40,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -60,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -92,7 +95,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="3.0" rule="greaterThan"/>
                     </ByValueCondition>
diff --git a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/simulationConfig.xml b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/simulationConfig.xml
index eaf68852e1152074fa5a4086093306c4af492cf7..0089fcf428c8b35c562eb3483baee76f2a0ee1e1 100644
--- a/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeRight_Relative/simulationConfig.xml
@@ -43,10 +43,5 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
   </Spawners>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/ObjectAboveRoad/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ObjectAboveRoad/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/ObjectAboveRoad/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ObjectAboveRoad/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/ObjectAboveRoad/Scenario.xosc b/sim/contrib/examples/Configurations/ObjectAboveRoad/Scenario.xosc
old mode 100755
new mode 100644
index 8e3c4847cc993c4910d500cb906a72cd0215086d..3d4723b9d16911aff3d2f892a3cf9a43625bcab3
--- a/sim/contrib/examples/Configurations/ObjectAboveRoad/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ObjectAboveRoad/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -66,7 +73,7 @@
         </Private>
       </Actions>
     </Init>
-	<Story name="Trajectory">
+    <Story name="Trajectory">
       <Act name="Act1">
         <ManeuverGroup maximumExecutionCount="1" name="StateChangeSequenceA">
           <Actors selectTriggeringEntities="false">
@@ -78,29 +85,35 @@
                 <PrivateAction>
                   <RoutingAction>
                     <FollowTrajectoryAction>
-                      <Trajectory name="" closed="false">
-                        <Shape>
-                          <Polyline>
-                            <Vertex time="0.0">
-                              <Position>
-                                <WorldPosition x="0.0" y="1.875" h="0.0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.0">
-                              <Position>
-                                <WorldPosition x="40.0" y="1.875" h="0.0"/>
-                              </Position>
-                            </Vertex>
-                          </Polyline>
-                        </Shape>
-                      </Trajectory>
+                      <TrajectoryRef>
+                        <Trajectory name="" closed="false">
+                          <Shape>
+                            <Polyline>
+                              <Vertex time="0.0">
+                                <Position>
+                                  <WorldPosition x="0.0" y="1.875" h="0.0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.0">
+                                <Position>
+                                  <WorldPosition x="40.0" y="1.875" h="0.0"/>
+                                </Position>
+                              </Vertex>
+                            </Polyline>
+                          </Shape>
+                        </Trajectory>
+                      </TrajectoryRef>
+                      <TimeReference>
+                        <None/>
+                      </TimeReference>
+                      <TrajectoryFollowingMode followingMode="position"/>
                     </FollowTrajectoryAction>
                   </RoutingAction>
                 </PrivateAction>
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="-1.0" rule="greaterThan"/>
                     </ByValueCondition>
@@ -111,7 +124,7 @@
           </Maneuver>
         </ManeuverGroup>
       </Act>
-    </Story>					  
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/ObjectAboveRoad/simulationConfig.xml b/sim/contrib/examples/Configurations/ObjectAboveRoad/simulationConfig.xml
index 962d3f3cea917273fa66fbf2012dc4bc3b59159f..a5e4b4722c0556b08c4a045544d867953eade54b 100644
--- a/sim/contrib/examples/Configurations/ObjectAboveRoad/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ObjectAboveRoad/simulationConfig.xml
@@ -59,11 +59,5 @@
       </Parameters>
     </Observation>
   </Observations>
-  <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
-  </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/ProfilesCatalog.xml
index 265c049a92eb03ddc0ada71bc845dc25369fcc1b..2f915fe814b50d5513616ef78e1b88c2ce31b6e9 100644
--- a/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/ProfilesCatalog.xml
@@ -1,17 +1,19 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
-	<AgentProfile Name="TFAgent" Type="Dynamic">
+    <AgentProfile Name="TFAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="TFVehicle" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="TFVehicle" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-	<VehicleProfile Name="TFVehicle">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="TFVehicle">
       <Components>
         <Component Type="Dynamics_TrajectoryFollower">
           <Profiles>
@@ -20,8 +22,12 @@
         </Component>
       </Components>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+    <SystemProfile Name="StandingVehicle">
+      <Components/>
+      <Sensors/>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
 		<String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -31,8 +37,8 @@
 		<Double Key="Delta" Value="4.0"/>
 		<Double Key="TGapWish" Value="1.5"/>
 		<Double Key="MinDistance" Value="2.0"/>
-		<Double Key="MaxAcceleration" Value="1.4"/>
-		<Double Key="MaxDeceleration" Value="2.0"/>
+		<Double Key="MaxAcceleration" Value="0.0"/>
+		<Double Key="MaxDeceleration" Value="0.0"/>
       </Profile>
   </ProfileGroup>
   <ProfileGroup Type="Dynamics_TrajectoryFollower">
diff --git a/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/Scenario.xosc b/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/Scenario.xosc
old mode 100755
new mode 100644
index a9889a003c4b83f9a037e386411128c72ac5374b..88ef09cd71fffe2c67925f7c4683e8d52f5f1ece
--- a/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,7 +36,14 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="TFAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="TFAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -56,7 +63,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="35.0"/>
                 </SpeedActionTarget>
@@ -66,7 +73,7 @@
         </Private>
       </Actions>
     </Init>
-	<Story name="Trajectory">
+    <Story name="Trajectory">
       <Act name="Act1">
         <ManeuverGroup maximumExecutionCount="1" name="StateChangeSequenceA">
           <Actors selectTriggeringEntities="false">
@@ -78,29 +85,35 @@
                 <PrivateAction>
                   <RoutingAction>
                     <FollowTrajectoryAction>
-                      <Trajectory name="" closed="false">
-                        <Shape>
-                          <Polyline>
-                            <Vertex time="0.0">
-                              <Position>
-                                <WorldPosition x="0.0" y="1.875" h="0.0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5.0">
-                              <Position>
-                                <WorldPosition x="40.0" y="1.875" h="0.0"/>
-                              </Position>
-                            </Vertex>
-                          </Polyline>
-                        </Shape>
-                      </Trajectory>
+                      <TrajectoryRef>
+                        <Trajectory name="" closed="false">
+                          <Shape>
+                            <Polyline>
+                              <Vertex time="0.0">
+                                <Position>
+                                  <WorldPosition x="0.0" y="1.875" h="0.0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5.0">
+                                <Position>
+                                  <WorldPosition x="40.0" y="1.875" h="0.0"/>
+                                </Position>
+                              </Vertex>
+                            </Polyline>
+                          </Shape>
+                        </Trajectory>
+                      </TrajectoryRef>
+                      <TimeReference>
+                        <None/>
+                      </TimeReference>
+                      <TrajectoryFollowingMode followingMode="position"/>
                     </FollowTrajectoryAction>
                   </RoutingAction>
                 </PrivateAction>
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="-1.0" rule="greaterThan"/>
                     </ByValueCondition>
@@ -111,7 +124,7 @@
           </Maneuver>
         </ManeuverGroup>
       </Act>
-    </Story>					  
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/simulationConfig.xml b/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/simulationConfig.xml
index 962d3f3cea917273fa66fbf2012dc4bc3b59159f..a5e4b4722c0556b08c4a045544d867953eade54b 100644
--- a/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/ObjectOfTypeRoadMark/simulationConfig.xml
@@ -59,11 +59,5 @@
       </Parameters>
     </Observation>
   </Observations>
-  <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
-  </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/PCM/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/PCM/ProfilesCatalog.xml
index 2a4a12b8c0696290aae9c773725534fd7a832fab..9f634559bf98d171d52204cd912e3834802c4fab 100644
--- a/sim/contrib/examples/Configurations/PCM/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/PCM/ProfilesCatalog.xml
@@ -1,25 +1,23 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Profiles SchemaVersion="0.4.8">
-    <AgentProfiles>
-        <AgentProfile Name="Agent_0" Type="Static">
+<Profiles SchemaVersion="0.5">
+  <AgentProfiles>
+    <AgentProfile Name="Agent_0" Type="Static">
             <System>
                 <File>SystemConfig.xml</File>
                 <Id>0</Id>
             </System>
             <VehicleModel>Agent_0</VehicleModel>
         </AgentProfile>
-        <AgentProfile Name="Agent_1" Type="Static">
+    <AgentProfile Name="Agent_1" Type="Static">
             <System>
                 <File>SystemConfig.xml</File>
                 <Id>1</Id>
             </System>
             <VehicleModel>Agent_1</VehicleModel>
         </AgentProfile>
-    </AgentProfiles>
-    <VehicleProfiles>
-    </VehicleProfiles>
-    <ProfileGroup Type="Driver"/>
-    <ProfileGroup Type="TrafficRules">
+  </AgentProfiles>
+  <SystemProfiles/>
+  <ProfileGroup Type="Driver"/>
+  <ProfileGroup Type="TrafficRules">
         <Profile Name="Germany">
             <Double Key="OpenSpeedLimit" Value="INF"/>
             <Double Key="OpenSpeedLimitTrucks" Value="22.2222222"/>
diff --git a/sim/contrib/examples/Configurations/PCM/Scenario.xosc b/sim/contrib/examples/Configurations/PCM/Scenario.xosc
index 6e78a8611f1d545abb09e478e5d6bbbac4b2da17..7c6b0a259a604bca3f055a1ac1f6f060945b6f84 100644
--- a/sim/contrib/examples/Configurations/PCM/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/PCM/Scenario.xosc
@@ -1,49 +1,63 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0"?>
 <OpenSCENARIO>
-    <FileHeader revMajor="1" revMinor="0" date="2020-01-01T00:00:00" description="openPASS default scenario" author="openPASS"/>
-    <ParameterDeclarations>
+  <FileHeader revMajor="1" revMinor="0" date="2020-01-01T00:00:00" description="openPASS default scenario" author="openPASS"/>
+  <ParameterDeclarations>
         <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
     </ParameterDeclarations>
-    <CatalogLocations>
-        <VehicleCatalog>
-            <Directory path="VehicleModelsCatalog.xosc"/>
-        </VehicleCatalog>
-        <PedestrianCatalog>
-            <Directory path=""/>
-        </PedestrianCatalog>
-        <ControllerCatalog>
-            <Directory path=""/>
-        </ControllerCatalog>
-        <ManeuverCatalog>
-            <Directory path=""/>
-        </ManeuverCatalog>
-        <MiscObjectCatalog>
-            <Directory path=""/>
-        </MiscObjectCatalog>
-        <EnvironmentCatalog>
-            <Directory path=""/>
-        </EnvironmentCatalog>
-        <TrajectoryCatalog>
-            <Directory path=""/>
-        </TrajectoryCatalog>
-        <RouteCatalog>
-            <Directory path=""/>
-        </RouteCatalog>
-    </CatalogLocations>
-    <RoadNetwork>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
         <LogicFile filepath="SceneryConfiguration.xodr"/>
         <SceneGraphFile filepath=""/>
     </RoadNetwork>
-    <Entities>
-        <ScenarioObject name="Agent_0">
-            <CatalogReference catalogName="ProfilesCatalog.xml" entryName="Agent_0"/>
-        </ScenarioObject>
-        <ScenarioObject name="Agent_1">
-            <CatalogReference catalogName="ProfilesCatalog.xml" entryName="Agent_1"/>
-        </ScenarioObject>
-    </Entities>
-    <Storyboard>
-        <Init>
+  <Entities>
+    <ScenarioObject name="Agent_0">
+      <CatalogReference catalogName="VehicleCatalog" entryName=""/>
+      <ObjectController>
+        <Controller name="Agent_0">
+          <Properties>
+            <Property name="AgentProfile" value="Agent_0"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
+    </ScenarioObject>
+    <ScenarioObject name="Agent_1">
+      <CatalogReference catalogName="VehicleCatalog" entryName=""/>
+      <ObjectController>
+        <Controller name="Agent_1">
+          <Properties>
+            <Property name="AgentProfile" value="Agent_1"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
+    </ScenarioObject>
+  </Entities>
+  <Storyboard>
+    <Init>
             <Actions>
                 <Private entityRef="Agent_0">
                     <PrivateAction>
@@ -56,7 +70,7 @@
                     <PrivateAction>
                         <LongitudinalAction>
                             <SpeedAction>
-                                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                                 <SpeedActionTarget>
                                     <AbsoluteTargetSpeed value="8.33"/>
                                 </SpeedActionTarget>
@@ -75,7 +89,7 @@
                     <PrivateAction>
                         <LongitudinalAction>
                             <SpeedAction>
-                                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                                 <SpeedActionTarget>
                                     <AbsoluteTargetSpeed value="19.44"/>
                                 </SpeedActionTarget>
@@ -85,7 +99,7 @@
                 </Private>
             </Actions>
         </Init>
-        <Story name="TrajectoryStory">
+    <Story name="TrajectoryStory">
             <Act name="Act_0">
                 <ManeuverGroup maximumExecutionCount="1" name="TrajectorySequence">
                     <Actors selectTriggeringEntities="false">
@@ -97,2532 +111,2534 @@
                                 <PrivateAction>
                                     <RoutingAction>
                                         <FollowTrajectoryAction>
-                                            <Trajectory name="LaneChange" closed="false">
-                                                <Shape>
-                                                    <Polyline>
-                                                        <Vertex time="0">
-                                                            <Position>
-                                                                <WorldPosition x="-39.72996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.01">
-                                                            <Position>
-                                                                <WorldPosition x="-39.64996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.02">
-                                                            <Position>
-                                                                <WorldPosition x="-39.56996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.03">
-                                                            <Position>
-                                                                <WorldPosition x="-39.47996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.04">
-                                                            <Position>
-                                                                <WorldPosition x="-39.39996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.05">
-                                                            <Position>
-                                                                <WorldPosition x="-39.31996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.06">
-                                                            <Position>
-                                                                <WorldPosition x="-39.22996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.07">
-                                                            <Position>
-                                                                <WorldPosition x="-39.14996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.08">
-                                                            <Position>
-                                                                <WorldPosition x="-39.06996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.09">
-                                                            <Position>
-                                                                <WorldPosition x="-38.97996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.1">
-                                                            <Position>
-                                                                <WorldPosition x="-38.89996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.11">
-                                                            <Position>
-                                                                <WorldPosition x="-38.81996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.12">
-                                                            <Position>
-                                                                <WorldPosition x="-38.72996858" y="-9.12062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.13">
-                                                            <Position>
-                                                                <WorldPosition x="-38.64996858" y="-9.12062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.14">
-                                                            <Position>
-                                                                <WorldPosition x="-38.56996858" y="-9.12062007" z="0" h="-0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.15">
-                                                            <Position>
-                                                                <WorldPosition x="-38.47996763" y="-9.120480073" z="0" h="-0.0068" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.16">
-                                                            <Position>
-                                                                <WorldPosition x="-38.39996763" y="-9.120480073" z="0" h="-0.0068" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.17">
-                                                            <Position>
-                                                                <WorldPosition x="-38.31996763" y="-9.120480073" z="0" h="-0.0068" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.18">
-                                                            <Position>
-                                                                <WorldPosition x="-38.22996667" y="-9.120340077" z="0" h="-0.0069" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.19">
-                                                            <Position>
-                                                                <WorldPosition x="-38.14996667" y="-9.120340077" z="0" h="-0.0069" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.2">
-                                                            <Position>
-                                                                <WorldPosition x="-38.06996667" y="-9.120340077" z="0" h="-0.0069" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.21">
-                                                            <Position>
-                                                                <WorldPosition x="-37.98996667" y="-9.120340077" z="0" h="-0.0069" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.22">
-                                                            <Position>
-                                                                <WorldPosition x="-37.8999657" y="-9.12020008" z="0" h="-0.007" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.23">
-                                                            <Position>
-                                                                <WorldPosition x="-37.8199657" y="-9.12020008" z="0" h="-0.007" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.24">
-                                                            <Position>
-                                                                <WorldPosition x="-37.7399657" y="-9.12020008" z="0" h="-0.007" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.25">
-                                                            <Position>
-                                                                <WorldPosition x="-37.6499657" y="-9.12020008" z="0" h="-0.007" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.26">
-                                                            <Position>
-                                                                <WorldPosition x="-37.56996471" y="-9.120060084" z="0" h="-0.0071" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.27">
-                                                            <Position>
-                                                                <WorldPosition x="-37.48996471" y="-9.120060084" z="0" h="-0.0071" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.28">
-                                                            <Position>
-                                                                <WorldPosition x="-37.39996471" y="-9.120060084" z="0" h="-0.0071" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.29">
-                                                            <Position>
-                                                                <WorldPosition x="-37.31996471" y="-9.130060084" z="0" h="-0.0071" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.3">
-                                                            <Position>
-                                                                <WorldPosition x="-37.23996371" y="-9.129920087" z="0" h="-0.0072" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.31">
-                                                            <Position>
-                                                                <WorldPosition x="-37.14996371" y="-9.129920087" z="0" h="-0.0072" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.32">
-                                                            <Position>
-                                                                <WorldPosition x="-37.06996371" y="-9.129920087" z="0" h="-0.0072" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.33">
-                                                            <Position>
-                                                                <WorldPosition x="-36.98996371" y="-9.129920087" z="0" h="-0.0072" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.34">
-                                                            <Position>
-                                                                <WorldPosition x="-36.8999627" y="-9.129780091" z="0" h="-0.0073" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.35">
-                                                            <Position>
-                                                                <WorldPosition x="-36.8199627" y="-9.129780091" z="0" h="-0.0073" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.36">
-                                                            <Position>
-                                                                <WorldPosition x="-36.7399627" y="-9.129780091" z="0" h="-0.0073" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.37">
-                                                            <Position>
-                                                                <WorldPosition x="-36.6599627" y="-9.129780091" z="0" h="-0.0073" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.38">
-                                                            <Position>
-                                                                <WorldPosition x="-36.56996167" y="-9.129640095" z="0" h="-0.0074" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.39">
-                                                            <Position>
-                                                                <WorldPosition x="-36.48996167" y="-9.129640095" z="0" h="-0.0074" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.4">
-                                                            <Position>
-                                                                <WorldPosition x="-36.40996167" y="-9.129640095" z="0" h="-0.0074" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.41">
-                                                            <Position>
-                                                                <WorldPosition x="-36.31996167" y="-9.129640095" z="0" h="-0.0074" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.42">
-                                                            <Position>
-                                                                <WorldPosition x="-36.23996063" y="-9.129500098" z="0" h="-0.0075" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.43">
-                                                            <Position>
-                                                                <WorldPosition x="-36.15996063" y="-9.129500098" z="0" h="-0.0075" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.44">
-                                                            <Position>
-                                                                <WorldPosition x="-36.06996063" y="-9.129500098" z="0" h="-0.0075" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.45">
-                                                            <Position>
-                                                                <WorldPosition x="-35.98996063" y="-9.139500098" z="0" h="-0.0075" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.46">
-                                                            <Position>
-                                                                <WorldPosition x="-35.90995957" y="-9.139360102" z="0" h="-0.0076" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.47">
-                                                            <Position>
-                                                                <WorldPosition x="-35.81995957" y="-9.139360102" z="0" h="-0.0076" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.48">
-                                                            <Position>
-                                                                <WorldPosition x="-35.73995957" y="-9.139360102" z="0" h="-0.0076" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.49">
-                                                            <Position>
-                                                                <WorldPosition x="-35.6599585" y="-9.139220107" z="0" h="-0.0077" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.5">
-                                                            <Position>
-                                                                <WorldPosition x="-35.5799585" y="-9.139220107" z="0" h="-0.0077" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.51">
-                                                            <Position>
-                                                                <WorldPosition x="-35.4899585" y="-9.139220107" z="0" h="-0.0077" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.52">
-                                                            <Position>
-                                                                <WorldPosition x="-35.40995741" y="-9.139080111" z="0" h="-0.0078" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.53">
-                                                            <Position>
-                                                                <WorldPosition x="-35.32995741" y="-9.139080111" z="0" h="-0.0078" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.54">
-                                                            <Position>
-                                                                <WorldPosition x="-35.23995631" y="-9.138940115" z="0" h="-0.0079" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.55">
-                                                            <Position>
-                                                                <WorldPosition x="-35.15995631" y="-9.138940115" z="0" h="-0.0079" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.56">
-                                                            <Position>
-                                                                <WorldPosition x="-35.07995631" y="-9.138940115" z="0" h="-0.0079" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.57">
-                                                            <Position>
-                                                                <WorldPosition x="-34.9899552" y="-9.138800119" z="0" h="-0.008" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.58">
-                                                            <Position>
-                                                                <WorldPosition x="-34.9099552" y="-9.138800119" z="0" h="-0.008" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.59">
-                                                            <Position>
-                                                                <WorldPosition x="-34.82995407" y="-9.148660124" z="0" h="-0.0081" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.6">
-                                                            <Position>
-                                                                <WorldPosition x="-34.74995407" y="-9.148660124" z="0" h="-0.0081" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.61">
-                                                            <Position>
-                                                                <WorldPosition x="-34.65995293" y="-9.148520129" z="0" h="-0.0082" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.62">
-                                                            <Position>
-                                                                <WorldPosition x="-34.57995293" y="-9.148520129" z="0" h="-0.0082" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.63">
-                                                            <Position>
-                                                                <WorldPosition x="-34.49995293" y="-9.148520129" z="0" h="-0.0082" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.64">
-                                                            <Position>
-                                                                <WorldPosition x="-34.40995178" y="-9.148380133" z="0" h="-0.0083" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.65">
-                                                            <Position>
-                                                                <WorldPosition x="-34.32995178" y="-9.148380133" z="0" h="-0.0083" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.66">
-                                                            <Position>
-                                                                <WorldPosition x="-34.24995061" y="-9.148240138" z="0" h="-0.0084" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.67">
-                                                            <Position>
-                                                                <WorldPosition x="-34.16995061" y="-9.148240138" z="0" h="-0.0084" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.68">
-                                                            <Position>
-                                                                <WorldPosition x="-34.07994943" y="-9.148100143" z="0" h="-0.0085" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.69">
-                                                            <Position>
-                                                                <WorldPosition x="-33.99994943" y="-9.148100143" z="0" h="-0.0085" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.7">
-                                                            <Position>
-                                                                <WorldPosition x="-33.91994823" y="-9.147960148" z="0" h="-0.0086" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.71">
-                                                            <Position>
-                                                                <WorldPosition x="-33.82994823" y="-9.147960148" z="0" h="-0.0086" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.72">
-                                                            <Position>
-                                                                <WorldPosition x="-33.74994702" y="-9.147820154" z="0" h="-0.0087" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.73">
-                                                            <Position>
-                                                                <WorldPosition x="-33.66994579" y="-9.157680159" z="0" h="-0.0088" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.74">
-                                                            <Position>
-                                                                <WorldPosition x="-33.58994579" y="-9.157680159" z="0" h="-0.0088" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.75">
-                                                            <Position>
-                                                                <WorldPosition x="-33.49994455" y="-9.157540164" z="0" h="-0.0089" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.76">
-                                                            <Position>
-                                                                <WorldPosition x="-33.41994455" y="-9.157540164" z="0" h="-0.0089" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.77">
-                                                            <Position>
-                                                                <WorldPosition x="-33.3399433" y="-9.15740017" z="0" h="-0.009" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.78">
-                                                            <Position>
-                                                                <WorldPosition x="-33.2499433" y="-9.15740017" z="0" h="-0.009" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.79">
-                                                            <Position>
-                                                                <WorldPosition x="-33.16994203" y="-9.157260176" z="0" h="-0.0091" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.8">
-                                                            <Position>
-                                                                <WorldPosition x="-33.08994075" y="-9.157120182" z="0" h="-0.0092" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.81">
-                                                            <Position>
-                                                                <WorldPosition x="-33.00994075" y="-9.157120182" z="0" h="-0.0092" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.82">
-                                                            <Position>
-                                                                <WorldPosition x="-32.91993946" y="-9.156980188" z="0" h="-0.0093" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.83">
-                                                            <Position>
-                                                                <WorldPosition x="-32.83993946" y="-9.156980188" z="0" h="-0.0093" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.84">
-                                                            <Position>
-                                                                <WorldPosition x="-32.75993815" y="-9.156840194" z="0" h="-0.0094" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.85">
-                                                            <Position>
-                                                                <WorldPosition x="-32.66993683" y="-9.1667002" z="0" h="-0.0095" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.86">
-                                                            <Position>
-                                                                <WorldPosition x="-32.58993683" y="-9.1667002" z="0" h="-0.0095" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.87">
-                                                            <Position>
-                                                                <WorldPosition x="-32.50993549" y="-9.166560206" z="0" h="-0.0096" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.88">
-                                                            <Position>
-                                                                <WorldPosition x="-32.42993549" y="-9.166560206" z="0" h="-0.0096" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.89">
-                                                            <Position>
-                                                                <WorldPosition x="-32.33993414" y="-9.166420213" z="0" h="-0.0097" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.9">
-                                                            <Position>
-                                                                <WorldPosition x="-32.25993277" y="-9.16628022" z="0" h="-0.0098" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.91">
-                                                            <Position>
-                                                                <WorldPosition x="-32.17993277" y="-9.16628022" z="0" h="-0.0098" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.92">
-                                                            <Position>
-                                                                <WorldPosition x="-32.08993139" y="-9.166140226" z="0" h="-0.0099" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.93">
-                                                            <Position>
-                                                                <WorldPosition x="-32.00993139" y="-9.166140226" z="0" h="-0.0099" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.94">
-                                                            <Position>
-                                                                <WorldPosition x="-31.92993" y="-9.166000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.95">
-                                                            <Position>
-                                                                <WorldPosition x="-31.84993" y="-9.166000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.96">
-                                                            <Position>
-                                                                <WorldPosition x="-31.75993" y="-9.166000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.97">
-                                                            <Position>
-                                                                <WorldPosition x="-31.67993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.98">
-                                                            <Position>
-                                                                <WorldPosition x="-31.59993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.99">
-                                                            <Position>
-                                                                <WorldPosition x="-31.51993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1">
-                                                            <Position>
-                                                                <WorldPosition x="-31.42993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.01">
-                                                            <Position>
-                                                                <WorldPosition x="-31.34993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.02">
-                                                            <Position>
-                                                                <WorldPosition x="-31.26993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.03">
-                                                            <Position>
-                                                                <WorldPosition x="-31.17993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.04">
-                                                            <Position>
-                                                                <WorldPosition x="-31.09993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.05">
-                                                            <Position>
-                                                                <WorldPosition x="-31.01993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.06">
-                                                            <Position>
-                                                                <WorldPosition x="-30.93993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.07">
-                                                            <Position>
-                                                                <WorldPosition x="-30.84993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.08">
-                                                            <Position>
-                                                                <WorldPosition x="-30.76993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.09">
-                                                            <Position>
-                                                                <WorldPosition x="-30.68993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.1">
-                                                            <Position>
-                                                                <WorldPosition x="-30.60993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.11">
-                                                            <Position>
-                                                                <WorldPosition x="-30.51993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.12">
-                                                            <Position>
-                                                                <WorldPosition x="-30.43993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.13">
-                                                            <Position>
-                                                                <WorldPosition x="-30.35993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.14">
-                                                            <Position>
-                                                                <WorldPosition x="-30.27993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.15">
-                                                            <Position>
-                                                                <WorldPosition x="-30.18993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.16">
-                                                            <Position>
-                                                                <WorldPosition x="-30.10993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.17">
-                                                            <Position>
-                                                                <WorldPosition x="-30.02993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.18">
-                                                            <Position>
-                                                                <WorldPosition x="-29.93993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.19">
-                                                            <Position>
-                                                                <WorldPosition x="-29.85993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.2">
-                                                            <Position>
-                                                                <WorldPosition x="-29.77993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.21">
-                                                            <Position>
-                                                                <WorldPosition x="-29.69993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.22">
-                                                            <Position>
-                                                                <WorldPosition x="-29.60993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.23">
-                                                            <Position>
-                                                                <WorldPosition x="-29.52993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.24">
-                                                            <Position>
-                                                                <WorldPosition x="-29.44993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.25">
-                                                            <Position>
-                                                                <WorldPosition x="-29.36993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.26">
-                                                            <Position>
-                                                                <WorldPosition x="-29.27993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.27">
-                                                            <Position>
-                                                                <WorldPosition x="-29.19993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.28">
-                                                            <Position>
-                                                                <WorldPosition x="-29.11993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.29">
-                                                            <Position>
-                                                                <WorldPosition x="-29.03993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.3">
-                                                            <Position>
-                                                                <WorldPosition x="-28.94993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.31">
-                                                            <Position>
-                                                                <WorldPosition x="-28.86993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.32">
-                                                            <Position>
-                                                                <WorldPosition x="-28.78993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.33">
-                                                            <Position>
-                                                                <WorldPosition x="-28.70993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.34">
-                                                            <Position>
-                                                                <WorldPosition x="-28.61993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.35">
-                                                            <Position>
-                                                                <WorldPosition x="-28.53993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.36">
-                                                            <Position>
-                                                                <WorldPosition x="-28.45993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.37">
-                                                            <Position>
-                                                                <WorldPosition x="-28.36993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.38">
-                                                            <Position>
-                                                                <WorldPosition x="-28.28993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.39">
-                                                            <Position>
-                                                                <WorldPosition x="-28.20993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.4">
-                                                            <Position>
-                                                                <WorldPosition x="-28.12993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.41">
-                                                            <Position>
-                                                                <WorldPosition x="-28.03993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.42">
-                                                            <Position>
-                                                                <WorldPosition x="-27.95993" y="-9.216000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.43">
-                                                            <Position>
-                                                                <WorldPosition x="-27.87993" y="-9.216000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.44">
-                                                            <Position>
-                                                                <WorldPosition x="-27.79993" y="-9.216000233" z="0" h="-0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.45">
-                                                            <Position>
-                                                                <WorldPosition x="-27.70993139" y="-9.216140226" z="0" h="-0.0099" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.46">
-                                                            <Position>
-                                                                <WorldPosition x="-27.62993277" y="-9.21628022" z="0" h="-0.0098" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.47">
-                                                            <Position>
-                                                                <WorldPosition x="-27.54993414" y="-9.216420213" z="0" h="-0.0097" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.48">
-                                                            <Position>
-                                                                <WorldPosition x="-27.46993549" y="-9.216560206" z="0" h="-0.0096" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.49">
-                                                            <Position>
-                                                                <WorldPosition x="-27.37993683" y="-9.2167002" z="0" h="-0.0095" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.5">
-                                                            <Position>
-                                                                <WorldPosition x="-27.29993815" y="-9.216840194" z="0" h="-0.0094" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.51">
-                                                            <Position>
-                                                                <WorldPosition x="-27.21993946" y="-9.216980188" z="0" h="-0.0093" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.52">
-                                                            <Position>
-                                                                <WorldPosition x="-27.13994203" y="-9.217260176" z="0" h="-0.0091" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.53">
-                                                            <Position>
-                                                                <WorldPosition x="-27.0499433" y="-9.21740017" z="0" h="-0.009" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.54">
-                                                            <Position>
-                                                                <WorldPosition x="-26.96994455" y="-9.217540164" z="0" h="-0.0089" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.55">
-                                                            <Position>
-                                                                <WorldPosition x="-26.88994702" y="-9.217820154" z="0" h="-0.0087" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.56">
-                                                            <Position>
-                                                                <WorldPosition x="-26.80994823" y="-9.227960148" z="0" h="-0.0086" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.57">
-                                                            <Position>
-                                                                <WorldPosition x="-26.71995061" y="-9.228240138" z="0" h="-0.0084" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.58">
-                                                            <Position>
-                                                                <WorldPosition x="-26.63995178" y="-9.228380133" z="0" h="-0.0083" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.59">
-                                                            <Position>
-                                                                <WorldPosition x="-26.55995407" y="-9.228660124" z="0" h="-0.0081" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.6">
-                                                            <Position>
-                                                                <WorldPosition x="-26.4799552" y="-9.228800119" z="0" h="-0.008" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.61">
-                                                            <Position>
-                                                                <WorldPosition x="-26.38995741" y="-9.229080111" z="0" h="-0.0078" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.62">
-                                                            <Position>
-                                                                <WorldPosition x="-26.30995957" y="-9.229360102" z="0" h="-0.0076" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.63">
-                                                            <Position>
-                                                                <WorldPosition x="-26.22996167" y="-9.229640095" z="0" h="-0.0074" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.64">
-                                                            <Position>
-                                                                <WorldPosition x="-26.14996371" y="-9.229920087" z="0" h="-0.0072" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.65">
-                                                            <Position>
-                                                                <WorldPosition x="-26.0599657" y="-9.23020008" z="0" h="-0.007" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.66">
-                                                            <Position>
-                                                                <WorldPosition x="-25.97996763" y="-9.230480073" z="0" h="-0.0068" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.67">
-                                                            <Position>
-                                                                <WorldPosition x="-25.89996951" y="-9.230760067" z="0" h="-0.0066" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.68">
-                                                            <Position>
-                                                                <WorldPosition x="-25.81997133" y="-9.231040061" z="0" h="-0.0064" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.69">
-                                                            <Position>
-                                                                <WorldPosition x="-25.72997309" y="-9.231320056" z="0" h="-0.0062" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.7">
-                                                            <Position>
-                                                                <WorldPosition x="-25.64997563" y="-9.231740048" z="0" h="-0.0059" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.71">
-                                                            <Position>
-                                                                <WorldPosition x="-25.56997726" y="-9.232020043" z="0" h="-0.0057" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.72">
-                                                            <Position>
-                                                                <WorldPosition x="-25.48997959" y="-9.232440037" z="0" h="-0.0054" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.73">
-                                                            <Position>
-                                                                <WorldPosition x="-25.39998107" y="-9.232720033" z="0" h="-0.0052" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.74">
-                                                            <Position>
-                                                                <WorldPosition x="-25.31998319" y="-9.233140027" z="0" h="-0.0049" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.75">
-                                                            <Position>
-                                                                <WorldPosition x="-25.23998519" y="-9.233560023" z="0" h="-0.0046" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.76">
-                                                            <Position>
-                                                                <WorldPosition x="-25.15998706" y="-9.233980019" z="0" h="-0.0043" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.77">
-                                                            <Position>
-                                                                <WorldPosition x="-25.06998823" y="-9.234260016" z="0" h="-0.0041" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.78">
-                                                            <Position>
-                                                                <WorldPosition x="-24.98998989" y="-9.234680013" z="0" h="-0.0038" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.79">
-                                                            <Position>
-                                                                <WorldPosition x="-24.90999143" y="-9.23510001" z="0" h="-0.0035" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.8">
-                                                            <Position>
-                                                                <WorldPosition x="-24.82999327" y="-9.235660007" z="0" h="-0.0031" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.81">
-                                                            <Position>
-                                                                <WorldPosition x="-24.73999451" y="-9.236080005" z="0" h="-0.0028" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.82">
-                                                            <Position>
-                                                                <WorldPosition x="-24.65999563" y="-9.236500004" z="0" h="-0.0025" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.83">
-                                                            <Position>
-                                                                <WorldPosition x="-24.57999691" y="-9.237060002" z="0" h="-0.0021" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.84">
-                                                            <Position>
-                                                                <WorldPosition x="-24.49999773" y="-9.237480001" z="0" h="-0.0018" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.85">
-                                                            <Position>
-                                                                <WorldPosition x="-24.40999863" y="-9.238040001" z="0" h="-0.0014" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.86">
-                                                            <Position>
-                                                                <WorldPosition x="-24.32999915" y="-9.23846" z="0" h="-0.0011" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.87">
-                                                            <Position>
-                                                                <WorldPosition x="-24.24999966" y="-9.23902" z="0" h="-0.0007" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.88">
-                                                            <Position>
-                                                                <WorldPosition x="-24.16999994" y="-9.23958" z="0" h="-0.0003" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.89">
-                                                            <Position>
-                                                                <WorldPosition x="-24.07999999" y="-9.24014" z="0" h="0.0001" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.9">
-                                                            <Position>
-                                                                <WorldPosition x="-23.99999983" y="-9.2407" z="0" h="0.0005" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.91">
-                                                            <Position>
-                                                                <WorldPosition x="-23.91999943" y="-9.24126" z="0" h="0.0009" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.92">
-                                                            <Position>
-                                                                <WorldPosition x="-23.83999882" y="-9.241819999" z="0" h="0.0013" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.93">
-                                                            <Position>
-                                                                <WorldPosition x="-23.74999773" y="-9.242519999" z="0" h="0.0018" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.94">
-                                                            <Position>
-                                                                <WorldPosition x="-23.66999661" y="-9.243079998" z="0" h="0.0022" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.95">
-                                                            <Position>
-                                                                <WorldPosition x="-23.5899949" y="-9.243779995" z="0" h="0.0027" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.96">
-                                                            <Position>
-                                                                <WorldPosition x="-23.50999283" y="-9.244479992" z="0" h="0.0032" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.97">
-                                                            <Position>
-                                                                <WorldPosition x="-23.41999093" y="-9.245039989" z="0" h="0.0036" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.98">
-                                                            <Position>
-                                                                <WorldPosition x="-23.33998823" y="-9.235739984" z="0" h="0.0041" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.99">
-                                                            <Position>
-                                                                <WorldPosition x="-23.25998519" y="-9.236439977" z="0" h="0.0046" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2">
-                                                            <Position>
-                                                                <WorldPosition x="-23.17998179" y="-9.237139969" z="0" h="0.0051" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.01">
-                                                            <Position>
-                                                                <WorldPosition x="-23.09997726" y="-9.237979957" z="0" h="0.0057" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.02">
-                                                            <Position>
-                                                                <WorldPosition x="-23.00997309" y="-9.238679944" z="0" h="0.0062" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.03">
-                                                            <Position>
-                                                                <WorldPosition x="-22.92996858" y="-9.23937993" z="0" h="0.0067" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.04">
-                                                            <Position>
-                                                                <WorldPosition x="-22.8499627" y="-9.240219909" z="0" h="0.0073" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.05">
-                                                            <Position>
-                                                                <WorldPosition x="-22.76995631" y="-9.241059885" z="0" h="0.0079" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.06">
-                                                            <Position>
-                                                                <WorldPosition x="-22.67994943" y="-9.241899857" z="0" h="0.0085" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.07">
-                                                            <Position>
-                                                                <WorldPosition x="-22.59994203" y="-9.242739824" z="0" h="0.0091" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.08">
-                                                            <Position>
-                                                                <WorldPosition x="-22.51993414" y="-9.233579787" z="0" h="0.0097" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.09">
-                                                            <Position>
-                                                                <WorldPosition x="-22.43993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.1">
-                                                            <Position>
-                                                                <WorldPosition x="-22.34993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.11">
-                                                            <Position>
-                                                                <WorldPosition x="-22.26993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.12">
-                                                            <Position>
-                                                                <WorldPosition x="-22.18993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.13">
-                                                            <Position>
-                                                                <WorldPosition x="-22.10993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.14">
-                                                            <Position>
-                                                                <WorldPosition x="-22.01993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.15">
-                                                            <Position>
-                                                                <WorldPosition x="-21.93993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.16">
-                                                            <Position>
-                                                                <WorldPosition x="-21.85993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.17">
-                                                            <Position>
-                                                                <WorldPosition x="-21.77993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.18">
-                                                            <Position>
-                                                                <WorldPosition x="-21.68993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.19">
-                                                            <Position>
-                                                                <WorldPosition x="-21.60993" y="-9.213999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.2">
-                                                            <Position>
-                                                                <WorldPosition x="-21.52993" y="-9.213999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.21">
-                                                            <Position>
-                                                                <WorldPosition x="-21.44993" y="-9.213999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.22">
-                                                            <Position>
-                                                                <WorldPosition x="-21.35993" y="-9.213999767" z="0" h="0.01" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.23">
-                                                            <Position>
-                                                                <WorldPosition x="-21.27972001" y="-9.227998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.24">
-                                                            <Position>
-                                                                <WorldPosition x="-21.19972001" y="-9.217998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.25">
-                                                            <Position>
-                                                                <WorldPosition x="-21.11972001" y="-9.217998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.26">
-                                                            <Position>
-                                                                <WorldPosition x="-21.03972001" y="-9.217998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.27">
-                                                            <Position>
-                                                                <WorldPosition x="-20.94972001" y="-9.207998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.28">
-                                                            <Position>
-                                                                <WorldPosition x="-20.86972001" y="-9.207998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.29">
-                                                            <Position>
-                                                                <WorldPosition x="-20.78972001" y="-9.207998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.3">
-                                                            <Position>
-                                                                <WorldPosition x="-20.70972001" y="-9.207998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.31">
-                                                            <Position>
-                                                                <WorldPosition x="-20.61972001" y="-9.197998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.32">
-                                                            <Position>
-                                                                <WorldPosition x="-20.53972001" y="-9.197998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.33">
-                                                            <Position>
-                                                                <WorldPosition x="-20.45972001" y="-9.197998133" z="0" h="0.02" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.34">
-                                                            <Position>
-                                                                <WorldPosition x="-20.37937005" y="-9.2019937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.35">
-                                                            <Position>
-                                                                <WorldPosition x="-20.28937005" y="-9.2019937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.36">
-                                                            <Position>
-                                                                <WorldPosition x="-20.20937005" y="-9.2019937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.37">
-                                                            <Position>
-                                                                <WorldPosition x="-20.12937005" y="-9.1919937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.38">
-                                                            <Position>
-                                                                <WorldPosition x="-20.04937005" y="-9.1919937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.39">
-                                                            <Position>
-                                                                <WorldPosition x="-19.96937005" y="-9.1819937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.4">
-                                                            <Position>
-                                                                <WorldPosition x="-19.87937005" y="-9.1819937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.41">
-                                                            <Position>
-                                                                <WorldPosition x="-19.79937005" y="-9.1819937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.42">
-                                                            <Position>
-                                                                <WorldPosition x="-19.71937005" y="-9.1719937" z="0" h="0.03" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.43">
-                                                            <Position>
-                                                                <WorldPosition x="-19.63888015" y="-9.185985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.44">
-                                                            <Position>
-                                                                <WorldPosition x="-19.54888015" y="-9.175985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.45">
-                                                            <Position>
-                                                                <WorldPosition x="-19.46888015" y="-9.175985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.46">
-                                                            <Position>
-                                                                <WorldPosition x="-19.38888015" y="-9.165985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.47">
-                                                            <Position>
-                                                                <WorldPosition x="-19.30888015" y="-9.165985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.48">
-                                                            <Position>
-                                                                <WorldPosition x="-19.22888015" y="-9.155985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.49">
-                                                            <Position>
-                                                                <WorldPosition x="-19.13888015" y="-9.155985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.5">
-                                                            <Position>
-                                                                <WorldPosition x="-19.05888015" y="-9.145985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.51">
-                                                            <Position>
-                                                                <WorldPosition x="-18.97888015" y="-9.145985068" z="0" h="0.04" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.52">
-                                                            <Position>
-                                                                <WorldPosition x="-18.89825036" y="-9.149970837" z="0" h="0.05" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.53">
-                                                            <Position>
-                                                                <WorldPosition x="-18.80825036" y="-9.149970837" z="0" h="0.05" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.54">
-                                                            <Position>
-                                                                <WorldPosition x="-18.72825036" y="-9.139970837" z="0" h="0.05" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.55">
-                                                            <Position>
-                                                                <WorldPosition x="-18.64825036" y="-9.139970837" z="0" h="0.05" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.56">
-                                                            <Position>
-                                                                <WorldPosition x="-18.56825036" y="-9.129970837" z="0" h="0.05" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.57">
-                                                            <Position>
-                                                                <WorldPosition x="-18.48825036" y="-9.119970837" z="0" h="0.05" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.58">
-                                                            <Position>
-                                                                <WorldPosition x="-18.39825036" y="-9.119970837" z="0" h="0.05" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.59">
-                                                            <Position>
-                                                                <WorldPosition x="-18.31748076" y="-9.123949609" z="0" h="0.06" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.6">
-                                                            <Position>
-                                                                <WorldPosition x="-18.23748076" y="-9.123949609" z="0" h="0.06" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.61">
-                                                            <Position>
-                                                                <WorldPosition x="-18.15748076" y="-9.113949609" z="0" h="0.06" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.62">
-                                                            <Position>
-                                                                <WorldPosition x="-18.07748076" y="-9.103949609" z="0" h="0.06" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.63">
-                                                            <Position>
-                                                                <WorldPosition x="-17.98748076" y="-9.103949609" z="0" h="0.06" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.64">
-                                                            <Position>
-                                                                <WorldPosition x="-17.90748076" y="-9.093949609" z="0" h="0.06" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.65">
-                                                            <Position>
-                                                                <WorldPosition x="-17.82748076" y="-9.083949609" z="0" h="0.06" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.66">
-                                                            <Position>
-                                                                <WorldPosition x="-17.7465714" y="-9.087919986" z="0" h="0.07" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.67">
-                                                            <Position>
-                                                                <WorldPosition x="-17.6665714" y="-9.087919986" z="0" h="0.07" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.68">
-                                                            <Position>
-                                                                <WorldPosition x="-17.5765714" y="-9.077919986" z="0" h="0.07" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.69">
-                                                            <Position>
-                                                                <WorldPosition x="-17.4965714" y="-9.067919986" z="0" h="0.07" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.7">
-                                                            <Position>
-                                                                <WorldPosition x="-17.4165714" y="-9.057919986" z="0" h="0.07" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.71">
-                                                            <Position>
-                                                                <WorldPosition x="-17.3365714" y="-9.047919986" z="0" h="0.07" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.72">
-                                                            <Position>
-                                                                <WorldPosition x="-17.25552239" y="-9.061880572" z="0" h="0.08" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.73">
-                                                            <Position>
-                                                                <WorldPosition x="-17.16552239" y="-9.051880572" z="0" h="0.08" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.74">
-                                                            <Position>
-                                                                <WorldPosition x="-17.08552239" y="-9.041880572" z="0" h="0.08" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.75">
-                                                            <Position>
-                                                                <WorldPosition x="-17.00552239" y="-9.031880572" z="0" h="0.08" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.76">
-                                                            <Position>
-                                                                <WorldPosition x="-16.92552239" y="-9.021880572" z="0" h="0.08" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.77">
-                                                            <Position>
-                                                                <WorldPosition x="-16.84552239" y="-9.011880572" z="0" h="0.08" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.78">
-                                                            <Position>
-                                                                <WorldPosition x="-16.75433383" y="-9.015829969" z="0" h="0.09" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.79">
-                                                            <Position>
-                                                                <WorldPosition x="-16.67433383" y="-9.005829969" z="0" h="0.09" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.8">
-                                                            <Position>
-                                                                <WorldPosition x="-16.59433383" y="-9.005829969" z="0" h="0.09" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.81">
-                                                            <Position>
-                                                                <WorldPosition x="-16.51433383" y="-8.995829969" z="0" h="0.09" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.82">
-                                                            <Position>
-                                                                <WorldPosition x="-16.43433383" y="-8.985829969" z="0" h="0.09" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.83">
-                                                            <Position>
-                                                                <WorldPosition x="-16.35300583" y="-8.989766783" z="0" h="0.1" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.84">
-                                                            <Position>
-                                                                <WorldPosition x="-16.26300583" y="-8.979766783" z="0" h="0.1" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.85">
-                                                            <Position>
-                                                                <WorldPosition x="-16.18300583" y="-8.969766783" z="0" h="0.1" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.86">
-                                                            <Position>
-                                                                <WorldPosition x="-16.10300583" y="-8.949766783" z="0" h="0.1" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.87">
-                                                            <Position>
-                                                                <WorldPosition x="-16.02300583" y="-8.939766783" z="0" h="0.1" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.88">
-                                                            <Position>
-                                                                <WorldPosition x="-15.94153854" y="-8.943689621" z="0" h="0.11" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.89">
-                                                            <Position>
-                                                                <WorldPosition x="-15.86153854" y="-8.933689621" z="0" h="0.11" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.9">
-                                                            <Position>
-                                                                <WorldPosition x="-15.77153854" y="-8.923689621" z="0" h="0.11" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.91">
-                                                            <Position>
-                                                                <WorldPosition x="-15.69153854" y="-8.913689621" z="0" h="0.11" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.92">
-                                                            <Position>
-                                                                <WorldPosition x="-15.61153854" y="-8.903689621" z="0" h="0.11" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.93">
-                                                            <Position>
-                                                                <WorldPosition x="-15.52993209" y="-8.90759709" z="0" h="0.12" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.94">
-                                                            <Position>
-                                                                <WorldPosition x="-15.44993209" y="-8.88759709" z="0" h="0.12" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.95">
-                                                            <Position>
-                                                                <WorldPosition x="-15.36993209" y="-8.87759709" z="0" h="0.12" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.96">
-                                                            <Position>
-                                                                <WorldPosition x="-15.28993209" y="-8.86759709" z="0" h="0.12" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.97">
-                                                            <Position>
-                                                                <WorldPosition x="-15.19993209" y="-8.85759709" z="0" h="0.12" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.98">
-                                                            <Position>
-                                                                <WorldPosition x="-15.11818665" y="-8.8514878" z="0" h="0.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.99">
-                                                            <Position>
-                                                                <WorldPosition x="-15.03818665" y="-8.8414878" z="0" h="0.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3">
-                                                            <Position>
-                                                                <WorldPosition x="-14.95818665" y="-8.8314878" z="0" h="0.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.01">
-                                                            <Position>
-                                                                <WorldPosition x="-14.87818665" y="-8.8114878" z="0" h="0.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.02">
-                                                            <Position>
-                                                                <WorldPosition x="-14.79630239" y="-8.815360361" z="0" h="0.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.03">
-                                                            <Position>
-                                                                <WorldPosition x="-14.71630239" y="-8.805360361" z="0" h="0.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.04">
-                                                            <Position>
-                                                                <WorldPosition x="-14.63630239" y="-8.785360361" z="0" h="0.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.05">
-                                                            <Position>
-                                                                <WorldPosition x="-14.54630239" y="-8.775360361" z="0" h="0.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.06">
-                                                            <Position>
-                                                                <WorldPosition x="-14.46630239" y="-8.755360361" z="0" h="0.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.07">
-                                                            <Position>
-                                                                <WorldPosition x="-14.38427951" y="-8.759213385" z="0" h="0.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.08">
-                                                            <Position>
-                                                                <WorldPosition x="-14.30427951" y="-8.739213385" z="0" h="0.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.09">
-                                                            <Position>
-                                                                <WorldPosition x="-14.22427951" y="-8.729213385" z="0" h="0.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.1">
-                                                            <Position>
-                                                                <WorldPosition x="-14.14427951" y="-8.709213385" z="0" h="0.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.11">
-                                                            <Position>
-                                                                <WorldPosition x="-14.0621182" y="-8.713045489" z="0" h="0.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.12">
-                                                            <Position>
-                                                                <WorldPosition x="-13.9821182" y="-8.693045489" z="0" h="0.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.13">
-                                                            <Position>
-                                                                <WorldPosition x="-13.9021182" y="-8.683045489" z="0" h="0.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.14">
-                                                            <Position>
-                                                                <WorldPosition x="-13.8221182" y="-8.663045489" z="0" h="0.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.15">
-                                                            <Position>
-                                                                <WorldPosition x="-13.73981867" y="-8.656855289" z="0" h="0.17" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.16">
-                                                            <Position>
-                                                                <WorldPosition x="-13.65981867" y="-8.646855289" z="0" h="0.17" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.17">
-                                                            <Position>
-                                                                <WorldPosition x="-13.57981867" y="-8.626855289" z="0" h="0.17" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.18">
-                                                            <Position>
-                                                                <WorldPosition x="-13.49981867" y="-8.606855289" z="0" h="0.17" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.19">
-                                                            <Position>
-                                                                <WorldPosition x="-13.40738117" y="-8.610641403" z="0" h="0.18" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.2">
-                                                            <Position>
-                                                                <WorldPosition x="-13.32738117" y="-8.590641403" z="0" h="0.18" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.21">
-                                                            <Position>
-                                                                <WorldPosition x="-13.24738117" y="-8.570641403" z="0" h="0.18" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.22">
-                                                            <Position>
-                                                                <WorldPosition x="-13.16738117" y="-8.550641403" z="0" h="0.18" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.23">
-                                                            <Position>
-                                                                <WorldPosition x="-13.08480593" y="-8.544402453" z="0" h="0.19" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.24">
-                                                            <Position>
-                                                                <WorldPosition x="-13.00480593" y="-8.534402453" z="0" h="0.19" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.25">
-                                                            <Position>
-                                                                <WorldPosition x="-12.92480593" y="-8.514402453" z="0" h="0.19" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.26">
-                                                            <Position>
-                                                                <WorldPosition x="-12.84209321" y="-8.508137063" z="0" h="0.2" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.27">
-                                                            <Position>
-                                                                <WorldPosition x="-12.76209321" y="-8.488137063" z="0" h="0.2" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.28">
-                                                            <Position>
-                                                                <WorldPosition x="-12.68209321" y="-8.468137063" z="0" h="0.2" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.29">
-                                                            <Position>
-                                                                <WorldPosition x="-12.60209321" y="-8.448137063" z="0" h="0.2" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.3">
-                                                            <Position>
-                                                                <WorldPosition x="-12.51924328" y="-8.44184386" z="0" h="0.21" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.31">
-                                                            <Position>
-                                                                <WorldPosition x="-12.43924328" y="-8.42184386" z="0" h="0.21" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.32">
-                                                            <Position>
-                                                                <WorldPosition x="-12.35924328" y="-8.40184386" z="0" h="0.21" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.33">
-                                                            <Position>
-                                                                <WorldPosition x="-12.28625643" y="-8.395521472" z="0" h="0.22" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.34">
-                                                            <Position>
-                                                                <WorldPosition x="-12.20625643" y="-8.375521472" z="0" h="0.22" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.35">
-                                                            <Position>
-                                                                <WorldPosition x="-12.12625643" y="-8.355521472" z="0" h="0.22" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.36">
-                                                            <Position>
-                                                                <WorldPosition x="-12.04313295" y="-8.349168533" z="0" h="0.23" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.37">
-                                                            <Position>
-                                                                <WorldPosition x="-11.96313295" y="-8.319168533" z="0" h="0.23" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.38">
-                                                            <Position>
-                                                                <WorldPosition x="-11.88313295" y="-8.299168533" z="0" h="0.23" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.39">
-                                                            <Position>
-                                                                <WorldPosition x="-11.80313295" y="-8.279168533" z="0" h="0.23" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.4">
-                                                            <Position>
-                                                                <WorldPosition x="-11.71987316" y="-8.272783677" z="0" h="0.24" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.41">
-                                                            <Position>
-                                                                <WorldPosition x="-11.63987316" y="-8.242783677" z="0" h="0.24" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.42">
-                                                            <Position>
-                                                                <WorldPosition x="-11.55987316" y="-8.222783677" z="0" h="0.24" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.43">
-                                                            <Position>
-                                                                <WorldPosition x="-11.47647739" y="-8.216365543" z="0" h="0.25" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.44">
-                                                            <Position>
-                                                                <WorldPosition x="-11.40647739" y="-8.186365543" z="0" h="0.25" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.45">
-                                                            <Position>
-                                                                <WorldPosition x="-11.32647739" y="-8.166365543" z="0" h="0.25" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.46">
-                                                            <Position>
-                                                                <WorldPosition x="-11.24294597" y="-8.159912773" z="0" h="0.26" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.47">
-                                                            <Position>
-                                                                <WorldPosition x="-11.16294597" y="-8.129912773" z="0" h="0.26" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.48">
-                                                            <Position>
-                                                                <WorldPosition x="-11.08294597" y="-8.109912773" z="0" h="0.26" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.49">
-                                                            <Position>
-                                                                <WorldPosition x="-10.99927925" y="-8.093424011" z="0" h="0.27" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.5">
-                                                            <Position>
-                                                                <WorldPosition x="-10.91927925" y="-8.073424011" z="0" h="0.27" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.51">
-                                                            <Position>
-                                                                <WorldPosition x="-10.84927925" y="-8.043424011" z="0" h="0.27" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.52">
-                                                            <Position>
-                                                                <WorldPosition x="-10.76547761" y="-8.026897908" z="0" h="0.28" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.53">
-                                                            <Position>
-                                                                <WorldPosition x="-10.68547761" y="-8.006897908" z="0" h="0.28" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.54">
-                                                            <Position>
-                                                                <WorldPosition x="-10.60547761" y="-7.976897908" z="0" h="0.28" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.55">
-                                                            <Position>
-                                                                <WorldPosition x="-10.53154143" y="-7.960333115" z="0" h="0.29" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.56">
-                                                            <Position>
-                                                                <WorldPosition x="-10.45154143" y="-7.940333115" z="0" h="0.29" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.57">
-                                                            <Position>
-                                                                <WorldPosition x="-10.37154143" y="-7.910333115" z="0" h="0.29" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.58">
-                                                            <Position>
-                                                                <WorldPosition x="-10.28747108" y="-7.893728289" z="0" h="0.3" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.59">
-                                                            <Position>
-                                                                <WorldPosition x="-10.21747108" y="-7.863728289" z="0" h="0.3" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.6">
-                                                            <Position>
-                                                                <WorldPosition x="-10.133267" y="-7.857082091" z="0" h="0.31" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.61">
-                                                            <Position>
-                                                                <WorldPosition x="-10.053267" y="-7.827082091" z="0" h="0.31" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.62">
-                                                            <Position>
-                                                                <WorldPosition x="-9.983266998" y="-7.797082091" z="0" h="0.31" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.63">
-                                                            <Position>
-                                                                <WorldPosition x="-9.898929585" y="-7.780393185" z="0" h="0.32" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.64">
-                                                            <Position>
-                                                                <WorldPosition x="-9.818929585" y="-7.750393185" z="0" h="0.32" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.65">
-                                                            <Position>
-                                                                <WorldPosition x="-9.748929585" y="-7.720393185" z="0" h="0.32" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.66">
-                                                            <Position>
-                                                                <WorldPosition x="-9.664459281" y="-7.70366024" z="0" h="0.33" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.67">
-                                                            <Position>
-                                                                <WorldPosition x="-9.584459281" y="-7.67366024" z="0" h="0.33" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.68">
-                                                            <Position>
-                                                                <WorldPosition x="-9.509856532" y="-7.656881929" z="0" h="0.34" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.69">
-                                                            <Position>
-                                                                <WorldPosition x="-9.429856532" y="-7.626881929" z="0" h="0.34" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.7">
-                                                            <Position>
-                                                                <WorldPosition x="-9.359856532" y="-7.586881929" z="0" h="0.34" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.71">
-                                                            <Position>
-                                                                <WorldPosition x="-9.275121798" y="-7.57005693" z="0" h="0.35" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.72">
-                                                            <Position>
-                                                                <WorldPosition x="-9.195121798" y="-7.54005693" z="0" h="0.35" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.73">
-                                                            <Position>
-                                                                <WorldPosition x="-9.120255553" y="-7.523183927" z="0" h="0.36" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.74">
-                                                            <Position>
-                                                                <WorldPosition x="-9.040255553" y="-7.493183927" z="0" h="0.36" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.75">
-                                                            <Position>
-                                                                <WorldPosition x="-8.970255553" y="-7.453183927" z="0" h="0.36" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.76">
-                                                            <Position>
-                                                                <WorldPosition x="-8.885258284" y="-7.436261605" z="0" h="0.37" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.77">
-                                                            <Position>
-                                                                <WorldPosition x="-8.815258284" y="-7.406261605" z="0" h="0.37" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.78">
-                                                            <Position>
-                                                                <WorldPosition x="-8.73013049" y="-7.379288657" z="0" h="0.38" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.79">
-                                                            <Position>
-                                                                <WorldPosition x="-8.66013049" y="-7.349288657" z="0" h="0.38" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.8">
-                                                            <Position>
-                                                                <WorldPosition x="-8.59013049" y="-7.309288657" z="0" h="0.38" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.81">
-                                                            <Position>
-                                                                <WorldPosition x="-8.504872684" y="-7.292263781" z="0" h="0.39" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.82">
-                                                            <Position>
-                                                                <WorldPosition x="-8.434872684" y="-7.252263781" z="0" h="0.39" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.83">
-                                                            <Position>
-                                                                <WorldPosition x="-8.349485392" y="-7.235185679" z="0" h="0.4" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.84">
-                                                            <Position>
-                                                                <WorldPosition x="-8.279485392" y="-7.195185679" z="0" h="0.4" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.85">
-                                                            <Position>
-                                                                <WorldPosition x="-8.203969152" y="-7.168053059" z="0" h="0.41" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.86">
-                                                            <Position>
-                                                                <WorldPosition x="-8.123969152" y="-7.138053059" z="0" h="0.41" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.87">
-                                                            <Position>
-                                                                <WorldPosition x="-8.053969152" y="-7.098053059" z="0" h="0.41" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.88">
-                                                            <Position>
-                                                                <WorldPosition x="-7.978324516" y="-7.070864634" z="0" h="0.42" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.89">
-                                                            <Position>
-                                                                <WorldPosition x="-7.898324516" y="-7.030864634" z="0" h="0.42" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.9">
-                                                            <Position>
-                                                                <WorldPosition x="-7.82255205" y="-7.013619123" z="0" h="0.43" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.91">
-                                                            <Position>
-                                                                <WorldPosition x="-7.75255205" y="-6.973619123" z="0" h="0.43" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.92">
-                                                            <Position>
-                                                                <WorldPosition x="-7.676652329" y="-6.946315251" z="0" h="0.44" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.93">
-                                                            <Position>
-                                                                <WorldPosition x="-7.596652329" y="-6.906315251" z="0" h="0.44" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.94">
-                                                            <Position>
-                                                                <WorldPosition x="-7.520625943" y="-6.878951748" z="0" h="0.45" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.95">
-                                                            <Position>
-                                                                <WorldPosition x="-7.450625943" y="-6.838951748" z="0" h="0.45" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.96">
-                                                            <Position>
-                                                                <WorldPosition x="-7.374473497" y="-6.81152735" z="0" h="0.46" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.97">
-                                                            <Position>
-                                                                <WorldPosition x="-7.304473497" y="-6.77152735" z="0" h="0.46" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.98">
-                                                            <Position>
-                                                                <WorldPosition x="-7.234473497" y="-6.73152735" z="0" h="0.46" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.99">
-                                                            <Position>
-                                                                <WorldPosition x="-7.158195603" y="-6.7040408" z="0" h="0.47" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4">
-                                                            <Position>
-                                                                <WorldPosition x="-7.088195603" y="-6.6640408" z="0" h="0.47" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.01">
-                                                            <Position>
-                                                                <WorldPosition x="-7.011792892" y="-6.636490846" z="0" h="0.48" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.02">
-                                                            <Position>
-                                                                <WorldPosition x="-6.941792892" y="-6.586490846" z="0" h="0.48" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.03">
-                                                            <Position>
-                                                                <WorldPosition x="-6.865266002" y="-6.558876243" z="0" h="0.49" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.04">
-                                                            <Position>
-                                                                <WorldPosition x="-6.795266002" y="-6.518876243" z="0" h="0.49" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.05">
-                                                            <Position>
-                                                                <WorldPosition x="-6.718615587" y="-6.481195754" z="0" h="0.5" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.06">
-                                                            <Position>
-                                                                <WorldPosition x="-6.648615587" y="-6.441195754" z="0" h="0.5" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.07">
-                                                            <Position>
-                                                                <WorldPosition x="-6.571842311" y="-6.413448146" z="0" h="0.51" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.08">
-                                                            <Position>
-                                                                <WorldPosition x="-6.501842311" y="-6.363448146" z="0" h="0.51" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.09">
-                                                            <Position>
-                                                                <WorldPosition x="-6.424946852" y="-6.335632193" z="0" h="0.52" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.1">
-                                                            <Position>
-                                                                <WorldPosition x="-6.354946852" y="-6.285632193" z="0" h="0.52" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.11">
-                                                            <Position>
-                                                                <WorldPosition x="-6.277929899" y="-6.257746678" z="0" h="0.53" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.12">
-                                                            <Position>
-                                                                <WorldPosition x="-6.217929899" y="-6.207746678" z="0" h="0.53" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.13">
-                                                            <Position>
-                                                                <WorldPosition x="-6.140792154" y="-6.179790388" z="0" h="0.54" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.14">
-                                                            <Position>
-                                                                <WorldPosition x="-6.070792154" y="-6.129790388" z="0" h="0.54" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.15">
-                                                            <Position>
-                                                                <WorldPosition x="-5.993534331" y="-6.091762121" z="0" h="0.55" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.16">
-                                                            <Position>
-                                                                <WorldPosition x="-5.933534331" y="-6.051762121" z="0" h="0.55" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.17">
-                                                            <Position>
-                                                                <WorldPosition x="-5.856157155" y="-6.013660677" z="0" h="0.56" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.18">
-                                                            <Position>
-                                                                <WorldPosition x="-5.786157155" y="-5.963660677" z="0" h="0.56" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.19">
-                                                            <Position>
-                                                                <WorldPosition x="-5.718661365" y="-5.925484868" z="0" h="0.57" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.2">
-                                                            <Position>
-                                                                <WorldPosition x="-5.648661365" y="-5.875484868" z="0" h="0.57" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.21">
-                                                            <Position>
-                                                                <WorldPosition x="-5.57104771" y="-5.847233512" z="0" h="0.58" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.22">
-                                                            <Position>
-                                                                <WorldPosition x="-5.51104771" y="-5.797233512" z="0" h="0.58" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.23">
-                                                            <Position>
-                                                                <WorldPosition x="-5.433316951" y="-5.758905432" z="0" h="0.59" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.24">
-                                                            <Position>
-                                                                <WorldPosition x="-5.373316951" y="-5.708905432" z="0" h="0.59" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.25">
-                                                            <Position>
-                                                                <WorldPosition x="-5.295469861" y="-5.670499463" z="0" h="0.6" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.26">
-                                                            <Position>
-                                                                <WorldPosition x="-5.235469861" y="-5.620499463" z="0" h="0.6" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.27">
-                                                            <Position>
-                                                                <WorldPosition x="-5.167507225" y="-5.582014444" z="0" h="0.61" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.28">
-                                                            <Position>
-                                                                <WorldPosition x="-5.097507225" y="-5.532014444" z="0" h="0.61" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.29">
-                                                            <Position>
-                                                                <WorldPosition x="-5.029429839" y="-5.483449225" z="0" h="0.62" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.3">
-                                                            <Position>
-                                                                <WorldPosition x="-4.959429839" y="-5.433449225" z="0" h="0.62" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.31">
-                                                            <Position>
-                                                                <WorldPosition x="-4.891238512" y="-5.394802661" z="0" h="0.63" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.32">
-                                                            <Position>
-                                                                <WorldPosition x="-4.831238512" y="-5.344802661" z="0" h="0.63" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.33">
-                                                            <Position>
-                                                                <WorldPosition x="-4.762934061" y="-5.306073618" z="0" h="0.64" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.34">
-                                                            <Position>
-                                                                <WorldPosition x="-4.692934061" y="-5.246073618" z="0" h="0.64" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.35">
-                                                            <Position>
-                                                                <WorldPosition x="-4.624517318" y="-5.207260968" z="0" h="0.65" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.36">
-                                                            <Position>
-                                                                <WorldPosition x="-4.564517318" y="-5.157260968" z="0" h="0.65" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.37">
-                                                            <Position>
-                                                                <WorldPosition x="-4.495989124" y="-5.108363593" z="0" h="0.66" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.38">
-                                                            <Position>
-                                                                <WorldPosition x="-4.435989124" y="-5.058363593" z="0" h="0.66" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.39">
-                                                            <Position>
-                                                                <WorldPosition x="-4.367350332" y="-5.009380382" z="0" h="0.67" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.4">
-                                                            <Position>
-                                                                <WorldPosition x="-4.307350332" y="-4.959380382" z="0" h="0.67" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.41">
-                                                            <Position>
-                                                                <WorldPosition x="-4.238601806" y="-4.910310234" z="0" h="0.68" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.42">
-                                                            <Position>
-                                                                <WorldPosition x="-4.178601806" y="-4.860310234" z="0" h="0.68" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.43">
-                                                            <Position>
-                                                                <WorldPosition x="-4.109744421" y="-4.811152055" z="0" h="0.69" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.44">
-                                                            <Position>
-                                                                <WorldPosition x="-4.040779062" y="-4.761904762" z="0" h="0.7" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.45">
-                                                            <Position>
-                                                                <WorldPosition x="-3.980779062" y="-4.711904762" z="0" h="0.7" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.46">
-                                                            <Position>
-                                                                <WorldPosition x="-3.911706626" y="-4.662567279" z="0" h="0.71" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.47">
-                                                            <Position>
-                                                                <WorldPosition x="-3.851706626" y="-4.602567279" z="0" h="0.71" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.48">
-                                                            <Position>
-                                                                <WorldPosition x="-3.782528021" y="-4.563138541" z="0" h="0.72" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.49">
-                                                            <Position>
-                                                                <WorldPosition x="-3.722528021" y="-4.503138541" z="0" h="0.72" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.5">
-                                                            <Position>
-                                                                <WorldPosition x="-3.663244163" y="-4.453617489" z="0" h="0.73" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.51">
-                                                            <Position>
-                                                                <WorldPosition x="-3.603244163" y="-4.393617489" z="0" h="0.73" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.52">
-                                                            <Position>
-                                                                <WorldPosition x="-3.533855982" y="-4.344003076" z="0" h="0.74" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.53">
-                                                            <Position>
-                                                                <WorldPosition x="-3.483855982" y="-4.284003076" z="0" h="0.74" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.54">
-                                                            <Position>
-                                                                <WorldPosition x="-3.414364416" y="-4.244294264" z="0" h="0.75" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.55">
-                                                            <Position>
-                                                                <WorldPosition x="-3.354364416" y="-4.184294264" z="0" h="0.75" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.56">
-                                                            <Position>
-                                                                <WorldPosition x="-3.294770415" y="-4.134490023" z="0" h="0.76" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.57">
-                                                            <Position>
-                                                                <WorldPosition x="-3.234770415" y="-4.074490023" z="0" h="0.76" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.58">
-                                                            <Position>
-                                                                <WorldPosition x="-3.175074937" y="-4.024589334" z="0" h="0.77" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.59">
-                                                            <Position>
-                                                                <WorldPosition x="-3.115074937" y="-3.964589334" z="0" h="0.77" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.6">
-                                                            <Position>
-                                                                <WorldPosition x="-3.055278953" y="-3.904591187" z="0" h="0.78" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.61">
-                                                            <Position>
-                                                                <WorldPosition x="-2.995278953" y="-3.844591187" z="0" h="0.78" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.62">
-                                                            <Position>
-                                                                <WorldPosition x="-2.935383442" y="-3.794494581" z="0" h="0.79" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.63">
-                                                            <Position>
-                                                                <WorldPosition x="-2.875383442" y="-3.734494581" z="0" h="0.79" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.64">
-                                                            <Position>
-                                                                <WorldPosition x="-2.815389393" y="-3.684298527" z="0" h="0.8" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.65">
-                                                            <Position>
-                                                                <WorldPosition x="-2.765389393" y="-3.624298527" z="0" h="0.8" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.66">
-                                                            <Position>
-                                                                <WorldPosition x="-2.695297806" y="-3.564002044" z="0" h="0.81" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.67">
-                                                            <Position>
-                                                                <WorldPosition x="-2.645297806" y="-3.504002044" z="0" h="0.81" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.68">
-                                                            <Position>
-                                                                <WorldPosition x="-2.58510969" y="-3.453604162" z="0" h="0.82" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.69">
-                                                            <Position>
-                                                                <WorldPosition x="-2.53510969" y="-3.383604162" z="0" h="0.82" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.7">
-                                                            <Position>
-                                                                <WorldPosition x="-2.474826064" y="-3.33310392" z="0" h="0.83" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.71">
-                                                            <Position>
-                                                                <WorldPosition x="-2.414826064" y="-3.27310392" z="0" h="0.83" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.72">
-                                                            <Position>
-                                                                <WorldPosition x="-2.354447956" y="-3.212500368" z="0" h="0.84" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.73">
-                                                            <Position>
-                                                                <WorldPosition x="-2.304447956" y="-3.152500368" z="0" h="0.84" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.74">
-                                                            <Position>
-                                                                <WorldPosition x="-2.243976404" y="-3.091792567" z="0" h="0.85" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.75">
-                                                            <Position>
-                                                                <WorldPosition x="-2.193976404" y="-3.031792567" z="0" h="0.85" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.76">
-                                                            <Position>
-                                                                <WorldPosition x="-2.133412455" y="-2.970979588" z="0" h="0.86" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.77">
-                                                            <Position>
-                                                                <WorldPosition x="-2.083412455" y="-2.910979588" z="0" h="0.86" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.78">
-                                                            <Position>
-                                                                <WorldPosition x="-2.022757166" y="-2.850060512" z="0" h="0.87" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.79">
-                                                            <Position>
-                                                                <WorldPosition x="-1.972757166" y="-2.790060512" z="0" h="0.87" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.8">
-                                                            <Position>
-                                                                <WorldPosition x="-1.922011602" y="-2.72903443" z="0" h="0.88" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.81">
-                                                            <Position>
-                                                                <WorldPosition x="-1.872011602" y="-2.66903443" z="0" h="0.88" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.82">
-                                                            <Position>
-                                                                <WorldPosition x="-1.811176837" y="-2.607900447" z="0" h="0.89" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.83">
-                                                            <Position>
-                                                                <WorldPosition x="-1.761176837" y="-2.537900447" z="0" h="0.89" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.84">
-                                                            <Position>
-                                                                <WorldPosition x="-1.700253956" y="-2.486657673" z="0" h="0.9" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.85">
-                                                            <Position>
-                                                                <WorldPosition x="-1.660253956" y="-2.416657673" z="0" h="0.9" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.86">
-                                                            <Position>
-                                                                <WorldPosition x="-1.610253956" y="-2.346657673" z="0" h="0.9" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.87">
-                                                            <Position>
-                                                                <WorldPosition x="-1.549244049" y="-2.285305236" z="0" h="0.91" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.88">
-                                                            <Position>
-                                                                <WorldPosition x="-1.509244049" y="-2.225305236" z="0" h="0.91" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.89">
-                                                            <Position>
-                                                                <WorldPosition x="-1.448148219" y="-2.163842268" z="0" h="0.92" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.9">
-                                                            <Position>
-                                                                <WorldPosition x="-1.398148219" y="-2.093842268" z="0" h="0.92" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.91">
-                                                            <Position>
-                                                                <WorldPosition x="-1.346967575" y="-2.032267917" z="0" h="0.93" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.92">
-                                                            <Position>
-                                                                <WorldPosition x="-1.296967575" y="-1.962267917" z="0" h="0.93" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.93">
-                                                            <Position>
-                                                                <WorldPosition x="-1.245703235" y="-1.900581341" z="0" h="0.94" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.94">
-                                                            <Position>
-                                                                <WorldPosition x="-1.195703235" y="-1.840581341" z="0" h="0.94" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.95">
-                                                            <Position>
-                                                                <WorldPosition x="-1.155703235" y="-1.770581341" z="0" h="0.94" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.96">
-                                                            <Position>
-                                                                <WorldPosition x="-1.094356325" y="-1.708781707" z="0" h="0.95" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.97">
-                                                            <Position>
-                                                                <WorldPosition x="-1.054356325" y="-1.638781707" z="0" h="0.95" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.98">
-                                                            <Position>
-                                                                <WorldPosition x="-1.002927981" y="-1.576868196" z="0" h="0.96" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.99">
-                                                            <Position>
-                                                                <WorldPosition x="-0.9529279805" y="-1.506868196" z="0" h="0.96" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="5">
-                                                            <Position>
-                                                                <WorldPosition x="-0.9014193436" y="-1.444839999" z="0" h="0.97" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="5.01">
-                                                            <Position>
-                                                                <WorldPosition x="-0.8614193436" y="-1.374839999" z="0" h="0.97" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="5.02">
-                                                            <Position>
-                                                                <WorldPosition x="-0.8114193436" y="-1.304839999" z="0" h="0.97" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="5.03">
-                                                            <Position>
-                                                                <WorldPosition x="-0.7698315655" y="-1.242696319" z="0" h="0.98" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                    </Polyline>
-                                                </Shape>
-                                            </Trajectory>
+                                            <TrajectoryRef>
+                                                <Trajectory name="LaneChange" closed="false">
+                                                    <Shape>
+                                                        <Polyline>
+                                                            <Vertex time="0">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.72996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.01">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.64996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.02">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.56996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.03">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.47996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.04">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.39996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.05">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.31996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.06">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.22996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.07">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.14996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.08">
+                                                                <Position>
+                                                                    <WorldPosition x="-39.06996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.09">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.97996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.1">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.89996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.11">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.81996858" y="-9.11062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.12">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.72996858" y="-9.12062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.13">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.64996858" y="-9.12062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.14">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.56996858" y="-9.12062007" z="0" h="-0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.15">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.47996763" y="-9.120480073" z="0" h="-0.0068" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.16">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.39996763" y="-9.120480073" z="0" h="-0.0068" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.17">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.31996763" y="-9.120480073" z="0" h="-0.0068" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.18">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.22996667" y="-9.120340077" z="0" h="-0.0069" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.19">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.14996667" y="-9.120340077" z="0" h="-0.0069" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.2">
+                                                                <Position>
+                                                                    <WorldPosition x="-38.06996667" y="-9.120340077" z="0" h="-0.0069" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.21">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.98996667" y="-9.120340077" z="0" h="-0.0069" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.22">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.8999657" y="-9.12020008" z="0" h="-0.007" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.23">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.8199657" y="-9.12020008" z="0" h="-0.007" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.24">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.7399657" y="-9.12020008" z="0" h="-0.007" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.25">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.6499657" y="-9.12020008" z="0" h="-0.007" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.26">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.56996471" y="-9.120060084" z="0" h="-0.0071" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.27">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.48996471" y="-9.120060084" z="0" h="-0.0071" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.28">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.39996471" y="-9.120060084" z="0" h="-0.0071" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.29">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.31996471" y="-9.130060084" z="0" h="-0.0071" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.3">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.23996371" y="-9.129920087" z="0" h="-0.0072" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.31">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.14996371" y="-9.129920087" z="0" h="-0.0072" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.32">
+                                                                <Position>
+                                                                    <WorldPosition x="-37.06996371" y="-9.129920087" z="0" h="-0.0072" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.33">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.98996371" y="-9.129920087" z="0" h="-0.0072" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.34">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.8999627" y="-9.129780091" z="0" h="-0.0073" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.35">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.8199627" y="-9.129780091" z="0" h="-0.0073" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.36">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.7399627" y="-9.129780091" z="0" h="-0.0073" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.37">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.6599627" y="-9.129780091" z="0" h="-0.0073" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.38">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.56996167" y="-9.129640095" z="0" h="-0.0074" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.39">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.48996167" y="-9.129640095" z="0" h="-0.0074" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.4">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.40996167" y="-9.129640095" z="0" h="-0.0074" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.41">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.31996167" y="-9.129640095" z="0" h="-0.0074" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.42">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.23996063" y="-9.129500098" z="0" h="-0.0075" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.43">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.15996063" y="-9.129500098" z="0" h="-0.0075" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.44">
+                                                                <Position>
+                                                                    <WorldPosition x="-36.06996063" y="-9.129500098" z="0" h="-0.0075" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.45">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.98996063" y="-9.139500098" z="0" h="-0.0075" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.46">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.90995957" y="-9.139360102" z="0" h="-0.0076" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.47">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.81995957" y="-9.139360102" z="0" h="-0.0076" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.48">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.73995957" y="-9.139360102" z="0" h="-0.0076" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.49">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.6599585" y="-9.139220107" z="0" h="-0.0077" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.5">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.5799585" y="-9.139220107" z="0" h="-0.0077" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.51">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.4899585" y="-9.139220107" z="0" h="-0.0077" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.52">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.40995741" y="-9.139080111" z="0" h="-0.0078" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.53">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.32995741" y="-9.139080111" z="0" h="-0.0078" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.54">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.23995631" y="-9.138940115" z="0" h="-0.0079" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.55">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.15995631" y="-9.138940115" z="0" h="-0.0079" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.56">
+                                                                <Position>
+                                                                    <WorldPosition x="-35.07995631" y="-9.138940115" z="0" h="-0.0079" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.57">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.9899552" y="-9.138800119" z="0" h="-0.008" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.58">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.9099552" y="-9.138800119" z="0" h="-0.008" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.59">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.82995407" y="-9.148660124" z="0" h="-0.0081" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.6">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.74995407" y="-9.148660124" z="0" h="-0.0081" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.61">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.65995293" y="-9.148520129" z="0" h="-0.0082" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.62">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.57995293" y="-9.148520129" z="0" h="-0.0082" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.63">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.49995293" y="-9.148520129" z="0" h="-0.0082" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.64">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.40995178" y="-9.148380133" z="0" h="-0.0083" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.65">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.32995178" y="-9.148380133" z="0" h="-0.0083" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.66">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.24995061" y="-9.148240138" z="0" h="-0.0084" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.67">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.16995061" y="-9.148240138" z="0" h="-0.0084" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.68">
+                                                                <Position>
+                                                                    <WorldPosition x="-34.07994943" y="-9.148100143" z="0" h="-0.0085" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.69">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.99994943" y="-9.148100143" z="0" h="-0.0085" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.7">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.91994823" y="-9.147960148" z="0" h="-0.0086" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.71">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.82994823" y="-9.147960148" z="0" h="-0.0086" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.72">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.74994702" y="-9.147820154" z="0" h="-0.0087" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.73">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.66994579" y="-9.157680159" z="0" h="-0.0088" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.74">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.58994579" y="-9.157680159" z="0" h="-0.0088" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.75">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.49994455" y="-9.157540164" z="0" h="-0.0089" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.76">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.41994455" y="-9.157540164" z="0" h="-0.0089" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.77">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.3399433" y="-9.15740017" z="0" h="-0.009" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.78">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.2499433" y="-9.15740017" z="0" h="-0.009" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.79">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.16994203" y="-9.157260176" z="0" h="-0.0091" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.8">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.08994075" y="-9.157120182" z="0" h="-0.0092" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.81">
+                                                                <Position>
+                                                                    <WorldPosition x="-33.00994075" y="-9.157120182" z="0" h="-0.0092" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.82">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.91993946" y="-9.156980188" z="0" h="-0.0093" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.83">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.83993946" y="-9.156980188" z="0" h="-0.0093" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.84">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.75993815" y="-9.156840194" z="0" h="-0.0094" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.85">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.66993683" y="-9.1667002" z="0" h="-0.0095" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.86">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.58993683" y="-9.1667002" z="0" h="-0.0095" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.87">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.50993549" y="-9.166560206" z="0" h="-0.0096" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.88">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.42993549" y="-9.166560206" z="0" h="-0.0096" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.89">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.33993414" y="-9.166420213" z="0" h="-0.0097" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.9">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.25993277" y="-9.16628022" z="0" h="-0.0098" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.91">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.17993277" y="-9.16628022" z="0" h="-0.0098" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.92">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.08993139" y="-9.166140226" z="0" h="-0.0099" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.93">
+                                                                <Position>
+                                                                    <WorldPosition x="-32.00993139" y="-9.166140226" z="0" h="-0.0099" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.94">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.92993" y="-9.166000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.95">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.84993" y="-9.166000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.96">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.75993" y="-9.166000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.97">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.67993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.98">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.59993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.99">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.51993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.42993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.01">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.34993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.02">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.26993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.03">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.17993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.04">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.09993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.05">
+                                                                <Position>
+                                                                    <WorldPosition x="-31.01993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.06">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.93993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.07">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.84993" y="-9.176000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.08">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.76993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.09">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.68993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.1">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.60993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.11">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.51993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.12">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.43993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.13">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.35993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.14">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.27993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.15">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.18993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.16">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.10993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.17">
+                                                                <Position>
+                                                                    <WorldPosition x="-30.02993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.18">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.93993" y="-9.186000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.19">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.85993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.2">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.77993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.21">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.69993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.22">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.60993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.23">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.52993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.24">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.44993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.25">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.36993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.26">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.27993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.27">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.19993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.28">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.11993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.29">
+                                                                <Position>
+                                                                    <WorldPosition x="-29.03993" y="-9.196000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.3">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.94993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.31">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.86993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.32">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.78993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.33">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.70993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.34">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.61993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.35">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.53993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.36">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.45993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.37">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.36993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.38">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.28993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.39">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.20993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.4">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.12993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.41">
+                                                                <Position>
+                                                                    <WorldPosition x="-28.03993" y="-9.206000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.42">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.95993" y="-9.216000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.43">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.87993" y="-9.216000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.44">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.79993" y="-9.216000233" z="0" h="-0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.45">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.70993139" y="-9.216140226" z="0" h="-0.0099" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.46">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.62993277" y="-9.21628022" z="0" h="-0.0098" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.47">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.54993414" y="-9.216420213" z="0" h="-0.0097" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.48">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.46993549" y="-9.216560206" z="0" h="-0.0096" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.49">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.37993683" y="-9.2167002" z="0" h="-0.0095" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.5">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.29993815" y="-9.216840194" z="0" h="-0.0094" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.51">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.21993946" y="-9.216980188" z="0" h="-0.0093" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.52">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.13994203" y="-9.217260176" z="0" h="-0.0091" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.53">
+                                                                <Position>
+                                                                    <WorldPosition x="-27.0499433" y="-9.21740017" z="0" h="-0.009" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.54">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.96994455" y="-9.217540164" z="0" h="-0.0089" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.55">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.88994702" y="-9.217820154" z="0" h="-0.0087" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.56">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.80994823" y="-9.227960148" z="0" h="-0.0086" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.57">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.71995061" y="-9.228240138" z="0" h="-0.0084" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.58">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.63995178" y="-9.228380133" z="0" h="-0.0083" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.59">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.55995407" y="-9.228660124" z="0" h="-0.0081" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.6">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.4799552" y="-9.228800119" z="0" h="-0.008" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.61">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.38995741" y="-9.229080111" z="0" h="-0.0078" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.62">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.30995957" y="-9.229360102" z="0" h="-0.0076" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.63">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.22996167" y="-9.229640095" z="0" h="-0.0074" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.64">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.14996371" y="-9.229920087" z="0" h="-0.0072" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.65">
+                                                                <Position>
+                                                                    <WorldPosition x="-26.0599657" y="-9.23020008" z="0" h="-0.007" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.66">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.97996763" y="-9.230480073" z="0" h="-0.0068" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.67">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.89996951" y="-9.230760067" z="0" h="-0.0066" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.68">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.81997133" y="-9.231040061" z="0" h="-0.0064" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.69">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.72997309" y="-9.231320056" z="0" h="-0.0062" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.7">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.64997563" y="-9.231740048" z="0" h="-0.0059" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.71">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.56997726" y="-9.232020043" z="0" h="-0.0057" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.72">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.48997959" y="-9.232440037" z="0" h="-0.0054" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.73">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.39998107" y="-9.232720033" z="0" h="-0.0052" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.74">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.31998319" y="-9.233140027" z="0" h="-0.0049" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.75">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.23998519" y="-9.233560023" z="0" h="-0.0046" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.76">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.15998706" y="-9.233980019" z="0" h="-0.0043" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.77">
+                                                                <Position>
+                                                                    <WorldPosition x="-25.06998823" y="-9.234260016" z="0" h="-0.0041" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.78">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.98998989" y="-9.234680013" z="0" h="-0.0038" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.79">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.90999143" y="-9.23510001" z="0" h="-0.0035" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.8">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.82999327" y="-9.235660007" z="0" h="-0.0031" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.81">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.73999451" y="-9.236080005" z="0" h="-0.0028" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.82">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.65999563" y="-9.236500004" z="0" h="-0.0025" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.83">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.57999691" y="-9.237060002" z="0" h="-0.0021" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.84">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.49999773" y="-9.237480001" z="0" h="-0.0018" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.85">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.40999863" y="-9.238040001" z="0" h="-0.0014" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.86">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.32999915" y="-9.23846" z="0" h="-0.0011" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.87">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.24999966" y="-9.23902" z="0" h="-0.0007" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.88">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.16999994" y="-9.23958" z="0" h="-0.0003" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.89">
+                                                                <Position>
+                                                                    <WorldPosition x="-24.07999999" y="-9.24014" z="0" h="0.0001" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.9">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.99999983" y="-9.2407" z="0" h="0.0005" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.91">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.91999943" y="-9.24126" z="0" h="0.0009" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.92">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.83999882" y="-9.241819999" z="0" h="0.0013" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.93">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.74999773" y="-9.242519999" z="0" h="0.0018" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.94">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.66999661" y="-9.243079998" z="0" h="0.0022" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.95">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.5899949" y="-9.243779995" z="0" h="0.0027" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.96">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.50999283" y="-9.244479992" z="0" h="0.0032" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.97">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.41999093" y="-9.245039989" z="0" h="0.0036" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.98">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.33998823" y="-9.235739984" z="0" h="0.0041" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.99">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.25998519" y="-9.236439977" z="0" h="0.0046" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.17998179" y="-9.237139969" z="0" h="0.0051" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.01">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.09997726" y="-9.237979957" z="0" h="0.0057" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.02">
+                                                                <Position>
+                                                                    <WorldPosition x="-23.00997309" y="-9.238679944" z="0" h="0.0062" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.03">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.92996858" y="-9.23937993" z="0" h="0.0067" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.04">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.8499627" y="-9.240219909" z="0" h="0.0073" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.05">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.76995631" y="-9.241059885" z="0" h="0.0079" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.06">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.67994943" y="-9.241899857" z="0" h="0.0085" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.07">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.59994203" y="-9.242739824" z="0" h="0.0091" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.08">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.51993414" y="-9.233579787" z="0" h="0.0097" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.09">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.43993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.1">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.34993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.11">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.26993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.12">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.18993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.13">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.10993" y="-9.233999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.14">
+                                                                <Position>
+                                                                    <WorldPosition x="-22.01993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.15">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.93993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.16">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.85993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.17">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.77993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.18">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.68993" y="-9.223999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.19">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.60993" y="-9.213999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.2">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.52993" y="-9.213999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.21">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.44993" y="-9.213999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.22">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.35993" y="-9.213999767" z="0" h="0.01" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.23">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.27972001" y="-9.227998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.24">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.19972001" y="-9.217998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.25">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.11972001" y="-9.217998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.26">
+                                                                <Position>
+                                                                    <WorldPosition x="-21.03972001" y="-9.217998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.27">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.94972001" y="-9.207998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.28">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.86972001" y="-9.207998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.29">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.78972001" y="-9.207998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.3">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.70972001" y="-9.207998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.31">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.61972001" y="-9.197998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.32">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.53972001" y="-9.197998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.33">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.45972001" y="-9.197998133" z="0" h="0.02" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.34">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.37937005" y="-9.2019937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.35">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.28937005" y="-9.2019937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.36">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.20937005" y="-9.2019937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.37">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.12937005" y="-9.1919937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.38">
+                                                                <Position>
+                                                                    <WorldPosition x="-20.04937005" y="-9.1919937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.39">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.96937005" y="-9.1819937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.4">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.87937005" y="-9.1819937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.41">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.79937005" y="-9.1819937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.42">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.71937005" y="-9.1719937" z="0" h="0.03" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.43">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.63888015" y="-9.185985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.44">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.54888015" y="-9.175985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.45">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.46888015" y="-9.175985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.46">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.38888015" y="-9.165985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.47">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.30888015" y="-9.165985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.48">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.22888015" y="-9.155985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.49">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.13888015" y="-9.155985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.5">
+                                                                <Position>
+                                                                    <WorldPosition x="-19.05888015" y="-9.145985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.51">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.97888015" y="-9.145985068" z="0" h="0.04" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.52">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.89825036" y="-9.149970837" z="0" h="0.05" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.53">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.80825036" y="-9.149970837" z="0" h="0.05" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.54">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.72825036" y="-9.139970837" z="0" h="0.05" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.55">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.64825036" y="-9.139970837" z="0" h="0.05" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.56">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.56825036" y="-9.129970837" z="0" h="0.05" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.57">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.48825036" y="-9.119970837" z="0" h="0.05" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.58">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.39825036" y="-9.119970837" z="0" h="0.05" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.59">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.31748076" y="-9.123949609" z="0" h="0.06" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.6">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.23748076" y="-9.123949609" z="0" h="0.06" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.61">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.15748076" y="-9.113949609" z="0" h="0.06" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.62">
+                                                                <Position>
+                                                                    <WorldPosition x="-18.07748076" y="-9.103949609" z="0" h="0.06" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.63">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.98748076" y="-9.103949609" z="0" h="0.06" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.64">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.90748076" y="-9.093949609" z="0" h="0.06" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.65">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.82748076" y="-9.083949609" z="0" h="0.06" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.66">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.7465714" y="-9.087919986" z="0" h="0.07" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.67">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.6665714" y="-9.087919986" z="0" h="0.07" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.68">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.5765714" y="-9.077919986" z="0" h="0.07" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.69">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.4965714" y="-9.067919986" z="0" h="0.07" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.7">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.4165714" y="-9.057919986" z="0" h="0.07" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.71">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.3365714" y="-9.047919986" z="0" h="0.07" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.72">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.25552239" y="-9.061880572" z="0" h="0.08" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.73">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.16552239" y="-9.051880572" z="0" h="0.08" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.74">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.08552239" y="-9.041880572" z="0" h="0.08" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.75">
+                                                                <Position>
+                                                                    <WorldPosition x="-17.00552239" y="-9.031880572" z="0" h="0.08" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.76">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.92552239" y="-9.021880572" z="0" h="0.08" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.77">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.84552239" y="-9.011880572" z="0" h="0.08" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.78">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.75433383" y="-9.015829969" z="0" h="0.09" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.79">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.67433383" y="-9.005829969" z="0" h="0.09" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.8">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.59433383" y="-9.005829969" z="0" h="0.09" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.81">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.51433383" y="-8.995829969" z="0" h="0.09" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.82">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.43433383" y="-8.985829969" z="0" h="0.09" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.83">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.35300583" y="-8.989766783" z="0" h="0.1" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.84">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.26300583" y="-8.979766783" z="0" h="0.1" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.85">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.18300583" y="-8.969766783" z="0" h="0.1" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.86">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.10300583" y="-8.949766783" z="0" h="0.1" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.87">
+                                                                <Position>
+                                                                    <WorldPosition x="-16.02300583" y="-8.939766783" z="0" h="0.1" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.88">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.94153854" y="-8.943689621" z="0" h="0.11" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.89">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.86153854" y="-8.933689621" z="0" h="0.11" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.9">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.77153854" y="-8.923689621" z="0" h="0.11" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.91">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.69153854" y="-8.913689621" z="0" h="0.11" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.92">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.61153854" y="-8.903689621" z="0" h="0.11" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.93">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.52993209" y="-8.90759709" z="0" h="0.12" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.94">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.44993209" y="-8.88759709" z="0" h="0.12" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.95">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.36993209" y="-8.87759709" z="0" h="0.12" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.96">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.28993209" y="-8.86759709" z="0" h="0.12" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.97">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.19993209" y="-8.85759709" z="0" h="0.12" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.98">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.11818665" y="-8.8514878" z="0" h="0.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.99">
+                                                                <Position>
+                                                                    <WorldPosition x="-15.03818665" y="-8.8414878" z="0" h="0.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.95818665" y="-8.8314878" z="0" h="0.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.01">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.87818665" y="-8.8114878" z="0" h="0.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.02">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.79630239" y="-8.815360361" z="0" h="0.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.03">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.71630239" y="-8.805360361" z="0" h="0.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.04">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.63630239" y="-8.785360361" z="0" h="0.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.05">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.54630239" y="-8.775360361" z="0" h="0.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.06">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.46630239" y="-8.755360361" z="0" h="0.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.07">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.38427951" y="-8.759213385" z="0" h="0.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.08">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.30427951" y="-8.739213385" z="0" h="0.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.09">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.22427951" y="-8.729213385" z="0" h="0.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.1">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.14427951" y="-8.709213385" z="0" h="0.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.11">
+                                                                <Position>
+                                                                    <WorldPosition x="-14.0621182" y="-8.713045489" z="0" h="0.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.12">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.9821182" y="-8.693045489" z="0" h="0.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.13">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.9021182" y="-8.683045489" z="0" h="0.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.14">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.8221182" y="-8.663045489" z="0" h="0.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.15">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.73981867" y="-8.656855289" z="0" h="0.17" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.16">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.65981867" y="-8.646855289" z="0" h="0.17" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.17">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.57981867" y="-8.626855289" z="0" h="0.17" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.18">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.49981867" y="-8.606855289" z="0" h="0.17" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.19">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.40738117" y="-8.610641403" z="0" h="0.18" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.2">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.32738117" y="-8.590641403" z="0" h="0.18" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.21">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.24738117" y="-8.570641403" z="0" h="0.18" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.22">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.16738117" y="-8.550641403" z="0" h="0.18" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.23">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.08480593" y="-8.544402453" z="0" h="0.19" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.24">
+                                                                <Position>
+                                                                    <WorldPosition x="-13.00480593" y="-8.534402453" z="0" h="0.19" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.25">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.92480593" y="-8.514402453" z="0" h="0.19" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.26">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.84209321" y="-8.508137063" z="0" h="0.2" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.27">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.76209321" y="-8.488137063" z="0" h="0.2" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.28">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.68209321" y="-8.468137063" z="0" h="0.2" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.29">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.60209321" y="-8.448137063" z="0" h="0.2" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.3">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.51924328" y="-8.44184386" z="0" h="0.21" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.31">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.43924328" y="-8.42184386" z="0" h="0.21" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.32">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.35924328" y="-8.40184386" z="0" h="0.21" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.33">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.28625643" y="-8.395521472" z="0" h="0.22" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.34">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.20625643" y="-8.375521472" z="0" h="0.22" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.35">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.12625643" y="-8.355521472" z="0" h="0.22" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.36">
+                                                                <Position>
+                                                                    <WorldPosition x="-12.04313295" y="-8.349168533" z="0" h="0.23" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.37">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.96313295" y="-8.319168533" z="0" h="0.23" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.38">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.88313295" y="-8.299168533" z="0" h="0.23" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.39">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.80313295" y="-8.279168533" z="0" h="0.23" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.4">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.71987316" y="-8.272783677" z="0" h="0.24" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.41">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.63987316" y="-8.242783677" z="0" h="0.24" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.42">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.55987316" y="-8.222783677" z="0" h="0.24" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.43">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.47647739" y="-8.216365543" z="0" h="0.25" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.44">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.40647739" y="-8.186365543" z="0" h="0.25" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.45">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.32647739" y="-8.166365543" z="0" h="0.25" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.46">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.24294597" y="-8.159912773" z="0" h="0.26" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.47">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.16294597" y="-8.129912773" z="0" h="0.26" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.48">
+                                                                <Position>
+                                                                    <WorldPosition x="-11.08294597" y="-8.109912773" z="0" h="0.26" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.49">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.99927925" y="-8.093424011" z="0" h="0.27" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.5">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.91927925" y="-8.073424011" z="0" h="0.27" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.51">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.84927925" y="-8.043424011" z="0" h="0.27" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.52">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.76547761" y="-8.026897908" z="0" h="0.28" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.53">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.68547761" y="-8.006897908" z="0" h="0.28" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.54">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.60547761" y="-7.976897908" z="0" h="0.28" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.55">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.53154143" y="-7.960333115" z="0" h="0.29" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.56">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.45154143" y="-7.940333115" z="0" h="0.29" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.57">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.37154143" y="-7.910333115" z="0" h="0.29" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.58">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.28747108" y="-7.893728289" z="0" h="0.3" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.59">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.21747108" y="-7.863728289" z="0" h="0.3" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.6">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.133267" y="-7.857082091" z="0" h="0.31" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.61">
+                                                                <Position>
+                                                                    <WorldPosition x="-10.053267" y="-7.827082091" z="0" h="0.31" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.62">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.983266998" y="-7.797082091" z="0" h="0.31" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.63">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.898929585" y="-7.780393185" z="0" h="0.32" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.64">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.818929585" y="-7.750393185" z="0" h="0.32" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.65">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.748929585" y="-7.720393185" z="0" h="0.32" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.66">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.664459281" y="-7.70366024" z="0" h="0.33" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.67">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.584459281" y="-7.67366024" z="0" h="0.33" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.68">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.509856532" y="-7.656881929" z="0" h="0.34" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.69">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.429856532" y="-7.626881929" z="0" h="0.34" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.7">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.359856532" y="-7.586881929" z="0" h="0.34" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.71">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.275121798" y="-7.57005693" z="0" h="0.35" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.72">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.195121798" y="-7.54005693" z="0" h="0.35" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.73">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.120255553" y="-7.523183927" z="0" h="0.36" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.74">
+                                                                <Position>
+                                                                    <WorldPosition x="-9.040255553" y="-7.493183927" z="0" h="0.36" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.75">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.970255553" y="-7.453183927" z="0" h="0.36" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.76">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.885258284" y="-7.436261605" z="0" h="0.37" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.77">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.815258284" y="-7.406261605" z="0" h="0.37" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.78">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.73013049" y="-7.379288657" z="0" h="0.38" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.79">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.66013049" y="-7.349288657" z="0" h="0.38" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.8">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.59013049" y="-7.309288657" z="0" h="0.38" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.81">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.504872684" y="-7.292263781" z="0" h="0.39" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.82">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.434872684" y="-7.252263781" z="0" h="0.39" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.83">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.349485392" y="-7.235185679" z="0" h="0.4" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.84">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.279485392" y="-7.195185679" z="0" h="0.4" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.85">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.203969152" y="-7.168053059" z="0" h="0.41" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.86">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.123969152" y="-7.138053059" z="0" h="0.41" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.87">
+                                                                <Position>
+                                                                    <WorldPosition x="-8.053969152" y="-7.098053059" z="0" h="0.41" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.88">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.978324516" y="-7.070864634" z="0" h="0.42" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.89">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.898324516" y="-7.030864634" z="0" h="0.42" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.9">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.82255205" y="-7.013619123" z="0" h="0.43" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.91">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.75255205" y="-6.973619123" z="0" h="0.43" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.92">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.676652329" y="-6.946315251" z="0" h="0.44" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.93">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.596652329" y="-6.906315251" z="0" h="0.44" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.94">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.520625943" y="-6.878951748" z="0" h="0.45" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.95">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.450625943" y="-6.838951748" z="0" h="0.45" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.96">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.374473497" y="-6.81152735" z="0" h="0.46" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.97">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.304473497" y="-6.77152735" z="0" h="0.46" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.98">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.234473497" y="-6.73152735" z="0" h="0.46" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.99">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.158195603" y="-6.7040408" z="0" h="0.47" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.088195603" y="-6.6640408" z="0" h="0.47" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.01">
+                                                                <Position>
+                                                                    <WorldPosition x="-7.011792892" y="-6.636490846" z="0" h="0.48" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.02">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.941792892" y="-6.586490846" z="0" h="0.48" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.03">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.865266002" y="-6.558876243" z="0" h="0.49" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.04">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.795266002" y="-6.518876243" z="0" h="0.49" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.05">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.718615587" y="-6.481195754" z="0" h="0.5" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.06">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.648615587" y="-6.441195754" z="0" h="0.5" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.07">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.571842311" y="-6.413448146" z="0" h="0.51" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.08">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.501842311" y="-6.363448146" z="0" h="0.51" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.09">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.424946852" y="-6.335632193" z="0" h="0.52" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.1">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.354946852" y="-6.285632193" z="0" h="0.52" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.11">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.277929899" y="-6.257746678" z="0" h="0.53" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.12">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.217929899" y="-6.207746678" z="0" h="0.53" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.13">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.140792154" y="-6.179790388" z="0" h="0.54" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.14">
+                                                                <Position>
+                                                                    <WorldPosition x="-6.070792154" y="-6.129790388" z="0" h="0.54" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.15">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.993534331" y="-6.091762121" z="0" h="0.55" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.16">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.933534331" y="-6.051762121" z="0" h="0.55" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.17">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.856157155" y="-6.013660677" z="0" h="0.56" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.18">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.786157155" y="-5.963660677" z="0" h="0.56" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.19">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.718661365" y="-5.925484868" z="0" h="0.57" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.2">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.648661365" y="-5.875484868" z="0" h="0.57" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.21">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.57104771" y="-5.847233512" z="0" h="0.58" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.22">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.51104771" y="-5.797233512" z="0" h="0.58" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.23">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.433316951" y="-5.758905432" z="0" h="0.59" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.24">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.373316951" y="-5.708905432" z="0" h="0.59" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.25">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.295469861" y="-5.670499463" z="0" h="0.6" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.26">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.235469861" y="-5.620499463" z="0" h="0.6" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.27">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.167507225" y="-5.582014444" z="0" h="0.61" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.28">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.097507225" y="-5.532014444" z="0" h="0.61" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.29">
+                                                                <Position>
+                                                                    <WorldPosition x="-5.029429839" y="-5.483449225" z="0" h="0.62" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.3">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.959429839" y="-5.433449225" z="0" h="0.62" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.31">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.891238512" y="-5.394802661" z="0" h="0.63" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.32">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.831238512" y="-5.344802661" z="0" h="0.63" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.33">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.762934061" y="-5.306073618" z="0" h="0.64" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.34">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.692934061" y="-5.246073618" z="0" h="0.64" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.35">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.624517318" y="-5.207260968" z="0" h="0.65" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.36">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.564517318" y="-5.157260968" z="0" h="0.65" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.37">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.495989124" y="-5.108363593" z="0" h="0.66" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.38">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.435989124" y="-5.058363593" z="0" h="0.66" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.39">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.367350332" y="-5.009380382" z="0" h="0.67" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.4">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.307350332" y="-4.959380382" z="0" h="0.67" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.41">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.238601806" y="-4.910310234" z="0" h="0.68" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.42">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.178601806" y="-4.860310234" z="0" h="0.68" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.43">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.109744421" y="-4.811152055" z="0" h="0.69" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.44">
+                                                                <Position>
+                                                                    <WorldPosition x="-4.040779062" y="-4.761904762" z="0" h="0.7" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.45">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.980779062" y="-4.711904762" z="0" h="0.7" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.46">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.911706626" y="-4.662567279" z="0" h="0.71" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.47">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.851706626" y="-4.602567279" z="0" h="0.71" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.48">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.782528021" y="-4.563138541" z="0" h="0.72" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.49">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.722528021" y="-4.503138541" z="0" h="0.72" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.5">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.663244163" y="-4.453617489" z="0" h="0.73" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.51">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.603244163" y="-4.393617489" z="0" h="0.73" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.52">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.533855982" y="-4.344003076" z="0" h="0.74" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.53">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.483855982" y="-4.284003076" z="0" h="0.74" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.54">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.414364416" y="-4.244294264" z="0" h="0.75" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.55">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.354364416" y="-4.184294264" z="0" h="0.75" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.56">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.294770415" y="-4.134490023" z="0" h="0.76" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.57">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.234770415" y="-4.074490023" z="0" h="0.76" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.58">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.175074937" y="-4.024589334" z="0" h="0.77" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.59">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.115074937" y="-3.964589334" z="0" h="0.77" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.6">
+                                                                <Position>
+                                                                    <WorldPosition x="-3.055278953" y="-3.904591187" z="0" h="0.78" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.61">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.995278953" y="-3.844591187" z="0" h="0.78" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.62">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.935383442" y="-3.794494581" z="0" h="0.79" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.63">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.875383442" y="-3.734494581" z="0" h="0.79" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.64">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.815389393" y="-3.684298527" z="0" h="0.8" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.65">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.765389393" y="-3.624298527" z="0" h="0.8" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.66">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.695297806" y="-3.564002044" z="0" h="0.81" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.67">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.645297806" y="-3.504002044" z="0" h="0.81" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.68">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.58510969" y="-3.453604162" z="0" h="0.82" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.69">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.53510969" y="-3.383604162" z="0" h="0.82" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.7">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.474826064" y="-3.33310392" z="0" h="0.83" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.71">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.414826064" y="-3.27310392" z="0" h="0.83" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.72">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.354447956" y="-3.212500368" z="0" h="0.84" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.73">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.304447956" y="-3.152500368" z="0" h="0.84" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.74">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.243976404" y="-3.091792567" z="0" h="0.85" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.75">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.193976404" y="-3.031792567" z="0" h="0.85" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.76">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.133412455" y="-2.970979588" z="0" h="0.86" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.77">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.083412455" y="-2.910979588" z="0" h="0.86" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.78">
+                                                                <Position>
+                                                                    <WorldPosition x="-2.022757166" y="-2.850060512" z="0" h="0.87" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.79">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.972757166" y="-2.790060512" z="0" h="0.87" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.8">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.922011602" y="-2.72903443" z="0" h="0.88" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.81">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.872011602" y="-2.66903443" z="0" h="0.88" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.82">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.811176837" y="-2.607900447" z="0" h="0.89" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.83">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.761176837" y="-2.537900447" z="0" h="0.89" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.84">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.700253956" y="-2.486657673" z="0" h="0.9" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.85">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.660253956" y="-2.416657673" z="0" h="0.9" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.86">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.610253956" y="-2.346657673" z="0" h="0.9" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.87">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.549244049" y="-2.285305236" z="0" h="0.91" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.88">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.509244049" y="-2.225305236" z="0" h="0.91" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.89">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.448148219" y="-2.163842268" z="0" h="0.92" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.9">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.398148219" y="-2.093842268" z="0" h="0.92" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.91">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.346967575" y="-2.032267917" z="0" h="0.93" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.92">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.296967575" y="-1.962267917" z="0" h="0.93" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.93">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.245703235" y="-1.900581341" z="0" h="0.94" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.94">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.195703235" y="-1.840581341" z="0" h="0.94" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.95">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.155703235" y="-1.770581341" z="0" h="0.94" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.96">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.094356325" y="-1.708781707" z="0" h="0.95" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.97">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.054356325" y="-1.638781707" z="0" h="0.95" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.98">
+                                                                <Position>
+                                                                    <WorldPosition x="-1.002927981" y="-1.576868196" z="0" h="0.96" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.99">
+                                                                <Position>
+                                                                    <WorldPosition x="-0.9529279805" y="-1.506868196" z="0" h="0.96" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="5">
+                                                                <Position>
+                                                                    <WorldPosition x="-0.9014193436" y="-1.444839999" z="0" h="0.97" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="5.01">
+                                                                <Position>
+                                                                    <WorldPosition x="-0.8614193436" y="-1.374839999" z="0" h="0.97" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="5.02">
+                                                                <Position>
+                                                                    <WorldPosition x="-0.8114193436" y="-1.304839999" z="0" h="0.97" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="5.03">
+                                                                <Position>
+                                                                    <WorldPosition x="-0.7698315655" y="-1.242696319" z="0" h="0.98" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                        </Polyline>
+                                                    </Shape>
+                                                </Trajectory>
+                                            </TrajectoryRef>
                                             <TimeReference>
                                                 <None/>
                                             </TimeReference>
@@ -2633,7 +2649,7 @@
                             </Action>
                             <StartTrigger>
                                 <ConditionGroup>
-                                    <Condition name="Conditional">
+                                    <Condition name="Conditional" delay="0" conditionEdge="rising">
                                         <ByValueCondition>
                                             <SimulationTimeCondition value="-1" rule="greaterThan"/>
                                         </ByValueCondition>
@@ -2655,2532 +2671,2534 @@
                                 <PrivateAction>
                                     <RoutingAction>
                                         <FollowTrajectoryAction>
-                                            <Trajectory name="LaneChange" closed="false">
-                                                <Shape>
-                                                    <Polyline>
-                                                        <Vertex time="0">
-                                                            <Position>
-                                                                <WorldPosition x="101.6999207" y="1.826320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.01">
-                                                            <Position>
-                                                                <WorldPosition x="101.5199207" y="1.826320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.02">
-                                                            <Position>
-                                                                <WorldPosition x="101.3299207" y="1.826320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.03">
-                                                            <Position>
-                                                                <WorldPosition x="101.1299207" y="1.826320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.04">
-                                                            <Position>
-                                                                <WorldPosition x="100.9399207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.05">
-                                                            <Position>
-                                                                <WorldPosition x="100.7399207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.06">
-                                                            <Position>
-                                                                <WorldPosition x="100.5499207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.07">
-                                                            <Position>
-                                                                <WorldPosition x="100.3499207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.08">
-                                                            <Position>
-                                                                <WorldPosition x="100.1599207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.09">
-                                                            <Position>
-                                                                <WorldPosition x="99.96992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.1">
-                                                            <Position>
-                                                                <WorldPosition x="99.76992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.11">
-                                                            <Position>
-                                                                <WorldPosition x="99.57992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.12">
-                                                            <Position>
-                                                                <WorldPosition x="99.37992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.13">
-                                                            <Position>
-                                                                <WorldPosition x="99.18992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.14">
-                                                            <Position>
-                                                                <WorldPosition x="98.9899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.15">
-                                                            <Position>
-                                                                <WorldPosition x="98.7999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.16">
-                                                            <Position>
-                                                                <WorldPosition x="98.6099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.17">
-                                                            <Position>
-                                                                <WorldPosition x="98.4099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.18">
-                                                            <Position>
-                                                                <WorldPosition x="98.2199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.19">
-                                                            <Position>
-                                                                <WorldPosition x="98.0199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.2">
-                                                            <Position>
-                                                                <WorldPosition x="97.8299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.21">
-                                                            <Position>
-                                                                <WorldPosition x="97.6399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.22">
-                                                            <Position>
-                                                                <WorldPosition x="97.4399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.23">
-                                                            <Position>
-                                                                <WorldPosition x="97.2499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.24">
-                                                            <Position>
-                                                                <WorldPosition x="97.0499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.25">
-                                                            <Position>
-                                                                <WorldPosition x="96.8599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.26">
-                                                            <Position>
-                                                                <WorldPosition x="96.6599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.27">
-                                                            <Position>
-                                                                <WorldPosition x="96.4699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.28">
-                                                            <Position>
-                                                                <WorldPosition x="96.2799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.29">
-                                                            <Position>
-                                                                <WorldPosition x="96.0799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.3">
-                                                            <Position>
-                                                                <WorldPosition x="95.8899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.31">
-                                                            <Position>
-                                                                <WorldPosition x="95.6899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.32">
-                                                            <Position>
-                                                                <WorldPosition x="95.4999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.33">
-                                                            <Position>
-                                                                <WorldPosition x="95.3099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.34">
-                                                            <Position>
-                                                                <WorldPosition x="95.1099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.35">
-                                                            <Position>
-                                                                <WorldPosition x="94.9199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.36">
-                                                            <Position>
-                                                                <WorldPosition x="94.7199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.37">
-                                                            <Position>
-                                                                <WorldPosition x="94.5299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.38">
-                                                            <Position>
-                                                                <WorldPosition x="94.3399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.39">
-                                                            <Position>
-                                                                <WorldPosition x="94.1399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.4">
-                                                            <Position>
-                                                                <WorldPosition x="93.9499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.41">
-                                                            <Position>
-                                                                <WorldPosition x="93.7599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.42">
-                                                            <Position>
-                                                                <WorldPosition x="93.5599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.43">
-                                                            <Position>
-                                                                <WorldPosition x="93.3699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.44">
-                                                            <Position>
-                                                                <WorldPosition x="93.1699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.45">
-                                                            <Position>
-                                                                <WorldPosition x="92.9799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.46">
-                                                            <Position>
-                                                                <WorldPosition x="92.7899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.47">
-                                                            <Position>
-                                                                <WorldPosition x="92.5899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.48">
-                                                            <Position>
-                                                                <WorldPosition x="92.3999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.49">
-                                                            <Position>
-                                                                <WorldPosition x="92.1999985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.5">
-                                                            <Position>
-                                                                <WorldPosition x="92.0099985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.51">
-                                                            <Position>
-                                                                <WorldPosition x="91.8199985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.52">
-                                                            <Position>
-                                                                <WorldPosition x="91.6199985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.53">
-                                                            <Position>
-                                                                <WorldPosition x="91.4299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.54">
-                                                            <Position>
-                                                                <WorldPosition x="91.2399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.55">
-                                                            <Position>
-                                                                <WorldPosition x="91.0399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.56">
-                                                            <Position>
-                                                                <WorldPosition x="90.8499985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.57">
-                                                            <Position>
-                                                                <WorldPosition x="90.6499985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.58">
-                                                            <Position>
-                                                                <WorldPosition x="90.4599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.59">
-                                                            <Position>
-                                                                <WorldPosition x="90.2699985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.6">
-                                                            <Position>
-                                                                <WorldPosition x="90.0699985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.61">
-                                                            <Position>
-                                                                <WorldPosition x="89.8799985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.62">
-                                                            <Position>
-                                                                <WorldPosition x="89.6899985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.63">
-                                                            <Position>
-                                                                <WorldPosition x="89.4899985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.64">
-                                                            <Position>
-                                                                <WorldPosition x="89.2999985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.65">
-                                                            <Position>
-                                                                <WorldPosition x="89.1099985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.66">
-                                                            <Position>
-                                                                <WorldPosition x="88.9099985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.67">
-                                                            <Position>
-                                                                <WorldPosition x="88.7199985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.68">
-                                                            <Position>
-                                                                <WorldPosition x="88.5299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.69">
-                                                            <Position>
-                                                                <WorldPosition x="88.3299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.7">
-                                                            <Position>
-                                                                <WorldPosition x="88.1399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.71">
-                                                            <Position>
-                                                                <WorldPosition x="87.9399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.72">
-                                                            <Position>
-                                                                <WorldPosition x="87.7499985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.73">
-                                                            <Position>
-                                                                <WorldPosition x="87.5599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.74">
-                                                            <Position>
-                                                                <WorldPosition x="87.3599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.75">
-                                                            <Position>
-                                                                <WorldPosition x="87.1699985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.76">
-                                                            <Position>
-                                                                <WorldPosition x="86.9799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.77">
-                                                            <Position>
-                                                                <WorldPosition x="86.7799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.78">
-                                                            <Position>
-                                                                <WorldPosition x="86.5899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.79">
-                                                            <Position>
-                                                                <WorldPosition x="86.3999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.8">
-                                                            <Position>
-                                                                <WorldPosition x="86.1999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.81">
-                                                            <Position>
-                                                                <WorldPosition x="86.0099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.82">
-                                                            <Position>
-                                                                <WorldPosition x="85.8199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.83">
-                                                            <Position>
-                                                                <WorldPosition x="85.6199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.84">
-                                                            <Position>
-                                                                <WorldPosition x="85.4299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.85">
-                                                            <Position>
-                                                                <WorldPosition x="85.2399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.86">
-                                                            <Position>
-                                                                <WorldPosition x="85.0399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.87">
-                                                            <Position>
-                                                                <WorldPosition x="84.8499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.88">
-                                                            <Position>
-                                                                <WorldPosition x="84.6599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.89">
-                                                            <Position>
-                                                                <WorldPosition x="84.4599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.9">
-                                                            <Position>
-                                                                <WorldPosition x="84.2699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.91">
-                                                            <Position>
-                                                                <WorldPosition x="84.0799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.92">
-                                                            <Position>
-                                                                <WorldPosition x="83.8799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.93">
-                                                            <Position>
-                                                                <WorldPosition x="83.6899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.94">
-                                                            <Position>
-                                                                <WorldPosition x="83.4999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.95">
-                                                            <Position>
-                                                                <WorldPosition x="83.2999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.96">
-                                                            <Position>
-                                                                <WorldPosition x="83.1099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.97">
-                                                            <Position>
-                                                                <WorldPosition x="82.9199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.98">
-                                                            <Position>
-                                                                <WorldPosition x="82.7199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="0.99">
-                                                            <Position>
-                                                                <WorldPosition x="82.5299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1">
-                                                            <Position>
-                                                                <WorldPosition x="82.3399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.01">
-                                                            <Position>
-                                                                <WorldPosition x="82.1399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.02">
-                                                            <Position>
-                                                                <WorldPosition x="81.9499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.03">
-                                                            <Position>
-                                                                <WorldPosition x="81.7599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.04">
-                                                            <Position>
-                                                                <WorldPosition x="81.5699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.05">
-                                                            <Position>
-                                                                <WorldPosition x="81.3699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.06">
-                                                            <Position>
-                                                                <WorldPosition x="81.1799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.07">
-                                                            <Position>
-                                                                <WorldPosition x="80.9899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.08">
-                                                            <Position>
-                                                                <WorldPosition x="80.7899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.09">
-                                                            <Position>
-                                                                <WorldPosition x="80.5999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.1">
-                                                            <Position>
-                                                                <WorldPosition x="80.4099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.11">
-                                                            <Position>
-                                                                <WorldPosition x="80.2099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.12">
-                                                            <Position>
-                                                                <WorldPosition x="80.0199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.13">
-                                                            <Position>
-                                                                <WorldPosition x="79.8299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.14">
-                                                            <Position>
-                                                                <WorldPosition x="79.6299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.15">
-                                                            <Position>
-                                                                <WorldPosition x="79.4399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.16">
-                                                            <Position>
-                                                                <WorldPosition x="79.2499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.17">
-                                                            <Position>
-                                                                <WorldPosition x="79.0599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.18">
-                                                            <Position>
-                                                                <WorldPosition x="78.8599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.19">
-                                                            <Position>
-                                                                <WorldPosition x="78.6699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.2">
-                                                            <Position>
-                                                                <WorldPosition x="78.4799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.21">
-                                                            <Position>
-                                                                <WorldPosition x="78.2799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.22">
-                                                            <Position>
-                                                                <WorldPosition x="78.0899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.23">
-                                                            <Position>
-                                                                <WorldPosition x="77.8999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.24">
-                                                            <Position>
-                                                                <WorldPosition x="77.6999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.25">
-                                                            <Position>
-                                                                <WorldPosition x="77.5099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.26">
-                                                            <Position>
-                                                                <WorldPosition x="77.3199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.27">
-                                                            <Position>
-                                                                <WorldPosition x="77.1299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.28">
-                                                            <Position>
-                                                                <WorldPosition x="76.9299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.29">
-                                                            <Position>
-                                                                <WorldPosition x="76.7399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.3">
-                                                            <Position>
-                                                                <WorldPosition x="76.5499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.31">
-                                                            <Position>
-                                                                <WorldPosition x="76.3499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.32">
-                                                            <Position>
-                                                                <WorldPosition x="76.1599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.33">
-                                                            <Position>
-                                                                <WorldPosition x="75.9699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.34">
-                                                            <Position>
-                                                                <WorldPosition x="75.7699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.35">
-                                                            <Position>
-                                                                <WorldPosition x="75.5799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.36">
-                                                            <Position>
-                                                                <WorldPosition x="75.3899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.37">
-                                                            <Position>
-                                                                <WorldPosition x="75.1999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.38">
-                                                            <Position>
-                                                                <WorldPosition x="74.9999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.39">
-                                                            <Position>
-                                                                <WorldPosition x="74.8099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.4">
-                                                            <Position>
-                                                                <WorldPosition x="74.6199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.41">
-                                                            <Position>
-                                                                <WorldPosition x="74.4299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.42">
-                                                            <Position>
-                                                                <WorldPosition x="74.2299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.43">
-                                                            <Position>
-                                                                <WorldPosition x="74.0399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.44">
-                                                            <Position>
-                                                                <WorldPosition x="73.8499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.45">
-                                                            <Position>
-                                                                <WorldPosition x="73.6499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.46">
-                                                            <Position>
-                                                                <WorldPosition x="73.4599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.47">
-                                                            <Position>
-                                                                <WorldPosition x="73.2699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.48">
-                                                            <Position>
-                                                                <WorldPosition x="73.0799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.49">
-                                                            <Position>
-                                                                <WorldPosition x="72.8799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.5">
-                                                            <Position>
-                                                                <WorldPosition x="72.6899985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.51">
-                                                            <Position>
-                                                                <WorldPosition x="72.4999985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.52">
-                                                            <Position>
-                                                                <WorldPosition x="72.2999985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.53">
-                                                            <Position>
-                                                                <WorldPosition x="72.1099985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.54">
-                                                            <Position>
-                                                                <WorldPosition x="71.9199985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.55">
-                                                            <Position>
-                                                                <WorldPosition x="71.7299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.56">
-                                                            <Position>
-                                                                <WorldPosition x="71.5299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.57">
-                                                            <Position>
-                                                                <WorldPosition x="71.3399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.58">
-                                                            <Position>
-                                                                <WorldPosition x="71.1499985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.59">
-                                                            <Position>
-                                                                <WorldPosition x="70.9599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.6">
-                                                            <Position>
-                                                                <WorldPosition x="70.7599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.61">
-                                                            <Position>
-                                                                <WorldPosition x="70.5699985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.62">
-                                                            <Position>
-                                                                <WorldPosition x="70.3799985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.63">
-                                                            <Position>
-                                                                <WorldPosition x="70.17992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.64">
-                                                            <Position>
-                                                                <WorldPosition x="69.98992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.65">
-                                                            <Position>
-                                                                <WorldPosition x="69.79992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.66">
-                                                            <Position>
-                                                                <WorldPosition x="69.60992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.67">
-                                                            <Position>
-                                                                <WorldPosition x="69.40992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.68">
-                                                            <Position>
-                                                                <WorldPosition x="69.21992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.69">
-                                                            <Position>
-                                                                <WorldPosition x="69.02992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.7">
-                                                            <Position>
-                                                                <WorldPosition x="68.83992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.71">
-                                                            <Position>
-                                                                <WorldPosition x="68.63992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.72">
-                                                            <Position>
-                                                                <WorldPosition x="68.44992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.73">
-                                                            <Position>
-                                                                <WorldPosition x="68.25992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.74">
-                                                            <Position>
-                                                                <WorldPosition x="68.06992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.75">
-                                                            <Position>
-                                                                <WorldPosition x="67.86992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.76">
-                                                            <Position>
-                                                                <WorldPosition x="67.67992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.77">
-                                                            <Position>
-                                                                <WorldPosition x="67.48992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.78">
-                                                            <Position>
-                                                                <WorldPosition x="67.29992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.79">
-                                                            <Position>
-                                                                <WorldPosition x="67.09992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.8">
-                                                            <Position>
-                                                                <WorldPosition x="66.90992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.81">
-                                                            <Position>
-                                                                <WorldPosition x="66.71992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.82">
-                                                            <Position>
-                                                                <WorldPosition x="66.52992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.83">
-                                                            <Position>
-                                                                <WorldPosition x="66.32992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.84">
-                                                            <Position>
-                                                                <WorldPosition x="66.13992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.85">
-                                                            <Position>
-                                                                <WorldPosition x="65.94992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.86">
-                                                            <Position>
-                                                                <WorldPosition x="65.75992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.87">
-                                                            <Position>
-                                                                <WorldPosition x="65.55992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.88">
-                                                            <Position>
-                                                                <WorldPosition x="65.36992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.89">
-                                                            <Position>
-                                                                <WorldPosition x="65.17992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.9">
-                                                            <Position>
-                                                                <WorldPosition x="64.98992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.91">
-                                                            <Position>
-                                                                <WorldPosition x="64.78992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.92">
-                                                            <Position>
-                                                                <WorldPosition x="64.59992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.93">
-                                                            <Position>
-                                                                <WorldPosition x="64.40992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.94">
-                                                            <Position>
-                                                                <WorldPosition x="64.21992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.95">
-                                                            <Position>
-                                                                <WorldPosition x="64.01992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.96">
-                                                            <Position>
-                                                                <WorldPosition x="63.82992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.97">
-                                                            <Position>
-                                                                <WorldPosition x="63.63992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.98">
-                                                            <Position>
-                                                                <WorldPosition x="63.44992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="1.99">
-                                                            <Position>
-                                                                <WorldPosition x="63.24992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2">
-                                                            <Position>
-                                                                <WorldPosition x="63.05992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.01">
-                                                            <Position>
-                                                                <WorldPosition x="62.86992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.02">
-                                                            <Position>
-                                                                <WorldPosition x="62.67992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.03">
-                                                            <Position>
-                                                                <WorldPosition x="62.47992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.04">
-                                                            <Position>
-                                                                <WorldPosition x="62.28992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.05">
-                                                            <Position>
-                                                                <WorldPosition x="62.09992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.06">
-                                                            <Position>
-                                                                <WorldPosition x="61.90992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.07">
-                                                            <Position>
-                                                                <WorldPosition x="61.70992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.08">
-                                                            <Position>
-                                                                <WorldPosition x="61.51992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.09">
-                                                            <Position>
-                                                                <WorldPosition x="61.32992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.1">
-                                                            <Position>
-                                                                <WorldPosition x="61.13992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.11">
-                                                            <Position>
-                                                                <WorldPosition x="60.93992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.12">
-                                                            <Position>
-                                                                <WorldPosition x="60.74992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.13">
-                                                            <Position>
-                                                                <WorldPosition x="60.55992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.14">
-                                                            <Position>
-                                                                <WorldPosition x="60.36992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.15">
-                                                            <Position>
-                                                                <WorldPosition x="60.16992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.16">
-                                                            <Position>
-                                                                <WorldPosition x="59.97992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.17">
-                                                            <Position>
-                                                                <WorldPosition x="59.78992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.18">
-                                                            <Position>
-                                                                <WorldPosition x="59.59992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.19">
-                                                            <Position>
-                                                                <WorldPosition x="59.39992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.2">
-                                                            <Position>
-                                                                <WorldPosition x="59.20992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.21">
-                                                            <Position>
-                                                                <WorldPosition x="59.01992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.22">
-                                                            <Position>
-                                                                <WorldPosition x="58.82992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.23">
-                                                            <Position>
-                                                                <WorldPosition x="58.62992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.24">
-                                                            <Position>
-                                                                <WorldPosition x="58.43992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.25">
-                                                            <Position>
-                                                                <WorldPosition x="58.24992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.26">
-                                                            <Position>
-                                                                <WorldPosition x="58.05992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.27">
-                                                            <Position>
-                                                                <WorldPosition x="57.86992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.28">
-                                                            <Position>
-                                                                <WorldPosition x="57.66992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.29">
-                                                            <Position>
-                                                                <WorldPosition x="57.47992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.3">
-                                                            <Position>
-                                                                <WorldPosition x="57.28992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.31">
-                                                            <Position>
-                                                                <WorldPosition x="57.09992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.32">
-                                                            <Position>
-                                                                <WorldPosition x="56.89992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.33">
-                                                            <Position>
-                                                                <WorldPosition x="56.70992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.34">
-                                                            <Position>
-                                                                <WorldPosition x="56.51992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.35">
-                                                            <Position>
-                                                                <WorldPosition x="56.32992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.36">
-                                                            <Position>
-                                                                <WorldPosition x="56.12992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.37">
-                                                            <Position>
-                                                                <WorldPosition x="55.93992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.38">
-                                                            <Position>
-                                                                <WorldPosition x="55.74992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.39">
-                                                            <Position>
-                                                                <WorldPosition x="55.55992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.4">
-                                                            <Position>
-                                                                <WorldPosition x="55.35992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.41">
-                                                            <Position>
-                                                                <WorldPosition x="55.16992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.42">
-                                                            <Position>
-                                                                <WorldPosition x="54.97992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.43">
-                                                            <Position>
-                                                                <WorldPosition x="54.78992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.44">
-                                                            <Position>
-                                                                <WorldPosition x="54.59992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.45">
-                                                            <Position>
-                                                                <WorldPosition x="54.39992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.46">
-                                                            <Position>
-                                                                <WorldPosition x="54.20992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.47">
-                                                            <Position>
-                                                                <WorldPosition x="54.01992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.48">
-                                                            <Position>
-                                                                <WorldPosition x="53.82992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.49">
-                                                            <Position>
-                                                                <WorldPosition x="53.62992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.5">
-                                                            <Position>
-                                                                <WorldPosition x="53.43992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.51">
-                                                            <Position>
-                                                                <WorldPosition x="53.24992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.52">
-                                                            <Position>
-                                                                <WorldPosition x="53.05992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.53">
-                                                            <Position>
-                                                                <WorldPosition x="52.85992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.54">
-                                                            <Position>
-                                                                <WorldPosition x="52.66992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.55">
-                                                            <Position>
-                                                                <WorldPosition x="52.47992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.56">
-                                                            <Position>
-                                                                <WorldPosition x="52.28992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.57">
-                                                            <Position>
-                                                                <WorldPosition x="52.08992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.58">
-                                                            <Position>
-                                                                <WorldPosition x="51.89992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.59">
-                                                            <Position>
-                                                                <WorldPosition x="51.70992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.6">
-                                                            <Position>
-                                                                <WorldPosition x="51.51992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.61">
-                                                            <Position>
-                                                                <WorldPosition x="51.32992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.62">
-                                                            <Position>
-                                                                <WorldPosition x="51.12992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.63">
-                                                            <Position>
-                                                                <WorldPosition x="50.93992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.64">
-                                                            <Position>
-                                                                <WorldPosition x="50.74992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.65">
-                                                            <Position>
-                                                                <WorldPosition x="50.55992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.66">
-                                                            <Position>
-                                                                <WorldPosition x="50.35992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.67">
-                                                            <Position>
-                                                                <WorldPosition x="50.16992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.68">
-                                                            <Position>
-                                                                <WorldPosition x="49.97992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.69">
-                                                            <Position>
-                                                                <WorldPosition x="49.78992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.7">
-                                                            <Position>
-                                                                <WorldPosition x="49.58992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.71">
-                                                            <Position>
-                                                                <WorldPosition x="49.39992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.72">
-                                                            <Position>
-                                                                <WorldPosition x="49.20992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.73">
-                                                            <Position>
-                                                                <WorldPosition x="49.01992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.74">
-                                                            <Position>
-                                                                <WorldPosition x="48.82992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.75">
-                                                            <Position>
-                                                                <WorldPosition x="48.62992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.76">
-                                                            <Position>
-                                                                <WorldPosition x="48.43992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.77">
-                                                            <Position>
-                                                                <WorldPosition x="48.24992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.78">
-                                                            <Position>
-                                                                <WorldPosition x="48.05992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.79">
-                                                            <Position>
-                                                                <WorldPosition x="47.85992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.8">
-                                                            <Position>
-                                                                <WorldPosition x="47.66992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.81">
-                                                            <Position>
-                                                                <WorldPosition x="47.47992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.82">
-                                                            <Position>
-                                                                <WorldPosition x="47.28992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.83">
-                                                            <Position>
-                                                                <WorldPosition x="47.09992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.84">
-                                                            <Position>
-                                                                <WorldPosition x="46.89992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.85">
-                                                            <Position>
-                                                                <WorldPosition x="46.70992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.86">
-                                                            <Position>
-                                                                <WorldPosition x="46.51992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.87">
-                                                            <Position>
-                                                                <WorldPosition x="46.32992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.88">
-                                                            <Position>
-                                                                <WorldPosition x="46.12992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.89">
-                                                            <Position>
-                                                                <WorldPosition x="45.93992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.9">
-                                                            <Position>
-                                                                <WorldPosition x="45.74992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.91">
-                                                            <Position>
-                                                                <WorldPosition x="45.55992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.92">
-                                                            <Position>
-                                                                <WorldPosition x="45.35992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.93">
-                                                            <Position>
-                                                                <WorldPosition x="45.16992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.94">
-                                                            <Position>
-                                                                <WorldPosition x="44.97992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.95">
-                                                            <Position>
-                                                                <WorldPosition x="44.78992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.96">
-                                                            <Position>
-                                                                <WorldPosition x="44.59992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.97">
-                                                            <Position>
-                                                                <WorldPosition x="44.39992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.98">
-                                                            <Position>
-                                                                <WorldPosition x="44.20992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="2.99">
-                                                            <Position>
-                                                                <WorldPosition x="44.01992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3">
-                                                            <Position>
-                                                                <WorldPosition x="43.82992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.01">
-                                                            <Position>
-                                                                <WorldPosition x="43.62992071" y="2.016320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.02">
-                                                            <Position>
-                                                                <WorldPosition x="43.43992071" y="2.016320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.03">
-                                                            <Position>
-                                                                <WorldPosition x="43.24992071" y="2.016320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.04">
-                                                            <Position>
-                                                                <WorldPosition x="43.05992071" y="2.016320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.05">
-                                                            <Position>
-                                                                <WorldPosition x="42.85992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.06">
-                                                            <Position>
-                                                                <WorldPosition x="42.66992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.07">
-                                                            <Position>
-                                                                <WorldPosition x="42.47992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.08">
-                                                            <Position>
-                                                                <WorldPosition x="42.28992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.09">
-                                                            <Position>
-                                                                <WorldPosition x="42.09992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.1">
-                                                            <Position>
-                                                                <WorldPosition x="41.89992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.11">
-                                                            <Position>
-                                                                <WorldPosition x="41.70992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.12">
-                                                            <Position>
-                                                                <WorldPosition x="41.51992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.13">
-                                                            <Position>
-                                                                <WorldPosition x="41.32992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.14">
-                                                            <Position>
-                                                                <WorldPosition x="41.12992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.15">
-                                                            <Position>
-                                                                <WorldPosition x="40.93992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.16">
-                                                            <Position>
-                                                                <WorldPosition x="40.74992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.17">
-                                                            <Position>
-                                                                <WorldPosition x="40.55992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.18">
-                                                            <Position>
-                                                                <WorldPosition x="40.35992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.19">
-                                                            <Position>
-                                                                <WorldPosition x="40.16992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.2">
-                                                            <Position>
-                                                                <WorldPosition x="39.97992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.21">
-                                                            <Position>
-                                                                <WorldPosition x="39.78992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.22">
-                                                            <Position>
-                                                                <WorldPosition x="39.58992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.23">
-                                                            <Position>
-                                                                <WorldPosition x="39.39992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.24">
-                                                            <Position>
-                                                                <WorldPosition x="39.20992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.25">
-                                                            <Position>
-                                                                <WorldPosition x="39.01992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.26">
-                                                            <Position>
-                                                                <WorldPosition x="38.82992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.27">
-                                                            <Position>
-                                                                <WorldPosition x="38.62992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.28">
-                                                            <Position>
-                                                                <WorldPosition x="38.43992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.29">
-                                                            <Position>
-                                                                <WorldPosition x="38.24992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.3">
-                                                            <Position>
-                                                                <WorldPosition x="38.05992071" y="2.076320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.31">
-                                                            <Position>
-                                                                <WorldPosition x="37.85992071" y="2.076320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.32">
-                                                            <Position>
-                                                                <WorldPosition x="37.66992071" y="2.076320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.33">
-                                                            <Position>
-                                                                <WorldPosition x="37.47992071" y="2.076320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.34">
-                                                            <Position>
-                                                                <WorldPosition x="37.28992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.35">
-                                                            <Position>
-                                                                <WorldPosition x="37.08992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.36">
-                                                            <Position>
-                                                                <WorldPosition x="36.89992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.37">
-                                                            <Position>
-                                                                <WorldPosition x="36.70992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.38">
-                                                            <Position>
-                                                                <WorldPosition x="36.51992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.39">
-                                                            <Position>
-                                                                <WorldPosition x="36.31992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.4">
-                                                            <Position>
-                                                                <WorldPosition x="36.12992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.41">
-                                                            <Position>
-                                                                <WorldPosition x="35.93992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.42">
-                                                            <Position>
-                                                                <WorldPosition x="35.74992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.43">
-                                                            <Position>
-                                                                <WorldPosition x="35.54992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.44">
-                                                            <Position>
-                                                                <WorldPosition x="35.35992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.45">
-                                                            <Position>
-                                                                <WorldPosition x="35.16992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.46">
-                                                            <Position>
-                                                                <WorldPosition x="34.97992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.47">
-                                                            <Position>
-                                                                <WorldPosition x="34.78992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.48">
-                                                            <Position>
-                                                                <WorldPosition x="34.58992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.49">
-                                                            <Position>
-                                                                <WorldPosition x="34.39992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.5">
-                                                            <Position>
-                                                                <WorldPosition x="34.20992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.51">
-                                                            <Position>
-                                                                <WorldPosition x="34.01992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.52">
-                                                            <Position>
-                                                                <WorldPosition x="33.81992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.53">
-                                                            <Position>
-                                                                <WorldPosition x="33.62992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.54">
-                                                            <Position>
-                                                                <WorldPosition x="33.43992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.55">
-                                                            <Position>
-                                                                <WorldPosition x="33.24992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.56">
-                                                            <Position>
-                                                                <WorldPosition x="33.04992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.57">
-                                                            <Position>
-                                                                <WorldPosition x="32.85992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.58">
-                                                            <Position>
-                                                                <WorldPosition x="32.66992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.59">
-                                                            <Position>
-                                                                <WorldPosition x="32.47992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.6">
-                                                            <Position>
-                                                                <WorldPosition x="32.27992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.61">
-                                                            <Position>
-                                                                <WorldPosition x="32.08992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.62">
-                                                            <Position>
-                                                                <WorldPosition x="31.89992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.63">
-                                                            <Position>
-                                                                <WorldPosition x="31.70992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.64">
-                                                            <Position>
-                                                                <WorldPosition x="31.50992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.65">
-                                                            <Position>
-                                                                <WorldPosition x="31.31992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.66">
-                                                            <Position>
-                                                                <WorldPosition x="31.12992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.67">
-                                                            <Position>
-                                                                <WorldPosition x="30.93992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.68">
-                                                            <Position>
-                                                                <WorldPosition x="30.73992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.69">
-                                                            <Position>
-                                                                <WorldPosition x="30.54992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.7">
-                                                            <Position>
-                                                                <WorldPosition x="30.35992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.71">
-                                                            <Position>
-                                                                <WorldPosition x="30.16992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.72">
-                                                            <Position>
-                                                                <WorldPosition x="29.96992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.73">
-                                                            <Position>
-                                                                <WorldPosition x="29.77992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.74">
-                                                            <Position>
-                                                                <WorldPosition x="29.58992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.75">
-                                                            <Position>
-                                                                <WorldPosition x="29.39992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.76">
-                                                            <Position>
-                                                                <WorldPosition x="29.19992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.77">
-                                                            <Position>
-                                                                <WorldPosition x="29.00992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.78">
-                                                            <Position>
-                                                                <WorldPosition x="28.81992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.79">
-                                                            <Position>
-                                                                <WorldPosition x="28.62992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.8">
-                                                            <Position>
-                                                                <WorldPosition x="28.42992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.81">
-                                                            <Position>
-                                                                <WorldPosition x="28.23992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.82">
-                                                            <Position>
-                                                                <WorldPosition x="28.04992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.83">
-                                                            <Position>
-                                                                <WorldPosition x="27.85992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.84">
-                                                            <Position>
-                                                                <WorldPosition x="27.65992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.85">
-                                                            <Position>
-                                                                <WorldPosition x="27.46992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.86">
-                                                            <Position>
-                                                                <WorldPosition x="27.27992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.87">
-                                                            <Position>
-                                                                <WorldPosition x="27.08992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.88">
-                                                            <Position>
-                                                                <WorldPosition x="26.88992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.89">
-                                                            <Position>
-                                                                <WorldPosition x="26.69992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.9">
-                                                            <Position>
-                                                                <WorldPosition x="26.50992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.91">
-                                                            <Position>
-                                                                <WorldPosition x="26.31992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.92">
-                                                            <Position>
-                                                                <WorldPosition x="26.11992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.93">
-                                                            <Position>
-                                                                <WorldPosition x="25.92992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.94">
-                                                            <Position>
-                                                                <WorldPosition x="25.73992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.95">
-                                                            <Position>
-                                                                <WorldPosition x="25.53992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.96">
-                                                            <Position>
-                                                                <WorldPosition x="25.3499985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.97">
-                                                            <Position>
-                                                                <WorldPosition x="25.1599985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.98">
-                                                            <Position>
-                                                                <WorldPosition x="24.9699985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="3.99">
-                                                            <Position>
-                                                                <WorldPosition x="24.7699985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4">
-                                                            <Position>
-                                                                <WorldPosition x="24.5799985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.01">
-                                                            <Position>
-                                                                <WorldPosition x="24.3899985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.02">
-                                                            <Position>
-                                                                <WorldPosition x="24.1999985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.03">
-                                                            <Position>
-                                                                <WorldPosition x="23.9999985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.04">
-                                                            <Position>
-                                                                <WorldPosition x="23.8099985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.05">
-                                                            <Position>
-                                                                <WorldPosition x="23.6199985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.06">
-                                                            <Position>
-                                                                <WorldPosition x="23.4299985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.07">
-                                                            <Position>
-                                                                <WorldPosition x="23.2299985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.08">
-                                                            <Position>
-                                                                <WorldPosition x="23.0399985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.09">
-                                                            <Position>
-                                                                <WorldPosition x="22.8499985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.1">
-                                                            <Position>
-                                                                <WorldPosition x="22.6599985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.11">
-                                                            <Position>
-                                                                <WorldPosition x="22.4599985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.12">
-                                                            <Position>
-                                                                <WorldPosition x="22.2699985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.13">
-                                                            <Position>
-                                                                <WorldPosition x="22.0799985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.14">
-                                                            <Position>
-                                                                <WorldPosition x="21.8799985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.15">
-                                                            <Position>
-                                                                <WorldPosition x="21.6899985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.16">
-                                                            <Position>
-                                                                <WorldPosition x="21.4999985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.17">
-                                                            <Position>
-                                                                <WorldPosition x="21.3099985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.18">
-                                                            <Position>
-                                                                <WorldPosition x="21.1099985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.19">
-                                                            <Position>
-                                                                <WorldPosition x="20.9199985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.2">
-                                                            <Position>
-                                                                <WorldPosition x="20.7299985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.21">
-                                                            <Position>
-                                                                <WorldPosition x="20.5399985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.22">
-                                                            <Position>
-                                                                <WorldPosition x="20.3399985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.23">
-                                                            <Position>
-                                                                <WorldPosition x="20.1499985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.24">
-                                                            <Position>
-                                                                <WorldPosition x="19.9599985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.25">
-                                                            <Position>
-                                                                <WorldPosition x="19.7599985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.26">
-                                                            <Position>
-                                                                <WorldPosition x="19.5699985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.27">
-                                                            <Position>
-                                                                <WorldPosition x="19.3799985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.28">
-                                                            <Position>
-                                                                <WorldPosition x="19.1899985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.29">
-                                                            <Position>
-                                                                <WorldPosition x="18.9899985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.3">
-                                                            <Position>
-                                                                <WorldPosition x="18.7999985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.31">
-                                                            <Position>
-                                                                <WorldPosition x="18.6099985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.32">
-                                                            <Position>
-                                                                <WorldPosition x="18.4199985" y="2.15812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.33">
-                                                            <Position>
-                                                                <WorldPosition x="18.2199985" y="2.15812067" z="0" h="3.14" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.34">
-                                                            <Position>
-                                                                <WorldPosition x="18.0299583" y="2.169920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.35">
-                                                            <Position>
-                                                                <WorldPosition x="17.8399583" y="2.169920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.36">
-                                                            <Position>
-                                                                <WorldPosition x="17.6399583" y="2.169920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.37">
-                                                            <Position>
-                                                                <WorldPosition x="17.4499583" y="2.169920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.38">
-                                                            <Position>
-                                                                <WorldPosition x="17.2599583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.39">
-                                                            <Position>
-                                                                <WorldPosition x="17.0699583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.4">
-                                                            <Position>
-                                                                <WorldPosition x="16.8699583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.41">
-                                                            <Position>
-                                                                <WorldPosition x="16.6799583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.42">
-                                                            <Position>
-                                                                <WorldPosition x="16.4899583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.43">
-                                                            <Position>
-                                                                <WorldPosition x="16.2899583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.44">
-                                                            <Position>
-                                                                <WorldPosition x="16.0999583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.45">
-                                                            <Position>
-                                                                <WorldPosition x="15.9099583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.46">
-                                                            <Position>
-                                                                <WorldPosition x="15.7199583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.47">
-                                                            <Position>
-                                                                <WorldPosition x="15.5199583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.48">
-                                                            <Position>
-                                                                <WorldPosition x="15.3299583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.49">
-                                                            <Position>
-                                                                <WorldPosition x="15.1399583" y="2.139920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.5">
-                                                            <Position>
-                                                                <WorldPosition x="14.9399583" y="2.139920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.51">
-                                                            <Position>
-                                                                <WorldPosition x="14.7499583" y="2.139920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.52">
-                                                            <Position>
-                                                                <WorldPosition x="14.5599583" y="2.139920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.53">
-                                                            <Position>
-                                                                <WorldPosition x="14.3699583" y="2.129920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.54">
-                                                            <Position>
-                                                                <WorldPosition x="14.1699583" y="2.129920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.55">
-                                                            <Position>
-                                                                <WorldPosition x="13.9799583" y="2.129920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.56">
-                                                            <Position>
-                                                                <WorldPosition x="13.7899583" y="2.129920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.57">
-                                                            <Position>
-                                                                <WorldPosition x="13.5899583" y="2.119920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.58">
-                                                            <Position>
-                                                                <WorldPosition x="13.3999583" y="2.119920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.59">
-                                                            <Position>
-                                                                <WorldPosition x="13.2099583" y="2.119920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.6">
-                                                            <Position>
-                                                                <WorldPosition x="13.0199583" y="2.109920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.61">
-                                                            <Position>
-                                                                <WorldPosition x="12.8199583" y="2.109920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.62">
-                                                            <Position>
-                                                                <WorldPosition x="12.6299583" y="2.109920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.63">
-                                                            <Position>
-                                                                <WorldPosition x="12.4399583" y="2.099920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.64">
-                                                            <Position>
-                                                                <WorldPosition x="12.2399583" y="2.099920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.65">
-                                                            <Position>
-                                                                <WorldPosition x="12.0499583" y="2.099920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.66">
-                                                            <Position>
-                                                                <WorldPosition x="11.8599583" y="2.099920552" z="0" h="3.15" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.67">
-                                                            <Position>
-                                                                <WorldPosition x="11.6598001" y="2.101719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.68">
-                                                            <Position>
-                                                                <WorldPosition x="11.4698001" y="2.101719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.69">
-                                                            <Position>
-                                                                <WorldPosition x="11.2798001" y="2.101719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.7">
-                                                            <Position>
-                                                                <WorldPosition x="11.0898001" y="2.091719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.71">
-                                                            <Position>
-                                                                <WorldPosition x="10.8898001" y="2.091719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.72">
-                                                            <Position>
-                                                                <WorldPosition x="10.6998001" y="2.081719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.73">
-                                                            <Position>
-                                                                <WorldPosition x="10.5098001" y="2.081719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.74">
-                                                            <Position>
-                                                                <WorldPosition x="10.3098001" y="2.081719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.75">
-                                                            <Position>
-                                                                <WorldPosition x="10.1198001" y="2.071719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.76">
-                                                            <Position>
-                                                                <WorldPosition x="9.929800096" y="2.071719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.77">
-                                                            <Position>
-                                                                <WorldPosition x="9.739800096" y="2.071719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.78">
-                                                            <Position>
-                                                                <WorldPosition x="9.539800096" y="2.061719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.79">
-                                                            <Position>
-                                                                <WorldPosition x="9.349800096" y="2.061719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.8">
-                                                            <Position>
-                                                                <WorldPosition x="9.159800096" y="2.051719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.81">
-                                                            <Position>
-                                                                <WorldPosition x="8.959800096" y="2.051719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.82">
-                                                            <Position>
-                                                                <WorldPosition x="8.769800096" y="2.051719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.83">
-                                                            <Position>
-                                                                <WorldPosition x="8.579800096" y="2.041719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.84">
-                                                            <Position>
-                                                                <WorldPosition x="8.379800096" y="2.041719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.85">
-                                                            <Position>
-                                                                <WorldPosition x="8.189800096" y="2.031719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.86">
-                                                            <Position>
-                                                                <WorldPosition x="7.999800096" y="2.031719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.87">
-                                                            <Position>
-                                                                <WorldPosition x="7.809800096" y="2.021719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.88">
-                                                            <Position>
-                                                                <WorldPosition x="7.609800096" y="2.021719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.89">
-                                                            <Position>
-                                                                <WorldPosition x="7.419800096" y="2.021719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.9">
-                                                            <Position>
-                                                                <WorldPosition x="7.229800096" y="2.011719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.91">
-                                                            <Position>
-                                                                <WorldPosition x="7.029800096" y="2.011719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.92">
-                                                            <Position>
-                                                                <WorldPosition x="6.839800096" y="2.001719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.93">
-                                                            <Position>
-                                                                <WorldPosition x="6.649800096" y="2.001719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.94">
-                                                            <Position>
-                                                                <WorldPosition x="6.449800096" y="1.991719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.95">
-                                                            <Position>
-                                                                <WorldPosition x="6.259800096" y="1.991719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.96">
-                                                            <Position>
-                                                                <WorldPosition x="6.069800096" y="1.981719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.97">
-                                                            <Position>
-                                                                <WorldPosition x="5.869800096" y="1.981719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.98">
-                                                            <Position>
-                                                                <WorldPosition x="5.679800096" y="1.971719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="4.99">
-                                                            <Position>
-                                                                <WorldPosition x="5.489800096" y="1.971719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="5">
-                                                            <Position>
-                                                                <WorldPosition x="5.299800096" y="1.961719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="5.01">
-                                                            <Position>
-                                                                <WorldPosition x="5.099800096" y="1.961719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="5.02">
-                                                            <Position>
-                                                                <WorldPosition x="4.909800096" y="1.951719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                        <Vertex time="5.03">
-                                                            <Position>
-                                                                <WorldPosition x="4.719800096" y="1.951719442" z="0" h="3.16" p="0" r="0"/>
-                                                            </Position>
-                                                        </Vertex>
-                                                    </Polyline>
-                                                </Shape>
-                                            </Trajectory>
+                                            <TrajectoryRef>
+                                                <Trajectory name="LaneChange" closed="false">
+                                                    <Shape>
+                                                        <Polyline>
+                                                            <Vertex time="0">
+                                                                <Position>
+                                                                    <WorldPosition x="101.6999207" y="1.826320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.01">
+                                                                <Position>
+                                                                    <WorldPosition x="101.5199207" y="1.826320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.02">
+                                                                <Position>
+                                                                    <WorldPosition x="101.3299207" y="1.826320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.03">
+                                                                <Position>
+                                                                    <WorldPosition x="101.1299207" y="1.826320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.04">
+                                                                <Position>
+                                                                    <WorldPosition x="100.9399207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.05">
+                                                                <Position>
+                                                                    <WorldPosition x="100.7399207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.06">
+                                                                <Position>
+                                                                    <WorldPosition x="100.5499207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.07">
+                                                                <Position>
+                                                                    <WorldPosition x="100.3499207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.08">
+                                                                <Position>
+                                                                    <WorldPosition x="100.1599207" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.09">
+                                                                <Position>
+                                                                    <WorldPosition x="99.96992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.1">
+                                                                <Position>
+                                                                    <WorldPosition x="99.76992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.11">
+                                                                <Position>
+                                                                    <WorldPosition x="99.57992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.12">
+                                                                <Position>
+                                                                    <WorldPosition x="99.37992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.13">
+                                                                <Position>
+                                                                    <WorldPosition x="99.18992071" y="1.836320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.14">
+                                                                <Position>
+                                                                    <WorldPosition x="98.9899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.15">
+                                                                <Position>
+                                                                    <WorldPosition x="98.7999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.16">
+                                                                <Position>
+                                                                    <WorldPosition x="98.6099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.17">
+                                                                <Position>
+                                                                    <WorldPosition x="98.4099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.18">
+                                                                <Position>
+                                                                    <WorldPosition x="98.2199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.19">
+                                                                <Position>
+                                                                    <WorldPosition x="98.0199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.2">
+                                                                <Position>
+                                                                    <WorldPosition x="97.8299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.21">
+                                                                <Position>
+                                                                    <WorldPosition x="97.6399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.22">
+                                                                <Position>
+                                                                    <WorldPosition x="97.4399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.23">
+                                                                <Position>
+                                                                    <WorldPosition x="97.2499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.24">
+                                                                <Position>
+                                                                    <WorldPosition x="97.0499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.25">
+                                                                <Position>
+                                                                    <WorldPosition x="96.8599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.26">
+                                                                <Position>
+                                                                    <WorldPosition x="96.6599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.27">
+                                                                <Position>
+                                                                    <WorldPosition x="96.4699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.28">
+                                                                <Position>
+                                                                    <WorldPosition x="96.2799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.29">
+                                                                <Position>
+                                                                    <WorldPosition x="96.0799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.3">
+                                                                <Position>
+                                                                    <WorldPosition x="95.8899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.31">
+                                                                <Position>
+                                                                    <WorldPosition x="95.6899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.32">
+                                                                <Position>
+                                                                    <WorldPosition x="95.4999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.33">
+                                                                <Position>
+                                                                    <WorldPosition x="95.3099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.34">
+                                                                <Position>
+                                                                    <WorldPosition x="95.1099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.35">
+                                                                <Position>
+                                                                    <WorldPosition x="94.9199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.36">
+                                                                <Position>
+                                                                    <WorldPosition x="94.7199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.37">
+                                                                <Position>
+                                                                    <WorldPosition x="94.5299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.38">
+                                                                <Position>
+                                                                    <WorldPosition x="94.3399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.39">
+                                                                <Position>
+                                                                    <WorldPosition x="94.1399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.4">
+                                                                <Position>
+                                                                    <WorldPosition x="93.9499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.41">
+                                                                <Position>
+                                                                    <WorldPosition x="93.7599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.42">
+                                                                <Position>
+                                                                    <WorldPosition x="93.5599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.43">
+                                                                <Position>
+                                                                    <WorldPosition x="93.3699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.44">
+                                                                <Position>
+                                                                    <WorldPosition x="93.1699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.45">
+                                                                <Position>
+                                                                    <WorldPosition x="92.9799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.46">
+                                                                <Position>
+                                                                    <WorldPosition x="92.7899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.47">
+                                                                <Position>
+                                                                    <WorldPosition x="92.5899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.48">
+                                                                <Position>
+                                                                    <WorldPosition x="92.3999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.49">
+                                                                <Position>
+                                                                    <WorldPosition x="92.1999985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.5">
+                                                                <Position>
+                                                                    <WorldPosition x="92.0099985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.51">
+                                                                <Position>
+                                                                    <WorldPosition x="91.8199985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.52">
+                                                                <Position>
+                                                                    <WorldPosition x="91.6199985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.53">
+                                                                <Position>
+                                                                    <WorldPosition x="91.4299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.54">
+                                                                <Position>
+                                                                    <WorldPosition x="91.2399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.55">
+                                                                <Position>
+                                                                    <WorldPosition x="91.0399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.56">
+                                                                <Position>
+                                                                    <WorldPosition x="90.8499985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.57">
+                                                                <Position>
+                                                                    <WorldPosition x="90.6499985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.58">
+                                                                <Position>
+                                                                    <WorldPosition x="90.4599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.59">
+                                                                <Position>
+                                                                    <WorldPosition x="90.2699985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.6">
+                                                                <Position>
+                                                                    <WorldPosition x="90.0699985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.61">
+                                                                <Position>
+                                                                    <WorldPosition x="89.8799985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.62">
+                                                                <Position>
+                                                                    <WorldPosition x="89.6899985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.63">
+                                                                <Position>
+                                                                    <WorldPosition x="89.4899985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.64">
+                                                                <Position>
+                                                                    <WorldPosition x="89.2999985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.65">
+                                                                <Position>
+                                                                    <WorldPosition x="89.1099985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.66">
+                                                                <Position>
+                                                                    <WorldPosition x="88.9099985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.67">
+                                                                <Position>
+                                                                    <WorldPosition x="88.7199985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.68">
+                                                                <Position>
+                                                                    <WorldPosition x="88.5299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.69">
+                                                                <Position>
+                                                                    <WorldPosition x="88.3299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.7">
+                                                                <Position>
+                                                                    <WorldPosition x="88.1399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.71">
+                                                                <Position>
+                                                                    <WorldPosition x="87.9399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.72">
+                                                                <Position>
+                                                                    <WorldPosition x="87.7499985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.73">
+                                                                <Position>
+                                                                    <WorldPosition x="87.5599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.74">
+                                                                <Position>
+                                                                    <WorldPosition x="87.3599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.75">
+                                                                <Position>
+                                                                    <WorldPosition x="87.1699985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.76">
+                                                                <Position>
+                                                                    <WorldPosition x="86.9799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.77">
+                                                                <Position>
+                                                                    <WorldPosition x="86.7799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.78">
+                                                                <Position>
+                                                                    <WorldPosition x="86.5899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.79">
+                                                                <Position>
+                                                                    <WorldPosition x="86.3999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.8">
+                                                                <Position>
+                                                                    <WorldPosition x="86.1999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.81">
+                                                                <Position>
+                                                                    <WorldPosition x="86.0099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.82">
+                                                                <Position>
+                                                                    <WorldPosition x="85.8199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.83">
+                                                                <Position>
+                                                                    <WorldPosition x="85.6199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.84">
+                                                                <Position>
+                                                                    <WorldPosition x="85.4299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.85">
+                                                                <Position>
+                                                                    <WorldPosition x="85.2399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.86">
+                                                                <Position>
+                                                                    <WorldPosition x="85.0399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.87">
+                                                                <Position>
+                                                                    <WorldPosition x="84.8499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.88">
+                                                                <Position>
+                                                                    <WorldPosition x="84.6599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.89">
+                                                                <Position>
+                                                                    <WorldPosition x="84.4599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.9">
+                                                                <Position>
+                                                                    <WorldPosition x="84.2699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.91">
+                                                                <Position>
+                                                                    <WorldPosition x="84.0799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.92">
+                                                                <Position>
+                                                                    <WorldPosition x="83.8799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.93">
+                                                                <Position>
+                                                                    <WorldPosition x="83.6899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.94">
+                                                                <Position>
+                                                                    <WorldPosition x="83.4999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.95">
+                                                                <Position>
+                                                                    <WorldPosition x="83.2999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.96">
+                                                                <Position>
+                                                                    <WorldPosition x="83.1099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.97">
+                                                                <Position>
+                                                                    <WorldPosition x="82.9199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.98">
+                                                                <Position>
+                                                                    <WorldPosition x="82.7199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="0.99">
+                                                                <Position>
+                                                                    <WorldPosition x="82.5299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1">
+                                                                <Position>
+                                                                    <WorldPosition x="82.3399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.01">
+                                                                <Position>
+                                                                    <WorldPosition x="82.1399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.02">
+                                                                <Position>
+                                                                    <WorldPosition x="81.9499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.03">
+                                                                <Position>
+                                                                    <WorldPosition x="81.7599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.04">
+                                                                <Position>
+                                                                    <WorldPosition x="81.5699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.05">
+                                                                <Position>
+                                                                    <WorldPosition x="81.3699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.06">
+                                                                <Position>
+                                                                    <WorldPosition x="81.1799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.07">
+                                                                <Position>
+                                                                    <WorldPosition x="80.9899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.08">
+                                                                <Position>
+                                                                    <WorldPosition x="80.7899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.09">
+                                                                <Position>
+                                                                    <WorldPosition x="80.5999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.1">
+                                                                <Position>
+                                                                    <WorldPosition x="80.4099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.11">
+                                                                <Position>
+                                                                    <WorldPosition x="80.2099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.12">
+                                                                <Position>
+                                                                    <WorldPosition x="80.0199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.13">
+                                                                <Position>
+                                                                    <WorldPosition x="79.8299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.14">
+                                                                <Position>
+                                                                    <WorldPosition x="79.6299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.15">
+                                                                <Position>
+                                                                    <WorldPosition x="79.4399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.16">
+                                                                <Position>
+                                                                    <WorldPosition x="79.2499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.17">
+                                                                <Position>
+                                                                    <WorldPosition x="79.0599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.18">
+                                                                <Position>
+                                                                    <WorldPosition x="78.8599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.19">
+                                                                <Position>
+                                                                    <WorldPosition x="78.6699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.2">
+                                                                <Position>
+                                                                    <WorldPosition x="78.4799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.21">
+                                                                <Position>
+                                                                    <WorldPosition x="78.2799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.22">
+                                                                <Position>
+                                                                    <WorldPosition x="78.0899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.23">
+                                                                <Position>
+                                                                    <WorldPosition x="77.8999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.24">
+                                                                <Position>
+                                                                    <WorldPosition x="77.6999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.25">
+                                                                <Position>
+                                                                    <WorldPosition x="77.5099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.26">
+                                                                <Position>
+                                                                    <WorldPosition x="77.3199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.27">
+                                                                <Position>
+                                                                    <WorldPosition x="77.1299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.28">
+                                                                <Position>
+                                                                    <WorldPosition x="76.9299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.29">
+                                                                <Position>
+                                                                    <WorldPosition x="76.7399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.3">
+                                                                <Position>
+                                                                    <WorldPosition x="76.5499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.31">
+                                                                <Position>
+                                                                    <WorldPosition x="76.3499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.32">
+                                                                <Position>
+                                                                    <WorldPosition x="76.1599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.33">
+                                                                <Position>
+                                                                    <WorldPosition x="75.9699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.34">
+                                                                <Position>
+                                                                    <WorldPosition x="75.7699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.35">
+                                                                <Position>
+                                                                    <WorldPosition x="75.5799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.36">
+                                                                <Position>
+                                                                    <WorldPosition x="75.3899985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.37">
+                                                                <Position>
+                                                                    <WorldPosition x="75.1999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.38">
+                                                                <Position>
+                                                                    <WorldPosition x="74.9999985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.39">
+                                                                <Position>
+                                                                    <WorldPosition x="74.8099985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.4">
+                                                                <Position>
+                                                                    <WorldPosition x="74.6199985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.41">
+                                                                <Position>
+                                                                    <WorldPosition x="74.4299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.42">
+                                                                <Position>
+                                                                    <WorldPosition x="74.2299985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.43">
+                                                                <Position>
+                                                                    <WorldPosition x="74.0399985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.44">
+                                                                <Position>
+                                                                    <WorldPosition x="73.8499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.45">
+                                                                <Position>
+                                                                    <WorldPosition x="73.6499985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.46">
+                                                                <Position>
+                                                                    <WorldPosition x="73.4599985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.47">
+                                                                <Position>
+                                                                    <WorldPosition x="73.2699985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.48">
+                                                                <Position>
+                                                                    <WorldPosition x="73.0799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.49">
+                                                                <Position>
+                                                                    <WorldPosition x="72.8799985" y="1.84812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.5">
+                                                                <Position>
+                                                                    <WorldPosition x="72.6899985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.51">
+                                                                <Position>
+                                                                    <WorldPosition x="72.4999985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.52">
+                                                                <Position>
+                                                                    <WorldPosition x="72.2999985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.53">
+                                                                <Position>
+                                                                    <WorldPosition x="72.1099985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.54">
+                                                                <Position>
+                                                                    <WorldPosition x="71.9199985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.55">
+                                                                <Position>
+                                                                    <WorldPosition x="71.7299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.56">
+                                                                <Position>
+                                                                    <WorldPosition x="71.5299985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.57">
+                                                                <Position>
+                                                                    <WorldPosition x="71.3399985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.58">
+                                                                <Position>
+                                                                    <WorldPosition x="71.1499985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.59">
+                                                                <Position>
+                                                                    <WorldPosition x="70.9599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.6">
+                                                                <Position>
+                                                                    <WorldPosition x="70.7599985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.61">
+                                                                <Position>
+                                                                    <WorldPosition x="70.5699985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.62">
+                                                                <Position>
+                                                                    <WorldPosition x="70.3799985" y="1.85812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.63">
+                                                                <Position>
+                                                                    <WorldPosition x="70.17992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.64">
+                                                                <Position>
+                                                                    <WorldPosition x="69.98992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.65">
+                                                                <Position>
+                                                                    <WorldPosition x="69.79992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.66">
+                                                                <Position>
+                                                                    <WorldPosition x="69.60992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.67">
+                                                                <Position>
+                                                                    <WorldPosition x="69.40992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.68">
+                                                                <Position>
+                                                                    <WorldPosition x="69.21992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.69">
+                                                                <Position>
+                                                                    <WorldPosition x="69.02992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.7">
+                                                                <Position>
+                                                                    <WorldPosition x="68.83992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.71">
+                                                                <Position>
+                                                                    <WorldPosition x="68.63992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.72">
+                                                                <Position>
+                                                                    <WorldPosition x="68.44992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.73">
+                                                                <Position>
+                                                                    <WorldPosition x="68.25992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.74">
+                                                                <Position>
+                                                                    <WorldPosition x="68.06992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.75">
+                                                                <Position>
+                                                                    <WorldPosition x="67.86992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.76">
+                                                                <Position>
+                                                                    <WorldPosition x="67.67992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.77">
+                                                                <Position>
+                                                                    <WorldPosition x="67.48992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.78">
+                                                                <Position>
+                                                                    <WorldPosition x="67.29992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.79">
+                                                                <Position>
+                                                                    <WorldPosition x="67.09992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.8">
+                                                                <Position>
+                                                                    <WorldPosition x="66.90992071" y="1.846320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.81">
+                                                                <Position>
+                                                                    <WorldPosition x="66.71992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.82">
+                                                                <Position>
+                                                                    <WorldPosition x="66.52992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.83">
+                                                                <Position>
+                                                                    <WorldPosition x="66.32992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.84">
+                                                                <Position>
+                                                                    <WorldPosition x="66.13992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.85">
+                                                                <Position>
+                                                                    <WorldPosition x="65.94992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.86">
+                                                                <Position>
+                                                                    <WorldPosition x="65.75992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.87">
+                                                                <Position>
+                                                                    <WorldPosition x="65.55992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.88">
+                                                                <Position>
+                                                                    <WorldPosition x="65.36992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.89">
+                                                                <Position>
+                                                                    <WorldPosition x="65.17992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.9">
+                                                                <Position>
+                                                                    <WorldPosition x="64.98992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.91">
+                                                                <Position>
+                                                                    <WorldPosition x="64.78992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.92">
+                                                                <Position>
+                                                                    <WorldPosition x="64.59992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.93">
+                                                                <Position>
+                                                                    <WorldPosition x="64.40992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.94">
+                                                                <Position>
+                                                                    <WorldPosition x="64.21992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.95">
+                                                                <Position>
+                                                                    <WorldPosition x="64.01992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.96">
+                                                                <Position>
+                                                                    <WorldPosition x="63.82992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.97">
+                                                                <Position>
+                                                                    <WorldPosition x="63.63992071" y="1.856320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.98">
+                                                                <Position>
+                                                                    <WorldPosition x="63.44992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="1.99">
+                                                                <Position>
+                                                                    <WorldPosition x="63.24992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2">
+                                                                <Position>
+                                                                    <WorldPosition x="63.05992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.01">
+                                                                <Position>
+                                                                    <WorldPosition x="62.86992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.02">
+                                                                <Position>
+                                                                    <WorldPosition x="62.67992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.03">
+                                                                <Position>
+                                                                    <WorldPosition x="62.47992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.04">
+                                                                <Position>
+                                                                    <WorldPosition x="62.28992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.05">
+                                                                <Position>
+                                                                    <WorldPosition x="62.09992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.06">
+                                                                <Position>
+                                                                    <WorldPosition x="61.90992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.07">
+                                                                <Position>
+                                                                    <WorldPosition x="61.70992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.08">
+                                                                <Position>
+                                                                    <WorldPosition x="61.51992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.09">
+                                                                <Position>
+                                                                    <WorldPosition x="61.32992071" y="1.866320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.1">
+                                                                <Position>
+                                                                    <WorldPosition x="61.13992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.11">
+                                                                <Position>
+                                                                    <WorldPosition x="60.93992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.12">
+                                                                <Position>
+                                                                    <WorldPosition x="60.74992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.13">
+                                                                <Position>
+                                                                    <WorldPosition x="60.55992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.14">
+                                                                <Position>
+                                                                    <WorldPosition x="60.36992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.15">
+                                                                <Position>
+                                                                    <WorldPosition x="60.16992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.16">
+                                                                <Position>
+                                                                    <WorldPosition x="59.97992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.17">
+                                                                <Position>
+                                                                    <WorldPosition x="59.78992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.18">
+                                                                <Position>
+                                                                    <WorldPosition x="59.59992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.19">
+                                                                <Position>
+                                                                    <WorldPosition x="59.39992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.2">
+                                                                <Position>
+                                                                    <WorldPosition x="59.20992071" y="1.876320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.21">
+                                                                <Position>
+                                                                    <WorldPosition x="59.01992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.22">
+                                                                <Position>
+                                                                    <WorldPosition x="58.82992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.23">
+                                                                <Position>
+                                                                    <WorldPosition x="58.62992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.24">
+                                                                <Position>
+                                                                    <WorldPosition x="58.43992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.25">
+                                                                <Position>
+                                                                    <WorldPosition x="58.24992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.26">
+                                                                <Position>
+                                                                    <WorldPosition x="58.05992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.27">
+                                                                <Position>
+                                                                    <WorldPosition x="57.86992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.28">
+                                                                <Position>
+                                                                    <WorldPosition x="57.66992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.29">
+                                                                <Position>
+                                                                    <WorldPosition x="57.47992071" y="1.886320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.3">
+                                                                <Position>
+                                                                    <WorldPosition x="57.28992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.31">
+                                                                <Position>
+                                                                    <WorldPosition x="57.09992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.32">
+                                                                <Position>
+                                                                    <WorldPosition x="56.89992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.33">
+                                                                <Position>
+                                                                    <WorldPosition x="56.70992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.34">
+                                                                <Position>
+                                                                    <WorldPosition x="56.51992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.35">
+                                                                <Position>
+                                                                    <WorldPosition x="56.32992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.36">
+                                                                <Position>
+                                                                    <WorldPosition x="56.12992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.37">
+                                                                <Position>
+                                                                    <WorldPosition x="55.93992071" y="1.896320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.38">
+                                                                <Position>
+                                                                    <WorldPosition x="55.74992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.39">
+                                                                <Position>
+                                                                    <WorldPosition x="55.55992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.4">
+                                                                <Position>
+                                                                    <WorldPosition x="55.35992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.41">
+                                                                <Position>
+                                                                    <WorldPosition x="55.16992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.42">
+                                                                <Position>
+                                                                    <WorldPosition x="54.97992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.43">
+                                                                <Position>
+                                                                    <WorldPosition x="54.78992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.44">
+                                                                <Position>
+                                                                    <WorldPosition x="54.59992071" y="1.906320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.45">
+                                                                <Position>
+                                                                    <WorldPosition x="54.39992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.46">
+                                                                <Position>
+                                                                    <WorldPosition x="54.20992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.47">
+                                                                <Position>
+                                                                    <WorldPosition x="54.01992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.48">
+                                                                <Position>
+                                                                    <WorldPosition x="53.82992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.49">
+                                                                <Position>
+                                                                    <WorldPosition x="53.62992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.5">
+                                                                <Position>
+                                                                    <WorldPosition x="53.43992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.51">
+                                                                <Position>
+                                                                    <WorldPosition x="53.24992071" y="1.916320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.52">
+                                                                <Position>
+                                                                    <WorldPosition x="53.05992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.53">
+                                                                <Position>
+                                                                    <WorldPosition x="52.85992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.54">
+                                                                <Position>
+                                                                    <WorldPosition x="52.66992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.55">
+                                                                <Position>
+                                                                    <WorldPosition x="52.47992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.56">
+                                                                <Position>
+                                                                    <WorldPosition x="52.28992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.57">
+                                                                <Position>
+                                                                    <WorldPosition x="52.08992071" y="1.926320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.58">
+                                                                <Position>
+                                                                    <WorldPosition x="51.89992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.59">
+                                                                <Position>
+                                                                    <WorldPosition x="51.70992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.6">
+                                                                <Position>
+                                                                    <WorldPosition x="51.51992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.61">
+                                                                <Position>
+                                                                    <WorldPosition x="51.32992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.62">
+                                                                <Position>
+                                                                    <WorldPosition x="51.12992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.63">
+                                                                <Position>
+                                                                    <WorldPosition x="50.93992071" y="1.936320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.64">
+                                                                <Position>
+                                                                    <WorldPosition x="50.74992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.65">
+                                                                <Position>
+                                                                    <WorldPosition x="50.55992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.66">
+                                                                <Position>
+                                                                    <WorldPosition x="50.35992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.67">
+                                                                <Position>
+                                                                    <WorldPosition x="50.16992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.68">
+                                                                <Position>
+                                                                    <WorldPosition x="49.97992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.69">
+                                                                <Position>
+                                                                    <WorldPosition x="49.78992071" y="1.946320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.7">
+                                                                <Position>
+                                                                    <WorldPosition x="49.58992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.71">
+                                                                <Position>
+                                                                    <WorldPosition x="49.39992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.72">
+                                                                <Position>
+                                                                    <WorldPosition x="49.20992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.73">
+                                                                <Position>
+                                                                    <WorldPosition x="49.01992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.74">
+                                                                <Position>
+                                                                    <WorldPosition x="48.82992071" y="1.956320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.75">
+                                                                <Position>
+                                                                    <WorldPosition x="48.62992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.76">
+                                                                <Position>
+                                                                    <WorldPosition x="48.43992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.77">
+                                                                <Position>
+                                                                    <WorldPosition x="48.24992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.78">
+                                                                <Position>
+                                                                    <WorldPosition x="48.05992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.79">
+                                                                <Position>
+                                                                    <WorldPosition x="47.85992071" y="1.966320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.8">
+                                                                <Position>
+                                                                    <WorldPosition x="47.66992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.81">
+                                                                <Position>
+                                                                    <WorldPosition x="47.47992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.82">
+                                                                <Position>
+                                                                    <WorldPosition x="47.28992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.83">
+                                                                <Position>
+                                                                    <WorldPosition x="47.09992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.84">
+                                                                <Position>
+                                                                    <WorldPosition x="46.89992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.85">
+                                                                <Position>
+                                                                    <WorldPosition x="46.70992071" y="1.976320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.86">
+                                                                <Position>
+                                                                    <WorldPosition x="46.51992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.87">
+                                                                <Position>
+                                                                    <WorldPosition x="46.32992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.88">
+                                                                <Position>
+                                                                    <WorldPosition x="46.12992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.89">
+                                                                <Position>
+                                                                    <WorldPosition x="45.93992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.9">
+                                                                <Position>
+                                                                    <WorldPosition x="45.74992071" y="1.986320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.91">
+                                                                <Position>
+                                                                    <WorldPosition x="45.55992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.92">
+                                                                <Position>
+                                                                    <WorldPosition x="45.35992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.93">
+                                                                <Position>
+                                                                    <WorldPosition x="45.16992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.94">
+                                                                <Position>
+                                                                    <WorldPosition x="44.97992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.95">
+                                                                <Position>
+                                                                    <WorldPosition x="44.78992071" y="1.996320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.96">
+                                                                <Position>
+                                                                    <WorldPosition x="44.59992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.97">
+                                                                <Position>
+                                                                    <WorldPosition x="44.39992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.98">
+                                                                <Position>
+                                                                    <WorldPosition x="44.20992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="2.99">
+                                                                <Position>
+                                                                    <WorldPosition x="44.01992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3">
+                                                                <Position>
+                                                                    <WorldPosition x="43.82992071" y="2.006320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.01">
+                                                                <Position>
+                                                                    <WorldPosition x="43.62992071" y="2.016320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.02">
+                                                                <Position>
+                                                                    <WorldPosition x="43.43992071" y="2.016320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.03">
+                                                                <Position>
+                                                                    <WorldPosition x="43.24992071" y="2.016320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.04">
+                                                                <Position>
+                                                                    <WorldPosition x="43.05992071" y="2.016320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.05">
+                                                                <Position>
+                                                                    <WorldPosition x="42.85992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.06">
+                                                                <Position>
+                                                                    <WorldPosition x="42.66992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.07">
+                                                                <Position>
+                                                                    <WorldPosition x="42.47992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.08">
+                                                                <Position>
+                                                                    <WorldPosition x="42.28992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.09">
+                                                                <Position>
+                                                                    <WorldPosition x="42.09992071" y="2.026320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.1">
+                                                                <Position>
+                                                                    <WorldPosition x="41.89992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.11">
+                                                                <Position>
+                                                                    <WorldPosition x="41.70992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.12">
+                                                                <Position>
+                                                                    <WorldPosition x="41.51992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.13">
+                                                                <Position>
+                                                                    <WorldPosition x="41.32992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.14">
+                                                                <Position>
+                                                                    <WorldPosition x="41.12992071" y="2.036320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.15">
+                                                                <Position>
+                                                                    <WorldPosition x="40.93992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.16">
+                                                                <Position>
+                                                                    <WorldPosition x="40.74992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.17">
+                                                                <Position>
+                                                                    <WorldPosition x="40.55992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.18">
+                                                                <Position>
+                                                                    <WorldPosition x="40.35992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.19">
+                                                                <Position>
+                                                                    <WorldPosition x="40.16992071" y="2.046320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.2">
+                                                                <Position>
+                                                                    <WorldPosition x="39.97992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.21">
+                                                                <Position>
+                                                                    <WorldPosition x="39.78992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.22">
+                                                                <Position>
+                                                                    <WorldPosition x="39.58992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.23">
+                                                                <Position>
+                                                                    <WorldPosition x="39.39992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.24">
+                                                                <Position>
+                                                                    <WorldPosition x="39.20992071" y="2.056320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.25">
+                                                                <Position>
+                                                                    <WorldPosition x="39.01992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.26">
+                                                                <Position>
+                                                                    <WorldPosition x="38.82992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.27">
+                                                                <Position>
+                                                                    <WorldPosition x="38.62992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.28">
+                                                                <Position>
+                                                                    <WorldPosition x="38.43992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.29">
+                                                                <Position>
+                                                                    <WorldPosition x="38.24992071" y="2.066320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.3">
+                                                                <Position>
+                                                                    <WorldPosition x="38.05992071" y="2.076320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.31">
+                                                                <Position>
+                                                                    <WorldPosition x="37.85992071" y="2.076320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.32">
+                                                                <Position>
+                                                                    <WorldPosition x="37.66992071" y="2.076320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.33">
+                                                                <Position>
+                                                                    <WorldPosition x="37.47992071" y="2.076320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.34">
+                                                                <Position>
+                                                                    <WorldPosition x="37.28992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.35">
+                                                                <Position>
+                                                                    <WorldPosition x="37.08992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.36">
+                                                                <Position>
+                                                                    <WorldPosition x="36.89992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.37">
+                                                                <Position>
+                                                                    <WorldPosition x="36.70992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.38">
+                                                                <Position>
+                                                                    <WorldPosition x="36.51992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.39">
+                                                                <Position>
+                                                                    <WorldPosition x="36.31992071" y="2.086320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.4">
+                                                                <Position>
+                                                                    <WorldPosition x="36.12992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.41">
+                                                                <Position>
+                                                                    <WorldPosition x="35.93992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.42">
+                                                                <Position>
+                                                                    <WorldPosition x="35.74992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.43">
+                                                                <Position>
+                                                                    <WorldPosition x="35.54992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.44">
+                                                                <Position>
+                                                                    <WorldPosition x="35.35992071" y="2.096320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.45">
+                                                                <Position>
+                                                                    <WorldPosition x="35.16992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.46">
+                                                                <Position>
+                                                                    <WorldPosition x="34.97992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.47">
+                                                                <Position>
+                                                                    <WorldPosition x="34.78992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.48">
+                                                                <Position>
+                                                                    <WorldPosition x="34.58992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.49">
+                                                                <Position>
+                                                                    <WorldPosition x="34.39992071" y="2.106320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.5">
+                                                                <Position>
+                                                                    <WorldPosition x="34.20992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.51">
+                                                                <Position>
+                                                                    <WorldPosition x="34.01992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.52">
+                                                                <Position>
+                                                                    <WorldPosition x="33.81992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.53">
+                                                                <Position>
+                                                                    <WorldPosition x="33.62992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.54">
+                                                                <Position>
+                                                                    <WorldPosition x="33.43992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.55">
+                                                                <Position>
+                                                                    <WorldPosition x="33.24992071" y="2.116320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.56">
+                                                                <Position>
+                                                                    <WorldPosition x="33.04992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.57">
+                                                                <Position>
+                                                                    <WorldPosition x="32.85992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.58">
+                                                                <Position>
+                                                                    <WorldPosition x="32.66992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.59">
+                                                                <Position>
+                                                                    <WorldPosition x="32.47992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.6">
+                                                                <Position>
+                                                                    <WorldPosition x="32.27992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.61">
+                                                                <Position>
+                                                                    <WorldPosition x="32.08992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.62">
+                                                                <Position>
+                                                                    <WorldPosition x="31.89992071" y="2.126320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.63">
+                                                                <Position>
+                                                                    <WorldPosition x="31.70992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.64">
+                                                                <Position>
+                                                                    <WorldPosition x="31.50992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.65">
+                                                                <Position>
+                                                                    <WorldPosition x="31.31992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.66">
+                                                                <Position>
+                                                                    <WorldPosition x="31.12992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.67">
+                                                                <Position>
+                                                                    <WorldPosition x="30.93992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.68">
+                                                                <Position>
+                                                                    <WorldPosition x="30.73992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.69">
+                                                                <Position>
+                                                                    <WorldPosition x="30.54992071" y="2.136320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.7">
+                                                                <Position>
+                                                                    <WorldPosition x="30.35992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.71">
+                                                                <Position>
+                                                                    <WorldPosition x="30.16992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.72">
+                                                                <Position>
+                                                                    <WorldPosition x="29.96992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.73">
+                                                                <Position>
+                                                                    <WorldPosition x="29.77992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.74">
+                                                                <Position>
+                                                                    <WorldPosition x="29.58992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.75">
+                                                                <Position>
+                                                                    <WorldPosition x="29.39992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.76">
+                                                                <Position>
+                                                                    <WorldPosition x="29.19992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.77">
+                                                                <Position>
+                                                                    <WorldPosition x="29.00992071" y="2.146320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.78">
+                                                                <Position>
+                                                                    <WorldPosition x="28.81992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.79">
+                                                                <Position>
+                                                                    <WorldPosition x="28.62992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.8">
+                                                                <Position>
+                                                                    <WorldPosition x="28.42992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.81">
+                                                                <Position>
+                                                                    <WorldPosition x="28.23992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.82">
+                                                                <Position>
+                                                                    <WorldPosition x="28.04992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.83">
+                                                                <Position>
+                                                                    <WorldPosition x="27.85992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.84">
+                                                                <Position>
+                                                                    <WorldPosition x="27.65992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.85">
+                                                                <Position>
+                                                                    <WorldPosition x="27.46992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.86">
+                                                                <Position>
+                                                                    <WorldPosition x="27.27992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.87">
+                                                                <Position>
+                                                                    <WorldPosition x="27.08992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.88">
+                                                                <Position>
+                                                                    <WorldPosition x="26.88992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.89">
+                                                                <Position>
+                                                                    <WorldPosition x="26.69992071" y="2.156320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.9">
+                                                                <Position>
+                                                                    <WorldPosition x="26.50992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.91">
+                                                                <Position>
+                                                                    <WorldPosition x="26.31992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.92">
+                                                                <Position>
+                                                                    <WorldPosition x="26.11992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.93">
+                                                                <Position>
+                                                                    <WorldPosition x="25.92992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.94">
+                                                                <Position>
+                                                                    <WorldPosition x="25.73992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.95">
+                                                                <Position>
+                                                                    <WorldPosition x="25.53992071" y="2.166320975" z="0" h="3.13" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.96">
+                                                                <Position>
+                                                                    <WorldPosition x="25.3499985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.97">
+                                                                <Position>
+                                                                    <WorldPosition x="25.1599985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.98">
+                                                                <Position>
+                                                                    <WorldPosition x="24.9699985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="3.99">
+                                                                <Position>
+                                                                    <WorldPosition x="24.7699985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4">
+                                                                <Position>
+                                                                    <WorldPosition x="24.5799985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.01">
+                                                                <Position>
+                                                                    <WorldPosition x="24.3899985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.02">
+                                                                <Position>
+                                                                    <WorldPosition x="24.1999985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.03">
+                                                                <Position>
+                                                                    <WorldPosition x="23.9999985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.04">
+                                                                <Position>
+                                                                    <WorldPosition x="23.8099985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.05">
+                                                                <Position>
+                                                                    <WorldPosition x="23.6199985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.06">
+                                                                <Position>
+                                                                    <WorldPosition x="23.4299985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.07">
+                                                                <Position>
+                                                                    <WorldPosition x="23.2299985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.08">
+                                                                <Position>
+                                                                    <WorldPosition x="23.0399985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.09">
+                                                                <Position>
+                                                                    <WorldPosition x="22.8499985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.1">
+                                                                <Position>
+                                                                    <WorldPosition x="22.6599985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.11">
+                                                                <Position>
+                                                                    <WorldPosition x="22.4599985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.12">
+                                                                <Position>
+                                                                    <WorldPosition x="22.2699985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.13">
+                                                                <Position>
+                                                                    <WorldPosition x="22.0799985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.14">
+                                                                <Position>
+                                                                    <WorldPosition x="21.8799985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.15">
+                                                                <Position>
+                                                                    <WorldPosition x="21.6899985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.16">
+                                                                <Position>
+                                                                    <WorldPosition x="21.4999985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.17">
+                                                                <Position>
+                                                                    <WorldPosition x="21.3099985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.18">
+                                                                <Position>
+                                                                    <WorldPosition x="21.1099985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.19">
+                                                                <Position>
+                                                                    <WorldPosition x="20.9199985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.2">
+                                                                <Position>
+                                                                    <WorldPosition x="20.7299985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.21">
+                                                                <Position>
+                                                                    <WorldPosition x="20.5399985" y="2.17812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.22">
+                                                                <Position>
+                                                                    <WorldPosition x="20.3399985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.23">
+                                                                <Position>
+                                                                    <WorldPosition x="20.1499985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.24">
+                                                                <Position>
+                                                                    <WorldPosition x="19.9599985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.25">
+                                                                <Position>
+                                                                    <WorldPosition x="19.7599985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.26">
+                                                                <Position>
+                                                                    <WorldPosition x="19.5699985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.27">
+                                                                <Position>
+                                                                    <WorldPosition x="19.3799985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.28">
+                                                                <Position>
+                                                                    <WorldPosition x="19.1899985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.29">
+                                                                <Position>
+                                                                    <WorldPosition x="18.9899985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.3">
+                                                                <Position>
+                                                                    <WorldPosition x="18.7999985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.31">
+                                                                <Position>
+                                                                    <WorldPosition x="18.6099985" y="2.16812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.32">
+                                                                <Position>
+                                                                    <WorldPosition x="18.4199985" y="2.15812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.33">
+                                                                <Position>
+                                                                    <WorldPosition x="18.2199985" y="2.15812067" z="0" h="3.14" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.34">
+                                                                <Position>
+                                                                    <WorldPosition x="18.0299583" y="2.169920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.35">
+                                                                <Position>
+                                                                    <WorldPosition x="17.8399583" y="2.169920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.36">
+                                                                <Position>
+                                                                    <WorldPosition x="17.6399583" y="2.169920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.37">
+                                                                <Position>
+                                                                    <WorldPosition x="17.4499583" y="2.169920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.38">
+                                                                <Position>
+                                                                    <WorldPosition x="17.2599583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.39">
+                                                                <Position>
+                                                                    <WorldPosition x="17.0699583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.4">
+                                                                <Position>
+                                                                    <WorldPosition x="16.8699583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.41">
+                                                                <Position>
+                                                                    <WorldPosition x="16.6799583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.42">
+                                                                <Position>
+                                                                    <WorldPosition x="16.4899583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.43">
+                                                                <Position>
+                                                                    <WorldPosition x="16.2899583" y="2.159920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.44">
+                                                                <Position>
+                                                                    <WorldPosition x="16.0999583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.45">
+                                                                <Position>
+                                                                    <WorldPosition x="15.9099583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.46">
+                                                                <Position>
+                                                                    <WorldPosition x="15.7199583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.47">
+                                                                <Position>
+                                                                    <WorldPosition x="15.5199583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.48">
+                                                                <Position>
+                                                                    <WorldPosition x="15.3299583" y="2.149920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.49">
+                                                                <Position>
+                                                                    <WorldPosition x="15.1399583" y="2.139920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.5">
+                                                                <Position>
+                                                                    <WorldPosition x="14.9399583" y="2.139920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.51">
+                                                                <Position>
+                                                                    <WorldPosition x="14.7499583" y="2.139920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.52">
+                                                                <Position>
+                                                                    <WorldPosition x="14.5599583" y="2.139920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.53">
+                                                                <Position>
+                                                                    <WorldPosition x="14.3699583" y="2.129920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.54">
+                                                                <Position>
+                                                                    <WorldPosition x="14.1699583" y="2.129920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.55">
+                                                                <Position>
+                                                                    <WorldPosition x="13.9799583" y="2.129920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.56">
+                                                                <Position>
+                                                                    <WorldPosition x="13.7899583" y="2.129920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.57">
+                                                                <Position>
+                                                                    <WorldPosition x="13.5899583" y="2.119920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.58">
+                                                                <Position>
+                                                                    <WorldPosition x="13.3999583" y="2.119920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.59">
+                                                                <Position>
+                                                                    <WorldPosition x="13.2099583" y="2.119920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.6">
+                                                                <Position>
+                                                                    <WorldPosition x="13.0199583" y="2.109920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.61">
+                                                                <Position>
+                                                                    <WorldPosition x="12.8199583" y="2.109920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.62">
+                                                                <Position>
+                                                                    <WorldPosition x="12.6299583" y="2.109920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.63">
+                                                                <Position>
+                                                                    <WorldPosition x="12.4399583" y="2.099920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.64">
+                                                                <Position>
+                                                                    <WorldPosition x="12.2399583" y="2.099920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.65">
+                                                                <Position>
+                                                                    <WorldPosition x="12.0499583" y="2.099920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.66">
+                                                                <Position>
+                                                                    <WorldPosition x="11.8599583" y="2.099920552" z="0" h="3.15" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.67">
+                                                                <Position>
+                                                                    <WorldPosition x="11.6598001" y="2.101719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.68">
+                                                                <Position>
+                                                                    <WorldPosition x="11.4698001" y="2.101719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.69">
+                                                                <Position>
+                                                                    <WorldPosition x="11.2798001" y="2.101719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.7">
+                                                                <Position>
+                                                                    <WorldPosition x="11.0898001" y="2.091719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.71">
+                                                                <Position>
+                                                                    <WorldPosition x="10.8898001" y="2.091719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.72">
+                                                                <Position>
+                                                                    <WorldPosition x="10.6998001" y="2.081719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.73">
+                                                                <Position>
+                                                                    <WorldPosition x="10.5098001" y="2.081719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.74">
+                                                                <Position>
+                                                                    <WorldPosition x="10.3098001" y="2.081719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.75">
+                                                                <Position>
+                                                                    <WorldPosition x="10.1198001" y="2.071719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.76">
+                                                                <Position>
+                                                                    <WorldPosition x="9.929800096" y="2.071719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.77">
+                                                                <Position>
+                                                                    <WorldPosition x="9.739800096" y="2.071719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.78">
+                                                                <Position>
+                                                                    <WorldPosition x="9.539800096" y="2.061719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.79">
+                                                                <Position>
+                                                                    <WorldPosition x="9.349800096" y="2.061719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.8">
+                                                                <Position>
+                                                                    <WorldPosition x="9.159800096" y="2.051719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.81">
+                                                                <Position>
+                                                                    <WorldPosition x="8.959800096" y="2.051719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.82">
+                                                                <Position>
+                                                                    <WorldPosition x="8.769800096" y="2.051719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.83">
+                                                                <Position>
+                                                                    <WorldPosition x="8.579800096" y="2.041719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.84">
+                                                                <Position>
+                                                                    <WorldPosition x="8.379800096" y="2.041719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.85">
+                                                                <Position>
+                                                                    <WorldPosition x="8.189800096" y="2.031719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.86">
+                                                                <Position>
+                                                                    <WorldPosition x="7.999800096" y="2.031719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.87">
+                                                                <Position>
+                                                                    <WorldPosition x="7.809800096" y="2.021719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.88">
+                                                                <Position>
+                                                                    <WorldPosition x="7.609800096" y="2.021719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.89">
+                                                                <Position>
+                                                                    <WorldPosition x="7.419800096" y="2.021719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.9">
+                                                                <Position>
+                                                                    <WorldPosition x="7.229800096" y="2.011719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.91">
+                                                                <Position>
+                                                                    <WorldPosition x="7.029800096" y="2.011719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.92">
+                                                                <Position>
+                                                                    <WorldPosition x="6.839800096" y="2.001719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.93">
+                                                                <Position>
+                                                                    <WorldPosition x="6.649800096" y="2.001719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.94">
+                                                                <Position>
+                                                                    <WorldPosition x="6.449800096" y="1.991719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.95">
+                                                                <Position>
+                                                                    <WorldPosition x="6.259800096" y="1.991719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.96">
+                                                                <Position>
+                                                                    <WorldPosition x="6.069800096" y="1.981719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.97">
+                                                                <Position>
+                                                                    <WorldPosition x="5.869800096" y="1.981719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.98">
+                                                                <Position>
+                                                                    <WorldPosition x="5.679800096" y="1.971719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="4.99">
+                                                                <Position>
+                                                                    <WorldPosition x="5.489800096" y="1.971719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="5">
+                                                                <Position>
+                                                                    <WorldPosition x="5.299800096" y="1.961719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="5.01">
+                                                                <Position>
+                                                                    <WorldPosition x="5.099800096" y="1.961719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="5.02">
+                                                                <Position>
+                                                                    <WorldPosition x="4.909800096" y="1.951719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                            <Vertex time="5.03">
+                                                                <Position>
+                                                                    <WorldPosition x="4.719800096" y="1.951719442" z="0" h="3.16" p="0" r="0"/>
+                                                                </Position>
+                                                            </Vertex>
+                                                        </Polyline>
+                                                    </Shape>
+                                                </Trajectory>
+                                            </TrajectoryRef>
                                             <TimeReference>
                                                 <None/>
                                             </TimeReference>
@@ -5191,7 +5209,7 @@
                             </Action>
                             <StartTrigger>
                                 <ConditionGroup>
-                                    <Condition name="Conditional">
+                                    <Condition name="Conditional" delay="0" conditionEdge="rising">
                                         <ByValueCondition>
                                             <SimulationTimeCondition value="-1" rule="greaterThan"/>
                                         </ByValueCondition>
@@ -5203,7 +5221,7 @@
                 </ManeuverGroup>
             </Act>
         </Story>
-        <StopTrigger>
+    <StopTrigger>
             <ConditionGroup>
                 <Condition name="EndTime" delay="0" conditionEdge="rising">
                     <ByValueCondition>
@@ -5212,5 +5230,5 @@
                 </Condition>
             </ConditionGroup>
         </StopTrigger>
-    </Storyboard>
+  </Storyboard>
 </OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/PCM/VehicleModelsCatalog.xosc b/sim/contrib/examples/Configurations/PCM/VehicleModelsCatalog.xosc
index 7a014e58a775817c1cd10dfaad1f71933d161928..51cbe4bd15da1146b854badb0f8f3407f0fc1fe0 100644
--- a/sim/contrib/examples/Configurations/PCM/VehicleModelsCatalog.xosc
+++ b/sim/contrib/examples/Configurations/PCM/VehicleModelsCatalog.xosc
@@ -2,7 +2,7 @@
 <OpenSCENARIO>
     <FileHeader revMajor="1" revMinor="0" date="2020-01-01T00:00:00" description="openPASS vehicle models" author="openPASS"/>
     <Catalog name="VehicleCatalog">
-        <Vehicle name="Agent_0" vehicleCategory="car">
+        <Vehicle mass="1920" name="Agent_0" vehicleCategory="car">
             <Properties>
                 <Property name="AirDragCoefficient" value="0.3"/>
                 <Property name="AxleRatio" value="1.0"/>
@@ -10,7 +10,6 @@
                 <Property name="FrictionCoefficient" value="0.76"/>
                 <Property name="FrontSurface" value="1.0"/>
                 <Property name="GearRatio1" value="1.0"/>
-                <Property name="Mass" value="1920"/>
                 <Property name="MaximumEngineSpeed" value="10000.0"/>
                 <Property name="MaximumEngineTorque" value="500.0"/>
                 <Property name="MinimumEngineSpeed" value="1.0"/>
@@ -31,7 +30,7 @@
                 <RearAxle maxSteering="0" wheelDiameter="0.6" trackWidth="1.55" positionX="0" positionZ="0.3"/>
             </Axles>
         </Vehicle>
-        <Vehicle name="Agent_1" vehicleCategory="car">
+        <Vehicle mass="1200" name="Agent_1" vehicleCategory="car">
             <Properties>
                 <Property name="AirDragCoefficient" value="0.3"/>
                 <Property name="AxleRatio" value="1.0"/>
@@ -39,7 +38,6 @@
                 <Property name="FrictionCoefficient" value="0.76"/>
                 <Property name="FrontSurface" value="1.0"/>
                 <Property name="GearRatio1" value="1.0"/>
-                <Property name="Mass" value="1200"/>
                 <Property name="MaximumEngineSpeed" value="10000.0"/>
                 <Property name="MaximumEngineTorque" value="500.0"/>
                 <Property name="MinimumEngineSpeed" value="1.0"/>
diff --git a/sim/contrib/examples/Configurations/PCM/simulationConfig.xml b/sim/contrib/examples/Configurations/PCM/simulationConfig.xml
index 90d9b957b8e604aefd29243c8dcf7f9a9b71e02f..1d6840532dcd5c0335d17c854bd71ced86b885cc 100644
--- a/sim/contrib/examples/Configurations/PCM/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/PCM/simulationConfig.xml
@@ -1,7 +1,6 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <simulationConfig SchemaVersion="0.8.2">
-    <ProfilesCatalog>ProfilesCatalog.xml</ProfilesCatalog>
-    <Experiment>
+  <ProfilesCatalog>ProfilesCatalog.xml</ProfilesCatalog>
+  <Experiment>
         <ExperimentID>0</ExperimentID>
         <NumberOfInvocations>1</NumberOfInvocations>
         <RandomSeed>1000232</RandomSeed>
@@ -9,10 +8,10 @@
             <WorldLibrary>World_OSI</WorldLibrary>
         </Libraries>
     </Experiment>
-    <Scenario>
+  <Scenario>
         <OpenScenarioFile>Scenario.xosc</OpenScenarioFile>
     </Scenario>
-    <Environment>
+  <Environment>
         <TimeOfDays>
             <TimeOfDay Probability="1" Value="15"/>
         </TimeOfDays>
@@ -27,7 +26,7 @@
         </Weathers>
         <TrafficRules>Germany</TrafficRules>
     </Environment>
-    <Observations>
+  <Observations>
         <Observation>
             <Library>Observation_Log</Library>
             <Parameters>
@@ -43,11 +42,5 @@
             </Parameters>
         </Observation>
     </Observations>
-    <Spawners>
-        <Spawner>
-            <Library>SpawnerScenario</Library>
-            <Type>PreRun</Type>
-            <Priority>1</Priority>
-        </Spawner>
-    </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/Pedestrian_Trajectory/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/Pedestrian_Trajectory/ProfilesCatalog.xml
index ab42baaf9a9b57aa77b0526f821e06b80575a1a7..83035779791c76353b907f0215b9aecc2e9219e6 100644
--- a/sim/contrib/examples/Configurations/Pedestrian_Trajectory/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/Pedestrian_Trajectory/ProfilesCatalog.xml
@@ -1,39 +1,54 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 g12 2016" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 f01 2010" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 g12 2016" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 f01 2010" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper f56 2015" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3 i01 2013" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3 f30 2015" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper f56 2015" Probability="0.4"/>
+        <SystemProfile Name="BMW i3 i01 2013" Probability="0.3"/>
+        <SystemProfile Name="BMW 3 f30 2015" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck Hyundai Xcient p540 4axle 2013" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck Hyundai Xcient p540 4axle 2013" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus MAN Lions Coach c 2007" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus MAN Lions Coach c 2007" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="Pedestrian" Type="Static">
       <System>
@@ -43,43 +58,36 @@
       <VehicleModel>pedestrian_adult</VehicleModel>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 g12 2016">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 g12 2016">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 f01 2010">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 f01 2010">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper f56 2015">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper f56 2015">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3 i01 2013">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3 i01 2013">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3 f30 2015">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3 f30 2015">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck Hyundai Xcient p540 4axle 2013">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck Hyundai Xcient p540 4axle 2013">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus MAN Lions Coach c 2007">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus MAN Lions Coach c 2007">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/Pedestrian_Trajectory/Scenario.xosc b/sim/contrib/examples/Configurations/Pedestrian_Trajectory/Scenario.xosc
index 0f6df77d4297e3e60ac64fbac8fcd8893bd7e316..ed7e7f6e5160fbcb5b4bd825c160cc41930e1884 100644
--- a/sim/contrib/examples/Configurations/Pedestrian_Trajectory/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/Pedestrian_Trajectory/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,10 +36,24 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="Pedestrian">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="Pedestrian"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName=""/>
+      <ObjectController>
+        <Controller name="Pedestrian">
+          <Properties>
+            <Property name="AgentProfile" value="Pedestrian"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members>
@@ -61,7 +75,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="43.5"/>
                 </SpeedActionTarget>
@@ -82,7 +96,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="1.0"/>
                 </SpeedActionTarget>
@@ -104,22 +118,24 @@
                 <PrivateAction>
                   <RoutingAction>
                     <FollowTrajectoryAction>
-                      <Trajectory name="LaneChange" closed="false">
-                        <Shape>
-                          <Polyline>
-                            <Vertex time="0">
-                              <Position>
-                                <WorldPosition x="100" y="3" z="0" h="1.570796326" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                            <Vertex time="5">
-                              <Position>
-                                <WorldPosition x="100" y="8" z="0" h="1.570796326" p="0" r="0"/>
-                              </Position>
-                            </Vertex>
-                          </Polyline>
-                        </Shape>
-                      </Trajectory>
+                      <TrajectoryRef>
+                        <Trajectory name="LaneChange" closed="false">
+                          <Shape>
+                            <Polyline>
+                              <Vertex time="0">
+                                <Position>
+                                  <WorldPosition x="100" y="3" z="0" h="1.570796326" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                              <Vertex time="5">
+                                <Position>
+                                  <WorldPosition x="100" y="8" z="0" h="1.570796326" p="0" r="0"/>
+                                </Position>
+                              </Vertex>
+                            </Polyline>
+                          </Shape>
+                        </Trajectory>
+                      </TrajectoryRef>
                       <TimeReference>
                         <None/>
                       </TimeReference>
@@ -130,7 +146,7 @@
               </Action>
               <StartTrigger>
                 <ConditionGroup>
-                  <Condition name="Conditional">
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
                     <ByValueCondition>
                       <SimulationTimeCondition value="-1" rule="greaterThan"/>
                     </ByValueCondition>
diff --git a/sim/contrib/examples/Configurations/Sensor_Failure/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/Sensor_Failure/ProfilesCatalog.xml
index 55d4bc7ed6810ed9276ea443ad07f5ace55deb2e..950af230871b178bb7cbf81398249ba5431ae117 100644
--- a/sim/contrib/examples/Configurations/Sensor_Failure/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/Sensor_Failure/ProfilesCatalog.xml
@@ -1,26 +1,27 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="StandingStill" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 3 f30 2015" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 3 f30 2015" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_3" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 3 f30 2015">
-      <Model Name="car_bmw_3"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 3 f30 2015">
       <Components/>
       <Sensors>
-        <Sensor Id="0">
-          <Position Height="0.5" Lateral="0.0" Longitudinal="0.0" Name="Default" Pitch="0.0" Roll="0.0" Yaw="0.0"/>
+        <Sensor Id="0" Position="FrontWindow">
           <Profile Name="Standard" Type="Geometric2D"/>
         </Sensor>
       </Sensors>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="StandingStill">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/Sensor_Failure/Scenario.xosc b/sim/contrib/examples/Configurations/Sensor_Failure/Scenario.xosc
index 8f5c7c5ad9889f39065dc3e9eb84ebbb4521f165..222ca58dbc3868812bdefb2817e5aadb9027e96b 100644
--- a/sim/contrib/examples/Configurations/Sensor_Failure/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/Sensor_Failure/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,10 +36,24 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_3"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_3"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members>
@@ -61,7 +75,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="0"/>
                 </SpeedActionTarget>
@@ -80,7 +94,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="0.0"/>
                 </SpeedActionTarget>
@@ -90,6 +104,11 @@
         </Private>
       </Actions>
     </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/Sensor_Failure/simulationConfig.xml b/sim/contrib/examples/Configurations/Sensor_Failure/simulationConfig.xml
index 748f05f12f19abc1bd2362625cf16744a6ec3085..812c70ec8740a10c4c70ba19791affa5340d49c2 100644
--- a/sim/contrib/examples/Configurations/Sensor_Failure/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/Sensor_Failure/simulationConfig.xml
@@ -59,11 +59,5 @@
       </Parameters>
      </Observation>
   </Observations>
-  <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
-  </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/Sensor_Latency/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/Sensor_Latency/ProfilesCatalog.xml
index 8116f4c0f6913c52c5d7586aac9c27e60286e73f..5c42d414c2ddc55b3450687555843ec39a3c86eb 100644
--- a/sim/contrib/examples/Configurations/Sensor_Latency/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/Sensor_Latency/ProfilesCatalog.xml
@@ -1,39 +1,42 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="EgoAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="CarWithCircularSensor" Probability="1"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="CarWithCircularSensor" Probability="1"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="1"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="1"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="1"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="1"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="CarWithCircularSensor">
-      <Model Name="car_mini_cooper"/>
+  <SystemProfiles>
+    <SystemProfile Name="CarWithCircularSensor">
       <Components/>
       <Sensors>
-        <Sensor Id="0">
-          <Position Height="0.5" Lateral="0.0" Longitudinal="0.0" Name="Default" Pitch="0.0" Roll="0.0" Yaw="0.0"/>
+        <Sensor Id="0" Position="FrontWindow">
           <Profile Name="Standard" Type="Geometric2D"/>
         </Sensor>
       </Sensors>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/Sensor_Latency/Scenario.xosc b/sim/contrib/examples/Configurations/Sensor_Latency/Scenario.xosc
index bbed8eaf4503bb8f902f1263c13ef8aad2a8a731..098b11edc5864e6000ae01af8f749539ef2875b4 100644
--- a/sim/contrib/examples/Configurations/Sensor_Latency/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/Sensor_Latency/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,10 +36,24 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="EgoAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="EgoAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="Scenario">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Scenario">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members>
@@ -61,7 +75,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="43.5"/>
                 </SpeedActionTarget>
@@ -80,7 +94,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="43.5"/>
                 </SpeedActionTarget>
diff --git a/sim/contrib/examples/Configurations/Sensor_Latency/simulationConfig.xml b/sim/contrib/examples/Configurations/Sensor_Latency/simulationConfig.xml
index c67be17ac9d540ca06694baf9f8dd72087f94e32..63a5e0eff1c1e0638c9b43b6994fa964a5e396ea 100644
--- a/sim/contrib/examples/Configurations/Sensor_Latency/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/Sensor_Latency/simulationConfig.xml
@@ -45,11 +45,5 @@
       </Parameters>
     </Observation>
   </Observations>
-  <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
-  </Spawners>
+  <Spawners/>
 </simulationConfig>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/ProfilesCatalog.xml
index 53ab483f04afc6ea639eea6afdaeeb0aa3ecc33e..3717e7bfc2c2ae9195a2c3b52b847fef40caf3b5 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/SceneryConfiguration.xodr
index e6d3643b23035b48177674c48e58e646c30e15cf..0e4aacbfa0de50194c1a795bafe698e41f62978f 100755
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_EntryExit/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/ProfilesCatalog.xml
index b7f6fde9eb748fb3d3beecd54be8736f81fbb1ce..affba7ed033006c447773f75327f47fc4dca1a41 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/SceneryConfiguration.xodr
index e6d3643b23035b48177674c48e58e646c30e15cf..0e4aacbfa0de50194c1a795bafe698e41f62978f 100755
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_FullStream/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/ProfilesCatalog.xml
index 3be1c69496eeac7ca7ee266ee65c2db293521b3a..38cf3607410a443a0177e2de5c2cc8da246bcc06 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/SceneryConfiguration.xodr
index e6d3643b23035b48177674c48e58e646c30e15cf..0e4aacbfa0de50194c1a795bafe698e41f62978f 100755
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamBegin/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/ProfilesCatalog.xml
index 1c00f1c3a07c8b9d164e51fd1e7ef8e0c5f64272..382231677ab3625910d1158fbb274403b7d5c5cc 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/SceneryConfiguration.xodr
index e6d3643b23035b48177674c48e58e646c30e15cf..0e4aacbfa0de50194c1a795bafe698e41f62978f 100755
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_IncorrectStreamMid/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/ProfilesCatalog.xml
index 4367f6f7fa378d08586503c9df31d64579d8e94e..29f2720f28621bb198d73b5d2f886dc0b7e3d7ad 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
@@ -149,7 +157,7 @@
         <ListItem>
           <StringVector Key="Roads" Value="1,3"/>
           <IntVector Key="Lanes" Value="-5"/>
-          <Double Key="SStart" Value="741.0"/>
+          <Double Key="SStart" Value="4741.0"/>
         </ListItem>
       </List>
       <List Name="TrafficGroups">
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/SceneryConfiguration.xodr
index 21781dbc202bf3effab24dffd83392618fc13cc4..20bbc410e633828fb1fcdfa504a2fc2c5ac564a5 100755
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_RoadOverlap/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
@@ -537,4 +537,4 @@
       <laneLink from="-4" to="-4"/>
     </connection>
   </junction>
-</OpenDRIVE>
\ No newline at end of file
+</OpenDRIVE>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/ProfilesCatalog.xml
index 5de9333b717ecaabe484af7eabb165a8a7c153b0..ae1eff6e25aa14bea629e6c8ea1dabf9d15f85a9 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/SceneryConfiguration.xodr
index e6d3643b23035b48177674c48e58e646c30e15cf..0e4aacbfa0de50194c1a795bafe698e41f62978f 100755
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SimpleStream/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/ProfilesCatalog.xml
index ceb2e31fabe5f1dd7cdb2c63652f741c15e6f36a..c6ff2758eaa3535014ff6317146b328027c8493b 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/SceneryConfiguration.xodr
index e6d3643b23035b48177674c48e58e646c30e15cf..0e4aacbfa0de50194c1a795bafe698e41f62978f 100755
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_Highway_SingleRoad/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedLanes/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedLanes/ProfilesCatalog.xml
index 133d80f166f6deb63a7d1d4508c7c119280c0af0..eed0c5afbaf14c167fefce8533984ba727c5e11d 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedLanes/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedLanes/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedLanes/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedLanes/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedLanes/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedRange/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedRange/ProfilesCatalog.xml
index 1467bfbb780a5837ccd6edd6bb6d57eb1f47f65a..a59b68d22f54ece0d6d23e53424d1328cb16b0fa 100644
--- a/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedRange/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedRange/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedRange/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedRange/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerPreRun_SingleRoad_SpecifiedRange/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/ProfilesCatalog.xml
index f0bcbe900063c515fa40f8e9de968642f7a4af2d..fd6d1d0e58c1e80f97bfef461c67f1953876863c 100644
--- a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/SceneryConfiguration.xodr
index e6d3643b23035b48177674c48e58e646c30e15cf..0e4aacbfa0de50194c1a795bafe698e41f62978f 100755
--- a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_MultipleRoads/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
diff --git a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/ProfilesCatalog.xml
index c4387d95d958e880feb3144657330f2801ef19c8..1e0937103d5e63aed19d783169d2759b82c873b7 100644
--- a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/SceneryConfiguration.xodr b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/SceneryConfiguration.xodr
index e6d3643b23035b48177674c48e58e646c30e15cf..0e4aacbfa0de50194c1a795bafe698e41f62978f 100755
--- a/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/SceneryConfiguration.xodr
+++ b/sim/contrib/examples/Configurations/SpawnerRuntime_Highway_SingleRoad/SceneryConfiguration.xodr
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 <OpenDRIVE>
   <header revMajor="1" revMinor="1" name="Scenery HAF" version="1" date="Tue Sep 1 12:00:00 2020" north="2000.0" south="-2000.0" east="2000.0" west="-2000.0"/>
-  <road name="" length="1000.0" id="1" junction="-1">
+  <road name="" length="5000.0" id="1" junction="-1">
     <link>
       <successor elementType="junction" elementId="1"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="4000.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="0.0" hdg="1.570796" length="5000.0">
         <line/>
       </geometry>
     </planView>
@@ -57,7 +57,7 @@
           </lane>
         </right>
       </laneSection>
-      <laneSection s="740.0">
+      <laneSection s="4740.0">
         <left/>
         <center>
           <lane id="0" type="border" level="true">
@@ -230,13 +230,13 @@
     <signals>
     </signals>
   </road>
-  <road name="" length="1000.0" id="5" junction="-1">
+  <road name="" length="3995.0" id="5" junction="-1">
     <link>
       <predecessor elementType="junction" elementId="2"/>
     </link>
     <type s="0.0" type="motorway"/>
     <planView>
-      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="1000.0">
+      <geometry s="0.0" x="0.0" y="6005.0" hdg="1.570796" length="3995.0">
         <line/>
       </geometry>
     </planView>
diff --git a/sim/contrib/examples/Configurations/SpawnerRuntime_SingleRoad_SpecifiedLanes/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/SpawnerRuntime_SingleRoad_SpecifiedLanes/ProfilesCatalog.xml
index 24e3d3bb1f7fa944cb31caf7919f40b25f50cfd7..d75db1cf8742c7e9ff4060816f374abdeaccb39f 100644
--- a/sim/contrib/examples/Configurations/SpawnerRuntime_SingleRoad_SpecifiedLanes/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/SpawnerRuntime_SingleRoad_SpecifiedLanes/ProfilesCatalog.xml
@@ -1,78 +1,86 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="BMW 7 1" Probability="0.5"/>
-        <VehicleProfile Name="BMW 7 2" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="BMW 7 1" Probability="0.5"/>
+        <SystemProfile Name="BMW 7 2" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_bmw_7_1" Probability="0.5"/>
+        <VehicleModel Name="car_bmw_7_2" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="MiddleClassCarAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularTruck" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
-      <AgentProfile Name="BusAgent" Type="Dynamic">
+    <AgentProfile Name="BusAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="RegularBus" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Bus" Probability="1.0"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Bus" Probability="1.0"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="bus" Probability="1.0"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
@@ -121,7 +129,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
     </Profile>
     <Profile Name="HeavyVehicles">
       <List Name="AgentProfiles">
@@ -135,7 +143,7 @@
         </ListItem>
       </List>
       <UniformDistribution Key="Velocity" Max="10" Min="10"/>
-      <UniformDistribution Key="TGap" Max="10" Min="10"/>
+      <UniformDistribution Key="TGap" Max="2" Min="2"/>
       <Bool Key="RightLaneOnly" Value="true"/>
     </Profile>
   </ProfileGroup>
diff --git a/sim/contrib/examples/Configurations/SpawnerRuntime_SingleRoad_SpecifiedLanes/Scenario.xosc b/sim/contrib/examples/Configurations/SpawnerRuntime_SingleRoad_SpecifiedLanes/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..d2de82ba2774e6835d8dca62b99ef9afc65644ae
--- /dev/null
+++ b/sim/contrib/examples/Configurations/SpawnerRuntime_SingleRoad_SpecifiedLanes/Scenario.xosc
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="0" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <ParameterDeclarations>
+    <ParameterDeclaration name="OP_OSC_SchemaVersion" parameterType="string" value="0.4.0"/>
+  </ParameterDeclarations>
+  <CatalogLocations>
+    <VehicleCatalog>
+      <Directory path="Vehicles"/>
+    </VehicleCatalog>
+    <PedestrianCatalog>
+      <Directory path="Vehicles"/>
+    </PedestrianCatalog>
+    <ControllerCatalog>
+      <Directory path=""/>
+    </ControllerCatalog>
+    <ManeuverCatalog>
+      <Directory path=""/>
+    </ManeuverCatalog>
+    <MiscObjectCatalog>
+      <Directory path=""/>
+    </MiscObjectCatalog>
+    <EnvironmentCatalog>
+      <Directory path=""/>
+    </EnvironmentCatalog>
+    <TrajectoryCatalog>
+      <Directory path=""/>
+    </TrajectoryCatalog>
+    <RouteCatalog>
+      <Directory path=""/>
+    </RouteCatalog>
+  </CatalogLocations>
+  <RoadNetwork>
+    <LogicFile filepath="SceneryConfiguration.xodr"/>
+    <SceneGraphFile filepath=""/>
+  </RoadNetwork>
+  <Entities>
+    <EntitySelection name="ScenarioAgents">
+      <Members/>
+    </EntitySelection>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+      </Actions>
+    </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="30.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/StaticAgentCollision/ProfilesCatalog.xml b/sim/contrib/examples/Configurations/StaticAgentCollision/ProfilesCatalog.xml
index a543b8ff4166e7b3da19b34c0c88a76866881846..adf3f626b04a30f4cfcce80cdf0827b3cd56c4c2 100644
--- a/sim/contrib/examples/Configurations/StaticAgentCollision/ProfilesCatalog.xml
+++ b/sim/contrib/examples/Configurations/StaticAgentCollision/ProfilesCatalog.xml
@@ -1,4 +1,4 @@
-<Profiles SchemaVersion="0.4.8">
+<Profiles SchemaVersion="0.5">
   <AgentProfiles>
     <AgentProfile Name="EgoAgent" Type="Static">
       <System>
@@ -18,59 +18,61 @@
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Mini Cooper" Probability="0.4"/>
-        <VehicleProfile Name="BMW i3" Probability="0.3"/>
-        <VehicleProfile Name="BMW 3" Probability="0.3"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Mini Cooper" Probability="0.4"/>
+        <SystemProfile Name="BMW i3" Probability="0.3"/>
+        <SystemProfile Name="BMW 3" Probability="0.3"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="car_mini_cooper" Probability="0.4"/>
+        <VehicleModel Name="car_bmw_i3" Probability="0.3"/>
+        <VehicleModel Name="car_bmw_3" Probability="0.3"/>
+      </VehicleModels>
     </AgentProfile>
     <AgentProfile Name="TruckAgent" Type="Dynamic">
       <DriverProfiles>
         <DriverProfile Name="Regular" Probability="1.0"/>
       </DriverProfiles>
-      <VehicleProfiles>
-        <VehicleProfile Name="Truck" Probability="0.5"/>
-        <VehicleProfile Name="Bus" Probability="0.5"/>
-      </VehicleProfiles>
+      <SystemProfiles>
+        <SystemProfile Name="Truck" Probability="0.5"/>
+        <SystemProfile Name="Bus" Probability="0.5"/>
+      </SystemProfiles>
+      <VehicleModels>
+        <VehicleModel Name="truck" Probability="0.5"/>
+        <VehicleModel Name="bus" Probability="0.5"/>
+      </VehicleModels>
     </AgentProfile>
   </AgentProfiles>
-  <VehicleProfiles>
-    <VehicleProfile Name="BMW 7 1">
-      <Model Name="car_bmw_7_1"/>
+  <SystemProfiles>
+    <SystemProfile Name="BMW 7 1">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 7 2">
-      <Model Name="car_bmw_7_2"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 7 2">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Mini Cooper">
-      <Model Name="car_mini_cooper"/>
+    </SystemProfile>
+    <SystemProfile Name="Mini Cooper">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW i3">
-      <Model Name="car_bmw_i3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW i3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="BMW 3">
-      <Model Name="car_bmw_3"/>
+    </SystemProfile>
+    <SystemProfile Name="BMW 3">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Truck">
-      <Model Name="truck"/>
+    </SystemProfile>
+    <SystemProfile Name="Truck">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-    <VehicleProfile Name="Bus">
-      <Model Name="bus"/>
+    </SystemProfile>
+    <SystemProfile Name="Bus">
       <Components/>
       <Sensors/>
-    </VehicleProfile>
-  </VehicleProfiles>
+    </SystemProfile>
+  </SystemProfiles>
   <ProfileGroup Type="Driver">
     <Profile Name="Regular">
       <String Key="Type" Value="AlgorithmAgentFollowingDriverModel"/>
diff --git a/sim/contrib/examples/Configurations/TrafficJam/Scenario.xosc b/sim/contrib/examples/Configurations/TrafficJam/Scenario.xosc
index 3f446b57fa6376b7d4f03be33eae3a23bf856123..7d8436483d98a99a5b1b19cd67158354c9bb752d 100644
--- a/sim/contrib/examples/Configurations/TrafficJam/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/TrafficJam/Scenario.xosc
@@ -36,10 +36,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -66,37 +66,114 @@
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent1">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent1">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent2">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="LuxuryClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent2">
+          <Properties>
+            <Property name="AgentProfile" value="LuxuryClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent3">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent3">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent4">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="LuxuryClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent4">
+          <Properties>
+            <Property name="AgentProfile" value="LuxuryClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent5">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent5">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent6">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="LuxuryClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent6">
+          <Properties>
+            <Property name="AgentProfile" value="LuxuryClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent7">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="LuxuryClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_bmw_7_1"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent7">
+          <Properties>
+            <Property name="AgentProfile" value="LuxuryClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent8">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent8">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent9">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent9">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <ScenarioObject name="ScenarioAgent10">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="ScenarioAgent10">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members>
@@ -127,7 +204,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="43.5"/>
                 </SpeedActionTarget>
@@ -146,7 +223,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent1_Velocity"/>
                 </SpeedActionTarget>
@@ -165,7 +242,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent2_Velocity"/>
                 </SpeedActionTarget>
@@ -184,7 +261,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent3_Velocity"/>
                 </SpeedActionTarget>
@@ -203,7 +280,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent4_Velocity"/>
                 </SpeedActionTarget>
@@ -222,7 +299,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent5_Velocity"/>
                 </SpeedActionTarget>
@@ -241,7 +318,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent6_Velocity"/>
                 </SpeedActionTarget>
@@ -260,7 +337,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent7_Velocity"/>
                 </SpeedActionTarget>
@@ -279,7 +356,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent8_Velocity"/>
                 </SpeedActionTarget>
@@ -298,7 +375,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent9_Velocity"/>
                 </SpeedActionTarget>
@@ -317,7 +394,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.5" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.5" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="$Agent10_Velocity"/>
                 </SpeedActionTarget>
@@ -327,6 +404,11 @@
         </Private>
       </Actions>
     </Init>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/Configurations/TrafficJam/simulationConfig.xml b/sim/contrib/examples/Configurations/TrafficJam/simulationConfig.xml
index 5bd026f99af93474f1c0e8605badc2406649b289..3d8daad03bdb43a0b95fded2c0a6220d59de1af9 100644
--- a/sim/contrib/examples/Configurations/TrafficJam/simulationConfig.xml
+++ b/sim/contrib/examples/Configurations/TrafficJam/simulationConfig.xml
@@ -43,11 +43,6 @@
     </Observation>
   </Observations>
   <Spawners>
-    <Spawner>
-      <Library>SpawnerScenario</Library>
-      <Type>PreRun</Type>
-      <Priority>1</Priority>
-    </Spawner>
     <Spawner>
       <Library>SpawnerPreRunCommon</Library>
       <Type>PreRun</Type>
diff --git a/sim/contrib/examples/Configurations/TrafficLight/Scenario.xosc b/sim/contrib/examples/Configurations/TrafficLight/Scenario.xosc
index a2d52f7aa43a8c139c7cf4202f2f54c34184a391..af7aee8c70524e80c208f0f974bfe23b3e0836fb 100644
--- a/sim/contrib/examples/Configurations/TrafficLight/Scenario.xosc
+++ b/sim/contrib/examples/Configurations/TrafficLight/Scenario.xosc
@@ -6,10 +6,10 @@
   </ParameterDeclarations>
   <CatalogLocations>
     <VehicleCatalog>
-      <Directory path="VehicleModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </VehicleCatalog>
     <PedestrianCatalog>
-      <Directory path="PedestrianModelsCatalog.xosc"/>
+      <Directory path="Vehicles"/>
     </PedestrianCatalog>
     <ControllerCatalog>
       <Directory path=""/>
@@ -36,23 +36,30 @@
     <TrafficSignals>
       <TrafficSignalController name="">
         <Phase duration="3" name="Phase1">
-          <TrafficSignalState state="green" trafficSignalId="1" />
+          <TrafficSignalState state="green" trafficSignalId="1"/>
         </Phase>
         <Phase duration="3" name="Phase2">
-          <TrafficSignalState state="yellow" trafficSignalId="1" />
+          <TrafficSignalState state="yellow" trafficSignalId="1"/>
         </Phase>
         <Phase duration="3" name="Phase3">
-          <TrafficSignalState state="red" trafficSignalId="1" />
+          <TrafficSignalState state="red" trafficSignalId="1"/>
         </Phase>
         <Phase duration="3" name="Phase4">
-          <TrafficSignalState state="red yellow" trafficSignalId="1" />
+          <TrafficSignalState state="red yellow" trafficSignalId="1"/>
         </Phase>
       </TrafficSignalController>
     </TrafficSignals>
   </RoadNetwork>
   <Entities>
     <ScenarioObject name="Ego">
-      <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"/>
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
     </ScenarioObject>
     <EntitySelection name="ScenarioAgents">
       <Members/>
@@ -72,7 +79,7 @@
           <PrivateAction>
             <LongitudinalAction>
               <SpeedAction>
-                <SpeedActionDynamics dynamicsShape="linear" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
                 <SpeedActionTarget>
                   <AbsoluteTargetSpeed value="5.0"/>
                 </SpeedActionTarget>
@@ -82,7 +89,11 @@
         </Private>
       </Actions>
     </Init>
-    <Story/>
+    <Story name="">
+      <Act name="">
+        <ManeuverGroup name="" maximumExecutionCount="1"/>
+      </Act>
+    </Story>
     <StopTrigger>
       <ConditionGroup>
         <Condition name="EndTime" delay="0" conditionEdge="rising">
diff --git a/sim/contrib/examples/PCM_Re-Simulation/result_pcm/1000232/0-0-0/Default/configs/VehicleModelsCatalog.xosc b/sim/contrib/examples/PCM_Re-Simulation/result_pcm/1000232/0-0-0/Default/configs/VehicleModelsCatalog.xosc
index 7a014e58a775817c1cd10dfaad1f71933d161928..51cbe4bd15da1146b854badb0f8f3407f0fc1fe0 100644
--- a/sim/contrib/examples/PCM_Re-Simulation/result_pcm/1000232/0-0-0/Default/configs/VehicleModelsCatalog.xosc
+++ b/sim/contrib/examples/PCM_Re-Simulation/result_pcm/1000232/0-0-0/Default/configs/VehicleModelsCatalog.xosc
@@ -2,7 +2,7 @@
 <OpenSCENARIO>
     <FileHeader revMajor="1" revMinor="0" date="2020-01-01T00:00:00" description="openPASS vehicle models" author="openPASS"/>
     <Catalog name="VehicleCatalog">
-        <Vehicle name="Agent_0" vehicleCategory="car">
+        <Vehicle mass="1920" name="Agent_0" vehicleCategory="car">
             <Properties>
                 <Property name="AirDragCoefficient" value="0.3"/>
                 <Property name="AxleRatio" value="1.0"/>
@@ -10,7 +10,6 @@
                 <Property name="FrictionCoefficient" value="0.76"/>
                 <Property name="FrontSurface" value="1.0"/>
                 <Property name="GearRatio1" value="1.0"/>
-                <Property name="Mass" value="1920"/>
                 <Property name="MaximumEngineSpeed" value="10000.0"/>
                 <Property name="MaximumEngineTorque" value="500.0"/>
                 <Property name="MinimumEngineSpeed" value="1.0"/>
@@ -31,7 +30,7 @@
                 <RearAxle maxSteering="0" wheelDiameter="0.6" trackWidth="1.55" positionX="0" positionZ="0.3"/>
             </Axles>
         </Vehicle>
-        <Vehicle name="Agent_1" vehicleCategory="car">
+        <Vehicle mass="1200" name="Agent_1" vehicleCategory="car">
             <Properties>
                 <Property name="AirDragCoefficient" value="0.3"/>
                 <Property name="AxleRatio" value="1.0"/>
@@ -39,7 +38,6 @@
                 <Property name="FrictionCoefficient" value="0.76"/>
                 <Property name="FrontSurface" value="1.0"/>
                 <Property name="GearRatio1" value="1.0"/>
-                <Property name="Mass" value="1200"/>
                 <Property name="MaximumEngineSpeed" value="10000.0"/>
                 <Property name="MaximumEngineTorque" value="500.0"/>
                 <Property name="MinimumEngineSpeed" value="1.0"/>
diff --git a/sim/deps/openScenarioEngine b/sim/deps/openScenarioEngine
new file mode 160000
index 0000000000000000000000000000000000000000..b7df4a3b5b77c028992485d68632b098914cc368
--- /dev/null
+++ b/sim/deps/openScenarioEngine
@@ -0,0 +1 @@
+Subproject commit b7df4a3b5b77c028992485d68632b098914cc368
diff --git a/sim/deps/scenario_api b/sim/deps/scenario_api
new file mode 160000
index 0000000000000000000000000000000000000000..ffa73fd09893ca80567cd2525fcc5ca9bf00e5c1
--- /dev/null
+++ b/sim/deps/scenario_api
@@ -0,0 +1 @@
+Subproject commit ffa73fd09893ca80567cd2525fcc5ca9bf00e5c1
diff --git a/sim/deps/units/include/units.h b/sim/deps/units/include/units.h
new file mode 100644
index 0000000000000000000000000000000000000000..42f6f1d6e3226efb54dd0e57174d13e415df07ce
--- /dev/null
+++ b/sim/deps/units/include/units.h
@@ -0,0 +1,4882 @@
+//--------------------------------------------------------------------------------------------------
+//
+//	Units: A compile-time c++14 unit conversion library with no dependencies
+//
+//--------------------------------------------------------------------------------------------------
+//
+// The MIT License (MIT)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+// and associated documentation files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//--------------------------------------------------------------------------------------------------
+//
+// Copyright (c) 2016 Nic Holthaus
+//
+//--------------------------------------------------------------------------------------------------
+//
+// ATTRIBUTION:
+// Parts of this work have been adapted from:
+// http://stackoverflow.com/questions/35069778/create-comparison-trait-for-template-classes-whose-parameters-are-in-a-different
+// http://stackoverflow.com/questions/28253399/check-traits-for-all-variadic-template-arguments/28253503
+// http://stackoverflow.com/questions/36321295/rational-approximation-of-square-root-of-stdratio-at-compile-time?noredirect=1#comment60266601_36321295
+//
+//--------------------------------------------------------------------------------------------------
+//
+/// @file	units.h
+/// @brief	Complete implementation of `units` - a compile-time, header-only, unit conversion
+///			library built on c++14 with no dependencies.
+//
+//--------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#ifndef units_h__
+#define units_h__
+
+#ifdef _MSC_VER
+#	pragma push_macro("pascal")
+#	undef pascal
+#	if _MSC_VER <= 1800
+#		define _ALLOW_KEYWORD_MACROS
+#		pragma warning(push)
+#		pragma warning(disable : 4520)
+#		pragma push_macro("constexpr")
+#		define constexpr /*constexpr*/
+#		pragma push_macro("noexcept")
+#		define noexcept throw()
+#	endif // _MSC_VER < 1800
+#endif // _MSC_VER
+
+#if !defined(_MSC_VER) || _MSC_VER > 1800
+#   define UNIT_HAS_LITERAL_SUPPORT
+#   define UNIT_HAS_VARIADIC_TEMPLATE_SUPPORT
+#endif
+
+#ifndef UNIT_LIB_DEFAULT_TYPE
+#   define UNIT_LIB_DEFAULT_TYPE double
+#endif
+
+//--------------------
+//	INCLUDES
+//--------------------
+
+#include <chrono>
+#include <cstddef>
+#include <ratio>
+#include <type_traits>
+#include <cstdint>
+#include <cmath>
+#include <limits>
+
+#if !defined(UNIT_LIB_DISABLE_IOSTREAM)
+	#include <iostream>
+	#include <string>
+	#include <locale>
+
+	//------------------------------
+	//	STRING FORMATTER
+	//------------------------------
+
+	namespace units
+	{
+		namespace detail
+		{
+			template <typename T> std::string to_string(const T& t)
+			{
+				std::string str{ std::to_string(t) };
+				int offset{ 1 };
+
+				// remove trailing decimal points for integer value units. Locale aware!
+				struct lconv * lc;
+				lc = localeconv();
+				char decimalPoint = *lc->decimal_point;
+				if (str.find_last_not_of('0') == str.find(decimalPoint)) { offset = 0; }
+				str.erase(str.find_last_not_of('0') + offset, std::string::npos);
+				return str;
+			}
+		}
+	}
+#endif
+
+namespace units
+{
+	template<typename T> inline constexpr const char* name(const T&);
+	template<typename T> inline constexpr const char* abbreviation(const T&);
+}
+
+//------------------------------
+//	MACROS
+//------------------------------
+
+/**
+ * @def			UNIT_ADD_UNIT_TAGS(namespaceName,nameSingular, namePlural, abbreviation, definition)
+ * @brief		Helper macro for generating the boiler-plate code generating the tags of a new unit.
+ * @details		The macro generates singular, plural, and abbreviated forms
+ *				of the unit definition (e.g. `meter`, `meters`, and `m`), as aliases for the
+ *				unit tag.
+ * @param		namespaceName namespace in which the new units will be encapsulated.
+ * @param		nameSingular singular version of the unit name, e.g. 'meter'
+ * @param		namePlural - plural version of the unit name, e.g. 'meters'
+ * @param		abbreviation - abbreviated unit name, e.g. 'm'
+ * @param		definition - the variadic parameter is used for the definition of the unit
+ *				(e.g. `unit<std::ratio<1>, units::category::length_unit>`)
+ * @note		a variadic template is used for the definition to allow templates with
+ *				commas to be easily expanded. All the variadic 'arguments' should together
+ *				comprise the unit definition.
+ */
+#define UNIT_ADD_UNIT_TAGS(namespaceName,nameSingular, namePlural, abbreviation, /*definition*/...)\
+	namespace namespaceName\
+	{\
+	/** @name Units (full names plural) */ /** @{ */ typedef __VA_ARGS__ namePlural; /** @} */\
+	/** @name Units (full names singular) */ /** @{ */ typedef namePlural nameSingular; /** @} */\
+	/** @name Units (abbreviated) */ /** @{ */ typedef namePlural abbreviation; /** @} */\
+	}
+
+/**
+ * @def			UNIT_ADD_UNIT_DEFINITION(namespaceName,nameSingular)
+ * @brief		Macro for generating the boiler-plate code for the unit_t type definition.
+ * @details		The macro generates the definition of the unit container types, e.g. `meter_t`
+ * @param		namespaceName namespace in which the new units will be encapsulated.
+ * @param		nameSingular singular version of the unit name, e.g. 'meter'
+ */
+#define UNIT_ADD_UNIT_DEFINITION(namespaceName,nameSingular)\
+	namespace namespaceName\
+	{\
+		/** @name Unit Containers */ /** @{ */ typedef unit_t<nameSingular> nameSingular ## _t; /** @} */\
+	}
+
+/**
+ * @def			UNIT_ADD_CUSTOM_TYPE_UNIT_DEFINITION(namespaceName,nameSingular,underlyingType)
+ * @brief		Macro for generating the boiler-plate code for a unit_t type definition with a non-default underlying type.
+ * @details		The macro generates the definition of the unit container types, e.g. `meter_t`
+ * @param		namespaceName namespace in which the new units will be encapsulated.
+ * @param		nameSingular singular version of the unit name, e.g. 'meter'
+ * @param		underlyingType the underlying type
+ */
+#define UNIT_ADD_CUSTOM_TYPE_UNIT_DEFINITION(namespaceName,nameSingular, underlyingType)\
+	namespace namespaceName\
+	{\
+	/** @name Unit Containers */ /** @{ */ typedef unit_t<nameSingular,underlyingType> nameSingular ## _t; /** @} */\
+	}
+/**
+ * @def			UNIT_ADD_IO(namespaceName,nameSingular, abbreviation)
+ * @brief		Macro for generating the boiler-plate code needed for I/O for a new unit.
+ * @details		The macro generates the code to insert units into an ostream. It
+ *				prints both the value and abbreviation of the unit when invoked.
+ * @param		namespaceName namespace in which the new units will be encapsulated.
+ * @param		nameSingular singular version of the unit name, e.g. 'meter'
+ * @param		abbrev - abbreviated unit name, e.g. 'm'
+ * @note		When UNIT_LIB_DISABLE_IOSTREAM is defined, the macro does not generate any code
+ */
+#if defined(UNIT_LIB_DISABLE_IOSTREAM)
+	#define UNIT_ADD_IO(namespaceName, nameSingular, abbrev)
+#else
+	#define UNIT_ADD_IO(namespaceName, nameSingular, abbrev)\
+	namespace namespaceName\
+	{\
+		inline std::ostream& operator<<(std::ostream& os, const nameSingular ## _t& obj) \
+		{\
+			os << obj() << " "#abbrev; return os; \
+		}\
+		inline std::string to_string(const nameSingular ## _t& obj)\
+		{\
+			return units::detail::to_string(obj()) + std::string(" "#abbrev);\
+		}\
+	}
+#endif
+
+ /**
+  * @def		UNIT_ADD_NAME(namespaceName,nameSingular,abbreviation)
+  * @brief		Macro for generating constexpr names/abbreviations for units.
+  * @details	The macro generates names for units. E.g. name() of 1_m would be "meter", and
+  *				abbreviation would be "m".
+  * @param		namespaceName namespace in which the new units will be encapsulated. All literal values
+  *				are placed in the `units::literals` namespace.
+  * @param		nameSingular singular version of the unit name, e.g. 'meter'
+  * @param		abbreviation - abbreviated unit name, e.g. 'm'
+  */
+#define UNIT_ADD_NAME(namespaceName, nameSingular, abbrev)\
+template<> inline constexpr const char* name(const namespaceName::nameSingular ## _t&)\
+{\
+	return #nameSingular;\
+}\
+template<> inline constexpr const char* abbreviation(const namespaceName::nameSingular ## _t&)\
+{\
+	return #abbrev;\
+}
+
+/**
+ * @def			UNIT_ADD_LITERALS(namespaceName,nameSingular,abbreviation)
+ * @brief		Macro for generating user-defined literals for units.
+ * @details		The macro generates user-defined literals for units. A literal suffix is created
+ *				using the abbreviation (e.g. `10.0_m`).
+ * @param		namespaceName namespace in which the new units will be encapsulated. All literal values
+ *				are placed in the `units::literals` namespace.
+ * @param		nameSingular singular version of the unit name, e.g. 'meter'
+ * @param		abbreviation - abbreviated unit name, e.g. 'm'
+ * @note		When UNIT_HAS_LITERAL_SUPPORT is not defined, the macro does not generate any code
+ */
+#if defined(UNIT_HAS_LITERAL_SUPPORT)
+	#define UNIT_ADD_LITERALS(namespaceName, nameSingular, abbreviation)\
+	namespace literals\
+	{\
+		inline constexpr namespaceName::nameSingular ## _t operator""_ ## abbreviation(long double d)\
+		{\
+			return namespaceName::nameSingular ## _t(static_cast<namespaceName::nameSingular ## _t::underlying_type>(d));\
+		}\
+		inline constexpr namespaceName::nameSingular ## _t operator""_ ## abbreviation (unsigned long long d)\
+		{\
+			return namespaceName::nameSingular ## _t(static_cast<namespaceName::nameSingular ## _t::underlying_type>(d));\
+		}\
+	}
+#else
+	#define UNIT_ADD_LITERALS(namespaceName, nameSingular, abbreviation)
+#endif
+
+/**
+ * @def			UNIT_ADD(namespaceName,nameSingular, namePlural, abbreviation, definition)
+ * @brief		Macro for generating the boiler-plate code needed for a new unit.
+ * @details		The macro generates singular, plural, and abbreviated forms
+ *				of the unit definition (e.g. `meter`, `meters`, and `m`), as well as the
+ *				appropriately named unit container (e.g. `meter_t`). A literal suffix is created
+ *				using the abbreviation (e.g. `10.0_m`). It also defines a class-specific
+ *				cout function which prints both the value and abbreviation of the unit when invoked.
+ * @param		namespaceName namespace in which the new units will be encapsulated. All literal values
+ *				are placed in the `units::literals` namespace.
+ * @param		nameSingular singular version of the unit name, e.g. 'meter'
+ * @param		namePlural - plural version of the unit name, e.g. 'meters'
+ * @param		abbreviation - abbreviated unit name, e.g. 'm'
+ * @param		definition - the variadic parameter is used for the definition of the unit
+ *				(e.g. `unit<std::ratio<1>, units::category::length_unit>`)
+ * @note		a variadic template is used for the definition to allow templates with
+ *				commas to be easily expanded. All the variadic 'arguments' should together
+ *				comprise the unit definition.
+ */
+#define UNIT_ADD(namespaceName, nameSingular, namePlural, abbreviation, /*definition*/...)\
+	UNIT_ADD_UNIT_TAGS(namespaceName,nameSingular, namePlural, abbreviation, __VA_ARGS__)\
+	UNIT_ADD_UNIT_DEFINITION(namespaceName,nameSingular)\
+	UNIT_ADD_NAME(namespaceName,nameSingular, abbreviation)\
+	UNIT_ADD_IO(namespaceName,nameSingular, abbreviation)\
+	UNIT_ADD_LITERALS(namespaceName,nameSingular, abbreviation)
+
+/**
+ * @def			UNIT_ADD_WITH_CUSTOM_TYPE(namespaceName,nameSingular, namePlural, abbreviation, underlyingType, definition)
+ * @brief		Macro for generating the boiler-plate code needed for a new unit with a non-default underlying type.
+ * @details		The macro generates singular, plural, and abbreviated forms
+ *				of the unit definition (e.g. `meter`, `meters`, and `m`), as well as the
+ *				appropriately named unit container (e.g. `meter_t`). A literal suffix is created
+ *				using the abbreviation (e.g. `10.0_m`). It also defines a class-specific
+ *				cout function which prints both the value and abbreviation of the unit when invoked.
+ * @param		namespaceName namespace in which the new units will be encapsulated. All literal values
+ *				are placed in the `units::literals` namespace.
+ * @param		nameSingular singular version of the unit name, e.g. 'meter'
+ * @param		namePlural - plural version of the unit name, e.g. 'meters'
+ * @param		abbreviation - abbreviated unit name, e.g. 'm'
+ * @param		underlyingType - the underlying type, e.g. 'int' or 'float'
+ * @param		definition - the variadic parameter is used for the definition of the unit
+ *				(e.g. `unit<std::ratio<1>, units::category::length_unit>`)
+ * @note		a variadic template is used for the definition to allow templates with
+ *				commas to be easily expanded. All the variadic 'arguments' should together
+ *				comprise the unit definition.
+ */
+#define UNIT_ADD_WITH_CUSTOM_TYPE(namespaceName, nameSingular, namePlural, abbreviation, underlyingType, /*definition*/...)\
+	UNIT_ADD_UNIT_TAGS(namespaceName,nameSingular, namePlural, abbreviation, __VA_ARGS__)\
+	UNIT_ADD_CUSTOM_TYPE_UNIT_DEFINITION(namespaceName,nameSingular,underlyingType)\
+	UNIT_ADD_IO(namespaceName,nameSingular, abbreviation)\
+	UNIT_ADD_LITERALS(namespaceName,nameSingular, abbreviation)
+
+/**
+ * @def			UNIT_ADD_DECIBEL(namespaceName, nameSingular, abbreviation)
+ * @brief		Macro to create decibel container and literals for an existing unit type.
+ * @details		This macro generates the decibel unit container, cout overload, and literal definitions.
+ * @param		namespaceName namespace in which the new units will be encapsulated. All literal values
+ *				are placed in the `units::literals` namespace.
+ * @param		nameSingular singular version of the base unit name, e.g. 'watt'
+ * @param		abbreviation - abbreviated decibel unit name, e.g. 'dBW'
+ */
+#define UNIT_ADD_DECIBEL(namespaceName, nameSingular, abbreviation)\
+	namespace namespaceName\
+	{\
+		/** @name Unit Containers */ /** @{ */ typedef unit_t<nameSingular, UNIT_LIB_DEFAULT_TYPE, units::decibel_scale> abbreviation ## _t; /** @} */\
+	}\
+	UNIT_ADD_IO(namespaceName, abbreviation, abbreviation)\
+	UNIT_ADD_LITERALS(namespaceName, abbreviation, abbreviation)
+
+/**
+ * @def			UNIT_ADD_CATEGORY_TRAIT(unitCategory, baseUnit)
+ * @brief		Macro to create the `is_category_unit` type trait.
+ * @details		This trait allows users to test whether a given type matches
+ *				an intended category. This macro comprises all the boiler-plate
+ *				code necessary to do so.
+ * @param		unitCategory The name of the category of unit, e.g. length or mass.
+ */
+
+#define UNIT_ADD_CATEGORY_TRAIT_DETAIL(unitCategory)\
+	namespace traits\
+	{\
+		/** @cond */\
+		namespace detail\
+		{\
+			template<typename T> struct is_ ## unitCategory ## _unit_impl : std::false_type {};\
+			template<typename C, typename U, typename P, typename T>\
+			struct is_ ## unitCategory ## _unit_impl<units::unit<C, U, P, T>> : std::is_same<units::traits::base_unit_of<typename units::traits::unit_traits<units::unit<C, U, P, T>>::base_unit_type>, units::category::unitCategory ## _unit>::type {};\
+			template<typename U, typename S, template<typename> class N>\
+			struct is_ ## unitCategory ## _unit_impl<units::unit_t<U, S, N>> : std::is_same<units::traits::base_unit_of<typename units::traits::unit_t_traits<units::unit_t<U, S, N>>::unit_type>, units::category::unitCategory ## _unit>::type {};\
+		}\
+		/** @endcond */\
+	}
+
+#if defined(UNIT_HAS_VARIADIC_TEMPLATE_SUPPORT)
+#define UNIT_ADD_IS_UNIT_CATEGORY_TRAIT(unitCategory)\
+	namespace traits\
+	{\
+		template<typename... T> struct is_ ## unitCategory ## _unit : std::integral_constant<bool, units::all_true<units::traits::detail::is_ ## unitCategory ## _unit_impl<std::decay_t<T>>::value...>::value> {};\
+	}
+#else
+#define UNIT_ADD_IS_UNIT_CATEGORY_TRAIT(unitCategory)\
+	namespace traits\
+	{\
+			template<typename T1, typename T2 = T1, typename T3 = T1>\
+			struct is_ ## unitCategory ## _unit : std::integral_constant<bool, units::traits::detail::is_ ## unitCategory ## _unit_impl<typename std::decay<T1>::type>::value &&\
+				units::traits::detail::is_ ## unitCategory ## _unit_impl<typename std::decay<T2>::type>::value &&\
+				units::traits::detail::is_ ## unitCategory ## _unit_impl<typename std::decay<T3>::type>::value>{};\
+	}
+#endif
+
+#define UNIT_ADD_CATEGORY_TRAIT(unitCategory)\
+	UNIT_ADD_CATEGORY_TRAIT_DETAIL(unitCategory)\
+    /** @ingroup	TypeTraits*/\
+	/** @brief		Trait which tests whether a type represents a unit of unitCategory*/\
+	/** @details	Inherits from `std::true_type` or `std::false_type`. Use `is_ ## unitCategory ## _unit<T>::value` to test the unit represents a unitCategory quantity.*/\
+	/** @tparam		T	one or more types to test*/\
+	UNIT_ADD_IS_UNIT_CATEGORY_TRAIT(unitCategory)
+
+/**
+ * @def			UNIT_ADD_WITH_METRIC_PREFIXES(nameSingular, namePlural, abbreviation, definition)
+ * @brief		Macro for generating the boiler-plate code needed for a new unit, including its metric
+ *				prefixes from femto to peta.
+ * @details		See UNIT_ADD. In addition to generating the unit definition and containers '(e.g. `meters` and 'meter_t',
+ *				it also creates corresponding units with metric suffixes such as `millimeters`, and `millimeter_t`), as well as the
+ *				literal suffixes (e.g. `10.0_mm`).
+ * @param		namespaceName namespace in which the new units will be encapsulated. All literal values
+ *				are placed in the `units::literals` namespace.
+ * @param		nameSingular singular version of the unit name, e.g. 'meter'
+ * @param		namePlural - plural version of the unit name, e.g. 'meters'
+ * @param		abbreviation - abbreviated unit name, e.g. 'm'
+ * @param		definition - the variadic parameter is used for the definition of the unit
+ *				(e.g. `unit<std::ratio<1>, units::category::length_unit>`)
+ * @note		a variadic template is used for the definition to allow templates with
+ *				commas to be easily expanded. All the variadic 'arguments' should together
+ *				comprise the unit definition.
+ */
+#define UNIT_ADD_WITH_METRIC_PREFIXES(namespaceName, nameSingular, namePlural, abbreviation, /*definition*/...)\
+	UNIT_ADD(namespaceName, nameSingular, namePlural, abbreviation, __VA_ARGS__)\
+	UNIT_ADD(namespaceName, femto ## nameSingular, femto ## namePlural, f ## abbreviation, femto<namePlural>)\
+	UNIT_ADD(namespaceName, pico ## nameSingular, pico ## namePlural, p ## abbreviation, pico<namePlural>)\
+	UNIT_ADD(namespaceName, nano ## nameSingular, nano ## namePlural, n ## abbreviation, nano<namePlural>)\
+	UNIT_ADD(namespaceName, micro ## nameSingular, micro ## namePlural, u ## abbreviation, micro<namePlural>)\
+	UNIT_ADD(namespaceName, milli ## nameSingular, milli ## namePlural, m ## abbreviation, milli<namePlural>)\
+	UNIT_ADD(namespaceName, centi ## nameSingular, centi ## namePlural, c ## abbreviation, centi<namePlural>)\
+	UNIT_ADD(namespaceName, deci ## nameSingular, deci ## namePlural, d ## abbreviation, deci<namePlural>)\
+	UNIT_ADD(namespaceName, deca ## nameSingular, deca ## namePlural, da ## abbreviation, deca<namePlural>)\
+	UNIT_ADD(namespaceName, hecto ## nameSingular, hecto ## namePlural, h ## abbreviation, hecto<namePlural>)\
+	UNIT_ADD(namespaceName, kilo ## nameSingular, kilo ## namePlural, k ## abbreviation, kilo<namePlural>)\
+	UNIT_ADD(namespaceName, mega ## nameSingular, mega ## namePlural, M ## abbreviation, mega<namePlural>)\
+	UNIT_ADD(namespaceName, giga ## nameSingular, giga ## namePlural, G ## abbreviation, giga<namePlural>)\
+	UNIT_ADD(namespaceName, tera ## nameSingular, tera ## namePlural, T ## abbreviation, tera<namePlural>)\
+	UNIT_ADD(namespaceName, peta ## nameSingular, peta ## namePlural, P ## abbreviation, peta<namePlural>)\
+
+ /**
+  * @def		UNIT_ADD_WITH_METRIC_AND_BINARY_PREFIXES(nameSingular, namePlural, abbreviation, definition)
+  * @brief		Macro for generating the boiler-plate code needed for a new unit, including its metric
+  *				prefixes from femto to peta, and binary prefixes from kibi to exbi.
+  * @details	See UNIT_ADD. In addition to generating the unit definition and containers '(e.g. `bytes` and 'byte_t',
+  *				it also creates corresponding units with metric suffixes such as `millimeters`, and `millimeter_t`), as well as the
+  *				literal suffixes (e.g. `10.0_B`).
+  * @param		namespaceName namespace in which the new units will be encapsulated. All literal values
+  *				are placed in the `units::literals` namespace.
+  * @param		nameSingular singular version of the unit name, e.g. 'byte'
+  * @param		namePlural - plural version of the unit name, e.g. 'bytes'
+  * @param		abbreviation - abbreviated unit name, e.g. 'B'
+  * @param		definition - the variadic parameter is used for the definition of the unit
+  *				(e.g. `unit<std::ratio<1>, units::category::data_unit>`)
+  * @note		a variadic template is used for the definition to allow templates with
+  *				commas to be easily expanded. All the variadic 'arguments' should together
+  *				comprise the unit definition.
+  */
+#define UNIT_ADD_WITH_METRIC_AND_BINARY_PREFIXES(namespaceName, nameSingular, namePlural, abbreviation, /*definition*/...)\
+	UNIT_ADD_WITH_METRIC_PREFIXES(namespaceName, nameSingular, namePlural, abbreviation, __VA_ARGS__)\
+	UNIT_ADD(namespaceName, kibi ## nameSingular, kibi ## namePlural, Ki ## abbreviation, kibi<namePlural>)\
+	UNIT_ADD(namespaceName, mebi ## nameSingular, mebi ## namePlural, Mi ## abbreviation, mebi<namePlural>)\
+	UNIT_ADD(namespaceName, gibi ## nameSingular, gibi ## namePlural, Gi ## abbreviation, gibi<namePlural>)\
+	UNIT_ADD(namespaceName, tebi ## nameSingular, tebi ## namePlural, Ti ## abbreviation, tebi<namePlural>)\
+	UNIT_ADD(namespaceName, pebi ## nameSingular, pebi ## namePlural, Pi ## abbreviation, pebi<namePlural>)\
+	UNIT_ADD(namespaceName, exbi ## nameSingular, exbi ## namePlural, Ei ## abbreviation, exbi<namePlural>)
+
+//--------------------
+//	UNITS NAMESPACE
+//--------------------
+
+/**
+ * @namespace units
+ * @brief Unit Conversion Library namespace
+ */
+namespace units
+{
+	//----------------------------------
+	//	DOXYGEN
+	//----------------------------------
+
+	/**
+	 * @defgroup	UnitContainers Unit Containers
+	 * @brief		Defines a series of classes which contain dimensioned values. Unit containers
+	 *				store a value, and support various arithmetic operations.
+	 */
+
+	/**
+	 * @defgroup	UnitTypes Unit Types
+	 * @brief		Defines a series of classes which represent units. These types are tags used by
+	 *				the conversion function, to create compound units, or to create `unit_t` types.
+	 *				By themselves, they are not containers and have no stored value.
+	 */
+
+	/**
+	 * @defgroup	UnitManipulators Unit Manipulators
+	 * @brief		Defines a series of classes used to manipulate unit types, such as `inverse<>`, `squared<>`, and metric prefixes.
+	 *				Unit manipulators can be chained together, e.g. `inverse<squared<pico<time::seconds>>>` to
+	 *				represent picoseconds^-2.
+	 */
+
+	 /**
+	  * @defgroup	CompileTimeUnitManipulators Compile-time Unit Manipulators
+	  * @brief		Defines a series of classes used to manipulate `unit_value_t` types at compile-time, such as `unit_value_add<>`, `unit_value_sqrt<>`, etc.
+	  *				Compile-time manipulators can be chained together, e.g. `unit_value_sqrt<unit_value_add<unit_value_power<a, 2>, unit_value_power<b, 2>>>` to
+	  *				represent `c = sqrt(a^2 + b^2).
+	  */
+
+	 /**
+	 * @defgroup	UnitMath Unit Math
+	 * @brief		Defines a collection of unit-enabled, strongly-typed versions of `<cmath>` functions.
+	 * @details		Includes most c++11 extensions.
+	 */
+
+	/**
+	 * @defgroup	Conversion Explicit Conversion
+	 * @brief		Functions used to convert values of one logical type to another.
+	 */
+
+	/**
+	 * @defgroup	TypeTraits Type Traits
+	 * @brief		Defines a series of classes to obtain unit type information at compile-time.
+	 */
+
+	//------------------------------
+	//	FORWARD DECLARATIONS
+	//------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace constants
+	{
+		namespace detail
+		{
+			static constexpr const UNIT_LIB_DEFAULT_TYPE PI_VAL = 3.14159265358979323846264338327950288419716939937510;
+		}
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	//------------------------------
+	//	RATIO TRAITS
+	//------------------------------
+
+	/**
+	 * @ingroup TypeTraits
+	 * @{
+	 */
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/// has_num implementation.
+		template<class T>
+		struct has_num_impl
+		{
+			template<class U>
+			static constexpr auto test(U*)->std::is_integral<decltype(U::num)> {return std::is_integral<decltype(U::num)>{}; }
+			template<typename>
+			static constexpr std::false_type test(...) { return std::false_type{}; }
+
+			using type = decltype(test<T>(0));
+		};
+	}
+
+	/**
+	 * @brief		Trait which checks for the existence of a static numerator.
+	 * @details		Inherits from `std::true_type` or `std::false_type`. Use `has_num<T>::value` to test
+	 *				whether `class T` has a numerator static member.
+	 */
+	template<class T>
+	struct has_num : units::detail::has_num_impl<T>::type {};
+
+	namespace detail
+	{
+		/// has_den implementation.
+		template<class T>
+		struct has_den_impl
+		{
+			template<class U>
+			static constexpr auto test(U*)->std::is_integral<decltype(U::den)> { return std::is_integral<decltype(U::den)>{}; }
+			template<typename>
+			static constexpr std::false_type test(...) { return std::false_type{}; }
+
+			using type = decltype(test<T>(0));
+		};
+	}
+
+	/**
+	 * @brief		Trait which checks for the existence of a static denominator.
+	 * @details		Inherits from `std::true_type` or `std::false_type`. Use `has_den<T>::value` to test
+	 *				whether `class T` has a denominator static member.
+	 */
+	template<class T>
+	struct has_den : units::detail::has_den_impl<T>::type {};
+
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	namespace traits
+	{
+		/**
+		 * @brief		Trait that tests whether a type represents a std::ratio.
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `is_ratio<T>::value` to test
+		 *				whether `class T` implements a std::ratio.
+		 */
+		template<class T>
+		struct is_ratio : std::integral_constant<bool,
+			has_num<T>::value &&
+			has_den<T>::value>
+		{};
+	}
+
+	//------------------------------
+	//	UNIT TRAITS
+	//------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	/**
+	 * @brief		void type.
+	 * @details		Helper class for creating type traits.
+	 */
+	template<class ...>
+	struct void_t { typedef void type; };
+
+	/**
+	 * @brief		parameter pack for boolean arguments.
+	 */
+	template<bool...> struct bool_pack {};
+
+	/**
+	 * @brief		Trait which tests that a set of other traits are all true.
+	 */
+	template<bool... Args>
+	struct all_true : std::is_same<units::bool_pack<true, Args...>, units::bool_pack<Args..., true>> {};
+	/** @endcond */	// DOXYGEN IGNORE
+
+	/**
+	 * @brief namespace representing type traits which can access the properties of types provided by the units library.
+	 */
+	namespace traits
+	{
+#ifdef FOR_DOXYGEN_PURPOSES_ONLY
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Traits class defining the properties of units.
+		 * @details		The units library determines certain properties of the units passed to
+		 *				them and what they represent by using the members of the corresponding
+		 *				unit_traits instantiation.
+		 */
+		template<class T>
+		struct unit_traits
+		{
+			typedef typename T::base_unit_type base_unit_type;											///< Unit type that the unit was derived from. May be a `base_unit` or another `unit`. Use the `base_unit_of` trait to find the SI base unit type. This will be `void` if type `T` is not a unit.
+			typedef typename T::conversion_ratio conversion_ratio;										///< `std::ratio` representing the conversion factor to the `base_unit_type`. This will be `void` if type `T` is not a unit.
+			typedef typename T::pi_exponent_ratio pi_exponent_ratio;									///< `std::ratio` representing the exponent of pi to be used in the conversion. This will be `void` if type `T` is not a unit.
+			typedef typename T::translation_ratio translation_ratio;									///< `std::ratio` representing a datum translation to the base unit (i.e. degrees C to degrees F conversion). This will be `void` if type `T` is not a unit.
+		};
+#endif
+		/** @cond */	// DOXYGEN IGNORE
+		/**
+		 * @brief		unit traits implementation for classes which are not units.
+		 */
+		template<class T, typename = void>
+		struct unit_traits
+		{
+			typedef void base_unit_type;
+			typedef void conversion_ratio;
+			typedef void pi_exponent_ratio;
+			typedef void translation_ratio;
+		};
+
+		template<class T>
+		struct unit_traits
+			<T, typename void_t<
+			typename T::base_unit_type,
+			typename T::conversion_ratio,
+			typename T::pi_exponent_ratio,
+			typename T::translation_ratio>::type>
+		{
+			typedef typename T::base_unit_type base_unit_type;											///< Unit type that the unit was derived from. May be a `base_unit` or another `unit`. Use the `base_unit_of` trait to find the SI base unit type. This will be `void` if type `T` is not a unit.
+			typedef typename T::conversion_ratio conversion_ratio;										///< `std::ratio` representing the conversion factor to the `base_unit_type`. This will be `void` if type `T` is not a unit.
+			typedef typename T::pi_exponent_ratio pi_exponent_ratio;									///< `std::ratio` representing the exponent of pi to be used in the conversion. This will be `void` if type `T` is not a unit.
+			typedef typename T::translation_ratio translation_ratio;									///< `std::ratio` representing a datum translation to the base unit (i.e. degrees C to degrees F conversion). This will be `void` if type `T` is not a unit.
+		};
+		/** @endcond */	// END DOXYGEN IGNORE
+	}
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+		 * @brief		helper type to identify base units.
+		 * @details		A non-templated base class for `base_unit` which enables RTTI testing.
+		 */
+		struct _base_unit_t {};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	namespace traits
+	{
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which tests if a class is a `base_unit` type.
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `is_base_unit<T>::value` to test
+		 *				whether `class T` implements a `base_unit`.
+		 */
+		template<class T>
+		struct is_base_unit : std::is_base_of<units::detail::_base_unit_t, T> {};
+	}
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+		 * @brief		helper type to identify units.
+		 * @details		A non-templated base class for `unit` which enables RTTI testing.
+		 */
+		struct _unit {};
+
+		template<std::intmax_t Num, std::intmax_t Den = 1>
+		using meter_ratio = std::ratio<Num, Den>;
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	namespace traits
+	{
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Traits which tests if a class is a `unit`
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `is_unit<T>::value` to test
+		 *				whether `class T` implements a `unit`.
+		 */
+		template<class T>
+		struct is_unit : std::is_base_of<units::detail::_unit, T>::type {};
+	}
+
+	/** @} */ // end of TypeTraits
+
+	//------------------------------
+	//	BASE UNIT CLASS
+	//------------------------------
+
+	/**
+	 * @ingroup		UnitTypes
+	 * @brief		Class representing SI base unit types.
+	 * @details		Base units are represented by a combination of `std::ratio` template parameters, each
+	 *				describing the exponent of the type of unit they represent. Example: meters per second
+	 *				would be described by a +1 exponent for meters, and a -1 exponent for seconds, thus:
+	 *				`base_unit<std::ratio<1>, std::ratio<0>, std::ratio<-1>>`
+	 * @tparam		Meter		`std::ratio` representing the exponent value for meters.
+	 * @tparam		Kilogram	`std::ratio` representing the exponent value for kilograms.
+	 * @tparam		Second		`std::ratio` representing the exponent value for seconds.
+	 * @tparam		Radian		`std::ratio` representing the exponent value for radians. Although radians are not SI base units, they are included because radians are described by the SI as m * m^-1, which would make them indistinguishable from scalars.
+	 * @tparam		Ampere		`std::ratio` representing the exponent value for amperes.
+	 * @tparam		Kelvin		`std::ratio` representing the exponent value for Kelvin.
+	 * @tparam		Mole		`std::ratio` representing the exponent value for moles.
+	 * @tparam		Candela		`std::ratio` representing the exponent value for candelas.
+	 * @tparam		Byte		`std::ratio` representing the exponent value for bytes.
+	 * @sa			category	 for type aliases for SI base_unit types.
+	 */
+	template<class Meter = detail::meter_ratio<0>,
+	class Kilogram = std::ratio<0>,
+	class Second = std::ratio<0>,
+	class Radian = std::ratio<0>,
+	class Ampere = std::ratio<0>,
+	class Kelvin = std::ratio<0>,
+	class Mole = std::ratio<0>,
+	class Candela = std::ratio<0>,
+	class Byte = std::ratio<0>>
+	struct base_unit : units::detail::_base_unit_t
+	{
+		static_assert(traits::is_ratio<Meter>::value, "Template parameter `Meter` must be a `std::ratio` representing the exponent of meters the unit has");
+		static_assert(traits::is_ratio<Kilogram>::value, "Template parameter `Kilogram` must be a `std::ratio` representing the exponent of kilograms the unit has");
+		static_assert(traits::is_ratio<Second>::value, "Template parameter `Second` must be a `std::ratio` representing the exponent of seconds the unit has");
+		static_assert(traits::is_ratio<Ampere>::value, "Template parameter `Ampere` must be a `std::ratio` representing the exponent of amperes the unit has");
+		static_assert(traits::is_ratio<Kelvin>::value, "Template parameter `Kelvin` must be a `std::ratio` representing the exponent of kelvin the unit has");
+		static_assert(traits::is_ratio<Candela>::value, "Template parameter `Candela` must be a `std::ratio` representing the exponent of candelas the unit has");
+		static_assert(traits::is_ratio<Mole>::value, "Template parameter `Mole` must be a `std::ratio` representing the exponent of moles the unit has");
+		static_assert(traits::is_ratio<Radian>::value, "Template parameter `Radian` must be a `std::ratio` representing the exponent of radians the unit has");
+		static_assert(traits::is_ratio<Byte>::value, "Template parameter `Byte` must be a `std::ratio` representing the exponent of bytes the unit has");
+
+		typedef Meter meter_ratio;
+		typedef Kilogram kilogram_ratio;
+		typedef Second second_ratio;
+		typedef Radian radian_ratio;
+		typedef Ampere ampere_ratio;
+		typedef Kelvin kelvin_ratio;
+		typedef Mole mole_ratio;
+		typedef Candela candela_ratio;
+		typedef Byte byte_ratio;
+	};
+
+	//------------------------------
+	//	UNIT CATEGORIES
+	//------------------------------
+
+	/**
+	 * @brief		namespace representing the implemented base and derived unit types. These will not generally be needed by library users.
+	 * @sa			base_unit for the definition of the category parameters.
+	 */
+	namespace category
+	{
+		// SCALAR (DIMENSIONLESS) TYPES
+		typedef base_unit<> scalar_unit;			///< Represents a quantity with no dimension.
+		typedef base_unit<> dimensionless_unit;	///< Represents a quantity with no dimension.
+
+		// SI BASE UNIT TYPES
+		//					METERS			KILOGRAMS		SECONDS			RADIANS			AMPERES			KELVIN			MOLE			CANDELA			BYTE		---		CATEGORY
+		typedef base_unit<detail::meter_ratio<1>>																																		length_unit;			 		///< Represents an SI base unit of length
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<1>>																														mass_unit;				 		///< Represents an SI base unit of mass
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<1>>																										time_unit;				 		///< Represents an SI base unit of time
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>																						angle_unit;				 		///< Represents an SI base unit of angle
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>																		current_unit;			 		///< Represents an SI base unit of current
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>														temperature_unit;		 		///< Represents an SI base unit of temperature
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>										substance_unit;			 		///< Represents an SI base unit of amount of substance
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>						luminous_intensity_unit; 		///< Represents an SI base unit of luminous intensity
+
+		// SI DERIVED UNIT TYPES
+		//					METERS			KILOGRAMS		SECONDS			RADIANS			AMPERES			KELVIN			MOLE			CANDELA			BYTE		---		CATEGORY
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<2>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>>						solid_angle_unit;				///< Represents an SI derived unit of solid angle
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<-1>>																										frequency_unit;					///< Represents an SI derived unit of frequency
+		typedef base_unit<detail::meter_ratio<1>,	std::ratio<0>,	std::ratio<-1>>																										velocity_unit;					///< Represents an SI derived unit of velocity
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<-1>,	std::ratio<1>>																						angular_velocity_unit;			///< Represents an SI derived unit of angular velocity
+		typedef base_unit<detail::meter_ratio<1>,	std::ratio<0>,	std::ratio<-2>>																										acceleration_unit;				///< Represents an SI derived unit of acceleration
+		typedef base_unit<detail::meter_ratio<1>,	std::ratio<1>,	std::ratio<-2>>																										force_unit;						///< Represents an SI derived unit of force
+		typedef base_unit<detail::meter_ratio<-1>,	std::ratio<1>,	std::ratio<-2>>																										pressure_unit;					///< Represents an SI derived unit of pressure
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<1>,	std::ratio<0>,	std::ratio<1>>																		charge_unit;					///< Represents an SI derived unit of charge
+		typedef base_unit<detail::meter_ratio<2>,	std::ratio<1>,	std::ratio<-2>>																										energy_unit;					///< Represents an SI derived unit of energy
+		typedef base_unit<detail::meter_ratio<2>,	std::ratio<1>,	std::ratio<-3>>																										power_unit;						///< Represents an SI derived unit of power
+		typedef base_unit<detail::meter_ratio<2>,	std::ratio<1>,	std::ratio<-3>,	std::ratio<0>,	std::ratio<-1>>																		voltage_unit;					///< Represents an SI derived unit of voltage
+		typedef base_unit<detail::meter_ratio<-2>,	std::ratio<-1>,	std::ratio<4>,	std::ratio<0>,	std::ratio<2>>																		capacitance_unit;				///< Represents an SI derived unit of capacitance
+		typedef base_unit<detail::meter_ratio<2>,	std::ratio<1>,	std::ratio<-3>,	std::ratio<0>,	std::ratio<-2>>																		impedance_unit;					///< Represents an SI derived unit of impedance
+		typedef base_unit<detail::meter_ratio<-2>,	std::ratio<-1>,	std::ratio<3>,	std::ratio<0>,	std::ratio<2>>																		conductance_unit;				///< Represents an SI derived unit of conductance
+		typedef base_unit<detail::meter_ratio<2>,	std::ratio<1>,	std::ratio<-2>,	std::ratio<0>,	std::ratio<-1>>																		magnetic_flux_unit;				///< Represents an SI derived unit of magnetic flux
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<1>,	std::ratio<-2>,	std::ratio<0>,	std::ratio<-1>>																		magnetic_field_strength_unit;	///< Represents an SI derived unit of magnetic field strength
+		typedef base_unit<detail::meter_ratio<2>,	std::ratio<1>,	std::ratio<-2>,	std::ratio<0>,	std::ratio<-2>>																		inductance_unit;				///< Represents an SI derived unit of inductance
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<2>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>						luminous_flux_unit;				///< Represents an SI derived unit of luminous flux
+		typedef base_unit<detail::meter_ratio<-2>,	std::ratio<0>,	std::ratio<0>,	std::ratio<2>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>						illuminance_unit;				///< Represents an SI derived unit of illuminance
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<-1>>																										radioactivity_unit;				///< Represents an SI derived unit of radioactivity
+
+		// OTHER UNIT TYPES
+		//					METERS			KILOGRAMS		SECONDS			RADIANS			AMPERES			KELVIN			MOLE			CANDELA			BYTE		---		CATEGORY
+		typedef base_unit<detail::meter_ratio<2>,	std::ratio<1>,	std::ratio<-2>>																										torque_unit;					///< Represents an SI derived unit of torque
+		typedef base_unit<detail::meter_ratio<2>>																																		area_unit;						///< Represents an SI derived unit of area
+		typedef base_unit<detail::meter_ratio<3>>																																		volume_unit;					///< Represents an SI derived unit of volume
+		typedef base_unit<detail::meter_ratio<-3>,	std::ratio<1>>																														density_unit;					///< Represents an SI derived unit of density
+		typedef base_unit<>																																						concentration_unit;				///< Represents a unit of concentration
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>		data_unit;						///< Represents a unit of data size
+		typedef base_unit<detail::meter_ratio<0>,	std::ratio<0>,	std::ratio<-1>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>		data_transfer_rate_unit;		///< Represents a unit of data transfer rate
+	}
+
+	//------------------------------
+	//	UNIT CLASSES
+	//------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	/**
+	 * @brief		unit type template specialization for units derived from base units.
+	 */
+	template <class, class, class, class> struct unit;
+	template<class Conversion, class... Exponents, class PiExponent, class Translation>
+	struct unit<Conversion, base_unit<Exponents...>, PiExponent, Translation> : units::detail::_unit
+	{
+		static_assert(traits::is_ratio<Conversion>::value, "Template parameter `Conversion` must be a `std::ratio` representing the conversion factor to `BaseUnit`.");
+		static_assert(traits::is_ratio<PiExponent>::value, "Template parameter `PiExponent` must be a `std::ratio` representing the exponents of Pi the unit has.");
+		static_assert(traits::is_ratio<Translation>::value, "Template parameter `Translation` must be a `std::ratio` representing an additive translation required by the unit conversion.");
+
+		typedef typename units::base_unit<Exponents...> base_unit_type;
+		typedef Conversion conversion_ratio;
+		typedef Translation translation_ratio;
+		typedef PiExponent pi_exponent_ratio;
+	};
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @brief		Type representing an arbitrary unit.
+	 * @ingroup		UnitTypes
+	 * @details		`unit` types are used as tags for the `conversion` function. They are *not* containers
+	 *				(see `unit_t` for a  container class). Each unit is defined by:
+	 *
+	 *				- A `std::ratio` defining the conversion factor to the base unit type. (e.g. `std::ratio<1,12>` for inches to feet)
+	 *				- A base unit that the unit is derived from (or a unit category. Must be of type `unit` or `base_unit`)
+	 *				- An exponent representing factors of PI required by the conversion. (e.g. `std::ratio<-1>` for a radians to degrees conversion)
+	 *				- a ratio representing a datum translation required for the conversion (e.g. `std::ratio<32>` for a fahrenheit to celsius conversion)
+	 *
+	 *				Typically, a specific unit, like `meters`, would be implemented as a type alias
+	 *				of `unit`, i.e. `using meters = unit<std::ratio<1>, units::category::length_unit`, or
+	 *				`using inches = unit<std::ratio<1,12>, feet>`.
+	 * @tparam		Conversion	std::ratio representing scalar multiplication factor.
+	 * @tparam		BaseUnit	Unit type which this unit is derived from. May be a `base_unit`, or another `unit`.
+	 * @tparam		PiExponent	std::ratio representing the exponent of pi required by the conversion.
+	 * @tparam		Translation	std::ratio representing any datum translation required by the conversion.
+	 */
+	template<class Conversion, class BaseUnit, class PiExponent = std::ratio<0>, class Translation = std::ratio<0>>
+	struct unit : units::detail::_unit
+	{
+		static_assert(traits::is_unit<BaseUnit>::value, "Template parameter `BaseUnit` must be a `unit` type.");
+		static_assert(traits::is_ratio<Conversion>::value, "Template parameter `Conversion` must be a `std::ratio` representing the conversion factor to `BaseUnit`.");
+		static_assert(traits::is_ratio<PiExponent>::value, "Template parameter `PiExponent` must be a `std::ratio` representing the exponents of Pi the unit has.");
+
+		typedef typename units::traits::unit_traits<BaseUnit>::base_unit_type base_unit_type;
+		typedef typename std::ratio_multiply<typename BaseUnit::conversion_ratio, Conversion> conversion_ratio;
+		typedef typename std::ratio_add<typename BaseUnit::pi_exponent_ratio, PiExponent> pi_exponent_ratio;
+		typedef typename std::ratio_add<std::ratio_multiply<typename BaseUnit::conversion_ratio, Translation>, typename BaseUnit::translation_ratio> translation_ratio;
+	};
+
+	//------------------------------
+	//	BASE UNIT MANIPULATORS
+	//------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+		 * @brief		base_unit_of trait implementation
+		 * @details		recursively seeks base_unit type that a unit is derived from. Since units can be
+		 *				derived from other units, the `base_unit_type` typedef may not represent this value.
+		 */
+		template<class> struct base_unit_of_impl;
+		template<class Conversion, class BaseUnit, class PiExponent, class Translation>
+		struct base_unit_of_impl<unit<Conversion, BaseUnit, PiExponent, Translation>> : base_unit_of_impl<BaseUnit> {};
+		template<class... Exponents>
+		struct base_unit_of_impl<base_unit<Exponents...>>
+		{
+			typedef base_unit<Exponents...> type;
+		};
+		template<>
+		struct base_unit_of_impl<void>
+		{
+			typedef void type;
+		};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	namespace traits
+	{
+		/**
+		 * @brief		Trait which returns the `base_unit` type that a unit is originally derived from.
+		 * @details		Since units can be derived from other `unit` types in addition to `base_unit` types,
+		 *				the `base_unit_type` typedef will not always be a `base_unit` (or unit category).
+		 *				Since compatible
+		 */
+		template<class U>
+		using base_unit_of = typename units::detail::base_unit_of_impl<U>::type;
+	}
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+		 * @brief		implementation of base_unit_multiply
+		 * @details		'multiples' (adds exponent ratios of) two base unit types. Base units can be found
+		 *				using `base_unit_of`.
+		 */
+		template<class, class> struct base_unit_multiply_impl;
+		template<class... Exponents1, class... Exponents2>
+		struct base_unit_multiply_impl<base_unit<Exponents1...>, base_unit<Exponents2...>> {
+			using type = base_unit<std::ratio_add<Exponents1, Exponents2>...>;
+		};
+
+		/**
+		 * @brief		represents type of two base units multiplied together
+		 */
+		template<class U1, class U2>
+		using base_unit_multiply = typename base_unit_multiply_impl<U1, U2>::type;
+
+		/**
+		 * @brief		implementation of base_unit_divide
+		 * @details		'dived' (subtracts exponent ratios of) two base unit types. Base units can be found
+		 *				using `base_unit_of`.
+		 */
+		template<class, class> struct base_unit_divide_impl;
+		template<class... Exponents1, class... Exponents2>
+		struct base_unit_divide_impl<base_unit<Exponents1...>, base_unit<Exponents2...>> {
+			using type = base_unit<std::ratio_subtract<Exponents1, Exponents2>...>;
+		};
+
+		/**
+		 * @brief		represents the resulting type of `base_unit` U1 divided by U2.
+		 */
+		template<class U1, class U2>
+		using base_unit_divide = typename base_unit_divide_impl<U1, U2>::type;
+
+		/**
+		 * @brief		implementation of inverse_base
+		 * @details		multiplies all `base_unit` exponent ratios by -1. The resulting type represents
+		 *				the inverse base unit of the given `base_unit` type.
+		 */
+		template<class> struct inverse_base_impl;
+
+		template<class... Exponents>
+		struct inverse_base_impl<base_unit<Exponents...>> {
+			using type = base_unit<std::ratio_multiply<Exponents, std::ratio<-1>>...>;
+		};
+
+		/**
+		 * @brief		represent the inverse type of `class U`
+		 * @details		E.g. if `U` is `length_unit`, then `inverse<U>` will represent `length_unit^-1`.
+		 */
+		template<class U> using inverse_base = typename inverse_base_impl<U>::type;
+
+		/**
+		 * @brief		implementation of `squared_base`
+		 * @details		multiplies all the exponent ratios of the given class by 2. The resulting type is
+		 *				equivalent to the given type squared.
+		 */
+		template<class U> struct squared_base_impl;
+		template<class... Exponents>
+		struct squared_base_impl<base_unit<Exponents...>> {
+			using type = base_unit<std::ratio_multiply<Exponents, std::ratio<2>>...>;
+		};
+
+		/**
+		 * @brief		represents the type of a `base_unit` squared.
+		 * @details		E.g. `squared<length_unit>` will represent `length_unit^2`.
+		 */
+		template<class U> using squared_base = typename squared_base_impl<U>::type;
+
+		/**
+		 * @brief		implementation of `cubed_base`
+		 * @details		multiplies all the exponent ratios of the given class by 3. The resulting type is
+		 *				equivalent to the given type cubed.
+		 */
+		template<class U> struct cubed_base_impl;
+		template<class... Exponents>
+		struct cubed_base_impl<base_unit<Exponents...>> {
+			using type = base_unit<std::ratio_multiply<Exponents, std::ratio<3>>...>;
+		};
+
+		/**
+		 * @brief		represents the type of a `base_unit` cubed.
+		 * @details		E.g. `cubed<length_unit>` will represent `length_unit^3`.
+		 */
+		template<class U> using cubed_base = typename cubed_base_impl<U>::type;
+
+		/**
+		 * @brief		implementation of `sqrt_base`
+		 * @details		divides all the exponent ratios of the given class by 2. The resulting type is
+		 *				equivalent to the square root of the given type.
+		 */
+		template<class U> struct sqrt_base_impl;
+		template<class... Exponents>
+		struct sqrt_base_impl<base_unit<Exponents...>> {
+			using type = base_unit<std::ratio_divide<Exponents, std::ratio<2>>...>;
+		};
+
+		/**
+		 * @brief		represents the square-root type of a `base_unit`.
+		 * @details		E.g. `sqrt<length_unit>` will represent `length_unit^(1/2)`.
+		 */
+		template<class U> using sqrt_base = typename sqrt_base_impl<U>::type;
+
+		/**
+		 * @brief		implementation of `cbrt_base`
+		 * @details		divides all the exponent ratios of the given class by 3. The resulting type is
+		 *				equivalent to the given type's cube-root.
+		 */
+		template<class U> struct cbrt_base_impl;
+		template<class... Exponents>
+		struct cbrt_base_impl<base_unit<Exponents...>> {
+			using type = base_unit<std::ratio_divide<Exponents, std::ratio<3>>...>;
+		};
+
+		/**
+		 * @brief		represents the cube-root type of a `base_unit` .
+		 * @details		E.g. `cbrt<length_unit>` will represent `length_unit^(1/3)`.
+		 */
+		template<class U> using cbrt_base = typename cbrt_base_impl<U>::type;
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	//------------------------------
+	//	UNIT MANIPULATORS
+	//------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+		 * @brief		implementation of `unit_multiply`.
+		 * @details		multiplies two units. The base unit becomes the base units of each with their exponents
+		 *				added together. The conversion factors of each are multiplied by each other. Pi exponent ratios
+		 *				are added, and datum translations are removed.
+		 */
+		template<class Unit1, class Unit2>
+		struct unit_multiply_impl
+		{
+			using type = unit < std::ratio_multiply<typename Unit1::conversion_ratio, typename Unit2::conversion_ratio>,
+				base_unit_multiply <traits::base_unit_of<typename Unit1::base_unit_type>, traits::base_unit_of<typename Unit2::base_unit_type>>,
+				std::ratio_add<typename Unit1::pi_exponent_ratio, typename Unit2::pi_exponent_ratio>,
+				std::ratio < 0 >> ;
+		};
+
+		/**
+		 * @brief		represents the type of two units multiplied together.
+		 * @details		recalculates conversion and exponent ratios at compile-time.
+		 */
+		template<class U1, class U2>
+		using unit_multiply = typename unit_multiply_impl<U1, U2>::type;
+
+		/**
+		 * @brief		implementation of `unit_divide`.
+		 * @details		divides two units. The base unit becomes the base units of each with their exponents
+		 *				subtracted from each other. The conversion factors of each are divided by each other. Pi exponent ratios
+		 *				are subtracted, and datum translations are removed.
+		 */
+		template<class Unit1, class Unit2>
+		struct unit_divide_impl
+		{
+			using type = unit < std::ratio_divide<typename Unit1::conversion_ratio, typename Unit2::conversion_ratio>,
+				base_unit_divide<traits::base_unit_of<typename Unit1::base_unit_type>, traits::base_unit_of<typename Unit2::base_unit_type>>,
+				std::ratio_subtract<typename Unit1::pi_exponent_ratio, typename Unit2::pi_exponent_ratio>,
+				std::ratio < 0 >> ;
+		};
+
+		/**
+		 * @brief		represents the type of two units divided by each other.
+		 * @details		recalculates conversion and exponent ratios at compile-time.
+		 */
+		template<class U1, class U2>
+		using unit_divide = typename unit_divide_impl<U1, U2>::type;
+
+		/**
+		 * @brief		implementation of `inverse`
+		 * @details		inverts a unit (equivalent to 1/unit). The `base_unit` and pi exponents are all multiplied by
+		 *				-1. The conversion ratio numerator and denominator are swapped. Datum translation
+		 *				ratios are removed.
+		 */
+		template<class Unit>
+		struct inverse_impl
+		{
+			using type = unit < std::ratio<Unit::conversion_ratio::den, Unit::conversion_ratio::num>,
+				inverse_base<traits::base_unit_of<typename units::traits::unit_traits<Unit>::base_unit_type>>,
+				std::ratio_multiply<typename units::traits::unit_traits<Unit>::pi_exponent_ratio, std::ratio<-1>>,
+				std::ratio < 0 >> ;	// inverses are rates or change, the translation factor goes away.
+		};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @brief		represents the inverse unit type of `class U`.
+	 * @ingroup		UnitManipulators
+	 * @tparam		U	`unit` type to invert.
+	 * @details		E.g. `inverse<meters>` will represent meters^-1 (i.e. 1/meters).
+	 */
+	template<class U> using inverse = typename units::detail::inverse_impl<U>::type;
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+		 * @brief		implementation of `squared`
+		 * @details		Squares the conversion ratio, `base_unit` exponents, pi exponents, and removes
+		 *				datum translation ratios.
+		 */
+		template<class Unit>
+		struct squared_impl
+		{
+			static_assert(traits::is_unit<Unit>::value, "Template parameter `Unit` must be a `unit` type.");
+			using Conversion = typename Unit::conversion_ratio;
+			using type = unit < std::ratio_multiply<Conversion, Conversion>,
+				squared_base<traits::base_unit_of<typename Unit::base_unit_type>>,
+				std::ratio_multiply<typename Unit::pi_exponent_ratio, std::ratio<2>>,
+				typename Unit::translation_ratio
+			> ;
+		};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @brief		represents the unit type of `class U` squared
+	 * @ingroup		UnitManipulators
+	 * @tparam		U	`unit` type to square.
+	 * @details		E.g. `square<meters>` will represent meters^2.
+	 */
+	template<class U>
+	using squared = typename units::detail::squared_impl<U>::type;
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+			 * @brief		implementation of `cubed`
+			 * @details		Cubes the conversion ratio, `base_unit` exponents, pi exponents, and removes
+			 *				datum translation ratios.
+			 */
+		template<class Unit>
+		struct cubed_impl
+		{
+			static_assert(traits::is_unit<Unit>::value, "Template parameter `Unit` must be a `unit` type.");
+			using Conversion = typename Unit::conversion_ratio;
+			using type = unit < std::ratio_multiply<Conversion, std::ratio_multiply<Conversion, Conversion>>,
+				cubed_base<traits::base_unit_of<typename Unit::base_unit_type>>,
+				std::ratio_multiply<typename Unit::pi_exponent_ratio, std::ratio<3>>,
+				typename Unit::translation_ratio> ;
+		};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @brief		represents the type of `class U` cubed.
+	 * @ingroup		UnitManipulators
+	 * @tparam		U	`unit` type to cube.
+	 * @details		E.g. `cubed<meters>` will represent meters^3.
+	 */
+	template<class U>
+	using cubed = typename units::detail::cubed_impl<U>::type;
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		//----------------------------------
+		//	RATIO_SQRT IMPLEMENTATION
+		//----------------------------------
+
+		using Zero = std::ratio<0>;
+		using One = std::ratio<1>;
+		template <typename R> using Square = std::ratio_multiply<R, R>;
+
+		// Find the largest std::integer N such that Predicate<N>::value is true.
+		template <template <std::intmax_t N> class Predicate, typename enabled = void>
+		struct BinarySearch {
+			template <std::intmax_t N>
+			struct SafeDouble_ {
+				static constexpr const std::intmax_t value = 2 * N;
+				static_assert(value > 0, "Overflows when computing 2 * N");
+			};
+
+			template <intmax_t Lower, intmax_t Upper, typename Condition1 = void, typename Condition2 = void>
+			struct DoubleSidedSearch_ : DoubleSidedSearch_<Lower, Upper,
+				std::integral_constant<bool, (Upper - Lower == 1)>,
+				std::integral_constant<bool, ((Upper - Lower>1 && Predicate<Lower + (Upper - Lower) / 2>::value))>> {};
+
+			template <intmax_t Lower, intmax_t Upper>
+			struct DoubleSidedSearch_<Lower, Upper, std::false_type, std::false_type> : DoubleSidedSearch_<Lower, Lower + (Upper - Lower) / 2> {};
+
+			template <intmax_t Lower, intmax_t Upper, typename Condition2>
+			struct DoubleSidedSearch_<Lower, Upper, std::true_type, Condition2> : std::integral_constant<intmax_t, Lower>{};
+
+			template <intmax_t Lower, intmax_t Upper, typename Condition1>
+			struct DoubleSidedSearch_<Lower, Upper, Condition1, std::true_type> : DoubleSidedSearch_<Lower + (Upper - Lower) / 2, Upper>{};
+
+			template <std::intmax_t Lower, class enabled1 = void>
+			struct SingleSidedSearch_ : SingleSidedSearch_<Lower, std::integral_constant<bool, Predicate<SafeDouble_<Lower>::value>::value>>{};
+
+			template <std::intmax_t Lower>
+			struct SingleSidedSearch_<Lower, std::false_type> : DoubleSidedSearch_<Lower, SafeDouble_<Lower>::value> {};
+
+			template <std::intmax_t Lower>
+			struct SingleSidedSearch_<Lower, std::true_type> : SingleSidedSearch_<SafeDouble_<Lower>::value>{};
+
+			static constexpr const std::intmax_t value = SingleSidedSearch_<1>::value;
+ 		};
+
+		template <template <std::intmax_t N> class Predicate>
+		struct BinarySearch<Predicate, std::enable_if_t<!Predicate<1>::value>> : std::integral_constant<std::intmax_t, 0>{};
+
+		// Find largest std::integer N such that N<=sqrt(R)
+		template <typename R>
+		struct Integer {
+			template <std::intmax_t N> using Predicate_ = std::ratio_less_equal<std::ratio<N>, std::ratio_divide<R, std::ratio<N>>>;
+			static constexpr const std::intmax_t value = BinarySearch<Predicate_>::value;
+		};
+
+		template <typename R>
+		struct IsPerfectSquare {
+			static constexpr const std::intmax_t DenSqrt_ = Integer<std::ratio<R::den>>::value;
+			static constexpr const std::intmax_t NumSqrt_ = Integer<std::ratio<R::num>>::value;
+			static constexpr const bool value =( DenSqrt_ * DenSqrt_ == R::den && NumSqrt_ * NumSqrt_ == R::num);
+			using Sqrt = std::ratio<NumSqrt_, DenSqrt_>;
+		};
+
+		// Represents sqrt(P)-Q.
+		template <typename Tp, typename Tq>
+		struct Remainder {
+			using P = Tp;
+			using Q = Tq;
+		};
+
+		// Represents 1/R = I + Rem where R is a Remainder.
+		template <typename R>
+		struct Reciprocal {
+			using P_ = typename R::P;
+			using Q_ = typename R::Q;
+			using Den_ = std::ratio_subtract<P_, Square<Q_>>;
+			using A_ = std::ratio_divide<Q_, Den_>;
+			using B_ = std::ratio_divide<P_, Square<Den_>>;
+			static constexpr const std::intmax_t I_ = (A_::num + Integer<std::ratio_multiply<B_, Square<std::ratio<A_::den>>>>::value) / A_::den;
+			using I = std::ratio<I_>;
+			using Rem = Remainder<B_, std::ratio_subtract<I, A_>>;
+		};
+
+		// Expands sqrt(R) to continued fraction:
+		// f(x)=C1+1/(C2+1/(C3+1/(...+1/(Cn+x)))) = (U*x+V)/(W*x+1) and sqrt(R)=f(Rem).
+		// The error |f(Rem)-V| = |(U-W*V)x/(W*x+1)| <= |U-W*V|*Rem <= |U-W*V|/I' where
+		// I' is the std::integer part of reciprocal of Rem.
+		template <typename Tr, std::intmax_t N>
+		struct ContinuedFraction {
+			template <typename T>
+			using Abs_ = std::conditional_t<std::ratio_less<T, Zero>::value, std::ratio_subtract<Zero, T>, T>;
+
+			using R = Tr;
+			using Last_ = ContinuedFraction<R, N - 1>;
+			using Reciprocal_ = Reciprocal<typename Last_::Rem>;
+			using Rem = typename Reciprocal_::Rem;
+			using I_ = typename Reciprocal_::I;
+			using Den_ = std::ratio_add<typename Last_::W, I_>;
+			using U = std::ratio_divide<typename Last_::V, Den_>;
+			using V = std::ratio_divide<std::ratio_add<typename Last_::U, std::ratio_multiply<typename Last_::V, I_>>, Den_>;
+			using W = std::ratio_divide<One, Den_>;
+			using Error = Abs_<std::ratio_divide<std::ratio_subtract<U, std::ratio_multiply<V, W>>, typename Reciprocal<Rem>::I>>;
+		};
+
+		template <typename Tr>
+		struct ContinuedFraction<Tr, 1> {
+			using R = Tr;
+			using U = One;
+			using V = std::ratio<Integer<R>::value>;
+			using W = Zero;
+			using Rem = Remainder<R, V>;
+			using Error = std::ratio_divide<One, typename Reciprocal<Rem>::I>;
+		};
+
+		template <typename R, typename Eps, std::intmax_t N = 1, typename enabled = void>
+		struct Sqrt_ : Sqrt_<R, Eps, N + 1> {};
+
+		template <typename R, typename Eps, std::intmax_t N>
+		struct Sqrt_<R, Eps, N, std::enable_if_t<std::ratio_less_equal<typename ContinuedFraction<R, N>::Error, Eps>::value>> {
+			using type = typename ContinuedFraction<R, N>::V;
+		};
+
+		template <typename R, typename Eps, typename enabled = void>
+		struct Sqrt {
+			static_assert(std::ratio_greater_equal<R, Zero>::value, "R can't be negative");
+		};
+
+		template <typename R, typename Eps>
+		struct Sqrt<R, Eps, std::enable_if_t<std::ratio_greater_equal<R, Zero>::value && IsPerfectSquare<R>::value>> {
+			using type = typename IsPerfectSquare<R>::Sqrt;
+		};
+
+		template <typename R, typename Eps>
+		struct Sqrt<R, Eps, std::enable_if_t<(std::ratio_greater_equal<R, Zero>::value && !IsPerfectSquare<R>::value)>> : Sqrt_<R, Eps>{};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @ingroup		TypeTraits
+	 * @brief		Calculate square root of a ratio at compile-time
+	 * @details		Calculates a rational approximation of the square root of the ratio. The error
+	 *				in the calculation is bounded by 1/epsilon (Eps). E.g. for the default value
+	 *				of 10000000000, the maximum error will be a/10000000000, or 1e-8, or said another way,
+	 *				the error will be on the order of 10^-9. Since these calculations are done at
+	 *				compile time, it is advisable to set epsilon to the highest value that does not
+	 *				cause an integer overflow in the calculation. If you can't compile `ratio_sqrt`
+	 *				due to overflow errors, reducing the value of epsilon sufficiently will correct
+	 *				the problem.\n\n
+	 *				`ratio_sqrt` is guaranteed to converge for all values of `Ratio` which do not
+	 *				overflow.
+	 * @note		This function provides a rational approximation, _NOT_ an exact value.
+	 * @tparam		Ratio	ratio to take the square root of. This can represent any rational value,
+	 *						_not_ just integers or values with integer roots.
+	 * @tparam		Eps		Value of epsilon, which represents the inverse of the maximum allowable
+	 *						error. This value should be chosen to be as high as possible before
+	 *						integer overflow errors occur in the compiler.
+	 */
+	template<typename Ratio, std::intmax_t Eps = 10000000000>
+	using ratio_sqrt = typename  units::detail::Sqrt<Ratio, std::ratio<1, Eps>>::type;
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+		 * @brief		implementation of `sqrt`
+		 * @details		square roots the conversion ratio, `base_unit` exponents, pi exponents, and removes
+		 *				datum translation ratios.
+		 */
+		template<class Unit, std::intmax_t Eps>
+		struct sqrt_impl
+		{
+			static_assert(traits::is_unit<Unit>::value, "Template parameter `Unit` must be a `unit` type.");
+			using Conversion = typename Unit::conversion_ratio;
+			using type = unit <ratio_sqrt<Conversion, Eps>,
+				sqrt_base<traits::base_unit_of<typename Unit::base_unit_type>>,
+				std::ratio_divide<typename Unit::pi_exponent_ratio, std::ratio<2>>,
+				typename Unit::translation_ratio>;
+		};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @ingroup		UnitManipulators
+	 * @brief		represents the square root of type `class U`.
+	 * @details		Calculates a rational approximation of the square root of the unit. The error
+	 *				in the calculation is bounded by 1/epsilon (Eps). E.g. for the default value
+	 *				of 10000000000, the maximum error will be a/10000000000, or 1e-8, or said another way,
+	 *				the error will be on the order of 10^-9. Since these calculations are done at
+	 *				compile time, it is advisable to set epsilon to the highest value that does not
+	 *				cause an integer overflow in the calculation. If you can't compile `ratio_sqrt`
+	 *				due to overflow errors, reducing the value of epsilon sufficiently will correct
+	 *				the problem.\n\n
+	 *				`ratio_sqrt` is guaranteed to converge for all values of `Ratio` which do not
+	 *				overflow.
+	 * @tparam		U	`unit` type to take the square root of.
+	 * @tparam		Eps	Value of epsilon, which represents the inverse of the maximum allowable
+	 *					error. This value should be chosen to be as high as possible before
+	 *					integer overflow errors occur in the compiler.
+	 * @note		USE WITH CAUTION. The is an approximate value. In general, squared<sqrt<meter>> != meter,
+	 *				i.e. the operation is not reversible, and it will result in propogated approximations.
+	 *				Use only when absolutely necessary.
+	 */
+	template<class U, std::intmax_t Eps = 10000000000>
+	using square_root = typename units::detail::sqrt_impl<U, Eps>::type;
+
+	//------------------------------
+	//	COMPOUND UNITS
+	//------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+			 * @brief		implementation of compound_unit
+			 * @details		multiplies a variadic list of units together, and is inherited from the resulting
+			 *				type.
+			 */
+		template<class U, class... Us> struct compound_impl;
+		template<class U> struct compound_impl<U> { using type = U; };
+		template<class U1, class U2, class...Us>
+		struct compound_impl<U1, U2, Us...>
+			: compound_impl<unit_multiply<U1, U2>, Us...> {};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @brief		Represents a unit type made up from other units.
+	 * @details		Compound units are formed by multiplying the units of all the types provided in
+	 *				the template argument. Types provided must inherit from `unit`. A compound unit can
+	 *				be formed from any number of other units, and unit manipulators like `inverse` and
+	 *				`squared` are supported. E.g. to specify acceleration, on could create
+	 *				`using acceleration = compound_unit<length::meters, inverse<squared<seconds>>;`
+	 * @tparam		U...	units which, when multiplied together, form the desired compound unit.
+	 * @ingroup		UnitTypes
+	 */
+	template<class U, class... Us>
+	using compound_unit = typename units::detail::compound_impl<U, Us...>::type;
+
+	//------------------------------
+	//	PREFIXES
+	//------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/**
+		 * @brief		prefix applicator.
+		 * @details		creates a unit type from a prefix and a unit
+		 */
+		template<class Ratio, class Unit>
+		struct prefix
+		{
+			static_assert(traits::is_ratio<Ratio>::value, "Template parameter `Ratio` must be a `std::ratio`.");
+			static_assert(traits::is_unit<Unit>::value, "Template parameter `Unit` must be a `unit` type.");
+			typedef typename units::unit<Ratio, Unit> type;
+		};
+
+		/// recursive exponential implementation
+		template <int N, class U>
+		struct power_of_ratio
+		{
+			typedef std::ratio_multiply<U, typename power_of_ratio<N - 1, U>::type> type;
+		};
+
+		/// End recursion
+		template <class U>
+		struct power_of_ratio<1, U>
+		{
+			typedef U type;
+		};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @ingroup UnitManipulators
+	 * @{
+	 * @ingroup Decimal Prefixes
+	 * @{
+	 */
+	template<class U> using atto	= typename units::detail::prefix<std::atto,	U>::type;			///< Represents the type of `class U` with the metric 'atto' prefix appended.	@details E.g. atto<meters> represents meters*10^-18		@tparam U unit type to apply the prefix to.
+	template<class U> using femto	= typename units::detail::prefix<std::femto,U>::type;			///< Represents the type of `class U` with the metric 'femto' prefix appended.  @details E.g. femto<meters> represents meters*10^-15	@tparam U unit type to apply the prefix to.
+	template<class U> using pico	= typename units::detail::prefix<std::pico,	U>::type;			///< Represents the type of `class U` with the metric 'pico' prefix appended.	@details E.g. pico<meters> represents meters*10^-12		@tparam U unit type to apply the prefix to.
+	template<class U> using nano	= typename units::detail::prefix<std::nano,	U>::type;			///< Represents the type of `class U` with the metric 'nano' prefix appended.	@details E.g. nano<meters> represents meters*10^-9		@tparam U unit type to apply the prefix to.
+	template<class U> using micro	= typename units::detail::prefix<std::micro,U>::type;			///< Represents the type of `class U` with the metric 'micro' prefix appended.	@details E.g. micro<meters> represents meters*10^-6		@tparam U unit type to apply the prefix to.
+	template<class U> using milli	= typename units::detail::prefix<std::milli,U>::type;			///< Represents the type of `class U` with the metric 'milli' prefix appended.	@details E.g. milli<meters> represents meters*10^-3		@tparam U unit type to apply the prefix to.
+	template<class U> using centi	= typename units::detail::prefix<std::centi,U>::type;			///< Represents the type of `class U` with the metric 'centi' prefix appended.	@details E.g. centi<meters> represents meters*10^-2		@tparam U unit type to apply the prefix to.
+	template<class U> using deci	= typename units::detail::prefix<std::deci,	U>::type;			///< Represents the type of `class U` with the metric 'deci' prefix appended.	@details E.g. deci<meters> represents meters*10^-1		@tparam U unit type to apply the prefix to.
+	template<class U> using deca	= typename units::detail::prefix<std::deca,	U>::type;			///< Represents the type of `class U` with the metric 'deca' prefix appended.	@details E.g. deca<meters> represents meters*10^1		@tparam U unit type to apply the prefix to.
+	template<class U> using hecto	= typename units::detail::prefix<std::hecto,U>::type;			///< Represents the type of `class U` with the metric 'hecto' prefix appended.	@details E.g. hecto<meters> represents meters*10^2		@tparam U unit type to apply the prefix to.
+	template<class U> using kilo	= typename units::detail::prefix<std::kilo,	U>::type;			///< Represents the type of `class U` with the metric 'kilo' prefix appended.	@details E.g. kilo<meters> represents meters*10^3		@tparam U unit type to apply the prefix to.
+	template<class U> using mega	= typename units::detail::prefix<std::mega,	U>::type;			///< Represents the type of `class U` with the metric 'mega' prefix appended.	@details E.g. mega<meters> represents meters*10^6		@tparam U unit type to apply the prefix to.
+	template<class U> using giga	= typename units::detail::prefix<std::giga,	U>::type;			///< Represents the type of `class U` with the metric 'giga' prefix appended.	@details E.g. giga<meters> represents meters*10^9		@tparam U unit type to apply the prefix to.
+	template<class U> using tera	= typename units::detail::prefix<std::tera,	U>::type;			///< Represents the type of `class U` with the metric 'tera' prefix appended.	@details E.g. tera<meters> represents meters*10^12		@tparam U unit type to apply the prefix to.
+	template<class U> using peta	= typename units::detail::prefix<std::peta,	U>::type;			///< Represents the type of `class U` with the metric 'peta' prefix appended.	@details E.g. peta<meters> represents meters*10^15		@tparam U unit type to apply the prefix to.
+	template<class U> using exa		= typename units::detail::prefix<std::exa,	U>::type;			///< Represents the type of `class U` with the metric 'exa' prefix appended.	@details E.g. exa<meters> represents meters*10^18		@tparam U unit type to apply the prefix to.
+	/** @} @} */
+
+	/**
+	 * @ingroup UnitManipulators
+	 * @{
+	 * @ingroup Binary Prefixes
+	 * @{
+	 */
+	template<class U> using kibi	= typename units::detail::prefix<std::ratio<1024>,					U>::type;	///< Represents the type of `class U` with the binary 'kibi' prefix appended.	@details E.g. kibi<bytes> represents bytes*2^10	@tparam U unit type to apply the prefix to.
+	template<class U> using mebi	= typename units::detail::prefix<std::ratio<1048576>,				U>::type;	///< Represents the type of `class U` with the binary 'mibi' prefix appended.	@details E.g. mebi<bytes> represents bytes*2^20	@tparam U unit type to apply the prefix to.
+	template<class U> using gibi	= typename units::detail::prefix<std::ratio<1073741824>,			U>::type;	///< Represents the type of `class U` with the binary 'gibi' prefix appended.	@details E.g. gibi<bytes> represents bytes*2^30	@tparam U unit type to apply the prefix to.
+	template<class U> using tebi	= typename units::detail::prefix<std::ratio<1099511627776>,			U>::type;	///< Represents the type of `class U` with the binary 'tebi' prefix appended.	@details E.g. tebi<bytes> represents bytes*2^40	@tparam U unit type to apply the prefix to.
+	template<class U> using pebi	= typename units::detail::prefix<std::ratio<1125899906842624>,		U>::type;	///< Represents the type of `class U` with the binary 'pebi' prefix appended.	@details E.g. pebi<bytes> represents bytes*2^50	@tparam U unit type to apply the prefix to.
+	template<class U> using exbi	= typename units::detail::prefix<std::ratio<1152921504606846976>,	U>::type;	///< Represents the type of `class U` with the binary 'exbi' prefix appended.	@details E.g. exbi<bytes> represents bytes*2^60	@tparam U unit type to apply the prefix to.
+	/** @} @} */
+
+	//------------------------------
+	//	CONVERSION TRAITS
+	//------------------------------
+
+	namespace traits
+	{
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which checks whether two units can be converted to each other
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `is_convertible_unit<U1, U2>::value` to test
+		 *				whether `class U1` is convertible to `class U2`. Note: convertible has both the semantic meaning,
+		 *				(i.e. meters can be converted to feet), and the c++ meaning of conversion (type meters can be
+		 *				converted to type feet). Conversion is always symmetric, so if U1 is convertible to U2, then
+		 *				U2 will be convertible to U1.
+		 * @tparam		U1 Unit to convert from.
+		 * @tparam		U2 Unit to convert to.
+		 * @sa			is_convertible_unit_t
+		 */
+		template<class U1, class U2>
+		struct is_convertible_unit : std::is_same <traits::base_unit_of<typename units::traits::unit_traits<U1>::base_unit_type>,
+			base_unit_of<typename units::traits::unit_traits<U2>::base_unit_type >> {};
+	}
+
+	//------------------------------
+	//	CONVERSION FUNCTION
+	//------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		constexpr inline UNIT_LIB_DEFAULT_TYPE pow(UNIT_LIB_DEFAULT_TYPE x, unsigned long long y)
+		{
+			return y == 0 ? 1.0 : x * pow(x, y - 1);
+		}
+
+		constexpr inline UNIT_LIB_DEFAULT_TYPE abs(UNIT_LIB_DEFAULT_TYPE x)
+		{
+			return x < 0 ? -x : x;
+		}
+
+		/// convert dispatch for units which are both the same
+		template<class Ratio, class PiRatio, class Translation, bool piRequired, bool translationRequired, typename T>
+		static inline constexpr T convert(const T& value, std::true_type, std::integral_constant<bool, piRequired>, std::integral_constant<bool, translationRequired>) noexcept
+		{
+			return value;
+		}
+
+		template<std::size_t Ratio_num, std::size_t Ratio_den>
+		struct normal_convert
+		{
+			template<typename T>
+			inline constexpr T operator()(const T& value) const noexcept
+			{
+				return value * Ratio_num / Ratio_den;
+			}
+		};
+
+		template<std::size_t Ratio_num>
+		struct normal_convert<Ratio_num, 1>
+		{
+			template<typename T>
+			inline constexpr T operator()(const T& value) const noexcept
+			{
+				return value * Ratio_num;
+			}
+		};
+
+		template<std::size_t Ratio_den>
+		struct normal_convert<1, Ratio_den>
+		{
+			template<typename T>
+			inline constexpr T operator()(const T& value) const noexcept
+			{
+				return value / Ratio_den;
+			}
+		};
+
+		template<>
+		struct normal_convert<1, 1>
+		{
+			template<typename T>
+			inline constexpr T operator()(const T& value) const noexcept
+			{
+				return value;
+			}
+		};
+
+		/// convert dispatch for units of different types w/ no translation and no PI
+		template<class Ratio, class PiRatio, class Translation, typename T>
+		static inline constexpr T convert(const T& value, std::false_type, std::false_type, std::false_type) noexcept
+		{
+			return normal_convert<Ratio::num, Ratio::den>{}(value);
+		}
+
+		/// convert dispatch for units of different types w/ no translation, but has PI in numerator
+		// constepxr with PI in numerator
+		template<class Ratio, class PiRatio, class Translation, typename T>
+		static inline constexpr
+		std::enable_if_t<(PiRatio::num / PiRatio::den >= 1 && PiRatio::num % PiRatio::den == 0), T>
+		convert(const T& value, std::false_type, std::true_type, std::false_type) noexcept
+		{
+			return normal_convert<Ratio::num, Ratio::den>{}(value) * pow(constants::detail::PI_VAL, PiRatio::num / PiRatio::den);
+		}
+
+		/// convert dispatch for units of different types w/ no translation, but has PI in denominator
+		// constexpr with PI in denominator
+		template<class Ratio, class PiRatio, class Translation, typename T>
+		static inline constexpr
+		std::enable_if_t<(PiRatio::num / PiRatio::den <= -1 && PiRatio::num % PiRatio::den == 0), T>
+ 		convert(const T& value, std::false_type, std::true_type, std::false_type) noexcept
+ 		{
+ 			return normal_convert<Ratio::num, Ratio::den>{}(value) / pow(constants::detail::PI_VAL, -PiRatio::num / PiRatio::den);
+ 		}
+
+		/// convert dispatch for units of different types w/ no translation, but has PI in numerator
+		// Not constexpr - uses std::pow
+		template<class Ratio, class PiRatio, class Translation, typename T>
+		static inline // sorry, this can't be constexpr!
+		std::enable_if_t<(PiRatio::num / PiRatio::den < 1 && PiRatio::num / PiRatio::den > -1), T>
+		convert(const T& value, std::false_type, std::true_type, std::false_type) noexcept
+		{
+			return normal_convert<Ratio::num, Ratio::den>{}(value) * std::pow(constants::detail::PI_VAL, PiRatio::num / PiRatio::den);
+		}
+
+		/// convert dispatch for units of different types with a translation, but no PI
+		template<class Ratio, class PiRatio, class Translation, typename T>
+		static inline constexpr T convert(const T& value, std::false_type, std::false_type, std::true_type) noexcept
+		{
+			return normal_convert<Ratio::num, Ratio::den>{}(value) + (static_cast<UNIT_LIB_DEFAULT_TYPE>(Translation::num) / Translation::den);
+		}
+
+		/// convert dispatch for units of different types with a translation AND PI
+		template<class Ratio, class PiRatio, class Translation, typename T>
+		static inline constexpr T convert(const T& value, std::false_type isSame, std::true_type piRequired, std::true_type) noexcept
+		{
+			return convert<Ratio, PiRatio, Translation>(value, isSame, piRequired, std::false_type()) + (static_cast<UNIT_LIB_DEFAULT_TYPE>(Translation::num) / Translation::den);
+		}
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @ingroup		Conversion
+	 * @brief		converts a <i>value</i> from one type to another.
+	 * @details		Converts a <i>value</i> of a built-in arithmetic type to another unit. This does not change
+	 *				the type of <i>value</i>, only what it contains. E.g. @code double result = convert<length::meters, length::feet>(1.0);	// result == 3.28084 @endcode
+	 * @sa			unit_t	for implicit conversion of unit containers.
+	 * @tparam		UnitFrom unit tag to convert <i>value</i> from. Must be a `unit` type (i.e. is_unit<UnitFrom>::value == true),
+	 *				and must be convertible to `UnitTo` (i.e. is_convertible_unit<UnitFrom, UnitTo>::value == true).
+	 * @tparam		UnitTo unit tag to convert <i>value</i> to. Must be a `unit` type (i.e. is_unit<UnitTo>::value == true),
+	 *				and must be convertible from `UnitFrom` (i.e. is_convertible_unit<UnitFrom, UnitTo>::value == true).
+	 * @tparam		T type of <i>value</i>. It is inferred from <i>value</i>, and is expected to be a built-in arithmetic type.
+	 * @param[in]	value Arithmetic value to convert from `UnitFrom` to `UnitTo`. The value should represent
+	 *				a quantity in units of `UnitFrom`.
+	 * @returns		value, converted from units of `UnitFrom` to `UnitTo`.
+	 */
+	template<class UnitFrom, class UnitTo, typename T = UNIT_LIB_DEFAULT_TYPE>
+	static inline constexpr T convert(const T& value) noexcept
+	{
+		static_assert(traits::is_unit<UnitFrom>::value, "Template parameter `UnitFrom` must be a `unit` type.");
+		static_assert(traits::is_unit<UnitTo>::value, "Template parameter `UnitTo` must be a `unit` type.");
+		static_assert(traits::is_convertible_unit<UnitFrom, UnitTo>::value, "Units are not compatible.");
+
+		using Ratio = std::ratio_divide<typename UnitFrom::conversion_ratio, typename UnitTo::conversion_ratio>;
+		using PiRatio = std::ratio_subtract<typename UnitFrom::pi_exponent_ratio, typename UnitTo::pi_exponent_ratio>;
+		using Translation = std::ratio_divide<std::ratio_subtract<typename UnitFrom::translation_ratio, typename UnitTo::translation_ratio>, typename UnitTo::conversion_ratio>;
+
+		using isSame = typename std::is_same<std::decay_t<UnitFrom>, std::decay_t<UnitTo>>::type;
+		using piRequired = std::integral_constant<bool, !(std::is_same<std::ratio<0>, PiRatio>::value)>;
+		using translationRequired = std::integral_constant<bool, !(std::is_same<std::ratio<0>, Translation>::value)>;
+
+		return units::detail::convert<Ratio, PiRatio, Translation>
+			(value, isSame{}, piRequired{}, translationRequired{});
+	}
+
+	//----------------------------------
+	//	NON-LINEAR SCALE TRAITS
+	//----------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace traits
+	{
+		namespace detail
+		{
+			/**
+			* @brief		implementation of has_operator_parenthesis
+			* @details		checks that operator() returns the same type as `Ret`
+			*/
+			template<class T, class Ret>
+			struct has_operator_parenthesis_impl
+			{
+				template<class U>
+				static constexpr auto test(U*) -> decltype(std::declval<U>()()) { return decltype(std::declval<U>()()){}; }
+				template<typename>
+				static constexpr std::false_type test(...) { return std::false_type{}; }
+
+				using type = typename std::is_same<Ret, decltype(test<T>(0))>::type;
+			};
+		}
+
+		/**
+		 * @brief		checks that `class T` has an `operator()` member which returns `Ret`
+		 * @details		used as part of the linear_scale concept.
+		 */
+		template<class T, class Ret>
+		struct has_operator_parenthesis : traits::detail::has_operator_parenthesis_impl<T, Ret>::type {};
+	}
+
+	namespace traits
+	{
+		namespace detail
+		{
+			/**
+			* @brief		implementation of has_value_member
+			* @details		checks for a member named `m_member` with type `Ret`
+			*/
+			template<class T, class Ret>
+			struct has_value_member_impl
+			{
+				template<class U>
+				static constexpr auto test(U* p) -> decltype(p->m_value) { return p->m_value; }
+				template<typename>
+				static constexpr auto test(...)->std::false_type { return std::false_type{}; }
+
+				using type = typename std::is_same<std::decay_t<Ret>, std::decay_t<decltype(test<T>(0))>>::type;
+			};
+		}
+
+		/**
+		 * @brief		checks for a member named `m_member` with type `Ret`
+		 * @details		used as part of the linear_scale concept checker.
+		 */
+		template<class T, class Ret>
+		struct has_value_member : traits::detail::has_value_member_impl<T, Ret>::type {};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	namespace traits
+	{
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which tests that `class T` meets the requirements for a non-linear scale
+		 * @details		A non-linear scale must:
+		 *				- be default constructible
+		 *				- have an `operator()` member which returns the non-linear value stored in the scale
+		 *				- have an accessible `m_value` member type which stores the linearized value in the scale.
+		 *
+		 *				Linear/nonlinear scales are used by `units::unit` to store values and scale them
+		 *				if they represent things like dB.
+		 */
+		template<class T, class Ret>
+		struct is_nonlinear_scale : std::integral_constant<bool,
+			std::is_default_constructible<T>::value &&
+			has_operator_parenthesis<T, Ret>::value &&
+			has_value_member<T, Ret>::value &&
+			std::is_trivial<T>::value>
+		{};
+	}
+
+	//------------------------------
+	//	UNIT_T TYPE TRAITS
+	//------------------------------
+
+	namespace traits
+	{
+#ifdef FOR_DOXYGEN_PURPOSOES_ONLY
+		/**
+		* @ingroup		TypeTraits
+		* @brief		Trait for accessing the publically defined types of `units::unit_t`
+		* @details		The units library determines certain properties of the unit_t types passed to them
+		*				and what they represent by using the members of the corresponding unit_t_traits instantiation.
+		*/
+		template<typename T>
+		struct unit_t_traits
+		{
+			typedef typename T::non_linear_scale_type non_linear_scale_type;	///< Type of the unit_t non_linear_scale (e.g. linear_scale, decibel_scale). This property is used to enable the proper linear or logarithmic arithmetic functions.
+			typedef typename T::underlying_type underlying_type;				///< Underlying storage type of the `unit_t`, e.g. `double`.
+			typedef typename T::value_type value_type;							///< Synonym for underlying type. May be removed in future versions. Prefer underlying_type.
+			typedef typename T::unit_type unit_type;							///< Type of unit the `unit_t` represents, e.g. `meters`
+		};
+#endif
+
+		/** @cond */	// DOXYGEN IGNORE
+		/**
+		 * @brief		unit_t_traits specialization for things which are not unit_t
+		 * @details
+		 */
+		template<typename T, typename = void>
+		struct unit_t_traits
+		{
+			typedef void non_linear_scale_type;
+			typedef void underlying_type;
+			typedef void value_type;
+			typedef void unit_type;
+		};
+
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait for accessing the publically defined types of `units::unit_t`
+		 * @details
+		 */
+		template<typename T>
+		struct unit_t_traits <T, typename void_t<
+			typename T::non_linear_scale_type,
+			typename T::underlying_type,
+			typename T::value_type,
+			typename T::unit_type>::type>
+		{
+			typedef typename T::non_linear_scale_type non_linear_scale_type;
+			typedef typename T::underlying_type underlying_type;
+			typedef typename T::value_type value_type;
+			typedef typename T::unit_type unit_type;
+		};
+		/** @endcond */	// END DOXYGEN IGNORE
+	}
+
+	namespace traits
+	{
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which tests whether two container types derived from `unit_t` are convertible to each other
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `is_convertible_unit_t<U1, U2>::value` to test
+		 *				whether `class U1` is convertible to `class U2`. Note: convertible has both the semantic meaning,
+		 *				(i.e. meters can be converted to feet), and the c++ meaning of conversion (type meters can be
+		 *				converted to type feet). Conversion is always symmetric, so if U1 is convertible to U2, then
+		 *				U2 will be convertible to U1.
+		 * @tparam		U1 Unit to convert from.
+		 * @tparam		U2 Unit to convert to.
+		 * @sa			is_convertible_unit
+		 */
+		template<class U1, class U2>
+		struct is_convertible_unit_t : std::integral_constant<bool,
+			is_convertible_unit<typename units::traits::unit_t_traits<U1>::unit_type, typename units::traits::unit_t_traits<U2>::unit_type>::value>
+		{};
+	}
+
+	//----------------------------------
+	//	UNIT TYPE
+	//----------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	// forward declaration
+	template<typename T> struct linear_scale;
+	template<typename T> struct decibel_scale;
+
+	namespace detail
+	{
+		/**
+		* @brief		helper type to identify units.
+		* @details		A non-templated base class for `unit` which enables RTTI testing.
+		*/
+		struct _unit_t {};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	namespace traits
+	{
+		// forward declaration
+		#if !defined(_MSC_VER) || _MSC_VER > 1800 // bug in VS2013 prevents this from working
+		template<typename... T> struct is_dimensionless_unit;
+		#else
+		template<typename T1, typename T2 = T1, typename T3 = T1> struct is_dimensionless_unit;
+		#endif
+
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Traits which tests if a class is a `unit`
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `is_unit<T>::value` to test
+		 *				whether `class T` implements a `unit`.
+		 */
+		template<class T>
+		struct is_unit_t : std::is_base_of<units::detail::_unit_t, T>::type {};
+	}
+
+	/**
+	 * @ingroup		UnitContainers
+	 * @brief		Container for values which represent quantities of a given unit.
+	 * @details		Stores a value which represents a quantity in the given units. Unit containers
+	 *				(except scalar values) are *not* convertible to built-in c++ types, in order to
+	 *				provide type safety in dimensional analysis. Unit containers *are* implicitly
+	 *				convertible to other compatible unit container types. Unit containers support
+	 *				various types of arithmetic operations, depending on their scale type.
+	 *
+	 *				The value of a `unit_t` can only be changed on construction, or by assignment
+	 *				from another `unit_t` type. If necessary, the underlying value can be accessed
+	 *				using `operator()`: @code
+	 *				meter_t m(5.0);
+	 *				double val = m(); // val == 5.0	@endcode.
+	 * @tparam		Units unit tag for which type of units the `unit_t` represents (e.g. meters)
+	 * @tparam		T underlying type of the storage. Defaults to double.
+	 * @tparam		NonLinearScale optional scale class for the units. Defaults to linear (i.e. does
+	 *				not scale the unit value). Examples of non-linear scales could be logarithmic,
+	 *				decibel, or richter scales. Non-linear scales must adhere to the non-linear-scale
+	 *				concept, i.e. `is_nonlinear_scale<...>::value` must be `true`.
+	 * @sa
+	 *				- \ref lengthContainers "length unit containers"
+	 *				- \ref massContainers "mass unit containers"
+	 *				- \ref timeContainers "time unit containers"
+	 *				- \ref angleContainers "angle unit containers"
+	 *				- \ref currentContainers "current unit containers"
+	 *				- \ref temperatureContainers "temperature unit containers"
+	 *				- \ref substanceContainers "substance unit containers"
+	 *				- \ref luminousIntensityContainers "luminous intensity unit containers"
+	 *				- \ref solidAngleContainers "solid angle unit containers"
+	 *				- \ref frequencyContainers "frequency unit containers"
+	 *				- \ref velocityContainers "velocity unit containers"
+	 *				- \ref angularVelocityContainers "angular velocity unit containers"
+	 *				- \ref accelerationContainers "acceleration unit containers"
+	 *				- \ref forceContainers "force unit containers"
+	 *				- \ref pressureContainers "pressure unit containers"
+	 *				- \ref chargeContainers "charge unit containers"
+	 *				- \ref energyContainers "energy unit containers"
+	 *				- \ref powerContainers "power unit containers"
+	 *				- \ref voltageContainers "voltage unit containers"
+	 *				- \ref capacitanceContainers "capacitance unit containers"
+	 *				- \ref impedanceContainers "impedance unit containers"
+	 *				- \ref magneticFluxContainers "magnetic flux unit containers"
+	 *				- \ref magneticFieldStrengthContainers "magnetic field strength unit containers"
+	 *				- \ref inductanceContainers "inductance unit containers"
+	 *				- \ref luminousFluxContainers "luminous flux unit containers"
+	 *				- \ref illuminanceContainers "illuminance unit containers"
+	 *				- \ref radiationContainers "radiation unit containers"
+	 *				- \ref torqueContainers "torque unit containers"
+	 *				- \ref areaContainers "area unit containers"
+	 *				- \ref volumeContainers "volume unit containers"
+	 *				- \ref densityContainers "density unit containers"
+	 *				- \ref concentrationContainers "concentration unit containers"
+	 *				- \ref constantContainers "constant unit containers"
+	 */
+	template<class Units, typename T = UNIT_LIB_DEFAULT_TYPE, template<typename> class NonLinearScale = linear_scale>
+	class unit_t : public NonLinearScale<T>, units::detail::_unit_t
+	{
+		static_assert(traits::is_unit<Units>::value, "Template parameter `Units` must be a unit tag. Check that you aren't using a unit type (_t).");
+		static_assert(traits::is_nonlinear_scale<NonLinearScale<T>, T>::value, "Template parameter `NonLinearScale` does not conform to the `is_nonlinear_scale` concept.");
+
+	protected:
+
+		using nls = NonLinearScale<T>;
+		using nls::m_value;
+
+	public:
+
+		typedef NonLinearScale<T> non_linear_scale_type;											///< Type of the non-linear scale of the unit_t (e.g. linear_scale)
+		typedef T underlying_type;																	///< Type of the underlying storage of the unit_t (e.g. double)
+		typedef T value_type;																		///< Synonym for underlying type. May be removed in future versions. Prefer underlying_type.
+		typedef Units unit_type;																	///< Type of `unit` the `unit_t` represents (e.g. meters)
+
+		/**
+		 * @ingroup		Constructors
+		 * @brief		default constructor.
+		 */
+		constexpr unit_t() = default;
+
+		/**
+		 * @brief		constructor
+		 * @details		constructs a new unit_t using the non-linear scale's constructor.
+		 * @param[in]	value	unit value magnitude.
+		 * @param[in]	args	additional constructor arguments are forwarded to the non-linear scale constructor. Which
+		 *						args are required depends on which scale is used. For the default (linear) scale,
+		 *						no additional args are necessary.
+		 */
+		template<class... Args>
+		inline explicit constexpr unit_t(const T value, const Args&... args) noexcept : nls(value, args...)
+		{
+
+		}
+
+		/**
+		 * @brief		constructor
+		 * @details		enable implicit conversions from T types ONLY for linear scalar units
+		 * @param[in]	value value of the unit_t
+		 */
+		template<class Ty, class = typename std::enable_if<traits::is_dimensionless_unit<Units>::value && std::is_arithmetic<Ty>::value>::type>
+		inline constexpr unit_t(const Ty value) noexcept : nls(value)
+		{
+
+		}
+
+		/**
+		 * @brief		chrono constructor
+		 * @details		enable implicit conversions from std::chrono::duration types ONLY for time units
+		 * @param[in]	value value of the unit_t
+		 */
+		template<class Rep, class Period, class = std::enable_if_t<std::is_arithmetic<Rep>::value && traits::is_ratio<Period>::value>>
+		inline constexpr unit_t(const std::chrono::duration<Rep, Period>& value) noexcept :
+		nls(units::convert<unit<std::ratio<1,1000000000>, category::time_unit>, Units>(static_cast<T>(std::chrono::duration_cast<std::chrono::nanoseconds>(value).count())))
+		{
+
+		}
+
+		/**
+		 * @brief		copy constructor (converting)
+		 * @details		performs implicit unit conversions if required.
+		 * @param[in]	rhs unit to copy.
+		 */
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs>
+		inline constexpr unit_t(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) noexcept :
+		nls(units::convert<UnitsRhs, Units, T>(rhs.m_value), std::true_type() /*store linear value*/)
+		{
+
+		}
+
+		/**
+		 * @brief		assignment
+		 * @details		performs implicit unit conversions if required
+		 * @param[in]	rhs unit to copy.
+		 */
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs>
+		inline unit_t& operator=(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) noexcept
+		{
+			nls::m_value = units::convert<UnitsRhs, Units, T>(rhs.m_value);
+			return *this;
+		}
+
+		/**
+		* @brief		assignment
+		* @details		performs implicit conversions from built-in types ONLY for scalar units
+		* @param[in]	rhs value to copy.
+		*/
+		template<class Ty, class = std::enable_if_t<traits::is_dimensionless_unit<Units>::value && std::is_arithmetic<Ty>::value>>
+		inline unit_t& operator=(const Ty& rhs) noexcept
+		{
+			nls::m_value = rhs;
+			return *this;
+		}
+
+		/**
+		 * @brief		less-than
+		 * @details		compares the linearized value of two units. Performs unit conversions if necessary.
+		 * @param[in]	rhs right-hand side unit for the comparison
+		 * @returns		true IFF the value of `this` is less than the value of `rhs`
+		 */
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs>
+		inline constexpr bool operator<(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) const noexcept
+		{
+			return (nls::m_value < units::convert<UnitsRhs, Units>(rhs.m_value));
+		}
+
+		/**
+		 * @brief		less-than or equal
+		 * @details		compares the linearized value of two units. Performs unit conversions if necessary.
+		 * @param[in]	rhs right-hand side unit for the comparison
+		 * @returns		true IFF the value of `this` is less than or equal to the value of `rhs`
+		 */
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs>
+		inline constexpr bool operator<=(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) const noexcept
+		{
+			return (nls::m_value <= units::convert<UnitsRhs, Units>(rhs.m_value));
+		}
+
+		/**
+		 * @brief		greater-than
+		 * @details		compares the linearized value of two units. Performs unit conversions if necessary.
+		 * @param[in]	rhs right-hand side unit for the comparison
+		 * @returns		true IFF the value of `this` is greater than the value of `rhs`
+		 */
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs>
+		inline constexpr bool operator>(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) const noexcept
+		{
+			return (nls::m_value > units::convert<UnitsRhs, Units>(rhs.m_value));
+		}
+
+		/**
+		 * @brief		greater-than or equal
+		 * @details		compares the linearized value of two units. Performs unit conversions if necessary.
+		 * @param[in]	rhs right-hand side unit for the comparison
+		 * @returns		true IFF the value of `this` is greater than or equal to the value of `rhs`
+		 */
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs>
+		inline constexpr bool operator>=(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) const noexcept
+		{
+			return (nls::m_value >= units::convert<UnitsRhs, Units>(rhs.m_value));
+		}
+
+		/**
+		 * @brief		equality
+		 * @details		compares the linearized value of two units. Performs unit conversions if necessary.
+		 * @param[in]	rhs right-hand side unit for the comparison
+		 * @returns		true IFF the value of `this` exactly equal to the value of rhs.
+		 * @note		This may not be suitable for all applications when the underlying_type of unit_t is a double.
+		 */
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs, std::enable_if_t<std::is_floating_point<T>::value || std::is_floating_point<Ty>::value, int> = 0>
+		inline constexpr bool operator==(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) const noexcept
+		{
+			return detail::abs(nls::m_value - units::convert<UnitsRhs, Units>(rhs.m_value)) < std::numeric_limits<T>::epsilon() *
+				detail::abs(nls::m_value + units::convert<UnitsRhs, Units>(rhs.m_value)) ||
+				detail::abs(nls::m_value - units::convert<UnitsRhs, Units>(rhs.m_value)) < std::numeric_limits<T>::min();
+		}
+
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs, std::enable_if_t<std::is_integral<T>::value && std::is_integral<Ty>::value, int> = 0>
+		inline constexpr bool operator==(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) const noexcept
+		{
+			return nls::m_value == units::convert<UnitsRhs, Units>(rhs.m_value);
+		}
+
+		/**
+		 * @brief		inequality
+		 * @details		compares the linearized value of two units. Performs unit conversions if necessary.
+		 * @param[in]	rhs right-hand side unit for the comparison
+		 * @returns		true IFF the value of `this` is not equal to the value of rhs.
+		 * @note		This may not be suitable for all applications when the underlying_type of unit_t is a double.
+		 */
+		template<class UnitsRhs, typename Ty, template<typename> class NlsRhs>
+		inline constexpr bool operator!=(const unit_t<UnitsRhs, Ty, NlsRhs>& rhs) const noexcept
+		{
+			return !(*this == rhs);
+		}
+
+		/**
+		 * @brief		unit value
+		 * @returns		value of the unit in it's underlying, non-safe type.
+		 */
+		inline constexpr underlying_type value() const noexcept
+		{
+			return static_cast<underlying_type>(*this);
+		}
+
+		/**
+		 * @brief		unit value
+		 * @returns		value of the unit converted to an arithmetic, non-safe type.
+		 */
+		template<typename Ty, class = std::enable_if_t<std::is_arithmetic<Ty>::value>>
+		inline constexpr Ty to() const noexcept
+		{
+			return static_cast<Ty>(*this);
+		}
+
+		/**
+		 * @brief		linearized unit value
+		 * @returns		linearized value of unit which has a non-linear scale. For `unit_t` types with
+		 *				linear scales, this is equivalent to `value`.
+		 */
+		template<typename Ty, class = std::enable_if_t<std::is_arithmetic<Ty>::value>>
+		inline constexpr Ty toLinearized() const noexcept
+		{
+			return static_cast<Ty>(m_value);
+		}
+
+		/**
+		 * @brief		conversion
+		 * @details		Converts to a different unit container. Units can be converted to other containers
+		 *				implicitly, but this can be used in cases where explicit notation of a conversion
+		 *				is beneficial, or where an r-value container is needed.
+		 * @tparam		U unit (not unit_t) to convert to
+		 * @returns		a unit container with the specified units containing the equivalent value to
+		 *				*this.
+		 */
+		template<class U>
+		inline constexpr unit_t<U> convert() const noexcept
+		{
+			static_assert(traits::is_unit<U>::value, "Template parameter `U` must be a unit type.");
+			return unit_t<U>(*this);
+		}
+
+		/**
+		 * @brief		implicit type conversion.
+		 * @details		only enabled for scalar unit types.
+		 */
+		template<class Ty, std::enable_if_t<traits::is_dimensionless_unit<Units>::value && std::is_arithmetic<Ty>::value, int> = 0>
+		inline constexpr operator Ty() const noexcept
+		{
+			// this conversion also resolves any PI exponents, by converting from a non-zero PI ratio to a zero-pi ratio.
+			return static_cast<Ty>(units::convert<Units, unit<std::ratio<1>, units::category::scalar_unit>>((*this)()));
+		}
+
+		/**
+		 * @brief		explicit type conversion.
+		 * @details		only enabled for non-dimensionless unit types.
+		 */
+		template<class Ty, std::enable_if_t<!traits::is_dimensionless_unit<Units>::value && std::is_arithmetic<Ty>::value, int> = 0>
+		inline constexpr explicit operator Ty() const noexcept
+		{
+			return static_cast<Ty>((*this)());
+		}
+
+		/**
+		 * @brief		chrono implicit type conversion.
+		 * @details		only enabled for time unit types.
+		 */
+		template<typename U = Units, std::enable_if_t<units::traits::is_convertible_unit<U, unit<std::ratio<1>, category::time_unit>>::value, int> = 0>
+		inline constexpr operator std::chrono::nanoseconds() const noexcept
+		{
+			return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::duration<double, std::nano>(units::convert<Units, unit<std::ratio<1,1000000000>, category::time_unit>>((*this)())));
+		}
+
+		/**
+		 * @brief		returns the unit name
+		 */
+		inline constexpr const char* name() const noexcept
+		{
+			return units::name(*this);
+		}
+
+		/**
+		 * @brief		returns the unit abbreviation
+		 */
+		inline constexpr const char* abbreviation() const noexcept
+		{
+			return units::abbreviation(*this);
+		}
+
+	public:
+
+		template<class U, typename Ty, template<typename> class Nlt>
+		friend class unit_t;
+	};
+
+	//------------------------------
+	//	UNIT_T NON-MEMBER FUNCTIONS
+	//------------------------------
+
+	/**
+	 * @ingroup		UnitContainers
+	 * @brief		Constructs a unit container from an arithmetic type.
+	 * @details		make_unit can be used to construct a unit container from an arithmetic type, as an alternative to
+	 *				using the explicit constructor. Unlike the explicit constructor it forces the user to explicitly
+	 *				specify the units.
+	 * @tparam		UnitType Type to construct.
+	 * @tparam		Ty		Arithmetic type.
+	 * @param[in]	value	Arithmetic value that represents a quantity in units of `UnitType`.
+	 */
+	template<class UnitType, typename T, class = std::enable_if_t<std::is_arithmetic<T>::value>>
+	inline constexpr UnitType make_unit(const T value) noexcept
+	{
+		static_assert(traits::is_unit_t<UnitType>::value, "Template parameter `UnitType` must be a unit type (_t).");
+
+		return UnitType(value);
+	}
+
+#if !defined(UNIT_LIB_DISABLE_IOSTREAM)
+	template<class Units, typename T, template<typename> class NonLinearScale>
+	inline std::ostream& operator<<(std::ostream& os, const unit_t<Units, T, NonLinearScale>& obj) noexcept
+	{
+		using BaseUnits = unit<std::ratio<1>, typename traits::unit_traits<Units>::base_unit_type>;
+		os << convert<Units, BaseUnits>(obj());
+
+		if (traits::unit_traits<Units>::base_unit_type::meter_ratio::num != 0) { os << " m"; }
+		if (traits::unit_traits<Units>::base_unit_type::meter_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::meter_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::meter_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::meter_ratio::den != 1) { os << "/"   << traits::unit_traits<Units>::base_unit_type::meter_ratio::den; }
+
+		if (traits::unit_traits<Units>::base_unit_type::kilogram_ratio::num != 0) { os << " kg"; }
+		if (traits::unit_traits<Units>::base_unit_type::kilogram_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::kilogram_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::kilogram_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::kilogram_ratio::den != 1) { os << "/" << traits::unit_traits<Units>::base_unit_type::kilogram_ratio::den; }
+
+		if (traits::unit_traits<Units>::base_unit_type::second_ratio::num != 0) { os << " s"; }
+		if (traits::unit_traits<Units>::base_unit_type::second_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::second_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::second_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::second_ratio::den != 1) { os << "/" << traits::unit_traits<Units>::base_unit_type::second_ratio::den; }
+
+		if (traits::unit_traits<Units>::base_unit_type::ampere_ratio::num != 0) { os << " A"; }
+		if (traits::unit_traits<Units>::base_unit_type::ampere_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::ampere_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::ampere_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::ampere_ratio::den != 1) { os << "/" << traits::unit_traits<Units>::base_unit_type::ampere_ratio::den; }
+
+		if (traits::unit_traits<Units>::base_unit_type::kelvin_ratio::num != 0) { os << " K"; }
+		if (traits::unit_traits<Units>::base_unit_type::kelvin_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::kelvin_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::kelvin_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::kelvin_ratio::den != 1) { os << "/" << traits::unit_traits<Units>::base_unit_type::kelvin_ratio::den; }
+
+		if (traits::unit_traits<Units>::base_unit_type::mole_ratio::num != 0) { os << " mol"; }
+		if (traits::unit_traits<Units>::base_unit_type::mole_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::mole_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::mole_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::mole_ratio::den != 1) { os << "/" << traits::unit_traits<Units>::base_unit_type::mole_ratio::den; }
+
+		if (traits::unit_traits<Units>::base_unit_type::candela_ratio::num != 0) { os << " cd"; }
+		if (traits::unit_traits<Units>::base_unit_type::candela_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::candela_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::candela_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::candela_ratio::den != 1) { os << "/" << traits::unit_traits<Units>::base_unit_type::candela_ratio::den; }
+
+		if (traits::unit_traits<Units>::base_unit_type::radian_ratio::num != 0) { os << " rad"; }
+		if (traits::unit_traits<Units>::base_unit_type::radian_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::radian_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::radian_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::radian_ratio::den != 1) { os << "/" << traits::unit_traits<Units>::base_unit_type::radian_ratio::den; }
+
+		if (traits::unit_traits<Units>::base_unit_type::byte_ratio::num != 0) { os << " b"; }
+		if (traits::unit_traits<Units>::base_unit_type::byte_ratio::num != 0 &&
+			traits::unit_traits<Units>::base_unit_type::byte_ratio::num != 1) { os << "^" << traits::unit_traits<Units>::base_unit_type::byte_ratio::num; }
+		if (traits::unit_traits<Units>::base_unit_type::byte_ratio::den != 1) { os << "/" << traits::unit_traits<Units>::base_unit_type::byte_ratio::den; }
+
+		return os;
+	}
+#endif
+
+	template<class Units, typename T, template<typename> class NonLinearScale, typename RhsType>
+	inline constexpr unit_t<Units, T, NonLinearScale>& operator+=(unit_t<Units, T, NonLinearScale>& lhs, const RhsType& rhs) noexcept
+	{
+		static_assert(traits::is_convertible_unit_t<unit_t<Units, T, NonLinearScale>, RhsType>::value ||
+			(traits::is_dimensionless_unit<decltype(lhs)>::value && std::is_arithmetic<RhsType>::value),
+			"parameters are not compatible units.");
+
+		lhs = lhs + rhs;
+		return lhs;
+	}
+
+	template<class Units, typename T, template<typename> class NonLinearScale, typename RhsType>
+	inline constexpr unit_t<Units, T, NonLinearScale>& operator-=(unit_t<Units, T, NonLinearScale>& lhs, const RhsType& rhs) noexcept
+	{
+		static_assert(traits::is_convertible_unit_t<unit_t<Units, T, NonLinearScale>, RhsType>::value ||
+			(traits::is_dimensionless_unit<decltype(lhs)>::value && std::is_arithmetic<RhsType>::value),
+			"parameters are not compatible units.");
+
+		lhs = lhs - rhs;
+		return lhs;
+	}
+
+	template<class Units, typename T, template<typename> class NonLinearScale, typename RhsType>
+	inline constexpr unit_t<Units, T, NonLinearScale>& operator*=(unit_t<Units, T, NonLinearScale>& lhs, const RhsType& rhs) noexcept
+	{
+		static_assert((traits::is_dimensionless_unit<RhsType>::value || std::is_arithmetic<RhsType>::value),
+			"right-hand side parameter must be dimensionless.");
+
+		lhs = lhs * rhs;
+		return lhs;
+	}
+
+	template<class Units, typename T, template<typename> class NonLinearScale, typename RhsType>
+	inline constexpr unit_t<Units, T, NonLinearScale>& operator/=(unit_t<Units, T, NonLinearScale>& lhs, const RhsType& rhs) noexcept
+	{
+		static_assert((traits::is_dimensionless_unit<RhsType>::value || std::is_arithmetic<RhsType>::value),
+			"right-hand side parameter must be dimensionless.");
+
+		lhs = lhs / rhs;
+		return lhs;
+	}
+
+	//------------------------------
+	//	UNIT_T UNARY OPERATORS
+	//------------------------------
+
+	// unary addition: +T
+	template<class Units, typename T, template<typename> class NonLinearScale>
+	inline constexpr unit_t<Units, T, NonLinearScale> operator+(const unit_t<Units, T, NonLinearScale>& u) noexcept
+	{
+		return u;
+	}
+
+	// prefix increment: ++T
+	template<class Units, typename T, template<typename> class NonLinearScale>
+	inline constexpr unit_t<Units, T, NonLinearScale>& operator++(unit_t<Units, T, NonLinearScale>& u) noexcept
+	{
+		u = unit_t<Units, T, NonLinearScale>(u() + 1);
+		return u;
+	}
+
+	// postfix increment: T++
+	template<class Units, typename T, template<typename> class NonLinearScale>
+	inline constexpr unit_t<Units, T, NonLinearScale> operator++(unit_t<Units, T, NonLinearScale>& u, int) noexcept
+	{
+		auto ret = u;
+		u = unit_t<Units, T, NonLinearScale>(u() + 1);
+		return ret;
+	}
+
+	// unary addition: -T
+	template<class Units, typename T, template<typename> class NonLinearScale>
+	inline constexpr unit_t<Units, T, NonLinearScale> operator-(const unit_t<Units, T, NonLinearScale>& u) noexcept
+	{
+		return unit_t<Units, T, NonLinearScale>(-u());
+	}
+
+	// prefix increment: --T
+	template<class Units, typename T, template<typename> class NonLinearScale>
+	inline constexpr unit_t<Units, T, NonLinearScale>& operator--(unit_t<Units, T, NonLinearScale>& u) noexcept
+	{
+		u = unit_t<Units, T, NonLinearScale>(u() - 1);
+		return u;
+	}
+
+	// postfix increment: T--
+	template<class Units, typename T, template<typename> class NonLinearScale>
+	inline constexpr unit_t<Units, T, NonLinearScale> operator--(unit_t<Units, T, NonLinearScale>& u, int) noexcept
+	{
+		auto ret = u;
+		u = unit_t<Units, T, NonLinearScale>(u() - 1);
+		return ret;
+	}
+
+	//------------------------------
+	//	UNIT_CAST
+	//------------------------------
+
+	/**
+	 * @ingroup		Conversion
+	 * @brief		Casts a unit container to an arithmetic type.
+	 * @details		unit_cast can be used to remove the strong typing from a unit class, and convert it
+	 *				to a built-in arithmetic type. This may be useful for compatibility with libraries
+	 *				and legacy code that don't support `unit_t` types. E.g
+	 * @code		meter_t unitVal(5);
+	 *  double value = units::unit_cast<double>(unitVal);	// value = 5.0
+	 * @endcode
+	 * @tparam		T		Type to cast the unit type to. Must be a built-in arithmetic type.
+	 * @param		value	Unit value to cast.
+	 * @sa			unit_t::to
+	 */
+	template<typename T, typename Units, class = std::enable_if_t<std::is_arithmetic<T>::value && traits::is_unit_t<Units>::value>>
+	inline constexpr T unit_cast(const Units& value) noexcept
+	{
+		return static_cast<T>(value);
+	}
+
+	//------------------------------
+	//	NON-LINEAR SCALE TRAITS
+	//------------------------------
+
+	// forward declaration
+	template<typename T> struct decibel_scale;
+
+	namespace traits
+	{
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which tests whether a type is inherited from a linear scale.
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `has_linear_scale<U1 [, U2, ...]>::value` to test
+		 *				one or more types to see if they represent unit_t's whose scale is linear.
+		 * @tparam		T	one or more types to test.
+		 */
+#if !defined(_MSC_VER) || _MSC_VER > 1800	// bug in VS2013 prevents this from working
+		template<typename... T>
+		struct has_linear_scale : std::integral_constant<bool, units::all_true<std::is_base_of<units::linear_scale<typename units::traits::unit_t_traits<T>::underlying_type>, T>::value...>::value > {};
+#else
+		template<typename T1, typename T2 = T1, typename T3 = T1>
+		struct has_linear_scale : std::integral_constant<bool,
+			std::is_base_of<units::linear_scale<typename units::traits::unit_t_traits<T1>::underlying_type>, T1>::value &&
+			std::is_base_of<units::linear_scale<typename units::traits::unit_t_traits<T2>::underlying_type>, T2>::value &&
+			std::is_base_of<units::linear_scale<typename units::traits::unit_t_traits<T3>::underlying_type>, T3>::value> {};
+#endif
+
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which tests whether a type is inherited from a decibel scale.
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `has_decibel_scale<U1 [, U2, ...]>::value` to test
+		 *				one or more types to see if they represent unit_t's whose scale is in decibels.
+		 * @tparam		T	one or more types to test.
+		 */
+#if !defined(_MSC_VER) || _MSC_VER > 1800	// bug in VS2013 prevents this from working
+		template<typename... T>
+		struct has_decibel_scale : std::integral_constant<bool,	units::all_true<std::is_base_of<units::decibel_scale<typename units::traits::unit_t_traits<T>::underlying_type>, T>::value...>::value> {};
+#else
+		template<typename T1, typename T2 = T1, typename T3 = T1>
+		struct has_decibel_scale : std::integral_constant<bool,
+			std::is_base_of<units::decibel_scale<typename units::traits::unit_t_traits<T1>::underlying_type>, T1>::value &&
+			std::is_base_of<units::decibel_scale<typename units::traits::unit_t_traits<T2>::underlying_type>, T2>::value &&
+			std::is_base_of<units::decibel_scale<typename units::traits::unit_t_traits<T2>::underlying_type>, T3>::value> {};
+#endif
+
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which tests whether two types has the same non-linear scale.
+		 * @details		Inherits from `std::true_type` or `std::false_type`. Use `is_same_scale<U1 , U2>::value` to test
+		 *				whether two types have the same non-linear scale.
+		 * @tparam		T1	left hand type.
+		 * @tparam		T2	right hand type
+		 */
+		template<typename T1, typename T2>
+		struct is_same_scale : std::integral_constant<bool,
+			std::is_same<typename units::traits::unit_t_traits<T1>::non_linear_scale_type, typename units::traits::unit_t_traits<T2>::non_linear_scale_type>::value>
+		{};
+	}
+
+	//----------------------------------
+	//	NON-LINEAR SCALES
+	//----------------------------------
+
+	// Non-linear transforms are used to pre and post scale units which are defined in terms of non-
+	// linear functions of their current value. A good example of a non-linear scale would be a
+	// logarithmic or decibel scale
+
+	//------------------------------
+	//	LINEAR SCALE
+	//------------------------------
+
+	/**
+	 * @brief		unit_t scale which is linear
+	 * @details		Represents units on a linear scale. This is the appropriate unit_t scale for almost
+	 *				all units almost all of the time.
+	 * @tparam		T	underlying storage type
+	 * @sa			unit_t
+	 */
+	template<typename T>
+	struct linear_scale
+	{
+		inline constexpr linear_scale() = default;													///< default constructor.
+		inline constexpr linear_scale(const linear_scale&) = default;
+		inline ~linear_scale() = default;
+		inline linear_scale& operator=(const linear_scale&) = default;
+#if defined(_MSC_VER) && (_MSC_VER > 1800)
+		inline constexpr linear_scale(linear_scale&&) = default;
+		inline linear_scale& operator=(linear_scale&&) = default;
+#endif
+		template<class... Args>
+		inline constexpr linear_scale(const T& value, Args&&...) noexcept : m_value(value) {}	///< constructor.
+		inline constexpr T operator()() const noexcept { return m_value; }							///< returns value.
+
+		T m_value;																					///< linearized value.
+	};
+
+	//----------------------------------
+	//	SCALAR (LINEAR) UNITS
+	//----------------------------------
+
+	// Scalar units are the *ONLY* units implicitly convertible to/from built-in types.
+	namespace dimensionless
+	{
+		typedef unit<std::ratio<1>, units::category::scalar_unit> scalar;
+		typedef unit<std::ratio<1>, units::category::dimensionless_unit> dimensionless;
+
+		typedef unit_t<scalar> scalar_t;
+		typedef scalar_t dimensionless_t;
+	}
+
+// ignore the redeclaration of the default template parameters
+#if defined(_MSC_VER)
+#	pragma warning(push)
+#	pragma warning(disable : 4348)
+#endif
+	UNIT_ADD_CATEGORY_TRAIT(scalar)
+	UNIT_ADD_CATEGORY_TRAIT(dimensionless)
+#if defined(_MSC_VER)
+#	pragma warning(pop)
+#endif
+
+	//------------------------------
+	//	LINEAR ARITHMETIC
+	//------------------------------
+
+	template<class UnitTypeLhs, class UnitTypeRhs, std::enable_if_t<!traits::is_same_scale<UnitTypeLhs, UnitTypeRhs>::value, int> = 0>
+	constexpr inline int operator+(const UnitTypeLhs& /* lhs */, const UnitTypeRhs& /* rhs */) noexcept
+	{
+		static_assert(traits::is_same_scale<UnitTypeLhs, UnitTypeRhs>::value, "Cannot add units with different linear/non-linear scales.");
+		return 0;
+	}
+
+	/// Addition operator for unit_t types with a linear_scale.
+	template<class UnitTypeLhs, class UnitTypeRhs, std::enable_if_t<traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value, int> = 0>
+	inline constexpr UnitTypeLhs operator+(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept
+	{
+		using UnitsLhs = typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type;
+		using UnitsRhs = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		return UnitTypeLhs(lhs() + convert<UnitsRhs, UnitsLhs>(rhs()));
+	}
+
+	/// Addition operator for scalar unit_t types with a linear_scale. Scalar types can be implicitly converted to built-in types.
+	template<typename T, std::enable_if_t<std::is_arithmetic<T>::value, int> = 0>
+	inline constexpr dimensionless::scalar_t operator+(const dimensionless::scalar_t& lhs, T rhs) noexcept
+	{
+		return dimensionless::scalar_t(lhs() + rhs);
+	}
+
+	/// Addition operator for scalar unit_t types with a linear_scale. Scalar types can be implicitly converted to built-in types.
+	template<typename T, std::enable_if_t<std::is_arithmetic<T>::value, int> = 0>
+	inline constexpr dimensionless::scalar_t operator+(T lhs, const dimensionless::scalar_t& rhs) noexcept
+	{
+		return dimensionless::scalar_t(lhs + rhs());
+	}
+
+	/// Subtraction operator for unit_t types with a linear_scale.
+	template<class UnitTypeLhs, class UnitTypeRhs, std::enable_if_t<traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value, int> = 0>
+	inline constexpr UnitTypeLhs operator-(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept
+	{
+		using UnitsLhs = typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type;
+		using UnitsRhs = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		return UnitTypeLhs(lhs() - convert<UnitsRhs, UnitsLhs>(rhs()));
+	}
+
+	/// Subtraction operator for scalar unit_t types with a linear_scale. Scalar types can be implicitly converted to built-in types.
+	template<typename T, std::enable_if_t<std::is_arithmetic<T>::value, int> = 0>
+	inline constexpr dimensionless::scalar_t operator-(const dimensionless::scalar_t& lhs, T rhs) noexcept
+	{
+		return dimensionless::scalar_t(lhs() - rhs);
+	}
+
+	/// Subtraction operator for scalar unit_t types with a linear_scale. Scalar types can be implicitly converted to built-in types.
+	template<typename T, std::enable_if_t<std::is_arithmetic<T>::value, int> = 0>
+	inline constexpr dimensionless::scalar_t operator-(T lhs, const dimensionless::scalar_t& rhs) noexcept
+	{
+		return dimensionless::scalar_t(lhs - rhs());
+	}
+
+	/// Multiplication type for convertible unit_t types with a linear scale. @returns the multiplied value, with the same type as left-hand side unit.
+	template<class UnitTypeLhs, class UnitTypeRhs,
+		std::enable_if_t<traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value && traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value, int> = 0>
+		inline constexpr auto operator*(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept -> unit_t<compound_unit<squared<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type>>>
+	{
+		using UnitsLhs = typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type;
+		using UnitsRhs = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		return  unit_t<compound_unit<squared<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type>>>
+			(lhs() * convert<UnitsRhs, UnitsLhs>(rhs()));
+	}
+
+	/// Multiplication type for non-convertible unit_t types with a linear scale. @returns the multiplied value, whose type is a compound unit of the left and right hand side values.
+	template<class UnitTypeLhs, class UnitTypeRhs,
+		std::enable_if_t<!traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value && traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value && !traits::is_dimensionless_unit<UnitTypeLhs>::value && !traits::is_dimensionless_unit<UnitTypeRhs>::value, int> = 0>
+		inline constexpr auto operator*(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept -> unit_t<compound_unit<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type, typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type>>
+	{
+		using UnitsLhs = typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type;
+		using UnitsRhs = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		return unit_t<compound_unit<UnitsLhs, UnitsRhs>>
+			(lhs() * rhs());
+	}
+
+	/// Multiplication by a dimensionless unit for unit_t types with a linear scale.
+	template<class UnitTypeLhs, typename UnitTypeRhs,
+		std::enable_if_t<traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value && !traits::is_dimensionless_unit<UnitTypeLhs>::value && traits::is_dimensionless_unit<UnitTypeRhs>::value, int> = 0>
+		inline constexpr UnitTypeLhs operator*(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept
+	{
+		// the cast makes sure factors of PI are handled as expected
+		return UnitTypeLhs(lhs() * static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs));
+	}
+
+	/// Multiplication by a dimensionless unit for unit_t types with a linear scale.
+	template<class UnitTypeLhs, typename UnitTypeRhs,
+		std::enable_if_t<traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value && traits::is_dimensionless_unit<UnitTypeLhs>::value && !traits::is_dimensionless_unit<UnitTypeRhs>::value, int> = 0>
+		inline constexpr UnitTypeRhs operator*(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept
+	{
+		// the cast makes sure factors of PI are handled as expected
+		return UnitTypeRhs(static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs) * rhs());
+	}
+
+	/// Multiplication by a scalar for unit_t types with a linear scale.
+	template<class UnitTypeLhs, typename T,
+		std::enable_if_t<std::is_arithmetic<T>::value && traits::has_linear_scale<UnitTypeLhs>::value, int> = 0>
+		inline constexpr UnitTypeLhs operator*(const UnitTypeLhs& lhs, T rhs) noexcept
+	{
+		return UnitTypeLhs(lhs() * rhs);
+	}
+
+	/// Multiplication by a scalar for unit_t types with a linear scale.
+	template<class UnitTypeRhs, typename T,
+		std::enable_if_t<std::is_arithmetic<T>::value && traits::has_linear_scale<UnitTypeRhs>::value, int> = 0>
+		inline constexpr UnitTypeRhs operator*(T lhs, const UnitTypeRhs& rhs) noexcept
+	{
+		return UnitTypeRhs(lhs * rhs());
+	}
+
+	/// Division for convertible unit_t types with a linear scale. @returns the lhs divided by rhs value, whose type is a scalar
+	template<class UnitTypeLhs, class UnitTypeRhs,
+		std::enable_if_t<traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value && traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value, int> = 0>
+		inline constexpr dimensionless::scalar_t operator/(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept
+	{
+		using UnitsLhs = typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type;
+		using UnitsRhs = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		return dimensionless::scalar_t(lhs() / convert<UnitsRhs, UnitsLhs>(rhs()));
+	}
+
+	/// Division for non-convertible unit_t types with a linear scale. @returns the lhs divided by the rhs, with a compound unit type of lhs/rhs
+	template<class UnitTypeLhs, class UnitTypeRhs,
+		std::enable_if_t<!traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value && traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value && !traits::is_dimensionless_unit<UnitTypeLhs>::value && !traits::is_dimensionless_unit<UnitTypeRhs>::value, int> = 0>
+		inline constexpr auto operator/(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept ->  unit_t<compound_unit<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type, inverse<typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type>>>
+	{
+		using UnitsLhs = typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type;
+		using UnitsRhs = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		return unit_t<compound_unit<UnitsLhs, inverse<UnitsRhs>>>
+			(lhs() / rhs());
+	}
+
+	/// Division by a dimensionless unit for unit_t types with a linear scale
+	template<class UnitTypeLhs, class UnitTypeRhs,
+		std::enable_if_t<traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value && !traits::is_dimensionless_unit<UnitTypeLhs>::value && traits::is_dimensionless_unit<UnitTypeRhs>::value, int> = 0>
+		inline constexpr UnitTypeLhs operator/(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept
+	{
+		return UnitTypeLhs(lhs() / static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs));
+	}
+
+	/// Division of a dimensionless unit  by a unit_t type with a linear scale
+	template<class UnitTypeLhs, class UnitTypeRhs,
+		std::enable_if_t<traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value && traits::is_dimensionless_unit<UnitTypeLhs>::value && !traits::is_dimensionless_unit<UnitTypeRhs>::value, int> = 0>
+		inline constexpr auto operator/(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept -> unit_t<inverse<typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type>>
+	{
+		return unit_t<inverse<typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type>>
+			(static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs) / rhs());
+	}
+
+	/// Division by a scalar for unit_t types with a linear scale
+	template<class UnitTypeLhs, typename T,
+		std::enable_if_t<std::is_arithmetic<T>::value && traits::has_linear_scale<UnitTypeLhs>::value, int> = 0>
+		inline constexpr UnitTypeLhs operator/(const UnitTypeLhs& lhs, T rhs) noexcept
+	{
+		return UnitTypeLhs(lhs() / rhs);
+	}
+
+	/// Division of a scalar  by a unit_t type with a linear scale
+	template<class UnitTypeRhs, typename T,
+		std::enable_if_t<std::is_arithmetic<T>::value && traits::has_linear_scale<UnitTypeRhs>::value, int> = 0>
+		inline constexpr auto operator/(T lhs, const UnitTypeRhs& rhs) noexcept -> unit_t<inverse<typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type>>
+	{
+		using UnitsRhs = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		return unit_t<inverse<UnitsRhs>>
+			(lhs / rhs());
+	}
+
+	//----------------------------------
+	//	SCALAR COMPARISONS
+	//----------------------------------
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator==(const UNIT_LIB_DEFAULT_TYPE lhs, const Units& rhs) noexcept
+	{
+		return detail::abs(lhs - static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs)) < std::numeric_limits<UNIT_LIB_DEFAULT_TYPE>::epsilon() * detail::abs(lhs + static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs)) ||
+			detail::abs(lhs - static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs)) < std::numeric_limits<UNIT_LIB_DEFAULT_TYPE>::min();
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator==(const Units& lhs, const UNIT_LIB_DEFAULT_TYPE rhs) noexcept
+	{
+		return detail::abs(static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs) - rhs) < std::numeric_limits<UNIT_LIB_DEFAULT_TYPE>::epsilon() * detail::abs(static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs) + rhs) ||
+			detail::abs(static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs) - rhs) < std::numeric_limits<UNIT_LIB_DEFAULT_TYPE>::min();
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator!=(const UNIT_LIB_DEFAULT_TYPE lhs, const Units& rhs) noexcept
+	{
+		return!(lhs == static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs));
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator!=(const Units& lhs, const UNIT_LIB_DEFAULT_TYPE rhs) noexcept
+	{
+		return !(static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs) == rhs);
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator>=(const UNIT_LIB_DEFAULT_TYPE lhs, const Units& rhs) noexcept
+	{
+		return std::isgreaterequal(lhs, static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs));
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator>=(const Units& lhs, const UNIT_LIB_DEFAULT_TYPE rhs) noexcept
+	{
+		return std::isgreaterequal(static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs), rhs);
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator>(const UNIT_LIB_DEFAULT_TYPE lhs, const Units& rhs) noexcept
+	{
+		return lhs > static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs);
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator>(const Units& lhs, const UNIT_LIB_DEFAULT_TYPE rhs) noexcept
+	{
+		return static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs) > rhs;
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator<=(const UNIT_LIB_DEFAULT_TYPE lhs, const Units& rhs) noexcept
+	{
+		return std::islessequal(lhs, static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs));
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator<=(const Units& lhs, const UNIT_LIB_DEFAULT_TYPE rhs) noexcept
+	{
+		return std::islessequal(static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs), rhs);
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator<(const UNIT_LIB_DEFAULT_TYPE lhs, const Units& rhs) noexcept
+	{
+		return lhs < static_cast<UNIT_LIB_DEFAULT_TYPE>(rhs);
+	}
+
+	template<typename Units, class = std::enable_if_t<units::traits::is_dimensionless_unit<Units>::value>>
+	constexpr bool operator<(const Units& lhs, const UNIT_LIB_DEFAULT_TYPE rhs) noexcept
+	{
+		return static_cast<UNIT_LIB_DEFAULT_TYPE>(lhs) < rhs;
+	}
+
+	//----------------------------------
+	//	POW
+	//----------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		/// recursive exponential implementation
+		template <int N, class U> struct power_of_unit
+		{
+			template<bool isPos, int V> struct power_of_unit_impl;
+
+			template<int V> struct power_of_unit_impl<true, V>
+			{
+				typedef units::detail::unit_multiply<U, typename power_of_unit<N - 1, U>::type> type;
+			};
+
+			template<int V> struct power_of_unit_impl<false, V>
+			{
+				typedef units::inverse<typename power_of_unit<-N, U>::type> type;
+			};
+
+			typedef typename power_of_unit_impl<(N > 0), N>::type type;
+		};
+
+		/// End recursion
+		template <class U> struct power_of_unit<1, U>
+		{
+			typedef U type;
+		};
+		template <class U> struct power_of_unit<0, U>
+		{
+			typedef units::dimensionless::dimensionless type;
+		};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	namespace math
+	{
+		/**
+		 * @brief		computes the value of <i>value</i> raised to the <i>power</i>
+		 * @details		Only implemented for linear_scale units. <i>Power</i> must be known at compile time, so the resulting unit type can be deduced.
+		 * @tparam		power exponential power to raise <i>value</i> by.
+		 * @param[in]	value `unit_t` derived type to raise to the given <i>power</i>
+		 * @returns		new unit_t, raised to the given exponent
+		 */
+		template<int power, class UnitType, class = typename std::enable_if<traits::has_linear_scale<UnitType>::value, int>>
+		inline auto pow(const UnitType& value) noexcept -> unit_t<typename units::detail::power_of_unit<power, typename units::traits::unit_t_traits<UnitType>::unit_type>::type, typename units::traits::unit_t_traits<UnitType>::underlying_type, linear_scale>
+		{
+			return unit_t<typename units::detail::power_of_unit<power, typename units::traits::unit_t_traits<UnitType>::unit_type>::type, typename units::traits::unit_t_traits<UnitType>::underlying_type, linear_scale>
+				(std::pow(value(), power));
+		}
+
+		/**
+		 * @brief		computes the value of <i>value</i> raised to the <i>power</i> as a constexpr
+		 * @details		Only implemented for linear_scale units. <i>Power</i> must be known at compile time, so the resulting unit type can be deduced.
+		 *				Additionally, the power must be <i>a positive, integral, value</i>.
+		 * @tparam		power exponential power to raise <i>value</i> by.
+		 * @param[in]	value `unit_t` derived type to raise to the given <i>power</i>
+		 * @returns		new unit_t, raised to the given exponent
+		 */
+		template<int power, class UnitType, class = typename std::enable_if<traits::has_linear_scale<UnitType>::value, int>>
+		inline constexpr auto cpow(const UnitType& value) noexcept -> unit_t<typename units::detail::power_of_unit<power, typename units::traits::unit_t_traits<UnitType>::unit_type>::type, typename units::traits::unit_t_traits<UnitType>::underlying_type, linear_scale>
+		{
+			static_assert(power >= 0, "cpow cannot accept negative numbers. Try units::math::pow instead.");
+			return unit_t<typename units::detail::power_of_unit<power, typename units::traits::unit_t_traits<UnitType>::unit_type>::type, typename units::traits::unit_t_traits<UnitType>::underlying_type, linear_scale>
+				(detail::pow(value(), power));
+		}
+	}
+
+	//------------------------------
+	//	DECIBEL SCALE
+	//------------------------------
+
+	/**
+	* @brief		unit_t scale for representing decibel values.
+	* @details		internally stores linearized values. `operator()` returns the value in dB.
+	* @tparam		T	underlying storage type
+	* @sa			unit_t
+	*/
+	template<typename T>
+	struct decibel_scale
+	{
+		inline constexpr decibel_scale() = default;
+		inline constexpr decibel_scale(const decibel_scale&) = default;
+		inline ~decibel_scale() = default;
+		inline decibel_scale& operator=(const decibel_scale&) = default;
+#if defined(_MSC_VER) && (_MSC_VER > 1800)
+		inline constexpr decibel_scale(decibel_scale&&) = default;
+		inline decibel_scale& operator=(decibel_scale&&) = default;
+#endif
+		inline constexpr decibel_scale(const T value) noexcept : m_value(std::pow(10, value / 10)) {}
+		template<class... Args>
+		inline constexpr decibel_scale(const T value, std::true_type, Args&&...) noexcept : m_value(value) {}
+		inline constexpr T operator()() const noexcept { return 10 * std::log10(m_value); }
+
+		T m_value;	///< linearized value
+	};
+
+	//------------------------------
+	//	SCALAR (DECIBEL) UNITS
+	//------------------------------
+
+	/**
+	 * @brief		namespace for unit types and containers for units that have no dimension (scalar units)
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+	namespace dimensionless
+	{
+		typedef unit_t<scalar, UNIT_LIB_DEFAULT_TYPE, decibel_scale> dB_t;
+#if !defined(UNIT_LIB_DISABLE_IOSTREAM)
+		inline std::ostream& operator<<(std::ostream& os, const dB_t& obj) { os << obj() << " dB"; return os; }
+#endif
+		typedef dB_t dBi_t;
+	}
+
+	//------------------------------
+	//	DECIBEL ARITHMETIC
+	//------------------------------
+
+	/// Addition for convertible unit_t types with a decibel_scale
+	template<class UnitTypeLhs, class UnitTypeRhs,
+		std::enable_if_t<traits::has_decibel_scale<UnitTypeLhs, UnitTypeRhs>::value, int> = 0>
+	constexpr inline auto operator+(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept -> unit_t<compound_unit<squared<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type>>, typename units::traits::unit_t_traits<UnitTypeLhs>::underlying_type, decibel_scale>
+	{
+		using LhsUnits = typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type;
+		using RhsUnits = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		using underlying_type = typename units::traits::unit_t_traits<UnitTypeLhs>::underlying_type;
+
+		return unit_t<compound_unit<squared<LhsUnits>>, underlying_type, decibel_scale>
+			(lhs.template toLinearized<underlying_type>() * convert<RhsUnits, LhsUnits>(rhs.template toLinearized<underlying_type>()), std::true_type());
+	}
+
+	/// Addition between unit_t types with a decibel_scale and dimensionless dB units
+	template<class UnitTypeLhs, std::enable_if_t<traits::has_decibel_scale<UnitTypeLhs>::value && !traits::is_dimensionless_unit<UnitTypeLhs>::value, int> = 0>
+	constexpr inline UnitTypeLhs operator+(const UnitTypeLhs& lhs, const dimensionless::dB_t& rhs) noexcept
+	{
+		using underlying_type = typename units::traits::unit_t_traits<UnitTypeLhs>::underlying_type;
+		return UnitTypeLhs(lhs.template toLinearized<underlying_type>() * rhs.template toLinearized<underlying_type>(), std::true_type());
+	}
+
+	/// Addition between unit_t types with a decibel_scale and dimensionless dB units
+	template<class UnitTypeRhs, std::enable_if_t<traits::has_decibel_scale<UnitTypeRhs>::value && !traits::is_dimensionless_unit<UnitTypeRhs>::value, int> = 0>
+	constexpr inline UnitTypeRhs operator+(const dimensionless::dB_t& lhs, const UnitTypeRhs& rhs) noexcept
+	{
+		using underlying_type = typename units::traits::unit_t_traits<UnitTypeRhs>::underlying_type;
+		return UnitTypeRhs(lhs.template toLinearized<underlying_type>() * rhs.template toLinearized<underlying_type>(), std::true_type());
+	}
+
+	/// Subtraction for convertible unit_t types with a decibel_scale
+	template<class UnitTypeLhs, class UnitTypeRhs, std::enable_if_t<traits::has_decibel_scale<UnitTypeLhs, UnitTypeRhs>::value, int> = 0>
+	constexpr inline auto operator-(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs) noexcept -> unit_t<compound_unit<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type, inverse<typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type>>, typename units::traits::unit_t_traits<UnitTypeLhs>::underlying_type, decibel_scale>
+	{
+		using LhsUnits = typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type;
+		using RhsUnits = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		using underlying_type = typename units::traits::unit_t_traits<UnitTypeLhs>::underlying_type;
+
+		return unit_t<compound_unit<LhsUnits, inverse<RhsUnits>>, underlying_type, decibel_scale>
+			(lhs.template toLinearized<underlying_type>() / convert<RhsUnits, LhsUnits>(rhs.template toLinearized<underlying_type>()), std::true_type());
+	}
+
+	/// Subtraction between unit_t types with a decibel_scale and dimensionless dB units
+	template<class UnitTypeLhs, std::enable_if_t<traits::has_decibel_scale<UnitTypeLhs>::value && !traits::is_dimensionless_unit<UnitTypeLhs>::value, int> = 0>
+	constexpr inline UnitTypeLhs operator-(const UnitTypeLhs& lhs, const dimensionless::dB_t& rhs) noexcept
+	{
+		using underlying_type = typename units::traits::unit_t_traits<UnitTypeLhs>::underlying_type;
+		return UnitTypeLhs(lhs.template toLinearized<underlying_type>() / rhs.template toLinearized<underlying_type>(), std::true_type());
+	}
+
+	/// Subtraction between unit_t types with a decibel_scale and dimensionless dB units
+	template<class UnitTypeRhs, std::enable_if_t<traits::has_decibel_scale<UnitTypeRhs>::value && !traits::is_dimensionless_unit<UnitTypeRhs>::value, int> = 0>
+	constexpr inline auto operator-(const dimensionless::dB_t& lhs, const UnitTypeRhs& rhs) noexcept -> unit_t<inverse<typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type>, typename units::traits::unit_t_traits<UnitTypeRhs>::underlying_type, decibel_scale>
+	{
+		using RhsUnits = typename units::traits::unit_t_traits<UnitTypeRhs>::unit_type;
+		using underlying_type = typename units::traits::unit_t_traits<RhsUnits>::underlying_type;
+
+		return unit_t<inverse<RhsUnits>, underlying_type, decibel_scale>
+			(lhs.template toLinearized<underlying_type>() / rhs.template toLinearized<underlying_type>(), std::true_type());
+	}
+
+	//----------------------------------
+	//	UNIT RATIO CLASS
+	//----------------------------------
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		template<class Units>
+		struct _unit_value_t {};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	namespace traits
+	{
+#ifdef FOR_DOXYGEN_PURPOSES_ONLY
+		/**
+		* @ingroup		TypeTraits
+		* @brief		Trait for accessing the publically defined types of `units::unit_value_t_traits`
+		* @details		The units library determines certain properties of the `unit_value_t` types passed to
+		*				them and what they represent by using the members of the corresponding `unit_value_t_traits`
+		*				instantiation.
+		*/
+		template<typename T>
+		struct unit_value_t_traits
+		{
+			typedef typename T::unit_type unit_type;	///< Dimension represented by the `unit_value_t`.
+			typedef typename T::ratio ratio;			///< Quantity represented by the `unit_value_t`, expressed as arational number.
+		};
+#endif
+
+		/** @cond */	// DOXYGEN IGNORE
+		/**
+		 * @brief		unit_value_t_traits specialization for things which are not unit_t
+		 * @details
+		 */
+		template<typename T, typename = void>
+		struct unit_value_t_traits
+		{
+			typedef void unit_type;
+			typedef void ratio;
+		};
+
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait for accessing the publically defined types of `units::unit_value_t_traits`
+		 * @details
+		 */
+		template<typename T>
+		struct unit_value_t_traits <T, typename void_t<
+			typename T::unit_type,
+			typename T::ratio>::type>
+		{
+			typedef typename T::unit_type unit_type;
+			typedef typename T::ratio ratio;
+		};
+		/** @endcond */	// END DOXYGEN IGNORE
+	}
+
+	//------------------------------------------------------------------------------
+	//	COMPILE-TIME UNIT VALUES AND ARITHMETIC
+	//------------------------------------------------------------------------------
+
+	/**
+	 * @ingroup		UnitContainers
+	 * @brief		Stores a rational unit value as a compile-time constant
+	 * @details		unit_value_t is useful for performing compile-time arithmetic on known
+	 *				unit quantities.
+	 * @tparam		Units	units represented by the `unit_value_t`
+	 * @tparam		Num		numerator of the represented value.
+	 * @tparam		Denom	denominator of the represented value.
+	 * @sa			unit_value_t_traits to access information about the properties of the class,
+	 *				such as it's unit type and rational value.
+	 * @note		This is intentionally identical in concept to a `std::ratio`.
+	 *
+	 */
+	template<typename Units, std::uintmax_t Num, std::uintmax_t Denom = 1>
+	struct unit_value_t : units::detail::_unit_value_t<Units>
+	{
+		typedef Units unit_type;
+		typedef std::ratio<Num, Denom> ratio;
+
+		static_assert(traits::is_unit<Units>::value, "Template parameter `Units` must be a unit type.");
+		static constexpr const unit_t<Units> value() { return unit_t<Units>((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den); }
+	};
+
+	namespace traits
+	{
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which tests whether a type is a unit_value_t representing the given unit type.
+		 * @details		e.g. `is_unit_value_t<meters, myType>::value` would test that `myType` is a
+		 *				`unit_value_t<meters>`.
+		 * @tparam		Units	units that the `unit_value_t` is supposed to have.
+		 * @tparam		T		type to test.
+		 */
+		template<typename T, typename Units = typename traits::unit_value_t_traits<T>::unit_type>
+		struct is_unit_value_t : std::integral_constant<bool,
+			std::is_base_of<units::detail::_unit_value_t<Units>, T>::value>
+		{};
+
+		/**
+		 * @ingroup		TypeTraits
+		 * @brief		Trait which tests whether type T is a unit_value_t with a unit type in the given category.
+		 * @details		e.g. `is_unit_value_t_category<units::category::length, unit_value_t<feet>>::value` would be true
+		 */
+		template<typename Category, typename T>
+		struct is_unit_value_t_category : std::integral_constant<bool,
+			std::is_same<units::traits::base_unit_of<typename traits::unit_value_t_traits<T>::unit_type>, Category>::value>
+		{
+			static_assert(is_base_unit<Category>::value, "Template parameter `Category` must be a `base_unit` type.");
+		};
+	}
+
+	/** @cond */	// DOXYGEN IGNORE
+	namespace detail
+	{
+		// base class for common arithmetic
+		template<class U1, class U2>
+		struct unit_value_arithmetic
+		{
+			static_assert(traits::is_unit_value_t<U1>::value, "Template parameter `U1` must be a `unit_value_t` type.");
+			static_assert(traits::is_unit_value_t<U2>::value, "Template parameter `U2` must be a `unit_value_t` type.");
+
+			using _UNIT1 = typename traits::unit_value_t_traits<U1>::unit_type;
+			using _UNIT2 = typename traits::unit_value_t_traits<U2>::unit_type;
+			using _CONV1 = typename units::traits::unit_traits<_UNIT1>::conversion_ratio;
+			using _CONV2 = typename units::traits::unit_traits<_UNIT2>::conversion_ratio;
+			using _RATIO1 = typename traits::unit_value_t_traits<U1>::ratio;
+			using _RATIO2 = typename traits::unit_value_t_traits<U2>::ratio;
+			using _RATIO2CONV = typename std::ratio_divide<std::ratio_multiply<_RATIO2, _CONV2>, _CONV1>;
+			using _PI_EXP = std::ratio_subtract<typename units::traits::unit_traits<_UNIT2>::pi_exponent_ratio, typename units::traits::unit_traits<_UNIT1>::pi_exponent_ratio>;
+		};
+	}
+	/** @endcond */	// END DOXYGEN IGNORE
+
+	/**
+	 * @ingroup		CompileTimeUnitManipulators
+	 * @brief		adds two unit_value_t types at compile-time
+	 * @details		The resulting unit will the the `unit_type` of `U1`
+	 * @tparam		U1	left-hand `unit_value_t`
+	 * @tparam		U2	right-hand `unit_value_t`
+	 * @sa			unit_value_t_traits to access information about the properties of the class,
+	 *				such as it's unit type and rational value.
+	 * @note		very similar in concept to `std::ratio_add`
+	 */
+	template<class U1, class U2>
+	struct unit_value_add : units::detail::unit_value_arithmetic<U1, U2>, units::detail::_unit_value_t<typename traits::unit_value_t_traits<U1>::unit_type>
+	{
+		/** @cond */	// DOXYGEN IGNORE
+		using Base = units::detail::unit_value_arithmetic<U1, U2>;
+		typedef typename Base::_UNIT1 unit_type;
+		using ratio = std::ratio_add<typename Base::_RATIO1, typename Base::_RATIO2CONV>;
+
+		static_assert(traits::is_convertible_unit<typename Base::_UNIT1, typename Base::_UNIT2>::value, "Unit types are not compatible.");
+		/** @endcond */	// END DOXYGEN IGNORE
+
+		/**
+		 * @brief		Value of sum
+		 * @details		Returns the calculated value of the sum of `U1` and `U2`, in the same
+		 *				units as `U1`.
+		 * @returns		Value of the sum in the appropriate units.
+		 */
+		static constexpr const unit_t<unit_type> value() noexcept
+		{
+			using UsePi = std::integral_constant<bool, Base::_PI_EXP::num != 0>;
+			return value(UsePi());
+		}
+
+		/** @cond */	// DOXYGEN IGNORE
+		// value if PI isn't involved
+		static constexpr const unit_t<unit_type> value(std::false_type) noexcept
+		{
+			return unit_t<unit_type>((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den);
+		}
+
+		// value if PI *is* involved
+		static constexpr const unit_t<unit_type> value(std::true_type) noexcept
+		{
+			return unit_t<unit_type>(((UNIT_LIB_DEFAULT_TYPE)Base::_RATIO1::num / Base::_RATIO1::den) +
+			((UNIT_LIB_DEFAULT_TYPE)Base::_RATIO2CONV::num / Base::_RATIO2CONV::den) * std::pow(units::constants::detail::PI_VAL, ((UNIT_LIB_DEFAULT_TYPE)Base::_PI_EXP::num / Base::_PI_EXP::den)));
+		}
+		/** @endcond */	// END DOXYGEN IGNORE
+	};
+
+	/**
+	 * @ingroup		CompileTimeUnitManipulators
+	 * @brief		subtracts two unit_value_t types at compile-time
+	 * @details		The resulting unit will the the `unit_type` of `U1`
+	 * @tparam		U1	left-hand `unit_value_t`
+	 * @tparam		U2	right-hand `unit_value_t`
+	 * @sa			unit_value_t_traits to access information about the properties of the class,
+	 *				such as it's unit type and rational value.
+	 * @note		very similar in concept to `std::ratio_subtract`
+	 */
+	template<class U1, class U2>
+	struct unit_value_subtract : units::detail::unit_value_arithmetic<U1, U2>, units::detail::_unit_value_t<typename traits::unit_value_t_traits<U1>::unit_type>
+	{
+		/** @cond */	// DOXYGEN IGNORE
+		using Base = units::detail::unit_value_arithmetic<U1, U2>;
+
+		typedef typename Base::_UNIT1 unit_type;
+		using ratio = std::ratio_subtract<typename Base::_RATIO1, typename Base::_RATIO2CONV>;
+
+		static_assert(traits::is_convertible_unit<typename Base::_UNIT1, typename Base::_UNIT2>::value, "Unit types are not compatible.");
+		/** @endcond */	// END DOXYGEN IGNORE
+
+		/**
+		 * @brief		Value of difference
+		 * @details		Returns the calculated value of the difference of `U1` and `U2`, in the same
+		 *				units as `U1`.
+		 * @returns		Value of the difference in the appropriate units.
+		 */
+		static constexpr const unit_t<unit_type> value() noexcept
+		{
+			using UsePi = std::integral_constant<bool, Base::_PI_EXP::num != 0>;
+			return value(UsePi());
+		}
+
+		/** @cond */	// DOXYGEN IGNORE
+		// value if PI isn't involved
+		static constexpr const unit_t<unit_type> value(std::false_type) noexcept
+		{
+			return unit_t<unit_type>((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den);
+		}
+
+		// value if PI *is* involved
+		static constexpr const unit_t<unit_type> value(std::true_type) noexcept
+		{
+			return unit_t<unit_type>(((UNIT_LIB_DEFAULT_TYPE)Base::_RATIO1::num / Base::_RATIO1::den) - ((UNIT_LIB_DEFAULT_TYPE)Base::_RATIO2CONV::num / Base::_RATIO2CONV::den)
+				* std::pow(units::constants::detail::PI_VAL, ((UNIT_LIB_DEFAULT_TYPE)Base::_PI_EXP::num / Base::_PI_EXP::den)));
+		}
+		/** @endcond */	// END DOXYGEN IGNORE	};
+	};
+
+	/**
+	 * @ingroup		CompileTimeUnitManipulators
+	 * @brief		multiplies two unit_value_t types at compile-time
+	 * @details		The resulting unit will the the `unit_type` of `U1 * U2`
+	 * @tparam		U1	left-hand `unit_value_t`
+	 * @tparam		U2	right-hand `unit_value_t`
+	 * @sa			unit_value_t_traits to access information about the properties of the class,
+	 *				such as it's unit type and rational value.
+	 * @note		very similar in concept to `std::ratio_multiply`
+	 */
+	template<class U1, class U2>
+	struct unit_value_multiply : units::detail::unit_value_arithmetic<U1, U2>,
+		units::detail::_unit_value_t<typename std::conditional<traits::is_convertible_unit<typename traits::unit_value_t_traits<U1>::unit_type,
+			typename traits::unit_value_t_traits<U2>::unit_type>::value, compound_unit<squared<typename traits::unit_value_t_traits<U1>::unit_type>>,
+			compound_unit<typename traits::unit_value_t_traits<U1>::unit_type, typename traits::unit_value_t_traits<U2>::unit_type>>::type>
+	{
+		/** @cond */	// DOXYGEN IGNORE
+		using Base = units::detail::unit_value_arithmetic<U1, U2>;
+
+		using unit_type = std::conditional_t<traits::is_convertible_unit<typename Base::_UNIT1, typename Base::_UNIT2>::value, compound_unit<squared<typename Base::_UNIT1>>, compound_unit<typename Base::_UNIT1, typename Base::_UNIT2>>;
+		using ratio = std::conditional_t<traits::is_convertible_unit<typename Base::_UNIT1, typename Base::_UNIT2>::value, std::ratio_multiply<typename Base::_RATIO1, typename Base::_RATIO2CONV>, std::ratio_multiply<typename Base::_RATIO1, typename Base::_RATIO2>>;
+		/** @endcond */	// END DOXYGEN IGNORE
+
+		/**
+		 * @brief		Value of product
+		 * @details		Returns the calculated value of the product of `U1` and `U2`, in units
+		 *				of `U1 x U2`.
+		 * @returns		Value of the product in the appropriate units.
+		 */
+		static constexpr const unit_t<unit_type> value() noexcept
+		{
+			using UsePi = std::integral_constant<bool, Base::_PI_EXP::num != 0>;
+			return value(UsePi());
+		}
+
+		/** @cond */	// DOXYGEN IGNORE
+		// value if PI isn't involved
+		static constexpr const unit_t<unit_type> value(std::false_type) noexcept
+		{
+			return unit_t<unit_type>((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den);
+		}
+
+		// value if PI *is* involved
+		static constexpr const unit_t<unit_type> value(std::true_type) noexcept
+		{
+			return unit_t<unit_type>(((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den) * std::pow(units::constants::detail::PI_VAL, ((UNIT_LIB_DEFAULT_TYPE)Base::_PI_EXP::num / Base::_PI_EXP::den)));
+		}
+		/** @endcond */	// END DOXYGEN IGNORE
+	};
+
+	/**
+	 * @ingroup		CompileTimeUnitManipulators
+	 * @brief		divides two unit_value_t types at compile-time
+	 * @details		The resulting unit will the the `unit_type` of `U1`
+	 * @tparam		U1	left-hand `unit_value_t`
+	 * @tparam		U2	right-hand `unit_value_t`
+	 * @sa			unit_value_t_traits to access information about the properties of the class,
+	 *				such as it's unit type and rational value.
+	 * @note		very similar in concept to `std::ratio_divide`
+	 */
+	template<class U1, class U2>
+	struct unit_value_divide : units::detail::unit_value_arithmetic<U1, U2>,
+		units::detail::_unit_value_t<typename std::conditional<traits::is_convertible_unit<typename traits::unit_value_t_traits<U1>::unit_type,
+		typename traits::unit_value_t_traits<U2>::unit_type>::value, dimensionless::scalar, compound_unit<typename traits::unit_value_t_traits<U1>::unit_type,
+		inverse<typename traits::unit_value_t_traits<U2>::unit_type>>>::type>
+	{
+		/** @cond */	// DOXYGEN IGNORE
+		using Base = units::detail::unit_value_arithmetic<U1, U2>;
+
+		using unit_type = std::conditional_t<traits::is_convertible_unit<typename Base::_UNIT1, typename Base::_UNIT2>::value, dimensionless::scalar, compound_unit<typename Base::_UNIT1, inverse<typename Base::_UNIT2>>>;
+		using ratio = std::conditional_t<traits::is_convertible_unit<typename Base::_UNIT1, typename Base::_UNIT2>::value, std::ratio_divide<typename Base::_RATIO1, typename Base::_RATIO2CONV>, std::ratio_divide<typename Base::_RATIO1, typename Base::_RATIO2>>;
+		/** @endcond */	// END DOXYGEN IGNORE
+
+		/**
+		 * @brief		Value of quotient
+		 * @details		Returns the calculated value of the quotient of `U1` and `U2`, in units
+		 *				of `U1 x U2`.
+		 * @returns		Value of the quotient in the appropriate units.
+		 */
+		static constexpr const unit_t<unit_type> value() noexcept
+		{
+			using UsePi = std::integral_constant<bool, Base::_PI_EXP::num != 0>;
+			return value(UsePi());
+		}
+
+		/** @cond */	// DOXYGEN IGNORE
+		// value if PI isn't involved
+		static constexpr const unit_t<unit_type> value(std::false_type) noexcept
+		{
+			return unit_t<unit_type>((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den);
+		}
+
+		// value if PI *is* involved
+		static constexpr const unit_t<unit_type> value(std::true_type) noexcept
+		{
+			return unit_t<unit_type>(((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den) * std::pow(units::constants::detail::PI_VAL, ((UNIT_LIB_DEFAULT_TYPE)Base::_PI_EXP::num / Base::_PI_EXP::den)));
+		}
+		/** @endcond */	// END DOXYGEN IGNORE
+	};
+
+	/**
+	 * @ingroup		CompileTimeUnitManipulators
+	 * @brief		raises unit_value_to a power at compile-time
+	 * @details		The resulting unit will the `unit_type` of `U1` squared
+	 * @tparam		U1	`unit_value_t` to take the exponentiation of.
+	 * @sa			unit_value_t_traits to access information about the properties of the class,
+	 *				such as it's unit type and rational value.
+	 * @note		very similar in concept to `units::math::pow`
+	 */
+	template<class U1, int power>
+	struct unit_value_power : units::detail::unit_value_arithmetic<U1, U1>, units::detail::_unit_value_t<typename units::detail::power_of_unit<power, typename traits::unit_value_t_traits<U1>::unit_type>::type>
+	{
+		/** @cond */	// DOXYGEN IGNORE
+		using Base = units::detail::unit_value_arithmetic<U1, U1>;
+
+		using unit_type = typename units::detail::power_of_unit<power, typename Base::_UNIT1>::type;
+		using ratio = typename units::detail::power_of_ratio<power, typename Base::_RATIO1>::type;
+		using pi_exponent = std::ratio_multiply<std::ratio<power>, typename Base::_UNIT1::pi_exponent_ratio>;
+		/** @endcond */	// END DOXYGEN IGNORE
+
+		/**
+		 * @brief		Value of exponentiation
+		 * @details		Returns the calculated value of the exponentiation of `U1`, in units
+		 *				of `U1^power`.
+		 * @returns		Value of the exponentiation in the appropriate units.
+		 */
+		static constexpr const unit_t<unit_type> value() noexcept
+		{
+			using UsePi = std::integral_constant<bool, Base::_PI_EXP::num != 0>;
+			return value(UsePi());
+		}
+
+		/** @cond */	// DOXYGEN IGNORE
+		// value if PI isn't involved
+		static constexpr const unit_t<unit_type> value(std::false_type) noexcept
+		{
+			return unit_t<unit_type>((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den);
+		}
+
+		// value if PI *is* involved
+		static constexpr const unit_t<unit_type> value(std::true_type) noexcept
+		{
+			return unit_t<unit_type>(((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den) * std::pow(units::constants::detail::PI_VAL, ((UNIT_LIB_DEFAULT_TYPE)pi_exponent::num / pi_exponent::den)));
+		}
+		/** @endcond */	// END DOXYGEN IGNORE	};
+	};
+
+	/**
+	 * @ingroup		CompileTimeUnitManipulators
+	 * @brief		calculates square root of unit_value_t at compile-time
+	 * @details		The resulting unit will the square root `unit_type` of `U1`
+	 * @tparam		U1	`unit_value_t` to take the square root of.
+	 * @sa			unit_value_t_traits to access information about the properties of the class,
+	 *				such as it's unit type and rational value.
+	 * @note		very similar in concept to `units::ratio_sqrt`
+	 */
+	template<class U1, std::intmax_t Eps = 10000000000>
+	struct unit_value_sqrt : units::detail::unit_value_arithmetic<U1, U1>, units::detail::_unit_value_t<square_root<typename traits::unit_value_t_traits<U1>::unit_type, Eps>>
+	{
+		/** @cond */	// DOXYGEN IGNORE
+		using Base = units::detail::unit_value_arithmetic<U1, U1>;
+
+		using unit_type = square_root<typename Base::_UNIT1, Eps>;
+		using ratio = ratio_sqrt<typename Base::_RATIO1, Eps>;
+		using pi_exponent = ratio_sqrt<typename Base::_UNIT1::pi_exponent_ratio, Eps>;
+		/** @endcond */	// END DOXYGEN IGNORE
+
+		/**
+		 * @brief		Value of square root
+		 * @details		Returns the calculated value of the square root of `U1`, in units
+		 *				of `U1^1/2`.
+		 * @returns		Value of the square root in the appropriate units.
+		 */
+		static constexpr const unit_t<unit_type> value() noexcept
+		{
+			using UsePi = std::integral_constant<bool, Base::_PI_EXP::num != 0>;
+			return value(UsePi());
+		}
+
+		/** @cond */	// DOXYGEN IGNORE
+		// value if PI isn't involved
+		static constexpr const unit_t<unit_type> value(std::false_type) noexcept
+		{
+			return unit_t<unit_type>((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den);
+		}
+
+		// value if PI *is* involved
+		static constexpr const unit_t<unit_type> value(std::true_type) noexcept
+		{
+			return unit_t<unit_type>(((UNIT_LIB_DEFAULT_TYPE)ratio::num / ratio::den) * std::pow(units::constants::detail::PI_VAL, ((UNIT_LIB_DEFAULT_TYPE)pi_exponent::num / pi_exponent::den)));
+		}
+		/** @endcond */	// END DOXYGEN IGNORE
+	};
+
+	//------------------------------
+	//	LITERALS
+	//------------------------------
+
+	/**
+	 * @namespace	units::literals
+	 * @brief		namespace for unit literal definitions of all categories.
+	 * @details		Literals allow for declaring unit types using suffix values. For example, a type
+	 *				of `meter_t(6.2)` could be declared as `6.2_m`. All literals use an underscore
+	 *				followed by the abbreviation for the unit. To enable literal syntax in your code,
+	 *				include the statement `using namespace units::literals`.
+	 * @anchor		unitLiterals
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+
+	//------------------------------
+	//	LENGTH UNITS
+	//------------------------------
+
+	/**
+	 * @namespace	units::length
+	 * @brief		namespace for unit types and containers representing length values
+	 * @details		The SI unit for length is `meters`, and the corresponding `base_unit` category is
+	 *				`length_unit`.
+	 * @anchor		lengthContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_LENGTH_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(length, meter, meters, m, unit<std::ratio<1>, units::category::length_unit>)
+	UNIT_ADD(length, foot, feet, ft, unit<std::ratio<381, 1250>, meters>)
+	UNIT_ADD(length, mil, mils, mil, unit<std::ratio<1000>, feet>)
+	UNIT_ADD(length, inch, inches, in, unit<std::ratio<1, 12>, feet>)
+	UNIT_ADD(length, mile,   miles,    mi,    unit<std::ratio<5280>, feet>)
+	UNIT_ADD(length, nauticalMile, nauticalMiles, nmi, unit<std::ratio<1852>, meters>)
+	UNIT_ADD(length, astronicalUnit, astronicalUnits, au, unit<std::ratio<149597870700>, meters>)
+	UNIT_ADD(length, lightyear, lightyears, ly, unit<std::ratio<9460730472580800>, meters>)
+	UNIT_ADD(length, parsec, parsecs, pc, unit<std::ratio<648000>, astronicalUnits, std::ratio<-1>>)
+	UNIT_ADD(length, angstrom, angstroms, angstrom, unit<std::ratio<1, 10>, nanometers>)
+	UNIT_ADD(length, cubit, cubits, cbt, unit<std::ratio<18>, inches>)
+	UNIT_ADD(length, fathom, fathoms, ftm, unit<std::ratio<6>, feet>)
+	UNIT_ADD(length, chain, chains, ch, unit<std::ratio<66>, feet>)
+	UNIT_ADD(length, furlong, furlongs, fur, unit<std::ratio<10>, chains>)
+	UNIT_ADD(length, hand, hands, hand, unit<std::ratio<4>, inches>)
+	UNIT_ADD(length, league, leagues, lea, unit<std::ratio<3>, miles>)
+	UNIT_ADD(length, nauticalLeague, nauticalLeagues, nl, unit<std::ratio<3>, nauticalMiles>)
+	UNIT_ADD(length, yard, yards, yd, unit<std::ratio<3>, feet>)
+
+	UNIT_ADD_CATEGORY_TRAIT(length)
+#endif
+
+	//------------------------------
+	//	MASS UNITS
+	//------------------------------
+
+	/**
+	 * @namespace	units::mass
+	 * @brief		namespace for unit types and containers representing mass values
+	 * @details		The SI unit for mass is `kilograms`, and the corresponding `base_unit` category is
+	 *				`mass_unit`.
+	 * @anchor		massContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_MASS_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(mass, gram, grams, g, unit<std::ratio<1, 1000>, units::category::mass_unit>)
+	UNIT_ADD(mass, metric_ton, metric_tons, t, unit<std::ratio<1000>, kilograms>)
+	UNIT_ADD(mass, pound, pounds, lb, unit<std::ratio<45359237, 100000000>, kilograms>)
+	UNIT_ADD(mass, long_ton, long_tons, ln_t, unit<std::ratio<2240>, pounds>)
+	UNIT_ADD(mass, short_ton, short_tons, sh_t, unit<std::ratio<2000>, pounds>)
+	UNIT_ADD(mass, stone, stone, st, unit<std::ratio<14>, pounds>)
+	UNIT_ADD(mass, ounce, ounces, oz, unit<std::ratio<1, 16>, pounds>)
+	UNIT_ADD(mass, carat, carats, ct, unit<std::ratio<200>, milligrams>)
+	UNIT_ADD(mass, slug, slugs, slug, unit<std::ratio<145939029, 10000000>, kilograms>)
+
+	UNIT_ADD_CATEGORY_TRAIT(mass)
+#endif
+
+	//------------------------------
+	//	TIME UNITS
+	//------------------------------
+
+	/**
+	 * @namespace	units::time
+	 * @brief		namespace for unit types and containers representing time values
+	 * @details		The SI unit for time is `seconds`, and the corresponding `base_unit` category is
+	 *				`time_unit`.
+	 * @anchor		timeContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_TIME_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(time, second, seconds, s, unit<std::ratio<1>, units::category::time_unit>)
+	UNIT_ADD(time, minute, minutes, min, unit<std::ratio<60>, seconds>)
+	UNIT_ADD(time, hour, hours, hr, unit<std::ratio<60>, minutes>)
+	UNIT_ADD(time, day, days, d, unit<std::ratio<24>, hours>)
+	UNIT_ADD(time, week, weeks, wk, unit<std::ratio<7>, days>)
+	UNIT_ADD(time, year, years, yr, unit<std::ratio<365>, days>)
+	UNIT_ADD(time, julian_year, julian_years, a_j,	unit<std::ratio<31557600>, seconds>)
+	UNIT_ADD(time, gregorian_year, gregorian_years, a_g, unit<std::ratio<31556952>, seconds>)
+
+	UNIT_ADD_CATEGORY_TRAIT(time)
+#endif
+
+	//------------------------------
+	//	ANGLE UNITS
+	//------------------------------
+
+	/**
+	 * @namespace	units::angle
+	 * @brief		namespace for unit types and containers representing angle values
+	 * @details		The SI unit for angle is `radians`, and the corresponding `base_unit` category is
+	 *				`angle_unit`.
+	 * @anchor		angleContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(angle, radian, radians, rad, unit<std::ratio<1>, units::category::angle_unit>)
+	UNIT_ADD(angle, degree, degrees, deg, unit<std::ratio<1, 180>, radians, std::ratio<1>>)
+	UNIT_ADD(angle, arcminute, arcminutes, arcmin, unit<std::ratio<1, 60>, degrees>)
+	UNIT_ADD(angle, arcsecond, arcseconds, arcsec, unit<std::ratio<1, 60>, arcminutes>)
+	UNIT_ADD(angle, milliarcsecond, milliarcseconds, mas, milli<arcseconds>)
+	UNIT_ADD(angle, turn, turns, tr, unit<std::ratio<2>, radians, std::ratio<1>>)
+	UNIT_ADD(angle, gradian, gradians, gon, unit<std::ratio<1, 400>, turns>)
+
+	UNIT_ADD_CATEGORY_TRAIT(angle)
+#endif
+
+	//------------------------------
+	//	UNITS OF CURRENT
+	//------------------------------
+	/**
+	 * @namespace	units::current
+	 * @brief		namespace for unit types and containers representing current values
+	 * @details		The SI unit for current is `amperes`, and the corresponding `base_unit` category is
+	 *				`current_unit`.
+	 * @anchor		currentContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_CURRENT_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(current, ampere, amperes, A, unit<std::ratio<1>, units::category::current_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(current)
+#endif
+
+	//------------------------------
+	//	UNITS OF TEMPERATURE
+	//------------------------------
+
+	// NOTE: temperature units have special conversion overloads, since they
+	// require translations and aren't a reversible transform.
+
+	/**
+	 * @namespace	units::temperature
+	 * @brief		namespace for unit types and containers representing temperature values
+	 * @details		The SI unit for temperature is `kelvin`, and the corresponding `base_unit` category is
+	 *				`temperature_unit`.
+	 * @anchor		temperatureContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_TEMPERATURE_UNITS)
+	UNIT_ADD(temperature, kelvin, kelvin, K, unit<std::ratio<1>, units::category::temperature_unit>)
+	UNIT_ADD(temperature, celsius, celsius, degC, unit<std::ratio<1>, kelvin, std::ratio<0>, std::ratio<27315, 100>>)
+	UNIT_ADD(temperature, fahrenheit, fahrenheit, degF, unit<std::ratio<5, 9>, celsius, std::ratio<0>, std::ratio<-160, 9>>)
+	UNIT_ADD(temperature, reaumur, reaumur, Re, unit<std::ratio<10, 8>, celsius>)
+	UNIT_ADD(temperature, rankine, rankine, Ra, unit<std::ratio<5, 9>, kelvin>)
+
+	UNIT_ADD_CATEGORY_TRAIT(temperature)
+#endif
+
+	//------------------------------
+	//	UNITS OF AMOUNT OF SUBSTANCE
+	//------------------------------
+
+	/**
+	 * @namespace	units::substance
+	 * @brief		namespace for unit types and containers representing substance values
+	 * @details		The SI unit for substance is `moles`, and the corresponding `base_unit` category is
+	 *				`substance_unit`.
+	 * @anchor		substanceContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_SUBSTANCE_UNITS)
+	UNIT_ADD(substance, mole, moles, mol, unit<std::ratio<1>, units::category::substance_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(substance)
+#endif
+
+	//------------------------------
+	//	UNITS OF LUMINOUS INTENSITY
+	//------------------------------
+
+	/**
+	 * @namespace	units::luminous_intensity
+	 * @brief		namespace for unit types and containers representing luminous_intensity values
+	 * @details		The SI unit for luminous_intensity is `candelas`, and the corresponding `base_unit` category is
+	 *				`luminous_intensity_unit`.
+	 * @anchor		luminousIntensityContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_LUMINOUS_INTENSITY_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(luminous_intensity, candela, candelas, cd, unit<std::ratio<1>, units::category::luminous_intensity_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(luminous_intensity)
+#endif
+
+	//------------------------------
+	//	UNITS OF SOLID ANGLE
+	//------------------------------
+
+	/**
+	 * @namespace	units::solid_angle
+	 * @brief		namespace for unit types and containers representing solid_angle values
+	 * @details		The SI unit for solid_angle is `steradians`, and the corresponding `base_unit` category is
+	 *				`solid_angle_unit`.
+	 * @anchor		solidAngleContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_SOLID_ANGLE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(solid_angle, steradian, steradians, sr, unit<std::ratio<1>, units::category::solid_angle_unit>)
+	UNIT_ADD(solid_angle, degree_squared, degrees_squared, sq_deg, squared<angle::degrees>)
+	UNIT_ADD(solid_angle, spat, spats, sp, unit<std::ratio<4>, steradians, std::ratio<1>>)
+
+	UNIT_ADD_CATEGORY_TRAIT(solid_angle)
+#endif
+
+	//------------------------------
+	//	FREQUENCY UNITS
+	//------------------------------
+
+	/**
+	 * @namespace	units::frequency
+	 * @brief		namespace for unit types and containers representing frequency values
+	 * @details		The SI unit for frequency is `hertz`, and the corresponding `base_unit` category is
+	 *				`frequency_unit`.
+	 * @anchor		frequencyContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_FREQUENCY_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(frequency, hertz, hertz, Hz, unit<std::ratio<1>, units::category::frequency_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(frequency)
+#endif
+
+	//------------------------------
+	//	VELOCITY UNITS
+	//------------------------------
+
+	/**
+	 * @namespace	units::velocity
+	 * @brief		namespace for unit types and containers representing velocity values
+	 * @details		The SI unit for velocity is `meters_per_second`, and the corresponding `base_unit` category is
+	 *				`velocity_unit`.
+	 * @anchor		velocityContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_VELOCITY_UNITS)
+	UNIT_ADD(velocity, meters_per_second, meters_per_second, mps, unit<std::ratio<1>, units::category::velocity_unit>)
+	UNIT_ADD(velocity, feet_per_second, feet_per_second, fps, compound_unit<length::feet, inverse<time::seconds>>)
+	UNIT_ADD(velocity, miles_per_hour, miles_per_hour, mph, compound_unit<length::miles, inverse<time::hour>>)
+	UNIT_ADD(velocity, kilometers_per_hour, kilometers_per_hour, kph, compound_unit<length::kilometers, inverse<time::hour>>)
+	UNIT_ADD(velocity, knot, knots, kts, compound_unit<length::nauticalMiles, inverse<time::hour>>)
+
+	UNIT_ADD_CATEGORY_TRAIT(velocity)
+#endif
+
+	//------------------------------
+	//	ANGULAR VELOCITY UNITS
+	//------------------------------
+
+	/**
+	 * @namespace	units::angular_velocity
+	 * @brief		namespace for unit types and containers representing angular velocity values
+	 * @details		The SI unit for angular velocity is `radians_per_second`, and the corresponding `base_unit` category is
+	 *				`angular_velocity_unit`.
+	 * @anchor		angularVelocityContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGULAR_VELOCITY_UNITS)
+	UNIT_ADD(angular_velocity, radians_per_second, radians_per_second, rad_per_s, unit<std::ratio<1>, units::category::angular_velocity_unit>)
+	UNIT_ADD(angular_velocity, degrees_per_second, degrees_per_second, deg_per_s, compound_unit<angle::degrees, inverse<time::seconds>>)
+	UNIT_ADD(angular_velocity, revolutions_per_minute, revolutions_per_minute, rpm, unit<std::ratio<2, 60>, radians_per_second, std::ratio<1>>)
+	UNIT_ADD(angular_velocity, milliarcseconds_per_year, milliarcseconds_per_year, mas_per_yr, compound_unit<angle::milliarcseconds, inverse<time::year>>)
+
+	UNIT_ADD_CATEGORY_TRAIT(angular_velocity)
+#endif
+
+	//------------------------------
+	//	UNITS OF ACCELERATION
+	//------------------------------
+
+	/**
+	 * @namespace	units::acceleration
+	 * @brief		namespace for unit types and containers representing acceleration values
+	 * @details		The SI unit for acceleration is `meters_per_second_squared`, and the corresponding `base_unit` category is
+	 *				`acceleration_unit`.
+	 * @anchor		accelerationContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ACCELERATION_UNITS)
+	UNIT_ADD(acceleration, meters_per_second_squared, meters_per_second_squared, mps_sq, unit<std::ratio<1>, units::category::acceleration_unit>)
+	UNIT_ADD(acceleration, feet_per_second_squared, feet_per_second_squared, fps_sq, compound_unit<length::feet, inverse<squared<time::seconds>>>)
+	UNIT_ADD(acceleration, standard_gravity, standard_gravity, SG, unit<std::ratio<980665, 100000>, meters_per_second_squared>)
+
+	UNIT_ADD_CATEGORY_TRAIT(acceleration)
+#endif
+
+	//------------------------------
+	//	UNITS OF FORCE
+	//------------------------------
+
+	/**
+	 * @namespace	units::force
+	 * @brief		namespace for unit types and containers representing force values
+	 * @details		The SI unit for force is `newtons`, and the corresponding `base_unit` category is
+	 *				`force_unit`.
+	 * @anchor		forceContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_FORCE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(force, newton, newtons, N, unit<std::ratio<1>, units::category::force_unit>)
+	UNIT_ADD(force, pound, pounds, lbf, compound_unit<mass::slug, length::foot, inverse<squared<time::seconds>>>)
+	UNIT_ADD(force, dyne, dynes, dyn, unit<std::ratio<1, 100000>, newtons>)
+	UNIT_ADD(force, kilopond, kiloponds, kp, compound_unit<acceleration::standard_gravity, mass::kilograms>)
+	UNIT_ADD(force, poundal, poundals, pdl, compound_unit<mass::pound, length::foot, inverse<squared<time::seconds>>>)
+
+	UNIT_ADD_CATEGORY_TRAIT(force)
+#endif
+
+	//------------------------------
+	//	UNITS OF PRESSURE
+	//------------------------------
+
+	/**
+	 * @namespace	units::pressure
+	 * @brief		namespace for unit types and containers representing pressure values
+	 * @details		The SI unit for pressure is `pascals`, and the corresponding `base_unit` category is
+	 *				`pressure_unit`.
+	 * @anchor		pressureContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_PRESSURE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(pressure, pascal, pascals, Pa, unit<std::ratio<1>, units::category::pressure_unit>)
+	UNIT_ADD(pressure, bar, bars, bar, unit<std::ratio<100>, kilo<pascals>>)
+	UNIT_ADD(pressure, mbar, mbars, mbar, unit<std::ratio<1>, milli<bar>>)
+	UNIT_ADD(pressure, atmosphere, atmospheres, atm, unit<std::ratio<101325>, pascals>)
+	UNIT_ADD(pressure, pounds_per_square_inch, pounds_per_square_inch, psi, compound_unit<force::pounds, inverse<squared<length::inch>>>)
+	UNIT_ADD(pressure, torr, torrs, torr, unit<std::ratio<1, 760>, atmospheres>)
+
+	UNIT_ADD_CATEGORY_TRAIT(pressure)
+#endif
+
+	//------------------------------
+	//	UNITS OF CHARGE
+	//------------------------------
+
+	/**
+	 * @namespace	units::charge
+	 * @brief		namespace for unit types and containers representing charge values
+	 * @details		The SI unit for charge is `coulombs`, and the corresponding `base_unit` category is
+	 *				`charge_unit`.
+	 * @anchor		chargeContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_CHARGE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(charge, coulomb, coulombs, C, unit<std::ratio<1>, units::category::charge_unit>)
+	UNIT_ADD_WITH_METRIC_PREFIXES(charge, ampere_hour, ampere_hours, Ah, compound_unit<current::ampere, time::hours>)
+
+	UNIT_ADD_CATEGORY_TRAIT(charge)
+#endif
+
+	//------------------------------
+	//	UNITS OF ENERGY
+	//------------------------------
+
+	/**
+	 * @namespace	units::energy
+	 * @brief		namespace for unit types and containers representing energy values
+	 * @details		The SI unit for energy is `joules`, and the corresponding `base_unit` category is
+	 *				`energy_unit`.
+	 * @anchor		energyContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ENERGY_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(energy, joule, joules, J, unit<std::ratio<1>, units::category::energy_unit>)
+	UNIT_ADD_WITH_METRIC_PREFIXES(energy, calorie, calories, cal, unit<std::ratio<4184, 1000>, joules>)
+	UNIT_ADD(energy, kilowatt_hour, kilowatt_hours, kWh, unit<std::ratio<36, 10>, megajoules>)
+	UNIT_ADD(energy, watt_hour, watt_hours, Wh, unit<std::ratio<1, 1000>, kilowatt_hours>)
+	UNIT_ADD(energy, british_thermal_unit, british_thermal_units, BTU, unit<std::ratio<105505585262, 100000000>, joules>)
+	UNIT_ADD(energy, british_thermal_unit_iso, british_thermal_units_iso, BTU_iso, unit<std::ratio<1055056, 1000>, joules>)
+	UNIT_ADD(energy, british_thermal_unit_59, british_thermal_units_59, BTU59, unit<std::ratio<1054804, 1000>, joules>)
+	UNIT_ADD(energy, therm, therms, thm, unit<std::ratio<100000>, british_thermal_units_59>)
+	UNIT_ADD(energy, foot_pound, foot_pounds, ftlbf, unit<std::ratio<13558179483314004, 10000000000000000>, joules>)
+
+	UNIT_ADD_CATEGORY_TRAIT(energy)
+#endif
+
+	//------------------------------
+	//	UNITS OF POWER
+	//------------------------------
+
+	/**
+	 * @namespace	units::power
+	 * @brief		namespace for unit types and containers representing power values
+	 * @details		The SI unit for power is `watts`, and the corresponding `base_unit` category is
+	 *				`power_unit`.
+	 * @anchor		powerContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_POWER_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(power, watt, watts, W, unit<std::ratio<1>, units::category::power_unit>)
+	UNIT_ADD(power, horsepower, horsepower, hp, unit<std::ratio<7457, 10>, watts>)
+	UNIT_ADD_DECIBEL(power, watt, dBW)
+	UNIT_ADD_DECIBEL(power, milliwatt, dBm)
+
+	UNIT_ADD_CATEGORY_TRAIT(power)
+#endif
+
+	//------------------------------
+	//	UNITS OF VOLTAGE
+	//------------------------------
+
+	/**
+	 * @namespace	units::voltage
+	 * @brief		namespace for unit types and containers representing voltage values
+	 * @details		The SI unit for voltage is `volts`, and the corresponding `base_unit` category is
+	 *				`voltage_unit`.
+	 * @anchor		voltageContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_VOLTAGE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(voltage, volt, volts, V, unit<std::ratio<1>, units::category::voltage_unit>)
+	UNIT_ADD(voltage, statvolt, statvolts, statV, unit<std::ratio<1000000, 299792458>, volts>)
+	UNIT_ADD(voltage, abvolt, abvolts, abV, unit<std::ratio<1, 100000000>, volts>)
+
+	UNIT_ADD_CATEGORY_TRAIT(voltage)
+#endif
+
+	//------------------------------
+	//	UNITS OF CAPACITANCE
+	//------------------------------
+
+	/**
+	 * @namespace	units::capacitance
+	 * @brief		namespace for unit types and containers representing capacitance values
+	 * @details		The SI unit for capacitance is `farads`, and the corresponding `base_unit` category is
+	 *				`capacitance_unit`.
+	 * @anchor		capacitanceContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_CAPACITANCE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(capacitance, farad, farads, F, unit<std::ratio<1>, units::category::capacitance_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(capacitance)
+#endif
+
+	//------------------------------
+	//	UNITS OF IMPEDANCE
+	//------------------------------
+
+	/**
+	 * @namespace	units::impedance
+	 * @brief		namespace for unit types and containers representing impedance values
+	 * @details		The SI unit for impedance is `ohms`, and the corresponding `base_unit` category is
+	 *				`impedance_unit`.
+	 * @anchor		impedanceContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_IMPEDANCE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(impedance, ohm, ohms, Ohm, unit<std::ratio<1>, units::category::impedance_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(impedance)
+#endif
+
+	//------------------------------
+	//	UNITS OF CONDUCTANCE
+	//------------------------------
+
+	/**
+	 * @namespace	units::conductance
+	 * @brief		namespace for unit types and containers representing conductance values
+	 * @details		The SI unit for conductance is `siemens`, and the corresponding `base_unit` category is
+	 *				`conductance_unit`.
+	 * @anchor		conductanceContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_CONDUCTANCE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(conductance, siemens, siemens, S, unit<std::ratio<1>, units::category::conductance_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(conductance)
+#endif
+
+	//------------------------------
+	//	UNITS OF MAGNETIC FLUX
+	//------------------------------
+
+	/**
+	 * @namespace	units::magnetic_flux
+	 * @brief		namespace for unit types and containers representing magnetic_flux values
+	 * @details		The SI unit for magnetic_flux is `webers`, and the corresponding `base_unit` category is
+	 *				`magnetic_flux_unit`.
+	 * @anchor		magneticFluxContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_MAGNETIC_FLUX_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(magnetic_flux, weber, webers, Wb, unit<std::ratio<1>, units::category::magnetic_flux_unit>)
+	UNIT_ADD(magnetic_flux, maxwell, maxwells, Mx, unit<std::ratio<1, 100000000>, webers>)
+
+	UNIT_ADD_CATEGORY_TRAIT(magnetic_flux)
+#endif
+
+	//----------------------------------------
+	//	UNITS OF MAGNETIC FIELD STRENGTH
+	//----------------------------------------
+
+	/**
+	 * @namespace	units::magnetic_field_strength
+	 * @brief		namespace for unit types and containers representing magnetic_field_strength values
+	 * @details		The SI unit for magnetic_field_strength is `teslas`, and the corresponding `base_unit` category is
+	 *				`magnetic_field_strength_unit`.
+	 * @anchor		magneticFieldStrengthContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+	// Unfortunately `_T` is a WINAPI macro, so we have to use `_Te` as the tesla abbreviation.
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_MAGNETIC_FIELD_STRENGTH_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(magnetic_field_strength, tesla, teslas, Te, unit<std::ratio<1>, units::category::magnetic_field_strength_unit>)
+	UNIT_ADD(magnetic_field_strength, gauss, gauss, G, compound_unit<magnetic_flux::maxwell, inverse<squared<length::centimeter>>>)
+
+	UNIT_ADD_CATEGORY_TRAIT(magnetic_field_strength)
+#endif
+
+	//------------------------------
+	//	UNITS OF INDUCTANCE
+	//------------------------------
+
+	/**
+	 * @namespace	units::inductance
+	 * @brief		namespace for unit types and containers representing inductance values
+	 * @details		The SI unit for inductance is `henrys`, and the corresponding `base_unit` category is
+	 *				`inductance_unit`.
+	 * @anchor		inductanceContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_INDUCTANCE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(inductance, henry, henries, H, unit<std::ratio<1>, units::category::inductance_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(inductance)
+#endif
+
+	//------------------------------
+	//	UNITS OF LUMINOUS FLUX
+	//------------------------------
+
+	/**
+	 * @namespace	units::luminous_flux
+	 * @brief		namespace for unit types and containers representing luminous_flux values
+	 * @details		The SI unit for luminous_flux is `lumens`, and the corresponding `base_unit` category is
+	 *				`luminous_flux_unit`.
+	 * @anchor		luminousFluxContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_LUMINOUS_FLUX_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(luminous_flux, lumen, lumens, lm, unit<std::ratio<1>, units::category::luminous_flux_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(luminous_flux)
+#endif
+
+	//------------------------------
+	//	UNITS OF ILLUMINANCE
+	//------------------------------
+
+	/**
+	 * @namespace	units::illuminance
+	 * @brief		namespace for unit types and containers representing illuminance values
+	 * @details		The SI unit for illuminance is `luxes`, and the corresponding `base_unit` category is
+	 *				`illuminance_unit`.
+	 * @anchor		illuminanceContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ILLUMINANCE_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(illuminance, lux, luxes, lx, unit<std::ratio<1>, units::category::illuminance_unit>)
+	UNIT_ADD(illuminance, footcandle, footcandles, fc, compound_unit<luminous_flux::lumen, inverse<squared<length::foot>>>)
+	UNIT_ADD(illuminance, lumens_per_square_inch, lumens_per_square_inch, lm_per_in_sq, compound_unit<luminous_flux::lumen, inverse<squared<length::inch>>>)
+	UNIT_ADD(illuminance, phot, phots, ph, compound_unit<luminous_flux::lumens, inverse<squared<length::centimeter>>>)
+
+	UNIT_ADD_CATEGORY_TRAIT(illuminance)
+#endif
+
+	//------------------------------
+	//	UNITS OF RADIATION
+	//------------------------------
+
+	/**
+	 * @namespace	units::radiation
+	 * @brief		namespace for unit types and containers representing radiation values
+	 * @details		The SI units for radiation are:
+	 *				- source activity:	becquerel
+	 *				- absorbed dose:	gray
+	 *				- equivalent dose:	sievert
+	 * @anchor		radiationContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_RADIATION_UNITS)
+	UNIT_ADD_WITH_METRIC_PREFIXES(radiation, becquerel, becquerels, Bq, unit<std::ratio<1>, units::frequency::hertz>)
+	UNIT_ADD_WITH_METRIC_PREFIXES(radiation, gray, grays, Gy, compound_unit<energy::joules, inverse<mass::kilogram>>)
+	UNIT_ADD_WITH_METRIC_PREFIXES(radiation, sievert, sieverts, Sv, unit<std::ratio<1>, grays>)
+	UNIT_ADD(radiation, curie, curies, Ci, unit<std::ratio<37>, gigabecquerels>)
+	UNIT_ADD(radiation, rutherford, rutherfords, rd, unit<std::ratio<1>, megabecquerels>)
+	UNIT_ADD(radiation, rad, rads, rads, unit<std::ratio<1>, centigrays>)
+
+	UNIT_ADD_CATEGORY_TRAIT(radioactivity)
+#endif
+
+	//------------------------------
+	//	UNITS OF TORQUE
+	//------------------------------
+
+	/**
+	 * @namespace	units::torque
+	 * @brief		namespace for unit types and containers representing torque values
+	 * @details		The SI unit for torque is `newton_meters`, and the corresponding `base_unit` category is
+	 *				`torque_units`.
+	 * @anchor		torqueContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_TORQUE_UNITS)
+	UNIT_ADD(torque, newton_meter, newton_meters, Nm, unit<std::ratio<1>, units::energy::joule>)
+	UNIT_ADD(torque, foot_pound, foot_pounds, ftlb, compound_unit<length::foot, force::pounds>)
+	UNIT_ADD(torque, foot_poundal, foot_poundals, ftpdl, compound_unit<length::foot, force::poundal>)
+	UNIT_ADD(torque, inch_pound, inch_pounds, inlb, compound_unit<length::inch, force::pounds>)
+	UNIT_ADD(torque, meter_kilogram, meter_kilograms, mkgf, compound_unit<length::meter, force::kiloponds>)
+
+	UNIT_ADD_CATEGORY_TRAIT(torque)
+#endif
+
+	//------------------------------
+	//	AREA UNITS
+	//------------------------------
+
+	/**
+	 * @namespace	units::area
+	 * @brief		namespace for unit types and containers representing area values
+	 * @details		The SI unit for area is `square_meters`, and the corresponding `base_unit` category is
+	 *				`area_unit`.
+	 * @anchor		areaContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_AREA_UNITS)
+	UNIT_ADD(area, square_meter, square_meters, sq_m, unit<std::ratio<1>, units::category::area_unit>)
+	UNIT_ADD(area, square_foot, square_feet, sq_ft, squared<length::feet>)
+	UNIT_ADD(area, square_inch, square_inches, sq_in, squared<length::inch>)
+	UNIT_ADD(area, square_mile, square_miles, sq_mi, squared<length::miles>)
+	UNIT_ADD(area, square_kilometer, square_kilometers, sq_km, squared<length::kilometers>)
+	UNIT_ADD(area, hectare, hectares, ha, unit<std::ratio<10000>, square_meters>)
+	UNIT_ADD(area, acre, acres, acre, unit<std::ratio<43560>, square_feet>)
+
+	UNIT_ADD_CATEGORY_TRAIT(area)
+#endif
+
+	//------------------------------
+	//	UNITS OF VOLUME
+	//------------------------------
+
+	/**
+	 * @namespace	units::volume
+	 * @brief		namespace for unit types and containers representing volume values
+	 * @details		The SI unit for volume is `cubic_meters`, and the corresponding `base_unit` category is
+	 *				`volume_unit`.
+	 * @anchor		volumeContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_VOLUME_UNITS)
+	UNIT_ADD(volume, cubic_meter, cubic_meters, cu_m, unit<std::ratio<1>, units::category::volume_unit>)
+	UNIT_ADD(volume, cubic_millimeter, cubic_millimeters, cu_mm, cubed<length::millimeter>)
+	UNIT_ADD(volume, cubic_kilometer, cubic_kilometers, cu_km, cubed<length::kilometer>)
+	UNIT_ADD_WITH_METRIC_PREFIXES(volume, liter, liters, L, cubed<deci<length::meter>>)
+	UNIT_ADD(volume, cubic_inch, cubic_inches, cu_in, cubed<length::inches>)
+	UNIT_ADD(volume, cubic_foot, cubic_feet, cu_ft, cubed<length::feet>)
+	UNIT_ADD(volume, cubic_yard, cubic_yards, cu_yd, cubed<length::yards>)
+	UNIT_ADD(volume, cubic_mile, cubic_miles, cu_mi, cubed<length::miles>)
+	UNIT_ADD(volume, gallon, gallons, gal, unit<std::ratio<231>, cubic_inches>)
+	UNIT_ADD(volume, quart, quarts, qt, unit<std::ratio<1, 4>, gallons>)
+	UNIT_ADD(volume, pint, pints, pt, unit<std::ratio<1, 2>, quarts>)
+	UNIT_ADD(volume, cup, cups, c, unit<std::ratio<1, 2>, pints>)
+	UNIT_ADD(volume, fluid_ounce, fluid_ounces, fl_oz, unit<std::ratio<1, 8>, cups>)
+	UNIT_ADD(volume, barrel, barrels, bl, unit<std::ratio<42>, gallons>)
+	UNIT_ADD(volume, bushel, bushels, bu, unit<std::ratio<215042, 100>, cubic_inches>)
+	UNIT_ADD(volume, cord, cords, cord, unit<std::ratio<128>, cubic_feet>)
+	UNIT_ADD(volume, cubic_fathom, cubic_fathoms, cu_fm, cubed<length::fathom>)
+	UNIT_ADD(volume, tablespoon, tablespoons, tbsp, unit<std::ratio<1, 2>, fluid_ounces>)
+	UNIT_ADD(volume, teaspoon, teaspoons, tsp, unit<std::ratio<1, 6>, fluid_ounces>)
+	UNIT_ADD(volume, pinch, pinches, pinch, unit<std::ratio<1, 8>, teaspoons>)
+	UNIT_ADD(volume, dash, dashes, dash, unit<std::ratio<1, 2>, pinches>)
+	UNIT_ADD(volume, drop, drops, drop, unit<std::ratio<1, 360>, fluid_ounces>)
+	UNIT_ADD(volume, fifth, fifths, fifth, unit<std::ratio<1, 5>, gallons>)
+	UNIT_ADD(volume, dram, drams, dr, unit<std::ratio<1, 8>, fluid_ounces>)
+	UNIT_ADD(volume, gill, gills, gi, unit<std::ratio<4>, fluid_ounces>)
+	UNIT_ADD(volume, peck, pecks, pk, unit<std::ratio<1, 4>, bushels>)
+	UNIT_ADD(volume, sack, sacks, sacks, unit<std::ratio<3>, bushels>)
+	UNIT_ADD(volume, shot, shots, shots, unit<std::ratio<3, 2>, fluid_ounces>)
+	UNIT_ADD(volume, strike, strikes, strikes, unit<std::ratio<2>, bushels>)
+
+	UNIT_ADD_CATEGORY_TRAIT(volume)
+#endif
+
+	//------------------------------
+	//	UNITS OF DENSITY
+	//------------------------------
+
+	/**
+	 * @namespace	units::density
+	 * @brief		namespace for unit types and containers representing density values
+	 * @details		The SI unit for density is `kilograms_per_cubic_meter`, and the corresponding `base_unit` category is
+	 *				`density_unit`.
+	 * @anchor		densityContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_DENSITY_UNITS)
+	UNIT_ADD(density, kilograms_per_cubic_meter, kilograms_per_cubic_meter, kg_per_cu_m, unit<std::ratio<1>, units::category::density_unit>)
+	UNIT_ADD(density, grams_per_milliliter, grams_per_milliliter, g_per_mL, compound_unit<mass::grams, inverse<volume::milliliter>>)
+	UNIT_ADD(density, kilograms_per_liter, kilograms_per_liter, kg_per_L, unit<std::ratio<1>, compound_unit<mass::grams, inverse<volume::milliliter>>>)
+	UNIT_ADD(density, ounces_per_cubic_foot, ounces_per_cubic_foot, oz_per_cu_ft, compound_unit<mass::ounces, inverse<volume::cubic_foot>>)
+	UNIT_ADD(density, ounces_per_cubic_inch, ounces_per_cubic_inch, oz_per_cu_in, compound_unit<mass::ounces, inverse<volume::cubic_inch>>)
+	UNIT_ADD(density, ounces_per_gallon, ounces_per_gallon, oz_per_gal, compound_unit<mass::ounces, inverse<volume::gallon>>)
+	UNIT_ADD(density, pounds_per_cubic_foot, pounds_per_cubic_foot, lb_per_cu_ft, compound_unit<mass::pounds, inverse<volume::cubic_foot>>)
+	UNIT_ADD(density, pounds_per_cubic_inch, pounds_per_cubic_inch, lb_per_cu_in, compound_unit<mass::pounds, inverse<volume::cubic_inch>>)
+	UNIT_ADD(density, pounds_per_gallon, pounds_per_gallon, lb_per_gal, compound_unit<mass::pounds, inverse<volume::gallon>>)
+	UNIT_ADD(density, slugs_per_cubic_foot, slugs_per_cubic_foot, slug_per_cu_ft, compound_unit<mass::slugs, inverse<volume::cubic_foot>>)
+
+	UNIT_ADD_CATEGORY_TRAIT(density)
+#endif
+
+	//------------------------------
+	//	UNITS OF CONCENTRATION
+	//------------------------------
+
+	/**
+	 * @namespace	units::concentration
+	 * @brief		namespace for unit types and containers representing concentration values
+	 * @details		The SI unit for concentration is `parts_per_million`, and the corresponding `base_unit` category is
+	 *				`scalar_unit`.
+	 * @anchor		concentrationContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_CONCENTRATION_UNITS)
+	UNIT_ADD(concentration, ppm, parts_per_million, ppm, unit<std::ratio<1, 1000000>, units::category::scalar_unit>)
+	UNIT_ADD(concentration, ppb, parts_per_billion, ppb, unit<std::ratio<1, 1000>, parts_per_million>)
+	UNIT_ADD(concentration, ppt, parts_per_trillion, ppt, unit<std::ratio<1, 1000>, parts_per_billion>)
+	UNIT_ADD(concentration, percent, percent, pct, unit<std::ratio<1, 100>, units::category::scalar_unit>)
+
+	UNIT_ADD_CATEGORY_TRAIT(concentration)
+#endif
+
+	//------------------------------
+	//	UNITS OF DATA
+	//------------------------------
+
+	/**
+	 * @namespace	units::data
+	 * @brief		namespace for unit types and containers representing data values
+	 * @details		The base unit for data is `bytes`, and the corresponding `base_unit` category is
+	 *				`data_unit`.
+	 * @anchor		dataContainers
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_DATA_UNITS)
+	UNIT_ADD_WITH_METRIC_AND_BINARY_PREFIXES(data, byte, bytes, B, unit<std::ratio<1>, units::category::data_unit>)
+	UNIT_ADD(data, exabyte, exabytes, EB, unit<std::ratio<1000>, petabytes>)
+	UNIT_ADD_WITH_METRIC_AND_BINARY_PREFIXES(data, bit, bits, b, unit<std::ratio<1, 8>, byte>)
+	UNIT_ADD(data, exabit, exabits, Eb, unit<std::ratio<1000>, petabits>)
+
+	UNIT_ADD_CATEGORY_TRAIT(data)
+#endif
+
+	//------------------------------
+	//	UNITS OF DATA TRANSFER
+	//------------------------------
+
+	/**
+	* @namespace	units::data_transfer_rate
+	* @brief		namespace for unit types and containers representing data values
+	* @details		The base unit for data is `bytes`, and the corresponding `base_unit` category is
+	*				`data_unit`.
+	* @anchor		dataContainers
+	* @sa			See unit_t for more information on unit type containers.
+	*/
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_DATA_TRANSFER_RATE_UNITS)
+	UNIT_ADD_WITH_METRIC_AND_BINARY_PREFIXES(data_transfer_rate, bytes_per_second, bytes_per_second, Bps, unit<std::ratio<1>, units::category::data_transfer_rate_unit>)
+	UNIT_ADD(data_transfer_rate, exabytes_per_second, exabytes_per_second, EBps, unit<std::ratio<1000>, petabytes_per_second>)
+	UNIT_ADD_WITH_METRIC_AND_BINARY_PREFIXES(data_transfer_rate, bits_per_second, bits_per_second, bps, unit<std::ratio<1, 8>, bytes_per_second>)
+	UNIT_ADD(data_transfer_rate, exabits_per_second, exabits_per_second, Ebps, unit<std::ratio<1000>, petabits_per_second>)
+
+	UNIT_ADD_CATEGORY_TRAIT(data_transfer_rate)
+#endif
+
+	//------------------------------
+	//	CONSTANTS
+	//------------------------------
+
+	/**
+	 * @brief		namespace for physical constants like PI and Avogadro's Number.
+	 * @sa			See unit_t for more information on unit type containers.
+	 */
+#if !defined(DISABLE_PREDEFINED_UNITS)
+	namespace constants
+	{
+		/**
+		 * @name Unit Containers
+		 * @anchor constantContainers
+		 * @{
+		 */
+		using PI = unit<std::ratio<1>, dimensionless::scalar, std::ratio<1>>;
+
+		static constexpr const unit_t<PI>																											pi(1);											///< Ratio of a circle's circumference to its diameter.
+		static constexpr const velocity::meters_per_second_t																						c(299792458.0);									///< Speed of light in vacuum.
+		static constexpr const unit_t<compound_unit<cubed<length::meters>, inverse<mass::kilogram>, inverse<squared<time::seconds>>>>				G(6.67408e-11);									///< Newtonian constant of gravitation.
+		static constexpr const unit_t<compound_unit<energy::joule, time::seconds>>																	h(6.626070040e-34);								///< Planck constant.
+		static constexpr const unit_t<compound_unit<force::newtons, inverse<squared<current::ampere>>>>												mu0(pi * 4.0e-7 * force::newton_t(1) / units::math::cpow<2>(current::ampere_t(1)));										///< vacuum permeability.
+		static constexpr const unit_t<compound_unit<capacitance::farad, inverse<length::meter>>>													epsilon0(1.0 / (mu0 * math::cpow<2>(c)));		///< vacuum permitivity.
+		static constexpr const impedance::ohm_t																										Z0(mu0 * c);									///< characteristic impedance of vacuum.
+		static constexpr const unit_t<compound_unit<force::newtons, area::square_meter, inverse<squared<charge::coulomb>>>>							k_e(1.0 / (4 * pi * epsilon0));					///< Coulomb's constant.
+		static constexpr const charge::coulomb_t																									e(1.6021766208e-19);							///< elementary charge.
+		static constexpr const mass::kilogram_t																										m_e(9.10938356e-31);							///< electron mass.
+		static constexpr const mass::kilogram_t																										m_p(1.672621898e-27);							///< proton mass.
+		static constexpr const unit_t<compound_unit<energy::joules, inverse<magnetic_field_strength::tesla>>>										mu_B(e * h / (4 * pi *m_e));					///< Bohr magneton.
+		static constexpr const unit_t<inverse<substance::mol>>																						N_A(6.022140857e23);							///< Avagadro's Number.
+		static constexpr const unit_t<compound_unit<energy::joules, inverse<temperature::kelvin>, inverse<substance::moles>>>						R(8.3144598);									///< Gas constant.
+		static constexpr const unit_t<compound_unit<energy::joules, inverse<temperature::kelvin>>>													k_B(R / N_A);									///< Boltzmann constant.
+		static constexpr const unit_t<compound_unit<charge::coulomb, inverse<substance::mol>>>														F(N_A * e);										///< Faraday constant.
+		static constexpr const unit_t<compound_unit<power::watts, inverse<area::square_meters>, inverse<squared<squared<temperature::kelvin>>>>>	sigma((2 * math::cpow<5>(pi) * math::cpow<4>(R)) / (15 * math::cpow<3>(h) * math::cpow<2>(c) * math::cpow<4>(N_A)));	///< Stefan-Boltzmann constant.
+		/** @} */
+	}
+#endif
+
+	//----------------------------------
+	//	UNIT-ENABLED CMATH FUNCTIONS
+	//----------------------------------
+
+	/**
+	 * @brief		namespace for unit-enabled versions of the `<cmath>` library
+	 * @details		Includes trigonometric functions, exponential/log functions, rounding functions, etc.
+	 * @sa			See `unit_t` for more information on unit type containers.
+	 */
+	namespace math
+	{
+
+		//----------------------------------
+		//	MIN/MAX FUNCTIONS
+		//----------------------------------
+
+		template<class UnitTypeLhs, class UnitTypeRhs>
+		UnitTypeLhs min(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs)
+		{
+			static_assert(traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value, "Unit types are not compatible.");
+			UnitTypeLhs r(rhs);
+			return (lhs < r ? lhs : r);
+		}
+
+		template<class UnitTypeLhs, class UnitTypeRhs>
+		UnitTypeLhs max(const UnitTypeLhs& lhs, const UnitTypeRhs& rhs)
+		{
+			static_assert(traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value, "Unit types are not compatible.");
+			UnitTypeLhs r(rhs);
+			return (lhs > r ? lhs : r);
+		}
+
+		//----------------------------------
+		//	TRIGONOMETRIC FUNCTIONS
+		//----------------------------------
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute cosine
+		 * @details		The input value can be in any unit of angle, including radians or degrees.
+		 * @tparam		AngleUnit	any `unit_t` type of `category::angle_unit`.
+		 * @param[in]	angle		angle to compute the cosine of
+		 * @returns		Returns the cosine of <i>angle</i>
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class AngleUnit>
+		dimensionless::scalar_t cos(const AngleUnit angle) noexcept
+		{
+			static_assert(traits::is_angle_unit<AngleUnit>::value, "Type `AngleUnit` must be a unit of angle derived from `unit_t`.");
+			return dimensionless::scalar_t(std::cos(angle.template convert<angle::radian>()()));
+		}
+#endif
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute sine
+		 * @details		The input value can be in any unit of angle, including radians or degrees.
+		 * @tparam		AngleUnit	any `unit_t` type of `category::angle_unit`.
+		 * @param[in]	angle		angle to compute the since of
+		 * @returns		Returns the sine of <i>angle</i>
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class AngleUnit>
+		dimensionless::scalar_t sin(const AngleUnit angle) noexcept
+		{
+			static_assert(traits::is_angle_unit<AngleUnit>::value, "Type `AngleUnit` must be a unit of angle derived from `unit_t`.");
+			return dimensionless::scalar_t(std::sin(angle.template convert<angle::radian>()()));
+		}
+#endif
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute tangent
+		 * @details		The input value can be in any unit of angle, including radians or degrees.
+		 * @tparam		AngleUnit	any `unit_t` type of `category::angle_unit`.
+		 * @param[in]	angle		angle to compute the tangent of
+		 * @returns		Returns the tangent of <i>angle</i>
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class AngleUnit>
+		dimensionless::scalar_t tan(const AngleUnit angle) noexcept
+		{
+			static_assert(traits::is_angle_unit<AngleUnit>::value, "Type `AngleUnit` must be a unit of angle derived from `unit_t`.");
+			return dimensionless::scalar_t(std::tan(angle.template convert<angle::radian>()()));
+		}
+#endif
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute arc cosine
+		 * @details		Returns the principal value of the arc cosine of x, expressed in radians.
+		 * @param[in]	x		Value whose arc cosine is computed, in the interval [-1,+1].
+		 * @returns		Principal arc cosine of x, in the interval [0,pi] radians.
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class ScalarUnit>
+		angle::radian_t acos(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return angle::radian_t(std::acos(x()));
+		}
+#endif
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute arc sine
+		 * @details		Returns the principal value of the arc sine of x, expressed in radians.
+		 * @param[in]	x		Value whose arc sine is computed, in the interval [-1,+1].
+		 * @returns		Principal arc sine of x, in the interval [-pi/2,+pi/2] radians.
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class ScalarUnit>
+		angle::radian_t asin(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return angle::radian_t(std::asin(x()));
+		}
+#endif
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute arc tangent
+		 * @details		Returns the principal value of the arc tangent of x, expressed in radians.
+		 *				Notice that because of the sign ambiguity, the function cannot determine with
+		 *				certainty in which quadrant the angle falls only by its tangent value. See
+		 *				atan2 for an alternative that takes a fractional argument instead.
+		 * @tparam		AngleUnit	any `unit_t` type of `category::angle_unit`.
+		 * @param[in]	x		Value whose arc tangent is computed, in the interval [-1,+1].
+		 * @returns		Principal arc tangent of x, in the interval [-pi/2,+pi/2] radians.
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class ScalarUnit>
+		angle::radian_t atan(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return angle::radian_t(std::atan(x()));
+		}
+#endif
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute arc tangent with two parameters
+		 * @details		To compute the value, the function takes into account the sign of both arguments in order to determine the quadrant.
+		 * @param[in]	y		y-component of the triangle expressed.
+		 * @param[in]	x		x-component of the triangle expressed.
+		 * @returns		Returns the principal value of the arc tangent of <i>y/x</i>, expressed in radians.
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class Y, class X>
+		angle::radian_t atan2(const Y y, const X x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<decltype(y/x)>::value, "The quantity y/x must yield a dimensionless ratio.");
+
+			// X and Y could be different length units, so normalize them
+			return angle::radian_t(std::atan2(y.template convert<typename units::traits::unit_t_traits<X>::unit_type>()(), x()));
+		}
+#endif
+
+		//----------------------------------
+		//	HYPERBOLIC TRIG FUNCTIONS
+		//----------------------------------
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute hyperbolic cosine
+		 * @details		The input value can be in any unit of angle, including radians or degrees.
+		 * @tparam		AngleUnit	any `unit_t` type of `category::angle_unit`.
+		 * @param[in]	angle		angle to compute the hyperbolic cosine of
+		 * @returns		Returns the hyperbolic cosine of <i>angle</i>
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class AngleUnit>
+		dimensionless::scalar_t cosh(const AngleUnit angle) noexcept
+		{
+			static_assert(traits::is_angle_unit<AngleUnit>::value, "Type `AngleUnit` must be a unit of angle derived from `unit_t`.");
+			return dimensionless::scalar_t(std::cosh(angle.template convert<angle::radian>()()));
+		}
+#endif
+
+		/**
+		* @ingroup		UnitMath
+		* @brief		Compute hyperbolic sine
+		* @details		The input value can be in any unit of angle, including radians or degrees.
+		* @tparam		AngleUnit	any `unit_t` type of `category::angle_unit`.
+		* @param[in]	angle		angle to compute the hyperbolic sine of
+		* @returns		Returns the hyperbolic sine of <i>angle</i>
+		*/
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class AngleUnit>
+		dimensionless::scalar_t sinh(const AngleUnit angle) noexcept
+		{
+			static_assert(traits::is_angle_unit<AngleUnit>::value, "Type `AngleUnit` must be a unit of angle derived from `unit_t`.");
+			return dimensionless::scalar_t(std::sinh(angle.template convert<angle::radian>()()));
+		}
+#endif
+
+		/**
+		* @ingroup		UnitMath
+		* @brief		Compute hyperbolic tangent
+		* @details		The input value can be in any unit of angle, including radians or degrees.
+		* @tparam		AngleUnit	any `unit_t` type of `category::angle_unit`.
+		* @param[in]	angle		angle to compute the hyperbolic tangent of
+		* @returns		Returns the hyperbolic tangent of <i>angle</i>
+		*/
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class AngleUnit>
+		dimensionless::scalar_t tanh(const AngleUnit angle) noexcept
+		{
+			static_assert(traits::is_angle_unit<AngleUnit>::value, "Type `AngleUnit` must be a unit of angle derived from `unit_t`.");
+			return dimensionless::scalar_t(std::tanh(angle.template convert<angle::radian>()()));
+		}
+#endif
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute arc hyperbolic cosine
+		 * @details		Returns the nonnegative arc hyperbolic cosine of x, expressed in radians.
+		 * @param[in]	x	Value whose arc hyperbolic cosine is computed. If the argument is less
+		 *					than 1, a domain error occurs.
+		 * @returns		Nonnegative arc hyperbolic cosine of x, in the interval [0,+INFINITY] radians.
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class ScalarUnit>
+		angle::radian_t acosh(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return angle::radian_t(std::acosh(x()));
+		}
+#endif
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute arc hyperbolic sine
+		 * @details		Returns the arc hyperbolic sine of x, expressed in radians.
+		 * @param[in]	x	Value whose arc hyperbolic sine is computed.
+		 * @returns		Arc hyperbolic sine of x, in radians.
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class ScalarUnit>
+		angle::radian_t asinh(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return angle::radian_t(std::asinh(x()));
+		}
+#endif
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute arc hyperbolic tangent
+		 * @details		Returns the arc hyperbolic tangent of x, expressed in radians.
+		 * @param[in]	x	Value whose arc hyperbolic tangent is computed, in the interval [-1,+1].
+		 *					If the argument is out of this interval, a domain error occurs. For
+		 *					values of -1 and +1, a pole error may occur.
+		 * @returns		units::angle::radian_t
+		 */
+#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_ANGLE_UNITS)
+		template<class ScalarUnit>
+		angle::radian_t atanh(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return angle::radian_t(std::atanh(x()));
+		}
+#endif
+
+		//----------------------------------
+		//	TRANSCENDENTAL FUNCTIONS
+		//----------------------------------
+
+		// it makes NO SENSE to put dimensioned units into a transcendental function, and if you think it does you are
+		// demonstrably wrong. https://en.wikipedia.org/wiki/Transcendental_function#Dimensional_analysis
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute exponential function
+		 * @details		Returns the base-e exponential function of x, which is e raised to the power x: ex.
+		 * @param[in]	x	scalar value of the exponent.
+		 * @returns		Exponential value of x.
+		 *				If the magnitude of the result is too large to be represented by a value of the return type, the
+		 *				function returns HUGE_VAL (or HUGE_VALF or HUGE_VALL) with the proper sign, and an overflow range error occurs
+		 */
+		template<class ScalarUnit>
+		dimensionless::scalar_t exp(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return dimensionless::scalar_t(std::exp(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute natural logarithm
+		 * @details		Returns the natural logarithm of x.
+		 * @param[in]	x	scalar value whose logarithm is calculated. If the argument is negative, a
+		 *					domain error occurs.
+		 * @sa			log10 for more common base-10 logarithms
+		 * @returns		Natural logarithm of x.
+		 */
+		template<class ScalarUnit>
+		dimensionless::scalar_t log(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return dimensionless::scalar_t(std::log(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute common logarithm
+		 * @details		Returns the common (base-10) logarithm of x.
+		 * @param[in]	x	Value whose logarithm is calculated. If the argument is negative, a
+		 *					domain error occurs.
+		 * @returns		Common logarithm of x.
+		 */
+		template<class ScalarUnit>
+		dimensionless::scalar_t log10(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return dimensionless::scalar_t(std::log10(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Break into fractional and integral parts.
+		 * @details		The integer part is stored in the object pointed by intpart, and the
+		 *				fractional part is returned by the function. Both parts have the same sign
+		 *				as x.
+		 * @param[in]	x		scalar value to break into parts.
+		 * @param[in]	intpart Pointer to an object (of the same type as x) where the integral part
+		 *				is stored with the same sign as x.
+		 * @returns		The fractional part of x, with the same sign.
+		 */
+		template<class ScalarUnit>
+		dimensionless::scalar_t modf(const ScalarUnit x, ScalarUnit* intpart) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+
+			UNIT_LIB_DEFAULT_TYPE intp;
+			dimensionless::scalar_t fracpart = dimensionless::scalar_t(std::modf(x(), &intp));
+			*intpart = intp;
+			return fracpart;
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute binary exponential function
+		 * @details		Returns the base-2 exponential function of x, which is 2 raised to the power x: 2^x.
+		 * 2param[in]	x	Value of the exponent.
+		 * @returns		2 raised to the power of x.
+		 */
+		template<class ScalarUnit>
+		dimensionless::scalar_t exp2(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return dimensionless::scalar_t(std::exp2(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute exponential minus one
+		 * @details		Returns e raised to the power x minus one: e^x-1. For small magnitude values
+		 *				of x, expm1 may be more accurate than exp(x)-1.
+		 * @param[in]	x	Value of the exponent.
+		 * @returns		e raised to the power of x, minus one.
+		 */
+		template<class ScalarUnit>
+		dimensionless::scalar_t expm1(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return dimensionless::scalar_t(std::expm1(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute logarithm plus one
+		 * @details		Returns the natural logarithm of one plus x. For small magnitude values of
+		 *				x, logp1 may be more accurate than log(1+x).
+		 * @param[in]	x	Value whose logarithm is calculated. If the argument is less than -1, a
+		 *					domain error occurs.
+		 * @returns		The natural logarithm of (1+x).
+		 */
+		template<class ScalarUnit>
+		dimensionless::scalar_t log1p(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return dimensionless::scalar_t(std::log1p(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute binary logarithm
+		 * @details		Returns the binary (base-2) logarithm of x.
+		 * @param[in]	x	Value whose logarithm is calculated. If the argument is negative, a
+		 *					domain error occurs.
+		 * @returns		The binary logarithm of x: log2x.
+		 */
+		template<class ScalarUnit>
+		dimensionless::scalar_t log2(const ScalarUnit x) noexcept
+		{
+			static_assert(traits::is_dimensionless_unit<ScalarUnit>::value, "Type `ScalarUnit` must be a dimensionless unit derived from `unit_t`.");
+			return dimensionless::scalar_t(std::log2(x()));
+		}
+
+		//----------------------------------
+		//	POWER FUNCTIONS
+		//----------------------------------
+
+		/* pow is implemented earlier in the library since a lot of the unit definitions depend on it */
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		computes the square root of <i>value</i>
+		 * @details		Only implemented for linear_scale units.
+		 * @param[in]	value `unit_t` derived type to compute the square root of.
+		 * @returns		new unit_t, whose units are the square root of value's. E.g. if values
+		 *				had units of `square_meter`, then the return type will have units of
+		 *				`meter`.
+		 * @note		`sqrt` provides a _rational approximation_ of the square root of <i>value</i>.
+		 *				In some cases, _both_ the returned value _and_ conversion factor of the returned
+		 *				unit type may have errors no larger than `1e-10`.
+		 */
+		template<class UnitType, std::enable_if_t<units::traits::has_linear_scale<UnitType>::value, int> = 0>
+		inline auto sqrt(const UnitType& value) noexcept -> unit_t<square_root<typename units::traits::unit_t_traits<UnitType>::unit_type>, typename units::traits::unit_t_traits<UnitType>::underlying_type, linear_scale>
+		{
+			return unit_t<square_root<typename units::traits::unit_t_traits<UnitType>::unit_type>, typename units::traits::unit_t_traits<UnitType>::underlying_type, linear_scale>
+				(std::sqrt(value()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Computes the square root of the sum-of-squares of x and y.
+		 * @details		Only implemented for linear_scale units.
+		 * @param[in]	x	unit_t type value
+		 * @param[in]	y	unit_t type value
+		 * @returns		square root of the sum-of-squares of x and y in the same units
+		 *				as x.
+		 */
+		template<class UnitTypeLhs, class UnitTypeRhs, std::enable_if_t<units::traits::has_linear_scale<UnitTypeLhs, UnitTypeRhs>::value, int> = 0>
+		inline UnitTypeLhs hypot(const UnitTypeLhs& x, const UnitTypeRhs& y)
+		{
+			static_assert(traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value, "Parameters of hypot() function are not compatible units.");
+			return UnitTypeLhs(std::hypot(x(), y.template convert<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type>()()));
+		}
+
+		//----------------------------------
+		//	ROUNDING FUNCTIONS
+		//----------------------------------
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Round up value
+		 * @details		Rounds x upward, returning the smallest integral value that is not less than x.
+		 * @param[in]	x	Unit value to round up.
+		 * @returns		The smallest integral value that is not less than x.
+		 */
+		template<class UnitType, class = std::enable_if_t<traits::is_unit_t<UnitType>::value>>
+		UnitType ceil(const UnitType x) noexcept
+		{
+			return UnitType(std::ceil(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Round down value
+		 * @details		Rounds x downward, returning the largest integral value that is not greater than x.
+		 * @param[in]	x	Unit value to round down.
+		 * @returns		The value of x rounded downward.
+		 */
+		template<class UnitType, class = std::enable_if_t<traits::is_unit_t<UnitType>::value>>
+		UnitType floor(const UnitType x) noexcept
+		{
+			return UnitType(std::floor(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute remainder of division
+		 * @details		Returns the floating-point remainder of numer/denom (rounded towards zero).
+		 * @param[in]	numer	Value of the quotient numerator.
+		 * @param[in]	denom	Value of the quotient denominator.
+		 * @returns		The remainder of dividing the arguments.
+		 */
+		template<class UnitTypeLhs, class UnitTypeRhs, class = std::enable_if_t<traits::is_unit_t<UnitTypeLhs>::value && traits::is_unit_t<UnitTypeRhs>::value>>
+		UnitTypeLhs fmod(const UnitTypeLhs numer, const UnitTypeRhs denom) noexcept
+		{
+			static_assert(traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value, "Parameters of fmod() function are not compatible units.");
+			return UnitTypeLhs(std::fmod(numer(), denom.template convert<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type>()()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Truncate value
+		 * @details		Rounds x toward zero, returning the nearest integral value that is not
+		 *				larger in magnitude than x. Effectively rounds towards 0.
+		 * @param[in]	x	Value to truncate
+		 * @returns		The nearest integral value that is not larger in magnitude than x.
+		 */
+		template<class UnitType, class = std::enable_if_t<traits::is_unit_t<UnitType>::value>>
+		UnitType trunc(const UnitType x) noexcept
+		{
+			return UnitType(std::trunc(x()));
+		}
+
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Round to nearest
+		 * @details		Returns the integral value that is nearest to x, with halfway cases rounded
+		 *				away from zero.
+		 * @param[in]	x	value to round.
+		 * @returns		The value of x rounded to the nearest integral.
+		 */
+		template<class UnitType, class = std::enable_if_t<traits::is_unit_t<UnitType>::value>>
+		UnitType round(const UnitType x) noexcept
+		{
+			return UnitType(std::round(x()));
+		}
+
+		//----------------------------------
+		//	FLOATING POINT MANIPULATION
+		//----------------------------------
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Copy sign
+		 * @details		Returns a value with the magnitude and dimension of x, and the sign of y.
+		 *				Values x and y do not have to be compatible units.
+		 * @param[in]	x	Value with the magnitude of the resulting value.
+		 * @param[in]	y	Value with the sign of the resulting value.
+		 * @returns		value with the magnitude and dimension of x, and the sign of y.
+		 */
+		template<class UnitTypeLhs, class UnitTypeRhs, class = std::enable_if_t<traits::is_unit_t<UnitTypeLhs>::value && traits::is_unit_t<UnitTypeRhs>::value>>
+		UnitTypeLhs copysign(const UnitTypeLhs x, const UnitTypeRhs y) noexcept
+		{
+			return UnitTypeLhs(std::copysign(x(), y()));	// no need for conversion to get the correct sign.
+		}
+
+		/// Overload to copy the sign from a raw double
+		template<class UnitTypeLhs, class = std::enable_if_t<traits::is_unit_t<UnitTypeLhs>::value>>
+		UnitTypeLhs copysign(const UnitTypeLhs x, const UNIT_LIB_DEFAULT_TYPE y) noexcept
+		{
+			return UnitTypeLhs(std::copysign(x(), y));
+		}
+
+		//----------------------------------
+		//	MIN / MAX / DIFFERENCE
+		//----------------------------------
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Positive difference
+		 * @details		The function returns x-y if x>y, and zero otherwise, in the same units as x.
+		 *				Values x and y do not have to be the same type of units, but they do have to
+		 *				be compatible.
+		 * @param[in]	x	Values whose difference is calculated.
+		 * @param[in]	y	Values whose difference is calculated.
+		 * @returns		The positive difference between x and y.
+		 */
+		template<class UnitTypeLhs, class UnitTypeRhs, class = std::enable_if_t<traits::is_unit_t<UnitTypeLhs>::value && traits::is_unit_t<UnitTypeRhs>::value>>
+		UnitTypeLhs fdim(const UnitTypeLhs x, const UnitTypeRhs y) noexcept
+		{
+			static_assert(traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value, "Parameters of fdim() function are not compatible units.");
+			return UnitTypeLhs(std::fdim(x(), y.template convert<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type>()()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Maximum value
+		 * @details		Returns the larger of its arguments: either x or y, in the same units as x.
+		 *				Values x and y do not have to be the same type of units, but they do have to
+		 *				be compatible.
+		 * @param[in]	x	Values among which the function selects a maximum.
+		 * @param[in]	y	Values among which the function selects a maximum.
+		 * @returns		The maximum numeric value of its arguments.
+		 */
+		template<class UnitTypeLhs, class UnitTypeRhs, class = std::enable_if_t<traits::is_unit_t<UnitTypeLhs>::value && traits::is_unit_t<UnitTypeRhs>::value>>
+		UnitTypeLhs fmax(const UnitTypeLhs x, const UnitTypeRhs y) noexcept
+		{
+			static_assert(traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value, "Parameters of fmax() function are not compatible units.");
+			return UnitTypeLhs(std::fmax(x(), y.template convert<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type>()()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Minimum value
+		 * @details		Returns the smaller of its arguments: either x or y, in the same units as x.
+		 *				If one of the arguments in a NaN, the other is returned.
+		 *				Values x and y do not have to be the same type of units, but they do have to
+		 *				be compatible.
+		 * @param[in]	x	Values among which the function selects a minimum.
+		 * @param[in]	y	Values among which the function selects a minimum.
+		 * @returns		The minimum numeric value of its arguments.
+		 */
+		template<class UnitTypeLhs, class UnitTypeRhs, class = std::enable_if_t<traits::is_unit_t<UnitTypeLhs>::value && traits::is_unit_t<UnitTypeRhs>::value>>
+		UnitTypeLhs fmin(const UnitTypeLhs x, const UnitTypeRhs y) noexcept
+		{
+			static_assert(traits::is_convertible_unit_t<UnitTypeLhs, UnitTypeRhs>::value, "Parameters of fmin() function are not compatible units.");
+			return UnitTypeLhs(std::fmin(x(), y.template convert<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type>()()));
+		}
+
+		//----------------------------------
+		//	OTHER FUNCTIONS
+		//----------------------------------
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute absolute value
+		 * @details		Returns the absolute value of x, i.e. |x|.
+		 * @param[in]	x	Value whose absolute value is returned.
+		 * @returns		The absolute value of x.
+		 */
+		template<class UnitType, class = std::enable_if_t<traits::is_unit_t<UnitType>::value>>
+		UnitType fabs(const UnitType x) noexcept
+		{
+			return UnitType(std::fabs(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Compute absolute value
+		 * @details		Returns the absolute value of x, i.e. |x|.
+		 * @param[in]	x	Value whose absolute value is returned.
+		 * @returns		The absolute value of x.
+		 */
+		template<class UnitType, class = std::enable_if_t<traits::is_unit_t<UnitType>::value>>
+		UnitType abs(const UnitType x) noexcept
+		{
+			return UnitType(std::fabs(x()));
+		}
+
+		/**
+		 * @ingroup		UnitMath
+		 * @brief		Multiply-add
+		 * @details		Returns x*y+z. The function computes the result without losing precision in
+		 *				any intermediate result. The resulting unit type is a compound unit of x* y.
+		 * @param[in]	x	Values to be multiplied.
+		 * @param[in]	y	Values to be multiplied.
+		 * @param[in]	z	Value to be added.
+		 * @returns		The result of x*y+z
+		 */
+		template<class UnitTypeLhs, class UnitMultiply, class UnitAdd, class = std::enable_if_t<traits::is_unit_t<UnitTypeLhs>::value && traits::is_unit_t<UnitMultiply>::value && traits::is_unit_t<UnitAdd>::value>>
+		auto fma(const UnitTypeLhs x, const UnitMultiply y, const UnitAdd z) noexcept -> decltype(x * y)
+		{
+			using resultType = decltype(x * y);
+			static_assert(traits::is_convertible_unit_t<compound_unit<typename units::traits::unit_t_traits<UnitTypeLhs>::unit_type, typename units::traits::unit_t_traits<UnitMultiply>::unit_type>, typename units::traits::unit_t_traits<UnitAdd>::unit_type>::value, "Unit types are not compatible.");
+			return resultType(std::fma(x(), y(), resultType(z)()));
+		}
+
+	}	// end namespace math
+}	// end namespace units
+
+//------------------------------
+//	std::numeric_limits
+//------------------------------
+
+namespace std
+{
+	template<class Units, typename T, template<typename> class NonLinearScale>
+	class numeric_limits<units::unit_t<Units, T, NonLinearScale>>
+	{
+	public:
+		static constexpr units::unit_t<Units, T, NonLinearScale> min()
+		{
+			return units::unit_t<Units, T, NonLinearScale>(std::numeric_limits<T>::min());
+		}
+		static constexpr units::unit_t<Units, T, NonLinearScale> max()
+		{
+			return units::unit_t<Units, T, NonLinearScale>(std::numeric_limits<T>::max());
+		}
+		static constexpr units::unit_t<Units, T, NonLinearScale> lowest()
+		{
+			return units::unit_t<Units, T, NonLinearScale>(std::numeric_limits<T>::lowest());
+		}
+		static constexpr bool is_integer = std::numeric_limits<T>::is_integer;
+		static constexpr bool is_signed = std::numeric_limits<T>::is_signed;
+	};
+}
+
+#ifdef _MSC_VER
+#	if _MSC_VER <= 1800
+#		pragma warning(pop)
+#		undef constexpr
+#		pragma pop_macro("constexpr")
+#		undef noexcept
+#		pragma pop_macro("noexcept")
+#		undef _ALLOW_KEYWORD_MACROS
+#	endif // _MSC_VER < 1800
+#	pragma pop_macro("pascal")
+#endif // _MSC_VER
+
+#endif // units_h__
+
+// For Emacs
+// Local Variables:
+// Mode: C++
+// c-basic-offset: 2
+// fill-column: 116
+// tab-width: 4
+// End:
diff --git a/sim/include/agentBlueprintInterface.h b/sim/include/agentBlueprintInterface.h
index ac1993c1de46b4af2ef8f8155f8f828e1029409c..4a2704eb0cdbb4abd1895af06c189300f8f14dbd 100644
--- a/sim/include/agentBlueprintInterface.h
+++ b/sim/include/agentBlueprintInterface.h
@@ -15,14 +15,15 @@
 //!        with the framework.
 //-----------------------------------------------------------------------------
 
+#include <MantleAPI/Traffic/entity_properties.h>
 #include <string>
 #include <unordered_map>
 
 #include "common/globalDefinitions.h"
 #include "common/worldDefinitions.h"
-
 #include "include/agentTypeInterface.h"
 #include "include/profilesInterface.h"
+#include "include/controlStrategiesInterface.h"
 
 #pragma once
 
@@ -38,51 +39,28 @@ struct Route
 
 struct SpawnParameter
 {
-    double positionX = -999;
-    double positionY = -999;
-    double velocity = -999;
-    double acceleration = -999;
-    double gear = -999;
-    double yawAngle = -999;
+    mantle_api::Vec3<units::length::meter_t> position{0.0_m, 0.0_m, 0.0_m};
+    units::velocity::meters_per_second_t velocity{0.0_mps};
+    units::acceleration::meters_per_second_squared_t acceleration{0.0_mps_sq};
+    mantle_api::Orientation3<units::angle::radian_t> orientation{0.0_rad, 0.0_rad, 0.0_rad};
+    double gear = 0.0;
     Route route{};
 };
 
-class AgentBlueprintInterface
+struct System
 {
-public:
-    AgentBlueprintInterface() = default;
-    virtual ~AgentBlueprintInterface() = default;
-
-    //Setter
-    virtual void SetVehicleComponentProfileNames(VehicleComponentProfileNames vehicleComponentProfileName) = 0;
-    virtual void SetAgentCategory(AgentCategory agentCategory) = 0;
-    virtual void SetAgentProfileName(std::string agentTypeName) = 0;
-    virtual void SetVehicleProfileName(std::string vehicleModelName) = 0;
-    virtual void SetVehicleModelName(std::string vehicleModelName) = 0;
-    virtual void SetVehicleModelParameters(VehicleModelParameters vehicleModelParameters) = 0;
-    virtual void SetDriverProfileName(std::string driverProfileName) = 0;
-    virtual void SetSpawnParameter(SpawnParameter spawnParameter) = 0;
-    virtual void SetSpeedGoalMin(double speedGoalMin) = 0;
-    virtual void SetAgentType(std::shared_ptr<core::AgentTypeInterface> agentType) = 0;
-
-    virtual void AddSensor(openpass::sensors::Parameter parameters) = 0;
-
-    virtual AgentCategory                           GetAgentCategory() const = 0;
-    virtual std::string                             GetAgentProfileName() const = 0;
-    virtual std::string                             GetVehicleProfileName() const = 0;
-    virtual std::string                             GetVehicleModelName() const = 0;
-    virtual std::string                             GetDriverProfileName() const = 0;
-    virtual std::string                             GetObjectName() const = 0;
-
-    virtual VehicleModelParameters                  GetVehicleModelParameters() const = 0;
-    virtual openpass::sensors::Parameters           GetSensorParameters() const = 0;
-    virtual VehicleComponentProfileNames            GetVehicleComponentProfileNames() const = 0;
-    virtual core::AgentTypeInterface&    GetAgentType() const = 0;
-    virtual SpawnParameter&                         GetSpawnParameter() = 0;
-    virtual const SpawnParameter&                   GetSpawnParameter() const = 0;
-    virtual double                                  GetSpeedGoalMin() const = 0;
-
-    virtual void                                    SetObjectName(std::string objectName) = 0;
+    std::shared_ptr<core::AgentTypeInterface> agentType;
+    std::string agentProfileName;
+    std::string driverProfileName;
+    openpass::sensors::Parameters sensorParameters;
 };
 
-
+struct AgentBuildInstructions
+{
+    std::string name;
+    AgentCategory agentCategory;
+    std::shared_ptr<const mantle_api::EntityProperties> entityProperties;
+    System system;
+    SpawnParameter spawnParameter;
+    std::shared_ptr<ControlStrategiesInterface> controlStrategies;
+};
diff --git a/sim/include/agentBlueprintProviderInterface.h b/sim/include/agentBlueprintProviderInterface.h
index 90b3e68e579025e35528befe5a6c0435dd5b1371..3d952a58706963380df2347e8324ad33c82d0fde 100644
--- a/sim/include/agentBlueprintProviderInterface.h
+++ b/sim/include/agentBlueprintProviderInterface.h
@@ -17,9 +17,8 @@
 #pragma once
 
 #include <optional>
-#include "common/openScenarioDefinitions.h"
+#include "include/agentBlueprintInterface.h"
 
-class AgentBlueprint;
 class AgentBlueprintProviderInterface
 {
 public:
@@ -36,6 +35,8 @@ public:
     *
     * @return           Sampled AgentBlueprint if successful
     */
-    virtual AgentBlueprint SampleAgent(const std::string& agentProfileName, const openScenario::Parameters& assignedParameters) const = 0;
+    virtual System SampleSystem(const std::string &agentProfileName) const = 0;
+
+    virtual std::string SampleVehicleModelName(const std::string &agentProfileName) const = 0;
 };
 
diff --git a/sim/include/agentFactoryInterface.h b/sim/include/agentFactoryInterface.h
index 55a5e138f15f4deaf6b82780083fe134397aa60c..9113681fe9f470f423ef61f177cb46195bc17aba 100644
--- a/sim/include/agentFactoryInterface.h
+++ b/sim/include/agentFactoryInterface.h
@@ -51,7 +51,7 @@ public:
     //!
     //! @return                         The added agent
     //-----------------------------------------------------------------------------
-    virtual Agent *AddAgent(AgentBlueprintInterface* agentBlueprint) = 0;
+    virtual Agent *AddAgent(const AgentBuildInstructions& agentBuildInstructions) = 0;
 };
 
 } //namespace core
diff --git a/sim/include/agentInterface.h b/sim/include/agentInterface.h
index 6d3146774aaa8c2bf3eaf8101293321248b505f0..3e10ccb395cd5238ecdbad4862bb2dd6ecf64091 100644
--- a/sim/include/agentInterface.h
+++ b/sim/include/agentInterface.h
@@ -18,6 +18,7 @@
 
 #pragma once
 
+#include <MantleAPI/Traffic/entity_properties.h>
 #include <map>
 #include <vector>
 
@@ -47,7 +48,7 @@ public:
     virtual ~AgentInterface() = default;
 
     //! Returns the EgoAgent corresponding to this agent
-    virtual EgoAgentInterface& GetEgoAgent() = 0;
+    virtual EgoAgentInterface &GetEgoAgent() = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves the type key of an agent
@@ -59,9 +60,9 @@ public:
     //-----------------------------------------------------------------------------
     //! Retrieves all vehicle model parameters of agent
     //!
-    //! @return               VehicleModelParameters of agent
+    //! @return               mantle_api::VehicleProperties of agent
     //-----------------------------------------------------------------------------
-    virtual VehicleModelParameters GetVehicleModelParameters() const = 0;
+    virtual std::shared_ptr<const mantle_api::EntityProperties> GetVehicleModelParameters() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves name of driver profile of agent
@@ -131,28 +132,28 @@ public:
     //!
     //! @param[in]     positionX    X-coordinate
     //-----------------------------------------------------------------------------
-    virtual void SetPositionX(double positionX) = 0;
+    virtual void SetPositionX(units::length::meter_t positionX) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets y-coordinate of agent
     //!
     //! @param[in]     positionY    Y-coordinate
     //-----------------------------------------------------------------------------
-    virtual void SetPositionY(double positionY) = 0;
+    virtual void SetPositionY(units::length::meter_t positionY) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the agents vehicle model parameter
     //!
     //! @param[in]     parameter    New vehicle model paramter
     //-----------------------------------------------------------------------------
-    virtual void SetVehicleModelParameter (const VehicleModelParameters &parameter) = 0;
+    virtual void SetVehicleModelParameter(const std::shared_ptr<const mantle_api::EntityProperties> parameter) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets forward velocity of agent
     //!
     //! @param[in]     velocityX    Forward velocity
     //-----------------------------------------------------------------------------
-    virtual void SetVelocity(double value) = 0;
+    virtual void SetVelocity(units::velocity::meters_per_second_t value) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets velocity of agent
@@ -161,42 +162,42 @@ public:
     //! @param[in]     vy    Sideward velocity
     //! @param[in]     vz    Upward velocity
     //-----------------------------------------------------------------------------
-    virtual void SetVelocityVector(double vx, double vy, double vz) = 0;
+    virtual void SetVelocityVector(const mantle_api::Vec3<units::velocity::meters_per_second_t> &velocity) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets forward acceleration of agent
     //!
     //! @param[in]     accelerationX    forward acceleration
     //-----------------------------------------------------------------------------
-    virtual void SetAcceleration(double value) = 0;
+    virtual void SetAcceleration(units::acceleration::meters_per_second_squared_t value) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets yaw angle of agent
     //!
     //! @param[in]     yawAngle    agent orientation
     //-----------------------------------------------------------------------------
-    virtual void SetYaw(double value) = 0;
+    virtual void SetYaw(units::angle::radian_t value) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets roll angle of agent
     //!
     //! @param[in]     yawAngle    agent orientation
     //-----------------------------------------------------------------------------
-    virtual void SetRoll(double value) = 0;
+    virtual void SetRoll(units::angle::radian_t value) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the total traveled distance of agent
     //!
     //! @param[in]     distanceTraveled    total traveled distance
     //-----------------------------------------------------------------------------
-    virtual void SetDistanceTraveled(double distanceTraveled) = 0;
+    virtual void SetDistanceTraveled(units::length::meter_t distanceTraveled) = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns the total traveled distance of agent
     //!
     //! @return   total traveled distance
     //-----------------------------------------------------------------------------
-    virtual double GetDistanceTraveled() const = 0;
+    virtual units::length::meter_t GetDistanceTraveled() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets gear of vehicle
@@ -210,7 +211,7 @@ public:
     //!
     //! @param[in]     engineSpeed    current engineSpeed
     //-----------------------------------------------------------------------------
-    virtual void SetEngineSpeed(double engineSpeed) = 0;
+    virtual void SetEngineSpeed(units::angular_velocity::revolutions_per_minute_t engineSpeed) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets current position of acceleration pedal in percent
@@ -231,28 +232,28 @@ public:
     //!
     //! @param[in]     steeringWheelAngle    current steering wheel angle
     //-----------------------------------------------------------------------------
-    virtual void SetSteeringWheelAngle(double steeringWheelAngle) = 0;
+    virtual void SetSteeringWheelAngle(units::angle::radian_t steeringWheelAngle) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the rotation rate of the wheels and updates their rotation, assumes RWD
     //!
     //! @param[in]     steeringWheelAngle    current steering wheel angle
     //-----------------------------------------------------------------------------
-    virtual void SetWheelsRotationRateAndOrientation(double steeringWheelAngle, double velocity, double acceleration) = 0;
+    virtual void SetWheelsRotationRateAndOrientation(units::angle::radian_t steeringWheelAngle, units::velocity::meters_per_second_t velocity, units::acceleration::meters_per_second_squared_t acceleration) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets maximum acceleration of the vehicle
     //!
     //! @param[in]     maxAcceleration   maximum acceleration
     //-----------------------------------------------------------------------------
-    virtual void SetMaxAcceleration(double maxAcceleration) = 0;
+    virtual void SetMaxAcceleration(units::acceleration::meters_per_second_squared_t maxAcceleration) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets maximum deceleration of the vehicle
     //!
     //! @param[in]     maxDeceleration   maximum deceleration
     //-----------------------------------------------------------------------------
-    virtual void SetMaxDeceleration(double maxDeceleration) = 0;
+    virtual void SetMaxDeceleration(units::acceleration::meters_per_second_squared_t maxDeceleration) = 0;
 
     //-----------------------------------------------------------------------------
     //! update list with collision partners
@@ -344,7 +345,6 @@ public:
     //-----------------------------------------------------------------------------
     virtual bool GetHighBeamLight() const = 0;
 
-
     //-----------------------------------------------------------------------------
     //! Returns the status of lights
     //!
@@ -373,7 +373,7 @@ public:
     //! @param[in] agentBlueprint    Blueprint holding parameters such as dimensions
     //!                              of a vehicle, or its initial spawning velocity
     //-----------------------------------------------------------------------------
-    virtual void InitParameter(const AgentBlueprintInterface& agentBlueprint) = 0;
+    virtual void InitParameter(const AgentBuildInstructions &agentBuildInstructions) = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns true if agent is still in World located.
@@ -400,7 +400,7 @@ public:
     //! \param ownConnectorId           OpenDrive id of the connecting road that this agent is assumed to drive on
     //!
     //! \return distance of front of agent to the intersecting lane
-    virtual double GetDistanceToConnectorEntrance(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const = 0;
+    virtual units::length::meter_t GetDistanceToConnectorEntrance(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const = 0;
 
     //! Returns the s coordinate distance from the rear of the agent to the furthest point where his lane intersects another.
     //! As the agent may not yet be on the junction, it has to be specified which connecting road he will take in the junction
@@ -410,63 +410,63 @@ public:
     //! \param ownConnectorId           OpenDrive id of the connecting road that this agent is assumed to drive on
     //!
     //! \return distance of rear of agent to the farther side of the intersecting lane
-    virtual double GetDistanceToConnectorDeparture(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const = 0;
+    virtual units::length::meter_t GetDistanceToConnectorDeparture(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve the yaw rate of the agent.
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual double GetYawRate() const = 0;
+    virtual units::angular_velocity::radians_per_second_t GetYawRate() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Set the yaw rate of the agent.
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual void SetYawRate(double yawRate) = 0;
+    virtual void SetYawRate(units::angular_velocity::radians_per_second_t yawRate) = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve the yaw acceleration of the agent.
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual double GetYawAcceleration() const = 0;
+    virtual units::angular_acceleration::radians_per_second_squared_t GetYawAcceleration() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Set the yaw acceleration of the agent.
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual void SetYawAcceleration(double yawAcceleration) = 0;
+    virtual void SetYawAcceleration(units::angular_acceleration::radians_per_second_squared_t yawAcceleration) = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve the centripetal acceleration of the agent.
     //!
     //! @return   Centripetal acceleration [m/s^2]
     //-----------------------------------------------------------------------------
-    virtual double GetCentripetalAcceleration() const = 0;
+    virtual units::acceleration::meters_per_second_squared_t GetCentripetalAcceleration() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve the tangential acceleration of the agent.
     //!
     //! @return   Tangential acceleration [m/s^2]
     //-----------------------------------------------------------------------------
-    virtual double GetTangentialAcceleration() const = 0;
+    virtual units::acceleration::meters_per_second_squared_t GetTangentialAcceleration() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Set the centripetal acceleration of the agent.
     //!
     //! @param[in]   centripetalAcceleration   The acceleration to set [m/s^2]
     //-----------------------------------------------------------------------------
-    virtual void SetCentripetalAcceleration(double centripetalAcceleration) = 0;
+    virtual void SetCentripetalAcceleration(units::acceleration::meters_per_second_squared_t centripetalAcceleration) = 0;
 
     //-----------------------------------------------------------------------------
     //! Set the tangential acceleration of the agent.
     //!
     //! @param[in]   tangentialAcceleration   The acceleration to set [m/s^2]
     //-----------------------------------------------------------------------------
-    virtual void SetTangentialAcceleration(double tangentialAcceleration) = 0;
+    virtual void SetTangentialAcceleration(units::acceleration::meters_per_second_squared_t tangentialAcceleration) = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve the ids of the roads the agent is on
@@ -476,9 +476,9 @@ public:
     //-----------------------------------------------------------------------------
     virtual std::vector<std::string> GetRoads(ObjectPoint point) const = 0;
 
-    virtual double GetDistanceReferencePointToLeadingEdge() const = 0;
+    virtual units::length::meter_t GetDistanceReferencePointToLeadingEdge() const = 0;
 
-    virtual double GetEngineSpeed() const = 0;
+    virtual units::angular_velocity::revolutions_per_minute_t GetEngineSpeed() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Gets current position of acceleration pedal in percent
@@ -499,19 +499,21 @@ public:
     //!
     //! @return     current steering wheel angle
     //-----------------------------------------------------------------------------
-    virtual double GetSteeringWheelAngle() const = 0;
+    virtual units::angle::radian_t GetSteeringWheelAngle() const = 0;
 
-    virtual double GetMaxAcceleration() const = 0;
-    virtual double GetMaxDeceleration() const = 0;
+    virtual units::acceleration::meters_per_second_squared_t GetMaxAcceleration() const = 0;
+    virtual units::acceleration::meters_per_second_squared_t GetMaxDeceleration() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves the minimum speed goal of agent
     //!
     //! @return               Speed Goal Min
     //-----------------------------------------------------------------------------
-    virtual double GetSpeedGoalMin() const = 0;
+    virtual units::velocity::meters_per_second_t GetSpeedGoalMin() const = 0;
 
-    virtual const openpass::sensors::Parameters& GetSensorParameters() const = 0;
+    virtual const openpass::sensors::Parameters &GetSensorParameters() const = 0;
 
     virtual void SetSensorParameters(openpass::sensors::Parameters sensorParameters) = 0;
+
+    virtual units::length::meter_t GetWheelbase() const = 0;
 };
diff --git a/sim/include/configurationContainerInterface.h b/sim/include/configurationContainerInterface.h
index 2cdf5c4a6b0b91af38a93c752d01b5ba439c8e79..2ad481877c53ae4d63573bd0dc71af4797dbf161 100644
--- a/sim/include/configurationContainerInterface.h
+++ b/sim/include/configurationContainerInterface.h
@@ -16,7 +16,6 @@
 #include "include/simulationConfigInterface.h"
 #include "include/profilesInterface.h"
 #include "include/sceneryInterface.h"
-#include "include/scenarioInterface.h"
 #include "include/systemConfigInterface.h"
 #include "include/vehicleModelsInterface.h"
 
@@ -29,9 +28,6 @@ public:
     virtual std::shared_ptr<SystemConfigInterface> GetSystemConfigBlueprint() const = 0;
     virtual const SimulationConfigInterface* GetSimulationConfig() const = 0;
     virtual const ProfilesInterface* GetProfiles() const = 0;
-    virtual const SceneryInterface* GetScenery() const = 0;
-    virtual const ScenarioInterface* GetScenario() const = 0;
     virtual const std::map<std::string, std::shared_ptr<SystemConfigInterface>>& GetSystemConfigs() const = 0;
-    virtual const VehicleModelsInterface* GetVehicleModels() const  = 0;
     virtual const openpass::common::RuntimeInformation& GetRuntimeInformation() const = 0;
 };
diff --git a/sim/include/controlStrategiesInterface.h b/sim/include/controlStrategiesInterface.h
new file mode 100644
index 0000000000000000000000000000000000000000..335efae08bd0a50e11deb0680cd3ace07a19e9ee
--- /dev/null
+++ b/sim/include/controlStrategiesInterface.h
@@ -0,0 +1,38 @@
+/********************************************************************************
+ * Copyright (c) 2021 in-tech GmbH
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+//-----------------------------------------------------------------------------
+//! @file  controlStrategiesInterface.h
+//! @brief This interfaces provies access to the control strategies of a single entity
+//-----------------------------------------------------------------------------
+
+#include <limits>
+#include <memory>
+
+#include "MantleAPI/Traffic/control_strategy.h"
+
+#pragma once
+
+class ControlStrategiesInterface
+{
+public:
+    ControlStrategiesInterface() = default;
+    virtual ~ControlStrategiesInterface() = default;
+
+    virtual std::vector<std::shared_ptr<mantle_api::ControlStrategy>> GetStrategies(mantle_api::ControlStrategyType type) = 0;
+
+    virtual void SetStrategies(std::vector<std::shared_ptr<mantle_api::ControlStrategy>> strategies) = 0;
+
+    virtual const std::vector<std::string>& GetCustomCommands() = 0;
+
+    virtual void AddCustomCommand(const std::string& command) = 0;
+
+    virtual void ResetCustomCommands() = 0;
+};
\ No newline at end of file
diff --git a/sim/include/egoAgentInterface.h b/sim/include/egoAgentInterface.h
index 3f3a9f1c6ff64c353107adc459890f343b85ba5a..8cd75f07042275a7da940d9c0eaaf8b410e2068d 100644
--- a/sim/include/egoAgentInterface.h
+++ b/sim/include/egoAgentInterface.h
@@ -11,8 +11,12 @@
 
 #pragma once
 
+#include "common/namedType.h"
 #include "include/agentInterface.h"
 
+using namespace units::literals;
+using namespace openpass::type;
+
 template <typename ... QueryPack>
 using Predicate = std::function<bool(QueryPack ...)>;
 
@@ -22,26 +26,12 @@ using Compare = std::function<bool(std::pair<QueryPack, QueryPack>...)>;
 template <typename T>
 using ExecuteReturn =  std::tuple<std::vector<T>>;
 
-template <typename T, typename Tag>
-struct NamedType
-{
-    T value;
-
-    NamedType (T value) :
-        value(value) {}
-
-    operator T() const
-    {
-        return value;
-    }
-};
-
-using DistanceToEndOfLane = NamedType<double, struct DistanceType>;
+using DistanceToEndOfLane = NamedType<units::length::meter_t, struct DistanceType>;
 
 //! Parameters of GetDistanceToEndOfLane
 struct DistanceToEndOfLaneParameter
 {
-    double range;
+    units::length::meter_t range;
     int relativeLane;
 };
 
@@ -50,8 +40,8 @@ using ObjectsInRange = NamedType<std::vector<const WorldObjectInterface*>, struc
 //! Parameters of GetObjectsInRange
 struct ObjectsInRangeParameter
 {
-    double backwardRange;
-    double forwardRange;
+    units::length::meter_t backwardRange;
+    units::length::meter_t forwardRange;
     int relativeLane;
 };
 
@@ -111,11 +101,11 @@ public:
     virtual const std::string& GetRoadId() const = 0;
 
     //! Returns the velocity of the own agent taking the route into account
-    virtual double GetVelocity(VelocityScope velocityScope) const = 0;
+    virtual units::velocity::meters_per_second_t GetVelocity(VelocityScope velocityScope) const = 0;
 
     //! Returns the velocity of another object taking the own route into account
     //! This means that, if the other object is an agent driving in opposite direction the longitudinal velocity will be negative
-    virtual double GetVelocity(VelocityScope velocityScope, const WorldObjectInterface* object) const = 0;
+    virtual units::velocity::meters_per_second_t GetVelocity(VelocityScope velocityScope, const WorldObjectInterface* object) const = 0;
 
     //! Return the distane to the end of the driving lane (i.e. as defined by the corresponding
     //! WorldInterface function) along the set route. Returns infinity if the end is father away than the range
@@ -123,16 +113,16 @@ public:
     //! \param range            maximum search range (calculated from MainLaneLocator)
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return remaining distance (calculated from MainLaneLocator)
-    virtual double GetDistanceToEndOfLane(double range, int relativeLane = 0) const = 0;
+    virtual units::length::meter_t GetDistanceToEndOfLane(units::length::meter_t range, int relativeLane = 0) const = 0;
 
-    virtual double GetDistanceToEndOfLane(double range, int relativeLane, const LaneTypes& acceptableLaneTypes) const = 0;
+    virtual units::length::meter_t GetDistanceToEndOfLane(units::length::meter_t range, int relativeLane, const LaneTypes& acceptableLaneTypes) const = 0;
 
     //! Returns all lane along the route relative the agent (i.e. the driving view of the agent)
     //!
     //! \param range            maximum search range (calculated from MainLaneLocator)
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return lanes relative to agent
-    virtual RelativeWorldView::Lanes GetRelativeLanes(double range, int relativeLane = 0, bool includeOncoming = true) const = 0;
+    virtual RelativeWorldView::Lanes GetRelativeLanes(units::length::meter_t range, int relativeLane = 0, bool includeOncoming = true) const = 0;
 
     //! Returns the relative lane of the ReferencePoint or MainLocatePoint of another object
     //!
@@ -141,13 +131,13 @@ public:
     //! \return relative lane id
     virtual std::optional<int> GetRelativeLaneId(const WorldObjectInterface* object, ObjectPoint point) const = 0;
 
-    [[deprecated]] virtual RelativeWorldView::Roads GetRelativeJunctions(double range) const = 0;
+    [[deprecated]] virtual RelativeWorldView::Roads GetRelativeJunctions(units::length::meter_t range) const = 0;
 
     //! Returns the relative distances (start and end) and the road id of all roads on the route in range
     //!
     //! \param range            range of search
     //! \return information about all roads in range
-    virtual RelativeWorldView::Roads GetRelativeRoads(double range) const = 0;
+    virtual RelativeWorldView::Roads GetRelativeRoads(units::length::meter_t range) const = 0;
 
     //! Returns all WorldObjects around the agent inside the specified range on the specified
     //! lane along the route
@@ -156,7 +146,7 @@ public:
     //! \param forwardRange     search range against driving direction (calculated from MainLaneLocator)
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return objects in range
-    virtual std::vector<const WorldObjectInterface*> GetObjectsInRange(double backwardRange, double forwardRange, int relativeLane = 0) const = 0;
+    virtual std::vector<const WorldObjectInterface*> GetObjectsInRange(units::length::meter_t backwardRange, units::length::meter_t forwardRange, int relativeLane = 0) const = 0;
 
     //! Returns all Agents around the agent inside the specified range on the specified
     //! lane along the route
@@ -165,7 +155,7 @@ public:
     //! \param forwardRange     search range against driving direction (calculated from MainLaneLocator)
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return agents in range
-    virtual AgentInterfaces GetAgentsInRange(double backwardRange, double forwardRange, int relativeLane = 0) const = 0;
+    virtual AgentInterfaces GetAgentsInRange(units::length::meter_t backwardRange, units::length::meter_t forwardRange, int relativeLane = 0) const = 0;
 
     //! Returns all TrafficSigns in front of the agent inside the specified range on the specified
     //! lane along the route
@@ -173,7 +163,7 @@ public:
     //! \param range            search range (calculated from MainLaneLocator)
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return traffic signs in range
-    virtual std::vector<CommonTrafficSign::Entity> GetTrafficSignsInRange(double range, int relativeLane = 0) const = 0;
+    virtual std::vector<CommonTrafficSign::Entity> GetTrafficSignsInRange(units::length::meter_t range, int relativeLane = 0) const = 0;
 
     //! Returns all RoadMarkings in front of the agent inside the specified range on the specified
     //! lane along the route
@@ -181,7 +171,7 @@ public:
     //! \param range            search range (calculated from MainLaneLocator)
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return road markings in range
-    virtual std::vector<CommonTrafficSign::Entity> GetRoadMarkingsInRange(double range, int relativeLane = 0) const = 0;
+    virtual std::vector<CommonTrafficSign::Entity> GetRoadMarkingsInRange(units::length::meter_t range, int relativeLane = 0) const = 0;
 
     //! Returns all TrafficLights in front of the agent inside the specified range on the specified
     //! lane along the route
@@ -189,7 +179,7 @@ public:
     //! \param range            search range (calculated from MainLaneLocator)
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return traffic lights in range
-    virtual std::vector<CommonTrafficLight::Entity> GetTrafficLightsInRange(double range, int relativeLane = 0) const = 0;
+    virtual std::vector<CommonTrafficLight::Entity> GetTrafficLightsInRange(units::length::meter_t range, int relativeLane = 0) const = 0;
 
     //! Returns all LaneMarkings in front of the agent inside the specified range on the specified
     //! lane along the route
@@ -197,7 +187,7 @@ public:
     //! \param range            search range (calculated from MainLaneLocator)
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return lane markings in range
-    virtual std::vector<LaneMarking::Entity> GetLaneMarkingsInRange(double range, Side side, int relativeLane = 0) const = 0;
+    virtual std::vector<LaneMarking::Entity> GetLaneMarkingsInRange(units::length::meter_t range, Side side, int relativeLane = 0) const = 0;
 
     //! Returns the (longitudinal) distance to another object along the route
     //!
@@ -205,9 +195,9 @@ public:
     //! \param ownPoint     point of own agent used for calculation
     //! \param otherPoint   point of other object used for calculation
     //! \return distance to other object or nullopt if the other object is not on the route of this agent
-    virtual std::optional<double> GetDistanceToObject(const WorldObjectInterface* otherObject, const ObjectPoint &ownPoint, const ObjectPoint &otherPoint) const = 0;
+    virtual std::optional<units::length::meter_t> GetDistanceToObject(const WorldObjectInterface* otherObject, const ObjectPoint &ownPoint, const ObjectPoint &otherPoint) const = 0;
 
-    virtual std::optional<double> GetNetDistance(const WorldObjectInterface* otherObject) const = 0;
+    virtual std::optional<units::length::meter_t> GetNetDistance(const WorldObjectInterface* otherObject) const = 0;
 
     //! Returns the (lateral) obstruction with another object along the route
     //!
@@ -219,53 +209,53 @@ public:
 
     //! Returns the yaw of the agent at the MainLaneLocater relative to the road respecting intended driving direction
     //! (i.e. driving in the intended direction equals zero relative yaw)
-    virtual double GetRelativeYaw() const = 0;
+    virtual units::angle::radian_t GetRelativeYaw() const = 0;
 
     //! Returns the distance of the MainLaneLocator to the middle of the lane respecting intended driving direction
     //! (i.e. positive values are to the left w.r.t. driving direction)
-    virtual double GetPositionLateral() const = 0;
+    virtual units::length::meter_t GetPositionLateral() const = 0;
 
     //! Returns the distance to the lane boundary on the specified side (or 0 if agent protrudes the road)
-    virtual double GetLaneRemainder(Side side) const = 0;
+    virtual units::length::meter_t GetLaneRemainder(Side side) const = 0;
 
     //! Returns the width of the specified lane at the current s coordinate
     //!
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return width of lane
-    virtual double GetLaneWidth(int relativeLane = 0) const = 0;
+    virtual units::length::meter_t GetLaneWidth(int relativeLane = 0) const = 0;
 
     //! Returns the width of the specified lane at the specified distance if existing
     //!
     //! \param distance         search distance relative to MainLaneLocator
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return width of lane
-    virtual std::optional<double> GetLaneWidth(double distance, int relativeLane = 0) const = 0;
+    virtual std::optional<units::length::meter_t> GetLaneWidth(units::length::meter_t distance, int relativeLane = 0) const = 0;
 
     //! Returns the curvature of the specified lane at the current s coordinate
     //!
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return curvature of lane
-    virtual double GetLaneCurvature(int relativeLane = 0) const = 0;
+    virtual units::curvature::inverse_meter_t GetLaneCurvature(int relativeLane = 0) const = 0;
 
     //! Returns the curvature of the specified lane at the specified distance if existing
     //!
     //! \param distance         search distance relative to MainLaneLocator
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return curvature of lane
-    virtual std::optional<double> GetLaneCurvature(double distance, int relativeLane = 0) const = 0;
+    virtual std::optional<units::curvature::inverse_meter_t> GetLaneCurvature(units::length::meter_t distance, int relativeLane = 0) const = 0;
 
     //! Returns the direction of the specified lane at the current s coordinate
     //!
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return direction of lane
-    virtual double GetLaneDirection(int relativeLane = 0) const = 0;
+    virtual units::angle::radian_t GetLaneDirection(int relativeLane = 0) const = 0;
 
     //! Returns the direction of the specified lane at the specified distance if existing
     //!
     //! \param distance         search distance relative to MainLaneLocator
     //! \param relativeLane     lane id relative to own lane (in driving direction)
     //! \return direction of lane
-    virtual std::optional<double> GetLaneDirection(double distance, int relativeLane = 0) const = 0;
+    virtual std::optional<units::angle::radian_t> GetLaneDirection(units::length::meter_t distance, int relativeLane = 0) const = 0;
 
     //! Returns the position of the MainLaneLocator (w.r.t. the OpenDrive direction of the road)
     virtual const std::optional<GlobalRoadPosition>& GetMainLocatePosition() const = 0;
@@ -284,7 +274,7 @@ public:
     //! \param tDistance    distance along t (left of driving direction)
     //! \param yaw          yaw relative to road at given distance
     //! \return world position at given distance
-    virtual std::optional<Position> GetWorldPosition(double sDistance, double tDistance, double yaw = 0) const = 0;
+    virtual std::optional<Position> GetWorldPosition (units::length::meter_t sDistance, units::length::meter_t tDistance, units::angle::radian_t yaw = 0.0_rad) const = 0;
 
     //!Returns the road positions of the given point of an object relative to the ego route
     //!
diff --git a/sim/include/entityRepositoryInterface.h b/sim/include/entityRepositoryInterface.h
new file mode 100644
index 0000000000000000000000000000000000000000..dcbd724161c48dedf4e9537e5a68a9c1f87b3784
--- /dev/null
+++ b/sim/include/entityRepositoryInterface.h
@@ -0,0 +1,26 @@
+/*******************************************************************************
+* Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include "MantleAPI/Traffic/i_entity_repository.h"
+
+namespace core {
+class Agent;
+
+class EntityRepositoryInterface : public mantle_api::IEntityRepository
+{
+public:
+    virtual bool SpawnReadyAgents() = 0;
+
+    virtual std::vector<Agent *> ConsumeNewAgents() = 0;
+};
+
+} // namespace core
\ No newline at end of file
diff --git a/sim/include/environmentInterface.h b/sim/include/environmentInterface.h
new file mode 100644
index 0000000000000000000000000000000000000000..2a9031b2fe24c1b138490673a5943c6e6b314bb5
--- /dev/null
+++ b/sim/include/environmentInterface.h
@@ -0,0 +1,30 @@
+/********************************************************************************
+ * Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+#pragma once
+
+#include "MantleAPI/Execution/i_environment.h"
+#include "include/entityRepositoryInterface.h"
+#include "include/worldInterface.h"
+
+namespace core {
+class EnvironmentInterface : public mantle_api::IEnvironment
+{
+public:
+    virtual EntityRepositoryInterface& GetEntityRepository() = 0;
+
+    // virtual ControllerRepository& GetControllerRepository() = 0;
+
+    virtual void Step(const mantle_api::Time &simulationTime) = 0;
+
+    virtual void SetWorld(WorldInterface* world) = 0;
+
+    virtual void Reset() = 0;   
+};
+}
\ No newline at end of file
diff --git a/sim/include/eventDetectorNetworkInterface.h b/sim/include/eventDetectorNetworkInterface.h
index f6a5fbb36574c9b0d7b9246a0a6f81f07b99e49b..5fba31177c8f5e60c77d996bb25c66419cbebd8d 100644
--- a/sim/include/eventDetectorNetworkInterface.h
+++ b/sim/include/eventDetectorNetworkInterface.h
@@ -11,7 +11,6 @@
 #pragma once
 
 #include "include/eventNetworkInterface.h"
-#include "include/scenarioInterface.h"
 #include "include/stochasticsInterface.h"
 
 namespace core
@@ -26,8 +25,7 @@ public:
     EventDetectorNetworkInterface() = default;
     ~EventDetectorNetworkInterface() = default;
 
-    virtual bool Instantiate(const std::string libraryPath,
-                     const ScenarioInterface *scenario,
+    virtual bool Instantiate(const std::string& libraryPath,
                      EventNetworkInterface* eventNetwork,
                      StochasticsInterface *stochastics) = 0;
 
diff --git a/sim/include/frameworkModuleContainerInterface.h b/sim/include/frameworkModuleContainerInterface.h
index ad66e307713650a67ec06b372660c8497b49f288..2221b246aa6e883ef7affb4c5107f41541d42e92 100644
--- a/sim/include/frameworkModuleContainerInterface.h
+++ b/sim/include/frameworkModuleContainerInterface.h
@@ -13,7 +13,6 @@
 // TODO rb: replace by forward declarations
 #include "include/stochasticsInterface.h"
 
-class AgentBlueprintProviderInterface;
 class DataBufferInterface;
 class WorldInterface;
 
@@ -31,13 +30,6 @@ class FrameworkModuleContainerInterface
 public:
     virtual ~FrameworkModuleContainerInterface() = default;
 
-    /*!
-    * \brief Returns a pointer to the agentBlueprintProvider
-    *
-    * @return        agentBlueprintProvider pointer
-    */
-    virtual const AgentBlueprintProviderInterface* GetAgentBlueprintProvider() const = 0;
-
     /*!
     * \brief Returns a pointer to the AgentFactory
     *
diff --git a/sim/include/manipulatorNetworkInterface.h b/sim/include/manipulatorNetworkInterface.h
index 333136950a07b806d9a1acca5ddbb0dd1c88c874..3cc912cb1c23b0eb5104b11062083a9fb03c0e17 100644
--- a/sim/include/manipulatorNetworkInterface.h
+++ b/sim/include/manipulatorNetworkInterface.h
@@ -13,8 +13,6 @@
 #include <string>
 #include <vector>
 
-class ScenarioInterface;
-
 namespace core {
 
 class EventNetworkInterface;
@@ -24,19 +22,18 @@ class ManipulatorNetworkInterface
 {
 public:
     ManipulatorNetworkInterface() = default;
-    ManipulatorNetworkInterface(const ManipulatorNetworkInterface&) = delete;
-    ManipulatorNetworkInterface(ManipulatorNetworkInterface&&) = delete;
-    ManipulatorNetworkInterface& operator=(const ManipulatorNetworkInterface&) = delete;
-    ManipulatorNetworkInterface& operator=(ManipulatorNetworkInterface&&) = delete;
+    ManipulatorNetworkInterface(const ManipulatorNetworkInterface &) = delete;
+    ManipulatorNetworkInterface(ManipulatorNetworkInterface &&) = delete;
+    ManipulatorNetworkInterface &operator=(const ManipulatorNetworkInterface &) = delete;
+    ManipulatorNetworkInterface &operator=(ManipulatorNetworkInterface &&) = delete;
     virtual ~ManipulatorNetworkInterface() = default;
 
-    virtual bool Instantiate(const std::string libraryPath,
-                             const ScenarioInterface *scenario,
-                             EventNetworkInterface* eventNetwork) = 0;
+    virtual bool Instantiate(const std::string& libraryPath,
+                             EventNetworkInterface *eventNetwork) = 0;
 
     virtual void Clear() = 0;
 
     virtual const std::vector<const Manipulator*> GetManipulators() const = 0;
 };
 
-}// namespace core
+} // namespace core
diff --git a/sim/include/modelInterface.h b/sim/include/modelInterface.h
index 4783dd0bcad073654ebe0ad23d42fe24ee20996c..eb8d7acf402099d2efc2debdb840eb10abbc0b99 100644
--- a/sim/include/modelInterface.h
+++ b/sim/include/modelInterface.h
@@ -29,6 +29,7 @@
 #include "include/observationInterface.h"
 #include "include/publisherInterface.h"
 #include "include/signalInterface.h"
+#include "include/controlStrategiesInterface.h"
 
 class ParameterInterface;
 class StochasticsInterface;
@@ -532,7 +533,7 @@ private:
     const CallbackInterface *callbacks;   //!< Reference to framework callbacks
 };
 
-class UnrestrictedEventModelInterface : public UnrestrictedModelInterface
+class UnrestrictedControllStrategyModelInterface : public UnrestrictedModelInterface
 {
 public:
     //-----------------------------------------------------------------------------
@@ -544,10 +545,9 @@ public:
     //! @param[in]     offsetTime     Corresponds to "offsetTime" of "Component"
     //! @param[in]     responseTime   Corresponds to "responseTime" of "Component"
     //! @param[in]     cycleTime      Corresponds to "cycleTime" of "Component"
-    //! @param[in]     eventNetwork   Pointer to event network
-    //! @param[in]     callbacks      Pointer to the callbacks
+    //! @param[in]     controlStrategies  controlStrategies of entity
     //-----------------------------------------------------------------------------
-    UnrestrictedEventModelInterface(std::string componentName,
+    UnrestrictedControllStrategyModelInterface(std::string componentName,
                                     bool isInit,
                                     int priority,
                                     int offsetTime,
@@ -559,7 +559,7 @@ public:
                                     PublisherInterface * const publisher,
                                     const CallbackInterface *callbacks,
                                     AgentInterface *agent,
-                                    core::EventNetworkInterface * const eventNetwork):
+                                    std::shared_ptr<ControlStrategiesInterface> const controlStrategies):
         UnrestrictedModelInterface(componentName,
                                    isInit,
                                    priority,
@@ -572,25 +572,25 @@ public:
                                    publisher,
                                    callbacks,
                                    agent),
-        eventNetwork(eventNetwork)
+        controlStrategies(controlStrategies)
     {}
-    UnrestrictedEventModelInterface(const UnrestrictedEventModelInterface&) = delete;
-    UnrestrictedEventModelInterface(UnrestrictedEventModelInterface&&) = delete;
-    UnrestrictedEventModelInterface& operator=(const UnrestrictedEventModelInterface&) = delete;
-    UnrestrictedEventModelInterface& operator=(UnrestrictedEventModelInterface&&) = delete;
-    virtual ~UnrestrictedEventModelInterface() = default;
+    UnrestrictedControllStrategyModelInterface(const UnrestrictedControllStrategyModelInterface&) = delete;
+    UnrestrictedControllStrategyModelInterface(UnrestrictedControllStrategyModelInterface&&) = delete;
+    UnrestrictedControllStrategyModelInterface& operator=(const UnrestrictedControllStrategyModelInterface&) = delete;
+    UnrestrictedControllStrategyModelInterface& operator=(UnrestrictedControllStrategyModelInterface&&) = delete;
+    virtual ~UnrestrictedControllStrategyModelInterface() = default;
 
 protected:
     //-----------------------------------------------------------------------------
-    //! Retrieves the EventNetwork
+    //! Retrieves the controll strategies
     //!
-    //! @return                       EventNetwork
+    //! @return  controll strategies
     //-----------------------------------------------------------------------------
-    core::EventNetworkInterface* GetEventNetwork() const
+    std::shared_ptr<ControlStrategiesInterface> GetControlStrategies() const
     {
-        return eventNetwork;
+        return controlStrategies;
     }
 
 private:
-    core::EventNetworkInterface * const eventNetwork;
+    std::shared_ptr<ControlStrategiesInterface> const controlStrategies {};
 };
diff --git a/sim/include/profilesInterface.h b/sim/include/profilesInterface.h
index c5620ca55d68a69175c1faee6ced7495bcaaa829..1ff5b0b276eac4ba780688aa4f8b6cfa071a8766 100644
--- a/sim/include/profilesInterface.h
+++ b/sim/include/profilesInterface.h
@@ -30,35 +30,35 @@ enum class AgentProfileType
 struct AgentProfile
 {
     //Dynamic profile
-    StringProbabilities driverProfiles {};
-    StringProbabilities vehicleProfiles {};
+    StringProbabilities driverProfiles{};
+    StringProbabilities systemProfiles{};
+    StringProbabilities vehicleModels{};
 
     //Static profile
     std::string systemConfigFile;
-    int systemId;
     std::string vehicleModel;
+    int systemId;
 
     AgentProfileType type;
 };
 
 struct SensorLink
 {
-    int sensorId {};
-    std::string inputId {};
+    int sensorId{};
+    std::string inputId{};
 };
 
 struct VehicleComponent
 {
-    std::string type {};
-    StringProbabilities componentProfiles {};
-    std::vector<SensorLink> sensorLinks {};
+    std::string type{};
+    StringProbabilities componentProfiles{};
+    std::vector<SensorLink> sensorLinks{};
 };
 
-struct VehicleProfile
+struct SystemProfile
 {
-    std::string vehicleModel {};
-    std::vector<VehicleComponent> vehicleComponents {};
-    openpass::sensors::Parameters sensors {};
+    std::vector<VehicleComponent> vehicleComponents{};
+    openpass::sensors::Parameters sensors{};
 };
 
 //-----------------------------------------------------------------------------
@@ -88,17 +88,17 @@ public:
     /*!
     * \brief Returns a pointer to the map of vehicle profiles
     *
-    * @return        vehicleProfiles
+    * @return        systemProfiles
     */
-    virtual const std::unordered_map<std::string, VehicleProfile>& GetVehicleProfiles() const = 0;
+    virtual const std::unordered_map<std::string, SystemProfile> &GetSystemProfiles() const = 0;
 
     /*!
-    * \brief Add vehicleProfile with the specified profileName to the map of vehicle profiles
+    * \brief Add systemProfile with the specified profileName to the map of system profiles
     *
-    * @param[in]     profileName        name of the vehicleProfile
-    * @param[in]     vehicleProfile     vehicleProfile which shall be added
+    * @param[in]     profileName        name of the systemProfile
+    * @param[in]     systemProfile      systemProfile which shall be added
     */
-    virtual void AddVehicleProfile(const std::string& profileName, const VehicleProfile& vehicleProfile) = 0;
+    virtual void AddSystemProfile(const std::string& profileName, const SystemProfile& systemProfile) = 0;
 
     /*!
     * \brief Returns a pointer to the map of profile groups
@@ -126,12 +126,20 @@ public:
     virtual const StringProbabilities& GetDriverProbabilities(std::string agentProfileName) const = 0;
 
     /*!
-    * \brief Returns the vehicle profile probabilities of an agentProfile
+    * \brief Returns the system profile probabilities of an agentProfile
     *
     * @param[in]    agentProfileName        Name of the agentProfile from which the probabilities are requested
     * @return       probality map for vehicle profiles
     */
-    virtual const StringProbabilities& GetVehicleProfileProbabilities(std::string agentProfileName) const = 0;
+    virtual const StringProbabilities &GetSystemProfileProbabilities(std::string agentProfileName) const = 0;
+
+    /*!
+    * \brief Returns the vehicle model probabilities of an agentProfile
+    *
+    * @param[in]    agentProfileName        Name of the agentProfile from which the probabilities are requested
+    * @return       probality map for vehicle models
+    */
+    virtual const StringProbabilities &GetVehicleModelsProbabilities(std::string agentProfileName) const = 0;
 
     //! \brief Returns the profile with the specified name in the specified profile gropus
     //!
diff --git a/sim/include/radioInterface.h b/sim/include/radioInterface.h
index e2ebec14230b78ce2324232065f663d3721c40d3..ec641ed53f064d608370255ae90dd44ddc99eaa6 100644
--- a/sim/include/radioInterface.h
+++ b/sim/include/radioInterface.h
@@ -20,6 +20,11 @@
 #include <vector>
 #include "common/DetectedObject.h"
 
+namespace units
+{
+    using sensitivity = unit_t<compound_unit<power::watt, inverse<area::square_meter>>>;
+}
+
 class RadioInterface
 {
 public:
@@ -36,7 +41,7 @@ public:
     //! @param[in] positionY    y-position of the sender
     //! @param[in] signalStrength   signal strength of the antenna
     //! @param[in] objectInformation    information to broadcast
-    virtual void Send(double positionX, double postionY, double signalStrength, DetectedObject objectInformation) = 0;
+    virtual void Send(units::length::meter_t positionX, units::length::meter_t postionY, units::power::watt_t signalStrength, DetectedObject objectInformation) = 0;
 
     //! Call the cloud to return all the information available at a position
     //!
@@ -44,7 +49,7 @@ public:
     //! @param[in] positionY    y-position of the receiver
     //! @param[in] sensitivity  how strong the signal needs to be for the receiver to read the signal
     //! @return     list of all the information which can be received at this position
-    virtual std::vector<DetectedObject> Receive(double positionX, double positionY, double sensitivity) = 0;
+    virtual std::vector<DetectedObject> Receive(units::length::meter_t positionX, units::length::meter_t positionY, units::sensitivity sensitivity) = 0;
 
     //! For each new timestep this function clears all signal of the previous timestep
     virtual void Reset() = 0;
diff --git a/sim/include/roadInterface/roadElementTypes.h b/sim/include/roadInterface/roadElementTypes.h
index ebf4979fe70231b0113c692f9ce108f7883e044a..e934e8a80117c53c359ae285668923896c6bb12b 100644
--- a/sim/include/roadInterface/roadElementTypes.h
+++ b/sim/include/roadInterface/roadElementTypes.h
@@ -22,6 +22,10 @@
 #include <vector>
 #include <array>
 
+#include<units.h>
+
+using namespace units::literals;
+
 //-----------------------------------------------------------------------------
 //! Road link connection orientation
 //-----------------------------------------------------------------------------
@@ -249,25 +253,25 @@ struct RoadElementValidity
 ///
 struct RoadSignalSpecification
 {
-    double s{0};
-    double t{0};
+    units::length::meter_t s{0};
+    units::length::meter_t t{0};
     std::string id{};
     std::string name{};
     std::string dynamic{};
     std::string orientation{};
-    double zOffset{0};
+    units::length::meter_t zOffset{0};
     std::string country{};
     std::string type{};
     std::string subtype{};
     double value{0};
     RoadSignalUnit unit{};
-    double height{0};
-    double width{0};
+    units::length::meter_t height{0};
+    units::length::meter_t width{0};
     std::string text{};
-    double hOffset{0};
-    double pitch{0};
-    double roll{0};
-    double yaw{0};
+    units::angle::radian_t hOffset{0};
+    units::angle::radian_t pitch{0};
+    units::angle::radian_t roll{0};
+    units::angle::radian_t yaw{0};
 
     RoadElementValidity validity;
     std::vector<std::string> dependencyIds {};
@@ -353,51 +357,51 @@ struct RoadObjectSpecification // http://www.opendrive.org/docs/OpenDRIVEFormatS
     RoadObjectType type{RoadObjectType::none};
     std::string name {""};
     std::string id {""};
-    double s {0};
-    double t {0};
-    double zOffset {0};
-    double validLength {0};
+    units::length::meter_t s {0};
+    units::length::meter_t t {0};
+    units::length::meter_t zOffset {0};
+    units::length::meter_t validLength {0};
     RoadElementOrientation orientation{RoadElementOrientation::positive};
-    double width {0};
-    double length {0};
-    double radius {0};
-    double height {0};
-    double hdg {0};
-    double pitch {0};
-    double roll {0};
+    units::length::meter_t width {0};
+    units::length::meter_t length {0};
+    units::length::meter_t radius {0};
+    units::length::meter_t height {0};
+    units::angle::radian_t hdg {0};
+    units::angle::radian_t pitch {0};
+    units::angle::radian_t roll {0};
     bool continuous {false};
 
     RoadElementValidity validity;
 
     bool checkStandardCompliance()
     {
-        return s >= 0 &&
-               validLength >= 0 &&
-               length >= 0 &&
-               width >= 0 &&
-               radius >= 0;
+        return s >= 0_m &&
+               validLength >= 0_m &&
+               length >= 0_m &&
+               width >= 0_m &&
+               radius >= 0_m;
     }
 
     bool checkSimulatorCompliance()
     {
-        return length > 0 && // force physical dimensions
-               width > 0 &&  // force physical dimensions
-               radius == 0;  // do not support radius
+        return length > 0_m && // force physical dimensions
+               width > 0_m &&  // force physical dimensions
+               radius == 0_m;  // do not support radius
     }
 };
 
 struct OptionalInterval
 {
     bool isSet = {false};
-    double start;
-    double end;
+    units::length::meter_t start;
+    units::length::meter_t end;
 };
 
 struct ObjectRepeat
 {
-    double s;
-    double length;
-    double distance;
+    units::length::meter_t s;
+    units::length::meter_t length;
+    units::length::meter_t distance;
     OptionalInterval t;
     OptionalInterval width;
     OptionalInterval height;
@@ -405,9 +409,9 @@ struct ObjectRepeat
 
     bool checkLimits()
     {
-        return s >= 0 &&
-               length >= 0 &&
-               distance >= 0;
+        return s >= 0_m &&
+               length >= 0_m &&
+               distance >= 0_m;
     }
 };
 
@@ -426,7 +430,7 @@ enum class RoadTypeInformation // http://www.opendrive.org/docs/OpenDRIVEFormatS
 
 struct RoadTypeSpecification
 {
-    double s{0};
+    units::length::meter_t s{0};
     RoadTypeInformation roadType;
 };
 
diff --git a/sim/include/roadInterface/roadElevation.h b/sim/include/roadInterface/roadElevation.h
index abc18d16fbe4c50c573f5aca5b62a9bfb19217a6..d61b41597531949fd27e6324c101cbe1bbb5f860 100644
--- a/sim/include/roadInterface/roadElevation.h
+++ b/sim/include/roadInterface/roadElevation.h
@@ -22,11 +22,11 @@
 class RoadElevation
 {
 public:
-    RoadElevation(double s,
-                  double a,
+    RoadElevation(units::length::meter_t s,
+                  units::length::meter_t a,
                   double b,
-                  double c,
-                  double d) :
+                  units::unit_t<units::inverse<units::length::meter>> c,
+                  units::unit_t<units::inverse<units::squared<units::length::meter>>> d) :
         s(s),
         a(a),
         b(b),
@@ -44,7 +44,7 @@ public:
     //!
     //! @return                         start position of the elevation
     //-----------------------------------------------------------------------------
-    double GetS() const
+    units::length::meter_t GetS() const
     {
         return s;
     }
@@ -54,7 +54,7 @@ public:
     //!
     //! @return                         constant factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetA() const
+    units::length::meter_t GetA() const
     {
         return a;
     }
@@ -74,7 +74,7 @@ public:
     //!
     //! @return                         quadratic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetC() const
+    units::unit_t<units::inverse<units::length::meter>> GetC() const
     {
         return c;
     }
@@ -84,17 +84,17 @@ public:
     //!
     //! @return                         cubic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetD() const
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> GetD() const
     {
         return d;
     }
 
 private:
-    double s;
-    double a;
+    units::length::meter_t s;
+    units::length::meter_t a;
     double b;
-    double c;
-    double d;
+    units::unit_t<units::inverse<units::length::meter>> c;
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> d;
 };
 
 #endif // ROADELEVATION
diff --git a/sim/include/roadInterface/roadGeometryInterface.h b/sim/include/roadInterface/roadGeometryInterface.h
index c66c7de207582d857c6614e11a037ede0c0d21b7..5a04afdfaaaa4f362883f4435339209009a255c4 100644
--- a/sim/include/roadInterface/roadGeometryInterface.h
+++ b/sim/include/roadInterface/roadGeometryInterface.h
@@ -42,7 +42,7 @@ public:
     //! @param[in]  tOffset    offset to the left
     //! @return                coordinates with the x/y coordinates
     //-----------------------------------------------------------------------------
-    virtual Common::Vector2d GetCoord(double geometryOffset, double laneOffset) const = 0;
+    virtual Common::Vector2d<units::length::meter_t> GetCoord(units::length::meter_t geometryOffset, units::length::meter_t laneOffset) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Calculates the heading.
@@ -50,26 +50,26 @@ public:
     //! @param[in]  sOffset    s offset within geometry section
     //! @return                heading
     //-----------------------------------------------------------------------------
-    virtual double GetDir(double geometryOffset) const = 0;
+    virtual units::angle::radian_t GetDir(units::length::meter_t geometryOffset) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves the offset within the OpenDrive road.
     //!
     //! @return                         offset
     //-----------------------------------------------------------------------------
-    virtual double GetS() const = 0;
+    virtual units::length::meter_t GetS() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves the initial direction of the geometry section
     //!
     //! @return                         initial direction of geometry
     //-----------------------------------------------------------------------------
-    virtual double GetHdg() const = 0;
+    virtual units::angle::radian_t GetHdg() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves the length of the geometry section
     //!
     //! @return                         length of geometry section
     //-----------------------------------------------------------------------------
-    virtual double GetLength() const = 0;
+    virtual units::length::meter_t GetLength() const = 0;
 };
diff --git a/sim/include/roadInterface/roadInterface.h b/sim/include/roadInterface/roadInterface.h
index 04f89b51cb4579445c88d8ca9818bdd2e973af6b..ae2b8112a7d272c2d5e8cff312709febe76483bf 100644
--- a/sim/include/roadInterface/roadInterface.h
+++ b/sim/include/roadInterface/roadInterface.h
@@ -32,6 +32,7 @@
 #include "roadLaneOffset.h"
 #include "roadGeometryInterface.h"
 #include "roadLinkInterface.h"
+#include "common/globalDefinitions.h"
 
 //-----------------------------------------------------------------------------
 //! Struct containing values for parametric cubic polynomial geometry
@@ -45,14 +46,14 @@
 //! @param[in]  dV                   cubic factor of the polynomial for v
 //-----------------------------------------------------------------------------
 struct ParamPoly3Parameters{
-    double aU;
-    double bU;
-    double cU;
-    double dU;
-    double aV;
-    double bV;
-    double cV;
-    double dV;
+    units::length::meter_t aU;
+    units::dimensionless::scalar_t bU;
+    units::curvature::inverse_meter_t cU;
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> dU;
+    units::length::meter_t aV;
+    units::dimensionless::scalar_t bV;
+    units::curvature::inverse_meter_t cV;
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> dV;
 };
 
 //-----------------------------------------------------------------------------
@@ -79,11 +80,11 @@ public:
     //! @param[in]  length              length of the element's reference line
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddGeometryLine(double s,
-                         double x,
-                         double y,
-                         double hdg,
-                         double length) = 0;
+    virtual bool AddGeometryLine(units::length::meter_t s,
+                         units::length::meter_t x,
+                         units::length::meter_t y,
+                         units::angle::radian_t hdg,
+                         units::length::meter_t length) = 0;
 
     //-----------------------------------------------------------------------------
     //! Adds an arc geometry to a road by creating a new RoadGeometryArc object and
@@ -97,12 +98,12 @@ public:
     //! @param[in]  curvature           constant curvature throughout the element
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddGeometryArc(double s,
-                        double x,
-                        double y,
-                        double hdg,
-                        double length,
-                        double curvature) = 0;
+    virtual bool AddGeometryArc(units::length::meter_t s,
+                        units::length::meter_t x,
+                        units::length::meter_t y,
+                        units::angle::radian_t hdg,
+                        units::length::meter_t length,
+                        units::curvature::inverse_meter_t curvature) = 0;
 
     //-----------------------------------------------------------------------------
     //! Adds a spiral geometry to a road by creating a new RoadGeometrySpiral object and
@@ -117,13 +118,13 @@ public:
     //! @param[in]  curvEnd             curvature at the end of the element
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddGeometrySpiral(double s,
-                           double x,
-                           double y,
-                           double hdg,
-                           double length,
-                           double curvStart,
-                           double curvEnd) = 0;
+    virtual bool AddGeometrySpiral(units::length::meter_t s,
+                           units::length::meter_t x,
+                           units::length::meter_t y,
+                           units::angle::radian_t hdg,
+                           units::length::meter_t length,
+                           units::curvature::inverse_meter_t curvStart,
+                           units::curvature::inverse_meter_t curvEnd) = 0;
 
     //-----------------------------------------------------------------------------
     //! Adds a cubic polynomial geometry to a road by creating a new RoadGeometryPoly3
@@ -140,15 +141,15 @@ public:
     //! @param[in]  d                   cubic factor of the polynomial
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddGeometryPoly3(double s,
-                          double x,
-                          double y,
-                          double hdg,
-                          double length,
-                          double a,
+    virtual bool AddGeometryPoly3(units::length::meter_t s,
+                          units::length::meter_t x,
+                          units::length::meter_t y,
+                          units::angle::radian_t hdg,
+                          units::length::meter_t length,
+                          units::length::meter_t a,
                           double b,
-                          double c,
-                          double d) = 0;
+                          units::unit_t<units::inverse<units::length::meter>> c,
+                          units::unit_t<units::inverse<units::squared<units::length::meter>>> d) = 0;
     //-----------------------------------------------------------------------------
     //! Adds a parametric cubic polynomial geometry to a road by creating a new
     //! RoadGeometryparamPoly3 object and adding it to the stored list of geometries.
@@ -162,11 +163,11 @@ public:
     //! @param[in]  parameters          Factors for the polynomials describing the road
     //! @return                          false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddGeometryParamPoly3(double s,
-                          double x,
-                          double y,
-                          double hdg,
-                          double length,
+    virtual bool AddGeometryParamPoly3(units::length::meter_t s,
+                          units::length::meter_t x,
+                          units::length::meter_t y,
+                          units::angle::radian_t hdg,
+                          units::length::meter_t length,
                           ParamPoly3Parameters parameters) = 0;
 
     //-----------------------------------------------------------------------------
@@ -180,11 +181,11 @@ public:
     //! @param[in]  d                   cubic factor of the polynomial
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddElevation(double s,
-                      double a,
+    virtual bool AddElevation(units::length::meter_t s,
+                      units::length::meter_t a,
                       double b,
-                      double c,
-                      double d) = 0;
+                      units::unit_t<units::inverse<units::length::meter>> c,
+                      units::unit_t<units::inverse<units::squared<units::length::meter>>> d) = 0;
 
     //-----------------------------------------------------------------------------
     //! Adds a lane offset defined via a cubic polynomial to a road by creating a new
@@ -197,11 +198,11 @@ public:
     //! @param[in]  d                   cubic factor of the polynomial
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddLaneOffset(double s,
-                       double a,
+    virtual bool AddLaneOffset(units::length::meter_t s,
+                       units::length::meter_t a,
                        double b,
-                       double c,
-                       double d) = 0;
+                       units::unit_t<units::inverse<units::length::meter>> c,
+                       units::unit_t<units::inverse<units::squared<units::length::meter>>> d) = 0;
 
     //-----------------------------------------------------------------------------
     //! Adds a new link to a road by creating a new RoadLink object and adding it
@@ -225,7 +226,7 @@ public:
     //! @param[in]  start               start position s-coordinate
     //! @return                         created road lane section
     //-----------------------------------------------------------------------------
-    virtual RoadLaneSectionInterface *AddRoadLaneSection(double start) = 0;
+    virtual RoadLaneSectionInterface *AddRoadLaneSection(units::length::meter_t start) = 0;
 
     //-----------------------------------------------------------------------------
     //! Adds a new lane section to a road by creating a new RoadLaneSection object
@@ -306,7 +307,7 @@ public:
 
     virtual void AddRoadType(const RoadTypeSpecification &info) = 0;
 
-    virtual RoadTypeInformation GetRoadType(double start) const = 0;
+    virtual RoadTypeInformation GetRoadType(units::length::meter_t start) const = 0;
 
     virtual void SetJunctionId(const std::string& junctionId) = 0;
 
diff --git a/sim/include/roadInterface/roadLaneInterface.h b/sim/include/roadInterface/roadLaneInterface.h
index 8ffb366105f323d4b94c42230b20fcd34d7f3865..7f318345f20cc83600936a0b38fba83e229c99a8 100644
--- a/sim/include/roadInterface/roadLaneInterface.h
+++ b/sim/include/roadInterface/roadLaneInterface.h
@@ -50,11 +50,11 @@ public:
     //!
     //! @return                         False if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddWidth(double sOffset,
-                  double a,
+    virtual bool AddWidth(units::length::meter_t sOffset,
+                  units::length::meter_t a,
                   double b,
-                  double c,
-                  double d) = 0;
+                  units::unit_t<units::inverse<units::length::meter>> c,
+                  units::unit_t<units::inverse<units::squared<units::length::meter>>> d) = 0;
 
     //-----------------------------------------------------------------------------
     //! Adds a new polynomial calculating the border of a lane to a road lane.
@@ -67,11 +67,11 @@ public:
     //!
     //! @return                         False if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddBorder(double sOffset,
-                  double a,
+    virtual bool AddBorder(units::length::meter_t sOffset,
+                  units::length::meter_t a,
                   double b,
-                  double c,
-                  double d) = 0;
+                  units::unit_t<units::inverse<units::length::meter>> c,
+                  units::unit_t<units::inverse<units::squared<units::length::meter>>> d) = 0;
 
     //-----------------------------------------------------------------------------
     //! Adds a new roadmark to a road lane.
@@ -84,7 +84,7 @@ public:
     //!
     //! @return                         False if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    virtual bool AddRoadMark(double sOffset,
+    virtual bool AddRoadMark(units::length::meter_t sOffset,
                              RoadLaneRoadDescriptionType descType,
                              RoadLaneRoadMarkType roadMark,
                              RoadLaneRoadMarkColor color,
diff --git a/sim/include/roadInterface/roadLaneOffset.h b/sim/include/roadInterface/roadLaneOffset.h
index a5df5456a3456d4da81168eeea0d09dd8d1e9d36..ac2dfb3e7d963f67155a22e9834de19231e119df 100644
--- a/sim/include/roadInterface/roadLaneOffset.h
+++ b/sim/include/roadInterface/roadLaneOffset.h
@@ -24,11 +24,11 @@
 class RoadLaneOffset
 {
 public:
-    RoadLaneOffset(double s,
-                   double a,
+    RoadLaneOffset(units::length::meter_t s,
+                   units::length::meter_t a,
                    double b,
-                   double c,
-                   double d) :
+                   units::unit_t<units::inverse<units::length::meter>> c,
+                   units::unit_t<units::inverse<units::squared<units::length::meter>>> d) :
         s(s),
         a(a),
         b(b),
@@ -46,7 +46,7 @@ public:
     //!
     //! @return                         start position of the offset
     //-----------------------------------------------------------------------------
-    double GetS() const
+    units::length::meter_t GetS() const
     {
         return s;
     }
@@ -56,7 +56,7 @@ public:
     //!
     //! @return                         constant factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetA() const
+    units::length::meter_t GetA() const
     {
         return a;
     }
@@ -76,7 +76,7 @@ public:
     //!
     //! @return                         quadratic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetC() const
+    units::unit_t<units::inverse<units::length::meter>> GetC() const
     {
         return c;
     }
@@ -86,17 +86,17 @@ public:
     //!
     //! @return                         cubic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetD() const
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> GetD() const
     {
         return d;
     }
 
 private:
-    double s;
-    double a;
+    units::length::meter_t s;
+    units::length::meter_t a;
     double b;
-    double c;
-    double d;
+    units::unit_t<units::inverse<units::length::meter>> c;
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> d;
 };
 
 #endif // ROADLANEOFFSET
diff --git a/sim/include/roadInterface/roadLaneRoadMark.h b/sim/include/roadInterface/roadLaneRoadMark.h
index 6cfa8e3999b21de21688cc7c26c88d5b703d9397..9a9b29c690ba44b1d3649b8bac7881d71cafdca9 100644
--- a/sim/include/roadInterface/roadLaneRoadMark.h
+++ b/sim/include/roadInterface/roadLaneRoadMark.h
@@ -19,7 +19,7 @@ enum class RoadLaneRoadMarkWeight;
 class RoadLaneRoadMark
 {
 public:
-    RoadLaneRoadMark(double sOffset,
+    RoadLaneRoadMark(units::length::meter_t sOffset,
                      RoadLaneRoadDescriptionType descriptionType,
                      RoadLaneRoadMarkType type,
                      RoadLaneRoadMarkColor color,
@@ -39,12 +39,12 @@ public:
         return type;
     }
 
-    double GetSOffset() const
+    units::length::meter_t GetSOffset() const
     {
         return sOffset;
     }
 
-    double GetSEnd() const
+    units::length::meter_t GetSEnd() const
     {
         return  sEnd;
     }
@@ -69,7 +69,7 @@ public:
         return descriptionType;
     }
 
-    void LimitSEnd (double limit)
+    void LimitSEnd (units::length::meter_t limit)
     {
         sEnd = std::min(sEnd, limit);
     }
@@ -77,8 +77,8 @@ public:
 
 private:
 
-double sOffset;
-double sEnd = std::numeric_limits<double>::max();
+units::length::meter_t sOffset;
+units::length::meter_t sEnd{std::numeric_limits<double>::max()};
 RoadLaneRoadMarkType type;
 RoadLaneRoadMarkColor color;
 RoadLaneRoadMarkLaneChange laneChange;
diff --git a/sim/include/roadInterface/roadLaneSectionInterface.h b/sim/include/roadInterface/roadLaneSectionInterface.h
index 9f201abaf19142778bbbd9dba2956dd87a8d126d..51c7cbf640c18f13f792176be796e215887ebe00 100644
--- a/sim/include/roadInterface/roadLaneSectionInterface.h
+++ b/sim/include/roadInterface/roadLaneSectionInterface.h
@@ -60,7 +60,7 @@ public:
     //!
     //! @return                         Starting offset of the road lane section
     //-----------------------------------------------------------------------------
-    virtual double GetStart() const = 0;
+    virtual units::length::meter_t GetStart() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the flag, if the lane section is in the reference direction or not.
diff --git a/sim/include/roadInterface/roadLaneWidth.h b/sim/include/roadInterface/roadLaneWidth.h
index 42066ded089259eafafad02625a3023694302a20..fd3364eda4ee336d49659a4dfeb3b6e617a9d091 100644
--- a/sim/include/roadInterface/roadLaneWidth.h
+++ b/sim/include/roadInterface/roadLaneWidth.h
@@ -25,11 +25,11 @@
 class RoadLaneWidth
 {
 public:
-    RoadLaneWidth(double sOffset,
-                  double a,
+    RoadLaneWidth(units::length::meter_t sOffset,
+                  units::length::meter_t a,
                   double b,
-                  double c,
-                  double d) :
+                  units::unit_t<units::inverse<units::length::meter>> c,
+                  units::unit_t<units::inverse<units::squared<units::length::meter>>> d) :
         sOffset(sOffset),
         a(a),
         b(b),
@@ -48,7 +48,7 @@ public:
     //!
     //! @return                         Offset relative to the preceding lane section
     //-----------------------------------------------------------------------------
-    double GetSOffset() const
+    units::length::meter_t GetSOffset() const
     {
         return sOffset;
     }
@@ -58,7 +58,7 @@ public:
     //!
     //! @return                         Constant factor from the polynomial
     //-----------------------------------------------------------------------------
-    double GetA() const
+    units::length::meter_t GetA() const
     {
         return a;
     }
@@ -78,7 +78,7 @@ public:
     //!
     //! @return                         Quadratic factor from the polynomial
     //-----------------------------------------------------------------------------
-    double GetC() const
+    units::unit_t<units::inverse<units::length::meter>> GetC() const
     {
         return c;
     }
@@ -88,17 +88,17 @@ public:
     //!
     //! @return                         Cubic factor from the polynomial
     //-----------------------------------------------------------------------------
-    double GetD() const
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> GetD() const
     {
         return d;
     }
 
 private:
-    double sOffset;
-    double a;
+    units::length::meter_t sOffset;
+    units::length::meter_t a;
     double b;
-    double c;
-    double d;
+    units::unit_t<units::inverse<units::length::meter>> c;
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> d;
 };
 
 #endif // ROADLANEWIDTH
diff --git a/sim/include/roadInterface/roadObjectInterface.h b/sim/include/roadInterface/roadObjectInterface.h
index ff792997775e48d15aa3bf7275026cb87bb2e419..36c399045324f5a015d346b5f588ae845269aefe 100644
--- a/sim/include/roadInterface/roadObjectInterface.h
+++ b/sim/include/roadInterface/roadObjectInterface.h
@@ -24,16 +24,16 @@ public:
 
     virtual RoadObjectType GetType() const = 0;
     virtual std::string GetId() const = 0;
-    virtual double GetS() const = 0;
-    virtual double GetT() const = 0;
-    virtual double GetZOffset() const = 0;
+    virtual units::length::meter_t GetS() const = 0;
+    virtual units::length::meter_t GetT() const = 0;
+    virtual units::length::meter_t GetZOffset() const = 0;
     virtual bool IsValidForLane(int laneId) const = 0;
-    virtual double GetLength() const = 0;
-    virtual double GetWidth() const = 0;
-    virtual double GetHdg() const = 0;
-    virtual double GetHeight() const = 0;
-    virtual double GetPitch() const = 0;
-    virtual double GetRoll() const = 0;
+    virtual units::length::meter_t GetLength() const = 0;
+    virtual units::length::meter_t GetWidth() const = 0;
+    virtual units::angle::radian_t GetHdg() const = 0;
+    virtual units::length::meter_t GetHeight() const = 0;
+    virtual units::angle::radian_t GetPitch() const = 0;
+    virtual units::angle::radian_t GetRoll() const = 0;
     virtual bool IsContinuous() const = 0;
     virtual std::string GetName() const = 0;
 };
diff --git a/sim/include/roadInterface/roadSignalInterface.h b/sim/include/roadInterface/roadSignalInterface.h
index 10b1c20409ef0f26566a1f5c873da09c67fe6303..665bafcaa6f8ceeb685deed0f1c271356fb196f7 100644
--- a/sim/include/roadInterface/roadSignalInterface.h
+++ b/sim/include/roadInterface/roadSignalInterface.h
@@ -35,14 +35,14 @@ public:
     ///
     /// @return s [m]
     //-----------------------------------------------------------------------------
-    virtual double GetS() const = 0;
+    virtual units::length::meter_t GetS() const = 0;
 
     //-----------------------------------------------------------------------------
     /// @brief Returns the t coordinate of the signal
     ///
     /// @return s [m]
     //-----------------------------------------------------------------------------
-    virtual double GetT() const = 0;
+    virtual units::length::meter_t GetT() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns if the signal is valid for a given lane
@@ -101,30 +101,30 @@ public:
     ///
     /// @return height [m]
     //-----------------------------------------------------------------------------
-    virtual double GetWidth() const = 0;
+    virtual units::length::meter_t GetWidth() const = 0;
 
     //-----------------------------------------------------------------------------
     /// @brief Returns the height of the signal
     ///
     /// @return height [m]
     //-----------------------------------------------------------------------------
-    virtual double GetHeight() const = 0;
+    virtual units::length::meter_t GetHeight() const = 0;
 
     //-----------------------------------------------------------------------------
     /// @brief Returns the pitch of the signal
     ///
     /// @return height [m]
     //-----------------------------------------------------------------------------
-    virtual double GetPitch() const = 0;
+    virtual units::angle::radian_t GetPitch() const = 0;
     //-----------------------------------------------------------------------------
     /// @brief Returns the roll of the signal
     ///
     /// @return height [m]
     //-----------------------------------------------------------------------------
-    virtual double GetRoll() const = 0;
+    virtual units::angle::radian_t GetRoll() const = 0;
 
-    virtual double GetZOffset() const = 0;
+    virtual units::length::meter_t GetZOffset() const = 0;
     virtual bool GetOrientation() const = 0;
-    virtual double GetHOffset() const = 0;
+    virtual units::angle::radian_t GetHOffset() const = 0;
 };
 
diff --git a/sim/include/scenarioInterface.h b/sim/include/scenarioInterface.h
deleted file mode 100644
index 51ae6b546732bd1f9e43c9bbc6de65cf5352fbff..0000000000000000000000000000000000000000
--- a/sim/include/scenarioInterface.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2016-2018 ITK Engineering GmbH
- *               2017-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-//! @file  ScenarioInterface.h
-//! @brief This file contains the interface to translate the scenario between
-//!        framework and world.
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <string>
-#include <vector>
-
-#include "include/sceneryDynamicsInterface.h"
-#include "common/worldDefinitions.h"
-#include "common/eventDetectorDefinitions.h"
-
-/*!
- * \brief Information required for spawning a scenario agent
- */
-struct SpawnInfo
-{
-public:
-    SpawnInfo() {}
-    SpawnInfo(openScenario::Position position,
-              double v,
-              double acceleration):
-        position(position)
-    {
-        this->velocity = v;
-        this->acceleration = acceleration;
-    }
-
-    bool spawning {true}; //!< Spawning flag, spawning agent if true
-
-    openScenario::Position position{}; //!< Initial position
-    std::optional<std::vector<RouteElement>> route {std::nullopt}; //!< Optional predfined route
-
-    double velocity{0.0}; //!< Initial velocity
-    std::optional<openScenario::StochasticAttribute> stochasticVelocity{}; //!< optional stochastic initial velocity
-
-    std::optional<double> acceleration{0.0}; //!< Optional initial acceleration
-    std::optional<openScenario::StochasticAttribute> stochasticAcceleration{}; //!< optional stochastic initial acceleration
-};
-
-/*!
- * \brief References an element inside a catalog
- */
-struct CatalogReference
-{
-    std::string catalogName;    //!< Name of the catalog (currently used as filename reference)
-    std::string entryName;      //!< Name of the element inside the catalog
-};
-
-/*!
- * \brief Represents an entity from the scenario
- */
-struct ScenarioEntity
-{
-    std::string name;                               //! Name of the scenario object
-    CatalogReference catalogReference;              //! Catalog reference information
-    SpawnInfo spawnInfo;                            //! Initial spawn parameter information
-    openScenario::Parameters assignedParameters;    //! Parameters assigned in the Catalog reference
-};
-
-//-----------------------------------------------------------------------------
-//! Class representing a scenario as a list of roads.
-//-----------------------------------------------------------------------------
-class ScenarioInterface
-{
-
-public:
-    ScenarioInterface() = default;
-    ScenarioInterface(const ScenarioInterface&) = delete;
-    ScenarioInterface(ScenarioInterface&&) = delete;
-    ScenarioInterface& operator=(const ScenarioInterface&) = delete;
-    ScenarioInterface& operator=(ScenarioInterface&&) = delete;
-    virtual ~ScenarioInterface() = default;
-
-    //-----------------------------------------------------------------------------
-    //! \brief Retreives the path to the vehicle catalog file
-    //!
-    //! \return     Relative path to the vehicle catalog
-    //-----------------------------------------------------------------------------
-    virtual const std::string& GetVehicleCatalogPath() const = 0;
-
-    //-----------------------------------------------------------------------------
-    //! \brief Sets the path to the vehicle catalog file
-    //!
-    //! \param[in]      catalogPath     Relative path to the vehicle catalog file
-    //-----------------------------------------------------------------------------
-    virtual void SetVehicleCatalogPath(const std::string& catalogPath) = 0;
-
-    //-----------------------------------------------------------------------------
-    //! \brief Retreives the path to the pedestrian catalog file
-    //!
-    //! \return     Relative path to the pedestrian catalog
-    //-----------------------------------------------------------------------------
-    virtual const std::string& GetPedestrianCatalogPath() const = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Sets the path to the pedestrian catalog file
-    //!
-    //! \param[in]      catalogPath     Relative path to the pedestrian catalog file
-    //-----------------------------------------------------------------------------
-    virtual void SetPedestrianCatalogPath(const std::string& catalogPath) = 0;
-
-    //-----------------------------------------------------------------------------
-    //! \brief Retreives the path to the trajectory catalog file
-    //!
-    //! The path can either be absolute or relative to the simulator executable
-    //!
-    //! \return     Path to the trajectory catalog file
-    //-----------------------------------------------------------------------------
-    virtual const std::string& GetTrajectoryCatalogPath() const = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Sets the path to the trajectory catalog file
-    //!
-    //! The path can either be absolute or relative to the simulator executable
-    //!
-    //! \param[in]      catalogPath     Path to the trajectory catalog file
-    //-----------------------------------------------------------------------------
-    virtual void SetTrajectoryCatalogPath(const std::string& catalogPath) = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Retreives the path to the scenery file (OpenDRIVE)
-    //!
-    //! \return     Relative path to the scenery file
-    //-----------------------------------------------------------------------------
-    virtual const std::string& GetSceneryPath() const = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Sets the path to the scenery file (OpenDRIVE)
-    //!
-    //! \param[in]      sceneryPath     Relative path to the scenery file
-    //-----------------------------------------------------------------------------
-    virtual void SetSceneryPath(const std::string& sceneryPath) = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Retreives the dynamic scenery portions
-    //!
-    //! \return     scenery dynamics
-    //-----------------------------------------------------------------------------
-    virtual const SceneryDynamicsInterface& GetSceneryDynamics() const = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Adds one traffic signal controller
-    //----------------------------------------------------------------------------
-    virtual void AddTrafficSignalController (const openScenario::TrafficSignalController& controller) = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Adds one scenario entity to the scenery entities of the scenario.
-    //-----------------------------------------------------------------------------
-    virtual void AddScenarioEntity(const ScenarioEntity& entity) = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Adds groups to the scenario as defined by groupDefinitions - a map of
-    //! group names to a list of group member entity names.
-    //-----------------------------------------------------------------------------
-    virtual void AddScenarioGroupsByEntityNames(const std::map<std::string, std::vector<std::string>> &groupDefinitions) = 0;
-
-    virtual const std::vector<ScenarioEntity>& GetEntities() const = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Returns the ego entity of the scenario.
-    //!
-    //! @return                         ScenarioEntities of vehicles other than ego
-    //-----------------------------------------------------------------------------
-    virtual const std::vector<ScenarioEntity*> &GetScenarioEntities() const = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Returns the entity groups of the scenario.
-    //!
-    //! @return map of group names to vector of ScenarioEntities belonging to the
-    //! 		group
-    //-----------------------------------------------------------------------------
-    virtual const std::map<std::string, std::vector<ScenarioEntity*>> &GetScenarioGroups() const = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Adds a event detector to the event detectors map.
-    //-----------------------------------------------------------------------------
-    virtual void AddConditionalEventDetector(const openScenario::ConditionalEventDetectorInformation &eventDetectorInformation) = 0;
-
-    //-------------------------------------------------------------------------
-    //! \brief AddAction Adds a shared_ptr to an action to the actions map
-    //!
-    //! \param[in] action a shared_ptr to an action
-    //-------------------------------------------------------------------------
-    virtual void AddAction(const openScenario::Action action, const std::string eventName) = 0;
-
-    //-----------------------------------------------------------------------------
-    //! Returns the event detector.
-    //!
-    //! @return                         list of event detector
-    //-----------------------------------------------------------------------------
-    virtual const std::vector<openScenario::ConditionalEventDetectorInformation>& GetEventDetectorInformations() const = 0;
-
-    //-------------------------------------------------------------------------
-    //! \brief GetActions Returns the actions of the scenario
-    //!
-    //! \returns list of actions
-    //-------------------------------------------------------------------------
-    virtual std::vector<openScenario::ManipulatorInformation> GetActions() const = 0;
-
-    //-------------------------------------------------------------------------
-    //! \brief Returns the desired end time of the simulation.
-    //! \returns the desired end time of the simulation.
-    //-------------------------------------------------------------------------
-    virtual int GetEndTime() const = 0;
-
-    //-------------------------------------------------------------------------
-    //! \brief Sets the desired end time of the simulation.
-    //! \param[in] endTime The desired end time of the simulation.
-    //-------------------------------------------------------------------------
-    virtual void SetEndTime(const double endTime) = 0;
-
-    //-------------------------------------------------------------------------
-    //! \brief Sets the environment conditions of the simulation.
-    //! \param[in] endTime The environment conditions of the simulation.
-    //-------------------------------------------------------------------------
-    virtual void SetEnvironment(const openScenario::EnvironmentAction& environment) = 0;
-};
diff --git a/sim/include/sceneryDynamicsInterface.h b/sim/include/sceneryDynamicsInterface.h
deleted file mode 100644
index 302efb7911c9ebbf208ec38c6f43284fdeb8266a..0000000000000000000000000000000000000000
--- a/sim/include/sceneryDynamicsInterface.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-//! @file  sceneryDynamicsInterface.h
-//! @brief This file contains the interface to the dynamic portion of the scenery
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <vector>
-#include "common/openScenarioDefinitions.h"
-
-//-----------------------------------------------------------------------------
-//! Class representing the dynamic portion of the scenery
-//! i.e. states that may change during simulation
-//-----------------------------------------------------------------------------
-class SceneryDynamicsInterface
-{
-public:
-    SceneryDynamicsInterface() = default;
-    virtual ~SceneryDynamicsInterface() = default;
-
-    //! Returns the environment as defined in the scenario file
-    virtual openScenario::EnvironmentAction GetEnvironment() const = 0;
-
-    //! Returns the list of traffic signal controllers as defined in the scenario file
-    virtual std::vector<openScenario::TrafficSignalController> GetTrafficSignalControllers() const = 0;
-};
diff --git a/sim/include/spawnItemParameterInterface.h b/sim/include/spawnItemParameterInterface.h
index 2b08e9feb0fc0e63214e30ee2f1491968468e6e2..077df2570c024e7cacc22e9422f766ce684f08d0 100644
--- a/sim/include/spawnItemParameterInterface.h
+++ b/sim/include/spawnItemParameterInterface.h
@@ -40,28 +40,28 @@ public:
     //!
     //! @param[in]     positionX    X-coordinate
     //-----------------------------------------------------------------------------
-    virtual void SetPositionX(double positionX) = 0;
+    virtual void SetPositionX(units::length::meter_t positionX) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the y-coordinate of the agent to be spawned
     //!
     //! @param[in]     positionY    Y-coordinate
     //-----------------------------------------------------------------------------
-    virtual void SetPositionY(double positionY) = 0;
+    virtual void SetPositionY(units::length::meter_t positionY) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the forward velocity of the agent to be spawned
     //!
     //! @param[in]     velocity    Forward velocity
     //-----------------------------------------------------------------------------
-    virtual void SetVelocity(double velocity) = 0;
+    virtual void SetVelocity(units::velocity::meters_per_second_t velocity) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the forward acceleration of the agent to be spawned
     //!
     //! @param[in]     acceleration    Forward acceleration
     //-----------------------------------------------------------------------------
-    virtual void SetAcceleration(double acceleration) = 0;
+    virtual void SetAcceleration(units::acceleration::meters_per_second_squared_t acceleration) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the gear of the agent to be spawned
@@ -75,7 +75,7 @@ public:
     //!
     //! @param[in]     yawAngle    Agent orientation (0 points to east)
     //-----------------------------------------------------------------------------
-    virtual void SetYaw(double yawAngle) = 0;
+    virtual void SetYaw(units::angle::radian_t yawAngle) = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the next time when the agent will be spawned
@@ -103,11 +103,11 @@ public:
 
     virtual double GetPositionY() const = 0;
 
-    virtual double GetVelocity() const = 0;
+    virtual units::velocity::meters_per_second_t GetVelocity() const = 0;
 
-    virtual double GetAcceleration() const = 0;
+    virtual units::acceleration::meters_per_second_squared_t GetAcceleration() const = 0;
 
-    virtual double GetYaw() const = 0;
+    virtual units::angle::radian_t GetYaw() const = 0;
 
     virtual std::string GetVehicleModel() const = 0;
 };
diff --git a/sim/include/spawnPointInterface.h b/sim/include/spawnPointInterface.h
index c2e24a95dd42d7c1ba3b849c055a44e515f52282..18b90fbd5b04877b612bc31724da4442b84f981d 100644
--- a/sim/include/spawnPointInterface.h
+++ b/sim/include/spawnPointInterface.h
@@ -19,11 +19,11 @@
 
 #include <string>
 
-#include "modelElements/agent.h"
-#include "include/parameterInterface.h"
-#include "include/callbackInterface.h"
 #include "include/agentBlueprintInterface.h"
 #include "include/agentInterface.h"
+#include "include/callbackInterface.h"
+#include "include/parameterInterface.h"
+#include "modelElements/agent.h"
 
 class WorldInterface;
 
@@ -32,20 +32,20 @@ class WorldInterface;
 //-----------------------------------------------------------------------------
 class SpawnPointInterface
 {
-public:    
+public:
     SpawnPointInterface(WorldInterface *world,
                         const CallbackInterface *callbacks) :
         world(world),
         callbacks(callbacks)
-    {}
-    SpawnPointInterface(const SpawnPointInterface&) = delete;
-    SpawnPointInterface(SpawnPointInterface&&) = delete;
-    SpawnPointInterface& operator=(const SpawnPointInterface&) = delete;
-    SpawnPointInterface& operator=(SpawnPointInterface&&) = delete;
+    {
+    }
+    SpawnPointInterface(const SpawnPointInterface &) = delete;
+    SpawnPointInterface(SpawnPointInterface &&) = delete;
+    SpawnPointInterface &operator=(const SpawnPointInterface &) = delete;
+    SpawnPointInterface &operator=(SpawnPointInterface &&) = delete;
     virtual ~SpawnPointInterface() = default;
 
-    using Agents = std::vector<core::Agent*>;
-    virtual Agents Trigger(int time) = 0;
+    virtual void Trigger(int time) = 0;
 
 protected:
     //-----------------------------------------------------------------------------
@@ -71,7 +71,7 @@ protected:
              int line,
              const std::string &message) const
     {
-        if(callbacks)
+        if (callbacks)
         {
             callbacks->Log(logLevel,
                            file,
@@ -81,8 +81,6 @@ protected:
     }
 
 private:
-    WorldInterface *world;                //!< References the world of the framework
-    const CallbackInterface *callbacks;   //!< References the callback functions of the framework    
+    WorldInterface *world;              //!< References the world of the framework
+    const CallbackInterface *callbacks; //!< References the callback functions of the framework
 };
-
-
diff --git a/sim/include/spawnPointNetworkInterface.h b/sim/include/spawnPointNetworkInterface.h
index 46aae75d552d737553991067f01e8ed883949422..e20c5056b2f902d3aab20135effb0b37b19684af 100644
--- a/sim/include/spawnPointNetworkInterface.h
+++ b/sim/include/spawnPointNetworkInterface.h
@@ -12,8 +12,8 @@
 #include <list>
 #include <map>
 #include "include/agentFactoryInterface.h"
-#include "include/agentBlueprintProviderInterface.h"
-#include "include/scenarioInterface.h"
+#include "include/configurationContainerInterface.h"
+#include "include/vehicleModelsInterface.h"
 #include "common/spawnPointLibraryDefinitions.h"
 
 namespace core
@@ -35,25 +35,26 @@ public:
     //! or create a new instance (which is then also stored), then create a new spawn
     //! point using the provided parameters.
     //!
-    //! @param[in]  libraryInfos         Information for the SpawnPointLibrary
-    //! @param[in]  agentFactory        Factory for the agents
-    //! @param[in]  agentBlueprintProvider        AgentBlueprintProvider
-    //! @param[in]  sampler             Sampler
-    //! @return                         true, if successful
+    //! @param[in]  libraryInfos            Information for the SpawnPointLibrary
+    //! @param[in]  agentFactory            Factory for the agents
+    //! @param[in]  stochastics             StochasticInterface
+    //! @param[in]  spawnPointProfiles      SpawnPointProfiles of the ProfilesCatalog
+    //! @param[in]  configurationContainer  ConfigurationContainer
+    //! @param[in]  vehicles                Shared pointer containing the Vehicles of the VehiclesCatalog
+    //! @return                             true, if successful
     //-----------------------------------------------------------------------------
     virtual bool Instantiate(const SpawnPointLibraryInfoCollection& libraryInfos,
                              AgentFactoryInterface* agentFactory,
-                             const AgentBlueprintProviderInterface* agentBlueprintProvider,
                              StochasticsInterface* stochastics,
-                             const ScenarioInterface* scenario,
-                             const std::optional<ProfileGroup>& spawnPointProfiles) = 0;
+                             const std::optional<ProfileGroup>& spawnPointProfiles,
+                             ConfigurationContainerInterface* configurationContainer,
+                             std::shared_ptr<mantle_api::IEnvironment> environment,
+                             std::shared_ptr<Vehicles> vehicles) = 0;
 
     virtual bool TriggerPreRunSpawnZones() = 0;
 
     virtual bool TriggerRuntimeSpawnPoints(const int timestamp) = 0;
 
-    virtual std::vector<Agent*> ConsumeNewAgents() = 0;
-
     //-----------------------------------------------------------------------------
     //! Clears all spawnpoints.
     //-----------------------------------------------------------------------------
diff --git a/sim/include/streamInterface.h b/sim/include/streamInterface.h
index 46da70e9e79e5f2a9220ab040d68ac50e9401615..db5a8523e1401ebfa183e3590d3a65d759f810e5 100644
--- a/sim/include/streamInterface.h
+++ b/sim/include/streamInterface.h
@@ -29,15 +29,15 @@ class WorldObjectInterface;
 //! Defines the position in a RoadStream or LaneStream
 struct StreamPosition
 {
-    double s; //!< Longitudinal position in the stream (relative to the start)
-    double t; //!< Lateral position in stream (relative to middle of the road/lane)
-    double hdg; //! Heading relative to stream direction
+    units::length::meter_t s; //!< Longitudinal position in the stream (relative to the start)
+    units::length::meter_t t; //!< Lateral position in stream (relative to middle of the road/lane)
+    units::angle::radian_t hdg; //! Heading relative to stream direction
 
     double operator==(const StreamPosition& other) const
     {
-        return std::abs(s - other.s) < EQUALITY_BOUND
-                && std::abs(t - other.t) < EQUALITY_BOUND
-                && std::abs(hdg - other.hdg) < EQUALITY_BOUND;
+        return mantle_api::IsEqual(s, other.s, EQUALITY_BOUND)
+                && mantle_api::IsEqual(t, other.t, EQUALITY_BOUND)
+                && mantle_api::IsEqual(hdg, other.hdg, EQUALITY_BOUND);
     }
 };
 
@@ -90,10 +90,10 @@ public:
     //! Each LaneType is valid until the s position of the next element in the list
     //!
     //! \return list of laneTypes and where they start
-    virtual std::vector<std::pair<double, LaneType>> GetLaneTypes() const = 0;
+    virtual std::vector<std::pair<units::length::meter_t, LaneType>> GetLaneTypes() const = 0;
 
     //! Returns the length of the stream
-    virtual double GetLength() const = 0;
+    virtual units::length::meter_t GetLength() const = 0;
 };
 
 //! Represents a connected sequence of roads in the road network
@@ -130,5 +130,5 @@ public:
     virtual std::unique_ptr<LaneStreamInterface> GetLaneStream(const GlobalRoadPosition& startPosition) const = 0;
 
     //! Returns the length of the stream
-    virtual double GetLength() const = 0;
+    virtual units::length::meter_t GetLength() const = 0;
 };
diff --git a/sim/include/trafficObjectInterface.h b/sim/include/trafficObjectInterface.h
index 0441a9ad5ca3b26f485fd2d774dc86f29c6db063..be798776e1b7f17b4959511f6c24e582a42026dd 100644
--- a/sim/include/trafficObjectInterface.h
+++ b/sim/include/trafficObjectInterface.h
@@ -24,6 +24,6 @@ public:
     virtual ~TrafficObjectInterface() = default;
 
     virtual OpenDriveId GetOpenDriveId() const = 0;
-    virtual double GetZOffset() const = 0;
+    virtual units::length::meter_t GetZOffset() const = 0;
     virtual bool GetIsCollidable() const = 0;
 };
diff --git a/sim/include/vehicleModelsInterface.h b/sim/include/vehicleModelsInterface.h
index 307aad7b3a8bb938b2c05896a1d29193bf1a7800..6e26964bc1a7c915a3938b1f3d466c03f8fa9679 100644
--- a/sim/include/vehicleModelsInterface.h
+++ b/sim/include/vehicleModelsInterface.h
@@ -19,140 +19,9 @@
 #include <algorithm>
 #include <math.h>
 
-#include "common/globalDefinitions.h"
-#include "common/openScenarioDefinitions.h"
+#include <MantleAPI/Traffic/entity_properties.h>
 
-//! Resolves a parametrized attribute
-//!
-//! \param attribute                attribute is defined in the catalog
-//! \param parameterAssignments     parameter assignments in the catalog reference
-template <typename T>
-T GetAttribute(openScenario::ParameterizedAttribute<T> attribute, const openScenario::Parameters& parameterAssignments)
-{
-    const auto& assignedParameter = parameterAssignments.find(attribute.name);
-    if (assignedParameter != parameterAssignments.cend())
-    {
-        auto valueString = std::get<std::string>(assignedParameter->second);
-        if constexpr (std::is_same_v<T, std::string>)
-        {
-            return valueString;
-        }
-        try
-        {
-            if constexpr (std::is_same_v<T, double>)
-            {
-                return std::stod(valueString);
-            }
-            else if constexpr (std::is_same_v<T, int>)
-            {
-                return std::stoi(valueString);
-            }
-        }
-        catch (const std::invalid_argument&)
-        {
-            throw std::runtime_error("Type of assigned parameter \"" + attribute.name + "\" in scenario does not match.");
-        }
-        catch (const std::out_of_range&)
-        {
-            throw std::runtime_error("Value of assigned parameter \"" + attribute.name + "\" is out of range.");
-        }
-    }
-    else
-    {
-        return attribute.defaultValue;
-    }
-}
-
-//! Contains the VehicleModelParameters as defined in the VehicleModelCatalog.
-//! Certain values may be parametrized and can be overwriten in the Scenario via ParameterAssignment
-struct ParametrizedVehicleModelParameters
-{
-    AgentVehicleType vehicleType;
-
-    struct BoundingBoxCenter
-    {
-        openScenario::ParameterizedAttribute<double> x;
-        openScenario::ParameterizedAttribute<double> y;
-        openScenario::ParameterizedAttribute<double> z;
-
-        VehicleModelParameters::BoundingBoxCenter Get(const openScenario::Parameters& assignedParameters) const
-        {
-            return {GetAttribute(x, assignedParameters),
-                    GetAttribute(y, assignedParameters),
-                    GetAttribute(z, assignedParameters)};
-        }
-    } boundingBoxCenter;
-
-    struct BoundingBoxDimensions
-    {
-        openScenario::ParameterizedAttribute<double> width;
-        openScenario::ParameterizedAttribute<double> length;
-        openScenario::ParameterizedAttribute<double> height;
-
-        VehicleModelParameters::BoundingBoxDimensions Get(const openScenario::Parameters& assignedParameters) const
-        {
-            return {GetAttribute(width, assignedParameters),
-                    GetAttribute(length, assignedParameters),
-                    GetAttribute(height, assignedParameters)};
-        }
-    } boundingBoxDimensions;
-
-    struct Performance
-    {
-        openScenario::ParameterizedAttribute<double> maxSpeed;
-        openScenario::ParameterizedAttribute<double> maxAcceleration;
-        openScenario::ParameterizedAttribute<double> maxDeceleration;
-
-        VehicleModelParameters::Performance Get(const openScenario::Parameters& assignedParameters) const
-        {
-            return {GetAttribute(maxSpeed, assignedParameters),
-                    GetAttribute(maxAcceleration, assignedParameters),
-                    GetAttribute(maxDeceleration, assignedParameters)};
-        }
-    } performance;
-
-    struct Axle
-    {
-        openScenario::ParameterizedAttribute<double> maxSteering;
-        openScenario::ParameterizedAttribute<double> wheelDiameter;
-        openScenario::ParameterizedAttribute<double> trackWidth;
-        openScenario::ParameterizedAttribute<double> positionX;
-        openScenario::ParameterizedAttribute<double> positionZ;
-
-        VehicleModelParameters::Axle Get(const openScenario::Parameters& assignedParameters) const
-        {
-            return {GetAttribute(maxSteering, assignedParameters),
-                    GetAttribute(wheelDiameter, assignedParameters),
-                    GetAttribute(trackWidth, assignedParameters),
-                    GetAttribute(positionX, assignedParameters),
-                    GetAttribute(positionZ, assignedParameters)};
-        }
-    };
-    Axle frontAxle;
-    Axle rearAxle;
-
-    std::map<std::string, openScenario::ParameterizedAttribute<double>> properties;
-
-    VehicleModelParameters Get(const openScenario::Parameters& assignedParameters) const
-    {
-        std::map<std::string, double> assignedProperties;
-        for (const auto[key, value] : properties)
-        {
-            assignedProperties.insert({key, GetAttribute(value, assignedParameters)});
-        }
-
-        return {vehicleType,
-                boundingBoxCenter.Get(assignedParameters),
-                boundingBoxDimensions.Get(assignedParameters),
-                performance.Get(assignedParameters),
-                frontAxle.Get(assignedParameters),
-                rearAxle.Get(assignedParameters),
-                assignedProperties
-        };
-    }
-};
-
-using VehicleModelMap = std::unordered_map<std::string, ParametrizedVehicleModelParameters>;
+using VehicleModelMap = std::unordered_map<std::string, mantle_api::VehicleProperties>;
 
 class VehicleModelsInterface
 {
@@ -160,17 +29,15 @@ public:
     VehicleModelsInterface() = default;
     ~VehicleModelsInterface() = default;
 
-    virtual const VehicleModelMap& GetVehicleModelMap() const = 0;
-
     //! Add the VehicleModel with the specified name
     //!
     //! \param name                 name of the vehicle model
     //! \param vehicleModel         assigned parameters, that overwrite the default parameters
-    virtual void AddVehicleModel(const std::string& name, const ParametrizedVehicleModelParameters& vehicleModel) = 0;
+    virtual void AddVehicleModel(const std::string& name, mantle_api::VehicleProperties vehicleModel) = 0;
 
     //! Returns the VehicleModel with the specified name
     //!
     //! \param vehicleModelType     name of the vehicle model
     //! \param parameters           assigned parameters, that overwrite the default parameters
-    virtual VehicleModelParameters GetVehicleModel(std::string vehicleModelType, const openScenario::Parameters& parameters = {}) const = 0;
+    virtual mantle_api::VehicleProperties GetVehicleModel(std::string vehicleModelType) const = 0;
 };
diff --git a/sim/include/worldInterface.h b/sim/include/worldInterface.h
index 16026a4b70dab26bd60d862cdfb2cc77e4e9653a..4bc88cb47a5531812aecc3859e8a867d108593de 100644
--- a/sim/include/worldInterface.h
+++ b/sim/include/worldInterface.h
@@ -18,21 +18,21 @@
 
 #pragma once
 
-#include <map>
 #include <functional>
 #include <list>
+#include <map>
 
 #include "common/boostGeometryCommon.h"
 #include "common/globalDefinitions.h"
 #include "common/openPassTypes.h"
-#include "common/openScenarioDefinitions.h"
 #include "common/vector2d.h"
 #include "common/worldDefinitions.h"
 #include "include/streamInterface.h"
 #include "include/radioInterface.h"
+#include "include/agentBlueprintInterface.h"
+#include "MantleAPI/EnvironmentalConditions/weather.h"
 
 class AgentInterface;
-class AgentBlueprintInterface;
 class ParameterInterface;
 class SceneryInterface;
 class SceneryDynamicsInterface;
@@ -54,9 +54,15 @@ public:
     WorldInterface &operator=(WorldInterface &&) = delete;
     virtual ~WorldInterface() = default;
 
-    virtual bool Instantiate() {return false;}
+    virtual bool Instantiate()
+    {
+        return false;
+    }
 
-    virtual bool isInstantiated() {return false;}
+    virtual bool isInstantiated()
+    {
+        return false;
+    }
 
     //-----------------------------------------------------------------------------
     //! Retrieves the OSI ground truth
@@ -99,7 +105,7 @@ public:
     //!
     //! @return                Pointer OSI world data structure
     //-----------------------------------------------------------------------------
-    virtual void* GetWorldData() = 0;
+    virtual void *GetWorldData() = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves time of day (hour)
@@ -120,14 +126,14 @@ public:
     //!
     //! @return                visibility distance
     //-----------------------------------------------------------------------------
-    virtual double GetVisibilityDistance() const = 0;
+    virtual units::length::meter_t GetVisibilityDistance() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves traffic rules
     //!
     //! @return                traffic rules
     //-----------------------------------------------------------------------------
-    virtual const TrafficRules& GetTrafficRules() const = 0;
+    virtual const TrafficRules &GetTrafficRules() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Sets the world parameters like weekday, library
@@ -135,7 +141,7 @@ public:
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual void ExtractParameter(ParameterInterface* parameters) = 0;
+    virtual void ExtractParameter(ParameterInterface *parameters) = 0;
 
     //-----------------------------------------------------------------------------
     //! Reset the world for the next run
@@ -178,7 +184,7 @@ public:
     //!
     //! @return                Vector of all worldObjects
     //-----------------------------------------------------------------------------
-    virtual const std::vector<const WorldObjectInterface*>& GetWorldObjects() const = 0;
+    virtual const std::vector<const WorldObjectInterface *> &GetWorldObjects() const = 0;
 
     //-----------------------------------------------------------------------------
     //! queue functions and values to update agent when SyncGlobalData is called
@@ -220,11 +226,18 @@ public:
     //! Create a scenery in world.
     //!
     //! @param scenery          OpenDrive scenery to convert
-    //! @param sceneryDynamics  scenery related information in the scenario
     //! @param turningRates     turning rate for junctions
     //! @return
     //-----------------------------------------------------------------------------
-    virtual bool CreateScenery(const SceneryInterface *scenery, const SceneryDynamicsInterface& sceneryDynamics, const TurningRates& turningRates) = 0;
+    virtual bool CreateScenery(const SceneryInterface *scenery, const TurningRates& turningRates) = 0;
+
+    //-----------------------------------------------------------------------------
+    //! Set weather in world.
+    //!
+    //! @param  weather         weather from scenario    
+    //! @return
+    //-----------------------------------------------------------------------------
+    virtual void SetWeather(const mantle_api::Weather& weather) = 0;
 
     //-----------------------------------------------------------------------------
     //! Create an agentAdapter for an agent to communicate between the agent of the
@@ -241,7 +254,7 @@ public:
     //! @param agentBlueprint  blueprint holding parameters of the agent
     //! @return          Instance of the AgentAdapter (implementing AgentInterface)
     //------------------------------------------------------------------------------------
-    virtual AgentInterface &CreateAgentAdapter(const AgentBlueprintInterface &agentBlueprint) = 0;
+    virtual AgentInterface &CreateAgentAdapter(const AgentBuildInstructions &agentBlueprint) = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns one agent which is set to be special.
@@ -270,29 +283,29 @@ public:
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual Position LaneCoord2WorldCoord(double distanceOnLane, double offset, std::string roadId,
-            int laneId) const = 0;
+    virtual Position LaneCoord2WorldCoord(units::length::meter_t distanceOnLane, units::length::meter_t offset, std::string roadId,
+                                          int laneId) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve all lane positions corresponding to the specified world position
     //!
     //! @return Position on all lanes at specified world position
     //-----------------------------------------------------------------------------
-    virtual GlobalRoadPositions WorldCoord2LaneCoord(double x, double y, double heading) const = 0;
+    virtual GlobalRoadPositions WorldCoord2LaneCoord(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t heading) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Tries to create an internal scenery from a given file.
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual bool CreateWorldScenery(const  std::string &sceneryFilename) = 0;
+    virtual bool CreateWorldScenery(const std::string &sceneryFilename) = 0;
 
     //-----------------------------------------------------------------------------
     //! Tries to create an internal scenario from a given file.
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual bool CreateWorldScenario(const  std::string &scenarioFilename) = 0;
+    virtual bool CreateWorldScenario(const std::string &scenarioFilename) = 0;
 
     //-----------------------------------------------------------------------------
     //! Locate a given relative point of an object in relation to a given RoadGraph
@@ -319,8 +332,8 @@ public:
     //!
     //! @return All agents in specified range
     //-----------------------------------------------------------------------------
-    virtual RouteQueryResult<AgentInterfaces> GetAgentsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance,
-                                                                       double backwardRange, double forwardRange) const = 0;
+    virtual RouteQueryResult<AgentInterfaces> GetAgentsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance,
+                                                               units::length::meter_t backwardRange, units::length::meter_t forwardRange) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns all objects in specified range (also objects partially in search interval).
@@ -335,17 +348,17 @@ public:
     //!
     //! @return All objects in specified range
     //-----------------------------------------------------------------------------
-    virtual RouteQueryResult<std::vector<const WorldObjectInterface*>> GetObjectsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance,
-                                                                       double backwardRange, double forwardRange) const = 0;
+    virtual RouteQueryResult<std::vector<const WorldObjectInterface *>> GetObjectsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance,
+                                                                                          units::length::meter_t backwardRange, units::length::meter_t forwardRange) const = 0;
 
     //! Returns all agents on the specified connectingRoad of a junction and on the incoming lanes that lead to this connecting road
     //! inside a certain range. The range is measured backwards from the end of the connecting road.
     //!
     //! \param connectingRoadId OpenDrive id of the connecting road
     //! \param range            Distance of the search start to the end of connecting road
-    //! 
+    //!
     //! \return  All agents in specified range
-    virtual AgentInterfaces GetAgentsInRangeOfJunctionConnection(std::string connectingRoadId, double range) const = 0;
+    virtual AgentInterfaces GetAgentsInRangeOfJunctionConnection(std::string connectingRoadId, units::length::meter_t range) const = 0;
 
     //! Returns the s coordinate distance from the front of the agent to the first point where his lane intersects another.
     //! As the agent may not yet be on the junction, it has to be specified which connecting road he will take in the junction
@@ -355,7 +368,7 @@ public:
     //! \param ownConnectorId           OpenDrive id of the connecting road that this agent is assumed to drive on
     //!
     //! \return distance of front of agent to the intersecting lane
-    virtual double GetDistanceToConnectorEntrance(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const = 0;
+    virtual units::length::meter_t GetDistanceToConnectorEntrance(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const = 0;
 
     //! Returns the s coordinate distance from the rear of the agent to the furthest point where his lane intersects another.
     //! As the agent may not yet be on the junction, it has to be specified which connecting road he will take in the junction
@@ -365,7 +378,7 @@ public:
     //! \param ownConnectorId           OpenDrive id of the connecting road that this agent is assumed to drive on
     //!
     //! \return distance of rear of agent to the farther side of the intersecting lane
-    virtual double GetDistanceToConnectorDeparture(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const = 0;
+    virtual units::length::meter_t GetDistanceToConnectorDeparture(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve whether s coordinate is valid on given lane.
@@ -375,7 +388,7 @@ public:
     //! @param[in] distance  s coordinate
     //! @return true if s is valid at given distance, false otherwise
     //-----------------------------------------------------------------------------
-    virtual bool IsSValidOnLane(std::string roadId, int laneId, double distance) = 0;
+    virtual bool IsSValidOnLane(std::string roadId, int laneId, units::length::meter_t distance) = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve whether a road id exists in a specified openDrive direction.
@@ -397,7 +410,7 @@ public:
     //!
     //! @return true if the lane has a valid LaneType
     //-----------------------------------------------------------------------------
-    virtual bool IsLaneTypeValid(const std::string &roadId, const int laneId, const double distanceOnLane, const LaneTypes& validLaneTypes) = 0;
+    virtual bool IsLaneTypeValid(const std::string &roadId, const int laneId, const units::length::meter_t distanceOnLane, const LaneTypes &validLaneTypes) = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns interpolated value for the curvature of the lane at the given position.
@@ -409,7 +422,7 @@ public:
     //! @param[in] position s coordinate of search start
     //! @return curvature at position
     //-----------------------------------------------------------------------------
-    virtual double GetLaneCurvature(std::string roadId, int laneId, double position) const = 0 ;
+    virtual units::curvature::inverse_meter_t GetLaneCurvature(std::string roadId, int laneId, units::length::meter_t position) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns interpolated value for the curvature of the lane at distance from the given position.
@@ -423,7 +436,7 @@ public:
     //! @param[in] distance s       coordinate difference from position to the point of interst
     //! @return curvature at position
     //-----------------------------------------------------------------------------
-    virtual RouteQueryResult<std::optional<double> > GetLaneCurvature(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const = 0;
+    virtual RouteQueryResult<std::optional<units::curvature::inverse_meter_t>> GetLaneCurvature(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns interpolated value for the width of the lane the given position.
@@ -435,7 +448,7 @@ public:
     //! @param[in] position s coordinate of search start
     //! @return width at position
     //-----------------------------------------------------------------------------
-    virtual double GetLaneWidth(std::string roadId, int laneId, double position) const = 0 ;
+    virtual units::length::meter_t GetLaneWidth(std::string roadId, int laneId, units::length::meter_t position) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns interpolated value for the width of the lane at distance from the given position.
@@ -449,7 +462,7 @@ public:
     //! @param[in] distance s       coordinate difference from position to the point of interst
     //! @return width at position
     //-----------------------------------------------------------------------------
-    virtual RouteQueryResult<std::optional<double> > GetLaneWidth(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const = 0;
+    virtual RouteQueryResult<std::optional<units::length::meter_t>> GetLaneWidth(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns value for the direction (i.e. heading) of the lane at the given position.
@@ -461,7 +474,7 @@ public:
     //! @param[in] position s coordinate of search start
     //! @return direction at position
     //-----------------------------------------------------------------------------
-    virtual double GetLaneDirection(std::string roadId, int laneId, double position) const = 0 ;
+    virtual units::angle::radian_t GetLaneDirection(std::string roadId, int laneId, units::length::meter_t position) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns value for the curvature (i.e. heading) of the lane at distance from the given position.
@@ -475,7 +488,7 @@ public:
     //! @param[in] distance s       coordinate difference from position to the point of interst
     //! @return direction at position
     //-----------------------------------------------------------------------------
-    virtual RouteQueryResult<std::optional<double> > GetLaneDirection(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const = 0;
+    virtual RouteQueryResult<std::optional<units::angle::radian_t>> GetLaneDirection(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns remaining distance to end of lane stream (along given route) or until next lane which has non of the following types:
@@ -488,8 +501,8 @@ public:
     //! @param[in] maxSearchLength  maximum search length
     //! @return remaining distance
     //-----------------------------------------------------------------------------
-    virtual RouteQueryResult<double> GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance,
-                                                                             double maximumSearchLength) const = 0;
+    virtual RouteQueryResult<units::length::meter_t> GetDistanceToEndOfLane(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance,
+                                                                            units::length::meter_t maximumSearchLength) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns remaining distance to end of lane stream (along given route) or until next lane which has non of the specified types:
@@ -502,8 +515,8 @@ public:
     //! @param[in] laneTypes        filter for lane types
     //! @return remaining distance
     //-----------------------------------------------------------------------------
-    virtual RouteQueryResult<double> GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance,
-                                                                             double maximumSearchLength, const LaneTypes& laneTypes) const = 0;
+    virtual RouteQueryResult<units::length::meter_t> GetDistanceToEndOfLane(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance,
+                                                                            units::length::meter_t maximumSearchLength, const LaneTypes &laneTypes) const = 0;
 
     //-----------------------------------------------------------------------------
     //! \brief GetDistanceBetweenObjects gets the distance between two
@@ -517,10 +530,10 @@ public:
     //! \param target the position of the second object
     //! \return the distance between the positions on the Route
     //-----------------------------------------------------------------------------
-    virtual RouteQueryResult<std::optional<double>> GetDistanceBetweenObjects(const RoadGraph& roadGraph,
-                                                                              RoadGraphVertex startNode,
-                                                                              double ownPosition,
-                                                                              const GlobalRoadPositions &target) const = 0;
+    virtual RouteQueryResult<std::optional<units::length::meter_t>> GetDistanceBetweenObjects(const RoadGraph& roadGraph,
+                                                                                              RoadGraphVertex startNode,
+                                                                                              units::length::meter_t ownPosition,
+                                                                                              const GlobalRoadPositions &target) const = 0;
 
     //-----------------------------------------------------------------------------
     //! \brief This method returns all LaneSections of a road
@@ -529,14 +542,14 @@ public:
     //!
     //! \return LaneSections
     //-----------------------------------------------------------------------------
-    virtual LaneSections GetLaneSections(const std::string& roadId) const = 0;
+    virtual LaneSections GetLaneSections(const std::string &roadId) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieve whether a new agent intersects with an existing agent
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual bool IntersectsWithAgent(double x, double y, double rotation, double length, double width, double center) = 0;
+    virtual bool IntersectsWithAgent(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t rotation, units::length::meter_t length, units::length::meter_t width, units::length::meter_t center) = 0;
 
     virtual Position RoadCoord2WorldCoord(RoadPosition roadCoord, std::string roadID = "") const = 0;
 
@@ -547,7 +560,7 @@ public:
      *
      * \return Length of the specified road in [m]
      */
-    virtual double GetRoadLength(const std::string& roadId) const = 0;
+    virtual units::length::meter_t GetRoadLength(const std::string &roadId) const = 0;
 
     //! Calculates the obstruction of an agent with another object i.e. how far to left or the right the object is from my position
     //! For more information see the [markdown documentation](\ref dev_framework_modules_world_getobstruction)
@@ -559,7 +572,7 @@ public:
     //! \param touchedRoads     position of the other object
     //! \return obstruction with the other object
     virtual RouteQueryResult<Obstruction> GetObstruction(const RoadGraph &roadGraph, RoadGraphVertex startNode, const GlobalRoadPosition &ownPosition,
-                                                         const std::map<ObjectPoint, Common::Vector2d> &points, const RoadIntervals &touchedRoads) const = 0;
+                                                         const std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> &points, const RoadIntervals &touchedRoads) const = 0;
 
     //! Returns all traffic signs valid for a lane inside the range
     //!
@@ -569,8 +582,8 @@ public:
     //! \param startDistance    s coordinate
     //! \param searchRange      range of search (can also be negative)
     //! \return traffic signs in range
-    virtual RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetTrafficSignsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                            double startDistance, double searchRange) const = 0;
+    virtual RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetTrafficSignsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId,
+                                                                                            units::length::meter_t startDistance, units::length::meter_t searchRange) const = 0;
 
     //! Returns all road markings valid for a lane inside the range
     //!
@@ -580,8 +593,8 @@ public:
     //! \param startDistance    s coordinate
     //! \param searchRange      range of search
     //! \return road markings in range (can also be negative)
-    virtual RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetRoadMarkingsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                            double startDistance, double searchRange) const = 0;
+    virtual RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetRoadMarkingsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId,
+                                                                                            units::length::meter_t startDistance, units::length::meter_t searchRange) const = 0;
 
     //! Returns all traffic lights valid for a lane inside the range
     //!
@@ -591,8 +604,8 @@ public:
     //! \param startDistance    s coordinate
     //! \param searchRange      range of search (can also be negative)
     //! \return traffic lights in range
-    virtual RouteQueryResult<std::vector<CommonTrafficLight::Entity>> GetTrafficLightsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                             double startDistance, double searchRange) const = 0;
+    virtual RouteQueryResult<std::vector<CommonTrafficLight::Entity>> GetTrafficLightsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId,
+                                                                                              units::length::meter_t startDistance, units::length::meter_t searchRange) const = 0;
 
     //! Retrieves all lane markings on the given position on the given side of the lane inside the range
     //!
@@ -602,7 +615,7 @@ public:
     //! \param startDistance    s coordinate
     //! \param range            search range
     //! \param side             side of the lane
-    virtual RouteQueryResult<std::vector<LaneMarking::Entity>> GetLaneMarkings(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double range, Side side) const = 0;
+    virtual RouteQueryResult<std::vector<LaneMarking::Entity>> GetLaneMarkings(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t range, Side side) const = 0;
 
     //! Returns the relative distances (start and end) and the connecting road id of all junctions  on the route in range
     //!
@@ -611,7 +624,7 @@ public:
     //! \param startDistance    start s coordinate on the road
     //! \param range            range of search
     //! \return information about all junctions  in range
-    [[deprecated]] virtual RouteQueryResult<RelativeWorldView::Roads> GetRelativeJunctions(const RoadGraph &roadGraph, RoadGraphVertex startNode, double startDistance, double range) const = 0;
+    [[deprecated]] virtual RouteQueryResult<RelativeWorldView::Roads> GetRelativeJunctions(const RoadGraph &roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range) const = 0;
 
     //! Returns the relative distances (start and end) and the road id of all roads on the route in range
     //!
@@ -620,7 +633,7 @@ public:
     //! \param startDistance    start s coordinate on the road
     //! \param range            range of search
     //! \return information about all roads in range
-    virtual RouteQueryResult<RelativeWorldView::Roads> GetRelativeRoads(const RoadGraph& roadGraph, RoadGraphVertex startNode, double startDistance, double range) const = 0;
+    virtual RouteQueryResult<RelativeWorldView::Roads> GetRelativeRoads(const RoadGraph& roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range) const = 0;
 
     //! Returns information about all lanes on the route in range. These info are the relative distances (start and end),
     //! the laneId relative to the ego lane, the successors and predecessors if existing and the information wether the intended
@@ -634,7 +647,7 @@ public:
     //! \param range            range of search
     //! \param includeOncoming  indicating whether oncoming lanes should be included
     //! \return information about all lanes in range
-    virtual RouteQueryResult<RelativeWorldView::Lanes> GetRelativeLanes(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, double range, bool includeOncoming = true) const = 0;
+    virtual RouteQueryResult<RelativeWorldView::Lanes> GetRelativeLanes(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, units::length::meter_t range, bool includeOncoming = true) const = 0;
 
     //! Returns the relative lane id of the located position of a point relative to the given position
     //!
@@ -644,7 +657,7 @@ public:
     //! \param distance         own s coordinate
     //! \param targetPosition   position of queried point
     //! \return lane id relative to own position
-    virtual RouteQueryResult<std::optional<int>> GetRelativeLaneId(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, GlobalRoadPositions targetPosition) const = 0;
+    virtual RouteQueryResult<std::optional<int>> GetRelativeLaneId(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, GlobalRoadPositions targetPosition) const = 0;
 
     //! Returns all possible connections on the junction, that an agent has when coming from the specified road
     //!
@@ -686,19 +699,19 @@ public:
     //! \param maxDepth             maximum depth of the tree
     //! \param inDrivingDirection   calculate tree in driving direction or against driving direction
     //! \return pair consisting of RoadGraph starting at start element and root vertex of this tree
-    virtual std::pair<RoadGraph, RoadGraphVertex> GetRoadGraph(const RouteElement& start, int maxDepth, bool inDrivingDirection = true) const = 0;
+    virtual std::pair<RoadGraph, RoadGraphVertex> GetRoadGraph(const RouteElement &start, int maxDepth, bool inDrivingDirection = true) const = 0;
 
     //! Returns the weight of the path for randomized route generation
     //!
     //! \param roadGraph    RoadGraph for which weights should be given
     //! \return map of weights for all edges in the graph
-    virtual std::map<RoadGraphEdge, double> GetEdgeWeights (const RoadGraph& roadGraph) const = 0;
+    virtual std::map<RoadGraphEdge, double> GetEdgeWeights(const RoadGraph &roadGraph) const = 0;
 
     //! Returns the RoadStream that is defined by the given route
     //!
     //! \param route    list of roads with direction
     //! \return RoadStream along route
-    virtual std::unique_ptr<RoadStreamInterface> GetRoadStream(const std::vector<RouteElement>& route) const = 0;
+    virtual std::unique_ptr<RoadStreamInterface> GetRoadStream(const std::vector<RouteElement> &route) const = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves the friction
@@ -712,7 +725,7 @@ public:
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual AgentInterface* GetEgoAgent() = 0;
+    virtual AgentInterface *GetEgoAgent() = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves agents that were removed from the world during the previous timestep and clears the list
@@ -726,19 +739,29 @@ public:
     //!
     //! @return                Traffic objects
     //-----------------------------------------------------------------------------
-    virtual const std::vector<const TrafficObjectInterface*>& GetTrafficObjects() const = 0;
+    virtual const std::vector<const TrafficObjectInterface *> &GetTrafficObjects() const = 0;
 
     //-----------------------------------------------------------------------------
     //! Returns one agent with the specified scenarioName
     //!
     //! @return
     //-----------------------------------------------------------------------------
-    virtual AgentInterface* GetAgentByName(const std::string& scenarioName) = 0;
+    virtual AgentInterface *GetAgentByName(const std::string &scenarioName) = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves the Radio for Car2X communication
     //!
     //! @return       radio
     //-----------------------------------------------------------------------------
-    virtual RadioInterface& GetRadio() = 0;
+    virtual RadioInterface &GetRadio() = 0;
+
+    //-----------------------------------------------------------------------------
+    //! Returns the OSI Id of the lane
+    //!
+    //! @param[in] roadId   OpenDriveId of the road to search in
+    //! @param[in] laneId   OpenDriveId of lane to search in
+    //! @param[in] position s coordinate of search start
+    //! @return OSI Id of the lane
+    //-----------------------------------------------------------------------------
+    virtual uint64_t GetUniqueLaneId(std::string roadId, int laneId, units::length::meter_t position) const = 0;
 };
diff --git a/sim/include/worldObjectInterface.h b/sim/include/worldObjectInterface.h
index 3cd88ff1efd98017a76d159aa624e2748a73821b..697d39f1b2eb6cfa80d642f5549353f6caa05286 100644
--- a/sim/include/worldObjectInterface.h
+++ b/sim/include/worldObjectInterface.h
@@ -12,39 +12,36 @@
 #include "common/globalDefinitions.h"
 #include "common/boostGeometryCommon.h"
 #include "common/worldDefinitions.h"
+#include "common/vector2d.h"
 #include <unordered_map>
 
 class WorldObjectInterface;
-namespace Common
-{
-class Vector2d;
-}
 
 class WorldObjectInterface
 {
 public:
     virtual ObjectTypeOSI GetType() const = 0;
 
-    virtual double GetPositionX() const = 0;
-    virtual double GetPositionY() const = 0;
+    virtual units::length::meter_t GetPositionX() const = 0;
+    virtual units::length::meter_t GetPositionY() const = 0;
 
     /// \brief Retrieves width of the boundary box
     /// \return width
-    virtual double GetWidth() const = 0;
+    virtual units::length::meter_t GetWidth() const = 0;
 
     /// \brief Retrieves length of the boundary box
     /// \return length
-    virtual double GetLength() const = 0;
+    virtual units::length::meter_t GetLength() const = 0;
 
-    virtual double GetHeight() const = 0;
+    virtual units::length::meter_t GetHeight() const = 0;
 
     /// \brief Retrieves yaw angle w.r.t. x-axis
     /// \return yaw
-    virtual double GetYaw() const = 0;
+    virtual units::angle::radian_t GetYaw() const = 0;
 
     /// \brief Retrieves roll angle
     /// \return roll
-    virtual double GetRoll() const = 0;
+    virtual units::angle::radian_t GetRoll() const = 0;
 
     /// \brief  Get unique id of an object
     /// \return id
@@ -59,24 +56,24 @@ public:
     /// \brief  Returns the world position of the given point
     /// \param  point point to locate (must not be a of type ObjectPointRelative)
     /// \return world position
-    virtual Common::Vector2d GetAbsolutePosition(const ObjectPoint& point) const = 0;
+    virtual Common::Vector2d<units::length::meter_t> GetAbsolutePosition(const ObjectPoint& point) const = 0;
 
     /// \brief  Returns the road position(s) of the given point
     /// \param  point point to locate (must not be a of type ObjectPointRelative)
     /// \return road positions
     virtual const GlobalRoadPositions& GetRoadPosition(const ObjectPoint& point) const = 0;
 
-    virtual double GetDistanceReferencePointToLeadingEdge() const = 0;
+    virtual units::length::meter_t GetDistanceReferencePointToLeadingEdge() const = 0;
 
     /// \brief  Returns the objects velocity at the given point
     /// \param  point point where to get the velocity (must not be a of type ObjectPointRelative)
     /// \return velocity
-    virtual Common::Vector2d GetVelocity(ObjectPoint point = ObjectPointPredefined::Reference) const = 0;
+    virtual Common::Vector2d<units::velocity::meters_per_second_t> GetVelocity(ObjectPoint point = ObjectPointPredefined::Reference) const = 0;
 
     /// \brief  Returns the objects acceleration at the given point
     /// \param  point point where to get the acceleration (must not be a of type ObjectPointRelative)
     /// \return acceleration
-    virtual Common::Vector2d GetAcceleration(ObjectPoint point = ObjectPointPredefined::Reference) const = 0;
+    virtual Common::Vector2d<units::acceleration::meters_per_second_squared_t> GetAcceleration(ObjectPoint point = ObjectPointPredefined::Reference) const = 0;
 
     virtual bool Locate() = 0;
     virtual void Unlocate() = 0;
diff --git a/sim/src/common/CMakeLists.txt b/sim/src/common/CMakeLists.txt
index a2df78a6431791b68225c49dc901ee27b1b931c3..6b82ae0ecbad49402d2563c1b52c2c78b6132c75 100644
--- a/sim/src/common/CMakeLists.txt
+++ b/sim/src/common/CMakeLists.txt
@@ -11,13 +11,8 @@ add_openpass_target(
   NAME Common TYPE library LINKAGE shared COMPONENT common
 
   HEADERS
-    events/acquirePositionEvent.h
     events/basicEvent.h
     events/collisionEvent.h
-    events/componentStateChangeEvent.h
-    events/laneChangeEvent.h
-    events/speedActionEvent.h
-    events/trajectoryEvent.h
     accelerationSignal.h
     agentCompToCompCtrlSignal.h
     acquirePositionSignal.h
@@ -26,7 +21,6 @@ add_openpass_target(
     compCtrlToAgentCompSignal.h
     compatibility.h
     dynamicsSignal.h
-    eventDetectorDefinitions.h
     eventTypes.h
     globalDefinitions.h
     lateralSignal.h
@@ -35,7 +29,6 @@ add_openpass_target(
     opExport.h
     openPassTypes.h
     openPassUtils.h
-    openScenarioDefinitions.h
     parameter.h
     parametersVehicleSignal.h
     primitiveSignals.h
@@ -57,5 +50,4 @@ add_openpass_target(
   SOURCES
     commonTools.cpp
     vector3d.cpp
-    eventDetectorDefinitions.cpp
 )
diff --git a/sim/src/common/RoutePlanning/RouteCalculation.h b/sim/src/common/RoutePlanning/RouteCalculation.h
index beb927350bd6ce2425fc2617e1b325dc2d5c8bf8..415d8034a7c0d922ee4fc7ed3a69304cacf7be4e 100644
--- a/sim/src/common/RoutePlanning/RouteCalculation.h
+++ b/sim/src/common/RoutePlanning/RouteCalculation.h
@@ -146,7 +146,7 @@ static bool GetNewRoute(AgentInterface &agent, const WorldInterface &world, Stoc
     {
         for (const auto &[roadId, roadPosition] : agent.GetRoadPosition(ObjectPointPredefined::Reference))
         {
-            bool direction = std::abs(roadPosition.roadPosition.hdg) <= M_PI_2;
+            bool direction = std::abs(roadPosition.roadPosition.hdg.value()) <= M_PI_2;
             if (world.IsDirectionalRoadExisting(roadId, direction))
             {
                 roadGraphs.push_back(world.GetRoadGraph({roadId, direction}, maxDepth));
@@ -156,14 +156,14 @@ static bool GetNewRoute(AgentInterface &agent, const WorldInterface &world, Stoc
     std::optional<RoadGraph> selectedRoadGraph;
     RoadGraphVertex selectedStart;
     RoadGraphVertex selectedMainLocatorVertex;
-    double minHeading{std::numeric_limits<double>::max()};
+    units::angle::radian_t minHeading{std::numeric_limits<double>::max()};
     for (const auto&[roadGraph, start] : roadGraphs)
     {
         const auto mainLocatorVertex = FindPosition(agent.GetRoadPosition(ObjectPointPredefined::FrontCenter), roadGraph, start);
         if (mainLocatorVertex.has_value())
         {
             const auto mainLocateRouteElement = get(RouteElement(), roadGraph, mainLocatorVertex.value());
-            auto absHeading = std::abs(CommonHelper::SetAngleToValidRange(agent.GetRoadPosition(ObjectPointPredefined::FrontCenter).at(mainLocateRouteElement.roadId).roadPosition.hdg + mainLocateRouteElement.inOdDirection ? 0 : M_PI));
+            auto absHeading = units::math::abs(CommonHelper::SetAngleToValidRange(agent.GetRoadPosition(ObjectPointPredefined::FrontCenter).at(mainLocateRouteElement.roadId).roadPosition.hdg + (mainLocateRouteElement.inOdDirection ? 0.0_rad : units::angle::radian_t(M_PI))));
             if (absHeading < minHeading)
             {
                 minHeading = absHeading;
diff --git a/sim/src/common/accelerationSignal.h b/sim/src/common/accelerationSignal.h
index d61bf5f39467b2e0276347e94c73756d52cdbb99..e3185b8142a0e52e07f870a0e393b2c566afd825 100644
--- a/sim/src/common/accelerationSignal.h
+++ b/sim/src/common/accelerationSignal.h
@@ -53,7 +53,7 @@ public:
     //! Constructor
     //-----------------------------------------------------------------------------
     AccelerationSignal(ComponentState componentState,
-                  double acceleration) :
+                       units::acceleration::meters_per_second_squared_t acceleration) :
         acceleration(acceleration)
     {
         this->componentState = componentState;
@@ -80,6 +80,6 @@ public:
         return stream.str();
     }
 
-    double acceleration;
+    units::acceleration::meters_per_second_squared_t acceleration;
 };
 
diff --git a/sim/src/common/acquirePositionSignal.h b/sim/src/common/acquirePositionSignal.h
index 49bc960dda91240cec37151b28f9570c69c0ee85..21faba4270e0610fe1d3ecb78d48daef847c0372 100644
--- a/sim/src/common/acquirePositionSignal.h
+++ b/sim/src/common/acquirePositionSignal.h
@@ -19,8 +19,8 @@
 
 #include <sstream>
 #include <include/signalInterface.h>
+#include <MantleAPI/Common/position.h>
 
-#include "openScenarioDefinitions.h"
 class AcquirePositionSignal : public ComponentStateSignalInterface
 {
 public:
@@ -29,7 +29,7 @@ public:
     AcquirePositionSignal(){
         componentState = ComponentState::Disabled;
     };
-    AcquirePositionSignal(ComponentState componentState, openScenario::Position position) :
+    AcquirePositionSignal(ComponentState componentState, mantle_api::Position position) :
         position(std::move(position))
     {
         this->componentState = componentState;
@@ -42,12 +42,12 @@ public:
     AcquirePositionSignal& operator=(const AcquirePositionSignal&) = delete;
     AcquirePositionSignal& operator=(AcquirePositionSignal&&) = delete;
 
-    openScenario::Position position;
+    mantle_api::Position position;
 
     explicit operator std::string() const override {
         std::ostringstream stream{};
         stream << COMPONENTNAME << "\n"
-               << "openScenario::Position output stream operator not implemented.";
+               << "mantle_api::Position output stream operator not implemented.";
         return stream.str();
     };
 };
diff --git a/sim/src/common/commonHelper.h b/sim/src/common/commonHelper.h
index 8744e9bc9a82643f7f7aa26aaaa7111835aed27b..29cda9604f5face07c556abb3a1ae7efac066216 100644
--- a/sim/src/common/commonHelper.h
+++ b/sim/src/common/commonHelper.h
@@ -16,6 +16,7 @@
 #include <vector>
 
 #include "math.h"
+#include <units.h>
 
 //-----------------------------------------------------------------------------
 //! @brief defines common helper functions like conversion from and to enums.
@@ -30,9 +31,11 @@ static constexpr double EPSILON = 0.001; //!Treat values smaller than epsilon as
 }
 
 //! Returns the same angle but within the range [-PI, PI]
-[[maybe_unused]] static inline double SetAngleToValidRange(double angle)
+[[maybe_unused]] static inline units::angle::radian_t SetAngleToValidRange(units::angle::radian_t angle)
 {
-    return (angle >= -M_PI) ? std::fmod(angle + M_PI, 2 * M_PI) - M_PI : std::fmod(angle + M_PI, 2 * M_PI) + M_PI;
+    units::angle::radian_t pi{M_PI};
+
+    return (angle >= -pi) ? units::math::fmod(angle + pi, 2 * pi) - pi : units::math::fmod(angle + pi, 2 * pi) + pi;
 }
 
 //-----------------------------------------------------------------------------
@@ -57,6 +60,29 @@ static constexpr double EPSILON = 0.001; //!Treat values smaller than epsilon as
     return elements;
 }
 
+//-----------------------------------------------------------------------------
+//! @brief Calculate linear interpolated points with constant spacing for unit types.
+//!
+//! @param[in] start            Start of interval
+//! @param[in] end              End of interval
+//! @param[in] totalPoints      Total number of points returned (includes start
+//!                             and end point)
+//!
+//! @return                     Vector of interpolated points.
+//-----------------------------------------------------------------------------
+template <typename T, class = typename std::enable_if_t<units::traits::is_unit_t<T>::value>>
+[[maybe_unused]] static std::vector<T> InterpolateLinear(const T start, const T end, const int totalPoints)
+{
+    std::vector<T> elements;
+
+    for(int i = 0; i < totalPoints; ++i)
+    {
+        elements.push_back(start + (i * ((end-start) / (totalPoints-1))));
+        //elements.push_back(start + (i * ((end-start+1) / (totalPoints))));  //not correct implemented yet
+    }
+    return elements;
+}
+
 template <typename T>
 [[maybe_unused]] static inline constexpr T PerHourToPerSecond(T value) noexcept
 {
diff --git a/sim/src/common/commonTools.cpp b/sim/src/common/commonTools.cpp
index cd35507da1c6b178343ac4925dfa74c55112219c..f132d9548c0931895e8604cc24219822db158bb9 100644
--- a/sim/src/common/commonTools.cpp
+++ b/sim/src/common/commonTools.cpp
@@ -12,25 +12,23 @@
 #include "commonTools.h"
 #include <algorithm>
 
-bool CommonHelper::IntersectionCalculation::OnEdge(const Common::Vector2d &A, const Common::Vector2d &B, const Common::Vector2d &P)
+bool CommonHelper::IntersectionCalculation::OnEdge(const Common::Vector2d<units::length::meter_t> &A, const Common::Vector2d<units::length::meter_t> &B, const Common::Vector2d<units::length::meter_t> &P)
 {
     const auto PA = P - A;
     const auto BA = B - A;
 
-    if (std::abs(PA.x * BA.y - PA.y * BA.x) > CommonHelper::EPSILON)
+    if (units::math::abs(PA.x * BA.y - PA.y * BA.x).value() > CommonHelper::EPSILON)
     {
         return false;
     }
 
-    if (std::abs(BA.y) < CommonHelper::EPSILON)
+    if (std::abs(BA.y.value()) < CommonHelper::EPSILON)
     {
-        return BA.x > 0 ? A.x <= P.x && P.x <= B.x :
-                          B.x <= P.x && P.x <= A.x;
+        return BA.x > 0_m ? A.x <= P.x && P.x <= B.x : B.x <= P.x && P.x <= A.x;
     }
     else
     {
-        return BA.y > 0 ? A.y <= P.y && P.y <= B.y :
-                          B.y <= P.y && P.y <= A.y;
+        return BA.y > 0_m ? A.y <= P.y && P.y <= B.y : B.y <= P.y && P.y <= A.y;
     }
 }
 
@@ -44,7 +42,7 @@ bool CommonHelper::IntersectionCalculation::WithinBarycentricCoords(double dot00
     return (u >= 0) && (v >= 0) && (u + v < 1);
 }
 
-bool CommonHelper::IntersectionCalculation::IsWithin(const Common::Vector2d &A, const Common::Vector2d &B, const Common::Vector2d &C, const Common::Vector2d &D, const Common::Vector2d &P)
+bool CommonHelper::IntersectionCalculation::IsWithin(const Common::Vector2d<units::length::meter_t> &A, const Common::Vector2d<units::length::meter_t> &B, const Common::Vector2d<units::length::meter_t> &C, const Common::Vector2d<units::length::meter_t> &D, const Common::Vector2d<units::length::meter_t> &P)
 {
     // Triangle 1 (A, B, C)
     const auto BA = A - B;
@@ -85,7 +83,7 @@ bool CommonHelper::IntersectionCalculation::IsWithin(const Common::Vector2d &A,
 }
 
 //! Adds a new point to the list if it is not already in the list (or a point near it within a small epsilon)
-void AddPointIfNotDuplicate(std::vector<Common::Vector2d>& points, const Common::Vector2d& newPoint)
+void AddPointIfNotDuplicate(std::vector<Common::Vector2d<units::length::meter_t>> &points, const Common::Vector2d<units::length::meter_t> &newPoint)
 {
     //! Note: find uses the operator== which is defined for Vector2d taking a small epsilon into account
     //! This mitigates rounding errors
@@ -95,40 +93,37 @@ void AddPointIfNotDuplicate(std::vector<Common::Vector2d>& points, const Common:
     }
 }
 
-std::vector<Common::Vector2d> CommonHelper::IntersectionCalculation::GetIntersectionPoints(const std::vector<Common::Vector2d> &firstPoints, const std::vector<Common::Vector2d> &secondPoints, bool firstIsRectangular, bool secondIsRectangular)
+std::vector<Common::Vector2d<units::length::meter_t>> CommonHelper::IntersectionCalculation::GetIntersectionPoints(const std::vector<Common::Vector2d<units::length::meter_t>> &firstPoints, const std::vector<Common::Vector2d<units::length::meter_t>> &secondPoints, bool firstIsRectangular, bool secondIsRectangular)
 {
-    std::vector<Common::Vector2d> intersectionPoints{};
+    std::vector<Common::Vector2d<units::length::meter_t>> intersectionPoints{};
     intersectionPoints.reserve(8);
-    Common::Vector2d firstEdges[4];
+    Common::Vector2d<units::length::meter_t> firstEdges[4];
     firstEdges[0] = firstPoints[1] - firstPoints[0];
     firstEdges[1] = firstPoints[2] - firstPoints[1];
     firstEdges[2] = firstPoints[3] - firstPoints[2];
     firstEdges[3] = firstPoints[0] - firstPoints[3];
-    Common::Vector2d secondEdges[4];
+    Common::Vector2d<units::length::meter_t> secondEdges[4];
     secondEdges[0] = secondPoints[1] - secondPoints[0];
     secondEdges[1] = secondPoints[2] - secondPoints[1];
     secondEdges[2] = secondPoints[3] - secondPoints[2];
     secondEdges[3] = secondPoints[0] - secondPoints[3];
 
-
-    double lambda[4][4];
-    double kappa[4][4];
+    units::dimensionless::scalar_t lambda[4][4];
+    units::dimensionless::scalar_t kappa[4][4];
     bool parallel[4][4];
     for (size_t i = 0; i < 4; i++)
     {
         for (size_t k = 0; k < 4; k++)
         {
-            double determinant = secondEdges[i].x * firstEdges[k].y - secondEdges[i].y * firstEdges[k].x;
-            parallel[i][k] = (std::abs(determinant) < CommonHelper::EPSILON);
-            lambda[i][k] = ( - secondPoints[i].x * firstEdges[k].y + secondPoints[i].y * firstEdges[k].x
-                             + firstPoints[k].x * firstEdges[k].y - firstPoints[k].y * firstEdges[k].x ) / determinant;
-            kappa[i][k] = ( - secondPoints[i].x * secondEdges[i].y + secondPoints[i].y * secondEdges[i].x
-                            + firstPoints[k].x * secondEdges[i].y - firstPoints[k].y * secondEdges[i].x) / determinant;
+            units::area::square_meter_t determinant = secondEdges[i].x * firstEdges[k].y - secondEdges[i].y * firstEdges[k].x;
+            parallel[i][k] = (std::abs(determinant.value()) < CommonHelper::EPSILON);
+            lambda[i][k] = (-secondPoints[i].x * firstEdges[k].y + secondPoints[i].y * firstEdges[k].x + firstPoints[k].x * firstEdges[k].y - firstPoints[k].y * firstEdges[k].x) / determinant;
+            kappa[i][k] = (-secondPoints[i].x * secondEdges[i].y + secondPoints[i].y * secondEdges[i].x + firstPoints[k].x * secondEdges[i].y - firstPoints[k].y * secondEdges[i].x) / determinant;
             if (lambda[i][k] > 0 && lambda[i][k] < 1 && kappa[i][k] > 0 && kappa[i][k] < 1)
             {
                 //0 < lambda < 1 and 0 < kappa < 1 => edges intersect. Intersection point is left hand side (and rhs) of the above equation
-                double intersectionPointX = secondPoints[i].x + lambda[i][k] * secondEdges[i].x;
-                double intersectionPointY = secondPoints[i].y + lambda[i][k] * secondEdges[i].y;
+                units::length::meter_t intersectionPointX = secondPoints[i].x + lambda[i][k] * secondEdges[i].x;
+                units::length::meter_t intersectionPointY = secondPoints[i].y + lambda[i][k] * secondEdges[i].y;
                 intersectionPoints.emplace_back(intersectionPointX, intersectionPointY);
             }
         }
@@ -176,16 +171,16 @@ std::vector<Common::Vector2d> CommonHelper::IntersectionCalculation::GetIntersec
     return intersectionPoints;
 }
 
-std::vector<Common::Vector2d> CommonHelper::IntersectionCalculation::GetIntersectionPoints(const polygon_t &firstPolygon, const polygon_t &secondPolygon, bool firstIsRectangular, bool secondIsRectangular)
+std::vector<Common::Vector2d<units::length::meter_t>> CommonHelper::IntersectionCalculation::GetIntersectionPoints(const polygon_t &firstPolygon, const polygon_t &secondPolygon, bool firstIsRectangular, bool secondIsRectangular)
 {
-    std::vector<Common::Vector2d> firstPoints;
+    std::vector<Common::Vector2d<units::length::meter_t>> firstPoints;
     std::transform(firstPolygon.outer().begin(), firstPolygon.outer().end(), std::back_insert_iterator(firstPoints),
-                   [&](const auto& point){return Common::Vector2d{bg::get<0>(point), bg::get<1>(point)};});
+                   [&](const auto &point) { return Common::Vector2d<units::length::meter_t>{units::length::meter_t(bg::get<0>(point)), units::length::meter_t(bg::get<1>(point))}; });
     firstPoints.pop_back();
 
-    std::vector<Common::Vector2d> secondPoints;
+    std::vector<Common::Vector2d<units::length::meter_t>> secondPoints;
     std::transform(secondPolygon.outer().begin(), secondPolygon.outer().end(), std::back_insert_iterator(secondPoints),
-                   [&](const auto& point){return Common::Vector2d{bg::get<0>(point), bg::get<1>(point)};});
+                   [&](const auto &point) { return Common::Vector2d<units::length::meter_t>{units::length::meter_t(bg::get<0>(point)), units::length::meter_t(bg::get<1>(point))}; });
     secondPoints.pop_back();
 
     return GetIntersectionPoints(firstPoints, secondPoints, firstIsRectangular, secondIsRectangular);
diff --git a/sim/src/common/commonTools.h b/sim/src/common/commonTools.h
index 855ce3d9eec0d31616e46bbb6ad93aba79e0089f..400f4f2c8efc285549b465e06fbd6e7da9c715f2 100644
--- a/sim/src/common/commonTools.h
+++ b/sim/src/common/commonTools.h
@@ -34,12 +34,14 @@
 
 #include "common/boostGeometryCommon.h"
 
+using namespace units::literals;
+
 namespace CommonHelper
 {
 
-[[maybe_unused]] static inline constexpr bool CheckPointValid(const Common::Vector2d *point)
+[[maybe_unused]] static inline constexpr bool CheckPointValid(const Common::Vector2d<units::length::meter_t> *point)
 {
-    return ((point != nullptr) && (point->x != INFINITY) && (point->y != INFINITY));
+    return ((point != nullptr) && (point->x != units::length::meter_t(INFINITY)) && (point->y != units::length::meter_t(INFINITY)));
 }
 
 //! Calculate the absolute angle between two pcm points.
@@ -48,16 +50,14 @@ namespace CommonHelper
 //! @param[in]    secondPoint    secondPoint
 //! @return       distance between two pcm points
 //-----------------------------------------------------------------------------
-[[maybe_unused]] static double CalcAngleBetweenPoints(const Common::Vector2d& firstPoint, const Common::Vector2d& secondPoint)
+[[maybe_unused]] static units::angle::radian_t CalcAngleBetweenPoints(const Common::Vector2d<units::length::meter_t> &firstPoint, const Common::Vector2d<units::length::meter_t> &secondPoint)
 {
     if ((!CheckPointValid(&firstPoint)) || (!CheckPointValid(&secondPoint)))
     {
-        return INFINITY;
+        return units::angle::radian_t(INFINITY);
     }
 
-    double angle = (secondPoint - firstPoint).Angle();
-
-    return angle;
+    return units::angle::radian_t((secondPoint - firstPoint).Angle());
 }
 
 //! Transform a pcm point to a vector in the coordination system of a
@@ -65,11 +65,11 @@ namespace CommonHelper
 //!
 //! @param[in]    point     point
 //! @return                 vector
-[[maybe_unused]] static Common::Vector2d TransformPointToSourcePointCoord(const Common::Vector2d *point,
-                                                         const Common::Vector2d *sourcePoint,
-                                                         double direction)
+[[maybe_unused]] static Common::Vector2d<units::length::meter_t> TransformPointToSourcePointCoord(const Common::Vector2d<units::length::meter_t> *point,
+                                                                                                  const Common::Vector2d<units::length::meter_t> *sourcePoint,
+                                                                                                  units::angle::radian_t direction)
 {
-    Common::Vector2d newPoint = *point; //(point->x, point->y);
+    Common::Vector2d<units::length::meter_t> newPoint = *point; //(point->x, point->y);
     newPoint.Translate((*sourcePoint) * (-1));
     newPoint.Rotate(direction * (-1));
 
@@ -91,6 +91,22 @@ static double roundDoubleWithDecimals(double value, int decimals)
     return std::floor((value * (std::pow(10, decimals))) + 0.5)/(std::pow(10.0, decimals));
 }
 
+//-----------------------------------------------------------------------------
+//! @brief Round doubles.
+//!
+//! Rounds doubles of unit type to a given amount of decimals.
+//!
+//! @param[in] value            Value which is rounded
+//! @param[in] decimals         Amount of decimals.
+//!
+//! @return                     Rounded value.
+//-----------------------------------------------------------------------------
+template<class T>
+static T roundDoubleWithDecimals(T value, int decimals)
+{
+    return units::math::floor((value * (std::pow(10, decimals))) + T(0.5))/(std::pow(10.0, decimals));
+}
+
 //! Estimate the inertial momentum for rotation around the vehicle's z-axis, assuming
 //! a cuboid of homogeneous mass density. ( see .e.g. https://en.wikipedia.org/wiki/List_of_moments_of_inertia )
 //!
@@ -98,25 +114,23 @@ static double roundDoubleWithDecimals(double value, int decimals)
 //! @param[in] length   Length of the vehicle [m]
 //! @param[in] width    Width of the vehicle [m]
 //! @return             momentInertiaYaw [kg*m^2]
-static double CalculateMomentInertiaYaw(double mass, double length, double width) {
-    return mass * (length*length + width*width) / 12;
+static units::inertia CalculateMomentInertiaYaw(units::mass::kilogram_t mass, units::length::meter_t length, units::length::meter_t width) {
+    return mass * (length*length + width*width) / units::dimensionless::scalar_t(12);
 }
 
-[[maybe_unused]] static std::optional<Common::Vector2d> CalculateIntersection(const Common::Vector2d& firstStartPoint, const Common::Vector2d& firstAxis,
-                                                      const Common::Vector2d& secondStartPoint, const Common::Vector2d& secondAxis)
+[[maybe_unused]] static std::optional<Common::Vector2d<units::length::meter_t>> CalculateIntersection(const Common::Vector2d<units::length::meter_t> &firstStartPoint, const Common::Vector2d<units::length::meter_t> &firstAxis,
+                                                                                                      const Common::Vector2d<units::length::meter_t> &secondStartPoint, const Common::Vector2d<units::length::meter_t> &secondAxis)
 {
     //Solve linear equation firstStartPoint + lambda * firstAxis = secondStart + kappa * secondAxis
-    double determinant = - firstAxis.x * secondAxis.y + firstAxis.y * secondAxis.x; //Determinant of matrix (firstAxis -secondAxis)
-    if (std::abs(determinant) < EPSILON)
+    units::area::square_meter_t determinant = -firstAxis.x * secondAxis.y + firstAxis.y * secondAxis.x; //Determinant of matrix (firstAxis -secondAxis)
+    if (std::abs(determinant.value()) < EPSILON)
     {
         return std::nullopt;
     }
-    double lambda = (- (secondStartPoint.x - firstStartPoint.x) * secondAxis.y
-                     + (secondStartPoint.y - firstStartPoint.y) * secondAxis.x)
-                    / determinant;
-    double intersectionPointX = firstStartPoint.x + lambda * firstAxis.x;
-    double intersectionPointY = firstStartPoint.y + lambda * firstAxis.y;
-    return std::make_optional<Common::Vector2d>(intersectionPointX, intersectionPointY);
+    units::dimensionless::scalar_t lambda = (-(secondStartPoint.x - firstStartPoint.x) * secondAxis.y + (secondStartPoint.y - firstStartPoint.y) * secondAxis.x) / determinant;
+    units::length::meter_t intersectionPointX = firstStartPoint.x + lambda * firstAxis.x;
+    units::length::meter_t intersectionPointY = firstStartPoint.y + lambda * firstAxis.y;
+    return std::make_optional<Common::Vector2d<units::length::meter_t>>(intersectionPointX, intersectionPointY);
 }
 
 //! Calculates the net distance of the x and y coordinates of two bounding boxes
@@ -169,6 +183,23 @@ static double CalculateMomentInertiaYaw(double mass, double length, double width
     return {netX, netY};
 }
 
+//! Calculates the net distance of the x and y coordinates of two bounding boxes
+//!
+//! \param vector       Vector which will be rotated
+//! \param yaw          Angle of rotation
+//! \return rotated vector
+[[maybe_unused]] static mantle_api::Vec3<units::length::meter_t> RotateYaw(const mantle_api::Vec3<units::length::meter_t> &vector, units::angle::radian_t angle)
+{
+    auto cosValue = units::math::cos(angle);
+    auto sinValue = units::math::sin(angle);
+    units::length::meter_t newX = vector.x * cosValue - vector.y * sinValue;
+    units::length::meter_t newY = vector.x * sinValue + vector.y * cosValue;
+
+    return {newX,
+            newY,
+            vector.z};
+}
+
 class IntersectionCalculation
 {
 public:
@@ -193,11 +224,11 @@ public:
      * @param[in] P Point to be queried
      * @returns true if point is within on the edges of the quadrilateral
      */
-    static OPENPASSCOMMONEXPORT bool IsWithin(const Common::Vector2d& A,
-                                                  const Common::Vector2d& B,
-                                                  const Common::Vector2d& C,
-                                                  const Common::Vector2d& D,
-                                                  const Common::Vector2d& P);
+    static OPENPASSCOMMONEXPORT bool IsWithin(const Common::Vector2d<units::length::meter_t> &A,
+                                              const Common::Vector2d<units::length::meter_t> &B,
+                                              const Common::Vector2d<units::length::meter_t> &C,
+                                              const Common::Vector2d<units::length::meter_t> &D,
+                                              const Common::Vector2d<units::length::meter_t> &P);
 
     //! \brief Calculates the intersection polygon of two quadrangles.
     //!
@@ -212,7 +243,7 @@ public:
     //! \param firstIsRectangular   specify that first quadrangele is rectangular
     //! \param secondIsRectangular  specify that second quadrangele is rectangular
     //! \return points of the intersection polygon
-    static OPENPASSCOMMONEXPORT std::vector<Common::Vector2d> GetIntersectionPoints(const std::vector<Common::Vector2d>& firstPoints, const std::vector<Common::Vector2d>& secondPoints, bool firstIsRectangular = true, bool secondIsRectangular = true);
+    static OPENPASSCOMMONEXPORT std::vector<Common::Vector2d<units::length::meter_t>> GetIntersectionPoints(const std::vector<Common::Vector2d<units::length::meter_t>> &firstPoints, const std::vector<Common::Vector2d<units::length::meter_t>> &secondPoints, bool firstIsRectangular = true, bool secondIsRectangular = true);
 
     //! \brief Calculates the intersection polygon of two quadrangles.
     //!
@@ -225,12 +256,12 @@ public:
     //! \param firstIsRectangular   specify that first quadrangele is rectangular
     //! \param secondIsRectangular  specify that second quadrangele is rectangular
     //! \return points of the intersection polygon
-    static OPENPASSCOMMONEXPORT std::vector<Common::Vector2d> GetIntersectionPoints(const polygon_t& firstPolygon, const polygon_t& secondPolygon, bool firstIsRectangular = true, bool secondIsRectangular = true);
+    static OPENPASSCOMMONEXPORT std::vector<Common::Vector2d<units::length::meter_t>> GetIntersectionPoints(const polygon_t &firstPolygon, const polygon_t &secondPolygon, bool firstIsRectangular = true, bool secondIsRectangular = true);
 
 private:
-    static bool OnEdge(const Common::Vector2d& A,
-                       const Common::Vector2d& B,
-                       const Common::Vector2d& P);
+    static bool OnEdge(const Common::Vector2d<units::length::meter_t> &A,
+                       const Common::Vector2d<units::length::meter_t> &B,
+                       const Common::Vector2d<units::length::meter_t> &P);
 
     static bool WithinBarycentricCoords(double dot00,
                                         double dot02,
@@ -294,16 +325,16 @@ private:
 static RouteElement GetRoadWithLowestHeading(const GlobalRoadPositions& roadPositions, const WorldInterface& world)
 {
     RouteElement bestFitting;
-    double minHeading = std::numeric_limits<double>::max();
+    units::angle::radian_t minHeading{std::numeric_limits<double>::max()};
     for (const auto [roadId, position] : roadPositions)
     {
-        const auto absHeadingInOdDirection = std::abs(position.roadPosition.hdg);
+        const auto absHeadingInOdDirection = units::math::abs(position.roadPosition.hdg);
         if (absHeadingInOdDirection < minHeading && world.IsDirectionalRoadExisting(roadId, true))
         {
             bestFitting = {roadId, true};
             minHeading = absHeadingInOdDirection;
         }
-        const auto absHeadingAgainstOdDirection = std::abs(SetAngleToValidRange(position.roadPosition.hdg + M_PI));
+        const auto absHeadingAgainstOdDirection = units::math::abs(SetAngleToValidRange(position.roadPosition.hdg + units::angle::radian_t(M_PI)));
         if (absHeadingAgainstOdDirection < minHeading && world.IsDirectionalRoadExisting(roadId, false))
         {
             bestFitting = {roadId, false};
@@ -371,15 +402,15 @@ public:
     //!
     //! @return true if collision would happen
     //-----------------------------------------------------------------------------
-    static bool WillCrashDuringBrake(double sDelta, double vEgo, double aEgo, double vFront, double aFront)
+    static bool WillCrashDuringBrake(units::length::meter_t sDelta, units::velocity::meters_per_second_t vEgo, units::acceleration::meters_per_second_squared_t aEgo, units::velocity::meters_per_second_t  vFront, units::acceleration::meters_per_second_squared_t aFront)
     {
         //Calculate the intersection of the vehicles trajactory (quadratic functions)
 
-        auto stopTime = - vEgo / aEgo;   //timepoint where ego stops
+        units::time::second_t stopTime = - vEgo / aEgo;   //timepoint where ego stops
         bool frontStopsEarlier = false;
-        double frontTravelDistance;
+        units::length::meter_t frontTravelDistance;
 
-        if (aFront < 0)
+        if (aFront < 0_mps_sq)
         {
             auto stopTimeFront = - vFront / aFront;
             if (stopTimeFront < stopTime) //special case: FrontVehicle stops earlier than Ego
@@ -400,8 +431,8 @@ public:
             }
 
             // intersection of lines
-            auto intersectionTime = sDelta / (vEgo - vFront);
-            if (0 <= intersectionTime && intersectionTime <= stopTime)
+            units::time::second_t intersectionTime = sDelta / (vEgo - vFront);
+            if (0_s <= intersectionTime && intersectionTime <= stopTime)
             {
                 if (frontStopsEarlier)
                 {
@@ -417,23 +448,23 @@ public:
         }
 
         // intersection of quadratic functions
-        auto discriminant = (vEgo - vFront) * (vEgo - vFront) + 2 * (aEgo - aFront) * sDelta;
+        units::unit_t<units::squared<units::velocity::meters_per_second>> discriminant = (vEgo - vFront) * (vEgo - vFront) + 2 * (aEgo - aFront) * sDelta;
 
-        if (discriminant < 0)
+        if (discriminant < units::unit_t<units::squared<units::velocity::meters_per_second>>(0))
         {
             return false;
         }
 
 
-        auto intersectionPoint1 = ((vFront - vEgo) + std::sqrt(discriminant)) / (aEgo - aFront);
-        auto intersectionPoint2 = ((vFront - vEgo) - std::sqrt(discriminant)) / (aEgo - aFront);
+        units::time::second_t intersectionPoint1 = ((vFront - vEgo) + units::math::sqrt(discriminant)) / (aEgo - aFront);
+        units::time::second_t intersectionPoint2 = ((vFront - vEgo) - units::math::sqrt(discriminant)) / (aEgo - aFront);
 
-        if ((0 <= intersectionPoint1 && intersectionPoint1 <= stopTime) ||
-            (0 <= intersectionPoint2 && intersectionPoint2 <= stopTime))
+        if ((0_s <= intersectionPoint1 && intersectionPoint1 <= stopTime) ||
+            (0_s <= intersectionPoint2 && intersectionPoint2 <= stopTime))
         {
             if (frontStopsEarlier)
             {
-                auto travelDistance = - 0.5 * stopTime * stopTime * aEgo;
+                units::length::meter_t travelDistance = - 0.5 * stopTime * stopTime * aEgo;
                 if (travelDistance < sDelta + frontTravelDistance)
                 {
                     return false;
@@ -462,16 +493,16 @@ public:
     //!
     //! @return true if collision would happen
     //-----------------------------------------------------------------------------
-    static bool WillCrash(double sDelta, double vEgo, double assumedBrakeAccelerationEgo, double vFront, double aFront, double assumedTtb)
+    static bool WillCrash(units::length::meter_t sDelta, units::velocity::meters_per_second_t vEgo, units::acceleration::meters_per_second_squared_t assumedBrakeAccelerationEgo, units::velocity::meters_per_second_t  vFront, units::acceleration::meters_per_second_squared_t aFront, units::time::second_t assumedTtb)
     {
         auto sEgoAtTtb = vEgo * assumedTtb;
 
         // estimate values for front vehicle at t=ttb
-        auto stopTimeFront = aFront < 0 ? -vFront/aFront : std::numeric_limits<double>::max();
-        auto tFront = std::min(stopTimeFront, assumedTtb);
+        auto stopTimeFront = aFront < 0_mps_sq ? -vFront/aFront : units::time::second_t(std::numeric_limits<double>::max());
+        auto tFront = units::math::min(stopTimeFront, assumedTtb);
         auto sFrontAtTtb = sDelta + vFront*tFront + aFront*tFront*tFront/2;
-        auto vFrontAtTtb = stopTimeFront < assumedTtb ? 0 : vFront + aFront*assumedTtb;
-        auto aFrontAtTtb = stopTimeFront < assumedTtb ? 0 : aFront;
+        auto vFrontAtTtb = stopTimeFront < assumedTtb ? 0_mps : vFront + aFront*assumedTtb;
+        auto aFrontAtTtb = stopTimeFront < assumedTtb ? 0_mps_sq : aFront;
 
         if(sFrontAtTtb <= sEgoAtTtb) {
             return true;
@@ -481,15 +512,15 @@ public:
     }
 
     //! Calculate the width left of the reference point of a leaning object
-    static double GetWidthLeft(double width, double height, double roll)
+    static units::length::meter_t GetWidthLeft(units::length::meter_t width, units::length::meter_t height, units::angle::radian_t roll)
     {
-        return 0.5 * width * std::cos(roll) + (roll < 0 ? height * std::sin(-roll) : 0);
+        return 0.5 * width * units::math::cos(roll) + (roll < 0_rad ? height * units::math::sin(-roll) : 0_m);
     }
 
     //! Calculate the width right of the reference point of a leaning object
-    static double GetWidthRight(double width, double height, double roll)
+    static units::length::meter_t GetWidthRight(units::length::meter_t width, units::length::meter_t height, units::angle::radian_t roll)
     {
-        return 0.5 * width * std::cos(roll) + (roll > 0 ? height * std::sin(roll) : 0);
+        return 0.5 * width * units::math::cos(roll) + (roll > 0_rad ? height * units::math::sin(roll) : 0_m);
     }
 };
 
@@ -556,19 +587,19 @@ public:
     //! @brief Structure to hold all necessary world object parameters for TTC calculation
     //-----------------------------------------------------------------------------
     struct TtcParameters{
-        double length;
-        double widthLeft;
-        double widthRight;
-        double frontLength; // distance from reference point of object to leading edge of object
-        double backLength;  // distance from reference point to back edge of object
+        units::length::meter_t length;
+        units::length::meter_t widthLeft;
+        units::length::meter_t widthRight;
+        units::length::meter_t frontLength; // distance from reference point of object to leading edge of object
+        units::length::meter_t backLength;  // distance from reference point to back edge of object
         point_t position;
-        double velocityX;
-        double velocityY;
-        double accelerationX;
-        double accelerationY;
-        double yaw;
-        double yawRate;
-        double yawAcceleration;
+        units::velocity::meters_per_second_t velocityX;
+        units::velocity::meters_per_second_t velocityY;
+        units::acceleration::meters_per_second_squared_t accelerationX;
+        units::acceleration::meters_per_second_squared_t accelerationY;
+        units::angle::radian_t yaw;
+        units::angular_velocity::radians_per_second_t yawRate;
+        units::angular_acceleration::radians_per_second_squared_t yawAcceleration;
     };
     //-----------------------------------------------------------------------------
     //! @brief Calculates the time to collision between two (moving) objects
@@ -584,8 +615,8 @@ public:
     //!
     //! @return time to collsion between the two objects
     //-----------------------------------------------------------------------------
-    static double CalculateObjectTTC(const AgentInterface &agent, const WorldObjectInterface &detectedObject, double maxTtc,
-                                     double collisionDetectionLongitudinalBoundary, double collisionDetectionLateralBoundary, double cycleTime)
+    static units::time::second_t CalculateObjectTTC(const AgentInterface &agent, const WorldObjectInterface &detectedObject, units::time::second_t maxTtc,
+                                     units::length::meter_t collisionDetectionLongitudinalBoundary, units::length::meter_t collisionDetectionLateralBoundary, double cycleTime)
     {
         TtcParameters agentParameters = GetTTCObjectParameters(&agent, collisionDetectionLongitudinalBoundary, collisionDetectionLateralBoundary);
         TtcParameters objectParameters = GetTTCObjectParameters(&detectedObject, collisionDetectionLongitudinalBoundary, collisionDetectionLateralBoundary);
@@ -593,10 +624,10 @@ public:
         return CalculateObjectTTC(agentParameters, objectParameters, maxTtc, cycleTime);
     }
 
-    static double CalculateObjectTTC(TtcParameters agentParameters, TtcParameters objectParameters, double maxTtc, double cycleTime)
+    static units::time::second_t CalculateObjectTTC(TtcParameters agentParameters, TtcParameters objectParameters, units::time::second_t maxTtc, double cycleTime)
     {
-        double timestep = cycleTime / 1000.0;
-        double ttc = 0.0;
+        const units::time::second_t timestep{cycleTime / 1000.0};
+        units::time::second_t ttc{0.0};
 
         while (ttc <= maxTtc)
         {
@@ -615,7 +646,7 @@ public:
 
         }
         // No collision detected
-        return std::numeric_limits<double>::max();
+        return units::time::second_t(std::numeric_limits<double>::max());
     }
 private:
     //-----------------------------------------------------------------------------
@@ -627,7 +658,7 @@ private:
     //!
     //! @return parameters needed for TTC calculation
     //-----------------------------------------------------------------------------
-    static TtcParameters GetTTCObjectParameters(const WorldObjectInterface *object, double collisionDetectionLongitudinalBoundary, double collisionDetectionLateralBoundary)
+    static TtcParameters GetTTCObjectParameters(const WorldObjectInterface *object, units::length::meter_t collisionDetectionLongitudinalBoundary, units::length::meter_t collisionDetectionLateralBoundary)
     {
         TtcParameters parameters;
 
@@ -639,14 +670,14 @@ private:
         parameters.backLength = parameters.length - parameters.frontLength; // distance from reference point to back edge of object
 
         // inital object values at current position
-        parameters.position = { object->GetPositionX(), object->GetPositionY() };
+        parameters.position = { units::unit_cast<double>(object->GetPositionX()), units::unit_cast<double>(object->GetPositionY()) };
         parameters.velocityX = object->GetVelocity().x;
         parameters.velocityY = object->GetVelocity().y;
         parameters.accelerationX = object->GetAcceleration().x;
         parameters.accelerationY = object->GetAcceleration().y;
         parameters.yaw = object->GetYaw();
-        parameters.yawRate = 0.0;
-        parameters.yawAcceleration = 0.0;
+        parameters.yawRate = 0.0_rad_per_s;
+        parameters.yawAcceleration = 0.0_rad_per_s_sq;
 
         if (const AgentInterface* objectAsAgent = dynamic_cast<const AgentInterface*>(object)) // cast returns nullptr if unsuccessful
         {
@@ -671,12 +702,11 @@ private:
 
         // construct corner points from reference point position and current yaw angle
         polygon_t box;
-
-        bg::append(box, point_t{ parameters.position.get<0>() - std::cos(parameters.yaw) * parameters.backLength  + std::sin(parameters.yaw) * parameters.widthRight	,		parameters.position.get<1>() - std::sin(parameters.yaw) * parameters.backLength  - std::cos(parameters.yaw) * parameters.widthRight }); // back right corner
-        bg::append(box, point_t{ parameters.position.get<0>() - std::cos(parameters.yaw) * parameters.backLength  - std::sin(parameters.yaw) * parameters.widthLeft		,		parameters.position.get<1>() - std::sin(parameters.yaw) * parameters.backLength  + std::cos(parameters.yaw) * parameters.widthLeft }); // back left corner
-        bg::append(box, point_t{ parameters.position.get<0>() + std::cos(parameters.yaw) * parameters.frontLength - std::sin(parameters.yaw) * parameters.widthLeft		,		parameters.position.get<1>() + std::sin(parameters.yaw) * parameters.frontLength + std::cos(parameters.yaw) * parameters.widthLeft }); // front left corner
-        bg::append(box, point_t{ parameters.position.get<0>() + std::cos(parameters.yaw) * parameters.frontLength + std::sin(parameters.yaw) * parameters.widthRight	,		parameters.position.get<1>() + std::sin(parameters.yaw) * parameters.frontLength - std::cos(parameters.yaw) * parameters.widthRight }); // front right corner
-        bg::append(box, point_t{ parameters.position.get<0>() - std::cos(parameters.yaw) * parameters.backLength  + std::sin(parameters.yaw) * parameters.widthRight	,		parameters.position.get<1>() - std::sin(parameters.yaw) * parameters.backLength  - std::cos(parameters.yaw) * parameters.widthRight }); // back right corner
+        bg::append(box, point_t{ units::unit_cast<double>(units::length::meter_t(parameters.position.get<0>()) - units::math::cos(parameters.yaw) * parameters.backLength  + units::math::sin(parameters.yaw) * parameters.widthRight)	,		units::unit_cast<double>(units::length::meter_t(parameters.position.get<1>()) - units::math::sin(parameters.yaw) * parameters.backLength  - units::math::cos(parameters.yaw) * parameters.widthRight) }); // back right corner
+        bg::append(box, point_t{ units::unit_cast<double>(units::length::meter_t(parameters.position.get<0>()) - units::math::cos(parameters.yaw) * parameters.backLength  - units::math::sin(parameters.yaw) * parameters.widthLeft)		,		units::unit_cast<double>(units::length::meter_t(parameters.position.get<1>()) - units::math::sin(parameters.yaw) * parameters.backLength  + units::math::cos(parameters.yaw) * parameters.widthLeft) }); // back left corner
+        bg::append(box, point_t{ units::unit_cast<double>(units::length::meter_t(parameters.position.get<0>()) + units::math::cos(parameters.yaw) * parameters.frontLength - units::math::sin(parameters.yaw) * parameters.widthLeft)		,		units::unit_cast<double>(units::length::meter_t(parameters.position.get<1>()) + units::math::sin(parameters.yaw) * parameters.frontLength + units::math::cos(parameters.yaw) * parameters.widthLeft) }); // front left corner
+        bg::append(box, point_t{ units::unit_cast<double>(units::length::meter_t(parameters.position.get<0>()) + units::math::cos(parameters.yaw) * parameters.frontLength + units::math::sin(parameters.yaw) * parameters.widthRight)	,		units::unit_cast<double>(units::length::meter_t(parameters.position.get<1>()) + units::math::sin(parameters.yaw) * parameters.frontLength - units::math::cos(parameters.yaw) * parameters.widthRight) }); // front right corner
+        bg::append(box, point_t{ units::unit_cast<double>(units::length::meter_t(parameters.position.get<0>()) - units::math::cos(parameters.yaw) * parameters.backLength  + units::math::sin(parameters.yaw) * parameters.widthRight)	,		units::unit_cast<double>(units::length::meter_t(parameters.position.get<1>()) - units::math::sin(parameters.yaw) * parameters.backLength  - units::math::cos(parameters.yaw) * parameters.widthRight) }); // back right corner
         return box;
     }
     //-----------------------------------------------------------------------------
@@ -686,16 +716,19 @@ private:
     //! @param [in]   timestep      time resolution of the TTC simulation
     //!
     //-----------------------------------------------------------------------------
-    static void PropagateParametersForward(TtcParameters &parameters, const double timestep)
+    static void PropagateParametersForward(TtcParameters &parameters, const units::time::second_t timestep)
     {
-        parameters.position.set<0>(parameters.position.get<0>() + 0.5 * parameters.accelerationX * timestep * timestep + parameters.velocityX * timestep); // x-coordinate
-        parameters.position.set<1>(parameters.position.get<1>() + 0.5 * parameters.accelerationY * timestep * timestep + parameters.velocityY * timestep); // y-coordinate
-        double deltaYaw = 0.5 * parameters.yawAcceleration * timestep * timestep + parameters.yawRate * timestep;
+        const units::length::meter_t positionX(units::length::meter_t(parameters.position.get<0>()) + 0.5 * parameters.accelerationX * timestep * timestep + parameters.velocityX * timestep);
+        const units::length::meter_t positionY(units::length::meter_t(parameters.position.get<1>()) + 0.5 * parameters.accelerationY * timestep * timestep + parameters.velocityY * timestep);
+
+        parameters.position.set<0>(units::unit_cast<double>(positionX)); // x-coordinate
+        parameters.position.set<1>(units::unit_cast<double>(positionY)); // y-coordinate
+        const units::angle::radian_t deltaYaw = 0.5 * parameters.yawAcceleration * timestep * timestep + parameters.yawRate * timestep;
         parameters.yaw += deltaYaw;
-        parameters.velocityX = std::cos(deltaYaw) * parameters.velocityX - std::sin(deltaYaw) * parameters.velocityY;
-        parameters.velocityY = std::sin(deltaYaw) * parameters.velocityX + std::cos(deltaYaw) * parameters.velocityY;
-        parameters.accelerationX = std::cos(deltaYaw) * parameters.accelerationX - std::sin(deltaYaw) * parameters.accelerationY;
-        parameters.accelerationY = std::sin(deltaYaw) * parameters.accelerationX + std::cos(deltaYaw) * parameters.accelerationY;
+        parameters.velocityX = units::math::cos(deltaYaw) * parameters.velocityX - units::math::sin(deltaYaw) * parameters.velocityY;
+        parameters.velocityY = units::math::sin(deltaYaw) * parameters.velocityX + units::math::cos(deltaYaw) * parameters.velocityY;
+        parameters.accelerationX = units::math::cos(deltaYaw) * parameters.accelerationX - units::math::sin(deltaYaw) * parameters.accelerationY;
+        parameters.accelerationY = units::math::sin(deltaYaw) * parameters.accelerationX + units::math::cos(deltaYaw) * parameters.accelerationY;
         parameters.velocityX += parameters.accelerationX * timestep;
         parameters.velocityY += parameters.accelerationY * timestep;
         parameters.yawRate += parameters.yawAcceleration * timestep;
diff --git a/sim/src/common/dynamicsSignal.h b/sim/src/common/dynamicsSignal.h
index 4e7bc52b98fb196865e474cc97d5e09bc1fbe269..67b7361eb7506abb04b843593705b8c3a218f2d6 100644
--- a/sim/src/common/dynamicsSignal.h
+++ b/sim/src/common/dynamicsSignal.h
@@ -33,29 +33,9 @@ public:
     DynamicsSignal(ComponentState componentState) : ComponentStateSignalInterface{componentState}{}
 
     DynamicsSignal(ComponentState componentState,
-                  double acceleration,
-                  double velocity,
-                  double positionX,
-                  double positionY,
-                  double yaw,
-                  double yawRate,
-                  double yawAcceleration,
-                  double roll,
-                  double steeringWheelAngle,
-                  double centripetalAcceleration,
-                  double travelDistance) :
+                   DynamicsInformation dynamicsInformation) :
         ComponentStateSignalInterface{componentState},
-        acceleration(acceleration),
-        velocity(velocity),
-        positionX(positionX),
-        positionY(positionY),
-        yaw(yaw),
-        yawRate(yawRate),
-        yawAcceleration(yawAcceleration),
-        roll(roll),
-        steeringWheelAngle(steeringWheelAngle),
-        centripetalAcceleration(centripetalAcceleration),
-        travelDistance(travelDistance)
+        dynamicsInformation(dynamicsInformation)
     {}
 
     DynamicsSignal(DynamicsSignal &other) = default;
@@ -74,30 +54,20 @@ public:
     {
         std::ostringstream stream;
         stream << COMPONENTNAME << std::endl;
-        stream << "acceleration: " << acceleration << std::endl;
-        stream << "velocity: " << velocity << std::endl;
-        stream << "positionX: " << positionX << std::endl;
-        stream << "positionY: " << positionY << std::endl;
-        stream << "yaw: " << yaw << std::endl;
-        stream << "yawRate: " << yawRate << std::endl;
-        stream << "yawAcceleration" << yawAcceleration << std::endl;
-        stream << "roll: " << roll << std::endl;
-        stream << "steeringWheelAngle: " << steeringWheelAngle << std::endl;
-        stream << "centripetalAcceleration: " << centripetalAcceleration << std::endl;
-        stream << "travelDistance: " << travelDistance << std::endl;
+        stream << "acceleration: " << dynamicsInformation.acceleration << std::endl;
+        stream << "velocity: " << dynamicsInformation.velocity << std::endl;
+        stream << "positionX: " << dynamicsInformation.positionX << std::endl;
+        stream << "positionY: " << dynamicsInformation.positionY << std::endl;
+        stream << "yaw: " << dynamicsInformation.yaw << std::endl;
+        stream << "yawRate: " << dynamicsInformation.yawRate << std::endl;
+        stream << "yawAcceleration" << dynamicsInformation.yawAcceleration << std::endl;
+        stream << "roll: " << dynamicsInformation.roll << std::endl;
+        stream << "steeringWheelAngle: " << dynamicsInformation.steeringWheelAngle << std::endl;
+        stream << "centripetalAcceleration: " << dynamicsInformation.centripetalAcceleration << std::endl;
+        stream << "travelDistance: " << dynamicsInformation.travelDistance << std::endl;
         return stream.str();
     }
 
-    double acceleration = 0.0;
-    double velocity = 0.0;
-    double positionX = 0.0;
-    double positionY = 0.0;
-    double yaw = 0.0;
-    double yawRate = 0.0;
-    double yawAcceleration = 0.0;
-    double roll = 0.0;
-    double steeringWheelAngle = 0.0;
-    double centripetalAcceleration = 0.0;
-    double travelDistance = 0.0;
+    DynamicsInformation dynamicsInformation{};
 };
 
diff --git a/sim/src/common/eventDetectorDefinitions.h b/sim/src/common/eventDetectorDefinitions.h
deleted file mode 100644
index 696f6e9dd4bdef8483f5ff9b471197d1184920c4..0000000000000000000000000000000000000000
--- a/sim/src/common/eventDetectorDefinitions.h
+++ /dev/null
@@ -1,241 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 HLRS, University of Stuttgart
- *               2019-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include <optional>
-#include <string>
-#include <variant>
-#include "common/openScenarioDefinitions.h"
-#include "include/agentInterface.h"
-#include "include/worldInterface.h"
-#include "common/opExport.h"
-
-namespace openScenario
-{
-
-namespace ConditionEquality
-{
-//! Maximum difference between two values to be consired equal for OpenSCENARIO rule equal_to
-static constexpr double EPSILON = 1e-12;
-}
-
-enum class Rule
-{
-    LessThan = 0,
-    EqualTo,
-    GreaterThan
-};
-
-
-// OpenScenario ByEntity Conditions
-class OPENPASSCOMMONEXPORT ByEntityCondition
-{
-public:
-    ByEntityCondition(const std::vector<std::string> &triggeringEntityNames):
-        triggeringEntityNames(triggeringEntityNames)
-    {}
-    ByEntityCondition(const ByEntityCondition&) = default;
-    virtual ~ByEntityCondition();
-
-    std::vector<AgentInterface *> GetTriggeringAgents(WorldInterface* const world) const
-    {
-        std::vector<AgentInterface *> triggeringAgents {};
-
-        if(triggeringEntityNames.empty())
-        {
-            const auto &agentMap = world->GetAgents();
-            std::transform(agentMap.cbegin(),
-                           agentMap.cend(),
-                           std::back_inserter(triggeringAgents),
-                           [] (const auto &agentPair) -> AgentInterface*
-                           {
-                               return agentPair.second;
-                           });
-        }
-        else
-        {
-            for (const auto& triggeringEntityName : triggeringEntityNames)
-            {
-                const auto triggeringAgent = world->GetAgentByName(triggeringEntityName);
-
-                if(triggeringAgent != nullptr)
-                {
-                    triggeringAgents.emplace_back(triggeringAgent);
-                }
-            }
-        }
-
-        return triggeringAgents;
-    }
-
-private:
-    const std::vector<std::string> triggeringEntityNames;
-};
-
-class OPENPASSCOMMONEXPORT TimeToCollisionCondition : public ByEntityCondition
-{
-public:
-    TimeToCollisionCondition(const std::vector<std::string>& triggeringEntityNames,
-                             const std::string& referenceEntityName,
-                             const double targetTTC,
-                             const Rule rule):
-        ByEntityCondition(triggeringEntityNames),
-        referenceEntityName(referenceEntityName),
-        targetTTC(targetTTC),
-        rule(rule)
-    {}
-    TimeToCollisionCondition(const TimeToCollisionCondition&) = default;
-    virtual ~TimeToCollisionCondition();
-
-    AgentInterfaces IsMet(WorldInterface * const world) const;
-
-private:
-    const std::string referenceEntityName;
-    const double targetTTC;
-    const Rule rule;
-};
-
-class OPENPASSCOMMONEXPORT TimeHeadwayCondition : public ByEntityCondition
-{
-public:
-    TimeHeadwayCondition(const std::vector<std::string>& triggeringEntityNames,
-                         const std::string& referenceEntityName,
-                         const double targetTHW,
-                         const bool freeSpace,
-                         const Rule rule):
-        ByEntityCondition(triggeringEntityNames),
-        referenceEntityName(referenceEntityName),
-        targetTHW(targetTHW),
-        freeSpace(freeSpace),
-        rule(rule)
-    {}
-    TimeHeadwayCondition(const TimeHeadwayCondition&) = default;
-    virtual ~TimeHeadwayCondition();
-
-    AgentInterfaces IsMet(WorldInterface * const world) const;
-
-private:
-    const std::string referenceEntityName;
-    const double targetTHW;
-    const bool freeSpace;
-    const Rule rule;
-};
-
-class OPENPASSCOMMONEXPORT ReachPositionCondition : public ByEntityCondition
-{
-public:
-    ReachPositionCondition(const std::vector<std::string>& triggeringEntityNames,
-                           const double tolerance,
-                           const openScenario::Position position):
-        ByEntityCondition(triggeringEntityNames),
-        tolerance(tolerance),
-        position(position)
-    {
-        if (tolerance < 0)
-        {
-            throw std::runtime_error("Reach Position Tolerance must be greater than or equal to 0");
-        }
-
-        if (std::holds_alternative<openScenario::RoadPosition>(position))
-        {
-            const auto roadPosition = std::get<openScenario::RoadPosition>(position);
-
-            if (roadPosition.s < 0)
-            {
-                throw std::runtime_error("Reach Position Target S Coordinate must be greater than or equal to 0");
-            }
-
-        }
-    }
-    ReachPositionCondition(const ReachPositionCondition&) = default;
-    virtual ~ReachPositionCondition();
-
-    AgentInterfaces IsMet(WorldInterface * const world) const;
-
-private:
-    const double tolerance{};
-    const openScenario::Position position{};
-};
-
-class OPENPASSCOMMONEXPORT RelativeSpeedCondition : public ByEntityCondition
-{
-public:
-    RelativeSpeedCondition(const std::vector<std::string> &triggeringEntityNames,
-                           const std::string &referenceEntityName,
-                           const double value,
-                           const Rule rule):
-        ByEntityCondition(triggeringEntityNames),
-        referenceEntityName(referenceEntityName),
-        value(value),
-        rule(rule)
-    {}
-    RelativeSpeedCondition(const RelativeSpeedCondition&) = default;
-    virtual ~RelativeSpeedCondition();
-
-    AgentInterfaces IsMet(WorldInterface * const world) const;
-
-private:
-    const std::string referenceEntityName{};
-    const double value{};
-    const Rule rule{};
-};
-
-// OpenScenario ByValue Conditions
-class OPENPASSCOMMONEXPORT ByValueCondition
-{
-public:
-    ByValueCondition(const Rule rule):
-        rule(rule)
-    {}
-    ByValueCondition(const ByValueCondition&) = default;
-    virtual ~ByValueCondition();
-protected:
-    const Rule rule;
-};
-
-class OPENPASSCOMMONEXPORT SimulationTimeCondition : public ByValueCondition
-{
-public:
-    SimulationTimeCondition(const Rule rule,
-                            const double targetValueInSeconds):
-        ByValueCondition(rule),
-        targetValue(static_cast<int>(targetValueInSeconds * 1000.0))
-    {}
-    SimulationTimeCondition(const SimulationTimeCondition&) = default;
-    virtual ~SimulationTimeCondition();
-
-    bool IsMet(const int value) const;
-    int GetTargetValue() const;
-
-private:
-    const int targetValue;
-};
-
-using Condition = std::variant<ReachPositionCondition,
-                               RelativeSpeedCondition,
-                               SimulationTimeCondition,
-                               TimeToCollisionCondition,
-                               TimeHeadwayCondition>;
-using ConditionGroup = std::vector<Condition>;
-
-///
-/// \brief Event specific information collected from an openSCENARIO story
-///
-struct OPENPASSCOMMONEXPORT ConditionalEventDetectorInformation
-{
-    ActorInformation actorInformation{};
-    int numberOfExecutions{};             ///< Specifies number of executions. Use -1 for "unrestricted"
-    std::string eventName{};
-    ConditionGroup conditions{};
-};
-
-} // openScenario
diff --git a/sim/src/common/events/acquirePositionEvent.h b/sim/src/common/events/acquirePositionEvent.h
deleted file mode 100644
index 4bf6260544eabe1220ef9d46114ca682e688eade..0000000000000000000000000000000000000000
--- a/sim/src/common/events/acquirePositionEvent.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** @file  acquirePositionEvent.h
-* @brief This file contains all functions for AcquirePositionEvents.
-*
-* This class contains all functionality of the module. */
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <src/common/openScenarioDefinitions.h>
-#include <utility>
-
-#include "basicEvent.h"
-namespace openpass::events {
-
-class AcquirePositionEvent : public OpenScenarioEvent
-{
-public:
-    AcquirePositionEvent(int time,
-                         const std::string &eventName,
-                         const std::string &source,
-                         int agentId,
-                         openScenario::Position position) :
-        OpenScenarioEvent(time, eventName, source, {}, {{agentId}}), position(std::move(position))
-    {
-    }
-
-    static constexpr char TOPIC[]{"OpenSCENARIO/Position"};
-    const openScenario::Position position;
-};
-
-} // namespace openpass::events
diff --git a/sim/src/common/events/componentStateChangeEvent.h b/sim/src/common/events/componentStateChangeEvent.h
deleted file mode 100644
index fa95e400d806619f700b141254329d7a3c0bacc0..0000000000000000000000000000000000000000
--- a/sim/src/common/events/componentStateChangeEvent.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/events/basicEvent.h"
-#include "include/signalInterface.h"
-
-namespace openpass::events {
-
-//-----------------------------------------------------------------------------
-/** This class hold information about a  Component State Change Event
- *
- * \ingroup Event */
-//-----------------------------------------------------------------------------
-
-class ComponentStateChangeEvent : public OpenScenarioEvent
-{
-public:
-    static constexpr char TOPIC[] {"OpenSCENARIO/UserDefinedAction/CustomCommandAction/SetComponentState"};
-
-    ComponentStateChangeEvent(int time, std::string eventName, std::string source,
-                     openpass::type::TriggeringEntities triggeringAgents, openpass::type::AffectedEntities actingAgents,
-                     const std::string componentName, ComponentState componentState) :
-        OpenScenarioEvent{time, eventName, source, triggeringAgents, actingAgents},
-        componentName{std::move(componentName)},
-        componentState{std::move(componentState)}
-    {
-    }
-
-    const std::string componentName;
-    const ComponentState componentState;
-};
-
-} // namespace openpass::events
diff --git a/sim/src/common/events/laneChangeEvent.h b/sim/src/common/events/laneChangeEvent.h
deleted file mode 100644
index e260ff1c454e949d7c430686703b86899c1019e9..0000000000000000000000000000000000000000
--- a/sim/src/common/events/laneChangeEvent.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/events/basicEvent.h"
-#include "common/openScenarioDefinitions.h"
-
-namespace openpass::events {
-
-//-----------------------------------------------------------------------------
-/** This class implements all functionality of the LaneChangeEvent.
- *
- * \ingroup Event */
-//-----------------------------------------------------------------------------
-class LaneChangeEvent : public OpenScenarioEvent
-{
-public:
-    static constexpr char TOPIC[] {"OpenSCENARIO/PrivateAction/LateralAction/LaneChangeAction"};
-
-    LaneChangeEvent(int time, const std::string eventName, const std::string source, int agentId, const openScenario::LaneChangeParameter laneChange):
-        OpenScenarioEvent{time, std::move(eventName), std::move(source), {}, {{agentId}}},
-        laneChange{std::move(laneChange)}
-    {}
-
-    const openScenario::LaneChangeParameter laneChange;
-};
-
-} // namespace openpass::events
diff --git a/sim/src/common/events/speedActionEvent.h b/sim/src/common/events/speedActionEvent.h
deleted file mode 100644
index 2afc64b2ce8f643c6612f2b669fc665277ac7f4a..0000000000000000000000000000000000000000
--- a/sim/src/common/events/speedActionEvent.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/events/basicEvent.h"
-#include "common/openScenarioDefinitions.h"
-
-namespace openpass::events {
-
-//-----------------------------------------------------------------------------
-/** This class implements all functionality of the SpeedActionEvent.
- *
- * \ingroup Event */
-//-----------------------------------------------------------------------------
-class SpeedActionEvent : public OpenScenarioEvent
-{
-public:
-    static constexpr char TOPIC[] {"openSCENARIO/LongitudinalAction/SpeedAction"};
-
-    SpeedActionEvent(int time, const std::string eventName, const std::string source, int agentId, const openScenario::SpeedAction speedAction) :
-        OpenScenarioEvent(time, std::move(eventName), std::move(source), {}, {{agentId}}),
-        speedAction(std::move(speedAction))
-    {
-    }
-
-    const openScenario::SpeedAction speedAction;
-};
-
-} // namespace openpass::events
diff --git a/sim/src/common/events/trajectoryEvent.h b/sim/src/common/events/trajectoryEvent.h
deleted file mode 100644
index f98020ad8f97f00b7742c31d3311fd56dccb1398..0000000000000000000000000000000000000000
--- a/sim/src/common/events/trajectoryEvent.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** @file  TrajectoryEvent.h
-* @brief This file contains all functions for agent based events.
-*
-* This class contains all functionality of the module. */
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include "common/events/basicEvent.h"
-#include "common/openScenarioDefinitions.h"
-
-namespace openpass::events {
-
-//-----------------------------------------------------------------------------
-/** This class implements all functionality of the Trajectory Event.
- *
- * \ingroup Event */
-//-----------------------------------------------------------------------------
-class TrajectoryEvent : public OpenScenarioEvent
-{
-public:
-    static constexpr char TOPIC[] {"OpenSCENARIO/Trajectory"};
-
-    TrajectoryEvent(int time, const std::string eventName, const std::string source, int agentId, const openScenario::Trajectory trajectory):
-        OpenScenarioEvent{time, std::move(eventName), std::move(source), {}, {{agentId}}},
-        trajectory{std::move(trajectory)}
-    {}
-
-    const openScenario::Trajectory trajectory;
-};
-
-} // namespace openpass::events
-
diff --git a/sim/src/common/globalDefinitions.h b/sim/src/common/globalDefinitions.h
index 0f3323241c2b38659ffa8320679459958f058539..8838dcbf75b2aed26a3bafc7e945a047d02226af 100644
--- a/sim/src/common/globalDefinitions.h
+++ b/sim/src/common/globalDefinitions.h
@@ -18,13 +18,16 @@
 
 #pragma once
 
-#include "common/opMath.h"
+#include <MantleAPI/Traffic/entity_properties.h>
+#include <MantleAPI/Common/orientation.h>
 #include <list>
 #include <map>
 #include <string>
 #include <tuple>
 #include <vector>
 
+#include "common/opMath.h"
+
 // the following is a temporary workaround until the contribution is merged into osi
 #if defined(_WIN32) && !defined(NODLL)
 #define OSIIMPORT __declspec(dllimport)
@@ -98,6 +101,26 @@ enum class AgentCategory
     Any
 };
 
+namespace units {
+UNIT_ADD(curvature,
+         inverse_meter,
+         inverse_meters,
+         i_m,
+         units::unit<std::ratio<1>, units::inverse<units::length::meter>>)
+
+namespace category {
+typedef base_unit<detail::meter_ratio<-1>> curvature_unit;
+}
+
+UNIT_ADD_CATEGORY_TRAIT(curvature)
+
+using inertia = unit_t<compound_unit<mass::kilogram, squared<length::meter>>>;
+using impulse = unit_t<compound_unit<force::newton, time::second>>;
+
+// Radian are by default unitless, but the units.h explicitly defines it as a unit. This leads to several typematch errors in calculations. Therefore the inverse_radian is used to remove the radian type.
+using inverse_radian = units::unit_t<units::inverse<units::angle::radian>>;
+} // namespace units
+
 namespace openpass::utils {
 
 /// @brief constexpr map for transforming the a corresponding enumeration into
@@ -118,96 +141,92 @@ inline std::string to_string(AgentCategory agentCategory) noexcept
     return std::string(to_cstr(agentCategory));
 }
 
-} // namespace util
+} // namespace openpass::utils
 
 //-----------------------------------------------------------------------------
 //! Agent type classification
 //-----------------------------------------------------------------------------
-enum class AgentVehicleType
-{
-    NONE = -2,
-    Undefined = -1,
-    Car = 0,
-    Pedestrian = 1,
-    Motorbike = 2,
-    Bicycle = 3,
-    Truck = 4
-};
-
 namespace openpass::utils {
 
 /// @brief constexpr map for transforming the a corresponding enumeration into
 ///        a string representation: try to_cstr(EnumType) or to_string(EnumType)
-static constexpr std::array<const char *, 7> AgentVehicleTypeMapping{
-    "NONE",
-    "Undefined",
-    "Car",
+static constexpr std::array<const char *, 4> EntityTypeMapping{
+    "Other",
+    "Vehicle",
     "Pedestrian",
+    "Animal"};
+
+static constexpr std::array<const char *, 16> VehicleClassificationMapping{
+    "Other",
+    "Small_car",
+    "Compact_car",
+    "Medium_car",
+    "Luxury_car",
+    "Delivery_van",
+    "Heavy_truck",
+    "Semitrailer",
+    "Trailer",
     "Motorbike",
     "Bicycle",
-    "Truck"};
+    "Bus",
+    "Tram",
+    "Train",
+    "Wheelchair",
+    "Invalid"};
 
-
-constexpr const char *to_cstr(AgentVehicleType agentVehicleType)
+constexpr const char *to_cstr(mantle_api::EntityType entityType)
 {
-    return AgentVehicleTypeMapping[static_cast<size_t>(agentVehicleType) -
-                                   static_cast<size_t>(AgentVehicleType::NONE)];
+    return EntityTypeMapping[static_cast<std::size_t>(entityType) - 1];
 }
 
-inline std::string to_string(AgentVehicleType agentVehicleType) noexcept
+constexpr const char *to_cstr(mantle_api::VehicleClass vehicleClassification)
 {
-    return std::string(to_cstr(agentVehicleType));
+    if (vehicleClassification == mantle_api::VehicleClass::kInvalid)
+    {
+        return VehicleClassificationMapping.back();
+    }
+    else
+    {
+        return VehicleClassificationMapping[static_cast<std::size_t>(vehicleClassification) - 1];
+    }
 }
 
-} // namespace util
+inline std::string to_string(mantle_api::EntityType entityType) noexcept
+{
+    return std::string(to_cstr(entityType));
+}
 
+inline std::string to_string(mantle_api::VehicleClass vehicleClassification) noexcept
+{
+    return std::string(to_cstr(vehicleClassification));
+}
 
-/// @brief convert a vehicle type name to VehicleType enum
-inline AgentVehicleType GetAgentVehicleType(const std::string &strVehicleType)
+inline bool IsCar(mantle_api::VehicleClass vehicleClassification)
 {
-    if (0 == strVehicleType.compare("Car"))
+    if (vehicleClassification == mantle_api::VehicleClass::kSmall_car || vehicleClassification == mantle_api::VehicleClass::kCompact_car || vehicleClassification == mantle_api::VehicleClass::kMedium_car || vehicleClassification == mantle_api::VehicleClass::kLuxury_car)
     {
-        return AgentVehicleType::Car;
+        return true;
     }
-    else if (0 == strVehicleType.compare("Pedestrian"))
+    else
     {
-        return AgentVehicleType::Pedestrian;
+        return false;
     }
-    else if (0 == strVehicleType.compare("Motorbike"))
-    {
-        return AgentVehicleType::Motorbike;
-    }
-    else if (0 == strVehicleType.compare("Bicycle"))
-    {
-        return AgentVehicleType::Bicycle;
-    }
-    else if (0 == strVehicleType.compare("Truck"))
-    {
-        return AgentVehicleType::Truck;
-    }
-    return AgentVehicleType::Undefined;
-}
-
-// convert a AgentVehicleType to VehicleType string
-inline std::string GetAgentVehicleTypeStr(const AgentVehicleType &vehicleType)
-{
-    return (vehicleType == AgentVehicleType::Car) ? "Car" : (vehicleType == AgentVehicleType::Pedestrian) ? "Pedestrian" : (vehicleType == AgentVehicleType::Motorbike) ? "Motorbike" : (vehicleType == AgentVehicleType::Bicycle) ? "Bicycle" : (vehicleType == AgentVehicleType::Truck) ? "Truck" : "unknown type";
 }
 
-// convert a string of type code to VehicleType string
-inline std::string GetAgentVehicleTypeStr(const std::string &vehicleTypeCode)
+inline bool IsTruck(mantle_api::VehicleClass vehicleClassification)
 {
-    try
+    if (vehicleClassification == mantle_api::VehicleClass::kHeavy_truck || vehicleClassification == mantle_api::VehicleClass::kSemitrailer)
     {
-        AgentVehicleType vehicleType = static_cast<AgentVehicleType>(std::stoi(vehicleTypeCode));
-        return GetAgentVehicleTypeStr(vehicleType);
+        return true;
     }
-    catch (...)
+    else
     {
-        return "unknown type";
+        return false;
     }
 }
 
+} // namespace openpass::utils
+
 //! State of indicator lever
 enum class IndicatorLever
 {
@@ -229,10 +248,10 @@ struct Position
     Position()
     {
     }
-    Position(double x,
-             double y,
-             double yaw,
-             double curvature) :
+    Position(units::length::meter_t x,
+             units::length::meter_t y,
+             units::angle::radian_t yaw,
+             units::curvature::inverse_meter_t curvature) :
         xPos(x),
         yPos(y),
         yawAngle(yaw),
@@ -240,10 +259,10 @@ struct Position
     {
     }
 
-    double xPos{0};
-    double yPos{0};
-    double yawAngle{0};
-    double curvature{0};
+    units::length::meter_t xPos{0};
+    units::length::meter_t yPos{0};
+    units::angle::radian_t yawAngle{0};
+    units::curvature::inverse_meter_t curvature{0};
 };
 
 //! Enum of potential types of marks.
@@ -303,45 +322,6 @@ enum class Side
     Right
 };
 
-struct VehicleModelParameters
-{
-    AgentVehicleType vehicleType;
-
-    struct BoundingBoxCenter
-    {
-        double x;
-        double y;
-        double z;
-    } boundingBoxCenter;
-
-    struct BoundingBoxDimensions
-    {
-        double width;
-        double length;
-        double height;
-    } boundingBoxDimensions;
-
-    struct Performance
-    {
-        double maxSpeed;
-        double maxAcceleration;
-        double maxDeceleration;
-    } performance;
-
-    struct Axle
-    {
-        double maxSteering;
-        double wheelDiameter;
-        double trackWidth;
-        double positionX;
-        double positionZ;
-    };
-    Axle frontAxle;
-    Axle rearAxle;
-
-    std::map<std::string, double> properties;
-};
-
 enum class AdasType
 {
     Safety = 0,
@@ -371,13 +351,13 @@ enum class LaneCategory
 //! Defines which traffic rules are in effect
 struct TrafficRules
 {
-    double openSpeedLimit; //!< maximum allowed speed if not restricted by signs
+    double openSpeedLimit;         //!< maximum allowed speed if not restricted by signs
     double openSpeedLimitTrucks; //!< maximum allowed speed for trucks if not restricted by signs
     double openSpeedLimitBuses; //!< maximum allowed speed for buses if not restricted by signs
-    bool keepToOuterLanes; //!< if true, vehicles must use the outermost free lane for driving
+    bool keepToOuterLanes;         //!< if true, vehicles must use the outermost free lane for driving
     bool dontOvertakeOnOuterLanes; //!< if true, it is prohibited to overtake another vehicle, that is driving further left (or right for lefthand traffic)
-    bool formRescueLane; //!< if true, vehicles driving in a traffic jam must form a corridor for emergency vehicles
-    bool zipperMerge; //!< if true all merging shall be performed using zipper merge
+    bool formRescueLane;           //!< if true, vehicles driving in a traffic jam must form a corridor for emergency vehicles
+    bool zipperMerge;              //!< if true all merging shall be performed using zipper merge
 };
 
 //! Defines the weight of a path for randomized route generation
@@ -417,37 +397,37 @@ public:
         return reference;
     }
 
-    AgentVehicleType GetVehicleType() const
+    mantle_api::VehicleClass GetVehicleClassification() const
     {
-        return vehicleType;
+        return vehicleClassification;
     }
 
-    double GetWidth() const
+    units::length::meter_t GetWidth() const
     {
         return width;
     }
 
-    double GetLength() const
+    units::length::meter_t GetLength() const
     {
         return length;
     }
 
-    double GetDistanceCOGtoFrontAxle() const
+    units::length::meter_t GetDistanceCOGtoFrontAxle() const
     {
         return distanceCOGtoFrontAxle;
     }
 
-    double GetWeight() const
+    units::mass::kilogram_t GetWeight() const
     {
         return weight;
     }
 
-    double GetHeightCOG() const
+    units::length::meter_t GetHeightCOG() const
     {
         return heightCOG;
     }
 
-    double GetWheelbase() const
+    units::length::meter_t GetWheelbase() const
     {
         return wheelbase;
     }
@@ -472,47 +452,47 @@ public:
         return frictionCoeff;
     }
 
-    double GetTrackWidth() const
+    units::length::meter_t GetTrackWidth() const
     {
         return trackWidth;
     }
 
-    double GetDistanceCOGtoLeadingEdge() const
+    units::length::meter_t GetDistanceCOGtoLeadingEdge() const
     {
         return distanceCOGtoLeadingEdge;
     }
 
-    void SetVehicleType(AgentVehicleType vehicleType)
+    void SetVehicleClassification(mantle_api::VehicleClass vehicleClassification)
     {
-        this->vehicleType = vehicleType;
+        this->vehicleClassification = vehicleClassification;
     }
 
-    void SetWidth(double width)
+    void SetWidth(units::length::meter_t width)
     {
         this->width = width;
     }
 
-    void SetLength(double length)
+    void SetLength(units::length::meter_t length)
     {
         this->length = length;
     }
 
-    void SetDistanceCOGtoFrontAxle(double distanceCOGtoFrontAxle)
+    void SetDistanceCOGtoFrontAxle(units::length::meter_t distanceCOGtoFrontAxle)
     {
         this->distanceCOGtoFrontAxle = distanceCOGtoFrontAxle;
     }
 
-    void SetWeight(double weight)
+    void SetWeight(units::mass::kilogram_t weight)
     {
         this->weight = weight;
     }
 
-    void SetHeightCOG(double heightCOG)
+    void SetHeightCOG(units::length::meter_t heightCOG)
     {
         this->heightCOG = heightCOG;
     }
 
-    void SetWheelbase(double wheelbase)
+    void SetWheelbase(units::length::meter_t wheelbase)
     {
         this->wheelbase = wheelbase;
     }
@@ -537,12 +517,12 @@ public:
         this->frictionCoeff = frictionCoeff;
     }
 
-    void SetTrackWidth(double trackWidth)
+    void SetTrackWidth(units::length::meter_t trackWidth)
     {
         this->trackWidth = trackWidth;
     }
 
-    void SetDistanceCOGtoLeadingEdge(double distanceCOGtoLeadingEdge)
+    void SetDistanceCOGtoLeadingEdge(units::length::meter_t distanceCOGtoLeadingEdge)
     {
         this->distanceCOGtoLeadingEdge = distanceCOGtoLeadingEdge;
     }
@@ -550,23 +530,23 @@ public:
 private:
     int id;
     int reference;
-    AgentVehicleType vehicleType;
-    double positionX;
-    double positionY;
-    double width;
-    double length;
+    mantle_api::VehicleClass vehicleClassification;
+    units::length::meter_t positionX;
+    units::length::meter_t positionY;
+    units::length::meter_t width;
+    units::length::meter_t length;
     double velocityX;
     double velocityY;
-    double distanceCOGtoFrontAxle;
-    double weight;
-    double heightCOG;
-    double wheelbase;
+    units::length::meter_t distanceCOGtoFrontAxle;
+    units::mass::kilogram_t weight;
+    units::length::meter_t heightCOG;
+    units::length::meter_t wheelbase;
     double momentInertiaRoll;
     double momentInertiaPitch;
     double momentInertiaYaw;
     double frictionCoeff;
-    double trackWidth;
-    double distanceCOGtoLeadingEdge;
+    units::length::meter_t trackWidth;
+    units::length::meter_t distanceCOGtoLeadingEdge;
     double accelerationX;
     double accelerationY;
     double yawAngle;
@@ -574,22 +554,38 @@ private:
 
 struct PostCrashVelocity
 {
-    bool isActive = false;//!< activity flag
-    double velocityAbsolute = 0.0;//!< post crash velocity, absolute [m/s]
-    double velocityDirection = 0.0;//!< post crash velocity direction [rad]
-    double yawVelocity = 0.0;//!< post crash yaw velocity [rad/s]
+    bool isActive = false;                                          //!< activity flag
+    units::velocity::meters_per_second_t velocityAbsolute{0.0};     //!< post crash velocity, absolute [m/s]
+    units::angle::radian_t velocityDirection{0.0};                  //!< post crash velocity direction [rad]
+    units::angular_velocity::radians_per_second_t yawVelocity{0.0}; //!< post crash yaw velocity [rad/s]
 };
 
 /*!
  * For definitions see http://indexsmart.mirasmart.com/26esv/PDFfiles/26ESV-000177.pdf
  */
-struct CollisionAngles{
-    double OYA = 0.0; //!< opponent yaw angle
-    double HCPAo = 0.0; //!< original host collision point angle
-    double OCPAo = 0.0; //!< original opponent collision point angle
-    double HCPA = 0.0; //!< transformed host collision point angle
-    double OCPA = 0.0; //!< transformed opponent collision point angle
+struct CollisionAngles
+{
+    units::angle::radian_t OYA{0.0};   //!< opponent yaw angle
+    units::angle::radian_t HCPAo{0.0}; //!< original host collision point angle
+    units::angle::radian_t OCPAo{0.0}; //!< original opponent collision point angle
+    units::angle::radian_t HCPA{0.0};  //!< transformed host collision point angle
+    units::angle::radian_t OCPA{0.0};  //!< transformed opponent collision point angle
 };
 
 class AgentInterface;
-using AgentInterfaces = std::vector<const AgentInterface*>;
+using AgentInterfaces = std::vector<const AgentInterface *>;
+
+struct DynamicsInformation
+{
+    units::acceleration::meters_per_second_squared_t acceleration{0.0};
+    units::velocity::meters_per_second_t velocity{0.0};
+    units::length::meter_t positionX{0.0};
+    units::length::meter_t positionY{0.0};
+    units::angle::radian_t yaw{0.0};
+    units::angular_velocity::radians_per_second_t yawRate{0.0};
+    units::angular_acceleration::radians_per_second_squared_t yawAcceleration{0.0};
+    units::angle::radian_t roll{0.0};
+    units::angle::radian_t steeringWheelAngle{0.0};
+    units::acceleration::meters_per_second_squared_t centripetalAcceleration{0.0};
+    units::length::meter_t travelDistance{0.0};
+};
diff --git a/sim/src/common/hypot.h b/sim/src/common/hypot.h
index 22b4157441dde6b128e85219a5f370ae74de6f6e..ebe28aab3980ce3f9e15f11512c6fcff0c10679f 100644
--- a/sim/src/common/hypot.h
+++ b/sim/src/common/hypot.h
@@ -11,6 +11,7 @@
 #pragma once
 
 #include <cmath>
+#include <units.h>
 
 namespace openpass
 {
@@ -25,4 +26,16 @@ namespace openpass
     const auto x = std::fma(-b, b, h_sq-a_sq) + std::fma(h, h, -h_sq) - std::fma(a, a, -a_sq);
     return h - x/(2*h);
 }
+
+template <typename T>
+[[nodiscard]] T hypot(T a, T b)
+{
+    if (a.value() == 0.0) return units::math::abs(b);
+    if (b.value() == 0.0) return units::math::abs(a);
+    const auto h = units::math::sqrt(units::math::fma(a,a,b*b));
+    const auto h_sq = h * h ;
+    const auto a_sq = a * a;
+    const auto x = units::math::fma(-b, b, h_sq-a_sq) + units::math::fma(h, h, -h_sq) - units::math::fma(a, a, -a_sq);
+    return h - x/(2*h);
+}
 }
\ No newline at end of file
diff --git a/sim/src/common/lateralSignal.h b/sim/src/common/lateralSignal.h
index dbb8e5a4a9ad9a13f51c0c755e8493c552a34c4e..15c136dc28bfa7875408339a4f1275cbb4ac5c18 100644
--- a/sim/src/common/lateralSignal.h
+++ b/sim/src/common/lateralSignal.h
@@ -21,6 +21,16 @@
 
 #include "include/modelInterface.h"
 
+struct LateralInformation
+{
+    units::length::meter_t laneWidth {0.0};
+    units::length::meter_t deviation {0.0};
+    units::angular_acceleration::radians_per_second_squared_t gainDeviation {0.0};
+    units::angle::radian_t headingError {0.0};
+    units::frequency::hertz_t gainHeadingError {0.0};
+    units::curvature::inverse_meter_t kappaManoeuvre {0.0};
+};
+
 class LateralSignal: public ComponentStateSignalInterface
 {
 public:
@@ -39,22 +49,12 @@ public:
     //-----------------------------------------------------------------------------
     LateralSignal(
             ComponentState componentState,
-            double laneWidth,
-            double lateralDeviation,
-            double gainLateralDeviation,
-            double headingError,
-            double gainHeadingError,
-            double kappaManoeuvre,
-            double kappaRoad,
-            std::vector <double> curvatureOfSegmentsToNearPoint,
-            std::vector <double> curvatureOfSegmentsToFarPoint
+            LateralInformation lateralInformation,
+            units::curvature::inverse_meter_t kappaRoad,
+            std::vector <units::curvature::inverse_meter_t> curvatureOfSegmentsToNearPoint,
+            std::vector <units::curvature::inverse_meter_t> curvatureOfSegmentsToFarPoint
             ):
-        laneWidth(laneWidth),
-        lateralDeviation(lateralDeviation),
-        gainLateralDeviation(gainLateralDeviation),
-        headingError(headingError),
-        gainHeadingError(gainHeadingError),
-        kappaManoeuvre(kappaManoeuvre),
+        lateralInformation(lateralInformation),
         kappaRoad(kappaRoad),
         curvatureOfSegmentsToNearPoint(curvatureOfSegmentsToNearPoint),
         curvatureOfSegmentsToFarPoint(curvatureOfSegmentsToFarPoint)
@@ -77,15 +77,10 @@ public:
         return stream.str();
     }
 
-    double laneWidth {0.};
-    double lateralDeviation {0.};
-    double gainLateralDeviation {20.0};
-    double headingError {0.};
-    double gainHeadingError {7.5};
-    double kappaManoeuvre {0.};
-    double kappaRoad {0.};
-    std::vector <double> curvatureOfSegmentsToNearPoint {0.};
-    std::vector <double> curvatureOfSegmentsToFarPoint {0.};
+    LateralInformation lateralInformation{};
+    units::curvature::inverse_meter_t kappaRoad {0.};
+    std::vector <units::curvature::inverse_meter_t> curvatureOfSegmentsToNearPoint {0.0_i_m};
+    std::vector <units::curvature::inverse_meter_t> curvatureOfSegmentsToFarPoint {0.0_i_m};
 
     //-----------------------------------------------------------------------------
     //! Constructor
@@ -93,12 +88,7 @@ public:
     LateralSignal(LateralSignal &other) :
         LateralSignal(
             other.componentState,
-            other.laneWidth,
-            other.lateralDeviation,
-            other.gainLateralDeviation,
-            other.headingError,
-            other.gainHeadingError,
-            other.kappaManoeuvre
+            other.lateralInformation
             )
     {
     }
@@ -108,19 +98,9 @@ public:
     //-----------------------------------------------------------------------------
     LateralSignal(
             ComponentState componentState,
-            double laneWidth,
-            double lateralDeviation,
-            double gainLateralDeviation,
-            double headingError,
-            double gainHeadingError,
-            double kappaManoeuvre
+            LateralInformation lateralInformation
             ):
-        laneWidth(laneWidth),
-        lateralDeviation(lateralDeviation),
-        gainLateralDeviation(gainLateralDeviation),
-        headingError(headingError),
-        gainHeadingError(gainHeadingError),
-        kappaManoeuvre(kappaManoeuvre)
+        lateralInformation(lateralInformation)
     {
         this->componentState = componentState;
     }
@@ -128,12 +108,7 @@ public:
     LateralSignal& operator=(const LateralSignal& other)
     {
         componentState = other.componentState;
-        laneWidth = other.laneWidth;
-        lateralDeviation = other.lateralDeviation;
-        gainLateralDeviation = other.gainLateralDeviation;
-        headingError = other.headingError;
-        gainHeadingError = other.gainHeadingError;
-        kappaManoeuvre = other.kappaManoeuvre;
+        lateralInformation = other.lateralInformation;
 
         return *this;
     }
diff --git a/sim/src/common/namedType.h b/sim/src/common/namedType.h
index b85f31532ba73851071dfe719faf43e3dcaf7188..4a7dea9f6e03bf430818384446c7b9524cdadbb5 100644
--- a/sim/src/common/namedType.h
+++ b/sim/src/common/namedType.h
@@ -78,6 +78,36 @@ struct NamedType
     {
         return this->value != other;
     }
+
+    constexpr bool operator<(NamedType<T, Tag> const &other) const
+    {
+        return this->value < other.value;
+    }
+
+    constexpr bool operator<(T const &other) const
+    {
+        return this->value < other;
+    }
+
+    constexpr bool operator>(NamedType<T, Tag> const &other) const
+    {
+        return this->value > other.value;
+    }
+
+    constexpr bool operator>(T const &other) const
+    {
+        return this->value > other;
+    }
+
+    constexpr bool operator<=(NamedType<T, Tag> const &other) const
+    {
+        return this->value <= other.value;
+    }
+
+    constexpr bool operator>=(T const &other) const
+    {
+        return this->value >= other;
+    }
 };
 
 } // namespace openpass::type
diff --git a/sim/src/common/openScenarioDefinitions.h b/sim/src/common/openScenarioDefinitions.h
deleted file mode 100644
index cd01f6be89c43bb4765bb5637b560d49d5cecba4..0000000000000000000000000000000000000000
--- a/sim/src/common/openScenarioDefinitions.h
+++ /dev/null
@@ -1,405 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-#pragma once
-
-#include "commonHelper.h"
-
-#include <map>
-#include <optional>
-#include <ostream>
-#include <string>
-#include <variant>
-#include <vector>
-
-namespace openScenario {
-
-//! Value of a ParameterDeclaration or ParameterAssignment element
-using ParameterValue = std::variant<bool, int, double, std::string>;
-
-//! Content of a ParameterDeclarations or ParameterAssignments element
-using Parameters = std::map<std::string, ParameterValue>;
-
-//! Attribute in a catalog that is not yet resolved
-template <typename T>
-struct ParameterizedAttribute
-{
-    std::string name; //!< Name of the parameter in OpenSCENARIO
-    T defaultValue;   //!< Value defined in the catalog (may be overwritten in the CatalogReference later)
-
-    ParameterizedAttribute() = default;
-
-    ParameterizedAttribute(const T& value) :
-        name{""},
-        defaultValue{value} {}
-
-    ParameterizedAttribute(const std::string& name, const T& defaultValue) :
-        name{name},
-        defaultValue{defaultValue} {}
-};
-
-enum class Shape
-{
-    Linear = 0,
-    Step
-};
-
-enum class SpeedTargetValueType
-{
-    Delta = 0,
-    Factor
-};
-
-// This is a custom solution and not according to the openScenario standard
-struct StochasticAttribute
-{
-    double value = -999;
-    double mean = -999;
-    double stdDeviation = -999;
-    double lowerBoundary = -999;
-    double upperBoundary = -999;
-};
-
-struct ActorInformation
-{
-    bool actorIsTriggeringEntity{false};
-    std::optional<std::vector<std::string>> actors{};
-};
-
-//! OSC Orientation
-enum class OrientationType
-{
-    Undefined = 0,
-    Relative,
-    Absolute
-};
-
-//! OSC Orientation
-struct Orientation
-{
-    std::optional<OrientationType> type{};
-    std::optional<double> h{};
-    std::optional<double> p{};
-    std::optional<double> r{};
-};
-
-//! OSC Position
-struct LanePosition
-{
-    std::optional<Orientation> orientation{};
-    std::string roadId{};
-    int laneId{};
-    std::optional<double> offset{};
-    double s{};
-
-    std::optional<StochasticAttribute> stochasticOffset;
-    std::optional<StochasticAttribute> stochasticS;
-};
-
-//! OSC RelativeLanePosition
-struct RelativeLanePosition
-{
-    std::string entityRef{};
-    int dLane{};
-    double ds{};
-    std::optional<double> offset{};
-    std::optional<Orientation> orientation{};
-};
-
-//! OSC RoadPosition
-struct RoadPosition
-{
-    std::optional<Orientation> orientation{};
-    std::string roadId{};
-    double s{};
-    double t{};
-};
-
-//! OSC WorldPosition
-struct WorldPosition
-{
-    double x{};
-    double y{};
-    std::optional<double> z;
-    std::optional<double> h;
-    std::optional<double> p;
-    std::optional<double> r;
-};
-
-//! OSC RelativeObjectPosition
-struct RelativeObjectPosition {
-    std::optional<Orientation> orientation{};
-    std::string entityRef{};
-    double dx{};
-    double dy{};
-    std::optional<double> dz{};
-};
-
-//! OSC RelativeWorldPosition
-struct RelativeWorldPosition {
-    std::optional<Orientation> orientation{};
-    std::string entityRef{};
-    double dx{};
-    double dy{};
-    std::optional<double> dz{};
-};
-
-//! One of different variants of Position in OpenSCENARIO
-using Position = std::variant<LanePosition,
-                              RelativeLanePosition,
-                              RoadPosition,
-                              WorldPosition,
-                              RelativeObjectPosition,
-                              RelativeWorldPosition>;
-
-struct TrafficSignalControllerPhase
-{
-    std::string name;
-    double duration;
-    std::map<std::string, std::string> states;
-};
-
-struct TrafficSignalController
-{
-    std::string name;
-    double delay;
-    std::vector<TrafficSignalControllerPhase> phases;
-};
-
-// Action
-// GlobalAction
-enum EntityActionType
-{
-    Delete = 0,
-    Add
-};
-
-struct EntityAction
-{
-    std::string entityRef{};
-    EntityActionType type{};
-};
-
-//! OpenSCENARIO Sun
-struct Sun
-{
-    double intensity{0.};
-    double azimuth{0.};
-    double elevation{0.};
-};
-
-//! OpenSCENARIO Fog
-struct Fog
-{
-    double visualRange{0.};
-};
-
-//! OpenSCENARIO Precipitation
-struct Precipitation
-{
-    enum Type
-    {
-        dry,
-        rain,
-        snow
-    } type;
-
-    double intensity;
-};
-
-//! OpenSCENARIO Weather
-struct Weather
-{
-    enum CloudState
-    {
-        skyOff,
-        free,
-        cloudy,
-        overcast,
-        rainy
-    } cloudState;
-
-    Sun sun;
-    Fog fog;
-    Precipitation precipitation;
-};
-
-//! OpenSCENARIO EnvironmentAction
-struct EnvironmentAction
-{
-    Weather weather;
-};
-
-using GlobalAction = std::variant<EntityAction, EnvironmentAction>;
-
-// PrivateAction
-struct TrajectoryPoint
-{
-    double time{};
-    double x{};
-    double y{};
-    double yaw{};
-
-    bool operator== (const TrajectoryPoint& other) const
-    {
-        return CommonHelper::DoubleEquality(other.time, time)
-                && CommonHelper::DoubleEquality(other.x, x)
-                && CommonHelper::DoubleEquality(other.y, y)
-                && CommonHelper::DoubleEquality(other.yaw, yaw);
-    }
-
-    friend std::ostream& operator<<(std::ostream& os, const TrajectoryPoint& point)
-    {
-        os << "t = " << point.time
-           << " : (" << point.x
-           << ", " << point.y
-           << ") yaw = " << point.yaw;
-
-        return os;
-    }
-};
-
-//! OSC TimeReference (for FollowTrajectoryAction)
-struct TrajectoryTimeReference
-{
-    std::string domainAbsoluteRelative;
-    double scale;
-    double offset;
-};
-
-//! OSC Trajectory
-struct Trajectory
-{
-    std::vector<TrajectoryPoint> points;
-    std::string name;
-    std::optional<TrajectoryTimeReference> timeReference;
-
-    friend std::ostream& operator<<(std::ostream& os, const Trajectory& trajectory)
-    {
-        os << "Trajectory \"" << trajectory.name << "\"\n";
-        for (const auto& point : trajectory.points)
-        {
-            os << point << "\n";
-        }
-
-        return os;
-    }
-};
-
-//! OSC AssignRouteAction
-using AssignRouteAction = std::vector<RoadPosition>;
-
-//! OSC FollowTrajectoryAction
-struct FollowTrajectoryAction
-{
-    Trajectory trajectory{};
-};
-
-//! OSC AcquirePositionAction
-struct AcquirePositionAction
-{
-    Position position{};
-};
-
-//! Some variant of a RoutingAction in OpenSCENARIO
-using RoutingAction = std::variant<AssignRouteAction, FollowTrajectoryAction, AcquirePositionAction>;
-
-struct VisibilityAction
-{
-    bool graphics {false};
-    bool traffic {false};
-    bool sensors {false};
-};
-
-struct LaneChangeParameter
-{
-    enum class Type
-    {
-        Absolute,
-        Relative
-    };
-
-    enum class DynamicsType
-    {
-        Time,
-        Distance
-    };
-
-    Type type{}; //! Whether the target is absolute or relative
-    int value{};    //! Value of the target element
-    std::string object{}; //! Name of the reference object if relative
-    double dynamicsTarget{}; //! Time or distance defined by Dynamics element
-    DynamicsType dynamicsType{}; //! Whether time or distance was defined by Dynamics element
-};
-
-struct LaneChangeAction
-{
-    LaneChangeParameter laneChangeParameter{};
-};
-
-using LateralAction = std::variant<LaneChangeAction>;
-
-struct TransitionDynamics
-{
-    Shape shape{};
-    double value{};
-    std::string dimension{};
-};
-
-struct AbsoluteTargetSpeed
-{
-    double value{};
-};
-
-struct RelativeTargetSpeed
-{
-    std::string entityRef{};
-    double value{};
-    SpeedTargetValueType speedTargetValueType{};
-    bool continuous{};
-};
-
-using SpeedActionTarget = std::variant<AbsoluteTargetSpeed, RelativeTargetSpeed>;
-
-struct SpeedAction
-{
-    TransitionDynamics transitionDynamics {};
-    SpeedActionTarget target {};
-
-    std::optional<StochasticAttribute> stochasticValue {};
-    std::optional<StochasticAttribute> stochasticDynamics {};
-};
-
-using LongitudinalAction = std::variant<SpeedAction>;
-
-using TeleportAction = Position;
-
-using PrivateAction = std::variant<LateralAction, LongitudinalAction, RoutingAction, TeleportAction, VisibilityAction>;
-
-// UserDefinedAction
-struct CustomCommandAction
-{
-    std::string command;
-};
-
-using UserDefinedAction = std::variant<CustomCommandAction>;
-
-using Action = std::variant<GlobalAction, PrivateAction, UserDefinedAction>;
-
-struct ManipulatorInformation
-{
-    ManipulatorInformation(const Action action, const std::string eventName):
-        action(action),
-        eventName(eventName)
-    {}
-
-    const Action action;
-    const std::string eventName;
-};
-} // namespace openScenario
diff --git a/sim/src/common/parametersVehicleSignal.h b/sim/src/common/parametersVehicleSignal.h
index 12292b6d83fabbda0c1e86adcee8533e668f5fbb..d5bbbfd7f51cec789a81756db173cd25089db023 100644
--- a/sim/src/common/parametersVehicleSignal.h
+++ b/sim/src/common/parametersVehicleSignal.h
@@ -37,7 +37,7 @@ public:
     //-----------------------------------------------------------------------------
     //! Constructor
     //-----------------------------------------------------------------------------
-    ParametersVehicleSignal(VehicleModelParameters vehicleParameters):
+    ParametersVehicleSignal(mantle_api::VehicleProperties vehicleParameters):
         vehicleParameters(vehicleParameters)
     {
     }
@@ -56,5 +56,5 @@ public:
         return stream.str();
     }
 
-    VehicleModelParameters vehicleParameters;
+    mantle_api::VehicleProperties vehicleParameters;
 };
diff --git a/sim/src/common/postCrashDynamic.h b/sim/src/common/postCrashDynamic.h
index 765f1294c5cf4eae0cbbad3bd35dbf10a659795f..2c5af3730f61fef6ef80c0f8a9fc938aca528737 100644
--- a/sim/src/common/postCrashDynamic.h
+++ b/sim/src/common/postCrashDynamic.h
@@ -10,7 +10,11 @@
 
 #pragma once
 
+#include "common/globalDefinitions.h"
 #include "common/vector2d.h"
+#include "units.h"
+
+using namespace units::literals;
 
 #define POSTCRASHDYNAMICID 0
 
@@ -34,115 +38,115 @@ public:
     //! \param collisionVelocity
     //! \param sliding
     //!
-    PostCrashDynamic(double velocity = 0,
-                     double velocityChange = 0,
-                     double velocityDirection = 0,
-                     double yawVelocity = 0,
-                     Common::Vector2d pulse = Common::Vector2d(),
-                     double pulseDirection = 0,
-                     Common::Vector2d pulseLocal = Common::Vector2d(),
-                     Common::Vector2d pointOfContactLocal = Common::Vector2d(),
-                     double collisionVelocity = 0,
-                     bool sliding = false)
-        : velocity(velocity),
-          velocityChange(velocityChange),
-          velocityDirection(velocityDirection),
-          yawVelocity(yawVelocity),
-          pulse(pulse),
-          pulseDirection(pulseDirection),
-          pulseLocal(pulseLocal),
-          pointOfContactLocal(pointOfContactLocal),
-          collisionVelocity(collisionVelocity),
-          sliding(sliding)
+    PostCrashDynamic(units::velocity::meters_per_second_t velocity = 0_mps,
+                     units::velocity::meters_per_second_t velocityChange = 0_mps,
+                     units::angle::radian_t velocityDirection = 0_rad,
+                     units::angular_velocity::radians_per_second_t yawVelocity = 0_rad_per_s,
+                     Common::Vector2d<units::impulse> pulse = Common::Vector2d<units::impulse>(),
+                     units::angle::radian_t pulseDirection = 0_rad,
+                     Common::Vector2d<units::impulse> pulseLocal = Common::Vector2d<units::impulse>(),
+                     Common::Vector2d<units::length::meter_t> pointOfContactLocal = Common::Vector2d<units::length::meter_t>(),
+                     units::velocity::meters_per_second_t collisionVelocity = 0_mps,
+                     bool sliding = false) :
+        velocity(velocity),
+        velocityChange(velocityChange),
+        velocityDirection(velocityDirection),
+        yawVelocity(yawVelocity),
+        pulse(pulse),
+        pulseDirection(pulseDirection),
+        pulseLocal(pulseLocal),
+        pointOfContactLocal(pointOfContactLocal),
+        collisionVelocity(collisionVelocity),
+        sliding(sliding)
     {}
     virtual ~PostCrashDynamic() = default;
 
-    double GetVelocity() const
+    units::velocity::meters_per_second_t GetVelocity() const
     {
         return velocity;
     }
 
-    void SetVelocity(double value)
+    void SetVelocity(units::velocity::meters_per_second_t value)
     {
         velocity = value;
     }
 
-    double GetVelocityChange() const
+    units::velocity::meters_per_second_t GetVelocityChange() const
     {
         return velocityChange;
     }
 
-    void SetVelocityChange(double value)
+    void SetVelocityChange(units::velocity::meters_per_second_t value)
     {
         velocityChange = value;
     }
 
-    double GetVelocityDirection() const
+    units::angle::radian_t GetVelocityDirection() const
     {
         return velocityDirection;
     }
 
-    void SetVelocityDirection(double value)
+    void SetVelocityDirection(units::angle::radian_t value)
     {
         velocityDirection = value;
     }
 
-    double GetYawVelocity() const
+    units::angular_velocity::radians_per_second_t GetYawVelocity() const
     {
         return yawVelocity;
     }
 
-    void SetYawVelocity(double value)
+    void SetYawVelocity(units::angular_velocity::radians_per_second_t value)
     {
         yawVelocity = value;
     }
 
-    Common::Vector2d GetPulse() const
+    Common::Vector2d<units::impulse> GetPulse() const
     {
         return pulse;
     }
 
-    void SetPulse(const Common::Vector2d &value)
+    void SetPulse(const Common::Vector2d<units::impulse> &value)
     {
         pulse = value;
     }
 
-    double GetPulseDirection() const
+    units::angle::radian_t GetPulseDirection() const
     {
         return pulseDirection;
     }
 
-    void SetPulseDirection(double value)
+    void SetPulseDirection(units::angle::radian_t value)
     {
         pulseDirection = value;
     }
 
-    Common::Vector2d GetPulseLocal() const
+    Common::Vector2d<units::impulse> GetPulseLocal() const
     {
         return pulseLocal;
     }
 
-    void SetPulseLocal(Common::Vector2d value)
+    void SetPulseLocal(Common::Vector2d<units::impulse> value)
     {
         pulseLocal = value;
     }
 
-    Common::Vector2d GetPointOfContactLocal() const
+    Common::Vector2d<units::length::meter_t> GetPointOfContactLocal() const
     {
         return pointOfContactLocal;
     }
 
-    void SetPointOfContactLocal(const Common::Vector2d &value)
+    void SetPointOfContactLocal(const Common::Vector2d<units::length::meter_t> &value)
     {
         pointOfContactLocal = value;
     }
 
-    double GetCollisionVelocity() const
+    units::velocity::meters_per_second_t GetCollisionVelocity() const
     {
         return collisionVelocity;
     }
 
-    void SetCollisionVelocity(double value)
+    void SetCollisionVelocity(units::velocity::meters_per_second_t value)
     {
         collisionVelocity = value;
     }
@@ -159,23 +163,23 @@ public:
 
 private:
     //! post crash velocity, absolute [m/s]
-    double velocity = 0;
+    units::velocity::meters_per_second_t velocity{0};
     //! delta-V: collision induced velocity change [m/s]
-    double velocityChange = 0;
+    units::velocity::meters_per_second_t velocityChange{0};
     //! post crash velocity direction [rad]
-    double velocityDirection = 0;
+    units::angle::radian_t velocityDirection{0};
     //! post crash yaw velocity [rad/s]
-    double yawVelocity = 0;
+    units::angular_velocity::radians_per_second_t yawVelocity{0};
     //! pulse vector [two-dimensional vector: kg*m/s,kg*m/s]
-    Common::Vector2d pulse = Common::Vector2d(0, 0);
+    Common::Vector2d<units::impulse> pulse = Common::Vector2d(units::impulse(0), units::impulse(0));
     //! pulse direction [rad]
-    double pulseDirection = 0;
+    units::angle::radian_t pulseDirection{0};
     //! crash pulse in local vehicle coordinate system
-    Common::Vector2d pulseLocal = Common::Vector2d(0, 0);
+    Common::Vector2d<units::impulse> pulseLocal = Common::Vector2d(units::impulse(0), units::impulse(0));
     //! point of impact in local vehicle coordinate system
-    Common::Vector2d pointOfContactLocal = Common::Vector2d(0, 0);
+    Common::Vector2d<units::length::meter_t> pointOfContactLocal = Common::Vector2d<units::length::meter_t>(0_m, 0_m);
     //! collision velocity
-    double collisionVelocity = 0;
+    units::velocity::meters_per_second_t collisionVelocity{0};
     /*!
      * \brief flag for collision type
      *
diff --git a/sim/src/common/rollSignal.h b/sim/src/common/rollSignal.h
index 0056cb77c5f5c467e64f736a360dd95ed737ac9f..e412380a7162e21b33b986caab9152365a531f30 100644
--- a/sim/src/common/rollSignal.h
+++ b/sim/src/common/rollSignal.h
@@ -37,7 +37,7 @@ public:
     //-----------------------------------------------------------------------------
     RollSignal(
             ComponentState componentState,
-            double rollAngle
+            units::angle::radian_t rollAngle
             ):
         rollAngle(rollAngle)
     {
@@ -63,6 +63,6 @@ public:
         return stream.str();
     }
 
-    double rollAngle {0.};
+    units::angle::radian_t rollAngle {0.};
 
 };
diff --git a/sim/src/common/sensorDefinitions.h b/sim/src/common/sensorDefinitions.h
index ea07cfb063cc74e3604aac77e7c5070d84a0bfda..442509b1e2fbffddbc894c0b319667eb9422b247 100644
--- a/sim/src/common/sensorDefinitions.h
+++ b/sim/src/common/sensorDefinitions.h
@@ -11,18 +11,15 @@
 #pragma once
 
 #include "common/parameter.h"
+#include <MantleAPI/Common/pose.h>
+#include <MantleAPI/Traffic/entity_properties.h>
 
 namespace openpass::sensors
 {
 struct Position
 {
     std::string name {};
-    double longitudinal {};
-    double lateral {};
-    double height {};
-    double pitch {};
-    double yaw {};
-    double roll {};
+    mantle_api::Pose pose{};
 };
 
 struct Profile
@@ -35,10 +32,33 @@ struct Profile
 struct Parameter
 {
     int id {};
-    Position position {};
+    std::string positionName {};
     Profile profile {};
 };
 
+static double GetPositionValue(const std::string& valueName, const std::string& positionName, const mantle_api::VehicleProperties& vehicleProperties)
+{
+    auto value = vehicleProperties.properties.find("SensorPosition/"+positionName+"/"+valueName);
+    if(value == vehicleProperties.properties.cend())
+    {
+        throw std::runtime_error("No value \"" + valueName + "\" for SensorPosition \"" + positionName + "\" defined for VehicleModel \"" + vehicleProperties.model + "\"");
+    }
+    return std::stod(value->second);
+}
+
+static Position GetPosition(const std::string& positionName, const mantle_api::VehicleProperties& vehicleProperties)
+{
+    Position position;
+    position.name = positionName;
+    position.pose.position.x = units::length::meter_t(GetPositionValue("Longitudinal", positionName, vehicleProperties));
+    position.pose.position.y = units::length::meter_t(GetPositionValue("Lateral", positionName, vehicleProperties));
+    position.pose.position.z = units::length::meter_t(GetPositionValue("Height", positionName, vehicleProperties));
+    position.pose.orientation.yaw = units::angle::radian_t(GetPositionValue("Yaw", positionName, vehicleProperties));
+    position.pose.orientation.pitch = units::angle::radian_t(GetPositionValue("Pitch", positionName, vehicleProperties));
+    position.pose.orientation.roll = units::angle::radian_t(GetPositionValue("Roll", positionName, vehicleProperties));
+    return position;
+}
+
 using Profiles = std::vector<Profile>;
 using Parameters = std::vector<Parameter>;
 
diff --git a/sim/src/common/sensorFusionQuery.h b/sim/src/common/sensorFusionQuery.h
index a144a14333591a2b751765922234c121e8f7c621..b7eab48ff309e8eb2196019e509ae92e637be3a6 100644
--- a/sim/src/common/sensorFusionQuery.h
+++ b/sim/src/common/sensorFusionQuery.h
@@ -110,16 +110,16 @@ namespace SensorFusionHelperFunctions
         convertedObject.mutable_base()->mutable_position()->set_y(convertedPosition.y());
         convertedObject.mutable_base()->mutable_orientation()->set_yaw(object.base().orientation().yaw() + mountingPosition.orientation().yaw());
 
-        ObjectPointCustom pointMountingPosition{mountingPosition.position().x(), mountingPosition.position().y()};
+        ObjectPointCustom pointMountingPosition{units::length::meter_t{mountingPosition.position().x()}, units::length::meter_t{mountingPosition.position().y()}};
         const auto differenceVelocity = agent.GetVelocity(pointMountingPosition) - agent.GetVelocity(ObjectPointPredefined::Reference);
         point_t velocity{object.base().velocity().x(), object.base().velocity().y()};
-        point_t convertedVelocity = ConvertVectorToVehicleCoordinates(velocity, {differenceVelocity.x, differenceVelocity.y}, agent.GetYaw(), mountingPosition);
+        point_t convertedVelocity = ConvertVectorToVehicleCoordinates(velocity, {differenceVelocity.x.value(), differenceVelocity.y.value()}, agent.GetYaw().value(), mountingPosition);
         convertedObject.mutable_base()->mutable_velocity()->set_x(convertedVelocity.x());
         convertedObject.mutable_base()->mutable_velocity()->set_y(convertedVelocity.y());
 
         const auto differenceAcceleration = agent.GetAcceleration(pointMountingPosition) - agent.GetAcceleration(ObjectPointPredefined::Reference);
         point_t acceleration{object.base().acceleration().x(), object.base().acceleration().y()};
-        point_t convertedAcceleration = ConvertVectorToVehicleCoordinates(acceleration, {differenceAcceleration.x, differenceAcceleration.y}, agent.GetYaw(), mountingPosition);
+        point_t convertedAcceleration = ConvertVectorToVehicleCoordinates(acceleration, {differenceAcceleration.x.value(), differenceAcceleration.y.value()}, agent.GetYaw().value(), mountingPosition);
         convertedObject.mutable_base()->mutable_acceleration()->set_x(convertedAcceleration.x());
         convertedObject.mutable_base()->mutable_acceleration()->set_y(convertedAcceleration.y());
 
diff --git a/sim/src/common/spawnPointLibraryDefinitions.h b/sim/src/common/spawnPointLibraryDefinitions.h
index 40f8d07c34ac20f3b96e4b90787415c16c942d9a..b230e9a95eb45673080e7fc62ca951c5b4f55add 100644
--- a/sim/src/common/spawnPointLibraryDefinitions.h
+++ b/sim/src/common/spawnPointLibraryDefinitions.h
@@ -9,14 +9,15 @@
  ********************************************************************************/
 #pragma once
 
-#include <unordered_map>
-#include <string>
 #include <memory>
+#include <string>
+#include <unordered_map>
 #include <vector>
 #include <optional>
 
+#include "MantleAPI/Execution/i_environment.h"
+
 class ParameterInterface;
-class ScenarioInterface;
 class WorldInterface;
 class StochasticsInterface;
 class AgentBlueprintProviderInterface;
@@ -45,6 +46,7 @@ struct SpawnPointLibraryInfo
     std::optional<std::string> profileName {};
 };
 using SpawnPointLibraryInfoCollection = std::vector<SpawnPointLibraryInfo>;
+using Vehicles = std::map<std::string, std::shared_ptr<const mantle_api::VehicleProperties>>;
 
 struct SpawnPointDependencies
 {
@@ -56,11 +58,15 @@ struct SpawnPointDependencies
     SpawnPointDependencies(core::AgentFactoryInterface* agentFactory,
                            WorldInterface* world,
                            const AgentBlueprintProviderInterface* agentBlueprintProvider,
-                           StochasticsInterface* stochastics) :
+                           StochasticsInterface* stochastics,
+                           std::shared_ptr<mantle_api::IEnvironment> environment,
+                           std::shared_ptr<Vehicles> vehicles) :
         agentFactory{agentFactory},
         world{world},
         agentBlueprintProvider{agentBlueprintProvider},
-        stochastics{stochastics}
+        stochastics{stochastics},
+        environment{environment},
+        vehicles{vehicles}
     {}
 
     SpawnPointDependencies& operator=(const SpawnPointDependencies&) = default;
@@ -70,6 +76,7 @@ struct SpawnPointDependencies
     WorldInterface* world {nullptr};
     const AgentBlueprintProviderInterface* agentBlueprintProvider {nullptr};
     StochasticsInterface* stochastics {nullptr};
-    std::optional<const ScenarioInterface*> scenario{std::nullopt};
     std::optional<ParameterInterface*> parameters{std::nullopt};
+    std::shared_ptr<mantle_api::IEnvironment> environment{nullptr};
+    std::shared_ptr<Vehicles> vehicles{nullptr};
 };
diff --git a/sim/src/common/speedActionSignal.h b/sim/src/common/speedActionSignal.h
index 612d78e027267e07531eee23bb46071bbf303616..b9060def7e5fb54c274e0feec28f200223778193 100644
--- a/sim/src/common/speedActionSignal.h
+++ b/sim/src/common/speedActionSignal.h
@@ -18,7 +18,6 @@
 #pragma once
 
 #include "include/modelInterface.h"
-#include "common/openScenarioDefinitions.h"
 
 //-----------------------------------------------------------------------------
 //! Signal class
@@ -49,8 +48,8 @@ public:
     //! Constructor
     //-----------------------------------------------------------------------------
     SpeedActionSignal(ComponentState componentState,
-                      const double targetSpeed,
-                      const double acceleration) :
+                      const units::velocity::meters_per_second_t targetSpeed,
+                      const units::acceleration::meters_per_second_squared_t acceleration) :
         ComponentStateSignalInterface(componentState),
         targetSpeed(targetSpeed),
         acceleration(acceleration)
@@ -70,7 +69,7 @@ public:
         return stream.str();
     }
 
-    double targetSpeed {};
-    double acceleration {}; // Range [0..inf[
+    units::velocity::meters_per_second_t targetSpeed {0.0};
+    units::acceleration::meters_per_second_squared_t acceleration{0.0}; // Range [0..inf[
 };
 
diff --git a/sim/src/common/steeringSignal.h b/sim/src/common/steeringSignal.h
index 91bd7f1982330dca5dc62563f2834e604b912295..c51384e5282de6b7179707126c7447c5622e4d06 100644
--- a/sim/src/common/steeringSignal.h
+++ b/sim/src/common/steeringSignal.h
@@ -33,7 +33,7 @@ public:
     //! Constructor
     //-----------------------------------------------------------------------------
     SteeringSignal(ComponentState componentState,
-                  double steeringWheelAngle) :
+                  units::angle::radian_t steeringWheelAngle) :
         ComponentStateSignalInterface (componentState),
         steeringWheelAngle(steeringWheelAngle)
     {}
@@ -57,6 +57,6 @@ public:
         return stream.str();
     }
 
-    double steeringWheelAngle;
+    units::angle::radian_t steeringWheelAngle;
 };
 
diff --git a/sim/src/common/trajectorySignal.h b/sim/src/common/trajectorySignal.h
index c2c0b5e3a5cb3c529b8b13656f03841bb69a97df..02a51c4e6617837b9964342463a97e53abe459c1 100644
--- a/sim/src/common/trajectorySignal.h
+++ b/sim/src/common/trajectorySignal.h
@@ -19,7 +19,8 @@
 #pragma once
 
 #include "include/modelInterface.h"
-#include "common/openScenarioDefinitions.h"
+
+#include "MantleAPI/Common/trajectory.h"
 
 //-----------------------------------------------------------------------------
 //! Signal class
@@ -53,7 +54,7 @@ public:
     //! Constructor
     //-----------------------------------------------------------------------------
     TrajectorySignal(ComponentState componentState,
-                     openScenario::Trajectory trajectory) :
+                     mantle_api::Trajectory trajectory) :
         trajectory(trajectory)
     {
         this->componentState = componentState;
@@ -81,6 +82,6 @@ public:
         return stream.str();
     }
 
-    openScenario::Trajectory trajectory;
+    mantle_api::Trajectory trajectory;
 };
 
diff --git a/sim/src/common/vector2d.h b/sim/src/common/vector2d.h
index 9ebe7e6500ffc454ad159ffcc6631c5a0d189f9e..fcceb6049cc599079dd70785d92e22efe5db548b 100644
--- a/sim/src/common/vector2d.h
+++ b/sim/src/common/vector2d.h
@@ -15,23 +15,27 @@
 
 #pragma once
 
-#include <ostream>
 #include <cmath>
+#include <ostream>
+
+#include "MantleAPI/Common/floating_point_helper.h"
 #include "common/opExport.h"
 #include "common/hypot.h"
+#include "units.h"
 
 namespace Common {
 
 /*!
  * class for 2d vectors in cartesian coordinate system
  */
+template <typename T, class = typename std::enable_if<units::traits::is_unit<T>::value>>
 class OPENPASSCOMMONEXPORT Vector2d final
 {
 public:
-    static double constexpr EPSILON = 1e-9;
+    static T constexpr EPSILON{1e-9};
 
-    double x;
-    double y;
+    T x;
+    T y;
 
     Vector2d(const Vector2d &) = default;
     Vector2d(Vector2d &&) = default;
@@ -44,7 +48,10 @@ public:
      * \param[in] x     x-value
      * \param[in] y     y-value
      */
-    constexpr Vector2d(double x = 0, double y = 0) noexcept : x(x), y(y) {}
+    constexpr Vector2d(T x = T(0), T y = T(0)) noexcept :
+        x(x), y(y)
+    {
+    }
 
     /*!
      * translation of vector
@@ -52,7 +59,7 @@ public:
      * \param[in] x    x-value of displacement vector
      * \param[in] y    y-value of displacement vector
      */
-    constexpr void Translate(double x, double y) noexcept
+    constexpr void Translate(T x, T y) noexcept
     {
         this->x += x;
         this->y += y;
@@ -63,7 +70,7 @@ public:
      * translation of vector via another vector
      * \param[in] translationVector vector of translation
      */
-    constexpr void Translate(Vector2d translationVector) noexcept
+    constexpr void Translate(Vector2d<T> translationVector) noexcept
     {
         this->x += translationVector.x;
         this->y += translationVector.y;
@@ -74,10 +81,10 @@ public:
      *
      * \param[in] angle     angle, in radians
      */
-    void Rotate(double angle) noexcept
+    void Rotate(units::angle::radian_t angle) noexcept
     {
-        double cosAngle = std::cos(angle);
-        double sinAngle = std::sin(angle);
+        auto cosAngle = units::math::cos(angle);
+        auto sinAngle = units::math::sin(angle);
         *this = Vector2d(x * cosAngle - y * sinAngle,
                          x * sinAngle + y * cosAngle);
     }
@@ -87,6 +94,7 @@ public:
      *
      * \param[in] scale     scaling factor
      */
+    // TODO CK extend all operators with unit template magic
     constexpr void Scale(double scale) noexcept
     {
         x *= scale;
@@ -98,7 +106,7 @@ public:
      *
      * \param[in] in     added 2d vector
      */
-    constexpr void Add(const Vector2d &in) noexcept
+    constexpr void Add(const Vector2d<T> &in) noexcept
     {
         x += in.x;
         y += in.y;
@@ -109,7 +117,7 @@ public:
      *
      * \param[in] in     subtracted 2d vector
      */
-    constexpr void Sub(const Vector2d &in) noexcept
+    constexpr void Sub(const Vector2d<T> &in) noexcept
     {
         x -= in.x;
         y -= in.y;
@@ -121,9 +129,9 @@ public:
      * \param[in] in      2d vector
      * \return returns dot product of the 2 vectors
      */
-    constexpr double Dot(const Vector2d &in) const noexcept
+    constexpr double Dot(const Vector2d<T> &in) const noexcept
     {
-        return x * in.x + y * in.y;
+        return units::unit_cast<double>(x * in.x + y * in.y);
     }
 
     /*!
@@ -132,9 +140,10 @@ public:
      * \param[in] in      2d vector
      * \return returns z-component of the cross product
      */
-    constexpr double Cross(const Vector2d &in) const noexcept
+    template <typename Y, class = typename std::enable_if<units::traits::is_unit<T>::value>>
+    constexpr double Cross(const Vector2d<Y> &in) const noexcept
     {
-        return x * in.y - y * in.x;
+        return units::unit_cast<double>(x * in.y - y * in.x);
     }
 
     /*!
@@ -146,21 +155,16 @@ public:
      *
      * \return returns true if vector could be normalized, false otherwise
      */
-    bool Norm()
+    Vector2d<units::dimensionless::scalar_t> Norm()
     {
-        double length = Length();
+        auto length = Length();
 
-        if (std::abs(length) < EPSILON)
+        if (units::math::abs(length) < EPSILON)
         {
-            x = 0.0;
-            y = 0.0;
-            return false;
+            throw std::runtime_error("Can't normalize Vector2d with length of 0.0");
         }
 
-        x /= length;
-        y /= length;
-
-        return true;
+        return Vector2d<units::dimensionless::scalar_t>(x / length, y / length);
     }
 
     /*!
@@ -168,7 +172,7 @@ public:
      *
      * \return length of the vector
      */
-    double Length() const noexcept
+    T Length() const noexcept
     {
         return openpass::hypot(x, y);
     }
@@ -178,9 +182,9 @@ public:
      * returns the angle of the vector [-pi,+pi]
      * \return angle of vector
      */
-    double Angle() const noexcept
+    units::angle::radian_t Angle() const noexcept
     {
-        return atan2(y, x);
+        return units::math::atan2(y, x);
     }
 
     /*!
@@ -188,24 +192,24 @@ public:
      *
      * \param[in] in    yaw of the projection axis
      */
-    double Projection(double yaw) const
+    T Projection(units::angle::radian_t yaw) const
     {
-        return x * std::cos(yaw) + y * std::sin(yaw);
+        return x * units::math::cos(yaw) + y * units::math::sin(yaw);
     }
 
-    constexpr Vector2d operator-(const Vector2d &in) const noexcept
+    constexpr Vector2d<T> operator-(const Vector2d<T> &in) const noexcept
     {
-        return Vector2d(x - in.x, y - in.y);
+        return Vector2d<T>(x - in.x, y - in.y);
     }
 
-    constexpr Vector2d operator+(const Vector2d &in) const noexcept
+    constexpr Vector2d<T> operator+(const Vector2d<T> &in) const noexcept
     {
-        return Vector2d(x + in.x, y + in.y);
+        return Vector2d<T>(x + in.x, y + in.y);
     }
 
-    constexpr Vector2d operator*(double in) const noexcept
+    constexpr Vector2d<T> operator*(double in) const noexcept
     {
-        return Vector2d(x * in, y * in);
+        return Vector2d<T>(x * in, y * in);
     }
 
     /*!
@@ -215,10 +219,10 @@ public:
      *
      * \return   true if vectors are considered equal, false otherwise
      */
-    constexpr bool operator==(const Vector2d &in) const noexcept
+    constexpr bool operator==(const Vector2d<T> &in) const noexcept
     {
-        return (std::abs(x - in.x) < EPSILON) &&
-               (std::abs(y - in.y) < EPSILON);
+        return (mantle_api::IsEqual(x, in.x, EPSILON.value()) &&
+                mantle_api::IsEqual(y, in.y, EPSILON.value()));
     }
 
     /*!
@@ -228,27 +232,30 @@ public:
      *
      * \return   false if vectors are considered equal, true otherwise
      */
-    constexpr bool operator!=(const Vector2d &in) const noexcept
+    constexpr bool operator!=(const Vector2d<T> &in) const noexcept
     {
         return !operator==(in);
     }
 
     /// \brief Overload << operator for Vector2d
-    friend std::ostream& operator<<(std::ostream& os, const Vector2d& vector)
+    friend std::ostream &operator<<(std::ostream &os, const Vector2d<T> &vector)
     {
         return os << "(" << vector.x << ", " << vector.y << ")";
     }
 
 };
 
+template <typename T, class = typename std::enable_if<units::traits::is_unit<T>::value>>
 struct Line
 {
-    explicit constexpr Line(const Common::Vector2d& startPoint,  const Common::Vector2d& endPoint) noexcept :
+    explicit constexpr Line(const Common::Vector2d<T> &startPoint, const Common::Vector2d<T> &endPoint) noexcept :
         startPoint{startPoint},
-        directionalVector{endPoint - startPoint}{}
+        directionalVector{endPoint - startPoint}
+    {
+    }
 
-    Common::Vector2d startPoint;
-    Common::Vector2d directionalVector;
+    Common::Vector2d<T> startPoint;
+    Common::Vector2d<T> directionalVector;
 };
 
 } // namespace Common
diff --git a/sim/src/common/vector3d.cpp b/sim/src/common/vector3d.cpp
index d501d91846aa798a3db18ca47a64543d1cfdc9ed..2fcdac43f09c56c665de5283bff283743727e7bb 100644
--- a/sim/src/common/vector3d.cpp
+++ b/sim/src/common/vector3d.cpp
@@ -47,7 +47,7 @@ void Vector3d::Sub(const Vector3d &in)
 
 bool Vector3d::Norm()
 {
-    double length = std::sqrt(x*x + y*y + z*z);
+    auto length = std::sqrt(x*x + y*y + z*z);
     if(0 == length)
     {
         return false;
diff --git a/sim/src/common/worldDefinitions.h b/sim/src/common/worldDefinitions.h
index 304719d6414a61e14b69508909939133336ed435..65543e2adda5c507199e9c786ba9650923a6fd3b 100644
--- a/sim/src/common/worldDefinitions.h
+++ b/sim/src/common/worldDefinitions.h
@@ -19,6 +19,8 @@
 #include <set>
 #include "boost/graph/adjacency_list.hpp"
 
+using namespace units::literals;
+
 //! Double values with difference lower than this should be considered equal
 constexpr double EQUALITY_BOUND = 1e-3;
 
@@ -110,8 +112,8 @@ enum class LaneType
 //! interval on a road over multiple lanes
 struct LaneSection
 {
-    double startS;
-    double endS;
+    units::length::meter_t startS;
+    units::length::meter_t endS;
     std::vector<int> laneIds;
 };
 
@@ -140,8 +142,8 @@ struct Lane
 //! interval on a road over multiple lanes relative to a position / agent
 struct LanesInterval
 {
-    double startS;
-    double endS;
+    units::length::meter_t startS;
+    units::length::meter_t endS;
     std::vector<Lane> lanes;
 };
 
@@ -152,8 +154,8 @@ using Lanes = std::vector<LanesInterval>;
 //! Position of a road relative to an agent
 struct Road
 {
-    double startS; //!< relative distance to start of road
-    double endS; //!< relative distance to end of road
+    units::length::meter_t startS; //!< relative distance to start of road
+    units::length::meter_t endS; //!< relative distance to end of road
     std::string roadId; //!< id of the road
     bool junction; //!< whether the road is part of a junction
     bool inOdDirection; //!< whether the agent is driving in reference line direction (i.e. increasing s coordinate)
@@ -167,22 +169,22 @@ using Roads = std::vector<Road>;
 struct RoadPosition
 {
     RoadPosition() = default;
-    RoadPosition(double s,
-                 double t,
-                 double hdg):
+    RoadPosition(units::length::meter_t s,
+                 units::length::meter_t t,
+                 units::angle::radian_t hdg):
         s(s),
         t(t),
         hdg(hdg) {}
 
-    double s {0};
-    double t {0};
-    double hdg {0};
+    units::length::meter_t s {0};
+    units::length::meter_t t {0};
+    units::angle::radian_t hdg {0};
 
     bool operator==(const RoadPosition& other) const
     {
-        return std::abs(s - other.s) < EQUALITY_BOUND
-                && std::abs(t - other.t) < EQUALITY_BOUND
-                && std::abs(hdg - other.hdg) < EQUALITY_BOUND;
+        return units::math::abs(s - other.s) < units::length::meter_t(EQUALITY_BOUND)
+                && units::math::abs(t - other.t) < units::length::meter_t(EQUALITY_BOUND)
+                && units::math::abs(hdg - other.hdg) < units::angle::radian_t(EQUALITY_BOUND);
     }
 };
 
@@ -190,7 +192,7 @@ struct RoadPosition
 struct GlobalRoadPosition
 {
     GlobalRoadPosition() = default;
-    GlobalRoadPosition(std::string roadId, int laneId, double s, double t, double hdg) :
+    GlobalRoadPosition(std::string roadId, int laneId, units::length::meter_t s, units::length::meter_t t, units::angle::radian_t hdg) :
         roadId{roadId},
         laneId{laneId},
         roadPosition(s, t, hdg)
@@ -216,21 +218,21 @@ using GlobalRoadPositions = std::map<std::string, GlobalRoadPosition>;
 struct Remainder
 {
     Remainder() = default;
-    Remainder(double left, double right) : left{left}, right{right}
+    Remainder(units::length::meter_t left, units::length::meter_t right) : left{left}, right{right}
     {}
 
-    double left {0.0};
-    double right {0.0};
+    units::length::meter_t left {0.0};
+    units::length::meter_t right {0.0};
 };
 
 //! Interval on a specific road
 struct RoadInterval
 {
     std::vector<int> lanes;
-    GlobalRoadPosition sMin{"", 0, std::numeric_limits<double>::infinity(), 0, 0};
-    GlobalRoadPosition sMax{"", 0, -std::numeric_limits<double>::infinity(), 0, 0};
-    GlobalRoadPosition tMin{"", 999, 0, std::numeric_limits<double>::infinity(), 0};
-    GlobalRoadPosition tMax{"", -999, 0, -std::numeric_limits<double>::infinity(), 0};
+    GlobalRoadPosition sMin{"", 0, units::length::meter_t{std::numeric_limits<double>::infinity()}, 0_m, 0_rad};
+    GlobalRoadPosition sMax{"", 0, units::length::meter_t{-std::numeric_limits<double>::infinity()}, 0_m, 0_rad};
+    GlobalRoadPosition tMin{"", 999, 0_m, units::length::meter_t{std::numeric_limits<double>::infinity()}, 0_rad};
+    GlobalRoadPosition tMax{"", -999, 0_m, units::length::meter_t{-std::numeric_limits<double>::infinity()}, 0_rad};
 };
 
 using RoadIntervals = std::map<std::string, RoadInterval>;
@@ -260,13 +262,13 @@ enum class ObjectPointRelative
 //! Point of an object for costum use (e.g. sensor position)
 struct ObjectPointCustom
 {
-    double longitudinal;
-    double lateral;
+    units::length::meter_t longitudinal;
+    units::length::meter_t lateral;
 
     bool operator== (const ObjectPointCustom& other) const
     {
-        return std::abs(longitudinal - other.longitudinal) < EQUALITY_BOUND
-                && std::abs(lateral - other.lateral) < EQUALITY_BOUND;
+        return units::math::abs(longitudinal - other.longitudinal).value() < EQUALITY_BOUND
+                && units::math::abs(lateral - other.lateral).value() < EQUALITY_BOUND;
     }
 
     //Needed for map sorting
@@ -328,9 +330,9 @@ class Obstruction
 {
 public:
     bool valid {false};   ///!< @brief True, if obstruction could be calculated
-    std::map<ObjectPoint, double> lateralDistances{}; ///!< @brief obstructions for various points (defined during call of the query)
+    std::map<ObjectPoint, units::length::meter_t> lateralDistances{}; ///!< @brief obstructions for various points (defined during call of the query)
 
-    Obstruction(std::map<ObjectPoint, double> lateralDistances) :
+    Obstruction(std::map<ObjectPoint, units::length::meter_t> lateralDistances) :
         valid{true},
         lateralDistances{lateralDistances}
     {
@@ -404,8 +406,8 @@ struct Entity
 {
     Type type {Type::Undefined};
     Unit unit {Unit::None};
-    double distanceToStartOfRoad {0};
-    double relativeDistance {0};
+    units::length::meter_t distanceToStartOfRoad {0};
+    units::length::meter_t relativeDistance {0};
     double value {0};
     std::string text {""};
     std::vector<Entity> supplementarySigns{};
@@ -442,8 +444,8 @@ struct Entity
 {
     Type type{Type::None};
     Color color{Color::White};
-    double relativeStartDistance{0.0};
-    double width{0.0};
+    units::length::meter_t relativeStartDistance{0.0};
+    units::length::meter_t width{0.0};
 };
 }
 
@@ -488,6 +490,6 @@ struct Entity
 {
     Type type{Type::ThreeLights};
     State state{State::Red};
-    double relativeDistance{0.0};
+    units::length::meter_t relativeDistance{0.0};
 };
 }
diff --git a/sim/src/common/xmlParser.h b/sim/src/common/xmlParser.h
index f2ac7ab2ac45aebc4d9417c928b9f466251264bf..099a03a52d0e22e3b082bff3c700c686783d631c 100644
--- a/sim/src/common/xmlParser.h
+++ b/sim/src/common/xmlParser.h
@@ -23,6 +23,9 @@
 
 #include <QDomDocument>
 #include <QFile>
+#include <optional>
+
+#include "units.h"
 
 //! Writes a message into the log including the line and column number of the erronous xml element
 //!
@@ -68,6 +71,38 @@ extern bool ParseAttributeString(QDomElement element, const std::string &attribu
 
 extern bool ParseAttributeDouble(QDomElement element, const std::string &attributeName, double &result, std::optional<double> defaultValue = std::nullopt);
 
+template <typename T, class = typename std::enable_if_t<units::traits::is_unit_t<T>::value>>
+extern bool ParseAttributeDouble(QDomElement element, const std::string &attributeName, T &result, std::optional<T> defaultValue = std::nullopt)
+{
+    if(!element.hasAttribute(QString::fromStdString(attributeName)))
+    {
+        if (defaultValue.has_value())
+        {
+            result = defaultValue.value();
+            return true;
+        }
+
+        return false;
+    }
+
+    QDomAttr attribute = element.attributeNode(QString::fromStdString(attributeName));
+    if(attribute.isNull())
+    {
+        return false;
+    }
+
+    try
+    {
+        result = T(std::stod(attribute.value().toStdString()));
+    }
+    catch(...)
+    {
+        return false;
+    }
+
+    return true;
+}
+
 extern bool ParseAttributeInt(QDomElement element, const std::string &attributeName, int &result);
 
 extern bool ParseAttributeBool(QDomElement element, const std::string &attributeName, bool &result);
diff --git a/sim/src/components/AgentUpdater/src/agentUpdaterImpl.cpp b/sim/src/components/AgentUpdater/src/agentUpdaterImpl.cpp
index 49fa49fc3dd3c4246fd9472a16bc8a5444d1e468..bfde91c29b222f7c909faab8d3a5a3d9bda26005 100644
--- a/sim/src/components/AgentUpdater/src/agentUpdaterImpl.cpp
+++ b/sim/src/components/AgentUpdater/src/agentUpdaterImpl.cpp
@@ -15,39 +15,30 @@
 //-----------------------------------------------------------------------------
 
 #include "agentUpdaterImpl.h"
+
 #include <qglobal.h>
 
 void AgentUpdaterImplementation::UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, [[maybe_unused]] int time)
 {
     if (localLinkId == 0)
+    {
+        // from DynamicsPrioritizer
+        const std::shared_ptr<DynamicsSignal const> signal = std::dynamic_pointer_cast<DynamicsSignal const>(data);
+        if (!signal)
         {
-            // from DynamicsPrioritizer
-            const std::shared_ptr<DynamicsSignal const> signal = std::dynamic_pointer_cast<DynamicsSignal const>(data);
-            if (!signal)
-            {
-                const std::string msg = COMPONENTNAME + " invalid signaltype";
-                LOG(CbkLogLevel::Debug, msg);
-                throw std::runtime_error(msg);
-            }
-
-            acceleration = signal->acceleration;
-            velocity = signal->velocity;
-            positionX = signal->positionX;
-            positionY = signal->positionY;
-            yaw = signal->yaw;
-            yawRate = signal->yawRate;
-            yawAcceleration = signal->yawAcceleration;
-            roll = signal->roll;
-            steeringWheelAngle = signal->steeringWheelAngle;
-            centripetalAcceleration = signal->centripetalAcceleration;
-            travelDistance = signal->travelDistance;
-        }
-        else
-        {
-            const std::string msg = COMPONENTNAME + " invalid link";
+            const std::string msg = COMPONENTNAME + " invalid signaltype";
             LOG(CbkLogLevel::Debug, msg);
             throw std::runtime_error(msg);
         }
+
+        dynamicsInformation = signal->dynamicsInformation;
+    }
+    else
+    {
+        const std::string msg = COMPONENTNAME + " invalid link";
+        LOG(CbkLogLevel::Debug, msg);
+        throw std::runtime_error(msg);
+    }
 }
 
 void AgentUpdaterImplementation::UpdateOutput([[maybe_unused]] int localLinkId,
@@ -60,36 +51,27 @@ void AgentUpdaterImplementation::Trigger([[maybe_unused]] int time)
 {
     AgentInterface *agent = GetAgent();
 
-    Validate(acceleration, "acceleration");
-    agent->SetAcceleration(acceleration);
-    Validate(velocity, "velocity");
-    agent->SetVelocity(velocity);
-    Validate(positionX, "positionX");
-    agent->SetPositionX(positionX);
-    Validate(positionY, "positionY");
-    agent->SetPositionY(positionY);
-    Validate(yaw, "yaw");
-    agent->SetYaw(yaw);
-    Validate(yawRate, "yawRate");
-    agent->SetYawRate(yawRate);
-    Validate(yawAcceleration, "yawAcceleration");
-    agent->SetYawAcceleration(yawAcceleration);
-    Validate(roll, "roll");
-    agent->SetRoll(roll);
-    Validate(steeringWheelAngle, "steeringWheelAngle");
-    agent->SetSteeringWheelAngle(steeringWheelAngle);
-    Validate(centripetalAcceleration, "centripetalAcceleration");
-    agent->SetCentripetalAcceleration(centripetalAcceleration);
-    Validate(travelDistance, "travelDistance");
-    agent->SetDistanceTraveled(agent->GetDistanceTraveled() + travelDistance);
-    agent->SetWheelsRotationRateAndOrientation(steeringWheelAngle, velocity, acceleration);
-}
-
-
-void AgentUpdaterImplementation::Validate(double value, const std::string &description)
-{
-    if (std::isnan(value))
-    {
-        LOGERRORANDTHROW("AgentUpdater got NaN as value of " + description + " for Agent " + std::to_string(GetAgent()->GetId()));
-    }
+    Validate(dynamicsInformation.acceleration, "acceleration");
+    agent->SetAcceleration(dynamicsInformation.acceleration);
+    Validate(dynamicsInformation.velocity, "velocity");
+    agent->SetVelocity(dynamicsInformation.velocity);
+    Validate(dynamicsInformation.positionX, "positionX");
+    agent->SetPositionX(dynamicsInformation.positionX);
+    Validate(dynamicsInformation.positionY, "positionY");
+    agent->SetPositionY(dynamicsInformation.positionY);
+    Validate(dynamicsInformation.yaw, "yaw");
+    agent->SetYaw(dynamicsInformation.yaw);
+    Validate(dynamicsInformation.yawRate, "yawRate");
+    agent->SetYawRate(dynamicsInformation.yawRate);
+    Validate(dynamicsInformation.yawAcceleration, "yawAcceleration");
+    agent->SetYawAcceleration(dynamicsInformation.yawAcceleration);
+    Validate(dynamicsInformation.roll, "roll");
+    agent->SetRoll(dynamicsInformation.roll);
+    Validate(dynamicsInformation.steeringWheelAngle, "steeringWheelAngle");
+    agent->SetSteeringWheelAngle(dynamicsInformation.steeringWheelAngle);
+    Validate(dynamicsInformation.centripetalAcceleration, "centripetalAcceleration");
+    agent->SetCentripetalAcceleration(dynamicsInformation.centripetalAcceleration);
+    Validate(dynamicsInformation.travelDistance, "travelDistance");
+    agent->SetDistanceTraveled(agent->GetDistanceTraveled() + dynamicsInformation.travelDistance);
+    agent->SetWheelsRotationRateAndOrientation(dynamicsInformation.steeringWheelAngle, dynamicsInformation.velocity, dynamicsInformation.acceleration);
 }
diff --git a/sim/src/components/AgentUpdater/src/agentUpdaterImpl.h b/sim/src/components/AgentUpdater/src/agentUpdaterImpl.h
index e0710dc1f1a286abd3015eb7652f4461c7b8d0b8..a2fc1817c1b6df8aa7e92105401b6f13b7b2b9f6 100644
--- a/sim/src/components/AgentUpdater/src/agentUpdaterImpl.h
+++ b/sim/src/components/AgentUpdater/src/agentUpdaterImpl.h
@@ -17,15 +17,12 @@
 * Input variables:
 * name | meaning
 * -----|------
-* acceleration | Acceleration of the agent in m/s.
-* velocity | Velocity of the agent in m/s.
-* positionX | X position of the agent.
-* positionY | Y position of the agent.
+* dynamicsInformation | All values regarding the dynamic calculation of the agent
 *
 * Input channel IDs:
 * Input ID | signal class | contained variables
 * ------------|--------------|-------------
-* 0 | DynamicsSignal  | acceleration, velocity, positionX, positionY
+* 0 | DynamicsSignal  | DynamicsInformation
 *
 * @} */
 
@@ -119,18 +116,15 @@ public:
     /*!
     * \brief Checks that the given value is not Nan and logs an error otherwise
     */
-    void Validate(double value, const std::string& description);
+    template <typename T, class = typename std::enable_if_t<units::traits::is_unit_t<T>::value>>
+    void Validate(T value, const std::string &description)
+    {
+        if (std::isnan(value.value()))
+        {
+            LOGERRORANDTHROW("AgentUpdater got NaN as value of " + description + " for Agent " + std::to_string(GetAgent()->GetId()));
+        }
+    }
 
 private:
-    double acceleration {0.0};
-    double velocity {0.0};
-    double positionX {0.0};
-    double positionY {0.0};
-    double yaw {0.0};
-    double yawRate {0.0};
-    double yawAcceleration {0.0};
-    double roll {0.0};
-    double steeringWheelAngle {0.0};
-    double centripetalAcceleration {0.0};
-    double travelDistance {0.0};
+    DynamicsInformation dynamicsInformation{};
 };
diff --git a/sim/src/components/AlgorithmAFDM/src/followingDriverModel.cpp b/sim/src/components/AlgorithmAFDM/src/followingDriverModel.cpp
index 7f3968f55fc2b45dfc1da33e6653ea86d1a0baca..b73f7f2c40330f11b6fc30655d3d04914e6c886b 100644
--- a/sim/src/components/AlgorithmAFDM/src/followingDriverModel.cpp
+++ b/sim/src/components/AlgorithmAFDM/src/followingDriverModel.cpp
@@ -10,27 +10,28 @@
  ********************************************************************************/
 /**********************************************
 ***********************************************/
+#include "followingDriverModel.h"
+
 #include <QtGlobal>
 
-#include "followingDriverModel.h"
+#include "common/accelerationSignal.h"
 #include "common/lateralSignal.h"
 #include "common/secondaryDriverTasksSignal.h"
-#include "common/accelerationSignal.h"
 
 AlgorithmAgentFollowingDriverModelImplementation::AlgorithmAgentFollowingDriverModelImplementation(
-        std::string componentName,
-        bool isInit,
-        int priority,
-        int offsetTime,
-        int responseTime,
-        int cycleTime,
-        StochasticsInterface *stochastics,
-        WorldInterface *world,
-        const ParameterInterface *parameters,
-        PublisherInterface * const publisher,
-        const CallbackInterface *callbacks,
-        AgentInterface *agent) :
-        SensorInterface(
+    std::string componentName,
+    bool isInit,
+    int priority,
+    int offsetTime,
+    int responseTime,
+    int cycleTime,
+    StochasticsInterface *stochastics,
+    WorldInterface *world,
+    const ParameterInterface *parameters,
+    PublisherInterface *const publisher,
+    const CallbackInterface *callbacks,
+    AgentInterface *agent) :
+    SensorInterface(
         componentName,
         isInit,
         priority,
@@ -46,7 +47,7 @@ AlgorithmAgentFollowingDriverModelImplementation::AlgorithmAgentFollowingDriverM
 {
     if (parameters->GetParametersDouble().count("VelocityWish") > 0)
     {
-        vWish = parameters->GetParametersDouble().at("VelocityWish");
+        vWish = units::velocity::meters_per_second_t(parameters->GetParametersDouble().at("VelocityWish"));
     }
     if (parameters->GetParametersDouble().count("Delta") > 0)
     {
@@ -54,24 +55,25 @@ AlgorithmAgentFollowingDriverModelImplementation::AlgorithmAgentFollowingDriverM
     }
     if (parameters->GetParametersDouble().count("TGapWish") > 0)
     {
-        tGapWish = parameters->GetParametersDouble().at("TGapWish");
+        tGapWish = units::time::second_t(parameters->GetParametersDouble().at("TGapWish"));
     }
     if (parameters->GetParametersDouble().count("MinDistance") > 0)
     {
-        minDistance = parameters->GetParametersDouble().at("MinDistance");
+        minDistance = units::length::meter_t(parameters->GetParametersDouble().at("MinDistance"));
     }
     if (parameters->GetParametersDouble().count("MaxAcceleration") > 0)
     {
-        maxAcceleration = parameters->GetParametersDouble().at("MaxAcceleration");
+        maxAcceleration = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().at("MaxAcceleration"));
     }
     if (parameters->GetParametersDouble().count("MaxDeceleration") > 0)
     {
-        decelerationWish = parameters->GetParametersDouble().at("MaxDeceleration");
+        decelerationWish = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().at("MaxDeceleration"));
     }
 }
 
 AlgorithmAgentFollowingDriverModelImplementation::~AlgorithmAgentFollowingDriverModelImplementation()
-{}
+{
+}
 
 void AlgorithmAgentFollowingDriverModelImplementation::UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, int time)
 {
@@ -80,7 +82,7 @@ void AlgorithmAgentFollowingDriverModelImplementation::UpdateInput(int localLink
     {
         // from SensorDriver
         const std::shared_ptr<SensorDriverSignal const> signal = std::dynamic_pointer_cast<SensorDriverSignal const>(data);
-        if(!signal)
+        if (!signal)
         {
             const std::string msg = COMPONENTNAME + " invalid signaltype";
             LOG(CbkLogLevel::Debug, msg);
@@ -103,52 +105,47 @@ void AlgorithmAgentFollowingDriverModelImplementation::UpdateOutput(int localLin
 {
     Q_UNUSED(time);
 
-    if(localLinkId == 0)
+    if (localLinkId == 0)
     {
         try
         {
             data = std::make_shared<LateralSignal const>(
-                        componentState,
-                        out_laneWidth,
-                        out_lateral_displacement, // lateral deviation
-                        out_lateral_gain_displacement,
-                        out_lateral_heading_error,
-                        out_lateral_gain_heading_error,
-                        out_curvature);
+                componentState,
+                out_lateralInformation);
         }
-        catch(const std::bad_alloc&)
+        catch (const std::bad_alloc &)
         {
             const std::string msg = COMPONENTNAME + " could not instantiate signal";
             LOG(CbkLogLevel::Debug, msg);
             throw std::runtime_error(msg);
         }
     }
-    else if(localLinkId == 1)
+    else if (localLinkId == 1)
     {
         try
         {
             data = std::make_shared<SecondaryDriverTasksSignal const>(
-                                        out_indicatorState,
-                                        out_hornSwitch,
-                                        out_headLight,
-                                        out_highBeamLight,
-                                        out_flasher,
-                                        componentState);
+                out_indicatorState,
+                out_hornSwitch,
+                out_headLight,
+                out_highBeamLight,
+                out_flasher,
+                componentState);
         }
-        catch(const std::bad_alloc&)
+        catch (const std::bad_alloc &)
         {
             const std::string msg = COMPONENTNAME + " could not instantiate signal";
             LOG(CbkLogLevel::Debug, msg);
             throw std::runtime_error(msg);
         }
     }
-    else if(localLinkId == 2)
+    else if (localLinkId == 2)
     {
         try
         {
             data = std::make_shared<AccelerationSignal const>(componentState, out_longitudinal_acc);
         }
-        catch(const std::bad_alloc&)
+        catch (const std::bad_alloc &)
         {
             const std::string msg = COMPONENTNAME + " could not instantiate signal";
             LOG(CbkLogLevel::Debug, msg);
@@ -167,36 +164,39 @@ void AlgorithmAgentFollowingDriverModelImplementation::Trigger(int time)
 {
     Q_UNUSED(time);
 
-    out_curvature = geometryInformation.laneEgo.curvature;
-    out_laneWidth = geometryInformation.laneEgo.width;
-    out_lateral_speed = 0;
-    out_lateral_frequency = std::sqrt(lateralDynamicConstants.lateralAcceleration / geometryInformation.laneEgo.width);
+    out_lateralInformation.kappaManoeuvre = geometryInformation.laneEgo.curvature;
+    out_lateralInformation.laneWidth = geometryInformation.laneEgo.width;
+    out_lateral_speed = 0_mps;
+    out_lateral_frequency = units::math::sqrt(lateralDynamicConstants.lateralAcceleration / geometryInformation.laneEgo.width);
     out_lateral_damping = lateralDynamicConstants.zeta;
-    out_lateral_displacement = -ownVehicleInformation.lateralPosition;
-    out_lateral_heading_error = -ownVehicleInformation.heading;
-    out_lateral_gain_heading_error = lateralDynamicConstants.gainHeadingError;
+    out_lateralInformation.deviation = -ownVehicleInformation.lateralPosition;
+    out_lateralInformation.headingError = -ownVehicleInformation.heading;
+    out_lateralInformation.gainHeadingError = lateralDynamicConstants.gainHeadingError;
 
-    const auto& frontAgent = surroundingObjects.objectFront;
-    double decelerationCoeff = 0.0;
+    const auto &frontAgent = surroundingObjects.objectFront;
+    units::dimensionless::scalar_t decelerationCoeff{0.0};
 
     if (frontAgent.exist)
     {
-        auto vDelta = std::abs(ownVehicleInformation.absoluteVelocity - frontAgent.absoluteVelocity);
-        auto effectiveMinimumGap = minDistance + ownVehicleInformation.absoluteVelocity * tGapWish + ownVehicleInformation.absoluteVelocity * vDelta / (2 * std::sqrt(maxAcceleration * decelerationWish));
-        decelerationCoeff = std::pow(effectiveMinimumGap/frontAgent.relativeLongitudinalDistance, 2);
+        auto vDelta = units::math::abs(ownVehicleInformation.absoluteVelocity - frontAgent.absoluteVelocity);
+        const units::unit_t<units::squared<units::velocity::meters_per_second>> squareVelocity = ownVehicleInformation.absoluteVelocity * vDelta;
+        const units::acceleration::meters_per_second_squared_t acceleration = 2 * units::math::sqrt(maxAcceleration * decelerationWish);
+
+        const units::length::meter_t distanceBasedOnAcceleration = squareVelocity / acceleration;
+        units::length::meter_t effectiveMinimumGap = minDistance + ownVehicleInformation.absoluteVelocity * tGapWish + distanceBasedOnAcceleration;
+        decelerationCoeff = units::math::pow<2>(effectiveMinimumGap / frontAgent.relativeLongitudinalDistance);
     }
 
-    auto freeRoadCoeff = 1.0 - std::pow(ownVehicleInformation.absoluteVelocity/vWish, delta);
+    auto freeRoadCoeff = 1.0 - std::pow(ownVehicleInformation.absoluteVelocity / vWish, delta);
     auto intelligentDriverModelAcceleration = maxAcceleration * (freeRoadCoeff - decelerationCoeff);
 
-    if(intelligentDriverModelAcceleration >= 0)
+    if (intelligentDriverModelAcceleration >= 0_mps_sq)
     {
-        out_longitudinal_acc = std::min(maxAcceleration, intelligentDriverModelAcceleration);
+        out_longitudinal_acc = units::math::min(maxAcceleration, intelligentDriverModelAcceleration);
     }
     else
     {
         auto maxDeceleration = -decelerationWish;
-        out_longitudinal_acc = std::max(maxDeceleration, intelligentDriverModelAcceleration);
+        out_longitudinal_acc = units::math::max(maxDeceleration, intelligentDriverModelAcceleration);
     }
 }
-
diff --git a/sim/src/components/AlgorithmAFDM/src/followingDriverModel.h b/sim/src/components/AlgorithmAFDM/src/followingDriverModel.h
index 4725b6245f8fd4ce3800757000695aa8e3cacc7f..2b34c1c0df745a4b68c3276dfa5711dea74575ea 100644
--- a/sim/src/components/AlgorithmAFDM/src/followingDriverModel.h
+++ b/sim/src/components/AlgorithmAFDM/src/followingDriverModel.h
@@ -20,6 +20,7 @@
 #include "include/modelInterface.h"
 #include "include/parameterInterface.h"
 #include "common/primitiveSignals.h"
+#include "common/lateralSignal.h"
 #include "components/Sensor_Driver/src/Signals/sensorDriverSignal.h"
 
 class AgentInterface;
@@ -31,11 +32,11 @@ class WorldInterface;
 struct LateralDynamicConstants
 {
     //! Typical acceleration for a lane change [m/s].
-    const double lateralAcceleration = 1.5;
+    const units::acceleration::meters_per_second_squared_t lateralAcceleration{1.5};
     //! Typical lateral damping for a lane change [m/s].
     const double zeta = 1.0;
     //! aggressiveness of the controller for heading errors
-    const double gainHeadingError = 7.5;
+    const units::frequency::hertz_t gainHeadingError{7.5};
 };
 
 class AlgorithmAgentFollowingDriverModelImplementation : public SensorInterface
@@ -133,39 +134,34 @@ private:
 
     // constants from IDM paper
     //! desired speed
-    double vWish = 120.0/3.6;
+    units::velocity::kilometers_per_hour_t vWish{120.0};
     //! free acceleration exponent characterizing how the acceleration decreases with velocity (1: linear, infinity: constant)
     double delta = 4.0;
     //! desired time gap between ego and front agent
-    double tGapWish = 1.5;
+    units::time::second_t tGapWish{1.5};
     //! minimum distance between ego and front (used at slow speeds) also called jam distance
-    double minDistance = 2.0;
+    units::length::meter_t minDistance {2.0};
     //! maximum acceleration in satisfactory way, not vehicle possible acceleration
-    double maxAcceleration = 1.4;
+    units::acceleration::meters_per_second_squared_t maxAcceleration{1.4};
     //! desired deceleration
-    double decelerationWish = 2.0;
-
+    units::acceleration::meters_per_second_squared_t decelerationWish{2.0};
+
+    LateralInformation out_lateralInformation {0_m,
+                                               0_m,
+                                               20.0_rad_per_s_sq,
+                                               0_rad,
+                                               0_Hz,
+                                               0_i_m};
+                                               
     //! The lateral velocity of the current vehicle [m/s].
-    double out_lateral_speed = 0;
-    //! The relative lateral position of the vehicle [m].
-    double out_lateral_displacement = 0;
-    //! The gain for lateral displacement error controller [-].
-    double out_lateral_gain_displacement = 20.0;
+    units::velocity::meters_per_second_t out_lateral_speed{0};
     //! The damping constant of the lateral oscillation of the vehicle [].
     double out_lateral_damping = 0;
     //! The lateral oscillation frequency of the vehicle [1/s].
-    double out_lateral_frequency = 0;
-    //! The heading angle error of the vehicle [rad].
-    double out_lateral_heading_error = 0;
-    //! The gain for heading error controller [-].
-    double out_lateral_gain_heading_error = 7.5;
-    //! The curvature of the lane at vehicle's position [1/m].
-    double out_curvature = 0;
-    //! The width of the lane containing the vehicle [m].
-    double out_laneWidth = 0;
+    units::frequency::hertz_t out_lateral_frequency{0};
 
     //! The longitudinal acceleration of the vehicle [m/s^2].
-    double out_longitudinal_acc = 0;
+    units::acceleration::meters_per_second_squared_t out_longitudinal_acc{0};
 
     //! The state of the turning indicator [-].
     int out_indicatorState = static_cast<int>(IndicatorState::IndicatorState_Off);
diff --git a/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.cpp b/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.cpp
index 5a24e0d2255d8975aefb764d1ddb80f9a2ec3cd5..ca9313e310f61440ea1e3d9596865c22e9a3345c 100644
--- a/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.cpp
+++ b/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.cpp
@@ -74,10 +74,10 @@ AlgorithmAutonomousEmergencyBrakingImplementation::AlgorithmAutonomousEmergencyB
 
 void AlgorithmAutonomousEmergencyBrakingImplementation::ParseParameters(const ParameterInterface *parameters)
 {
-    ttcBrake = parameters->GetParametersDouble().at("TTC");
-    brakingAcceleration = parameters->GetParametersDouble().at("Acceleration");
-    collisionDetectionLongitudinalBoundary = parameters->GetParametersDouble().at("CollisionDetectionLongitudinalBoundary");
-    collisionDetectionLateralBoundary = parameters->GetParametersDouble().at("CollisionDetectionLateralBoundary");
+    ttcBrake = units::time::second_t(parameters->GetParametersDouble().at("TTC"));
+    brakingAcceleration = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().at("Acceleration"));
+    collisionDetectionLongitudinalBoundary = units::length::meter_t(parameters->GetParametersDouble().at("CollisionDetectionLongitudinalBoundary"));
+    collisionDetectionLateralBoundary = units::length::meter_t(parameters->GetParametersDouble().at("CollisionDetectionLateralBoundary"));
 
     const auto &sensorList = parameters->GetParameterLists().at("SensorLinks");
     for (const auto &sensorLink : sensorList)
@@ -162,103 +162,72 @@ void AlgorithmAutonomousEmergencyBrakingImplementation::Trigger([[maybe_unused]]
     }
 }
 
-bool AlgorithmAutonomousEmergencyBrakingImplementation::ShouldBeActivated(const double ttc) const
+bool AlgorithmAutonomousEmergencyBrakingImplementation::ShouldBeActivated(const units::time::second_t ttc) const
 {
     return ttc < ttcBrake;
 }
 
-bool AlgorithmAutonomousEmergencyBrakingImplementation::ShouldBeDeactivated(const double ttc) const
+bool AlgorithmAutonomousEmergencyBrakingImplementation::ShouldBeDeactivated(const units::time::second_t ttc) const
 {
     return ttc > (ttcBrake * 1.5);
 }
 
-double AlgorithmAutonomousEmergencyBrakingImplementation::CalculateObjectTTC(const osi3::BaseMoving &baseMoving)
+units::time::second_t AlgorithmAutonomousEmergencyBrakingImplementation::CalculateObjectTTC(const osi3::BaseMoving &baseMoving)
 {
-    TtcCalculations::TtcParameters ego;
-    ego.length = GetAgent()->GetLength() + collisionDetectionLongitudinalBoundary;
-    double width = GetAgent()->GetWidth();
-    double height = GetAgent()->GetHeight();
-    double roll = GetAgent()->GetRoll();
-    ego.widthLeft = TrafficHelperFunctions::GetWidthLeft(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
-    ego.widthRight = TrafficHelperFunctions::GetWidthRight(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
-    ego.frontLength = GetAgent()->GetDistanceReferencePointToLeadingEdge() + 0.5 * collisionDetectionLongitudinalBoundary;
-    ego.backLength = ego.length - ego.frontLength;
-    ego.position = {0.0, 0.0};
-    ego.velocityX = 0.0;
-    ego.velocityY = 0.0;
-    ego.accelerationX = 0.0;
-    ego.accelerationY = 0.0;
-    ego.yaw = 0.0;
-    ego.yawRate = GetAgent()->GetYawRate();
-    ego.yawAcceleration = 0.0; // GetAgent()->GetYawAcceleration() not implemented yet
+    auto ego = GetEgoTTCParameters();
+
     TtcCalculations::TtcParameters opponent;
-    opponent.length = baseMoving.dimension().length() + collisionDetectionLongitudinalBoundary;
-    width = baseMoving.dimension().width();
-    height = baseMoving.dimension().height();
-    roll = baseMoving.orientation().roll();
+    opponent.length = units::length::meter_t(baseMoving.dimension().length()) + collisionDetectionLongitudinalBoundary;
+    units::length::meter_t width{baseMoving.dimension().width()};
+    units::length::meter_t height{baseMoving.dimension().height()};
+    units::angle::radian_t roll{baseMoving.orientation().roll()};
     opponent.widthLeft = TrafficHelperFunctions::GetWidthLeft(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
     opponent.widthRight = TrafficHelperFunctions::GetWidthRight(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
     opponent.frontLength = 0.5 * opponent.length;
     opponent.backLength = 0.5 * opponent.length;
     opponent.position = {baseMoving.position().x(), baseMoving.position().y()};
-    opponent.velocityX = baseMoving.velocity().x();
-    opponent.velocityY = baseMoving.velocity().y();
-    opponent.accelerationX = baseMoving.acceleration().x();
-    opponent.accelerationY = baseMoving.acceleration().y();
-    opponent.yaw = baseMoving.orientation().yaw();
-    opponent.yawRate = baseMoving.orientation_rate().yaw();
-    opponent.yawAcceleration = baseMoving.orientation_acceleration().yaw();
+    opponent.velocityX = units::velocity::meters_per_second_t(baseMoving.velocity().x());
+    opponent.velocityY = units::velocity::meters_per_second_t(baseMoving.velocity().y());
+    opponent.accelerationX = units::acceleration::meters_per_second_squared_t(baseMoving.acceleration().x());
+    opponent.accelerationY = units::acceleration::meters_per_second_squared_t(baseMoving.acceleration().y());
+    opponent.yaw = units::angle::radian_t(baseMoving.orientation().yaw());
+    opponent.yawRate = units::angular_velocity::radians_per_second_t(baseMoving.orientation_rate().yaw());
+    opponent.yawAcceleration = units::angular_acceleration::radians_per_second_squared_t(baseMoving.orientation_acceleration().yaw());
 
     return TtcCalculations::CalculateObjectTTC(ego, opponent, ttcBrake * 1.5, GetCycleTime());
 }
 
-double AlgorithmAutonomousEmergencyBrakingImplementation::CalculateObjectTTC(const osi3::BaseStationary &baseStationary)
+units::time::second_t AlgorithmAutonomousEmergencyBrakingImplementation::CalculateObjectTTC(const osi3::BaseStationary &baseStationary)
 {
-    TtcCalculations::TtcParameters ego;
-    ego.length = GetAgent()->GetLength() + collisionDetectionLongitudinalBoundary;
-    double width = GetAgent()->GetWidth();
-    double height = GetAgent()->GetHeight();
-    double roll = GetAgent()->GetRoll();
-    ego.widthLeft = TrafficHelperFunctions::GetWidthLeft(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
-    ego.widthRight = TrafficHelperFunctions::GetWidthRight(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
-    ego.frontLength = GetAgent()->GetDistanceReferencePointToLeadingEdge() + 0.5 * collisionDetectionLongitudinalBoundary;
-    ego.backLength = ego.length - ego.frontLength;
-    ego.position = {0.0, 0.0};
-    ego.velocityX = 0.0;
-    ego.velocityY = 0.0;
-    ego.accelerationX = 0.0;
-    ego.accelerationY = 0.0;
-    ego.yaw = 0.0;
-    ego.yawRate = GetAgent()->GetYawRate(); //This is a temporary solution, since the moving object osi is filled with dummy nans here
-    ego.yawAcceleration = GetAgent()->GetYawAcceleration();
+    auto ego = GetEgoTTCParameters();
 
     TtcCalculations::TtcParameters opponent;
-    opponent.length = baseStationary.dimension().length() + collisionDetectionLongitudinalBoundary;
-    width = baseStationary.dimension().width();
-    height = baseStationary.dimension().height();
-    roll = baseStationary.orientation().roll();
+    opponent.length = units::length::meter_t(baseStationary.dimension().length()) + collisionDetectionLongitudinalBoundary;
+    units::length::meter_t width{baseStationary.dimension().width()};
+    units::length::meter_t height{baseStationary.dimension().height()};
+    units::angle::radian_t roll{baseStationary.orientation().roll()};
     opponent.widthLeft = TrafficHelperFunctions::GetWidthLeft(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
     opponent.widthRight = TrafficHelperFunctions::GetWidthRight(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
     opponent.frontLength = 0.5 * opponent.length;
     opponent.backLength = 0.5 * opponent.length;
     opponent.position = {baseStationary.position().x(), baseStationary.position().y()};
     opponent.velocityX = -GetAgent()->GetVelocity().Length();
-    opponent.velocityY = 0.0;
+    opponent.velocityY = 0.0_mps;
     opponent.accelerationX = -GetAgent()->GetAcceleration().Projection(GetAgent()->GetYaw());
-    opponent.accelerationY = 0.0;
-    opponent.yaw = baseStationary.orientation().yaw();
-    opponent.yawRate = 0.0;
-    opponent.yawAcceleration = 0.0;
+    opponent.accelerationY = 0.0_mps_sq;
+    opponent.yaw = units::angle::radian_t(baseStationary.orientation().yaw());
+    opponent.yawRate = 0.0_rad_per_s;
+    opponent.yawAcceleration = 0.0_rad_per_s_sq;
 
     return TtcCalculations::CalculateObjectTTC(ego, opponent, ttcBrake * 1.5, GetCycleTime());
 }
 
-double AlgorithmAutonomousEmergencyBrakingImplementation::CalculateTTC()
+units::time::second_t AlgorithmAutonomousEmergencyBrakingImplementation::CalculateTTC()
 {
-    double ttc = std::numeric_limits<double>::max();
+    units::time::second_t ttc{std::numeric_limits<double>::max()};
     for (const auto &detectedObject : detectedMovingObjects)
     {
-        double objectTtc = CalculateObjectTTC(detectedObject.base());
+        auto objectTtc = CalculateObjectTTC(detectedObject.base());
         if (objectTtc < ttc)
         {
             ttc = objectTtc;
@@ -266,7 +235,7 @@ double AlgorithmAutonomousEmergencyBrakingImplementation::CalculateTTC()
     }
     for (const auto &detectedObject : detectedStationaryObjects)
     {
-        double objectTtc = CalculateObjectTTC(detectedObject.base());
+        auto objectTtc = CalculateObjectTTC(detectedObject.base());
         if (objectTtc < ttc)
         {
             ttc = objectTtc;
@@ -276,7 +245,7 @@ double AlgorithmAutonomousEmergencyBrakingImplementation::CalculateTTC()
     return ttc;
 }
 
-void AlgorithmAutonomousEmergencyBrakingImplementation::SetAcceleration(double setValue)
+void AlgorithmAutonomousEmergencyBrakingImplementation::SetAcceleration(units::acceleration::meters_per_second_squared_t setValue)
 {
     activeAcceleration = setValue;
     GetPublisher()->Publish(COMPONENTNAME, ComponentEvent({{"ComponentState", openpass::utils::to_string(componentState)}}));
@@ -285,13 +254,37 @@ void AlgorithmAutonomousEmergencyBrakingImplementation::SetAcceleration(double s
 void AlgorithmAutonomousEmergencyBrakingImplementation::UpdateAcceleration()
 {
     if (componentState == ComponentState::Acting &&
-        (activeAcceleration - brakingAcceleration) != 0.0)
+        (activeAcceleration - brakingAcceleration) != 0.0_mps_sq)
     {
         SetAcceleration(brakingAcceleration);
     }
     else if (componentState == ComponentState::Disabled &&
-             activeAcceleration != 0.0)
+             activeAcceleration != 0.0_mps_sq)
     {
-        SetAcceleration(0.0);
+        SetAcceleration(0.0_mps_sq);
     }
 }
+
+TtcCalculations::TtcParameters AlgorithmAutonomousEmergencyBrakingImplementation::GetEgoTTCParameters()
+{
+    TtcCalculations::TtcParameters ego;
+    ego.length = GetAgent()->GetLength() + collisionDetectionLongitudinalBoundary;
+    auto width = GetAgent()->GetWidth();
+    auto height = GetAgent()->GetHeight();
+    auto roll = GetAgent()->GetRoll();
+
+    ego.widthLeft = TrafficHelperFunctions::GetWidthLeft(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
+    ego.widthRight = TrafficHelperFunctions::GetWidthRight(width, height, roll) + 0.5 * collisionDetectionLateralBoundary;
+    ego.frontLength = GetAgent()->GetDistanceReferencePointToLeadingEdge() + 0.5 * collisionDetectionLongitudinalBoundary;
+    ego.backLength = ego.length - ego.frontLength;
+    ego.position = {0.0, 0.0};
+    ego.velocityX = 0.0_mps;
+    ego.velocityY = 0.0_mps;
+    ego.accelerationX = 0.0_mps_sq;
+    ego.accelerationY = 0.0_mps_sq;
+    ego.yaw = 0.0_rad;
+    ego.yawRate = GetAgent()->GetYawRate(); //This is a temporary solution, since the moving object osi is filled with dummy nans here
+    ego.yawAcceleration = 0.0_rad_per_s_sq; // GetAgent()->GetYawAcceleration() not implemented yet
+
+    return ego;
+}
\ No newline at end of file
diff --git a/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.h b/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.h
index 6f161aaa3c99baa9fe3a1bd0533f5fdc63e55cce..7a30227fee46969a47ab2ad549f2340737150396 100644
--- a/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.h
+++ b/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.h
@@ -109,7 +109,7 @@ public:
     virtual void Trigger(int time);
 
     //for testing
-    double GetAcceleration()
+    units::acceleration::meters_per_second_squared_t GetAcceleration()
     {
         return activeAcceleration;
     }
@@ -131,21 +131,21 @@ private:
      *
      * \return minimum ttc
      */
-    double CalculateTTC();
+    units::time::second_t CalculateTTC();
 
     /*!
      * \brief Calculates the ttc between a moving object and the own agent
      * \param baseMoving osi BaseMoving of other object
      * \return ttc
      */
-    double CalculateObjectTTC(const osi3::BaseMoving &baseMoving);
+    units::time::second_t CalculateObjectTTC(const osi3::BaseMoving &baseMoving);
 
     /*!
      * \brief Calculates the ttc between a stationary object and the own agent
      * \param baseStationary osi BaseStationary of other object
      * \return ttc
      */
-    double CalculateObjectTTC(const osi3::BaseStationary &baseStationary);
+    units::time::second_t CalculateObjectTTC(const osi3::BaseStationary &baseStationary);
 
     /*!
      * \brief ShouldBeActivated Determines if the Autonomous Emergency Braking system
@@ -155,7 +155,7 @@ private:
      *
      * \returns true if AEB should be activated, false otherwise
      */
-    bool ShouldBeActivated(double ttc) const;
+    bool ShouldBeActivated(units::time::second_t ttc) const;
     /*!
      * \brief ShouldBeDeactivated Determines if the Autonomous Emergency Braking system
      *        should be deactivated
@@ -164,7 +164,7 @@ private:
      *
      * \returns true if AEB should be deactivated, false otherwise
      */
-    bool ShouldBeDeactivated(double ttc) const;
+    bool ShouldBeDeactivated(units::time::second_t ttc) const;
 
     /*!
      * \brief Checks if current acceleration of the system needs to be updated
@@ -176,19 +176,21 @@ private:
     /*!
      * \brief Sets the current acceleration of the system
      */
-    void SetAcceleration(double setValue);
+    void SetAcceleration(units::acceleration::meters_per_second_squared_t setValue);
+
+    TtcCalculations::TtcParameters GetEgoTTCParameters();
 
     std::vector<int> sensors; ///!< Collection of sensor input ids
 
-    double collisionDetectionLongitudinalBoundary{0.0}; ///!< Additional length added to the vehicle boundary when checking for collision detection
-    double collisionDetectionLateralBoundary{0.0};      ///!< Additional width added to the vehicle boundary when checking for collision detection
+    units::length::meter_t collisionDetectionLongitudinalBoundary{0.0}; ///!< Additional length added to the vehicle boundary when checking for collision detection
+    units::length::meter_t collisionDetectionLateralBoundary{0.0};      ///!< Additional width added to the vehicle boundary when checking for collision detection
 
     std::vector<osi3::DetectedMovingObject> detectedMovingObjects;         ///!< Collection of moving objects detected by connected sensors
     std::vector<osi3::DetectedStationaryObject> detectedStationaryObjects; ///!< Collection of stationary objects detected by connected sensors
 
     ComponentState componentState = ComponentState::Disabled; ///!< Current state of the AEB component
 
-    double ttcBrake{0.0};            ///!< The minimum Time-To-Collision before the AEB component activates
-    double brakingAcceleration{0.0}; ///!< The acceleration provided by the AEB component when activated (should be negative)
-    double activeAcceleration{0.0};  ///!< The current acceleration actively provided by the AEB component (should be 0.0 when off)
+    units::time::second_t ttcBrake{0.0};            ///!< The minimum Time-To-Collision before the AEB component activates
+    units::acceleration::meters_per_second_squared_t brakingAcceleration{0.0}; ///!< The acceleration provided by the AEB component when activated (should be negative)
+    units::acceleration::meters_per_second_squared_t activeAcceleration{0.0};  ///!< The current acceleration actively provided by the AEB component (should be 0.0 when off)
 };
diff --git a/sim/src/components/Algorithm_CruiseControlByDistance/algorithm_cruisecontrolbydistance_implementation.cpp b/sim/src/components/Algorithm_CruiseControlByDistance/algorithm_cruisecontrolbydistance_implementation.cpp
index 627061f079f568ae8f25f2221628d39e2a1a2eb2..37057b4f42886f684a8b1061459a1a7d4c348ff7 100644
--- a/sim/src/components/Algorithm_CruiseControlByDistance/algorithm_cruisecontrolbydistance_implementation.cpp
+++ b/sim/src/components/Algorithm_CruiseControlByDistance/algorithm_cruisecontrolbydistance_implementation.cpp
@@ -8,10 +8,11 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
+#include "algorithm_cruisecontrolbydistance_implementation.h"
 
 #include <qglobal.h>
-#include "algorithm_cruisecontrolbydistance_implementation.h"
-#include "Common/primitiveSignals.h"
+
+#include "common/primitiveSignals.h"
 
 void Algorithm_CruiseControlByDistance_Implementation::UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, int time)
 {
diff --git a/sim/src/components/Algorithm_FmuWrapper/CMakeLists.txt b/sim/src/components/Algorithm_FmuWrapper/CMakeLists.txt
index 96248601f5f434868d0705431fd2b2c7641428d4..61f6ea873bbfea8ea6d6a0c3e4e81529f50849be 100644
--- a/sim/src/components/Algorithm_FmuWrapper/CMakeLists.txt
+++ b/sim/src/components/Algorithm_FmuWrapper/CMakeLists.txt
@@ -1,5 +1,5 @@
 ################################################################################
-# Copyright (c) 2020-2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# Copyright (c) 2020-2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -20,6 +20,7 @@ add_openpass_target(
     src/fmuWrapper.h
     src/OsmpFmuHandler.h
     src/variant_visitor.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/Common/position.h
 
   SOURCES
     AlgorithmFmuWrapper.cpp
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.cpp b/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.cpp
index 4cca69e3cc2d6baf505ab4ad1442103246389d9a..97ae22d75eb4dc748a29f486f5edfd66d2eb2df3 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.cpp
+++ b/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.cpp
@@ -11,6 +11,7 @@
 
 #include "OsmpFmuHandler.h"
 
+#include <MantleAPI/Common/position.h>
 #include <cmath>
 #include <src/common/acquirePositionSignal.h>
 
@@ -38,42 +39,46 @@ std::string log_prefix(const std::string &agentIdString)
     return "Agent " + agentIdString + ": ";
 }
 
-void* decode_integer_to_pointer(fmi2_integer_t hi, fmi2_integer_t lo)
+void *decode_integer_to_pointer(fmi2_integer_t hi, fmi2_integer_t lo)
 {
 #if PTRDIFF_MAX == INT64_MAX
-    union addrconv {
-        struct {
+    union addrconv
+    {
+        struct
+        {
             int lo;
             int hi;
         } base;
         unsigned long long address;
     } myaddr;
-    myaddr.base.lo=lo;
-    myaddr.base.hi=hi;
-    return reinterpret_cast<void*>(myaddr.address);
+    myaddr.base.lo = lo;
+    myaddr.base.hi = hi;
+    return reinterpret_cast<void *>(myaddr.address);
 #elif PTRDIFF_MAX == INT32_MAX
-    return reinterpret_cast<void*>(lo);
+    return reinterpret_cast<void *>(lo);
 #else
 #error "Cannot determine 32bit or 64bit environment!"
 #endif
 }
 
-void encode_pointer_to_integer(const void* ptr,fmi2_integer_t& hi,fmi2_integer_t& lo)
+void encode_pointer_to_integer(const void *ptr, fmi2_integer_t &hi, fmi2_integer_t &lo)
 {
 #if PTRDIFF_MAX == INT64_MAX
-    union addrconv {
-        struct {
+    union addrconv
+    {
+        struct
+        {
             int lo;
             int hi;
         } base;
         unsigned long long address;
     } myaddr;
-    myaddr.address=reinterpret_cast<unsigned long long>(ptr);
-    hi=myaddr.base.hi;
-    lo=myaddr.base.lo;
+    myaddr.address = reinterpret_cast<unsigned long long>(ptr);
+    hi = myaddr.base.hi;
+    lo = myaddr.base.lo;
 #elif PTRDIFF_MAX == INT32_MAX
-    hi=0;
-    lo=reinterpret_cast<int>(ptr);
+    hi = 0;
+    lo = reinterpret_cast<int>(ptr);
 #else
 #error "Cannot determine 32bit or 64bit environment!"
 #endif
@@ -86,16 +91,16 @@ OsmpFmuHandler::OsmpFmuHandler(fmu_check_data_t *cdata, WorldInterface *world, A
     fmuVariables(fmuVariables),
     previousPosition(agent->GetPositionX(), agent->GetPositionY()),
     agentIdString(std::to_string(agent->GetId())),
-    bb_center_offset_x(agent->GetVehicleModelParameters().boundingBoxCenter.x)
+    bb_center_offset_x(agent->GetVehicleModelParameters()->bounding_box.geometric_center.x)
 {
     std::filesystem::path fmuPath = cdata->FMUPath;
     fmuName = fmuPath.filename().replace_extension().string();
 
-    for (const auto& [key, value] : parameters->GetParametersString())
+    for (const auto &[key, value] : parameters->GetParametersString())
     {
         const auto pos = key.find('_');
         const auto type = key.substr(0, pos);
-        const auto variableName = key.substr(pos+1);
+        const auto variableName = key.substr(pos + 1);
         if (type == "Input" || type == "Output" || type == "Init")
         {
             const auto findResult = variableMapping.at(type).find(value);
@@ -105,7 +110,7 @@ OsmpFmuHandler::OsmpFmuHandler(fmu_check_data_t *cdata, WorldInterface *world, A
             }
             else
             {
-                LOGERRORANDTHROW(log_prefix(agentIdString) + "Unkown FMU \""+type+"\" variable \""+value+"\"")
+                LOGERRORANDTHROW(log_prefix(agentIdString) + "Unkown FMU \"" + type + "\" variable \"" + value + "\"")
             }
         }
     }
@@ -218,7 +223,7 @@ OsmpFmuHandler::OsmpFmuHandler(fmu_check_data_t *cdata, WorldInterface *world, A
         outputDir =
             QString::fromStdString(parameters->GetRuntimeInformation().directories.output) + QDir::separator() +
             "FmuWrapper" + QDir::separator() +
-            "Agent" +  QString::fromStdString(ss.str()) + QDir::separator() +
+            "Agent" + QString::fromStdString(ss.str()) + QDir::separator() +
             QString::fromStdString(fmuName) + QDir::separator() + "JsonFiles";
 
         QDir directory{outputDir};
@@ -236,7 +241,7 @@ OsmpFmuHandler::OsmpFmuHandler(fmu_check_data_t *cdata, WorldInterface *world, A
 
         traceOutputDir = QString::fromStdString(parameters->GetRuntimeInformation().directories.output) + QDir::separator() +
                          "FmuWrapper" + QDir::separator() +
-                         "Agent" +  QString::fromStdString(ss.str()) + QDir::separator() +
+                         "Agent" + QString::fromStdString(ss.str()) + QDir::separator() +
                          QString::fromStdString(fmuName) + QDir::separator() + "BinaryTraceFiles";
         QDir directory{traceOutputDir};
         if (!directory.exists())
@@ -258,8 +263,8 @@ OsmpFmuHandler::~OsmpFmuHandler() {
     FmuFileHelper::writeTracesToFile(traceOutputDir, fileToOutputTracesMap);
 }
 
-void OsmpFmuHandler::SetSensorViewConfigRequest() {
-
+void OsmpFmuHandler::SetSensorViewConfigRequest()
+{
     void *buffer = decode_integer_to_pointer(GetValue(fmuVariables.at(sensorViewConfigRequestVariable.value() + ".base.hi").first, VariableType::Int).intValue,
                                              GetValue(fmuVariables.at(sensorViewConfigRequestVariable.value() + ".base.lo").first, VariableType::Int).intValue);
     const auto size = static_cast<std::string::size_type>(GetValue(fmuVariables.at(sensorViewConfigRequestVariable.value() + ".size").first, VariableType::Int).intValue);
@@ -293,8 +298,6 @@ void OsmpFmuHandler::SetSensorViewConfig()
 
 void OsmpFmuHandler::UpdateInput(int localLinkId, const std::shared_ptr<const SignalInterface> &data, [[maybe_unused]] int time)
 {
-
-
     if (localLinkId == 2)
     {
         auto signal = std::dynamic_pointer_cast<SensorDataSignal const>(data);
@@ -342,7 +345,7 @@ void OsmpFmuHandler::UpdateInput(int localLinkId, const std::shared_ptr<const Si
         const auto signal = std::dynamic_pointer_cast<SpeedActionSignal const>(data);
         if (signal && signal->componentState == ComponentState::Acting)
         {
-            trafficCommands[time]->add_action()->mutable_speed_action()->set_absolute_target_speed(signal->targetSpeed);
+            trafficCommands[time]->add_action()->mutable_speed_action()->set_absolute_target_speed(units::unit_cast<double>(signal->targetSpeed));
         }
     }
 
@@ -368,11 +371,10 @@ void OsmpFmuHandler::UpdateInput(int localLinkId, const std::shared_ptr<const Si
     }
 }
 
-constexpr double EPSILON = 0.001;
+const units::length::meter_t EPSILON{0.001};
 
-void OsmpFmuHandler::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const>& data, int time)
+void OsmpFmuHandler::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const> &data, int time)
 {
-
     if (localLinkId == 6)
     {
         data = std::make_shared<SensorDataSignal const>(sensorDataOut);
@@ -380,31 +382,23 @@ void OsmpFmuHandler::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterfa
 
     else if (localLinkId == 0)
     {
-        double acceleration{0.0};
-        double velocity{0.0};
-        double positionX{0.0};
-        double positionY{0.0};
-        double yaw{0.0};
-        double yawRate{0.0};
+        DynamicsInformation dynamicsInformation{};
+        dynamicsInformation.yaw = 0_rad;
         double yawAcceleration{0.0};
-        double roll{0.0};
-        double steeringWheelAngle{0.0};
-        double centripetalAcceleration{0.0};
-        double travelDistance{0.0};
 
         if (trafficUpdateVariable.has_value())
         {
             if (trafficUpdate.update_size() > 0)
             {
-                const auto& baseMoving = trafficUpdate.mutable_update(0)->mutable_base();
-                velocity = std::sqrt(baseMoving->velocity().x() * baseMoving->velocity().x() + baseMoving->velocity().y() * baseMoving->velocity().y());
-                yaw = baseMoving->orientation().yaw();
-                roll = baseMoving->orientation().roll();
-                acceleration = baseMoving->acceleration().x() * std::cos(yaw) + baseMoving->acceleration().y() * std::sin(yaw);
-                centripetalAcceleration = -baseMoving->acceleration().x() * std::sin(yaw) + baseMoving->acceleration().y() * std::cos(yaw);
-                positionX = baseMoving->position().x() - bb_center_offset_x * std::cos(yaw);
-                positionY = baseMoving->position().y() - bb_center_offset_x * std::sin(yaw);
-                yawRate = baseMoving->orientation_rate().yaw();
+                const auto &baseMoving = trafficUpdate.mutable_update(0)->mutable_base();
+                dynamicsInformation.velocity = units::velocity::meters_per_second_t(std::sqrt(baseMoving->velocity().x() * baseMoving->velocity().x() + baseMoving->velocity().y() * baseMoving->velocity().y()));
+                dynamicsInformation.yaw = units::angle::radian_t(baseMoving->orientation().yaw());
+                dynamicsInformation.roll = units::angle::radian_t(baseMoving->orientation().roll());
+                dynamicsInformation.acceleration = units::acceleration::meters_per_second_squared_t(baseMoving->acceleration().x()) * units::math::cos(dynamicsInformation.yaw) + units::acceleration::meters_per_second_squared_t(baseMoving->acceleration().y()) * units::math::sin(dynamicsInformation.yaw);
+                dynamicsInformation.centripetalAcceleration = units::acceleration::meters_per_second_squared_t(-baseMoving->acceleration().x()) * units::math::sin(dynamicsInformation.yaw) + units::acceleration::meters_per_second_squared_t(baseMoving->acceleration().y()) * units::math::cos(dynamicsInformation.yaw);
+                dynamicsInformation.positionX = units::length::meter_t(baseMoving->position().x()) - bb_center_offset_x * units::math::cos(dynamicsInformation.yaw);
+                dynamicsInformation.positionY = units::length::meter_t(baseMoving->position().y()) - bb_center_offset_x * units::math::sin(dynamicsInformation.yaw);
+                dynamicsInformation.yawRate = units::angular_velocity::radians_per_second_t(baseMoving->orientation_rate().yaw());
                 yawAcceleration = baseMoving->orientation_acceleration().yaw();
             }
             else
@@ -416,7 +410,7 @@ void OsmpFmuHandler::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterfa
         else if (motionCommandVariable.has_value())
         {
             setlevel4to5::DynamicState dynamicState;
-            if(motionCommand.trajectory().trajectory_point_size() > 0)
+            if (motionCommand.trajectory().trajectory_point_size() > 0)
             {
                 dynamicState = motionCommand.trajectory().trajectory_point(0);
             }
@@ -425,11 +419,11 @@ void OsmpFmuHandler::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterfa
                 dynamicState = motionCommand.current_state();
             }
 
-            acceleration = dynamicState.acceleration();
-            velocity = dynamicState.velocity();
-            positionX = dynamicState.position_x() - bb_center_offset_x * std::cos(yaw);
-            positionY = dynamicState.position_y() - bb_center_offset_x * std::sin(yaw);
-            yaw = dynamicState.heading_angle();
+            dynamicsInformation.acceleration = units::acceleration::meters_per_second_squared_t(dynamicState.acceleration());
+            dynamicsInformation.velocity = units::velocity::meters_per_second_t(dynamicState.velocity());
+            dynamicsInformation.positionX = units::length::meter_t(dynamicState.position_x()) - bb_center_offset_x * units::math::cos(dynamicsInformation.yaw);
+            dynamicsInformation.positionY = units::length::meter_t(dynamicState.position_y()) - bb_center_offset_x * units::math::sin(dynamicsInformation.yaw);
+            dynamicsInformation.yaw = units::angle::radian_t(dynamicState.heading_angle());
         }
 #endif
         else
@@ -437,29 +431,19 @@ void OsmpFmuHandler::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterfa
             LOGERRORANDTHROW(log_prefix(agentIdString) + "Cannot provide DynamicsSignal, as neither TrafficUpdate nor MotionCommand are connected");
         }
 
-        if (std::abs(positionX) < EPSILON && std::abs(positionY) < EPSILON)
+        if (units::math::abs(dynamicsInformation.positionX) < EPSILON && units::math::abs(dynamicsInformation.positionY) < EPSILON)
         {
-            positionX = previousPosition.x;
-            positionY = previousPosition.y;
+            dynamicsInformation.positionX = previousPosition.x;
+            dynamicsInformation.positionY = previousPosition.y;
         }
 
-        double deltaX = positionX - previousPosition.x;
-        double deltaY = positionY - previousPosition.y;
-        travelDistance = std::sqrt(deltaX * deltaX + deltaY * deltaY);
-        previousPosition = {positionX, positionY};
+        auto deltaX = dynamicsInformation.positionX - previousPosition.x;
+        auto deltaY = dynamicsInformation.positionY - previousPosition.y;
+        dynamicsInformation.travelDistance = units::math::sqrt(deltaX * deltaX + deltaY * deltaY);
+        previousPosition = {dynamicsInformation.positionX, dynamicsInformation.positionY};
 
         data = std::make_shared<DynamicsSignal const>(ComponentState::Acting,
-                                                      acceleration,
-                                                      velocity,
-                                                      positionX,
-                                                      positionY,
-                                                      yaw,
-                                                      yawRate,
-                                                      yawAcceleration,
-                                                      roll,
-                                                      steeringWheelAngle,
-                                                      centripetalAcceleration,
-                                                      travelDistance);
+                                                      dynamicsInformation);
     }
 }
 
@@ -468,13 +452,13 @@ void OsmpFmuHandler::Init()
     SetFmuParameters();
     if (groundTruthVariable.has_value())
     {
-        auto* worldData = static_cast<OWL::Interfaces::WorldData*>(world->GetWorldData());
+        auto *worldData = static_cast<OWL::Interfaces::WorldData *>(world->GetWorldData());
         const auto& groundTruth = worldData->GetOsiGroundTruth();
 
         fmi2_integer_t fmuInputValues[3];
-        fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(groundTruthVariable.value()+".base.lo").first,
-                                                     fmuVariables.at(groundTruthVariable.value()+".base.hi").first,
-                                                     fmuVariables.at(groundTruthVariable.value()+".size").first};
+        fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(groundTruthVariable.value() + ".base.lo").first,
+                                                     fmuVariables.at(groundTruthVariable.value() + ".base.hi").first,
+                                                     fmuVariables.at(groundTruthVariable.value() + ".size").first};
 
         groundTruth.SerializeToString(&serializedGroundTruth);
         encode_pointer_to_integer(serializedGroundTruth.data(),
@@ -483,9 +467,9 @@ void OsmpFmuHandler::Init()
         fmuInputValues[2] = serializedGroundTruth.length();
 
         fmi2_import_set_integer(cdata->fmu2,
-                                valueReferences,     // array of value reference
-                                3,                   // number of elements
-                                fmuInputValues);     // array of values
+                                valueReferences, // array of value reference
+                                3,               // number of elements
+                                fmuInputValues); // array of values
         if (writeGroundTruth)
         {
             WriteJson(groundTruth, "GroundTruth.json");
@@ -533,7 +517,7 @@ void OsmpFmuHandler::PreStep(int time)
 {
     if (sensorViewVariable)
     {
-        auto* worldData = static_cast<OWL::Interfaces::WorldData*>(world->GetWorldData());
+        auto *worldData = static_cast<OWL::Interfaces::WorldData *>(world->GetWorldData());
         auto sensorView = worldData->GetSensorView(sensorViewConfig, agent->GetId());
 
         SetSensorViewInput(*sensorView);
@@ -648,20 +632,20 @@ void OsmpFmuHandler::PostStep(int time)
     }
 }
 
-FmuHandlerInterface::FmuValue& OsmpFmuHandler::GetValue(fmi2_value_reference_t valueReference, VariableType variableType) const
+FmuHandlerInterface::FmuValue &OsmpFmuHandler::GetValue(fmi2_value_reference_t valueReference, VariableType variableType) const
 {
     ValueReferenceAndType valueReferenceAndType;
     valueReferenceAndType.emplace<FMI2>(valueReference, variableType);
     return fmuVariableValues->at(valueReferenceAndType);
 }
 
-void OsmpFmuHandler::SetSensorViewInput(const osi3::SensorView& data)
+void OsmpFmuHandler::SetSensorViewInput(const osi3::SensorView &data)
 {
     std::swap(serializedSensorView, previousSerializedSensorView);
     fmi2_integer_t fmuInputValues[3];
-    fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(sensorViewVariable.value()+".base.lo").first,
-                                                 fmuVariables.at(sensorViewVariable.value()+".base.hi").first,
-                                                 fmuVariables.at(sensorViewVariable.value()+".size").first};
+    fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(sensorViewVariable.value() + ".base.lo").first,
+                                                 fmuVariables.at(sensorViewVariable.value() + ".base.hi").first,
+                                                 fmuVariables.at(sensorViewVariable.value() + ".size").first};
 
     data.SerializeToString(&serializedSensorView);
     encode_pointer_to_integer(serializedSensorView.data(),
@@ -670,18 +654,18 @@ void OsmpFmuHandler::SetSensorViewInput(const osi3::SensorView& data)
     fmuInputValues[2] = serializedSensorView.length();
 
     fmi2_import_set_integer(cdata->fmu2,
-                            valueReferences,     // array of value reference
-                            3,                   // number of elements
-                            fmuInputValues);     // array of values
+                            valueReferences, // array of value reference
+                            3,               // number of elements
+                            fmuInputValues); // array of values
 }
 
-void OsmpFmuHandler::SetSensorDataInput(const osi3::SensorData& data)
+void OsmpFmuHandler::SetSensorDataInput(const osi3::SensorData &data)
 {
     std::swap(serializedSensorDataIn, previousSerializedSensorDataIn);
     fmi2_integer_t fmuInputValues[3];
-    fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(sensorDataInVariable.value()+".base.lo").first,
-                                                 fmuVariables.at(sensorDataInVariable.value()+".base.hi").first,
-                                                 fmuVariables.at(sensorDataInVariable.value()+".size").first};
+    fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(sensorDataInVariable.value() + ".base.lo").first,
+                                                 fmuVariables.at(sensorDataInVariable.value() + ".base.hi").first,
+                                                 fmuVariables.at(sensorDataInVariable.value() + ".size").first};
 
     data.SerializeToString(&serializedSensorDataIn);
     encode_pointer_to_integer(serializedSensorDataIn.data(),
@@ -690,15 +674,15 @@ void OsmpFmuHandler::SetSensorDataInput(const osi3::SensorData& data)
     fmuInputValues[2] = serializedSensorDataIn.length();
 
     fmi2_import_set_integer(cdata->fmu2,
-                            valueReferences,     // array of value reference
-                            3,                   // number of elements
-                            fmuInputValues);     // array of values
+                            valueReferences, // array of value reference
+                            3,               // number of elements
+                            fmuInputValues); // array of values
 }
 
 void OsmpFmuHandler::GetSensorData()
 {
-    void* buffer = decode_integer_to_pointer(GetValue(fmuVariables.at(sensorDataOutVariable.value()+".base.hi").first, VariableType::Int).intValue,
-                                             GetValue(fmuVariables.at(sensorDataOutVariable.value()+".base.lo").first, VariableType::Int).intValue);
+    void *buffer = decode_integer_to_pointer(GetValue(fmuVariables.at(sensorDataOutVariable.value() + ".base.hi").first, VariableType::Int).intValue,
+                                             GetValue(fmuVariables.at(sensorDataOutVariable.value() + ".base.lo").first, VariableType::Int).intValue);
 
     if (enforceDoubleBuffering && buffer != nullptr && buffer == previousSensorDataOut)
     {
@@ -708,54 +692,66 @@ void OsmpFmuHandler::GetSensorData()
     }
 
     previousSensorDataOut = buffer;
-    sensorDataOut.ParseFromArray(buffer, GetValue(fmuVariables.at(sensorDataOutVariable.value()+".size").first, VariableType::Int).intValue);
+    sensorDataOut.ParseFromArray(buffer, GetValue(fmuVariables.at(sensorDataOutVariable.value() + ".size").first, VariableType::Int).intValue);
 }
 
-void OsmpFmuHandler::AddTrafficCommandActionFromOpenScenarioTrajectory(osi3::TrafficAction *trafficAction, const openScenario::Trajectory& trajectory)
+void OsmpFmuHandler::AddTrafficCommandActionFromOpenScenarioTrajectory(osi3::TrafficAction *trafficAction, const mantle_api::Trajectory &trajectory)
 {
-    if (trajectory.timeReference.has_value()) {
+    auto trajectoryLine = std::get<mantle_api::PolyLine>(trajectory.type);
+    if (trajectoryLine.front().time.has_value())
+    {
         auto trajectoryAction = trafficAction->mutable_follow_trajectory_action();
-        for (const auto& trajectoryPoint : trajectory.points)
+        for (const auto &trajectoryPoint : trajectoryLine)
         {
             auto statePoint = trajectoryAction->add_trajectory_point();
-            statePoint->mutable_timestamp()->set_seconds(static_cast<google::protobuf::int64>(trajectoryPoint.time));
-            statePoint->mutable_timestamp()->set_nanos(static_cast<google::protobuf::uint32>(std::fmod(trajectoryPoint.time * 1e9, 1e9)));
-            statePoint->mutable_position()->set_x(trajectoryPoint.x);
-            statePoint->mutable_position()->set_y(trajectoryPoint.y);
-            statePoint->mutable_orientation()->set_yaw(trajectoryPoint.yaw);
+
+            if (trajectoryPoint.time.has_value())
+            {
+                const auto &time = trajectoryPoint.time.value();
+                statePoint->mutable_timestamp()->set_seconds(static_cast<google::protobuf::int64>(units::time::second_t(time).value()));
+                statePoint->mutable_timestamp()->set_nanos(static_cast<google::protobuf::uint32>(std::fmod(units::time::second_t(time).value() * 1e9, 1e9)));
+            }
+
+            statePoint->mutable_position()->set_x(trajectoryPoint.pose.position.x.value());
+            statePoint->mutable_position()->set_y(trajectoryPoint.pose.position.y.value());
+            statePoint->mutable_orientation()->set_yaw(trajectoryPoint.pose.orientation.yaw.value());
         }
-    } else {
+    }
+    else
+    {
         auto followPathAction = trafficAction->mutable_follow_path_action();
-        for (const auto& trajectoryPoint : trajectory.points)
+        for (const auto &trajectoryPoint : trajectoryLine)
         {
             auto statePoint = followPathAction->add_path_point();
-            statePoint->mutable_position()->set_x(trajectoryPoint.x);
-            statePoint->mutable_position()->set_y(trajectoryPoint.y);
-            statePoint->mutable_orientation()->set_yaw(trajectoryPoint.yaw);
+            statePoint->mutable_position()->set_x(trajectoryPoint.pose.position.x.value());
+            statePoint->mutable_position()->set_y(trajectoryPoint.pose.position.y.value());
+            statePoint->mutable_orientation()->set_yaw(trajectoryPoint.pose.orientation.yaw.value());
         }
     }
 }
 
 void OsmpFmuHandler::AddTrafficCommandActionFromOpenScenarioPosition(osi3::TrafficAction *trafficAction,
-                                                                     const openScenario::Position &position,
+                                                                     const mantle_api::Position &position,
                                                                      WorldInterface *const worldInterface,
                                                                      const std::function<void(const std::string &)> &errorCallback)
 {
     auto acquireGlobalPositionAction = trafficAction->mutable_acquire_global_position_action();
 
     std::visit(variant_visitor{
-                   [&acquireGlobalPositionAction](const openScenario::WorldPosition &worldPosition) {
-                       acquireGlobalPositionAction->mutable_position()->set_x(worldPosition.x);
-                       acquireGlobalPositionAction->mutable_position()->set_y(worldPosition.y);
-                       if (worldPosition.z.has_value())
-                           acquireGlobalPositionAction->mutable_position()->set_z(worldPosition.z.value());
-                       if (worldPosition.r.has_value())
-                           acquireGlobalPositionAction->mutable_orientation()->set_roll(worldPosition.r.value());
-                       if (worldPosition.p.has_value())
-                           acquireGlobalPositionAction->mutable_orientation()->set_pitch(worldPosition.p.value());
-                       if (worldPosition.h.has_value())
-                           acquireGlobalPositionAction->mutable_orientation()->set_yaw(worldPosition.h.value());
+                   [&acquireGlobalPositionAction](const mantle_api::Vec3<units::length::meter_t> &worldPosition) {
+                       acquireGlobalPositionAction->mutable_position()->set_x(worldPosition.x.value());
+                       acquireGlobalPositionAction->mutable_position()->set_y(worldPosition.y.value());
+                       //                       if (worldPosition.z.has_value())
+                       //                           acquireGlobalPositionAction->mutable_position()->set_z(worldPosition.z.value());
+                       //                       if (worldPosition.r.has_value())
+                       //                           acquireGlobalPositionAction->mutable_orientation()->set_roll(worldPosition.r.value());
+                       //                       if (worldPosition.p.has_value())
+                       //                           acquireGlobalPositionAction->mutable_orientation()->set_pitch(worldPosition.p.value());
+                       //                       if (worldPosition.h.has_value())
+                       //                           acquireGlobalPositionAction->mutable_orientation()->set_yaw(worldPosition.h.value());
                    },
+                   // TODO CK Reactivate after relativObjectPosition is available in MantleAPI
+                   /*
                    [&worldInterface, &errorCallback, &acquireGlobalPositionAction](const openScenario::RelativeObjectPosition &relativeObjectPosition) {
                        const auto entityRef = relativeObjectPosition.entityRef;
                        const auto referencedAgentInterface = worldInterface->GetAgentByName(entityRef);
@@ -773,20 +769,20 @@ void OsmpFmuHandler::AddTrafficCommandActionFromOpenScenarioPosition(osi3::Traff
                            if (orientation.h.has_value())
                                acquireGlobalPositionAction->mutable_orientation()->set_yaw(orientation.h.value());
                        }
-                   },
+                   },*/
                    [&errorCallback](auto &&other) {
                        errorCallback("Position variant not supported for 'openScenario::AcquirePositionAction'");
                    }},
                position);
 }
 
-void OsmpFmuHandler::SetTrafficCommandInput(const osi3::TrafficCommand& data)
+void OsmpFmuHandler::SetTrafficCommandInput(const osi3::TrafficCommand &data)
 {
     std::swap(serializedTrafficCommand, previousSerializedTrafficCommand);
     fmi2_integer_t fmuInputValues[3];
-    fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(trafficCommandVariable.value()+".base.lo").first,
-                                                 fmuVariables.at(trafficCommandVariable.value()+".base.hi").first,
-                                                 fmuVariables.at(trafficCommandVariable.value()+".size").first};
+    fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(trafficCommandVariable.value() + ".base.lo").first,
+                                                 fmuVariables.at(trafficCommandVariable.value() + ".base.hi").first,
+                                                 fmuVariables.at(trafficCommandVariable.value() + ".size").first};
 
     data.SerializeToString(&serializedTrafficCommand);
     encode_pointer_to_integer(serializedTrafficCommand.data(),
@@ -803,9 +799,9 @@ void OsmpFmuHandler::SetTrafficCommandInput(const osi3::TrafficCommand& data)
     fmuInputValues[2] = static_cast<fmi2_integer_t>(length);
 
     fmi2_import_set_integer(cdata->fmu2,
-                            valueReferences,     // array of value reference
-                            3,                   // number of elements
-                            fmuInputValues);     // array of values
+                            valueReferences, // array of value reference
+                            3,               // number of elements
+                            fmuInputValues); // array of values
 }
 
 void OsmpFmuHandler::GetTrafficUpdate()
@@ -824,13 +820,13 @@ void OsmpFmuHandler::GetTrafficUpdate()
 }
 
 #ifdef USE_EXTENDED_OSI
-void OsmpFmuHandler::SetVehicleCommunicationDataInput(const setlevel4to5::VehicleCommunicationData& data)
+void OsmpFmuHandler::SetVehicleCommunicationDataInput(const setlevel4to5::VehicleCommunicationData &data)
 {
     std::swap(serializedVehicleCommunicationData, previousSerializedVehicleCommunicationData);
     fmi2_integer_t fmuInputValues[3];
-    fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(vehicleCommunicationDataVariable.value()+".base.lo").first,
-                                                 fmuVariables.at(vehicleCommunicationDataVariable.value()+".base.hi").first,
-                                                 fmuVariables.at(vehicleCommunicationDataVariable.value()+".size").first};
+    fmi2_value_reference_t valueReferences[3] = {fmuVariables.at(vehicleCommunicationDataVariable.value() + ".base.lo").first,
+                                                 fmuVariables.at(vehicleCommunicationDataVariable.value() + ".base.hi").first,
+                                                 fmuVariables.at(vehicleCommunicationDataVariable.value() + ".size").first};
 
     data.SerializeToString(&serializedVehicleCommunicationData);
     encode_pointer_to_integer(serializedVehicleCommunicationData.data(),
@@ -839,20 +835,22 @@ void OsmpFmuHandler::SetVehicleCommunicationDataInput(const setlevel4to5::Vehicl
     fmuInputValues[2] = serializedVehicleCommunicationData.length();
 
     fmi2_import_set_integer(cdata->fmu2,
-                            valueReferences,     // array of value reference
-                            3,                   // number of elements
-                            fmuInputValues);     // array of values
+                            valueReferences, // array of value reference
+                            3,               // number of elements
+                            fmuInputValues); // array of values
 }
 
-void logAndThrow(const std::string& message, const std::function<void(const std::string&)> &errorCallback) noexcept(false) {
-    if (errorCallback) errorCallback(message);
+void logAndThrow(const std::string &message, const std::function<void(const std::string &)> &errorCallback) noexcept(false)
+{
+    if (errorCallback)
+        errorCallback(message);
     throw std::runtime_error(message);
 }
 
 void OsmpFmuHandler::GetMotionCommand()
 {
-    void* buffer = decode_integer_to_pointer(GetValue(fmuVariables.at(motionCommandVariable.value()+".base.hi").first, VariableType::Int).intValue,
-                                             GetValue(fmuVariables.at(motionCommandVariable.value()+".base.lo").first, VariableType::Int).intValue);
+    void *buffer = decode_integer_to_pointer(GetValue(fmuVariables.at(motionCommandVariable.value() + ".base.hi").first, VariableType::Int).intValue,
+                                             GetValue(fmuVariables.at(motionCommandVariable.value() + ".base.lo").first, VariableType::Int).intValue);
 
     if (enforceDoubleBuffering && buffer != nullptr && buffer == previousMotionCommand)
     {
@@ -860,7 +858,7 @@ void OsmpFmuHandler::GetMotionCommand()
     }
 
     previousMotionCommand = buffer;
-    motionCommand.ParseFromArray(buffer, GetValue(fmuVariables.at(motionCommandVariable.value()+".size").first, VariableType::Int).intValue);
+    motionCommand.ParseFromArray(buffer, GetValue(fmuVariables.at(motionCommandVariable.value() + ".size").first, VariableType::Int).intValue);
 }
 #endif
 
@@ -959,7 +957,7 @@ void OsmpFmuHandler::SetFmuParameters()
 
     fmi2_value_reference_t intvrs[1];
     fmi2_integer_t intData[1];
-    for (const auto& fmuParameter : fmuIntegerParameters)
+    for (const auto &fmuParameter : fmuIntegerParameters)
     {
         intData[0] = fmuParameter.value;
         intvrs[0] = fmuParameter.valueReference;
@@ -981,7 +979,7 @@ void OsmpFmuHandler::SetFmuParameters()
 
     fmi2_value_reference_t boolvrs[1];
     fmi2_boolean_t boolData[1];
-    for (const auto& fmuParameter : fmuBoolParameters)
+    for (const auto &fmuParameter : fmuBoolParameters)
     {
         boolData[0] = fmuParameter.value;
         boolvrs[0] = fmuParameter.valueReference;
@@ -1003,7 +1001,7 @@ void OsmpFmuHandler::SetFmuParameters()
 
     fmi2_value_reference_t stringvrs[1];
     fmi2_string_t stringData[1];
-    for (const auto& fmuParameter : fmuStringParameters)
+    for (const auto &fmuParameter : fmuStringParameters)
     {
         stringData[0] = fmuParameter.value.data();
         stringvrs[0] = fmuParameter.valueReference;
@@ -1045,7 +1043,7 @@ void OsmpFmuHandler::SetMotionCommandDataInput(const setlevel4to5::MotionCommand
 }
 #endif
 
-void OsmpFmuHandler::WriteJson(const google::protobuf::Message& message, const QString& fileName)
+void OsmpFmuHandler::WriteJson(const google::protobuf::Message &message, const QString &fileName)
 {
     QFile file{outputDir + QDir::separator() + fileName};
     file.open(QIODevice::WriteOnly);
@@ -1085,7 +1083,8 @@ std::vector<unsigned char> intToBytes(int paramInt)
     return arrayOfByte;
 }
 
-void OsmpFmuHandler::AppendMessages(std::string& appendedMessage, std::string& message) {
+void OsmpFmuHandler::AppendMessages(std::string &appendedMessage, std::string &message)
+{
     auto length = intToBytes(message.length());
     std::string messageLength{length.begin(), length.end()};
     appendedMessage = appendedMessage + messageLength + message;
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.h b/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.h
index 1e097b3bf01847a64aeae6cf6dd3a7bcaf73bf89..2852c430da52ede92225068882fefb7f8ef70189 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.h
+++ b/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.h
@@ -13,6 +13,8 @@
 
 #include <QString>
 
+#include "MantleAPI/Common/position.h"
+#include "MantleAPI/Common/trajectory.h"
 #include "include/agentInterface.h"
 #include "include/fmuHandlerInterface.h"
 #include "include/parameterInterface.h"
@@ -27,14 +29,13 @@
 #ifdef USE_EXTENDED_OSI
 #include "osi3/sl45_motioncommand.pb.h"
 #include "osi3/sl45_vehiclecommunicationdata.pb.h"
+
 #endif
 
 #include <any>
-#include <regex>
-#include <fstream>
 #include <filesystem>
-
-#include "common/openScenarioDefinitions.h"
+#include <fstream>
+#include <regex>
 
 class CallbackInterface;
 
@@ -68,11 +69,11 @@ public:
 
     //! Adds a trajectory from OpenSCENARIO to a OSI TrafficAction
     static void AddTrafficCommandActionFromOpenScenarioTrajectory(osi3::TrafficAction *trafficAction,
-                                                                  const openScenario::Trajectory& trajectory);
+                                                                  const mantle_api::Trajectory& trajectory);
 
     //! Adds a position from OpenSCENARIO to a OSI TrafficAction
     static void AddTrafficCommandActionFromOpenScenarioPosition(osi3::TrafficAction *trafficAction,
-                                                                const openScenario::Position &position,
+                                                                const mantle_api::Position &position,
                                                                 WorldInterface *worldInterface,
                                                                 const std::function<void(const std::string &)> &errorCallback);
 
@@ -285,12 +286,11 @@ private:
 
     std::map<std::string, std::pair<std::string, int>> fileToOutputTracesMap{};
 
-    Common::Vector2d previousPosition{0.0,0.0};
-
+    Common::Vector2d<units::length::meter_t> previousPosition{0.0_m, 0.0_m};
 
     void AppendMessages(std::string &appendedMessage, std::string& message);
 
     std::ofstream traceOutputFile;
 
-    double bb_center_offset_x{0.0};    //!< Offset of bounding box center to agent reference point (rear axle)
+    units::length::meter_t bb_center_offset_x{0.0};    //!< Offset of bounding box center to agent reference point (rear axle)
 };
diff --git a/sim/src/components/Algorithm_Lateral/src/lateralImpl.cpp b/sim/src/components/Algorithm_Lateral/src/lateralImpl.cpp
index b2d1cfd12f534edc84983f2c6526e3e6a08a3e63..8197ee0490589a5b487f7dce46ca57c483a0d90b 100644
--- a/sim/src/components/Algorithm_Lateral/src/lateralImpl.cpp
+++ b/sim/src/components/Algorithm_Lateral/src/lateralImpl.cpp
@@ -64,9 +64,9 @@ void AlgorithmLateralImplementation::UpdateInput(int localLinkId, const std::sha
         const auto steeringRatio = helper::map::query(signal->vehicleParameters.properties, vehicle::properties::SteeringRatio);
         THROWIFFALSE(steeringRatio.has_value(), "SteeringRatio was not defined in VehicleCatalog");
 
-        steeringController.SetVehicleParameter(steeringRatio.value(),
-                                               signal->vehicleParameters.frontAxle.maxSteering * steeringRatio.value(),
-                                               signal->vehicleParameters.frontAxle.positionX - signal->vehicleParameters.rearAxle.positionX);
+        steeringController.SetVehicleParameter(std::stod(steeringRatio.value()),
+                                               signal->vehicleParameters.front_axle.max_steering * std::stod(steeringRatio.value()),
+                                               signal->vehicleParameters.front_axle.bb_center_to_axle_center.x - signal->vehicleParameters.rear_axle.bb_center_to_axle_center.x);
     }
     else if (localLinkId == 101 || localLinkId == 102)
     {
@@ -105,7 +105,7 @@ void AlgorithmLateralImplementation::UpdateOutput(int localLinkId, std::shared_p
             }
             else
             {
-                data = std::make_shared<SteeringSignal const>(ComponentState::Disabled, 0.0);
+                data = std::make_shared<SteeringSignal const>(ComponentState::Disabled, 0.0_rad);
             }
         }
         catch(const std::bad_alloc&)
@@ -125,5 +125,5 @@ void AlgorithmLateralImplementation::UpdateOutput(int localLinkId, std::shared_p
 
 void AlgorithmLateralImplementation::Trigger(int time)
 {
-    out_desiredSteeringWheelAngle = steeringController.CalculateSteeringAngle(time);
+    out_desiredSteeringWheelAngle = steeringController.CalculateSteeringAngle(units::time::millisecond_t(time));
 }
diff --git a/sim/src/components/Algorithm_Lateral/src/lateralImpl.h b/sim/src/components/Algorithm_Lateral/src/lateralImpl.h
index f2fbebc093c7b474bf4f7de21e8910a00bdf5bce..2b1741b7e2e867cf51e05c1d2277d2326788759b 100644
--- a/sim/src/components/Algorithm_Lateral/src/lateralImpl.h
+++ b/sim/src/components/Algorithm_Lateral/src/lateralImpl.h
@@ -166,7 +166,7 @@ protected:
     SteeringController steeringController{};
 
     //! The steering wheel angle wish of the driver in radian
-    double out_desiredSteeringWheelAngle{0};
+    units::angle::radian_t out_desiredSteeringWheelAngle{0};
 
     bool isActive{false};
 };
diff --git a/sim/src/components/Algorithm_Lateral/src/steeringController.cpp b/sim/src/components/Algorithm_Lateral/src/steeringController.cpp
index 9eb196bbd34df7384014dd84ee89c6bec9f316af..ec531db360cf54a1c69b550d56073c1820cacb62 100644
--- a/sim/src/components/Algorithm_Lateral/src/steeringController.cpp
+++ b/sim/src/components/Algorithm_Lateral/src/steeringController.cpp
@@ -21,31 +21,33 @@
 #include "common/commonTools.h"
 #include "common/globalDefinitions.h"
 
-double SteeringController::CalculateSteeringAngle(int time)
+using namespace units::literals;
+
+units::angle::radian_t SteeringController::CalculateSteeringAngle(units::time::millisecond_t time)
 {
     // Time step length
-    double dt{(time - timeLast) * 0.001};
-    tAverage = .05;
-    double velocityForCalculations = std::fmax(20. / 3.6, in_velocity);
+    auto dt = time - timeLast;
+    tAverage = .05_s;
+    auto velocityForCalculations = units::math::fmax(20.0_mps, in_velocity);
     // Scale gains to current velocity. Linear interpolation between 0 and default values at 200km/h.
-    double velocityFactor = std::clamp(3.6 / 150. * velocityForCalculations, .15, 1.);
-    in_lateralSignal.gainLateralDeviation *= velocityFactor;
-    in_lateralSignal.gainHeadingError *= velocityFactor;
+    double velocityFactor = std::clamp(units::unit_cast<double>(velocityForCalculations / 150.0_kph), .15, 1.);
+    in_lateralSignal.lateralInformation.gainDeviation *= velocityFactor;
+    in_lateralSignal.lateralInformation.gainHeadingError *= velocityFactor;
     tAverage = tAverage / velocityFactor;
 
     // Controller for lateral deviation
-    double deltaHLateralDeviation = in_lateralSignal.gainLateralDeviation
+    units::angle::radian_t deltaHLateralDeviation = in_lateralSignal.lateralInformation.gainDeviation
             * in_steeringRatio * in_wheelBase / (velocityForCalculations * velocityForCalculations)
-            * in_lateralSignal.lateralDeviation;
+            * in_lateralSignal.lateralInformation.deviation;
 
     // Controller for heading angle error
-    double deltaHHeadingError = in_lateralSignal.gainHeadingError
+    units::angle::radian_t deltaHHeadingError = in_lateralSignal.lateralInformation.gainHeadingError
             * in_steeringRatio * in_wheelBase / velocityForCalculations
-            * in_lateralSignal.headingError;
+            * in_lateralSignal.lateralInformation.headingError;
 
     // Controller for road curvature
-    double meanCurvatureToNearPoint = 0.;
-    double meanCurvatureToFarPoint = 0.;
+    units::curvature::inverse_meter_t meanCurvatureToNearPoint{0.0};
+    units::curvature::inverse_meter_t meanCurvatureToFarPoint{0.0};
     if (!in_lateralSignal.curvatureOfSegmentsToNearPoint.empty())
     {
         for (unsigned int i = 0; i < in_lateralSignal.curvatureOfSegmentsToNearPoint.size(); ++i)
@@ -67,11 +69,11 @@ double SteeringController::CalculateSteeringAngle(int time)
     }
 
     // Smooth curvatures with a running average filter
-    double meanCurvatureToNearPointSmooth = (dt * meanCurvatureToNearPoint + (tAverage - dt) *
+    units::curvature::inverse_meter_t meanCurvatureToNearPointSmooth = (dt * meanCurvatureToNearPoint + (tAverage - dt) *
                                              meanCurvatureToNearPointSmoothLast) / tAverage;
-    double meanCurvatureToFarPointSmooth = (dt * meanCurvatureToFarPoint + (tAverage - dt) *
+    units::curvature::inverse_meter_t meanCurvatureToFarPointSmooth = (dt * meanCurvatureToFarPoint + (tAverage - dt) *
                                             meanCurvatureToFarPointSmoothLast) / tAverage;
-    double curvatureRoadSmooth = (dt * in_lateralSignal.kappaRoad + (tAverage - dt) * curvatureRoadSmoothLast) / tAverage;
+    units::curvature::inverse_meter_t curvatureRoadSmooth = (dt * in_lateralSignal.kappaRoad + (tAverage - dt) * curvatureRoadSmoothLast) / tAverage;
 
     // Weighting of different curvature Information RoadSmooth, road, nearPointSmooth, farPointSmooth, nearPointMax
     std::vector <double> weighingCurvaturePortions = {.75, 0.25, .15, -.10};
@@ -85,28 +87,28 @@ double SteeringController::CalculateSteeringAngle(int time)
         weighingCurvaturePortions.at(3) = 0.;
     }
 
-    double calc_kappaRoadAnticipated = (weighingCurvaturePortions.at(0) * curvatureRoadSmooth +
-                                        weighingCurvaturePortions.at(1) * in_lateralSignal.kappaRoad +
-                                        weighingCurvaturePortions.at(2) * meanCurvatureToNearPointSmooth +
-                                        weighingCurvaturePortions.at(3) * meanCurvatureToFarPointSmooth) /
+    units::curvature::inverse_meter_t calc_kappaRoadAnticipated = (weighingCurvaturePortions.at(0) * curvatureRoadSmooth +
+                                                                   weighingCurvaturePortions.at(1) * in_lateralSignal.kappaRoad +
+                                                                   weighingCurvaturePortions.at(2) * meanCurvatureToNearPointSmooth +
+                                                                   weighingCurvaturePortions.at(3) * meanCurvatureToFarPointSmooth) /
             (weighingCurvaturePortions.at(0) + weighingCurvaturePortions.at(1) +
              weighingCurvaturePortions.at(2) + weighingCurvaturePortions.at(3));
 
     // Controller for road curvaturedelta due to manoeuvre
-    double deltaHkappa = std::atan((in_lateralSignal.kappaManoeuvre + calc_kappaRoadAnticipated) * in_wheelBase)
+    units::angle::radian_t deltaHkappa = units::math::atan((in_lateralSignal.lateralInformation.kappaManoeuvre + calc_kappaRoadAnticipated) * in_wheelBase)
             * in_steeringRatio;
 
 
     // Total steering wheel angle
-    double deltaH = deltaHLateralDeviation + deltaHHeadingError + deltaHkappa;
+    auto deltaH = deltaHLateralDeviation + deltaHHeadingError + deltaHkappa;
 
     // Limit steering wheel velocity. Human limit set to 320°/s.
-    constexpr double HUMAN_LIMIT {320.0 * M_PI / 180.0};
-    const auto maxDeltaSteeringWheelAngle = (HUMAN_LIMIT / velocityFactor) * dt;
+    const units::angular_velocity::radians_per_second_t HUMAN_LIMIT {320.0 * M_PI / 180.0};
+    const units::angle::radian_t maxDeltaSteeringWheelAngle = (HUMAN_LIMIT / velocityFactor) * dt;
     const auto deltaSteeringWheelAngle = deltaH - in_steeringWheelAngle;
-    if (std::fabs(deltaSteeringWheelAngle) > maxDeltaSteeringWheelAngle)
+    if (units::math::fabs(deltaSteeringWheelAngle) > maxDeltaSteeringWheelAngle)
     {
-        deltaH = std::copysign(maxDeltaSteeringWheelAngle, deltaSteeringWheelAngle) + in_steeringWheelAngle;
+        deltaH = units::angle::radian_t(std::copysign(maxDeltaSteeringWheelAngle.value(), deltaSteeringWheelAngle.value())) + in_steeringWheelAngle;
     }
 
     const auto desiredSteeringWheelAngle = std::clamp(deltaH, -in_steeringMax, in_steeringMax);
@@ -116,5 +118,5 @@ double SteeringController::CalculateSteeringAngle(int time)
     meanCurvatureToFarPointSmoothLast = meanCurvatureToFarPointSmooth;
     curvatureRoadSmoothLast = curvatureRoadSmooth;
 
-    return desiredSteeringWheelAngle;
+    return units::angle::radian_t(desiredSteeringWheelAngle);
 }
diff --git a/sim/src/components/Algorithm_Lateral/src/steeringController.h b/sim/src/components/Algorithm_Lateral/src/steeringController.h
index a82930a67a7991dfff2b978ab8e6ca4b24df68ff..3cd9ad4ba1fe53336d1b551fe60a89e99b065677 100644
--- a/sim/src/components/Algorithm_Lateral/src/steeringController.h
+++ b/sim/src/components/Algorithm_Lateral/src/steeringController.h
@@ -29,7 +29,7 @@ public:
     *
     * return    steering angle
     */
-    double CalculateSteeringAngle(int time);
+    units::angle::radian_t CalculateSteeringAngle(units::time::millisecond_t time);
 
     /*!
     * \brief Sets the lateral input, which contains the desired lateral position.
@@ -49,8 +49,8 @@ public:
     * @param[in]     wheelbase                                  wheelbase
     */
     void SetVehicleParameter(const double &steeringRatio,
-                             const double &maximumSteeringWheelAngleAmplitude,
-                             const double &wheelbase)
+                             const units::angle::radian_t &maximumSteeringWheelAngleAmplitude,
+                             const units::length::meter_t &wheelbase)
     {
         in_steeringRatio = steeringRatio;
         in_steeringMax = maximumSteeringWheelAngleAmplitude;
@@ -63,8 +63,8 @@ public:
     * @param[in]     velocity                              Current velocity
     * @param[in]     steeringWheelAngle         Current steeringwheel angle
     */
-    void SetVelocityAndSteeringWheelAngle(const double &velocity,
-                                          const double &steeringWheelAngle)
+    void SetVelocityAndSteeringWheelAngle(const units::velocity::meters_per_second_t &velocity,
+                                          const units::angle::radian_t &steeringWheelAngle)
     {
         in_velocity = velocity;
         in_steeringWheelAngle = steeringWheelAngle;
@@ -78,29 +78,29 @@ protected:
     LateralSignal in_lateralSignal {};
 
     //! current velocity
-    double in_velocity = 0.0;
+    units::velocity::meters_per_second_t in_velocity{0.0};
     //! current angle of the steering wheel
-    double in_steeringWheelAngle = 0.0;
+    units::angle::radian_t in_steeringWheelAngle{0.0};
 
     //! The steering ratio of the vehicle.
     double in_steeringRatio = 10.7;
     //! The maximum steering wheel angle of the car in both directions in degree.
-    double in_steeringMax = 180.0;
+    units::angle::radian_t in_steeringMax{180.0};
     //! The wheelbase of the car in m.
-    double in_wheelBase = 2.89;
+    units::length::meter_t in_wheelBase {2.89};
 
     //  --- Internal Parameters
 
     //! Time to Average regulation over
-    double tAverage {0.};
+    units::time::second_t tAverage {0.};
     /** @} @} */
 
     //! Previous scheduling time (for calculation of cycle time lenght).
-    int timeLast {-100};
+    units::time::millisecond_t timeLast {-100};
     //! running average of  mean curvature up to NearPoint
-    double meanCurvatureToNearPointSmoothLast {0.};
+    units::curvature::inverse_meter_t meanCurvatureToNearPointSmoothLast {0.};
     //! running average of  mean curvature from NearPoint up to FarPoint
-    double meanCurvatureToFarPointSmoothLast {0.};
+    units::curvature::inverse_meter_t meanCurvatureToFarPointSmoothLast {0.};
     //! running average of kappaRoad at referencepoint
-    double curvatureRoadSmoothLast {0.};
+    units::curvature::inverse_meter_t curvatureRoadSmoothLast {0.};
 };
diff --git a/sim/src/components/Algorithm_Longitudinal/src/algo_longImpl.cpp b/sim/src/components/Algorithm_Longitudinal/src/algo_longImpl.cpp
index 10774c2899f27159b765f985736137ef58eb1e42..7b7e5f68cacd9463f6f69357137a156d9c22bc99 100644
--- a/sim/src/components/Algorithm_Longitudinal/src/algo_longImpl.cpp
+++ b/sim/src/components/Algorithm_Longitudinal/src/algo_longImpl.cpp
@@ -135,7 +135,7 @@ void AlgorithmLongitudinalImplementation::Trigger(int time)
 
 void AlgorithmLongitudinalImplementation::CalculatePedalPositionAndGear()
 {
-    if (currentVelocity == 0 && accelerationWish == 0)
+    if (currentVelocity == 0_mps && accelerationWish == 0_mps_sq)
     {
             out_accPedalPos = 0;
             out_brakePedalPos = 0;
diff --git a/sim/src/components/Algorithm_Longitudinal/src/algo_longImpl.h b/sim/src/components/Algorithm_Longitudinal/src/algo_longImpl.h
index 4a14a9e5361eb7a62424f55e45696a926c4c1eef..d8f2ec46f17b4f47c9e85664154fd2d504b3203b 100644
--- a/sim/src/components/Algorithm_Longitudinal/src/algo_longImpl.h
+++ b/sim/src/components/Algorithm_Longitudinal/src/algo_longImpl.h
@@ -38,7 +38,7 @@
 * Init input variables:
 * name | meaning
 * -----|------
-* vehicleModelParameters | VehicleModelParameters
+* vehicleModelParameters | mantle_api::VehicleProperties
 *
 * Init input channel IDs:
 * Input Id | signal class | contained variables
@@ -146,10 +146,10 @@ private:
     bool initializedSensorDriverData{false};
 
     //! The wish acceleration of the agent in m/s^2.
-    double accelerationWish{0.0};
+    units::acceleration::meters_per_second_squared_t accelerationWish{0.0};
 
     //! current agent velocity
-    double currentVelocity{0.0};
+    units::velocity::meters_per_second_t currentVelocity{0.0};
 
     //  --- Outputs
 
@@ -163,6 +163,6 @@ private:
     //  --- Init Inputs
 
     //! contains: double carMass; double rDyn and more;
-    VehicleModelParameters vehicleModelParameters;
+    mantle_api::VehicleProperties vehicleModelParameters;
 
 };
diff --git a/sim/src/components/Algorithm_Longitudinal/src/longCalcs.cpp b/sim/src/components/Algorithm_Longitudinal/src/longCalcs.cpp
index 45620d9fe357f0a46603a68d58bf13db64a062e9..aa6ceff1480888322409c312de11c528c7049135 100644
--- a/sim/src/components/Algorithm_Longitudinal/src/longCalcs.cpp
+++ b/sim/src/components/Algorithm_Longitudinal/src/longCalcs.cpp
@@ -2,6 +2,7 @@
  * Copyright (c) 2020 HLRS, University of Stuttgart
  *               2016-2017 ITK Engineering GmbH
  *               2019 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -23,13 +24,15 @@
 #include "common/commonTools.h"
 #include "components/common/vehicleProperties.h"
 
-AlgorithmLongitudinalCalculations::AlgorithmLongitudinalCalculations(double xVel,
-                                                                     double in_aVehicle,
-                                                                     const VehicleModelParameters &vehicleModelParameters,
+using namespace units::literals;
+
+AlgorithmLongitudinalCalculations::AlgorithmLongitudinalCalculations(units::velocity::meters_per_second_t velocity,
+                                                                     units::acceleration::meters_per_second_squared_t accelerationWish,
+                                                                     const mantle_api::VehicleProperties &vehicleModelParameters,
                                                                      std::function<void (CbkLogLevel, const char*, int, const std::string&)> Log) :
     Log(Log),
-    velocity(xVel),
-    accelerationWish(in_aVehicle),
+    velocity(velocity),
+    accelerationWish(accelerationWish),
     vehicleModelParameters(vehicleModelParameters)
 {
 }
@@ -44,7 +47,7 @@ double AlgorithmLongitudinalCalculations::GetAcceleratorPedalPosition() const
     return acceleratorPedalPosition;
 }
 
-double AlgorithmLongitudinalCalculations::GetEngineSpeed() const
+units::angular_velocity::revolutions_per_minute_t AlgorithmLongitudinalCalculations::GetEngineSpeed() const
 {
     return engineSpeed;
 }
@@ -54,11 +57,11 @@ int AlgorithmLongitudinalCalculations::GetGear() const
     return gear;
 }
 
-double AlgorithmLongitudinalCalculations::GetEngineTorqueAtGear(int gear, double acceleration)
+units::torque::newton_meter_t AlgorithmLongitudinalCalculations::GetEngineTorqueAtGear(int gear, const units::acceleration::meters_per_second_squared_t &acceleration)
 {
-    if (acceleration == 0 || gear == 0)
+    if (acceleration == 0_mps_sq || gear == 0)
     {
-        return 0;
+        return 0.0_Nm;
     }
 
     if (gear > GetVehicleProperty(vehicle::properties::NumberOfGears) || gear < 0)
@@ -66,8 +69,8 @@ double AlgorithmLongitudinalCalculations::GetEngineTorqueAtGear(int gear, double
         throw std::runtime_error("Gear in AlgorithmLongitudinal is invalid");
     }
 
-    double wheelSetTorque = GetVehicleProperty(vehicle::properties::Mass) * 0.5 * vehicleModelParameters.rearAxle.wheelDiameter * acceleration;
-    double engineTorqueAtGear = wheelSetTorque / (GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(gear)));
+    units::torque::newton_meter_t wheelSetTorque = vehicleModelParameters.mass * 0.5 * vehicleModelParameters.rear_axle.wheel_diameter * units::acceleration::meters_per_second_squared_t(acceleration);
+    auto engineTorqueAtGear = wheelSetTorque / (GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(gear)));
 
     return engineTorqueAtGear;
 }
@@ -76,41 +79,41 @@ double AlgorithmLongitudinalCalculations::GetVehicleProperty(const std::string&
 {
     const auto property = helper::map::query(vehicleModelParameters.properties, propertyName);
     THROWIFFALSE(property.has_value(), "Vehicle property \"" + propertyName + "\" was not set in the VehicleCatalog");
-    return property.value();
+    return std::stod(property.value());
 }
 
-double AlgorithmLongitudinalCalculations::GetEngineSpeedByVelocity(double xVel, int gear)
+units::angular_velocity::revolutions_per_minute_t AlgorithmLongitudinalCalculations::GetEngineSpeedByVelocity(const units::velocity::meters_per_second_t &xVel, int gear)
 {
-    return (xVel * GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(gear)) * 60) / (vehicleModelParameters.rearAxle.wheelDiameter * M_PI); // an dynamic wheel radius rDyn must actually be used here
+    return 1_rad * (xVel * GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(gear))) / (vehicleModelParameters.rear_axle.wheel_diameter * 0.5); // an dynamic wheel radius rDyn must actually be used here
 }
 
 void AlgorithmLongitudinalCalculations::CalculateGearAndEngineSpeed()
 {
-    std::map<double, int> nEngineSet;
-    std::map<double, std::tuple<int, double, double>> minDeltaAccWheelBased;
+    std::map<units::angular_velocity::revolutions_per_minute_t, int> nEngineSet;
+    std::map<units::acceleration::meters_per_second_squared_t, std::tuple<int, units::angular_velocity::revolutions_per_minute_t, units::acceleration::meters_per_second_squared_t>> minDeltaAccWheelBased;
 
     const auto numberOfGears = GetVehicleProperty(vehicle::properties::NumberOfGears);
     for (int gear = 1; gear <= numberOfGears; ++gear)
     {
-        double engineSpeed = GetEngineSpeedByVelocity(velocity, gear);
-        double limitWheelAcc;
-        double accDelta;
+        const auto engineSpeed = GetEngineSpeedByVelocity(velocity, gear);
+        units::acceleration::meters_per_second_squared_t limitWheelAcc;
+        units::acceleration::meters_per_second_squared_t accDelta;
 
-        if (accelerationWish >= 0)
+        if (accelerationWish >= 0_mps_sq)
         {
-            double MMax = GetEngineTorqueMax(engineSpeed);
+            auto MMax = GetEngineTorqueMax(engineSpeed);
             limitWheelAcc = GetAccFromEngineTorque(MMax, gear);
 
-            if(accelerationWish == 0)
-                accDelta = 0;
+            if(accelerationWish == 0_mps_sq)
+                accDelta = 0_mps_sq;
             else
-                accDelta = std::fabs(accelerationWish - limitWheelAcc);
+                accDelta = units::math::fabs(accelerationWish - limitWheelAcc);
         }
         else
         {
-            double MMin = GetEngineTorqueMin(engineSpeed);
+            auto MMin = GetEngineTorqueMin(engineSpeed);
             limitWheelAcc = GetAccFromEngineTorque(MMin, gear);
-            accDelta = std::fabs(accelerationWish - limitWheelAcc);
+            accDelta = units::math::fabs(accelerationWish - limitWheelAcc);
         }
 
         nEngineSet[engineSpeed] = gear;
@@ -147,46 +150,46 @@ void AlgorithmLongitudinalCalculations::CalculateGearAndEngineSpeed()
     // trim wish acceleration to possible value
     gear = std::get<0>(val);
     engineSpeed = std::get<1>(val);
-    accelerationWish = std::min(accelerationWish, std::get<2>(val));
+    accelerationWish = units::math::min(accelerationWish, std::get<2>(val));
 }
 
 
-bool AlgorithmLongitudinalCalculations::isWithinEngineLimits(int gear, double engineSpeed, double acceleration)
+bool AlgorithmLongitudinalCalculations::isWithinEngineLimits(int gear, const units::angular_velocity::revolutions_per_minute_t &engineSpeed, const units::acceleration::meters_per_second_squared_t &acceleration)
 {
     if(!isEngineSpeedWithinEngineLimits(engineSpeed))
     {
         return false;
     }
 
-    double currentWishTorque = GetEngineTorqueAtGear(gear, acceleration);
+    auto currentWishTorque = GetEngineTorqueAtGear(gear, acceleration);
 
     return isTorqueWithinEngineLimits(currentWishTorque, engineSpeed);
 }
 
-bool AlgorithmLongitudinalCalculations::isTorqueWithinEngineLimits(double torque, double engineSpeed)
+bool AlgorithmLongitudinalCalculations::isTorqueWithinEngineLimits(const units::torque::newton_meter_t &torque, const units::angular_velocity::revolutions_per_minute_t &engineSpeed)
 {
-    double currentMEngMax = GetEngineTorqueMax(engineSpeed);
+    auto currentMEngMax = GetEngineTorqueMax(engineSpeed);
 
     return torque <= currentMEngMax;
 }
 
-inline bool AlgorithmLongitudinalCalculations::isEngineSpeedWithinEngineLimits(double engineSpeed)
+inline bool AlgorithmLongitudinalCalculations::isEngineSpeedWithinEngineLimits(const units::angular_velocity::revolutions_per_minute_t &engineSpeed)
 {
-    return (engineSpeed >= GetVehicleProperty(vehicle::properties::MinimumEngineSpeed) && engineSpeed <= GetVehicleProperty(vehicle::properties::MaximumEngineSpeed));
+    return (engineSpeed >= units::angular_velocity::revolutions_per_minute_t(GetVehicleProperty(vehicle::properties::MinimumEngineSpeed)) && engineSpeed <= units::angular_velocity::revolutions_per_minute_t(GetVehicleProperty(vehicle::properties::MaximumEngineSpeed)));
 }
 
-double AlgorithmLongitudinalCalculations::GetEngineTorqueMax(double engineSpeed)
+units::torque::newton_meter_t AlgorithmLongitudinalCalculations::GetEngineTorqueMax(const units::angular_velocity::revolutions_per_minute_t &engineSpeed)
 {
-    const double maximumEngineTorque = GetVehicleProperty(vehicle::properties::MaximumEngineTorque);
-    const double maximumEngineSpeed = GetVehicleProperty(vehicle::properties::MaximumEngineSpeed);
-    const double minimumEngineSpeed = GetVehicleProperty(vehicle::properties::MinimumEngineSpeed);
+    const units::torque::newton_meter_t maximumEngineTorque {GetVehicleProperty(vehicle::properties::MaximumEngineTorque)};
+    const units::angular_velocity::revolutions_per_minute_t maximumEngineSpeed{GetVehicleProperty(vehicle::properties::MaximumEngineSpeed)};
+    const units::angular_velocity::revolutions_per_minute_t minimumEngineSpeed{GetVehicleProperty(vehicle::properties::MinimumEngineSpeed)};
 
-    double torqueMax = maximumEngineTorque; // initial value at max
-    double speed = engineSpeed;
+    auto torqueMax = maximumEngineTorque; // initial value at max
+    auto speed = engineSpeed;
 
-    bool isLowerSection = engineSpeed < minimumEngineSpeed + 1000;
+    bool isLowerSection = engineSpeed < minimumEngineSpeed + 1000_rpm;
     bool isBeyondLowerSectionBorder = engineSpeed < minimumEngineSpeed;
-    bool isUpperSection = engineSpeed > maximumEngineSpeed - 1000;
+    bool isUpperSection = engineSpeed > maximumEngineSpeed - 1000_rpm;
     bool isBeyondUpperSectionBorder = engineSpeed > maximumEngineSpeed;
 
 
@@ -195,8 +198,10 @@ double AlgorithmLongitudinalCalculations::GetEngineTorqueMax(double engineSpeed)
         if (isBeyondLowerSectionBorder) // not within limits
         {
                speed = minimumEngineSpeed;
-         }
-        torqueMax = (1000 - (speed - minimumEngineSpeed)) * -0.1 + maximumEngineTorque;
+        }
+
+        const auto tempEngineSpeed = 1000_rpm - (speed - minimumEngineSpeed);
+        torqueMax = units::inverse_radian(0.5 / M_PI) * (tempEngineSpeed)*units::unit_t<units::compound_unit<units::torque::newton_meter, units::time::minute>>(-0.1) + maximumEngineTorque;
     }
     else if (isUpperSection)
     {
@@ -204,54 +209,60 @@ double AlgorithmLongitudinalCalculations::GetEngineTorqueMax(double engineSpeed)
         {
             speed = maximumEngineSpeed;
         }
-        torqueMax = (speed - maximumEngineSpeed + 1000) * -0.04 + maximumEngineTorque;
+        
+        const auto tempEngineSpeed = speed - maximumEngineSpeed + 1000_rpm;
+        torqueMax = units::inverse_radian(0.5 / M_PI) * tempEngineSpeed * units::unit_t<units::compound_unit<units::torque::newton_meter, units::time::minute>>(-0.04) + maximumEngineTorque;
     }
 
     return torqueMax;
 }
 
-double AlgorithmLongitudinalCalculations::GetEngineTorqueMin(double engineSpeed)
+units::torque::newton_meter_t AlgorithmLongitudinalCalculations::GetEngineTorqueMin(const units::angular_velocity::revolutions_per_minute_t& engineSpeed)
 {
     return GetEngineTorqueMax(engineSpeed) * -.1;
 }
 
-double AlgorithmLongitudinalCalculations::GetAccFromEngineTorque(double engineTorque, int chosenGear)
+units::acceleration::meters_per_second_squared_t AlgorithmLongitudinalCalculations::GetAccFromEngineTorque(const units::torque::newton_meter_t &engineTorque, int chosenGear)
 {
-    double wheelSetTorque = engineTorque * (GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(chosenGear)));
-    double wheelSetForce = wheelSetTorque / (0.5 * vehicleModelParameters.rearAxle.wheelDiameter);
-    return wheelSetForce / GetVehicleProperty(vehicle::properties::Mass);
+    const auto wheelSetTorque = engineTorque * (GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(chosenGear)));
+    const units::force::newton_t wheelSetForce = wheelSetTorque / (0.5 * vehicleModelParameters.rear_axle.wheel_diameter);
+    return wheelSetForce / vehicleModelParameters.mass;
 }
 
 void AlgorithmLongitudinalCalculations::CalculatePedalPositions()
 {
-    constexpr double oneG = 9.81;
+    const units::acceleration::meters_per_second_squared_t oneG{9.81};
 
-    if (accelerationWish < 0) // speed shall be reduced with drag or brake
+    units::angular_velocity::revolutions_per_minute_t engineSpeedInUnits(engineSpeed);
+
+    if (accelerationWish < 0.0_mps_sq) // speed shall be reduced with drag or brake
     {
 
-        double engineTorque = GetEngineTorqueAtGear(gear, accelerationWish);
-        double MDragMax = GetEngineTorqueMin(engineSpeed);
+        const auto engineTorque = GetEngineTorqueAtGear(gear, accelerationWish);
+        const auto MDragMax = GetEngineTorqueMin(engineSpeedInUnits);
 
         if (engineTorque < MDragMax)
         { // brake
 
             // calculate acceleration of MDragMax and substract
             // this from in_aVehicle since brake and drag work in parallel while clutch is closed
-            double accMDragMax = GetAccFromEngineTorque(MDragMax, gear);
+            const auto accMDragMax = GetAccFromEngineTorque(MDragMax, gear);
 
             acceleratorPedalPosition = 0.0;
-            brakePedalPosition = std::min(-(accelerationWish - accMDragMax) / oneG, 1.0);
+
+            const auto pedalPositionBasedOnAcceleration = -(accelerationWish - accMDragMax) / oneG;
+            brakePedalPosition = std::min(pedalPositionBasedOnAcceleration.value(), 1.0);
             return;
         }
     }
 
     // cases of acceleration and drag => use engine here
 
-    double MDragMax = GetEngineTorqueMin(engineSpeed);
-    double MTorqueMax = GetEngineTorqueMax(engineSpeed);
+    const auto MDragMax = GetEngineTorqueMin(engineSpeedInUnits);
+    const auto MTorqueMax = GetEngineTorqueMax(engineSpeedInUnits);
 
-    double wishTorque = GetEngineTorqueAtGear(gear, accelerationWish);
+    const auto wishTorque = GetEngineTorqueAtGear(gear, accelerationWish);
 
-    acceleratorPedalPosition = std::min((wishTorque - MDragMax) / (MTorqueMax - MDragMax), 1.0);
+    acceleratorPedalPosition = std::min(units::unit_cast<double>((wishTorque - MDragMax) / (MTorqueMax - MDragMax)), 1.0);
     brakePedalPosition = 0.0;
 }
diff --git a/sim/src/components/Algorithm_Longitudinal/src/longCalcs.h b/sim/src/components/Algorithm_Longitudinal/src/longCalcs.h
index 403863c801b7faeab8be25442bf2f48ab42a667e..7e2ebd60b6faab5303eb09e2e53c384a0fb5c1b8 100644
--- a/sim/src/components/Algorithm_Longitudinal/src/longCalcs.h
+++ b/sim/src/components/Algorithm_Longitudinal/src/longCalcs.h
@@ -24,9 +24,10 @@
 #include <vector>
 #include <functional>
 
-#include "common/globalDefinitions.h"
 #include "include/callbackInterface.h"
 
+#include <MantleAPI/Traffic/entity_properties.h>
+
 //! \brief This class does all the calculations in the Algorithm_Longitudinal module.
 //!
 //! Based on the current velocity of the agent and a desired acceleration, this class calculates the
@@ -45,7 +46,7 @@ public:
     //! \param accelerationWish         desired acceleration (can be negative)
     //! \param vehicleModelParameters   parameters of the vehicle model
     //!
-    AlgorithmLongitudinalCalculations(double velocity, double accelerationWish, const VehicleModelParameters &vehicleModelParameters, std::function<void (CbkLogLevel, const char*, int, const std::string &)> Log);
+    AlgorithmLongitudinalCalculations(units::velocity::meters_per_second_t velocity, units::acceleration::meters_per_second_squared_t accelerationWish, const mantle_api::VehicleProperties &vehicleModelParameters, std::function<void (CbkLogLevel, const char*, int, const std::string &)> Log);
 
     //!
     //! \brief Calculates the necessary gear and engine to achieve the desired acceleration at the current velocity
@@ -71,7 +72,7 @@ public:
     //!
     //! \return Calculated engine speed
     //!
-    double GetEngineSpeed() const;
+    units::angular_velocity::revolutions_per_minute_t GetEngineSpeed() const;
 
     //!
     //! \return Calculated gear
@@ -81,34 +82,34 @@ public:
     //!
     //! \brief Calculates the acceleration that will result from the engineTorque at the given gear
     //!
-    double GetAccFromEngineTorque(double engineTorque, int chosenGear);
+    units::acceleration::meters_per_second_squared_t GetAccFromEngineTorque(const units::torque::newton_meter_t &engineTorque, int chosenGear);
 
     //!
     //! \brief Calculates the engine speed required to drive with the given velocity at the specified gear
     //!
-    double GetEngineSpeedByVelocity(double velocity, int gear);
+    units::angular_velocity::revolutions_per_minute_t GetEngineSpeedByVelocity(const units::velocity::meters_per_second_t &velocity, int gear);
 
     //!
     //! \brief Checks wether the engineSpeed and acceleration/torque can be achieved by the engine
     //!
-    bool isWithinEngineLimits(int gear, double engineSpeed, double acceleration);
-    inline bool isEngineSpeedWithinEngineLimits(double engineSpeed);
-    bool isTorqueWithinEngineLimits(double torque, double engineSpeed);
+    bool isWithinEngineLimits(int gear, const units::angular_velocity::revolutions_per_minute_t &engineSpeed, const units::acceleration::meters_per_second_squared_t &acceleration);
+    inline bool isEngineSpeedWithinEngineLimits(const units::angular_velocity::revolutions_per_minute_t &engineSpeed);
+    bool isTorqueWithinEngineLimits(const units::torque::newton_meter_t &torque, const units::angular_velocity::revolutions_per_minute_t &engineSpeed);
 
     //!
     //! \brief Returns the maximum possible engineTorque for the given engineSpeed
     //!
-    double GetEngineTorqueMin(double engineSpeed);
+    units::torque::newton_meter_t GetEngineTorqueMin(const units::angular_velocity::revolutions_per_minute_t& engineSpeed);
 
     //!
     //! \brief Returns the minimum engineTorque (i.e. maximum drag) for the given engineSpeed
     //!
-    double GetEngineTorqueMax(double engineSpeed);
+    units::torque::newton_meter_t GetEngineTorqueMax(const units::angular_velocity::revolutions_per_minute_t& engineSpeed);
 
     //!
     //! \brief Calculates the engine torque required to achieve the given acceleration at the specified gear
     //!
-    double GetEngineTorqueAtGear(int gear, double acceleration);
+    units::torque::newton_meter_t GetEngineTorqueAtGear(int gear, const units::acceleration::meters_per_second_squared_t &acceleration);
 
 protected:
     double GetVehicleProperty(const std::string& propertyName);
@@ -116,13 +117,13 @@ protected:
     std::function<void (CbkLogLevel, const char*, int, const std::string &)> Log;
 
     //Input
-    double velocity{0.0};
-    double accelerationWish{0.0};
-    const VehicleModelParameters &vehicleModelParameters;
+    units::velocity::meters_per_second_t velocity{0.0};
+    units::acceleration::meters_per_second_squared_t accelerationWish{0.0};
+    const mantle_api::VehicleProperties &vehicleModelParameters;
 
     //Output
     int gear{1};
-    double engineSpeed{0.0};
+    units::angular_velocity::revolutions_per_minute_t engineSpeed{0.0};
     double brakePedalPosition{0.0};
     double acceleratorPedalPosition{0.0};
 };
diff --git a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.cpp b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.cpp
index 866a38b05ea6192a798c4b4e964c81920360a109..bbfda447dbcc3c8093dc5ba762a1969ca9be5bc9 100644
--- a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.cpp
+++ b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2020-2021 ITK Engineering GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -93,7 +94,7 @@ Algorithm_Routecontrol_Implementation::Algorithm_Routecontrol_Implementation(
 {
     LOGINFO(QString().sprintf("Constructing %s for agent %d", COMPONENTNAME.c_str(), agent->GetId()).toStdString());
 
-    mTimeStep = (double)cycleTime / 1000.0;
+    mTimeStep = units::time::second_t((double)cycleTime / 1000.0);
 
     try
     {
@@ -141,8 +142,15 @@ void Algorithm_Routecontrol_Implementation::UpdateInput(int localLinkId,
 
     try
     {
-        trajectory = trajectorySignal->trajectory;
-        LOGDEBUG(QString().sprintf("%s UpdateInput successful", COMPONENTNAME.c_str()).toStdString());
+        if (std::holds_alternative<mantle_api::PolyLine>(trajectorySignal->trajectory.type))
+        {
+            trajectory = std::get<mantle_api::PolyLine>(trajectorySignal->trajectory.type);
+            LOGDEBUG(QString().sprintf("%s UpdateInput successful", COMPONENTNAME.c_str()).toStdString());
+        }
+        else
+        {
+            LOGERROR(QString().sprintf("%s UpdateInput failed. Only trajectories of type PolyLine are supported.", COMPONENTNAME.c_str()).toStdString());
+        }
     }
     catch (...)
     {
@@ -190,12 +198,11 @@ void Algorithm_Routecontrol_Implementation::Trigger(int time_ms)
          *  - driver aggressivity
         */
 
-        auto weight = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, vehicle::properties::Mass);
-        THROWIFFALSE(weight.has_value(), "Mass was not defined in VehicleCatalog");
+        auto weight = GetAgent()->GetVehicleModelParameters()->mass;
 
-        routeControl->SetVehicleProperties(weight.value(),
+        routeControl->SetVehicleProperties(weight,
                                            maxpower.GetValue(),
-                                           mintorque.GetValue(),
+                                           units::torque::newton_meter_t(mintorque.GetValue()),
                                            drivingAgressivity.GetValue());
 
         routeControl->SetPIDParameters(pedalsKp.GetValue(), pedalsKi.GetValue(), pedalsKd.GetValue(),
@@ -204,7 +211,7 @@ void Algorithm_Routecontrol_Implementation::Trigger(int time_ms)
 
     if (!waypoints) // only allocate once
     {
-        unsigned int n = trajectory.points.size();
+        unsigned int n = trajectory.size();
         waypoints = new std::vector<WaypointData>(n);
         ReadWayPointData(); // for periodic trajectory update: move this line outside the IF statement
     }
@@ -218,7 +225,7 @@ void Algorithm_Routecontrol_Implementation::Trigger(int time_ms)
     }
 
     // perform calculations
-    routeControl->Perform(time_ms, GetAgent()->GetPositionX(), GetAgent()->GetPositionY(),
+    routeControl->Perform(units::time::millisecond_t(time_ms), GetAgent()->GetPositionX(), GetAgent()->GetPositionY(),
                           GetAgent()->GetYaw(), GetAgent()->GetVelocity().Length());
 
     LOGDEBUG(QString().sprintf("%s output (agent %d) : FrontWheelAngle = %f, ThrottlePedal = %f, BrakePedal = %f",
@@ -236,7 +243,7 @@ void Algorithm_Routecontrol_Implementation::Trigger(int time_ms)
     */
     double brake = routeControl->GetBrakePedal();
     std::array<double, 4> brakeSuperpose{0.0, 0.0, 0.0, 0.0};
-    ControlData result{routeControl->GetFrontWheelAngle(), routeControl->GetThrottlePedal(), brake, brakeSuperpose};
+    ControlData result{routeControl->GetFrontWheelAngle().value(), routeControl->GetThrottlePedal(), brake, brakeSuperpose};
     control.SetValue(result);
 
     LOGDEBUG(QString().sprintf("%s Trigger successful", COMPONENTNAME.c_str()).toStdString());
@@ -246,20 +253,25 @@ void Algorithm_Routecontrol_Implementation::Trigger(int time_ms)
 
 void Algorithm_Routecontrol_Implementation::ReadWayPointData()
 {
-    unsigned int n = trajectory.points.size();
+    unsigned int n = trajectory.size();
 
-    double vel = 0.0;
+    units::velocity::meters_per_second_t vel{0.0};
 
     for (unsigned int i = 0; i < n; ++i)
     {
-        openScenario::TrajectoryPoint point = trajectory.points.at(i);
-        waypoints->at(i).time = point.time; // s
-        waypoints->at(i).position.x = point.x;
-        waypoints->at(i).position.y = point.y;
+        auto polyLinePoint = trajectory.at(i);
+
+        if (!polyLinePoint.time.has_value())
+        {
+            LOGERROR(QString().sprintf("%s ReadWayPointData failed. Time in PolyLinePoint not set.", COMPONENTNAME.c_str()).toStdString());
+        }
+        waypoints->at(i).time = polyLinePoint.time.value(); // s
+        waypoints->at(i).position.x = polyLinePoint.pose.position.x;
+        waypoints->at(i).position.y = polyLinePoint.pose.position.y;
         if (i<n-1)
         {
-            openScenario::TrajectoryPoint pointNext = trajectory.points.at(i+1);
-            vel = std::sqrt(std::pow(pointNext.x-point.x,2) + std::pow(pointNext.y-point.y,2)) / mTimeStep; // uniform motion approximation
+            auto polyLinePointNext = trajectory.at(i + 1);
+            vel = units::math::sqrt(units::math::pow<2>(polyLinePointNext.pose.position.x - polyLinePoint.pose.position.x) + units::math::pow<2>(polyLinePointNext.pose.position.y - polyLinePoint.pose.position.y)) / mTimeStep; // uniform motion approximation
         }
         waypoints->at(i).longVelocity = vel;
     }
diff --git a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.h b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.h
index 62435c0cd3db4614f5551354eb85f22a58dce925..937b41b9ca3917d32bf70bc44ca4db549a8b21d1 100644
--- a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.h
+++ b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.h
@@ -132,7 +132,7 @@ private:
      *      @{
      */
     //    InputPort<TrajectorySignal, openScenario::Trajectory> trajectory{0, &inputPorts}; //!< given trajectory to follow
-    openScenario::Trajectory trajectory; //!< given trajectory to follow
+    mantle_api::PolyLine trajectory; //!< given trajectory to follow
     /**
      *      @}
      *  @}
@@ -179,7 +179,7 @@ private:
     //local computation objects
     std::vector<WaypointData> *waypoints = nullptr; //!< vector of waypoints that should be followed
     RouteControl *routeControl = nullptr;           //!< class containing the actual algorithms for the route control
-    double mTimeStep;                             //!< time step in s
+    units::time::second_t mTimeStep;                             //!< time step in s
     /**
      *    @}
     */
diff --git a/sim/src/components/Algorithm_Routecontrol/routeControl.cpp b/sim/src/components/Algorithm_Routecontrol/routeControl.cpp
index 11598b4d86fcab0d6c29f076bc934da97681508e..dc209bc9a6b5992f4c10b322db67b4bcaef5356d 100644
--- a/sim/src/components/Algorithm_Routecontrol/routeControl.cpp
+++ b/sim/src/components/Algorithm_Routecontrol/routeControl.cpp
@@ -11,26 +11,26 @@
 #include "routeControl.h"
 
 // Constructor RouteControl
-RouteControl::RouteControl(double dT):
+RouteControl::RouteControl(units::time::second_t dT) :
     mDT(dT)
 {
     // Initialize current Position Data
-    mCurrentPosData.position.x = 0.0;
-    mCurrentPosData.position.y = 0.0;
-    mCurrentPosData.longVelocity = 0.0;
-    mCurrentPosData.angle = 0.0;
+    mCurrentPosData.position.x = 0.0_m;
+    mCurrentPosData.position.y = 0.0_m;
+    mCurrentPosData.longVelocity = 0.0_mps;
+    mCurrentPosData.angle = 0.0_rad;
 
     // Initialize outputs (throttle, brake and front wheel angle)
     mThrottlePedal = 0.0;
     mThrottlePedalPrev = 0.0;
     mBrakePedal = 0.0;
     mBrakePedalPrev = 0.0;
-    mFrontWheelAngle = 0.0;
+    mFrontWheelAngle = 0.0_rad;
 
     // Initialize support variables and paremeters
     mSteeringFactorDriverAction = 0.0;
 
-    mlookAheadTime = C_lookAheadTimeDefault / 1000.0;    // C_lookAheadTimeDefault = 270 ms
+    mlookAheadTime = units::time::millisecond_t(C_lookAheadTimeDefault); // C_lookAheadTimeDefault = 270 ms
     mLastUsedTrajectoryIndex = 0;
 
     mDrivingAggressivity = C_MaxDrivingAggressivity;
@@ -59,7 +59,7 @@ RouteControl::RouteControl(double dT):
 }
 
 // Set Vehicle properties and parameters
-void RouteControl::SetVehicleProperties(double weight, double maxPower, double minTorque, double drivingAggressivity)
+void RouteControl::SetVehicleProperties(units::mass::kilogram_t weight, double maxPower, units::torque::newton_meter_t minTorque, double drivingAggressivity)
 {
     // Set wheel radius, limit steerin angle, weight, max throttle power, min brake torque
     mWheelRadius = C_WheelRadius;               // C_WheelRadius = 0.3m
@@ -202,7 +202,7 @@ void RouteControl::CalculateFrontWheelAngle()
     mFrontWheelAngle = std::clamp(mFrontWheelAngle, -mLimitSteeringAngle, mLimitSteeringAngle);
 }
 
-double RouteControl::GetFrontWheelAngle()
+units::angle::radian_t RouteControl::GetFrontWheelAngle()
 {
     return mFrontWheelAngle;
 }
@@ -216,7 +216,7 @@ void RouteControl::SetRequestedTrajectory(std::vector<WaypointData> &trajFoll)
 }
 
 // Set the current position of the vehicle
-void RouteControl::SetCurrentPosition(double positionX, double positionY, double yawAngle, double longVelocity)
+void RouteControl::SetCurrentPosition(units::length::meter_t positionX, units::length::meter_t positionY, units::angle::radian_t yawAngle, units::velocity::meters_per_second_t longVelocity)
 {
     // Sets the current x-position, y-position, longitudinal velocity and the yaw angle of the vehicle
     mCurrentPosData.position.x = positionX;
@@ -226,10 +226,10 @@ void RouteControl::SetCurrentPosition(double positionX, double positionY, double
 }
 
 // Function returning the next relevant goal waypoint of the trajectory to use as a reference
-WaypointData& RouteControl::GetGoalWaypoint(double lookAheadTime, bool& isLastTrajectoryPoint)
+WaypointData &RouteControl::GetGoalWaypoint(units::time::second_t lookAheadTime, bool &isLastTrajectoryPoint)
 {
-    double distance;
-    double minDistance = INFINITY;
+    units::length::meter_t distance;
+    units::length::meter_t minDistance(INFINITY);
     int nextPointIndex = -1;
 
     // Get the index of the next point to the nearest point to the current position
@@ -237,7 +237,7 @@ WaypointData& RouteControl::GetGoalWaypoint(double lookAheadTime, bool& isLastTr
     for (int i = 0; i < mTrajectorySize; i++)
     {
         // Calculate the distance between the current position and a waypoint in trajectory
-        Common::Vector2d distanceVec(mRequestedTrajectory[i].position - mCurrentPosData.position);
+        Common::Vector2d<units::length::meter_t> distanceVec(mRequestedTrajectory[i].position - mCurrentPosData.position);
         distance = distanceVec.Length();
 
         if (distance < minDistance)
@@ -259,12 +259,12 @@ WaypointData& RouteControl::GetGoalWaypoint(double lookAheadTime, bool& isLastTr
         }
     }
 
-    if (lookAheadTime > 0) // check if lookAheadTime is meaningful (bigger than 0)
+    if (lookAheadTime > 0_s) // check if lookAheadTime is meaningful (bigger than 0)
     {
         // starting from the trajectory waypoint with minimum distance until the current position
         for (int i = nextPointIndex; i < mTrajectorySize; i++)
         {
-            if ((mRequestedTrajectory[i].time - (double)mTime / 1000.0) >= lookAheadTime)
+            if ((mRequestedTrajectory[i].time - mTime) >= lookAheadTime)
             {
                 // when the time difference between an analyzed trajectory waypoint and the waypoint with the minimum distance (until the current position of the vehicle)
                 // is bigger or equal than the look ahead time, returns that analyzed waypoint as the next waypoint to use
@@ -285,10 +285,10 @@ WaypointData& RouteControl::GetGoalWaypoint(double lookAheadTime, bool& isLastTr
 }
 
 // Function returning the angle from the current position to the given goal waypoint
-double RouteControl::GetAngleToGoalWaypoint(WaypointData& goalWaypointAngle)
+units::angle::radian_t RouteControl::GetAngleToGoalWaypoint(WaypointData &goalWaypointAngle)
 {
-    Common::Vector2d distanceToGoalPoint(goalWaypointAngle.position - mCurrentPosData.position);
-    return distanceToGoalPoint.Angle();
+    Common::Vector2d<units::length::meter_t> distanceToGoalPoint(goalWaypointAngle.position - mCurrentPosData.position);
+    return units::angle::radian_t(distanceToGoalPoint.Angle());
 }
 
 // Function returning the next relevant goal waypoint of the trajectory to use as a reference for the Velocity control
@@ -297,18 +297,18 @@ WaypointData& RouteControl::GetGoalWaypointVelocity()
     bool isLastTrajectoryPoint;
     Q_UNUSED(isLastTrajectoryPoint);
     // lastTrajectoryPoint flag is true, when the returned goal waypoint is the last one
-    return GetGoalWaypoint(0.0, isLastTrajectoryPoint);   // lookAheadTime trasfered here is equal 0
+    return GetGoalWaypoint(0.0_s, isLastTrajectoryPoint); // lookAheadTime trasfered here is equal 0
 }
 
 // Function returning the next relevant goal waypoint of the trajectory to use as a reference for the Steering Angle control
-WaypointData& RouteControl::GetGoalWaypointAngle(double lookAheadTime, bool& lastTrajectoryPoint)
+WaypointData &RouteControl::GetGoalWaypointAngle(units::time::second_t lookAheadTime, bool &lastTrajectoryPoint)
 {
     // lastTrajectoryPoint flag is true, when the returned goal waypoint is the last one
     // endOfRoute flag is true, when lastTrajectoryPoint was previously set to true and the vehicle keeps on driving far from last trajectory point
     return GetGoalWaypoint(lookAheadTime, lastTrajectoryPoint);
 }
 
-void RouteControl::Perform(int time, double positionX, double positionY, double yawAngle, double longVelocity)
+void RouteControl::Perform(units::time::millisecond_t time, units::length::meter_t positionX, units::length::meter_t positionY, units::angle::radian_t yawAngle, units::velocity::meters_per_second_t longVelocity)
 {
     /** @addtogroup sim_step_00_rc_start
      * Read and update previous vehicle's state:
@@ -341,23 +341,23 @@ void RouteControl::Perform(int time, double positionX, double positionY, double
         /** @addtogroup sim_step_10_rc_error
          * Obtain the pointing deviation between the extrapolated vehicle translation and the trajectory point to be reached.
         */
-        double angleToGoalWaypoint = GetAngleToGoalWaypoint(goalWaypointAngle);
+        const auto angleToGoalWaypoint = GetAngleToGoalWaypoint(goalWaypointAngle);
 
         // compare current steering angle with the one it should have
-        double angleDelta = mCurrentPosData.angle - angleToGoalWaypoint;
-        if (angleDelta > M_PI)  // make sure the angle is in the proper range (-PI, PI)
+        auto angleDelta = mCurrentPosData.angle - angleToGoalWaypoint;
+        if (angleDelta > units::angle::radian_t(M_PI)) // make sure the angle is in the proper range (-PI, PI)
         {
-            angleDelta -= (2 * M_PI);
+            angleDelta -= units::angle::radian_t(2 * M_PI);
         }
-        else if (angleDelta < -M_PI)
+        else if (angleDelta < units::angle::radian_t(-M_PI))
         {
-            angleDelta += (2 * M_PI);
+            angleDelta += units::angle::radian_t(2 * M_PI);
         }
 
         /** @addtogroup sim_step_10_rc_error
          * Scale steering control according to absolute velocity.
         */
-        steeringError = angleDelta/mCurrentPosData.longVelocity;
+        steeringError = angleDelta.value() / mCurrentPosData.longVelocity.value();
 
         // calculate the steering and velocity control
         SteeringControl(steeringError);
@@ -366,7 +366,7 @@ void RouteControl::Perform(int time, double positionX, double positionY, double
     /** @addtogroup sim_step_10_rc_error
      * Obtain the deviation between the actual vehicle velocity and the desired velocity value.
     */
-    double velocityError = mCurrentPosData.longVelocity - goalWaypointVelocity.longVelocity;
+    const auto velocityError = mCurrentPosData.longVelocity - goalWaypointVelocity.longVelocity;
     PedalControl( velocityError);
 
     CalculateFrontWheelAngle();
@@ -417,7 +417,7 @@ void RouteControl::SteeringControl(double steeringError)
 }
 
 // Function PedalControl executes the PID controller to compensate the forward velocity error
-void RouteControl::PedalControl(double velocityError)
+void RouteControl::PedalControl(units::velocity::meters_per_second_t velocityError)
 {
     double pedalPIDControllerAction;
 
@@ -432,10 +432,10 @@ void RouteControl::PedalControl(double velocityError)
      * - derivative
     */
     // calculate the Proportional part of the PID controller
-    pedalProportionalTerm = mPedalsKp * velocityError;
+    pedalProportionalTerm = mPedalsKp * velocityError.value();
 
     // calculate the Integral part of the PID controller
-    mPedalsIntegralError += velocityError;
+    mPedalsIntegralError += velocityError.value();
     pedalIntegralTerm = mPedalsKi * mPedalsIntegralError * mDT;
     // the integral term is limited, to avoid that it becomes extremly high with the time
     if (pedalIntegralTerm > C_PedalIntegratorMax)
@@ -448,7 +448,7 @@ void RouteControl::PedalControl(double velocityError)
     }
 
     // calculate the Derivative part of the PID controller
-    double pedalsDerivativeError = velocityError - mPreVelocityError;
+    double pedalsDerivativeError = velocityError.value() - mPreVelocityError;
     if (mDT > 0.0)    // when the dT is equal 0, avoids division by 0
     {
         pedalDerivativeTerm = mPedalsKd * (pedalsDerivativeError / mDT);
@@ -463,14 +463,14 @@ void RouteControl::PedalControl(double velocityError)
     SetPedals(pedalPIDControllerAction);
 
     // remember the velocity error for the next cycle
-    mPreVelocityError = velocityError;
+    mPreVelocityError = velocityError.value();
 }
 
 // Function SetSteering sets the PID controller action, transfered to the steering of the vehicle
 void RouteControl::SetSteering(double pidAction)
 {
     mSteeringFactorDriverAction = C_SteeringWheelSensitivity;
-    mFrontWheelAngle = pidAction * mSteeringFactorDriverAction;
+    mFrontWheelAngle = units::angle::radian_t(pidAction * mSteeringFactorDriverAction);
 }
 
 // Function SetPedals sets the PID controller action, transfered to the pedals of the vehicle
@@ -478,7 +478,7 @@ void RouteControl::SetPedals(double pidAction)
 {
     if (pidAction > 0.0) // when driving too slow, driver compensates with acceleration
     {
-        if (mCurrentPosData.longVelocity <= 0.0)
+        if (mCurrentPosData.longVelocity <= 0.0_mps)
         {
             // if the velocity is 0 or negative, vehicle must press the full throttle pedal
             mThrottlePedal = C_MaxThrottlePedal;
@@ -486,7 +486,7 @@ void RouteControl::SetPedals(double pidAction)
         else
         {
             // otherwise the throttle pedal action from the pid controller is scaled by a formula including the parameters (weight, velocity, maxPower) of the vehicle
-            double throttleFactorDriverAction = (mWeight * mCurrentPosData.longVelocity) / (mMaxEnginePower * mDT);   // (velocity * 0.02 / dT)
+            double throttleFactorDriverAction = (mWeight.value() * mCurrentPosData.longVelocity.value()) / (mMaxEnginePower * mDT); // (velocity * 0.02 / dT)
             mThrottlePedal = pidAction * throttleFactorDriverAction;
         }
         // brakePedal is not pressed at all
@@ -495,7 +495,7 @@ void RouteControl::SetPedals(double pidAction)
     else if (pidAction < 0.0)    // when driving too fast, driver compensates with deceleration
     {
         // the brake pedal action from the pid controller is scaled by a formula including the parameters (weight, wheel radius, brakeTorque) of the vehicle
-        double brakeFactorDriverAction = (mWheelRadius * mWeight) / (mDT * mMinBrakeTorque); // (-0.06 / dT)
+        double brakeFactorDriverAction = (mWheelRadius.value() * mWeight.value()) / (mDT * mMinBrakeTorque.value()); // (-0.06 / dT)
         mBrakePedal = pidAction * brakeFactorDriverAction * GetBrakeSensitivity();
         // Throttle pedal is not pressed at all
         mThrottlePedal = C_MinThrottlePedal;
@@ -511,13 +511,13 @@ void RouteControl::SetPedals(double pidAction)
 double RouteControl::GetBrakeSensitivity()
 {
     // by velocity equals 0, the brake sensitivity is 0
-    if (mCurrentPosData.longVelocity == 0.0)
+    if (mCurrentPosData.longVelocity == 0.0_mps)
     {
         return 0.0;
     }
     else
     {
         // the higher the velocity, the smaller will be the brake sensitivity
-        return (1 / mCurrentPosData.longVelocity * C_BrakeSensitivity);
+        return (1 / mCurrentPosData.longVelocity.value() * C_BrakeSensitivity);
     }
 }
diff --git a/sim/src/components/Algorithm_Routecontrol/routeControl.h b/sim/src/components/Algorithm_Routecontrol/routeControl.h
index c7911ff40a829c2362ea25813ac2af6e101eb361..e3ce6e08777d02617a40c49f66cf4c5000b276d7 100644
--- a/sim/src/components/Algorithm_Routecontrol/routeControl.h
+++ b/sim/src/components/Algorithm_Routecontrol/routeControl.h
@@ -11,25 +11,28 @@
 #ifndef ROUTECONTROL_H
 #define ROUTECONTROL_H
 
-#include <vector>
 #include <iostream>
 #include <math.h>
+#include <vector>
 
 #include <QFile>
 #include <QTextStream>
 
 #include "common/vector2d.h"
+#include "units.h"
+
+using namespace units::literals;
 
 //! Lightweight structure comprising all information on a way point within a trajectory
 struct WaypointData
 {
-    Common::Vector2d position;         //!< position (x- and y-coordinates)
-    double longVelocity;        //!< velocity
-    double time;            //!< timestamp
+    Common::Vector2d<units::length::meter_t> position; //!< position (x- and y-coordinates)
+    units::velocity::meters_per_second_t longVelocity; //!< velocity
+    units::time::second_t time;                        //!< timestamp
 
     //! Standard constructor
-    WaypointData():
-        position(), longVelocity(0), time(0)
+    WaypointData() :
+        position(), longVelocity(0_mps), time(0_s)
     {}
 
     //! Constructor
@@ -38,7 +41,7 @@ struct WaypointData
     //! @param[in]     y            y-coordinate
     //! @param[in]     velocity
     //! @param[in]     time
-    WaypointData(double x, double y, double velocity, double time):
+    WaypointData(units::length::meter_t x, units::length::meter_t y, units::velocity::meters_per_second_t velocity, units::time::second_t time) :
         position(x, y), longVelocity(velocity), time(time)
     {}
 };
@@ -46,19 +49,22 @@ struct WaypointData
 //! Lightweight structure comprising all information on positioning a vehicle
 struct PositionData
 {
-    Common::Vector2d position;         //!< 2d vector with x- and y-coordinates
-    double angle;           //!< angle
-    double longVelocity;        //!< longitudinal velocity
+    Common::Vector2d<units::length::meter_t> position; //!< 2d vector with x- and y-coordinates
+    units::angle::radian_t angle;      //!< angle
+    units::velocity::meters_per_second_t longVelocity; //!< longitudinal velocity
 
     //! Standard constructor
-    PositionData(): position(), angle(0), longVelocity(0) {}
+    PositionData() :
+        position(), angle(0_rad), longVelocity(0_mps)
+    {
+    }
 
     //! Constructor
     //!
     //! @param[in]     position         2d vector with x- and y-coordinates
     //! @param[in]     angle
     //! @param[in]     velocity
-    PositionData(Common::Vector2d position, double angle, double velocity):
+    PositionData(Common::Vector2d<units::length::meter_t> position, units::angle::radian_t angle, units::velocity::meters_per_second_t velocity) :
         position(position), angle(angle), longVelocity(velocity)
     {}
 
@@ -68,7 +74,7 @@ struct PositionData
     //! @param[in]     y                y-coordinate
     //! @param[in]     angle
     //! @param[in]     velocity
-    PositionData(double x, double y, double angle, double velocity):
+    PositionData(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t angle, units::velocity::meters_per_second_t velocity) :
         angle(angle), longVelocity(velocity)
     {
         position.x = x;
@@ -93,8 +99,8 @@ class RouteControl
     const double C_BrakeSensitivity = 1.5;                          //!< constant value used to scale the influence of the velocity in the brake sensitivity
     const double C_SteeringWheelSensitivity = 1.0;                  //!< constant value to scale the steering PID control result, which is transfered to be used as steering action
 
-    const double C_MaxSteeringAngle = M_PI_4;                       //!< typical maximal steering constant value, indicates the steering angle limit
-    const double C_WheelRadius = 0.3;                               //!< typical wheel radius constant value
+    const units::angle::radian_t C_MaxSteeringAngle{M_PI_4}; //!< typical maximal steering constant value, indicates the steering angle limit
+    const units::length::meter_t C_WheelRadius{0.3};         //!< typical wheel radius constant value
 
     const double C_PedalsKp = -2.0;                                 //!< constant value for the Kp parameter of the pedals PID control
     const double C_PedalsKi = -1.5;                                 //!< constant value for the Ki parameter of the pedals PID control
@@ -115,11 +121,11 @@ public:
     //! Constructor
     //!
     //! @param[in]     dT               cycletime used
-    RouteControl(double dT = 0.01);
+    RouteControl(units::time::second_t dT = 0.01_s);
 
     //! Function that triggers the algorithm logic, selecting the next relevant waypoint and executing the pedals and steering control
     //!
-    void Perform(int time, double positionX, double positionY, double yawAngle, double longVelocity);
+    void Perform(units::time::millisecond_t time, units::length::meter_t positionX, units::length::meter_t positionY, units::angle::radian_t yawAngle, units::velocity::meters_per_second_t longVelocity);
 
     //! Function setting the vehicle properties needed for the calculations
     //!
@@ -127,7 +133,7 @@ public:
     //! @param[in]     maxPower                 maximum engine power
     //! @param[in]     minTorque                minimum brake torque
     //! @param[in]     drivingAggressivity      driving aggressivity level
-    void SetVehicleProperties(double weight, double maxPower, double minTorque, double drivingAggressivity);
+    void SetVehicleProperties(units::mass::kilogram_t weight, double maxPower, units::torque::newton_meter_t minTorque, double drivingAggressivity);
 
     //! Function setting parameters needed for the PID controllers
     //!
@@ -152,7 +158,7 @@ public:
     //! Function returning the required front wheel angle
     //!
     //! @return                             the required front wheel angle
-    double GetFrontWheelAngle();
+    units::angle::radian_t GetFrontWheelAngle();
 
     //! Function setting the requested trajectory (route) to follow
     //!
@@ -163,23 +169,23 @@ public:
     //!
     //! @param[in]     goalWaypointAngle        goal Waypoint position
     //! @return                                 angle to the given goal waypoint
-    double GetAngleToGoalWaypoint(WaypointData& goalWaypointAngle);
+    units::angle::radian_t GetAngleToGoalWaypoint(WaypointData &goalWaypointAngle);
 
 private:
-    int mTime;                                          //!< time of the current similuation cycle in ms
+    units::time::millisecond_t mTime;                   //!< time of the current similuation cycle in ms
     double mDT;                                         //!< cycle time
 
     // Vehicle Properties
     double mMaxEnginePower;                                //!< maximum engine power
-    double mMinBrakeTorque;                             //!< minimum brake torque
-    double mWeight;                                     //!< weight of the vehicle
-    double mWheelRadius;                                //!< wheel radius
+    units::torque::newton_meter_t mMinBrakeTorque;         //!< minimum brake torque
+    units::mass::kilogram_t mWeight;                       //!< weight of the vehicle
+    units::length::meter_t mWheelRadius;                   //!< wheel radius
     double mDrivingAggressivity;                        //!< driving aggressivity level
 
     // Requested Trajectory
     std::vector<WaypointData> mRequestedTrajectory;     //!< vector of waypoints of the given trajectory
     int mTrajectorySize;                                //!< number of waypoints that the requested trajectory contains
-    double mlookAheadTime;                              //!< time to look ahead, relevant for calculating the next trajectory point to consider in the route (trajectory)
+    units::time::second_t mlookAheadTime;               //!< time to look ahead, relevant for calculating the next trajectory point to consider in the route (trajectory)
 
     // Current Position
     PositionData mCurrentPosData;                       //!< the current position data
@@ -199,7 +205,7 @@ private:
     double mPreVelocityError;                              //!< previous forward velocity error used in the pedals PID controller
 
     // Steering Action
-    double mFrontWheelAngle;                            //!< the required steering angle value
+    units::angle::radian_t mFrontWheelAngle;            //!< the required steering angle value
     double mSteeringFactorDriverAction;                 //!< scale factor applied to the steering PID control result
 
     // Steering PID Controller
@@ -208,7 +214,7 @@ private:
     double mSteeringKd;                                 //!< derivative part of the steering PID controller
     double mSteeringIntegralError;                      //!< angle-integral-error calculated for the steering controller
     double mPrevAngleError;                             //!< previous angle-error used in the steering PID controller
-    double mLimitSteeringAngle;                         //!< contains the value to indicate the limit angle of the steering
+    units::angle::radian_t mLimitSteeringAngle;         //!< contains the value to indicate the limit angle of the steering
 
     //! Function setting the current position data
     //!
@@ -216,7 +222,7 @@ private:
     //! @param[in]     positionY        position on the y axle of the vehicle in global CS
     //! @param[in]     yawAngle         yaw angle of the vehicle in global CS
     //! @param[in]     longVelocity     longitudinal velocity of the vehicle, in car's CS
-    void SetCurrentPosition(double positionX, double positionY, double yawAngle, double longVelocity);
+    void SetCurrentPosition(units::length::meter_t positionX, units::length::meter_t positionY, units::angle::radian_t yawAngle, units::velocity::meters_per_second_t longVelocity);
 
     //! Function returning the next relevant goal waypoint of the trajectory to use as a reference
     //!
@@ -224,7 +230,7 @@ private:
     //! @param[in]     lastTrajectoryPoint      flag that indicates if the returned waypoint is the last one of the requested trajectory
     //! @param[in]     endOfRoute               flag that indicates if the vehicle is driving away from the last route (trajectory) point, because it was previously reached
     //! @return                                 the next relevant goal waypoint of the trajectory to use as a reference
-    WaypointData& GetGoalWaypoint(double lookAheadTime, bool& lastTrajectoryPoint);
+    WaypointData &GetGoalWaypoint(units::time::second_t lookAheadTime, bool &lastTrajectoryPoint);
 
     //! Function returning the next relevant goal waypoint of the trajectory to use as a reference for the Velocity control
     //!
@@ -238,12 +244,12 @@ private:
     //! @param[in]     lastTrajectoryPoint      flag that indicates if the returned waypoint is the last one of the requested trajectory
     //! @param[in]     endOfRoute               flag that indicates if the vehicle is driving away from the last route (trajectory) point, because it was previously reached
     //! @return                                 the next relevant goal waypoint of the trajectory to use as a reference for the Steering Angle control
-    WaypointData& GetGoalWaypointAngle(double lookAheadTime, bool& lastTrajectoryPoint);
+    WaypointData &GetGoalWaypointAngle(units::time::second_t lookAheadTime, bool &lastTrajectoryPoint);
 
     //! Function executing the PID controller to compensate the forward velocity error
     //!
     //! @param[in]     velFwError               forward velocity error used in the pedals PID controller
-    void PedalControl(double velocityError);
+    void PedalControl(units::velocity::meters_per_second_t velocityError);
 
     //! Function executing the PID controller to compensate the steering error
     //!
diff --git a/sim/src/components/CMakeLists.txt b/sim/src/components/CMakeLists.txt
index 03b36449874c3f9c75aea42a6d013f34d11f4ecf..a65aa756271fa0a269a7ac8a11eec32d335afaff 100644
--- a/sim/src/components/CMakeLists.txt
+++ b/sim/src/components/CMakeLists.txt
@@ -37,7 +37,6 @@ add_subdirectory(Dynamics_RegularTwoTrack)
 add_subdirectory(Dynamics_TF)
 add_subdirectory(Dynamics_TwoTrack)
 add_subdirectory(LimiterAccVehComp)
-add_subdirectory(OpenScenarioActions)
 add_subdirectory(Parameters_Vehicle)
 add_subdirectory(SensorAggregation_OSI)
 add_subdirectory(SensorFusionErrorless_OSI)
diff --git a/sim/src/components/ComponentController/componentController.cpp b/sim/src/components/ComponentController/componentController.cpp
index b94a8ebf4cbd97a8e16eee52aafb7889990dfa8e..441dd5f83d8c4cfb20e4521bc20c67156febc758 100644
--- a/sim/src/components/ComponentController/componentController.cpp
+++ b/sim/src/components/ComponentController/componentController.cpp
@@ -36,7 +36,7 @@ extern "C" COMPONENT_CONTROLLER_SHARED_EXPORT ModelInterface *OpenPASS_CreateIns
         PublisherInterface * const publisher,
         AgentInterface *agent,
         const CallbackInterface *callbacks,
-        core::EventNetworkInterface * const eventNetwork)
+        std::shared_ptr<ControlStrategiesInterface> const controlStrategies)
 {
     Callbacks = callbacks;
 
@@ -55,7 +55,7 @@ extern "C" COMPONENT_CONTROLLER_SHARED_EXPORT ModelInterface *OpenPASS_CreateIns
                                       publisher,
                                       callbacks,
                                       agent,
-                                      eventNetwork));
+                                      controlStrategies));
     }
     catch(const std::runtime_error &ex)
     {
diff --git a/sim/src/components/ComponentController/src/componentControllerImpl.cpp b/sim/src/components/ComponentController/src/componentControllerImpl.cpp
index dfb0c4a13eaf57e433011f0da094bdad8fe17905..78d4981d51499e6b3d6195d2a2fede590992e012 100644
--- a/sim/src/components/ComponentController/src/componentControllerImpl.cpp
+++ b/sim/src/components/ComponentController/src/componentControllerImpl.cpp
@@ -17,7 +17,6 @@
 #include "common/agentCompToCompCtrlSignal.h"
 #include "common/primitiveSignals.h"
 #include "include/eventNetworkInterface.h"
-#include "common/events/componentStateChangeEvent.h"
 
 ComponentControllerImplementation::ComponentControllerImplementation(std::string componentName,
                                                                      bool isInit,
@@ -31,8 +30,8 @@ ComponentControllerImplementation::ComponentControllerImplementation(std::string
                                                                      PublisherInterface * const publisher,
                                                                      const CallbackInterface *callbacks,
                                                                      AgentInterface *agent,
-                                                                     core::EventNetworkInterface* const eventNetwork) :
-    UnrestrictedEventModelInterface(
+                                                                     std::shared_ptr<ControlStrategiesInterface> const controlStrategies) :
+    UnrestrictedControllStrategyModelInterface(
         componentName,
         isInit,
         priority,
@@ -45,7 +44,7 @@ ComponentControllerImplementation::ComponentControllerImplementation(std::string
         publisher,
         callbacks,
         agent,
-        eventNetwork),
+        controlStrategies),
   stateManager(callbacks)
 {
 }
@@ -118,36 +117,48 @@ void ComponentControllerImplementation::UpdateOutput(int localLinkId, std::share
     }
 }
 
-bool ComponentControllerImplementation::IsAgentAffectedByEvent(EventInterface const * event)
-{
-    return std::find(event->GetActingAgents().entities.begin(),event->GetActingAgents().entities.end(),
-                     GetAgent()->GetId()) != event->GetActingAgents().entities.end();
-}
-
 /*
- * Each trigger, pull ComponentStateChangeEvents for this agent and pass the list of them
+ * Each trigger, pull commands for this agent and pass the list of them
  * to the stateManager for proper handling of changes of component max reachable state
  */
 void ComponentControllerImplementation::Trigger([[maybe_unused]] int time)
 {
-    // get the event list and filter by ComponentStateChangeEvents and this agent's id
-    const auto stateChangeEventList = GetEventNetwork()->GetTrigger(openpass::events::ComponentStateChangeEvent::TOPIC);
+    auto& customCommands = GetControlStrategies()->GetCustomCommands();
+    std::vector<std::pair<std::string, ComponentState>> componentStates{};
 
-    std::vector<openpass::events::ComponentStateChangeEvent const *> componentStateChanges;
-
-    // filter state change event list by this agentid
-    for (const auto &stateChangeEvent : stateChangeEventList)
+    for (const auto customCommand : customCommands)
     {
-        const auto componentStateChangeEvent = dynamic_cast<openpass::events::ComponentStateChangeEvent const *>(stateChangeEvent);
-        if (componentStateChangeEvent && IsAgentAffectedByEvent(componentStateChangeEvent))
+        auto commandTokens = CommonHelper::TokenizeString(customCommand, ' ');
+        auto commandTokensSize = commandTokens.size();    
+        if (commandTokensSize == 3 && commandTokens.at(0) == "SetComponentState")
         {
-           componentStateChanges.push_back(componentStateChangeEvent);
+            const auto componentName = commandTokens.at(1);
+            const auto componentStateName = commandTokens.at(2);
+            ComponentState componentState;
+
+            if (componentStateName == "Acting")
+            {
+                componentState = ComponentState::Acting;
+            }
+            else if (componentStateName == "Disabled")
+            {
+                componentState = ComponentState::Disabled;
+            }
+            else if (componentStateName == "Armed")
+            {
+                componentState = ComponentState::Armed;
+            }
+            else
+            {
+                throw std::runtime_error("Component state not valid.");
+            }
+            componentStates.push_back({componentName, componentState});
         }
-    }
 
     // Instruct the stateManager to updateMaxReachableStates
-    // - this prioritizes the provided event list for event-triggered max reachable states
+    // - this prioritizes the provided componentStates for command-triggered max reachable states
     // - this also uses registered conditions to determine each component's max reachable
     //   state dependent on each other component's current state
-    stateManager.UpdateMaxReachableStatesForRegisteredComponents(componentStateChanges);
+    stateManager.UpdateMaxReachableStatesForRegisteredComponents(componentStates);
+    }        
 }
diff --git a/sim/src/components/ComponentController/src/componentControllerImpl.h b/sim/src/components/ComponentController/src/componentControllerImpl.h
index 8d9819211ca46a14cd1b4a069080f47068cf2075..8f71893f8968855b3c39ed81a4a27f96aca11c4f 100644
--- a/sim/src/components/ComponentController/src/componentControllerImpl.h
+++ b/sim/src/components/ComponentController/src/componentControllerImpl.h
@@ -28,7 +28,7 @@ using namespace ComponentControl;
 *
 * \ingroup ComponentController
 */
-class ComponentControllerImplementation : public UnrestrictedEventModelInterface
+class ComponentControllerImplementation : public UnrestrictedControllStrategyModelInterface
 {
 public:
     const std::string COMPONENTNAME = "ComponentController";
@@ -45,7 +45,7 @@ public:
         PublisherInterface * const publisher,
         const CallbackInterface *callbacks,
         AgentInterface *agent,
-        core::EventNetworkInterface * const eventNetwork);
+        std::shared_ptr<ControlStrategiesInterface> const controlStrategies);
     ComponentControllerImplementation(const ComponentControllerImplementation&) = delete;
     ComponentControllerImplementation(ComponentControllerImplementation&&) = delete;
     ComponentControllerImplementation& operator=(const ComponentControllerImplementation&) = delete;
@@ -91,11 +91,6 @@ public:
     virtual void Trigger(int time);
 
 private:
-    /// \brief Check if the associated agent is within the affected agents of the given id
-    /// \param event
-    /// \return True if affected
-    bool IsAgentAffectedByEvent(EventInterface const * event);
-
     template <typename T, typename Signal>
     const std::shared_ptr<T const> SignalCast(Signal&& signal, int linkId)
     {
diff --git a/sim/src/components/ComponentController/src/stateManager.cpp b/sim/src/components/ComponentController/src/stateManager.cpp
index 1a0484af9b3b0227a831ed9e1a12fe56f5a3475c..ca423aa84b612fc237ef61da838ef510bc5ca23d 100644
--- a/sim/src/components/ComponentController/src/stateManager.cpp
+++ b/sim/src/components/ComponentController/src/stateManager.cpp
@@ -101,24 +101,24 @@ void StateManager::FlagComponentMaxReachableStateSetByEvent(const int localLinkI
     }
 }
 
-void StateManager::UpdateMaxReachableStatesForRegisteredComponents(std::vector<const openpass::events::ComponentStateChangeEvent *> &componentStateChanges)
+void StateManager::UpdateMaxReachableStatesForRegisteredComponents(std::vector<std::pair<std::string, ComponentState>> componentStates)
 {
-    for (const auto& stateChangeEvent : componentStateChanges)
+    for (const auto& [componentName, componentState] : componentStates)
     {
         try
         {
-            const auto localLinkId = GetComponentLocalLinkIdByName(stateChangeEvent->componentName);
-            UpdateComponentMaxReachableState(localLinkId, stateChangeEvent->componentState);
+            const auto localLinkId = GetComponentLocalLinkIdByName(componentName);
+            UpdateComponentMaxReachableState(localLinkId, componentState);
             FlagComponentMaxReachableStateSetByEvent(localLinkId);
         }
         catch (const std::out_of_range& error)
         {
             const std::string errorMessage = error.what();
-            const std::string warning = errorMessage + " The event will be ignored.";
+            const std::string warning = errorMessage + " The command will be ignored.";
             LOG(CbkLogLevel::Warning, warning);
         }
     }
-
+    
     const auto componentNameToTypeAndStateMap = GetVehicleComponentNamesToTypeAndStateMap();
     for (auto& vehicleComponentLocalLinkIdToStateInformationPair : vehicleComponentStateInformations)
     {
diff --git a/sim/src/components/ComponentController/src/stateManager.h b/sim/src/components/ComponentController/src/stateManager.h
index 43cb543f679f7367a893bf5c3934cf629f106d94..a3bdf96b5f92ebadda6ba7e7100c9a5662a498b1 100644
--- a/sim/src/components/ComponentController/src/stateManager.h
+++ b/sim/src/components/ComponentController/src/stateManager.h
@@ -15,7 +15,6 @@
 #include "include/callbackInterface.h"
 #include "componentControllerCommon.h"
 #include "componentStateInformation.h"
-#include "common/events/componentStateChangeEvent.h"
 
 namespace ComponentControl {
 
@@ -102,12 +101,10 @@ public:
 
     /*!
      * \brief UpdateMaxReachableStatesForRegisteredComponents Calculates and updates the max reachable states for the registered components using the provided
-     *        event list (filtered to include only ComponentStateChangeEvents and only for the agentId of the ComponentController owning the statemanager) and registered
-     *        Condition-state pairs
-     * \param componentStateChanges     the event list from the event network, filtered to include only those events related to the agentId
-     *        of the controlling ComponentController and only including ComponentStateChangeEvents
+     *        componentStates list and registered Condition-state pairs
+     * \param componentStates     the componentStates list, filtered to include only valid commands of the correct size
      */
-    void UpdateMaxReachableStatesForRegisteredComponents(std::vector<openpass::events::ComponentStateChangeEvent const *>& componentStateChanges);
+    void UpdateMaxReachableStatesForRegisteredComponents(std::vector<std::pair<std::string, ComponentState>> componentStates);
 private:
     //-----------------------------------------------------------------------------
     //! Provides callback to LOG() macro
diff --git a/sim/src/components/Dynamics_Chassis/ForceWheelZ.cpp b/sim/src/components/Dynamics_Chassis/ForceWheelZ.cpp
index 189d9431d62a1a92baa3ea52015d027244f6916b..22545ef46091d8ddb5e314eca4830445ad02ae12 100644
--- a/sim/src/components/Dynamics_Chassis/ForceWheelZ.cpp
+++ b/sim/src/components/Dynamics_Chassis/ForceWheelZ.cpp
@@ -13,10 +13,10 @@
 // Calculate the perpendicular force on wheels against inertia
 //   - the pitchZ is positive if pitching backward, otherwise negative
 //   - the rollZ is positive if rolling right, otherwise negative
-bool ForceWheelZ::CalForce(double fInertiaX, double fInertiaY, double pitchZ, double rollZ, VehicleBasics &carParam)
+bool ForceWheelZ::CalForce(units::force::newton_t fInertiaX, units::force::newton_t fInertiaY, units::length::meter_t pitchZ, units::length::meter_t rollZ, VehicleBasics &carParam)
 {
-    double pitchAngle = atan2(pitchZ, (carParam.lenFront + carParam.lenRear)); // the pitch angle is positive if pitching backward, otherwise negative
-    double rollAngle = atan2(rollZ, (carParam.lenLeft + carParam.lenRight));   // the roll angle is positive if rolling right, otherwise negative
+    units::angle::radian_t pitchAngle = units::math::atan2(pitchZ, (carParam.lenFront + carParam.lenRear)); // the pitch angle is positive if pitching backward, otherwise negative
+    units::angle::radian_t rollAngle = units::math::atan2(rollZ, (carParam.lenLeft + carParam.lenRight));   // the roll angle is positive if rolling right, otherwise negative
     carParam.Deformation(pitchAngle, rollAngle);
 
     if(!CalForceInPitch(fInertiaX, pitchAngle, carParam))
@@ -35,28 +35,26 @@ bool ForceWheelZ::CalForce(double fInertiaX, double fInertiaY, double pitchZ, do
 // Calculate the perpendicular force on front and rear wheels against the inertia force in X axis
 //   - the pitch angle is positive if pitching backward, otherwise negative
 //   - the roll angle is positive if rolling right, otherwise negative
-bool ForceWheelZ::CalForceInPitch(double fInertiaX, double pitchAngle, VehicleBasics &carParam)
+bool ForceWheelZ::CalForceInPitch(units::force::newton_t fInertiaX, units::angle::radian_t pitchAngle, VehicleBasics &carParam)
 {
-
-    double wheelBaseLen = carParam.lenFront + carParam.lenRear;
-    double frontAngle = atan2(carParam.heightMC, carParam.lenFront) - pitchAngle;
-    double rearAngle  = atan2(carParam.heightMC, carParam.lenRear)  + pitchAngle;
+    const auto wheelBaseLen = carParam.lenFront + carParam.lenRear;
+    units::angle::radian_t frontAngle = units::math::atan2(carParam.heightMC, carParam.lenFront) - pitchAngle;
+    units::angle::radian_t rearAngle = units::math::atan2(carParam.heightMC, carParam.lenRear) + pitchAngle;
 
     // Calculate the perpendicular force on front wheels
-    double dRear2MC = sqrt((carParam.lenRear * carParam.lenRear) + (carParam.heightMC * carParam.heightMC));
-    double fZFront = dRear2MC * fInertiaX * sin(rearAngle) / wheelBaseLen;
+    units::length::meter_t dRear2MC = units::math::sqrt((carParam.lenRear * carParam.lenRear) + (carParam.heightMC * carParam.heightMC));
+    units::force::newton_t fZFront = dRear2MC * fInertiaX * units::math::sin(rearAngle) / wheelBaseLen;
 
     // Calculate the perpendicular force on rear wheels
-    double dFront2MC = sqrt((carParam.lenFront * carParam.lenFront) + (carParam.heightMC * carParam.heightMC));
-    double fZRear = dFront2MC * (-fInertiaX) * sin(frontAngle) / wheelBaseLen;
-
+    units::length::meter_t dFront2MC = units::math::sqrt((carParam.lenFront * carParam.lenFront) + (carParam.heightMC * carParam.heightMC));
+    units::force::newton_t fZRear = dFront2MC * (-fInertiaX) * units::math::sin(frontAngle) / wheelBaseLen;
 
     // separate front force to frontleft and frontright wheels
-    forcesPitch[0] = fZFront / (1 + carParam.ratioY);  // frontleft
+    forcesPitch[0] = fZFront / (1 + carParam.ratioY);      // frontleft
     forcesPitch[1] = carParam.ratioY * forcesPitch[0];     // frontright
 
     // separate rear force to rearleft and rearright wheels
-    forcesPitch[2] = fZRear / (1 + carParam.ratioY);     // rearleft
+    forcesPitch[2] = fZRear / (1 + carParam.ratioY);       // rearleft
     forcesPitch[3] = carParam.ratioY * forcesPitch[2];     // rearright
 
     return true;
@@ -65,27 +63,26 @@ bool ForceWheelZ::CalForceInPitch(double fInertiaX, double pitchAngle, VehicleBa
 // Calculate the perpendicular force on left and right wheels against the inertia force in Y axis
 //   - the pitch angle is positive if pitching backward, otherwise negative
 //   - the roll angle is positive if rolling right, otherwise negative
-bool ForceWheelZ::CalForceInRoll(double fInertiaY, double rollAngle, VehicleBasics &carParam)
+bool ForceWheelZ::CalForceInRoll(units::force::newton_t fInertiaY, units::angle::radian_t rollAngle, VehicleBasics &carParam)
 {
-
-    double wheelBaseWid = carParam.lenLeft + carParam.lenRight;
-    double leftAngle  = atan2(carParam.heightMC, carParam.lenLeft)  - rollAngle;
-    double rightAngle = atan2(carParam.heightMC, carParam.lenRight) + rollAngle;
+    const auto wheelBaseWid = carParam.lenLeft + carParam.lenRight;
+    units::angle::radian_t leftAngle = units::math::atan2(carParam.heightMC, carParam.lenLeft) - rollAngle;
+    units::angle::radian_t rightAngle = units::math::atan2(carParam.heightMC, carParam.lenRight) + rollAngle;
 
     // Calculate the perpendicular force on front wheels against the longitudinal inertia
-    double dRight2MC = sqrt((carParam.lenRight * carParam.lenRight) + (carParam.heightMC * carParam.heightMC));
-    double fZLeft = dRight2MC * fInertiaY * sin(rightAngle) / wheelBaseWid;
+    units::length::meter_t dRight2MC = units::math::sqrt((carParam.lenRight * carParam.lenRight) + (carParam.heightMC * carParam.heightMC));
+    units::force::newton_t fZLeft = dRight2MC * fInertiaY * units::math::sin(rightAngle) / wheelBaseWid;
 
     // Calculate the perpendicular force on rear wheels against the longitudinal inertia
-    double dLeft2MC = sqrt((carParam.lenLeft * carParam.lenLeft) + (carParam.heightMC * carParam.heightMC));
-    double fZRight = dLeft2MC * (-fInertiaY) * sin(leftAngle) / wheelBaseWid;
+    units::length::meter_t dLeft2MC = units::math::sqrt((carParam.lenLeft * carParam.lenLeft) + (carParam.heightMC * carParam.heightMC));
+    units::force::newton_t fZRight = dLeft2MC * (-fInertiaY) * units::math::sin(leftAngle) / wheelBaseWid;
 
     // separate left force to frontleft and rearleft wheels
-    forcesRoll[0] = fZLeft / (1 + carParam.ratioX);   // frontleft
+    forcesRoll[0] = fZLeft / (1 + carParam.ratioX);      // frontleft
     forcesRoll[2] = carParam.ratioX * forcesRoll[0];     // rearleft
 
     // separate right force to frontright and rearright wheels
-    forcesRoll[1] = fZRight / (1 + carParam.ratioX);  // frontright
+    forcesRoll[1] = fZRight / (1 + carParam.ratioX);     // frontright
     forcesRoll[3] = carParam.ratioX * forcesRoll[1];     // rearright
 
     return true;
diff --git a/sim/src/components/Dynamics_Chassis/ForceWheelZ.h b/sim/src/components/Dynamics_Chassis/ForceWheelZ.h
index 6553962c020f970568d0b60949f03491ae115086..68a28f08f46ea82d0721332d9b08fe8bdd31af52 100644
--- a/sim/src/components/Dynamics_Chassis/ForceWheelZ.h
+++ b/sim/src/components/Dynamics_Chassis/ForceWheelZ.h
@@ -11,9 +11,11 @@
 #ifndef FORCEWHEELZ_H
 #define FORCEWHEELZ_H
 
-#include "VehicleBasics.h"
 #include <vector>
 
+#include "VehicleBasics.h"
+#include "common/globalDefinitions.h"
+
 //! Wheel force perpendicular.
 class ForceWheelZ
 {
@@ -27,20 +29,23 @@ public:
     virtual ~ForceWheelZ() = default;
 
     // Calculate the perpendicular force on wheels against inertia
-    bool CalForce(double fInertiaX, double fInertiaY, double pitchZ, double rollZ, VehicleBasics &carParam);
+    bool CalForce(units::force::newton_t fInertiaX, units::force::newton_t fInertiaY, units::length::meter_t pitchZ, units::length::meter_t rollZ, VehicleBasics &carParam);
 
-    double GetForce(int i) const { return forces[i]; }
+    units::force::newton_t GetForce(int i) const
+    {
+        return forces[i];
+    }
 
 private:
-    double forces[NUMBER_WHEELS]      = {0.0, 0.0, 0.0, 0.0};
-    double forcesPitch[NUMBER_WHEELS] = {0.0, 0.0, 0.0, 0.0};
-    double forcesRoll[NUMBER_WHEELS]  = {0.0, 0.0, 0.0, 0.0};
+    units::force::newton_t forces[NUMBER_WHEELS] = {0.0_N, 0.0_N, 0.0_N, 0.0_N};
+    units::force::newton_t forcesPitch[NUMBER_WHEELS] = {0.0_N, 0.0_N, 0.0_N, 0.0_N};
+    units::force::newton_t forcesRoll[NUMBER_WHEELS] = {0.0_N, 0.0_N, 0.0_N, 0.0_N};
 
     // Calculate the perpendicular force on front and rear wheels against the inertia force in X axis
-    bool CalForceInPitch(double fInertiaX, double pitchAngle, VehicleBasics &carParam);
+    bool CalForceInPitch(units::force::newton_t fInertiaX, units::angle::radian_t pitchAngle, VehicleBasics &carParam);
 
     // Calculate the perpendicular force on left and right wheels against the inertia force in Y axis
-    bool CalForceInRoll(double fInertiaY, double rollAngle, VehicleBasics &carParam);
+    bool CalForceInRoll(units::force::newton_t fInertiaY, units::angle::radian_t rollAngle, VehicleBasics &carParam);
 };
 
 #endif //FORCEWHEELZ_H
diff --git a/sim/src/components/Dynamics_Chassis/VehicleBasics.h b/sim/src/components/Dynamics_Chassis/VehicleBasics.h
index 750d4107035751345991ad63e0c73e941a819626..64c2f5ed9450a62590504f7f0522670ca1c7bd0f 100644
--- a/sim/src/components/Dynamics_Chassis/VehicleBasics.h
+++ b/sim/src/components/Dynamics_Chassis/VehicleBasics.h
@@ -12,16 +12,21 @@
 #define VEHICLEBASICS_H
 
 #define NUMBER_WHEELS 4
-#define GRAVITY_ACC 9.81
 
 #include <math.h>
 
+#include "units.h"
+
+const units::acceleration::meters_per_second_squared_t GRAVITY_ACC{9.81};
+
+using namespace units::literals;
+
 class VehicleBasics
 {
 public:
     VehicleBasics() = default;
 
-    VehicleBasics(double lLeft, double lRight, double lFront, double lRear, double hMC, double m):
+    VehicleBasics(units::length::meter_t lLeft, units::length::meter_t lRight, units::length::meter_t lFront, units::length::meter_t lRear, units::length::meter_t hMC, units::mass::kilogram_t m) :
         lenLeft(lLeft), lenRight(lRight), lenFront(lFront), lenRear(lRear), heightMC(hMC), mass(m)
     {
         CalculateRatio();
@@ -33,16 +38,16 @@ public:
 //    VehicleBasics &operator=(const VehicleBasics &) = delete;
 //    VehicleBasics &operator=(VehicleBasics &&) = delete;
 
-    double lenLeft;
-    double lenRight;
-    double lenFront;
-    double lenRear;
+    units::length::meter_t lenLeft;
+    units::length::meter_t lenRight;
+    units::length::meter_t lenFront;
+    units::length::meter_t lenRear;
 
     double ratioX; // front length / rear length
-    double ratioY;  // left length / right length
+    double ratioY; // left length / right length
 
-    double heightMC; // hight of mass center
-    double mass;
+    units::length::meter_t heightMC; // hight of mass center
+    units::mass::kilogram_t mass;
 
     void CalculateRatio()
     {
@@ -52,8 +57,8 @@ public:
 
     void CalculateWheelMass()
     {
-        double massFront = mass / (1 + ratioX);
-        double massRear = ratioX * massFront;
+        units::mass::kilogram_t massFront = mass / (1 + ratioX);
+        units::mass::kilogram_t massRear = ratioX * massFront;
 
         // separate front mass to frontleft and frontright wheels
         wheelMass[0] = massFront / (1 + ratioY);  // frontleft
@@ -64,37 +69,40 @@ public:
         wheelMass[3] = ratioY * wheelMass[2];     // rearright
     }
 
-    void Deformation(double pitchAngle, double rollAngle)
+    void Deformation(units::angle::radian_t pitchAngle, units::angle::radian_t rollAngle)
     {
-        if(pitchAngle >= 0) // pitching backward, and mcOffsetX will be negative
+        if (pitchAngle >= 0_rad) // pitching backward, and mcOffsetX will be negative
         {
-            mcOffsetX = - sin(pitchAngle) * (heightMC + lenRear * tan(pitchAngle));
+            mcOffsetX = -units::math::sin(pitchAngle) * (heightMC + lenRear * units::math::tan(pitchAngle));
         }
         else // pitching foreward, and mcOffsetX will be positive
         {
-            mcOffsetX = sin(-pitchAngle) * (heightMC + lenFront * tan(-pitchAngle));
+            mcOffsetX = units::math::sin(-pitchAngle) * (heightMC + lenFront * units::math::tan(-pitchAngle));
         }
 
-        if(rollAngle >= 0) // rolling towards right, and mcOffsetY will be negative
+        if (rollAngle >= 0_rad) // rolling towards right, and mcOffsetY will be negative
         {
-            mcOffsetY = - sin(rollAngle) * (heightMC + lenRight* tan(rollAngle));
+            mcOffsetY = -units::math::sin(rollAngle) * (heightMC + lenRight * units::math::tan(rollAngle));
         }
         else // rolling towards left, and mcOffsetY will be positive
         {
-            mcOffsetY = sin(-rollAngle) * (heightMC + lenLeft * tan(-rollAngle));
+            mcOffsetY = units::math::sin(-rollAngle) * (heightMC + lenLeft * units::math::tan(-rollAngle));
         }
 
         CalculateRatio();
         CalculateWheelMass();
     }
 
-    double GetWheelMass(int i) { return wheelMass[i]; }
+    units::mass::kilogram_t GetWheelMass(int i)
+    {
+        return wheelMass[i];
+    }
 
 private:
-    double mcOffsetX = 0.0;
-    double mcOffsetY = 0.0;
+    units::length::meter_t mcOffsetX{0.0};
+    units::length::meter_t mcOffsetY{0.0};
 
-    double wheelMass[NUMBER_WHEELS];
+    units::mass::kilogram_t wheelMass[NUMBER_WHEELS];
 };
 
 #endif //VEHICLEBASICS_H
diff --git a/sim/src/components/Dynamics_Chassis/WheelOscillation.cpp b/sim/src/components/Dynamics_Chassis/WheelOscillation.cpp
index 312170a024d34039bf583aed76828e8e38960c1d..bf38db2ef03ffcd9199e375081fa6304139b4a7a 100644
--- a/sim/src/components/Dynamics_Chassis/WheelOscillation.cpp
+++ b/sim/src/components/Dynamics_Chassis/WheelOscillation.cpp
@@ -20,7 +20,7 @@ void WheelOscillation::Init(int wId, double time_step, double k, double q)
     coeffDamp = q;
 }
 
-void WheelOscillation::Perform(double forceZ, double mass)
+void WheelOscillation::Perform(units::force::newton_t forceZ, units::mass::kilogram_t mass)
 {
     /*
      *  forceZ + counter_force = m * Az
@@ -32,7 +32,7 @@ void WheelOscillation::Perform(double forceZ, double mass)
      *  forceZ - K * prevZ - K * prevVz * dt - Q * prevVz = (m + 0.5 * K * dt^2 + Q * dt ) * Az
     */
 
-    curAz = (forceZ - coeffSpring * curZ - coeffDamp * curVz) / (mass);
+    curAz = (forceZ.value() - coeffSpring * curZ - coeffDamp * curVz) / (mass.value());
     curVz = prevVz + curAz * timeStep;
     curZ += prevVz * timeStep + 0.5 * curAz * timeStep * timeStep;
 
diff --git a/sim/src/components/Dynamics_Chassis/WheelOscillation.h b/sim/src/components/Dynamics_Chassis/WheelOscillation.h
index bb6f8e085919fd483b2e7657a361d2a0accc9a50..3b2ee30e2ab125f9a6c1f6facac8a8dd6cb374df 100644
--- a/sim/src/components/Dynamics_Chassis/WheelOscillation.h
+++ b/sim/src/components/Dynamics_Chassis/WheelOscillation.h
@@ -11,6 +11,8 @@
 #ifndef WHEELOSCILLATION_H
 #define WHEELOSCILLATION_H
 
+#include "units.h"
+
 //! Wheel force perpendicular.
 class WheelOscillation
 {
@@ -27,7 +29,7 @@ public:
     void Init(int id, double time_step, double k, double q);
 
     //! Perform simulation;
-    void Perform(double forceZ, double mass);
+    void Perform(units::force::newton_t forceZ, units::mass::kilogram_t mass);
 
     double GetCurZPos() const { return curZ; }
 
diff --git a/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.cpp b/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.cpp
index ea907d968b9c6bf980a69b7a4700d545b72f06f4..590f130d804985fd65452f6b7f07ab7cec1adebd 100644
--- a/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.cpp
+++ b/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2020-2021 ITK Engineering GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -80,16 +81,22 @@ Dynamics_Chassis_Implementation::Dynamics_Chassis_Implementation(std::string com
     /** @addtogroup init_3dc
      * Get basic parameters of the ego vehicle.
     */
-    double wheelBase = agent->GetVehicleModelParameters().frontAxle.positionX - agent->GetVehicleModelParameters().rearAxle.positionX;
-    double lenFront = wheelBase / 2.0;
-    double lenRear = wheelBase - lenFront;
-    double trackWidth = GetAgent()->GetVehicleModelParameters().frontAxle.trackWidth;
-    double hCOG = GetAgent()->GetVehicleModelParameters().boundingBoxDimensions.height/2.0;
-    auto mass = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, vehicle::properties::Mass);
-    THROWIFFALSE(mass.has_value(), "Mass was not defined in VehicleCatalog");
+    if (agent->GetVehicleModelParameters()->type != mantle_api::EntityType::kVehicle)
+    {
+        throw std::runtime_error("Invalid EntityType for Component " + componentName + ". Component can only be used by vehicles.");
+    }
+
+    vehicleProperties = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(agent->GetVehicleModelParameters());
+
+    const auto wheelBase = vehicleProperties->front_axle.bb_center_to_axle_center.x - vehicleProperties->rear_axle.bb_center_to_axle_center.y;
+    const auto lenFront = wheelBase / 2.0;
+    const auto lenRear = wheelBase - lenFront;
+    const auto trackWidth = vehicleProperties->front_axle.track_width;
+    const auto hCOG = vehicleProperties->bounding_box.dimension.height / 2.0;
+    auto mass = GetAgent()->GetVehicleModelParameters()->mass;
 
     // define car parameters including lLeft, lRight, lFront, lRear, hMC, mass
-    carParam = VehicleBasics(trackWidth*0.5, trackWidth*0.5, lenFront, lenRear, hCOG, mass.value());
+    carParam = VehicleBasics(trackWidth * 0.5, trackWidth * 0.5, lenFront, lenRear, hCOG, mass);
 
     /** @addtogroup init_3dc
      * For each wheel, initialize the correspondig oscillation object for later simulation.
@@ -102,8 +109,8 @@ Dynamics_Chassis_Implementation::Dynamics_Chassis_Implementation(std::string com
     LOGDEBUG(QString().sprintf("Chassis: agent info: DistanceCOGtoFrontAxle %.2f, DistanceCOGtoRearAxle %.2f, trackWidth %.2f, heightCOG %.2f, mass %.2f",
                    lenFront, lenRear, trackWidth, hCOG, mass).toStdString());
 
-    pitchZ = 0.0;
-    rollZ = 0.0;
+    pitchZ = 0.0_m;
+    rollZ = 0.0_m;
 
     LOGINFO("Constructing Dynamics_Chassis successful");
 
@@ -145,12 +152,12 @@ void Dynamics_Chassis_Implementation::Trigger(int time)
     /** @addtogroup sim_step_3dc
      * Get the inputs of inertia forces.
     */
-    double fInertiaX = 0.0;
-    double fInertiaY = 0.0;
+    units::force::newton_t fInertiaX{0.0};
+    units::force::newton_t fInertiaY{0.0};
     if(inertiaForce.GetValue().size() == 2)
     {
-        fInertiaX = inertiaForce.GetValue().at(0);
-        fInertiaY = inertiaForce.GetValue().at(1);
+        fInertiaX = units::force::newton_t(inertiaForce.GetValue().at(0));
+        fInertiaY = units::force::newton_t(inertiaForce.GetValue().at(1));
     }
 
     /** @addtogroup sim_step_3dc_2
@@ -160,13 +167,13 @@ void Dynamics_Chassis_Implementation::Trigger(int time)
     if(!wheelForces.CalForce(fInertiaX, fInertiaY, pitchZ, rollZ, carParam))
         return;
 
-    double originalForce = -carParam.mass / NUMBER_WHEELS * GRAVITY_ACC;
+    units::force::newton_t originalForce = -carParam.mass / NUMBER_WHEELS * GRAVITY_ACC;
 
     /** @addtogroup sim_step_3dc_2
      * For each wheel, calculate the total vertical force as well as the Z-position.
     */
-    double forceZ;
-    double wheelMass;
+    units::force::newton_t forceZ;
+    units::mass::kilogram_t wheelMass;
     std::vector<double> resForces;
     for(int i=0; i < NUMBER_WHEELS; i++)
     {
@@ -174,11 +181,11 @@ void Dynamics_Chassis_Implementation::Trigger(int time)
         // calculate deformation due to the vertical force
         wheelMass = carParam.GetWheelMass(i); // the mass is distributed based on deformation
         forceZ = -wheelMass * GRAVITY_ACC + wheelForces.GetForce(i);
-        if (forceZ>-1.0)
+        if (forceZ > -1.0_N)
         {
-            forceZ = -1.0; // glue the tires to the ground and limit to at least 1N
+            forceZ = -1.0_N; // glue the tires to the ground and limit to at least 1N
         }
-        resForces.push_back(forceZ);
+        resForces.push_back(forceZ.value());
 
         oscillations[i].Perform(forceZ, wheelMass);
     }
@@ -198,8 +205,8 @@ void Dynamics_Chassis_Implementation::Trigger(int time)
     */
     // the pitchZ is positive if pitching backward, otherwise negative
     // the rollZ is positive if rolling right, otherwise negative
-    pitchZ = (oscillations[0].GetCurZPos() + oscillations[1].GetCurZPos() - oscillations[2].GetCurZPos() - oscillations[3].GetCurZPos()) / 2.0;
-    rollZ = (oscillations[0].GetCurZPos() + oscillations[2].GetCurZPos() - oscillations[1].GetCurZPos() - oscillations[3].GetCurZPos()) / 2.0;
+    pitchZ = units::length::meter_t((oscillations[0].GetCurZPos() + oscillations[1].GetCurZPos() - oscillations[2].GetCurZPos() - oscillations[3].GetCurZPos()) / 2.0);
+    rollZ = units::length::meter_t((oscillations[0].GetCurZPos() + oscillations[2].GetCurZPos() - oscillations[1].GetCurZPos() - oscillations[3].GetCurZPos()) / 2.0);
 
     /** @addtogroup sim_step_3
      * Output local vertical forces for the two-track dynamics.
diff --git a/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.h b/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.h
index 80b0427f35d61a88c146633da3b1c55c8961da63..8356e05b1539464192b2b0576b8f113c291912e2 100644
--- a/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.h
+++ b/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.h
@@ -165,11 +165,13 @@ private:
     ForceWheelZ wheelForces;
     WheelOscillation oscillations[NUMBER_WHEELS];
 
-    double pitchZ;
-    double rollZ;
+    units::length::meter_t pitchZ;
+    units::length::meter_t rollZ;
     /**
      *    @}
     */
+
+    std::shared_ptr<const mantle_api::VehicleProperties> vehicleProperties;
 };
 
 #endif // DYNAMICS_CHASSIS_IMPLEMENTATION_H
diff --git a/sim/src/components/Dynamics_Collision/src/collisionImpl.cpp b/sim/src/components/Dynamics_Collision/src/collisionImpl.cpp
index 40e8c519082a8cc35d8be558df1af9322a325652..967382bcea5330ead5947bc180c8bdd1aa6189ea 100644
--- a/sim/src/components/Dynamics_Collision/src/collisionImpl.cpp
+++ b/sim/src/components/Dynamics_Collision/src/collisionImpl.cpp
@@ -1,7 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2017-2018 ITK Engineering GmbH
  *               2017-2020 in-tech GmbH
- *               2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -95,12 +95,11 @@ void DynamicsCollisionImplementation::Trigger(int time)
         bool collisionWithFixedObject = false;
 
         //Calculate new velocity by inelastic collision
-        auto weight = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, vehicle::properties::Mass);
-        THROWIFFALSE(weight.has_value(), "Mass was not defined in VehicleCatalog");
+        units::mass::kilogram_t weight = GetAgent()->GetVehicleModelParameters()->mass;
 
-        double sumOfWeights = weight.value();
-        double sumOfImpulsesX = GetAgent()->GetVelocity().x * weight.value();
-        double sumOfImpulsesY = GetAgent()->GetVelocity().y * weight.value();
+        units::mass::kilogram_t sumOfWeights{weight};
+        auto sumOfImpulsesX = GetAgent()->GetVelocity().x * weight;
+        auto sumOfImpulsesY = GetAgent()->GetVelocity().y * weight;
 
         auto collisionPartners = GetAgent()->GetCollisionPartners();
         for (const auto &partner : collisionPartners)
@@ -113,68 +112,67 @@ void DynamicsCollisionImplementation::Trigger(int time)
             const AgentInterface* partnerAgent = GetWorld()->GetAgent(partner.second);
             if (partnerAgent != nullptr)
             {
-                weight = helper::map::query(partnerAgent->GetVehicleModelParameters().properties, vehicle::properties::Mass);
-                THROWIFFALSE(weight.has_value(), "Mass was not defined in VehicleCatalog");
+                weight = partnerAgent->GetVehicleModelParameters()->mass;
 
-                sumOfWeights += weight.value();
-                sumOfImpulsesX += partnerAgent->GetVelocity().x * weight.value();
-                sumOfImpulsesY += partnerAgent->GetVelocity().y * weight.value();
+                sumOfWeights += weight;
+                sumOfImpulsesX += partnerAgent->GetVelocity().x * weight;
+                sumOfImpulsesY += partnerAgent->GetVelocity().y * weight;
             }
         }
 
         if (collisionWithFixedObject)
         {
-            velocity = 0.0;
+            velocity = 0.0_mps;
         }
         else
         {
-            double velocityX = sumOfImpulsesX / sumOfWeights;
-            double velocityY = sumOfImpulsesY / sumOfWeights;
+            units::velocity::meters_per_second_t velocityX = sumOfImpulsesX / sumOfWeights;
+            units::velocity::meters_per_second_t velocityY = sumOfImpulsesY / sumOfWeights;
             velocity = openpass::hypot(velocityX, velocityY);
-            if (velocityY > 0.0)
+            if (velocityY > 0.0_mps)
             {
-                movingDirection = std::acos(velocityX / velocity);
+                movingDirection = units::math::acos(velocityX / velocity);
             }
-            else if (velocity != 0.0)
+            else if (velocity != 0.0_mps)
             {
-                movingDirection = -std::acos(velocityX / velocity);
+                movingDirection = -units::math::acos(velocityX / velocity);
             }
             else
             {
-                movingDirection = 0.0;
+                movingDirection = 0.0_rad;
             }
         }
-        dynamicsSignal.yaw = GetAgent()->GetYaw();
-        dynamicsSignal.yawRate = 0;
-        dynamicsSignal.yawAcceleration = 0;
+        dynamicsSignal.dynamicsInformation.yaw = GetAgent()->GetYaw();
+        dynamicsSignal.dynamicsInformation.yawRate = 0.0_rad_per_s;
+        dynamicsSignal.dynamicsInformation.yawAcceleration = 0.0_rad_per_s_sq;
     }
 
     if (isActive)
     {
-        const double deceleration = 10.0;
-        velocity -= deceleration * GetCycleTime() * 0.001;
+        const units::acceleration::meters_per_second_squared_t deceleration{10.0};
+        velocity -= deceleration * units::time::millisecond_t(GetCycleTime());
 
-        if (velocity < 0.0)
+        if (velocity < 0.0_mps)
         {
             isActive = false;
         }
 
-        velocity = std::max(0.0, velocity);
+        velocity = std::max(0.0_mps, velocity);
         // change of path coordinate since last time step [m]
-        double ds = velocity * static_cast<double>(GetCycleTime()) * 0.001;
+        units::length::meter_t ds = velocity * units::time::millisecond_t(GetCycleTime());
         // change of inertial x-position due to ds and yaw [m]
-        double dx = ds * std::cos(movingDirection);
+        units::length::meter_t dx = ds * units::math::cos(movingDirection);
         // change of inertial y-position due to ds and yaw [m]
-        double dy = ds * std::sin(movingDirection);
+        units::length::meter_t dy = ds * units::math::sin(movingDirection);
         // new inertial x-position [m]
-        double x = GetAgent()->GetPositionX() + dx;
+        units::length::meter_t x = GetAgent()->GetPositionX() + dx;
         // new inertial y-position [m]
-        double y = GetAgent()->GetPositionY() + dy;
+        units::length::meter_t y = GetAgent()->GetPositionY() + dy;
 
-        dynamicsSignal.velocity = velocity;
-        dynamicsSignal.acceleration = isActive ? -deceleration : 0.0;
-        dynamicsSignal.positionX = x;
-        dynamicsSignal.positionY = y;
-        dynamicsSignal.travelDistance = ds;
+        dynamicsSignal.dynamicsInformation.velocity = velocity;
+        dynamicsSignal.dynamicsInformation.acceleration = isActive ? -deceleration : 0.0_mps_sq;
+        dynamicsSignal.dynamicsInformation.positionX = x;
+        dynamicsSignal.dynamicsInformation.positionY = y;
+        dynamicsSignal.dynamicsInformation.travelDistance = ds;
     }
 }
diff --git a/sim/src/components/Dynamics_Collision/src/collisionImpl.h b/sim/src/components/Dynamics_Collision/src/collisionImpl.h
index 11943b4a31e1de53c766bad9214236c5cbaa3a67..af0fb487f04d5b8b16cca97f0dd76a5061787bfa 100644
--- a/sim/src/components/Dynamics_Collision/src/collisionImpl.h
+++ b/sim/src/components/Dynamics_Collision/src/collisionImpl.h
@@ -104,13 +104,13 @@ public:
     virtual void Trigger(int time);
 
     //for testing
-    double GetVelocity ()
+    units::velocity::meters_per_second_t GetVelocity ()
     {
         return velocity;
     }
 
     //for testing
-    double GetMovingDirection ()
+    units::angle::radian_t GetMovingDirection ()
     {
         return movingDirection;
     }
@@ -118,8 +118,8 @@ public:
 private:
     DynamicsSignal dynamicsSignal;
 
-    double velocity {};
-    double movingDirection {};
+    units::velocity::meters_per_second_t velocity{};
+    units::angle::radian_t movingDirection {};
     unsigned int numberOfCollisionPartners = 0;
     bool isActive = false;
 };
diff --git a/sim/src/components/Dynamics_CollisionPCM/dynamics_collision_implementation.cpp b/sim/src/components/Dynamics_CollisionPCM/dynamics_collision_implementation.cpp
index 3216a0e79afb554823d6469b897003c98d65b458..5e1a8fedf110c5f4f80ac34bf33d3aa0a687ae64 100644
--- a/sim/src/components/Dynamics_CollisionPCM/dynamics_collision_implementation.cpp
+++ b/sim/src/components/Dynamics_CollisionPCM/dynamics_collision_implementation.cpp
@@ -40,7 +40,7 @@ Dynamics_Collision_Implementation::Dynamics_Collision_Implementation(
         agent)
 {
     LOGINFO("Constructing Dynamics_Collision");
-    cycleTimeSec = (double)cycleTime / 1000;
+    cycleTimeSec = units::time::millisecond_t(cycleTime);
     LOGINFO("Constructing Dynamics_Collision successful");
 }
 
@@ -133,22 +133,22 @@ void Dynamics_Collision_Implementation::Trigger(int time)
             GetAgent()->SetPositionY(GetAgent()->GetPositionY() + GetAgent()->GetVelocity().y * cycleTimeSec); // global CS
             GetAgent()->SetYaw(GetAgent()->GetYaw() + GetAgent()->GetYawRate()*cycleTimeSec);
 
-            Common::Vector2d velocityImpact(postCrashVel.velocityAbsolute, 0.0);
+            Common::Vector2d<units::velocity::meters_per_second_t> velocityImpact(postCrashVel.velocityAbsolute, 0.0_mps);
             velocityImpact.Rotate(postCrashVel.velocityDirection);
-            GetAgent()->SetVelocityVector(velocityImpact.x, velocityImpact.y, 0.0);
+            GetAgent()->SetVelocityVector({velocityImpact.x, velocityImpact.y, 0.0_mps});
             GetAgent()->SetYawRate(postCrashVel.yawVelocity);
             LOGDEBUG(QString().sprintf("Override Velocity by Dynamics_CollisionPCM for agent %d: %f, %f, %f",
                                        GetAgent()->GetId(), velocityImpact.x, velocityImpact.y, postCrashVel.yawVelocity).toStdString());
 
         }
         Common::Vector2d accelerationImpact(0.0, 0.0);
-        double yawAccel = 0.0;
-        GetAgent()->SetTangentialAcceleration(accelerationImpact.x);
-        GetAgent()->SetCentripetalAcceleration(accelerationImpact.y);
+        units::angular_acceleration::radians_per_second_squared_t yawAccel{0.0};
+        GetAgent()->SetTangentialAcceleration(units::acceleration::meters_per_second_squared_t(accelerationImpact.x));
+        GetAgent()->SetCentripetalAcceleration(units::acceleration::meters_per_second_squared_t(accelerationImpact.y));
         GetAgent()->SetYawAcceleration(yawAccel);
 
         // for logging purposes: only longitudinal acceleration in vehicle CS
-        GetAgent()->SetAcceleration(accelerationImpact.x);
+        GetAgent()->SetAcceleration(units::acceleration::meters_per_second_squared_t(accelerationImpact.x));
 
         // Application of acceleration instead of setting velocities is not possible:
         // The acceleration values are far too high for a single simulation step (200g and above)     
diff --git a/sim/src/components/Dynamics_CollisionPCM/dynamics_collision_implementation.h b/sim/src/components/Dynamics_CollisionPCM/dynamics_collision_implementation.h
index 46693052607c536782acec59b8d68c58cbe321a4..4882bc7864c6fc1563e018d6b1f511de92e7bdc3 100644
--- a/sim/src/components/Dynamics_CollisionPCM/dynamics_collision_implementation.h
+++ b/sim/src/components/Dynamics_CollisionPCM/dynamics_collision_implementation.h
@@ -143,7 +143,7 @@ private:
     //! current postCrashDynamic
     PostCrashDynamic *postCrashDynamic = nullptr;
 
-    double cycleTimeSec;
+    units::time::second_t cycleTimeSec;
 };
 
 #endif // DYNAMICS_COLLISION_IMPLEMENTATION_H
diff --git a/sim/src/components/Dynamics_CollisionPostCrash/src/collisionPostCrash.cpp b/sim/src/components/Dynamics_CollisionPostCrash/src/collisionPostCrash.cpp
index 479e3f89a335bc53ff2da33cd68899a992b21825..e07afdf535b9cc1b3c32ff790835629d6542e465 100644
--- a/sim/src/components/Dynamics_CollisionPostCrash/src/collisionPostCrash.cpp
+++ b/sim/src/components/Dynamics_CollisionPostCrash/src/collisionPostCrash.cpp
@@ -132,28 +132,28 @@ void DynamicsPostCrashImplementation::Trigger(int time)
 
 void DynamicsPostCrashImplementation::SetFadingDynamics()
 {
-    dynamicsSignal.yaw = GetAgent()->GetYaw();
-    dynamicsSignal.yawRate = GetAgent()->GetYawRate(); // This should be zero if yaw is not changing anymore
-    dynamicsSignal.yawAcceleration = GetAgent()->GetYawAcceleration(); // This should be zero if yaw and yaw rate are not changing anymore (except for the moment in which yawRate changes to zero)
-    const double deceleration = 10.0;
-    velocity -= deceleration * GetCycleTime() * 0.001;
-    velocity = std::max(0.0, velocity);
+    dynamicsSignal.dynamicsInformation.yaw = GetAgent()->GetYaw();
+    dynamicsSignal.dynamicsInformation.yawRate = GetAgent()->GetYawRate(); // This should be zero if yaw is not changing anymore
+    dynamicsSignal.dynamicsInformation.yawAcceleration = GetAgent()->GetYawAcceleration(); // This should be zero if yaw and yaw rate are not changing anymore (except for the moment in which yawRate changes to zero)
+    const units::acceleration::meters_per_second_squared_t deceleration{10.0};
+    velocity -= deceleration * units::time::millisecond_t(GetCycleTime());
+    velocity = units::math::max(0.0_mps, velocity);
     // change of path coordinate since last time step [m]
-    double ds = velocity * static_cast<double>(GetCycleTime()) * 0.001;
+    units::length::meter_t ds = velocity * units::time::millisecond_t(GetCycleTime());
     // change of inertial x-position due to ds and yaw [m]
-    double dx = ds * std::cos(movingDirection);
+    units::length::meter_t dx = ds * units::math::cos(movingDirection);
     // change of inertial y-position due to ds and yaw [m]
-    double dy = ds * std::sin(movingDirection);
+    units::length::meter_t dy = ds * units::math::sin(movingDirection);
     // new inertial x-position [m]
-    double x = GetAgent()->GetPositionX() + dx;
+    units::length::meter_t x = GetAgent()->GetPositionX() + dx;
     // new inertial y-position [m]
-    double y = GetAgent()->GetPositionY() + dy;
+    units::length::meter_t y = GetAgent()->GetPositionY() + dy;
 
-    dynamicsSignal.velocity = velocity;
-    dynamicsSignal.acceleration = 0.0;
-    dynamicsSignal.positionX = x;
-    dynamicsSignal.positionY = y;
-    dynamicsSignal.travelDistance = ds;
+    dynamicsSignal.dynamicsInformation.velocity = velocity;
+    dynamicsSignal.dynamicsInformation.acceleration = 0.0_mps_sq;
+    dynamicsSignal.dynamicsInformation.positionX = x;
+    dynamicsSignal.dynamicsInformation.positionY = y;
+    dynamicsSignal.dynamicsInformation.travelDistance = ds;
 }
 
 bool DynamicsPostCrashImplementation::TriggerPostCrashCheck(int time)
@@ -163,35 +163,35 @@ bool DynamicsPostCrashImplementation::TriggerPostCrashCheck(int time)
         return false;
     }
 
-    double cycleTime = (double)GetCycleTime() / 1000;
-    double yawAngle = GetAgent()->GetYaw();
-    double posX = GetAgent()->GetPositionX() + GetAgent()->GetVelocity().x * cycleTime;//global CS
-    double posY = GetAgent()->GetPositionY() + GetAgent()->GetVelocity().y * cycleTime;//global CS
-    double yawRatePrevious = GetAgent()->GetYawRate();
+    units::time::millisecond_t cycleTime{double(GetCycleTime())};
+    auto yawAngle = GetAgent()->GetYaw();
+    auto posX = GetAgent()->GetPositionX() + GetAgent()->GetVelocity().x * cycleTime;//global CS
+    auto posY = GetAgent()->GetPositionY() + GetAgent()->GetVelocity().y * cycleTime;//global CS
+    auto yawRatePrevious = GetAgent()->GetYawRate();
     yawAngle = yawAngle + yawRatePrevious * cycleTime;
 
     velocity = postCrashVel.velocityAbsolute;
     movingDirection = postCrashVel.velocityDirection;
-    double yawRate = postCrashVel.yawVelocity;
-    double yawAcceleration = (yawRate - yawRatePrevious) / cycleTime;
+    units::angular_velocity::radians_per_second_t yawRate = postCrashVel.yawVelocity;
+    auto yawAcceleration = (yawRate - yawRatePrevious) / cycleTime;
 
-    Common::Vector2d velocityVector(velocity * std::cos(movingDirection),
-                                    velocity * std::sin(movingDirection));
+    Common::Vector2d<units::velocity::meters_per_second_t> velocityVector((velocity * units::math::cos(movingDirection)),
+                                                                          (velocity * units::math::sin(movingDirection)));
     velocityVector.Rotate(-yawAngle);
 
-    double acceleration = 0.0;
-    double travelDist = velocity * cycleTime;
+    units::acceleration::meters_per_second_squared_t acceleration{0.0};
+    units::length::meter_t travelDist = velocity * cycleTime;
 
-    dynamicsSignal.yaw = yawAngle;
-    dynamicsSignal.yawRate = yawRate;
-    dynamicsSignal.yawAcceleration = yawAcceleration;
-    dynamicsSignal.velocity = velocity;
-    dynamicsSignal.acceleration = acceleration;
-    dynamicsSignal.positionX = posX;
-    dynamicsSignal.positionY = posY;
-    dynamicsSignal.travelDistance = travelDist;
+    dynamicsSignal.dynamicsInformation.yaw = yawAngle;
+    dynamicsSignal.dynamicsInformation.yawRate = yawRate;
+    dynamicsSignal.dynamicsInformation.yawAcceleration = yawAcceleration;
+    dynamicsSignal.dynamicsInformation.velocity = velocity;
+    dynamicsSignal.dynamicsInformation.acceleration = acceleration;
+    dynamicsSignal.dynamicsInformation.positionX = posX;
+    dynamicsSignal.dynamicsInformation.positionY = posY;
+    dynamicsSignal.dynamicsInformation.travelDistance = travelDist;
 
-    GetAgent()->SetPostCrashVelocity({false, 0.0, 0.0, 0.0});
+    GetAgent()->SetPostCrashVelocity({false, 0.0_mps, 0.0_rad, 0.0_rad_per_s});
 
     return true;
 }
diff --git a/sim/src/components/Dynamics_CollisionPostCrash/src/collisionPostCrash.h b/sim/src/components/Dynamics_CollisionPostCrash/src/collisionPostCrash.h
index 5de69953d2f2e3644d3038bb836335b39d8d1bad..7a121f2fdb7346df85b675d88ec787fbbcfcca8c 100644
--- a/sim/src/components/Dynamics_CollisionPostCrash/src/collisionPostCrash.h
+++ b/sim/src/components/Dynamics_CollisionPostCrash/src/collisionPostCrash.h
@@ -152,8 +152,8 @@ private:
 
     /** \name Internal states
      * @{ */
-    double velocity {};//!< host velocity
-    double movingDirection {};//!< host velocity direction
+    units::velocity::meters_per_second_t velocity{};//!< host velocity
+    units::angle::radian_t movingDirection {};//!< host velocity direction
     unsigned int numberOfCollisionPartners = 0;//!< number of collision partners of host agent
     bool isActive = false;//!< flag that shows if collision has occurred
 
diff --git a/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory_implementation.cpp b/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory_implementation.cpp
index c39afd7cbabf8754de85a693432b9c1aba9b017d..c26ffbe4bb58b3f3e3467b6180cb76dddcb58e17 100644
--- a/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory_implementation.cpp
+++ b/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory_implementation.cpp
@@ -40,7 +40,7 @@ Dynamics_CopyTrajectory_Implementation::Dynamics_CopyTrajectory_Implementation(
         agent)
 {
     LOGINFO(QString().sprintf("Constructing Dynamics_CopyTrajectory for agent %d...", agent->GetId()).toStdString());
-    timeStep = (double)cycleTime / 1000.0;
+    timeStep = units::time::millisecond_t(cycleTime);
     LOGINFO("Constructing Dynamics_CopyTrajectory successful");
 }
 
@@ -58,7 +58,11 @@ void Dynamics_CopyTrajectory_Implementation::UpdateInput(int localLinkId,
 
     try
     {
-        trajectory = trajectorySignal->trajectory;
+        if (!std::holds_alternative<mantle_api::PolyLine>(trajectorySignal->trajectory.type))
+        {
+            throw std::runtime_error("Component: " + GetComponentName() + "can only use PolyLines as trajectory.");
+        }
+        trajectory = std::get<mantle_api::PolyLine>(trajectorySignal->trajectory.type);
         ReadWayPointData();
         LOGDEBUG(QString().sprintf("%s UpdateInput successful", COMPONENTNAME.c_str()).toStdString());
     }
@@ -83,8 +87,11 @@ void Dynamics_CopyTrajectory_Implementation::Trigger(int time)
 
     //    LOGDEBUG("Triggering Dynamics_CopyTrajectory...");
 
-    double timeSec = (double)time / 1000.0;
-    double x, y, vx, vy, yaw, w;
+    units::time::second_t timeSec = units::time::millisecond_t(time);
+    units::length::meter_t x, y;
+    units::velocity::meters_per_second_t vx, vy;
+    units::angle::radian_t yaw;
+    units::angular_velocity::radians_per_second_t w;
 
     if (timeSec <= timeVec.front())
     {
@@ -112,10 +119,10 @@ void Dynamics_CopyTrajectory_Implementation::Trigger(int time)
             timeVecNext = timeVec[indexVecNext];
         }
         unsigned int indexVecPassed = indexVecNext-1;
-        double dT = (timeSec - timeVec[indexVecPassed]);
-        if (dT<1e-6 && dT>-1e-6)
+        auto dT = (timeSec - timeVec[indexVecPassed]);
+        if (dT < units::time::second_t(1e-6) && dT > units::time::second_t(-1e-6))
         {
-            dT = 0.0;
+            dT = 0.0_s;
         }
         x = posX[indexVecPassed] + velX[indexVecPassed] * dT;
         y = posY[indexVecPassed] + velY[indexVecPassed] * dT;
@@ -136,7 +143,7 @@ void Dynamics_CopyTrajectory_Implementation::Trigger(int time)
 
     GetAgent()->SetPositionX(x);
     GetAgent()->SetPositionY(y);
-    GetAgent()->SetVelocityVector(vx, vy, 0.0);
+    GetAgent()->SetVelocityVector({vx, vy, 0.0_mps});
     GetAgent()->SetYaw(yaw);
     GetAgent()->SetYawRate(w);
 
@@ -145,34 +152,39 @@ void Dynamics_CopyTrajectory_Implementation::Trigger(int time)
 
 void Dynamics_CopyTrajectory_Implementation::ReadWayPointData()
 {
-    unsigned int n = trajectory.points.size();
+    unsigned int n = trajectory.size();
 
-    double vX = 0.0;
-    double vY = 0.0;
-    double w = 0.0;
+    units::velocity::meters_per_second_t vX{0.0};
+    units::velocity::meters_per_second_t vY{0.0};
+    units::angular_velocity::radians_per_second_t w{0.0};
 
-    timeVec.resize(trajectory.points.size());
-    posX.resize(trajectory.points.size());
-    posY.resize(trajectory.points.size());
-    velX.resize(trajectory.points.size());
-    velY.resize(trajectory.points.size());
-    angleYaw.resize(trajectory.points.size());
-    rateYaw.resize(trajectory.points.size());
+    timeVec.resize(trajectory.size());
+    posX.resize(trajectory.size());
+    posY.resize(trajectory.size());
+    velX.resize(trajectory.size());
+    velY.resize(trajectory.size());
+    angleYaw.resize(trajectory.size());
+    rateYaw.resize(trajectory.size());
 
     for (unsigned int i = 0; i < n; ++i)
     {
-        openScenario::TrajectoryPoint point = trajectory.points.at(i);
+        auto point = trajectory.at(i);
+
+        if (!point.time.has_value())
+        {
+            throw std::runtime_error("Timestamp is requried for PolyLinePoints in component: " + GetComponentName() + ".");
+        }
 
-        timeVec[i] = point.time;
-        posX[i] = point.x;
-        posY[i] = point.y;
-        angleYaw[i] = point.yaw;
+        timeVec[i] = point.time.value();
+        posX[i] = point.pose.position.x;
+        posY[i] = point.pose.position.y;
+        angleYaw[i] = point.pose.orientation.yaw;
         if (i<n-1)
         {
-            openScenario::TrajectoryPoint pointNext = trajectory.points.at(i+1);
-            vX = (pointNext.x-point.x) / timeStep; // uniform motion approximation
-            vY = (pointNext.y-point.y) / timeStep; // uniform motion approximation
-            w = (pointNext.yaw-point.yaw) / timeStep; // uniform motion approximation
+            auto pointNext = trajectory.at(i + 1);
+            vX = (pointNext.pose.position.x - point.pose.position.x) / timeStep;          // uniform motion approximation
+            vY = (pointNext.pose.position.y - point.pose.position.y) / timeStep;          // uniform motion approximation
+            w = (pointNext.pose.orientation.yaw - point.pose.orientation.yaw) / timeStep; // uniform motion approximation
         }
         velX[i] = vX;
         velY[i] = vY;
diff --git a/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory_implementation.h b/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory_implementation.h
index b9ae3341070d14b09683e3352da524834ed29431..c8ef0b8dd23393cf4f34f4452cddc85b4fb99538 100644
--- a/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory_implementation.h
+++ b/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory_implementation.h
@@ -116,7 +116,7 @@ private:
      *      @{
      */
 //    InputPort<TrajectorySignal, openScenario::Trajectory> trajectory{0, &inputPorts}; //!< given trajectory to follow
-    openScenario::Trajectory trajectory; //!< given trajectory to follow
+    mantle_api::PolyLine trajectory; //!< given trajectory to follow
     /**
      *      @}
      *  @}
@@ -129,20 +129,19 @@ private:
      *    @{
     */
     //local computation objects
-    double timeStep;            //!< Time step as double in s
-    double timeVecNext;
+    units::time::second_t timeStep; //!< Time step as double in s
+    units::time::second_t timeVecNext;
     unsigned int indexVecNext;
-    std::vector<double> timeVec;   //!< time vector of trajectory
-    std::vector<double> posX;   //!< x coordinate vector of trajectory
-    std::vector<double> posY;   //!< y coordinate vector of trajectory
-    std::vector<double> velX;    //!< velocity vector of trajectory
-    std::vector<double> velY;    //!< velocity vector of trajectory
-    std::vector<double> angleYaw;    //!< yaw angle vector of trajectory
-    std::vector<double> rateYaw;    //!< yaw angle vector of trajectory
+    std::vector<units::time::second_t> timeVec;                         //!< time vector of trajectory
+    std::vector<units::length::meter_t> posX;                           //!< x coordinate vector of trajectory
+    std::vector<units::length::meter_t> posY;                           //!< y coordinate vector of trajectory
+    std::vector<units::velocity::meters_per_second_t> velX;             //!< velocity vector of trajectory
+    std::vector<units::velocity::meters_per_second_t> velY;             //!< velocity vector of trajectory
+    std::vector<units::angle::radian_t> angleYaw;                       //!< yaw angle vector of trajectory
+    std::vector<units::angular_velocity::radians_per_second_t> rateYaw; //!< yaw angle vector of trajectory
     /**
      *    @}
     */
-
 };
 
 #endif // DYNAMICS_COPYTRAJECTORY_IMPLEMENTATION_H
diff --git a/sim/src/components/Dynamics_Longitudinal_Basic/dynamics_longitudinal_basic_implementation.cpp b/sim/src/components/Dynamics_Longitudinal_Basic/dynamics_longitudinal_basic_implementation.cpp
index c407e9f4e086319643aafc053bcbf7427217b64f..e53520cc4e76e9bc7575a8b216d7157db5affad4 100644
--- a/sim/src/components/Dynamics_Longitudinal_Basic/dynamics_longitudinal_basic_implementation.cpp
+++ b/sim/src/components/Dynamics_Longitudinal_Basic/dynamics_longitudinal_basic_implementation.cpp
@@ -53,7 +53,7 @@ void Dynamics_Longitudinal_Basic_Implementation::Trigger(int time)
 {
     Q_UNUSED(time);
 
-    double v = GetAgent()->GetVelocityX() + in_aVehicle*GetCycleTime()/1000.;
+    units::velocity::meters_per_second_t v = GetAgent()->GetVelocityX() + in_aVehicle * GetCycleTime() / 1000.;
 
     if (v >= _VLowerLimit)
     {
diff --git a/sim/src/components/Dynamics_RegularDriving/src/regularDriving.cpp b/sim/src/components/Dynamics_RegularDriving/src/regularDriving.cpp
index c64e987a1e33e4da2466f726afd359e993616d4f..3c131027761df495689f09096ecd87f6abc5fbb8 100644
--- a/sim/src/components/Dynamics_RegularDriving/src/regularDriving.cpp
+++ b/sim/src/components/Dynamics_RegularDriving/src/regularDriving.cpp
@@ -2,6 +2,7 @@
  * Copyright (c) 2018-2019 AMFD GmbH
  *               2020 HLRS, University of Stuttgart
  *               2018-2020 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -28,8 +29,8 @@
 #include "common/longitudinalSignal.h"
 #include "common/opMath.h"
 #include "common/parametersVehicleSignal.h"
-#include "common/steeringSignal.h"
 #include "common/rollSignal.h"
+#include "common/steeringSignal.h"
 #include "components/common/vehicleProperties.h"
 #include "include/worldInterface.h"
 
@@ -40,7 +41,7 @@ void DynamicsRegularDrivingImplementation::UpdateInput(int localLinkId, const st
     if (localLinkId == 0)
     {
         const std::shared_ptr<ComponentStateSignalInterface const> stateSignal = std::dynamic_pointer_cast<ComponentStateSignalInterface const>(data);
-        if(stateSignal->componentState == ComponentState::Acting)
+        if (stateSignal->componentState == ComponentState::Acting)
         {
             const std::shared_ptr<LongitudinalSignal const> signal = std::dynamic_pointer_cast<LongitudinalSignal const>(data);
             if (!signal)
@@ -59,7 +60,7 @@ void DynamicsRegularDrivingImplementation::UpdateInput(int localLinkId, const st
     else if (localLinkId == 1)
     {
         const std::shared_ptr<ComponentStateSignalInterface const> stateSignal = std::dynamic_pointer_cast<ComponentStateSignalInterface const>(data);
-        if(stateSignal->componentState == ComponentState::Acting)
+        if (stateSignal->componentState == ComponentState::Acting)
         {
             const std::shared_ptr<SteeringSignal const> signal = std::dynamic_pointer_cast<SteeringSignal const>(data);
             if (!signal)
@@ -74,7 +75,7 @@ void DynamicsRegularDrivingImplementation::UpdateInput(int localLinkId, const st
     else if (localLinkId == 2)
     {
         const std::shared_ptr<ComponentStateSignalInterface const> stateSignal = std::dynamic_pointer_cast<ComponentStateSignalInterface const>(data);
-        if(stateSignal->componentState == ComponentState::Acting)
+        if (stateSignal->componentState == ComponentState::Acting)
         {
             const std::shared_ptr<RollSignal const> signal = std::dynamic_pointer_cast<RollSignal const>(data);
             if (!signal)
@@ -83,7 +84,7 @@ void DynamicsRegularDrivingImplementation::UpdateInput(int localLinkId, const st
                 LOG(CbkLogLevel::Debug, msg);
                 throw std::runtime_error(msg);
             }
-            dynamicsSignal.roll = signal->rollAngle;
+            dynamicsSignal.dynamicsInformation.roll = signal->rollAngle;
         }
     }
     else if (localLinkId == 100)
@@ -111,12 +112,13 @@ void DynamicsRegularDrivingImplementation::UpdateOutput(int localLinkId, std::sh
 {
     Q_UNUSED(time);
 
-    if(localLinkId == 0)
+    if (localLinkId == 0)
     {
-        try {
+        try
+        {
             data = std::make_shared<DynamicsSignal const>(dynamicsSignal);
         }
-        catch(const std::bad_alloc&)
+        catch (const std::bad_alloc &)
         {
             const std::string msg = COMPONENTNAME + " could not instantiate signal";
             LOG(CbkLogLevel::Debug, msg);
@@ -142,34 +144,33 @@ void DynamicsRegularDrivingImplementation::ApplyPedalPositionLimits()
     in_brakePedalPos = std::min(std::max(in_brakePedalPos, 0.0), 1.0);
 }
 
-double DynamicsRegularDrivingImplementation::GetEngineSpeedByVelocity(double xVel, int gear)
+units::angular_velocity::revolutions_per_minute_t DynamicsRegularDrivingImplementation::GetEngineSpeedByVelocity(units::velocity::meters_per_second_t xVel, int gear)
 {
-    return (xVel * GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(gear)) * 60.) /
-            (vehicleModelParameters.rearAxle.wheelDiameter * M_PI);  // an dynamic wheel radius rDyn must actually be used here
+    return 1_rad * (xVel * GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio + std::to_string(gear))) /
+           (vehicleModelParameters.rear_axle.wheel_diameter * 0.5); // an dynamic wheel radius rDyn must actually be used here
 }
 
-double DynamicsRegularDrivingImplementation::GetEngineMomentMax(double engineSpeed)
+units::torque::newton_meter_t DynamicsRegularDrivingImplementation::GetEngineMomentMax(units::angular_velocity::revolutions_per_minute_t engineSpeed)
 {
-    const double maximumEngineTorque = GetVehicleProperty(vehicle::properties::MaximumEngineTorque);
-    const double maximumEngineSpeed = GetVehicleProperty(vehicle::properties::MaximumEngineSpeed);
-    const double minimumEngineSpeed = GetVehicleProperty(vehicle::properties::MinimumEngineSpeed);
+    const units::torque::newton_meter_t maximumEngineTorque{GetVehicleProperty(vehicle::properties::MaximumEngineTorque)};
+    const units::angular_velocity::revolutions_per_minute_t maximumEngineSpeed{GetVehicleProperty(vehicle::properties::MaximumEngineSpeed)};
+    const units::angular_velocity::revolutions_per_minute_t minimumEngineSpeed{GetVehicleProperty(vehicle::properties::MinimumEngineSpeed)};
 
-    double torqueMax = maximumEngineTorque; // initial value at max
-    double speed = engineSpeed;
+    auto torqueMax = maximumEngineTorque; // initial value at max
+    auto speed = engineSpeed;
 
-    bool isLowerSection = engineSpeed < minimumEngineSpeed + 1000.;
+    bool isLowerSection = engineSpeed < minimumEngineSpeed + 1000.0_rpm;
     bool isBeyondLowerSectionBorder = engineSpeed < minimumEngineSpeed;
-    bool isUpperSection = engineSpeed > maximumEngineSpeed - 1000.;
+    bool isUpperSection = engineSpeed > maximumEngineSpeed - 1000.0_rpm;
     bool isBeyondUpperSectionBorder = engineSpeed > maximumEngineSpeed;
 
-
     if (isLowerSection)
     {
         if (isBeyondLowerSectionBorder) // not within limits
         {
             speed = minimumEngineSpeed;
         }
-        torqueMax = (1000 - (speed - minimumEngineSpeed)) * -0.1 + maximumEngineTorque;
+        torqueMax = units::inverse_radian(0.5 / M_PI) * (1000_rpm - (speed - minimumEngineSpeed)) * units::unit_t<units::compound_unit<units::torque::newton_meter, units::time::minute>>(-0.1) + maximumEngineTorque;
     }
     else if (isUpperSection)
     {
@@ -178,27 +179,27 @@ double DynamicsRegularDrivingImplementation::GetEngineMomentMax(double engineSpe
             speed = maximumEngineSpeed;
         }
 
-        torqueMax = (speed - maximumEngineSpeed + 1000) * -0.04 + maximumEngineTorque;
+        torqueMax = units::inverse_radian(0.5 / M_PI) * (speed - maximumEngineSpeed + 1000_rpm) * units::unit_t<units::compound_unit<units::torque::newton_meter, units::time::minute>>(-0.04) + maximumEngineTorque;
     }
     return torqueMax;
 }
 
-double DynamicsRegularDrivingImplementation::GetAccelerationFromRollingResistance()
+units::acceleration::meters_per_second_squared_t DynamicsRegularDrivingImplementation::GetAccelerationFromRollingResistance()
 {
-    double rollingResistanceCoeff = .0125;  // Dummy value, get via vehicle Parameters (vehicleModelParameters.rollingDragCoefficient)
-    double accDueToRollingResistance = -rollingResistanceCoeff * _oneG;
+    double rollingResistanceCoeff = .0125; // Dummy value, get via vehicle Parameters (vehicleModelParameters.rollingDragCoefficient)
+    const units::acceleration::meters_per_second_squared_t accDueToRollingResistance = -rollingResistanceCoeff * _oneG;
     return accDueToRollingResistance;
 }
 
-double DynamicsRegularDrivingImplementation::GetAccelerationFromAirResistance(double velocity)
+units::acceleration::meters_per_second_squared_t DynamicsRegularDrivingImplementation::GetAccelerationFromAirResistance(units::velocity::meters_per_second_t velocity)
 {
-    double forceAirResistance = -.5 * _rho * GetVehicleProperty(vehicle::properties::AirDragCoefficient) *
-            GetVehicleProperty(vehicle::properties::FrontSurface) * velocity * velocity;
-    double accDueToAirResistance = forceAirResistance / GetVehicleProperty(vehicle::properties::Mass);
+    units::force::newton_t forceAirResistance = -.5 * _rho * GetVehicleProperty(vehicle::properties::AirDragCoefficient) *
+                                                units::area::square_meter_t(GetVehicleProperty(vehicle::properties::FrontSurface)) * velocity * velocity;
+    const units::acceleration::meters_per_second_squared_t accDueToAirResistance = forceAirResistance / GetAgent()->GetVehicleModelParameters()->mass;
     return accDueToAirResistance;
 }
 
-double DynamicsRegularDrivingImplementation::GetEngineMomentMin(double engineSpeed)
+units::torque::newton_meter_t DynamicsRegularDrivingImplementation::GetEngineMomentMin(units::angular_velocity::revolutions_per_minute_t engineSpeed)
 {
     return GetEngineMomentMax(engineSpeed) * -.1;
 }
@@ -208,78 +209,78 @@ double DynamicsRegularDrivingImplementation::GetFrictionCoefficient()
     return GetWorld()->GetFriction() * GetVehicleProperty(vehicle::properties::FrictionCoefficient);
 }
 
-double DynamicsRegularDrivingImplementation::GetVehicleProperty(const std::string& propertyName)
+double DynamicsRegularDrivingImplementation::GetVehicleProperty(const std::string &propertyName)
 {
     const auto property = helper::map::query(vehicleModelParameters.properties, propertyName);
     THROWIFFALSE(property.has_value(), "Vehicle property \"" + propertyName + "\" was not set in the VehicleCatalog");
-    return property.value();
+    return std::stod(property.value());
 }
 
-double DynamicsRegularDrivingImplementation::GetEngineMoment(double gasPedalPos, int gear)
+units::torque::newton_meter_t DynamicsRegularDrivingImplementation::GetEngineMoment(double gasPedalPos, int gear)
 {
-    double xVel = GetAgent()->GetVelocity().Length();
+    const auto xVel = GetAgent()->GetVelocity().Length();
 
-    double engineSpeedAtGear = GetEngineSpeedByVelocity(xVel, gear);
+    const auto engineSpeedAtGear = GetEngineSpeedByVelocity(xVel, gear);
 
     GetAgent()->SetEngineSpeed(engineSpeedAtGear);
 
-    double max = GetEngineMomentMax(engineSpeedAtGear);
-    double maxAccAtGear = GetAccFromEngineMoment(xVel, max, gear, GetCycleTime());
+    const auto max = GetEngineMomentMax(engineSpeedAtGear);
+    const auto maxAccAtGear = GetAccFromEngineMoment(xVel, max, gear, GetCycleTime());
 
-    GetAgent()->SetMaxAcceleration(maxAccAtGear*GetFrictionCoefficient());
+    GetAgent()->SetMaxAcceleration(maxAccAtGear * GetFrictionCoefficient());
 
-    double min = GetEngineMomentMin(engineSpeedAtGear);
+    const auto min = GetEngineMomentMin(engineSpeedAtGear);
 
-    return (std::fabs(min) + max) * gasPedalPos + min;
+    return (units::math::fabs(min) + max) * gasPedalPos + min;
 }
 
-double DynamicsRegularDrivingImplementation::GetAccFromEngineMoment(double xVel, double engineMoment, int chosenGear, int cycleTime)
+units::acceleration::meters_per_second_squared_t DynamicsRegularDrivingImplementation::GetAccFromEngineMoment(units::velocity::meters_per_second_t xVel, units::torque::newton_meter_t engineMoment, int chosenGear, int cycleTime)
 {
     Q_UNUSED(xVel);
     Q_UNUSED(cycleTime);
 
-    double wheelSetMoment = engineMoment * (GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(chosenGear)));
-    double wheelSetForce = wheelSetMoment / (0.5 * vehicleModelParameters.rearAxle.wheelDiameter);
+    units::torque::newton_meter_t wheelSetMoment = engineMoment * (GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio + std::to_string(chosenGear)));
+    units::force::newton_t wheelSetForce = wheelSetMoment / (0.5 * vehicleModelParameters.rear_axle.wheel_diameter);
 
-    double vehicleSetForce = wheelSetForce;
-    double acc = vehicleSetForce / GetVehicleProperty(vehicle::properties::Mass);
+    const auto vehicleSetForce = wheelSetForce;
+    const units::acceleration::meters_per_second_squared_t acc = vehicleSetForce / GetAgent()->GetVehicleModelParameters()->mass;
 
     return acc;
 }
 
-double DynamicsRegularDrivingImplementation::GetAccVehicle(double accPedalPos, double brakePedalPos, int gear, int time)
+units::acceleration::meters_per_second_squared_t DynamicsRegularDrivingImplementation::GetAccVehicle(double accPedalPos, double brakePedalPos, int gear)
 {
-    double resultAcc = 0;
+    units::acceleration::meters_per_second_squared_t resultAcc{0};
 
-    double xVel = GetAgent()->GetVelocity().Length();
+    const auto xVel = GetAgent()->GetVelocity().Length();
 
-    if (brakePedalPos > 0.)  // Brake
+    if (brakePedalPos > 0.) // Brake
     {
-        double accelerationDueToPedal {brakePedalPos * _oneG * -1.};
-        double engineSpeed {GetEngineSpeedByVelocity(xVel, gear)};
-        double engineDrag {GetEngineMomentMin(engineSpeed)};
-        double accelerationDueToDrag {GetAccFromEngineMoment(xVel, engineDrag, gear, GetCycleTime())};
-        if (accelerationDueToPedal > 0. || accelerationDueToDrag > 0.)
+        units::acceleration::meters_per_second_squared_t accelerationDueToPedal{brakePedalPos * _oneG * -1.};
+        units::angular_velocity::revolutions_per_minute_t engineSpeed{GetEngineSpeedByVelocity(xVel, gear)};
+        auto engineDrag{GetEngineMomentMin(engineSpeed)};
+        auto accelerationDueToDrag = GetAccFromEngineMoment(xVel, engineDrag, gear, GetCycleTime());
+        if (accelerationDueToPedal > 0.0_mps_sq || accelerationDueToDrag > 0.0_mps_sq)
         {
             throw std::runtime_error("DynamicsRegularDrivingImplementation - Wrong sign for acceleration!");
         }
 
         resultAcc = accelerationDueToPedal + accelerationDueToDrag;
 
-        double maxDecel = GetAgent()->GetMaxDeceleration();
-        resultAcc = std::fmax(maxDecel, resultAcc);
+        const auto maxDecel = GetAgent()->GetMaxDeceleration();
+        resultAcc = units::math::fmax(maxDecel, resultAcc);
     }
-    else  // Gas
+    else // Gas
     {
-        double engineMoment = GetEngineMoment(accPedalPos, gear);
-        GetPublisher()->Publish("EngineMoment", engineMoment);
+        const auto engineMoment = GetEngineMoment(accPedalPos, gear);
+        GetPublisher()->Publish("EngineMoment", engineMoment.value());
         resultAcc = GetAccFromEngineMoment(xVel, engineMoment, gear, GetCycleTime());
     }
 
-    const double accelerationDueToAirResistance = GetAccelerationFromAirResistance(xVel);
-    const double accelerationDueToRollingResistance = GetAccelerationFromRollingResistance();
+    const auto accelerationDueToAirResistance = GetAccelerationFromAirResistance(xVel);
+    const auto accelerationDueToRollingResistance = GetAccelerationFromRollingResistance();
 
-    return resultAcc+accelerationDueToAirResistance + accelerationDueToRollingResistance;
+    return resultAcc + accelerationDueToAirResistance + accelerationDueToRollingResistance;
 }
 
 void DynamicsRegularDrivingImplementation::Trigger(int time)
@@ -289,53 +290,53 @@ void DynamicsRegularDrivingImplementation::Trigger(int time)
     const auto agent = GetAgent();
 
     //Lateral behavior
-    double maxDecel = _oneG * GetFrictionCoefficient() * -1;
+    const units::acceleration::meters_per_second_squared_t maxDecel = _oneG * GetFrictionCoefficient() * -1;
     agent->SetMaxDeceleration(maxDecel);
 
-    double v;
-    double yawAngle = agent->GetYaw();
+    units::velocity::meters_per_second_t v;
+    const auto yawAngle = agent->GetYaw();
 
-    double accVehicle = GetAccVehicle(in_accPedalPos, in_brakePedalPos, in_gear, time);
+    auto accVehicle = GetAccVehicle(in_accPedalPos, in_brakePedalPos, in_gear);
 
-    v = agent->GetVelocity().Length() + accVehicle*GetCycleTime()/1000.;
+    v = agent->GetVelocity().Length() + accVehicle * units::time::millisecond_t(GetCycleTime());
 
-    if(v < VLowerLimit)
+    if (v < VLowerLimit)
     {
-        accVehicle = 0.0;
+        accVehicle = 0.0_mps_sq;
         v = VLowerLimit;
     }
 
     // change of path coordinate since last time step [m]
-    double ds = v * GetCycleTime() * 0.001;
+    const units::length::meter_t ds = v * units::time::millisecond_t(GetCycleTime());
     // change of inertial x-position due to ds and yaw [m]
-    double dx = ds * std::cos(yawAngle);
+    const units::length::meter_t dx = ds * units::math::cos(yawAngle);
     // change of inertial y-position due to ds and yaw [m]
-    double dy = ds * std::sin(yawAngle);
+    const units::length::meter_t dy = ds * units::math::sin(yawAngle);
     // new inertial x-position [m]
-    double x = agent->GetPositionX() + dx;
+    auto x = agent->GetPositionX() + dx;
     // new inertial y-position [m]
-    double y = agent->GetPositionY() + dy;
+    auto y = agent->GetPositionY() + dy;
 
-    dynamicsSignal.acceleration = accVehicle;
-    dynamicsSignal.velocity = v;
-    dynamicsSignal.positionX = x;
-    dynamicsSignal.positionY = y;
-    dynamicsSignal.travelDistance = ds;
+    dynamicsSignal.dynamicsInformation.acceleration = accVehicle;
+    dynamicsSignal.dynamicsInformation.velocity = v;
+    dynamicsSignal.dynamicsInformation.positionX = x;
+    dynamicsSignal.dynamicsInformation.positionY = y;
+    dynamicsSignal.dynamicsInformation.travelDistance = ds;
 
     // convert steering wheel angle to steering angle of front wheels [radian]
-    const auto steering_angle = std::clamp(in_steeringWheelAngle / GetVehicleProperty(vehicle::properties::SteeringRatio), -vehicleModelParameters.frontAxle.maxSteering, vehicleModelParameters.frontAxle.maxSteering);
-    dynamicsSignal.steeringWheelAngle = steering_angle * GetVehicleProperty(vehicle::properties::SteeringRatio) ;
-    GetPublisher()->Publish("SteeringAngle", steering_angle);
-    const double wheelbase = vehicleModelParameters.frontAxle.positionX - vehicleModelParameters.rearAxle.positionX;
+    const auto steering_angle = std::clamp(in_steeringWheelAngle / GetVehicleProperty(vehicle::properties::SteeringRatio), -vehicleModelParameters.front_axle.max_steering, vehicleModelParameters.front_axle.max_steering);
+    dynamicsSignal.dynamicsInformation.steeringWheelAngle = steering_angle * GetVehicleProperty(vehicle::properties::SteeringRatio);
+    GetPublisher()->Publish("SteeringAngle", steering_angle.value());
+    const auto wheelbase = vehicleModelParameters.front_axle.bb_center_to_axle_center.x - vehicleModelParameters.rear_axle.bb_center_to_axle_center.x;
     // calculate curvature (Ackermann model; reference point of yawing = rear axle!) [radian]
-    double steeringCurvature = std::tan(steering_angle) / wheelbase;
+    units::curvature::inverse_meter_t steeringCurvature = units::math::tan(steering_angle) / wheelbase;
     // change of yaw angle due to ds and curvature [radian]
-    double dpsi = std::atan(steeringCurvature*ds);
-    dynamicsSignal.yawRate = dpsi / (GetCycleTime() * 0.001);
-    dynamicsSignal.yawAcceleration = (dynamicsSignal.yawRate - yawRatePrevious) / (GetCycleTime() * 0.001);
-    yawRatePrevious = dynamicsSignal.yawRate;
-    dynamicsSignal.centripetalAcceleration = dynamicsSignal.yawRate * v;
+    units::angle::radian_t dpsi{units::math::atan(steeringCurvature * ds)};
+    dynamicsSignal.dynamicsInformation.yawRate = dpsi / units::time::millisecond_t(GetCycleTime());
+    dynamicsSignal.dynamicsInformation.yawAcceleration = (dynamicsSignal.dynamicsInformation.yawRate - yawRatePrevious) / units::time::second_t(GetCycleTime() * 0.001);
+    yawRatePrevious = dynamicsSignal.dynamicsInformation.yawRate;
+    dynamicsSignal.dynamicsInformation.centripetalAcceleration = units::inverse_radian(1) * dynamicsSignal.dynamicsInformation.yawRate * v;
     // new yaw angle in current time step [radian]
-    double psi = agent->GetYaw() + dpsi;
-    dynamicsSignal.yaw = psi;
+    const auto psi = agent->GetYaw() + dpsi;
+    dynamicsSignal.dynamicsInformation.yaw = psi;
 }
diff --git a/sim/src/components/Dynamics_RegularDriving/src/regularDriving.h b/sim/src/components/Dynamics_RegularDriving/src/regularDriving.h
index e377629bf2025b33c17866a9fd7d9a42965da452..9fb3690dcbf18d5ed16a01e2336a0d7cc3d46559 100644
--- a/sim/src/components/Dynamics_RegularDriving/src/regularDriving.h
+++ b/sim/src/components/Dynamics_RegularDriving/src/regularDriving.h
@@ -56,7 +56,7 @@
 * Init input variables:
 * name          | meaning
 * --------------|------
-* vehicleModelParameters | VehicleModelParameters
+* vehicleModelParameters | mantle_api::VehicleProperties
 *
 *
 * * Init input channel IDs:
@@ -195,20 +195,19 @@ private:
     //! @param [in] accPedalPos         current Gas pedal position [%]
     //! @param [in] brakePedalPos       current Brake pedal position [%]
     //! @param [in] gear                current Gear
-    //! @param [in] carParameters       parameters of the car
     //! @return current acceleration
-    double GetAccVehicle(double accPedalPos, double brakePedalPos, int gear, int time);
+    units::acceleration::meters_per_second_squared_t GetAccVehicle(double accPedalPos, double brakePedalPos, int gear);
 
     //! Get the acceleration (negative) caused by the air resistance of the vehicle.
     //! @param [in] velocity        absolute vehicle speed [m/s]
     //! @return acceleration due to rolling resistance [m/s^2]
     //-----------------------------------------------------------------------------
-    double GetAccelerationFromAirResistance(double velocity);
+    units::acceleration::meters_per_second_squared_t GetAccelerationFromAirResistance(units::velocity::meters_per_second_t velocity);
 
     //! Get the acceleration (negative) caused by the rolling resistance of the wheels.
     //! @return acceleration due to rolling resistance [m/s^2]
     //-----------------------------------------------------------------------------
-    double GetAccelerationFromRollingResistance();
+    units::acceleration::meters_per_second_squared_t GetAccelerationFromRollingResistance();
 
     //! Get the moment of the engine from pedal position and gear.
     //! @param [in] gasPedalPos         current Gas pedal position. [%]
@@ -216,7 +215,7 @@ private:
     //! @param [in] carParameters       parameters of the car
     //! @return engine moment [Nm]
     //-----------------------------------------------------------------------------
-    double GetEngineMoment(double gasPedalPos, int lastGear);
+    units::torque::newton_meter_t GetEngineMoment(double gasPedalPos, int lastGear);
 
 
 
@@ -224,14 +223,14 @@ private:
     //! @param [in] engineSpeed         the speed of the engine
     //! @param [in] carParameters       parameters of the car
     //! @return drag moment [Nm]
-    double GetEngineMomentMin(double engineSpeed);
+    units::torque::newton_meter_t GetEngineMomentMin(units::angular_velocity::revolutions_per_minute_t engineSpeed);
 
 
     //! Get the maximum possible torque of the engine in the current state
     //! @param [in] engineSpeed         the speed of the engine
     //! @param [in] carParameters       parameters of the car
     //! @return maximum moment in the current state [Nm]
-    double GetEngineMomentMax(double engineSpeed);
+    units::torque::newton_meter_t GetEngineMomentMax(units::angular_velocity::revolutions_per_minute_t engineSpeed);
 
 
      //! Calculate the engine speed coresponding to the current speed and gear of the car
@@ -239,7 +238,7 @@ private:
      //! @param [in] gear               current gear
      //! @param [in] carParameters      parameters of the car
      //! @return engine speed [1/min]
-    double GetEngineSpeedByVelocity(double xVel, int gear);
+    units::angular_velocity::revolutions_per_minute_t GetEngineSpeedByVelocity(units::velocity::meters_per_second_t xVel, int gear);
 
 
     //! Calculate the resulting acceleration of the car with the delivered moment of the engine
@@ -249,14 +248,14 @@ private:
     //! @param [in] carParameters      parameters of the car
     //! @param [in] cycleTime          Cycle time of this components trigger task [ms] (unused)
     //! @return resulting acceleration [m/s²]
-    double GetAccFromEngineMoment(double xVel, double engineMoment, int chosenGear, int cycleTime);
+    units::acceleration::meters_per_second_squared_t GetAccFromEngineMoment(units::velocity::meters_per_second_t xVel, units::torque::newton_meter_t engineMoment, int chosenGear, int cycleTime);
 
 
     //! Returns the friction coefficient according to enviroment and car conditions
     //! @return friction coefficient (currently ALWAYS 1)
     double GetFrictionCoefficient();
 
-    //! Returns the property with given name in the VehicleModelParameters
+    //! Returns the property with given name in the mantle_api::VehicleProperties
     //! or throws an error if the property is missing
     double GetVehicleProperty(const std::string& propertyName);
 
@@ -268,7 +267,7 @@ private:
          */
 
     //! The minimal velocity of the agent [m/s].
-    const double VLowerLimit = 0;
+    const units::velocity::meters_per_second_t VLowerLimit{0};
 
     /**
      *  @} */ // End of Internal Parameters
@@ -288,7 +287,7 @@ private:
     int in_gear = 0;
 
     //! The steering wheel angle [rad].
-    double in_steeringWheelAngle = 0;
+    units::angle::radian_t in_steeringWheelAngle{0};
 
     // --- Outputs
 
@@ -298,20 +297,20 @@ private:
     // --- Init Inputs
 
     //! Containing the vehicle parameters e.g. double carMass; double rDyn and more.
-    VehicleModelParameters vehicleModelParameters;
+    mantle_api::VehicleProperties vehicleModelParameters;
 
     // Constants
 
     //! PI.
-    double _twoPi = 2 * M_PI;
+    units::angle::radian_t _twoPi = 2_rad * M_PI;
 
     //! value of earth gravity [m/s²].
-    double _oneG = 9.81;
+    units::acceleration::meters_per_second_squared_t _oneG{9.81};
 
     //! air density.
-    double _rho = 1.23;
+    units::density::kilograms_per_cubic_meter_t _rho{1.23};
 
-    double yawRatePrevious = 0.0;
+    units::angular_velocity::radians_per_second_t yawRatePrevious{0.0};
     /**
      *  @} */ // End of External Parameters
     /**
diff --git a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_regularTwoTrackImpl.cpp b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_regularTwoTrackImpl.cpp
index e87d9ca2701a2a67f739dec1f170e403b7b77b9e..cbbf3caea305dfa2f82714565fdcf3df5d01be4a 100644
--- a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_regularTwoTrackImpl.cpp
+++ b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_regularTwoTrackImpl.cpp
@@ -2,6 +2,7 @@
  * Copyright (c) 2018-2019 AMFD GmbH
  *               2019-2020 ITK Engineering GmbH
  *               2018-2019 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -94,7 +95,7 @@ void DynamicsRegularTwoTrackImplementation::UpdateInput(int localLinkId, const s
                 LOG(CbkLogLevel::Debug, msg);
                 throw std::runtime_error(msg);
             }
-            angleTireFront.SetDefaultValue(signal->steeringWheelAngle);
+            angleTireFront.SetDefaultValue(signal->steeringWheelAngle.value());
         }
     }
     else if (localLinkId == 100)
@@ -145,7 +146,8 @@ void DynamicsRegularTwoTrackImplementation::Trigger(int time)
 {
     Q_UNUSED(time);
 
-    if (timeStep <= std::numeric_limits<double>::epsilon()) {
+    if (timeStep <= units::time::second_t(std::numeric_limits<double>::epsilon()))
+    {
         Init();
     }
 
@@ -161,15 +163,9 @@ void DynamicsRegularTwoTrackImplementation::Trigger(int time)
     ReadPreviousState();
 
     #ifdef QT_DEBUG
-        logFile << (std::to_string(time) + ";"
-                    + std::to_string(GetAgent()->GetId()) + ";"
-                    + std::to_string(positionCar.x) + ";"
-                    + std::to_string(positionCar.y) + ";"
-                    + std::to_string(velocityCar.x) + ";"
-                    + std::to_string(velocityCar.y) + ";"
-                    + std::to_string(GetAgent()->GetYaw()) + ";")
-                   << std::endl;
-    #endif
+    logFile << (std::to_string(time) + ";" + std::to_string(GetAgent()->GetId()) + ";" + units::length::to_string(positionCar.x) + ";" + units::length::to_string(positionCar.y) + ";" + units::velocity::to_string(velocityCar.x) + ";" + units::velocity::to_string(velocityCar.y) + ";" + units::angle::to_string(GetAgent()->GetYaw()) + ";")
+            << std::endl;
+#endif
 
     vehicle->SetVelocity(velocityCar, yawVelocity);
 
@@ -190,7 +186,7 @@ void DynamicsRegularTwoTrackImplementation::Trigger(int time)
      *  - calculate lateral tire slips and forces
      *  - calculate friction forces
     */
-    vehicle->ForceLocal(timeStep, angleTireFront.GetValue(), forceWheelVertical);
+    vehicle->ForceLocal(timeStep, units::angle::radian_t(angleTireFront.GetValue()), forceWheelVertical);
 
     /** @addtogroup sim_step_10_tt
      * Combine local tire forces to a global force at the vehicle's body:
@@ -230,16 +226,14 @@ void DynamicsRegularTwoTrackImplementation::Trigger(int time)
     NextStateSet();
 }
 
-double DynamicsRegularTwoTrackImplementation::GetWheelbase() const
+units::length::meter_t DynamicsRegularTwoTrackImplementation::GetWheelbase() const
 {
-    return GetAgent()->GetVehicleModelParameters().frontAxle.positionX - GetAgent()->GetVehicleModelParameters().rearAxle.positionX;
+    return vehicleProperties->front_axle.bb_center_to_axle_center.x - vehicleProperties->rear_axle.bb_center_to_axle_center.x;
 }
 
-double DynamicsRegularTwoTrackImplementation::GetWeight() const
+units::mass::kilogram_t DynamicsRegularTwoTrackImplementation::GetWeight() const
 {
-    const auto weight = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, vehicle::properties::Mass);
-    THROWIFFALSE(weight.has_value(), "Mass was not defined in VehicleCatalog");
-    return weight.value();
+    return GetAgent()->GetVehicleModelParameters()->mass;
 }
 
 void DynamicsRegularTwoTrackImplementation::Init()
@@ -253,7 +247,7 @@ void DynamicsRegularTwoTrackImplementation::Init()
 
     torqueBrakeMin.SetValue(-std::fabs(parameterMapDoubleExternal.find("torqueBrakeMin")->second));
 
-    timeStep = (double)GetCycleTime() / 1000.0;
+    timeStep = units::time::millisecond_t(GetCycleTime());
 
     vehicle = std::make_unique<VehicleSimpleTT>();
 
@@ -263,7 +257,7 @@ void DynamicsRegularTwoTrackImplementation::Init()
      *  - power
      *  - maximum brake torque
     */
-    vehicle->InitSetEngine(GetWeight(), powerEngineMax.GetValue(), torqueBrakeMin.GetValue());
+    vehicle->InitSetEngine(GetWeight(), units::power::watt_t(powerEngineMax.GetValue()), units::torque::newton_meter_t(torqueBrakeMin.GetValue()));
 
     /** @addtogroup init_tt
      * Define vehicle's geometry:
@@ -272,8 +266,8 @@ void DynamicsRegularTwoTrackImplementation::Init()
      *  - set the wheelbase
      *  - set the track width
     */
-    vehicle->InitSetGeometry(GetWheelbase(), 0.0,
-                             GetAgent()->GetVehicleModelParameters().rearAxle.trackWidth, 0.0);
+    vehicle->InitSetGeometry(GetWheelbase(), 0.0_m,
+                             vehicleProperties->rear_axle.track_width, 0.0_m);
 
     /** @addtogroup init_tt
      * Define vehicle's tire properties:
@@ -285,12 +279,12 @@ void DynamicsRegularTwoTrackImplementation::Init()
      *  - set the road/tire friction coefficient
     */
 
-    const auto frictionCoeff = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, vehicle::properties::FrictionCoefficient);
+    const auto frictionCoeff = helper::map::query(GetAgent()->GetVehicleModelParameters()->properties, vehicle::properties::FrictionCoefficient);
     THROWIFFALSE(frictionCoeff.has_value(), "FrictionCoefficient was not defined in VehicleCatalog");
 
     vehicle->InitSetTire(GetAgent()->GetVelocity().Projection(GetAgent()->GetYaw()),
                          muTireMax.GetValue(), muTireSlide.GetValue(),
-                         slipTireMax.GetValue(), radiusTire.GetValue(), frictionCoeff.value());
+                         slipTireMax.GetValue(), units::length::meter_t(radiusTire.GetValue()), std::stod(frictionCoeff.value()));
 
     forceWheelVertical = {
         vehicle->forceTireVerticalStatic[0],
@@ -307,21 +301,20 @@ void DynamicsRegularTwoTrackImplementation::Init()
 void DynamicsRegularTwoTrackImplementation::ReadPreviousState()
 {
     // actual state
-    double midRearAxleX = GetAgent()->GetPositionX(); // reference point (rear axle) in global CS
-    double midRearAxleY = GetAgent()->GetPositionY(); // reference point (rear axle) in global CS
+    const auto midRearAxleX = GetAgent()->GetPositionX(); // reference point (rear axle) in global CS
+    const auto midRearAxleY = GetAgent()->GetPositionY(); // reference point (rear axle) in global CS
 
     yawAngle = GetAgent()->GetYaw(); // global CS
-    const double wheelbase = GetWheelbase();
-    positionCar.x = midRearAxleX + std::cos(yawAngle) * wheelbase / 2.0; // geometrical center of vehicle in global CS
-    positionCar.y = midRearAxleY + std::sin(yawAngle) * wheelbase / 2.0; // geometrical center of vehicle in global CS
+    const auto wheelbase = GetWheelbase();
+    positionCar.x = midRearAxleX + units::math::cos(yawAngle) * wheelbase / 2.0; // geometrical center of vehicle in global CS
+    positionCar.y = midRearAxleY + units::math::sin(yawAngle) * wheelbase / 2.0; // geometrical center of vehicle in global CS
 
     velocityCar.x = GetAgent()->GetVelocity().Projection(GetAgent()->GetYaw()); // car's CS
-    velocityCar.y = GetAgent()->GetVelocity().Projection(GetAgent()->GetYaw() + M_PI_2); // car's CS
+    velocityCar.y = GetAgent()->GetVelocity().Projection(GetAgent()->GetYaw() + 90_deg); // car's CS
     yawVelocity = GetAgent()->GetYawRate();
 
     yawAcceleration = GetAgent()->GetYawAcceleration();
     accelerationCar.x = GetAgent()->GetAcceleration().Projection(GetAgent()->GetYaw()); // car's CS
-
 }
 
 void DynamicsRegularTwoTrackImplementation::NextStateTranslation()
@@ -329,32 +322,36 @@ void DynamicsRegularTwoTrackImplementation::NextStateTranslation()
 
     // update position (constant velocity step)
     velocityCar.Rotate(yawAngle); // global CS
-    positionCar =  positionCar + velocityCar*timeStep;
+    positionCar.x = positionCar.x + velocityCar.x * timeStep;
+    positionCar.y = positionCar.y + velocityCar.y * timeStep;
     velocityCar.Rotate(- yawAngle); // vehicle CS
 
     // update velocity
-    Common::Vector2d velocityCarNew = velocityCar + accelerationCar*timeStep;
+    Common::Vector2d<units::velocity::meters_per_second_t> velocityCarNew = {velocityCar.x + accelerationCar.x * timeStep,
+                                                                             velocityCar.y + accelerationCar.y * timeStep};
 
     // update acceleration
-    const double weight = GetWeight();
-    if (weight >= 1.0) {
-        accelerationCar = vehicle->forceTotalXY * (1 / weight);
+    const units::mass::kilogram_t weight = GetWeight();
+    if (weight >= 1.0_kg)
+    {
+        accelerationCar.x = vehicle->forceTotalXY.x * (1 / weight);
+        accelerationCar.y = vehicle->forceTotalXY.y * (1 / weight);
     }
 
     // correct velocity and acceleration for zero-crossing
-    if (velocityCarNew.x*velocityCar.x<0.0)
+    if (units::unit_cast<double>(velocityCarNew.x * velocityCar.x) < 0.0)
     {
-        velocityCar.x = 0.0;
-        accelerationCar.x = 0.0;
+        velocityCar.x = 0.0_mps;
+        accelerationCar.x = 0.0_mps_sq;
     }
     else
     {
         velocityCar.x = velocityCarNew.x;
     }
-    if (velocityCarNew.y*velocityCar.y<0.0)
+    if (units::unit_cast<double>(velocityCarNew.y * velocityCar.y) < 0.0)
     {
-        velocityCar.y = 0.0;
-        accelerationCar.y = 0.0;
+        velocityCar.y = 0.0_mps;
+        accelerationCar.y = 0.0_mps_sq;
     }
     else
     {
@@ -374,21 +371,21 @@ void DynamicsRegularTwoTrackImplementation::NextStateRotation()
     yawAngle = yawAngle + timeStep * yawVelocity;
 
     // update yaw velocity
-    double yawVelocityNew = yawVelocity + yawAcceleration * timeStep;
+    units::angular_velocity::radians_per_second_t yawVelocityNew = yawVelocity + yawAcceleration * timeStep;
 
     // update acceleration
-    double momentInertiaYaw = CommonHelper::CalculateMomentInertiaYaw(GetWeight(),
+    double momentInertiaYaw = CommonHelper::CalculateMomentInertiaYaw(units::mass::kilogram_t(GetWeight()),
                                                                       GetAgent()->GetLength(),
-                                                                      GetAgent()->GetWidth());
+                                                                      GetAgent()->GetWidth()).value();
     if (momentInertiaYaw >= 1.0) {
-        yawAcceleration = vehicle->momentTotalZ / momentInertiaYaw;
+        yawAcceleration = units::angular_acceleration::radians_per_second_squared_t(vehicle->momentTotalZ / momentInertiaYaw);
     }
 
     // correct velocity and acceleration for zero-crossing
-    if (yawVelocityNew*yawVelocity<0.0)
+    if (units::unit_cast<double>(yawVelocityNew * yawVelocity) < 0.0)
     {
-        yawVelocity = 0.0;
-        yawAcceleration = 0.0;
+        yawVelocity = 0.0_rad_per_s;
+        yawAcceleration = 0.0_rad_per_s_sq;
     }
     else
     {
@@ -402,18 +399,18 @@ void DynamicsRegularTwoTrackImplementation::NextStateRotation()
 
 void DynamicsRegularTwoTrackImplementation::NextStateSet()
 {
-    const double wheelbase = GetWheelbase();
-    double midRearAxleX = positionCar.x - std::cos(yawAngle) * wheelbase / 2.0; // reference point (rear axle) in global CS
-    double midRearAxleY = positionCar.y - std::sin(yawAngle) * wheelbase / 2.0; // reference point (rear axle) in global CS
+    const auto wheelbase = GetWheelbase();
+    const auto midRearAxleX = positionCar.x - units::math::cos(yawAngle) * wheelbase / 2.0; // reference point (rear axle) in global CS
+    const auto midRearAxleY = positionCar.y - units::math::sin(yawAngle) * wheelbase / 2.0; // reference point (rear axle) in global CS
 
     // update position (constant acceleration step)
-    dynamicsSignal.acceleration = accelerationCar.x;
-    dynamicsSignal.velocity = velocityCar.x;
-    dynamicsSignal.positionX = midRearAxleX;
-    dynamicsSignal.positionY = midRearAxleY;
-    dynamicsSignal.travelDistance = velocityCar.x * GetCycleTime() * 0.001;
-    dynamicsSignal.steeringWheelAngle = angleTireFront.GetValue();
-    dynamicsSignal.yawRate = yawVelocity;
-    dynamicsSignal.yawAcceleration = yawAcceleration;
-    dynamicsSignal.yaw = yawAngle;
+    dynamicsSignal.dynamicsInformation.acceleration = accelerationCar.x;
+    dynamicsSignal.dynamicsInformation.velocity = velocityCar.x;
+    dynamicsSignal.dynamicsInformation.positionX = midRearAxleX;
+    dynamicsSignal.dynamicsInformation.positionY = midRearAxleY;
+    dynamicsSignal.dynamicsInformation.travelDistance = velocityCar.x * units::time::millisecond_t(GetCycleTime());
+    dynamicsSignal.dynamicsInformation.steeringWheelAngle = units::angle::radian_t(angleTireFront.GetValue());
+    dynamicsSignal.dynamicsInformation.yawRate = yawVelocity;
+    dynamicsSignal.dynamicsInformation.yawAcceleration = yawAcceleration;
+    dynamicsSignal.dynamicsInformation.yaw = yawAngle;
 }
diff --git a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_regularTwoTrackImpl.h b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_regularTwoTrackImpl.h
index f567c82e873164ed34ee207be24b3766925c56f9..e4dadd7155d4b628b8453218db451e3d6b076be7 100644
--- a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_regularTwoTrackImpl.h
+++ b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_regularTwoTrackImpl.h
@@ -12,14 +12,15 @@
 #pragma once
 
 #include <memory>
-#include "include/modelInterface.h"
-#include "include/parameterInterface.h"
-#include "include/observationInterface.h"
-#include "common/primitiveSignals.h"
+
+#include "common/componentPorts.h"
 #include "common/dynamicsSignal.h"
 #include "common/globalDefinitions.h"
-#include "common/componentPorts.h"
+#include "common/primitiveSignals.h"
 #include "dynamics_twotrack_vehicle.h"
+#include "include/modelInterface.h"
+#include "include/observationInterface.h"
+#include "include/parameterInterface.h"
 
 #ifdef QT_DEBUG
 #include <fstream>
@@ -76,7 +77,6 @@
 class DynamicsRegularTwoTrackImplementation : public DynamicsInterface
 {
 public:
-
     //! Name of the current component
     const std::string COMPONENTNAME = "DynamicRegularTwoTrack";
 
@@ -90,7 +90,7 @@ public:
         StochasticsInterface *stochastics,
         WorldInterface *world,
         const ParameterInterface *parameters,
-        PublisherInterface * const publisher,
+        PublisherInterface *const publisher,
         const CallbackInterface *callbacks,
         AgentInterface *agent) :
         DynamicsInterface(
@@ -106,13 +106,21 @@ public:
             publisher,
             callbacks,
             agent),
-        dynamicsSignal {ComponentState::Acting}
+        dynamicsSignal{ComponentState::Acting}
     {
+        if (agent->GetVehicleModelParameters()->type == mantle_api::EntityType::kVehicle)
+        {
+            vehicleProperties = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(agent->GetVehicleModelParameters());
+        }
+        else
+        {
+            throw std::runtime_error("Component " + componentName + " expects an entity of type Vehicle and VehicleProperties.");
+        }
     }
-    DynamicsRegularTwoTrackImplementation(const DynamicsRegularTwoTrackImplementation&) = delete;
-    DynamicsRegularTwoTrackImplementation(DynamicsRegularTwoTrackImplementation&&) = delete;
-    DynamicsRegularTwoTrackImplementation& operator=(const DynamicsRegularTwoTrackImplementation&) = delete;
-    DynamicsRegularTwoTrackImplementation& operator=(DynamicsRegularTwoTrackImplementation&&) = delete;
+    DynamicsRegularTwoTrackImplementation(const DynamicsRegularTwoTrackImplementation &) = delete;
+    DynamicsRegularTwoTrackImplementation(DynamicsRegularTwoTrackImplementation &&) = delete;
+    DynamicsRegularTwoTrackImplementation &operator=(const DynamicsRegularTwoTrackImplementation &) = delete;
+    DynamicsRegularTwoTrackImplementation &operator=(DynamicsRegularTwoTrackImplementation &&) = delete;
     virtual ~DynamicsRegularTwoTrackImplementation();
 
     /*!
@@ -154,31 +162,30 @@ public:
     virtual void Trigger(int time);
 
 private:
-
     //! Output Signal
     DynamicsSignal dynamicsSignal;
 
+    std::shared_ptr<const mantle_api::VehicleProperties> vehicleProperties;
     std::map<std::string, externalParameter<double> *> parameterMapDouble;
     /** \name External Parameters
      *  Parameter which are set externally in configuration file.
      *  @{ */
-    externalParameter<double> radiusTire {0, &parameterMapDouble }; //!<
-    externalParameter<double> muTireMax {1, &parameterMapDouble }; //!<
-    externalParameter<double> muTireSlide {2, &parameterMapDouble }; //!<
-    externalParameter<double> slipTireMax {3, &parameterMapDouble }; //!<
-    externalParameter<double> powerEngineMax {4, &parameterMapDouble }; //!<
-    externalParameter<double> torqueBrakeMin {5, &parameterMapDouble }; //!<
+    externalParameter<double> radiusTire{0, &parameterMapDouble};     //!<
+    externalParameter<double> muTireMax{1, &parameterMapDouble};      //!<
+    externalParameter<double> muTireSlide{2, &parameterMapDouble};    //!<
+    externalParameter<double> slipTireMax{3, &parameterMapDouble};    //!<
+    externalParameter<double> powerEngineMax{4, &parameterMapDouble}; //!<
+    externalParameter<double> torqueBrakeMin{5, &parameterMapDouble}; //!<
     /**
      * @} */
 
-
     std::map<int, ComponentPort *> inputPorts; //!< map for all InputPort
     /** \name InputPorts
      *  All input ports with PortId
      *  @{ */
-    InputPort<DoubleSignal, double> throttlePedal {0, &inputPorts}; //!< throttle pedal position in the range [0...1]
-    InputPort<DoubleSignal, double> brakePedal {1, &inputPorts}; //!< brake pedal position in the range [0...1]
-    InputPort<DoubleSignal, double> angleTireFront {2, &inputPorts}; //!< steering angle [radian]
+    InputPort<DoubleSignal, double> throttlePedal{0, &inputPorts};  //!< throttle pedal position in the range [0...1]
+    InputPort<DoubleSignal, double> brakePedal{1, &inputPorts};     //!< brake pedal position in the range [0...1]
+    InputPort<DoubleSignal, double> angleTireFront{2, &inputPorts}; //!< steering angle [radian]
     /**
      * @} */
 
@@ -186,23 +193,23 @@ private:
      * @{ */
 
     //! Time step as double in s
-    double timeStep = 0.0;
+    units::time::second_t timeStep{0.0};
     //! Yaw angle
-    double yawAngle = 0.0;
+    units::angle::radian_t yawAngle{0.0};
     //! Car's position
-    Common::Vector2d positionCar = {0.0, 0.0};
+    Common::Vector2d<units::length::meter_t> positionCar = {0.0_m, 0.0_m};
     //! Yaw rate
-    double yawVelocity = 0.0;
+    units::angular_velocity::radians_per_second_t yawVelocity{0.0};
     //! Car's velocity
-    Common::Vector2d velocityCar = {0.0, 0.0};
+    Common::Vector2d<units::velocity::meters_per_second_t> velocityCar = {0.0_mps, 0.0_mps};
     //! Yaw acceleration
-    double yawAcceleration = 0.0;
+    units::angular_acceleration::radians_per_second_squared_t yawAcceleration{0.0};
     //! Car's acceleration
-    Common::Vector2d accelerationCar = {0.0, 0.0};
+    Common::Vector2d<units::acceleration::meters_per_second_squared_t> accelerationCar = {0.0_mps_sq, 0.0_mps_sq};
     //! Brake position for each tire
     std::vector<double> brakeSuperpose = {0.0, 0.0, 0.0, 0.0};
     //! Vertical force on wheels
-    std::vector<double> forceWheelVertical = {0.0, 0.0, 0.0, 0.0};
+    std::vector<units::force::newton_t> forceWheelVertical = {0.0_N, 0.0_N, 0.0_N, 0.0_N};
     /**
      * @} */
 
@@ -214,10 +221,10 @@ private:
      * @} */
 
     //! Returns the wheelbase from the VehicleModelParameter
-    double GetWheelbase() const;
+    units::length::meter_t GetWheelbase() const;
 
     //! Returns the weight from the VehicleModelParameter
-    double GetWeight() const;
+    units::mass::kilogram_t GetWeight() const;
 
     //! Update data on agent's actual position, velocity and acceleration
     void ReadPreviousState();
diff --git a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_tire.cpp b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_tire.cpp
index 20edc8a45634eff1bb39277c80259859f05717bd..bd1204f0acd4fd52800b9342e47899b322f339c5 100644
--- a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_tire.cpp
+++ b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_tire.cpp
@@ -17,10 +17,10 @@ Tire::Tire(): radius(1.0), forceZ_static(-100.0), forcePeak_static(100.0), force
     Rescale(forceZ_static);
 }
 
-Tire::Tire(const double F_ref, const double mu_tire_max, const double mu_tire_slide, const double s_max,
-           const double r, const double mu_scale):
-    radius (r),
-    forceZ_static (F_ref)
+Tire::Tire(const units::force::newton_t F_ref, const double mu_tire_max, const double mu_tire_slide, const double s_max,
+           const units::length::meter_t r, const double mu_scale) :
+    radius(r),
+    forceZ_static(F_ref)
 {
     // implicite roll friction scaling
     forcePeak_static  = -F_ref*mu_tire_max*mu_scale;
@@ -30,15 +30,15 @@ Tire::Tire(const double F_ref, const double mu_tire_max, const double mu_tire_sl
     Rescale(forceZ_static);
 }
 
-double Tire::GetForce(const double slip)
+units::force::newton_t Tire::GetForce(const double slip)
 {
 
     double slipAbs = std::fabs(slip);
-    double force;
+    units::force::newton_t force;
     double slipAbsNorm = std::clamp(slipAbs, 0.0, 1.0) / slipPeak;
 
     if (qFuzzyIsNull(slip)) { // make it easy
-        return 0.0;
+        return 0.0_N;
     } else if (slipAbsNorm <= 1.0) { // adhesion
         force = forcePeak *
                 stiffnessRoll * slipAbsNorm /
@@ -59,44 +59,49 @@ double Tire::GetForce(const double slip)
 
 }
 
-double Tire::GetLongSlip(const double torque)
+double Tire::GetLongSlip(const units::torque::newton_meter_t torque)
 {
-    double force = torque / radius;
-    double forceAbs = std::fabs(force);
+    units::force::newton_t force = torque / radius;
+    units::force::newton_t forceAbs = units::math::fabs(force);
 
-    if (( qFuzzyIsNull(force) ))
+    if ((qFuzzyIsNull(force.value())))
     {
         return 0.0;
     } else if ( forceAbs <= forcePeak ) { // moderate force in adhesion (slip limited)
         double p_2 = 0.5 * ( stiffnessRoll * ( 1.0 - forcePeak / forceAbs ) - 2.0 );
         double slip = slipPeak * ( -p_2 - std::sqrt( p_2 * p_2 - 1.0 ) );
-        return force > 0.0 ? slip : -slip;
+        return force > 0.0_N ? slip : -slip;
     } else { // slide
         //return force > 0.0 ? 1.0 : -1.0;
-        return force > 0.0 ? slipSat : -slipSat;
+        return force > 0.0_N ? slipSat : -slipSat;
     }
 }
 
-double Tire::CalcSlipY(double slipX, double vx, double vy)
+double Tire::CalcSlipY(double slipX, units::velocity::meters_per_second_t vx, units::velocity::meters_per_second_t vy)
 {
-    if (qFuzzyIsNull(vy) || (qAbs(vx)<velocityLimit && qAbs(vy)<velocityLimit)) {
+    if (qFuzzyIsNull(vy.value()) || (units::math::abs(vx) < velocityLimit && units::math::abs(vy) < velocityLimit))
+    {
         return 0.0;
-    } else if (qFuzzyIsNull(vx)) {
-        return std::clamp(-vy, -1.0, 1.0); // non-ISO
-    } else {
-        return std::clamp((std::fabs(slipX) - 1) * vy / std::fabs(vx), -1.0, 1.0); // non-ISO
+    }
+    else if (qFuzzyIsNull(vx.value()))
+    {
+        return std::clamp(-vy.value(), -1.0, 1.0); // non-ISO
+    }
+    else
+    {
+        return std::clamp((std::fabs(slipX) - 1) * vy.value() / std::fabs(vx.value()), -1.0, 1.0); // non-ISO
     }
 }
 
-double Tire::GetRollFriction(const double velTireX)
+units::force::newton_t Tire::GetRollFriction(const units::velocity::meters_per_second_t velTireX)
 {
-    double forceFriction = forceZ * frictionRoll;
+    units::force::newton_t forceFriction = forceZ * frictionRoll;
 
-    if (velTireX < 0.0)
+    if (velTireX < 0.0_mps)
     {
         forceFriction *= -1.0;
     }
-    if (std::fabs(velTireX) < velocityLimit)
+    if (units::math::fabs(velTireX) < velocityLimit)
     {
         forceFriction *= (velTireX/velocityLimit);
     }
@@ -104,11 +109,11 @@ double Tire::GetRollFriction(const double velTireX)
     return forceFriction;
 }
 
-void Tire::Rescale(const double forceZ_update)
+void Tire::Rescale(const units::force::newton_t forceZ_update)
 {
 
     forceZ = forceZ_update;
-    double scaling = std::clamp(forceZ/forceZ_static, 0.1, 2.0);
+    double scaling = std::clamp(units::unit_cast<double>(forceZ / forceZ_static), 0.1, 2.0);
 
     forcePeak = forcePeak_static*scaling;
     forceSat = forceSat_static*scaling;
diff --git a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_tire.h b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_tire.h
index 54259b43c16e1cd2d70afc96dd64b305c7eb70e2..2d2c1469553f877d8f723724095b666851aed413 100644
--- a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_tire.h
+++ b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_tire.h
@@ -18,35 +18,34 @@ class Tire
 public:
 
     Tire();
-    Tire(const double F_ref, const double mu_tire_max, const double mu_tire_slide, const double s_max,
-         const double r, const double mu_scale);
+    Tire(const units::force::newton_t F_ref, const double mu_tire_max, const double mu_tire_slide, const double s_max,
+         const units::length::meter_t r, const double mu_scale);
 
     virtual ~Tire() = default;
 
-    double radius;
+    units::length::meter_t radius;
     const double inertia = 1.2;
 
-    double GetForce(const double);
-    double GetLongSlip(const double tq);
-    double CalcSlipY(double slipX, double vx, double vy);
-    double GetRollFriction(const double velTireX);
-    void Rescale(const double forceZ_update);
+    units::force::newton_t GetForce(const double);
+    double GetLongSlip(const units::torque::newton_meter_t torque);
+    double CalcSlipY(double slipX, units::velocity::meters_per_second_t vx, units::velocity::meters_per_second_t vy);
+    units::force::newton_t GetRollFriction(const units::velocity::meters_per_second_t velTireX);
+    void Rescale(const units::force::newton_t forceZ_update);
 
 private:
+    units::force::newton_t forceZ_static;
+    units::force::newton_t forceZ;
 
-    double forceZ_static;
-    double forceZ;
-
-    double forcePeak_static;
-    double forceSat_static;
+    units::force::newton_t forcePeak_static;
+    units::force::newton_t forceSat_static;
     double slipPeak;
     double slipSat;
-    double forcePeak;
-    double forceSat;
+    units::force::newton_t forcePeak;
+    units::force::newton_t forceSat;
 
     const double frictionRoll = 0.01;
     const double stiffnessRoll = 0.3;
-    const double velocityLimit = 0.27; // ca. 1 km/h
+    const units::velocity::meters_per_second_t velocityLimit{0.27}; // ca. 1 km/h
     const double s_slide = 0.4;
 
 };
diff --git a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_vehicle.cpp b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_vehicle.cpp
index 2aec0f7972590fa95be146c8ecd05eb16b6216de..269245ac9c6d2dca93bf2279d3a81e67f4f6e7d6 100644
--- a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_vehicle.cpp
+++ b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_vehicle.cpp
@@ -29,31 +29,30 @@ VehicleSimpleTT::~VehicleSimpleTT()
     }
 }
 
-void VehicleSimpleTT::InitSetEngine(double weight, double P_engine, double T_brakeLimit)
+void VehicleSimpleTT::InitSetEngine(units::mass::kilogram_t weight, units::power::watt_t P_engine, units::torque::newton_meter_t T_brakeLimit)
 {
-    powerEngineLimit = std::fabs(P_engine);
-    torqueBrakeLimit = std::fabs(T_brakeLimit);
+    powerEngineLimit = units::math::fabs(P_engine);
+    torqueBrakeLimit = units::math::fabs(T_brakeLimit);
     massTotal = weight;
 }
 
-void VehicleSimpleTT::InitSetGeometry(double x_wheelbase, double x_COG,
-                                      double y_track, double y_COG)
+void VehicleSimpleTT::InitSetGeometry(units::length::meter_t x_wheelbase, units::length::meter_t x_COG,
+                                      units::length::meter_t y_track, units::length::meter_t y_COG)
 {
+    yawVelocity = 0.0_rad_per_s;
 
-    yawVelocity = 0.0;
+    positionTire[0].x = x_wheelbase / 2.0 - x_COG;  // > 0
+    positionTire[1].x = positionTire[0].x;          // > 0
+    positionTire[2].x = -x_wheelbase / 2.0 - x_COG; // < 0
+    positionTire[3].x = positionTire[2].x;          // < 0
 
-    positionTire[0].x = x_wheelbase/2.0 - x_COG; // > 0
-    positionTire[1].x = positionTire[0].x; // > 0
-    positionTire[2].x = -x_wheelbase/2.0 - x_COG; // < 0
-    positionTire[3].x = positionTire[2].x; // < 0
+    positionTire[0].y = y_track / 2.0 - y_COG;  // > 0
+    positionTire[1].y = -y_track / 2.0 - y_COG; // < 0
+    positionTire[2].y = positionTire[0].y;      // > 0
+    positionTire[3].y = positionTire[1].y;      // < 0
 
-    positionTire[0].y = y_track/2.0 - y_COG; // > 0
-    positionTire[1].y = -y_track/2.0 - y_COG; // < 0
-    positionTire[2].y = positionTire[0].y; // > 0
-    positionTire[3].y = positionTire[1].y; // < 0
-
-    double massFront = -massTotal * positionTire[2].x / x_wheelbase;
-    double massRear = massTotal * positionTire[0].x / x_wheelbase;
+    units::mass::kilogram_t massFront = -massTotal * positionTire[2].x / x_wheelbase;
+    units::mass::kilogram_t massRear = massTotal * positionTire[0].x / x_wheelbase;
 
     forceTireVerticalStatic[0] = -accelVerticalEarth * massFront * positionTire[1].y / y_track;
     forceTireVerticalStatic[1] = accelVerticalEarth * massFront * positionTire[0].y / y_track;
@@ -61,23 +60,22 @@ void VehicleSimpleTT::InitSetGeometry(double x_wheelbase, double x_COG,
     forceTireVerticalStatic[3] = accelVerticalEarth * massRear * positionTire[2].y / y_track;
 
     // RWD
-    torqueTireXthrottle[0] = 0.0;
-    torqueTireXthrottle[1] = 0.0;
-
+    torqueTireXthrottle[0] = 0.0_Nm;
+    torqueTireXthrottle[1] = 0.0_Nm;
 }
 
-void VehicleSimpleTT::InitSetTire(double vel, double mu_tire_max, double mu_tire_slide, double s_max,
-                                  double r_tire, double frictionScaleRoll)
+void VehicleSimpleTT::InitSetTire(units::velocity::meters_per_second_t vel, double mu_tire_max, double mu_tire_slide, double s_max,
+                                  units::length::meter_t r_tire, double frictionScaleRoll)
 {
     for (int i = 0; i < NUMBER_OF_WHEELS; ++i)
     {
         tires[i] = new Tire(forceTireVerticalStatic[i], mu_tire_max, mu_tire_slide, s_max, r_tire, frictionScaleRoll);
-        rotationVelocityTireX[i] = vel / r_tire;
-        rotationVelocityGradTireX[i] = 0.0;
+        rotationVelocityTireX[i] = 1_rad * vel / r_tire;
+        rotationVelocityGradTireX[i] = 0.0_rad_per_s_sq;
     }
 }
 
-void VehicleSimpleTT::SetVelocity(Common::Vector2d velocityCars, const double w)
+void VehicleSimpleTT::SetVelocity(Common::Vector2d<units::velocity::meters_per_second_t> velocityCars, const units::angular_velocity::radians_per_second_t w)
 {
     velocityCar = velocityCars; // car CS
     yawVelocity = w;
@@ -86,23 +84,21 @@ void VehicleSimpleTT::SetVelocity(Common::Vector2d velocityCars, const double w)
 void VehicleSimpleTT::DriveTrain(double throttlePedal, double brakePedal,
                                  std::vector<double> brakeSuperpose)
 {
-
-    double torqueEngineMax;
-    double rotVelMean = 0.5 * (rotationVelocityTireX[2] + rotationVelocityTireX[3]);
-    if (!qFuzzyIsNull(rotVelMean))
+    units::torque::newton_meter_t torqueEngineMax;
+    units::angular_velocity::radians_per_second_t rotVelMean = 0.5 * (rotationVelocityTireX[2] + rotationVelocityTireX[3]);
+    if (!qFuzzyIsNull(rotVelMean.value()))
     {
-        torqueEngineMax = powerEngineLimit / rotVelMean;
+        torqueEngineMax = powerEngineLimit / rotVelMean * 1_rad;
     }
     else
     {
-        torqueEngineMax = powerEngineLimit / 0.001;
+        torqueEngineMax = powerEngineLimit / 0.001_rad_per_s * 1_rad;
     }
 
-    torqueEngineMax = std::clamp(torqueEngineMax, 0.0, torqueEngineLimit);
+    torqueEngineMax = std::clamp(torqueEngineMax, 0.0_Nm, torqueEngineLimit);
     double brakePedalMod;
     for (int i = 0; i < NUMBER_OF_WHEELS; ++i)
     {
-
         // brake balance
         if (i < 2)
         {
@@ -117,39 +113,40 @@ void VehicleSimpleTT::DriveTrain(double throttlePedal, double brakePedal,
         // tire torque
         torqueTireXbrake[i] = std::clamp(brakePedalMod, 0.0, 1.0) * torqueBrakeLimit;
 
-        if (i > 1)   // RWD with open differential
+        if (i > 1) // RWD with open differential
         {
             torqueTireXthrottle[i] = throttlePedal * torqueEngineMax / 2.0;
         }
-
     }
 }
 
-void VehicleSimpleTT::ForceLocal(double timeStep, double angleTireFront, std::vector<double> forceVertical)
+void VehicleSimpleTT::ForceLocal(units::time::second_t timeStep, units::angle::radian_t angleTireFront, std::vector<units::force::newton_t> forceVertical)
 {
-
-    double angleTire[NUMBER_OF_WHEELS];
+    units::angle::radian_t angleTire[NUMBER_OF_WHEELS];
     angleTire[0] = angleTireFront + anglePreSet;
     angleTire[1] = angleTireFront - anglePreSet;
     angleTire[2] = -anglePreSet;
     angleTire[3] = anglePreSet;
 
     Tire *tire_tmp;
-    Common::Vector2d velocityTire(0.0, 0.0);
-    double rotVelNew, forceAbs, torqueTireSum;
+    Common::Vector2d<units::velocity::meters_per_second_t> velocityTire(0.0_mps, 0.0_mps);
+    units::angular_velocity::radians_per_second_t rotVelNew;
+    units::force::newton_t forceAbs;
+    units::torque::newton_meter_t torqueTireSum;
 
     // slips + forces
     for (int i = 0; i < NUMBER_OF_WHEELS; ++i)
     {
-
         tire_tmp = tires[i];
         tire_tmp->Rescale(forceVertical[i]); // here goes the delta_F_z scaling
         slipTire[i].Scale(0.0);
 
         // global rotation of the tire
-        velocityTire = positionTire[i];
-        velocityTire.Rotate(M_PI / 2.0);
-        velocityTire.Scale(yawVelocity);
+        Common::Vector2d<units::length::meter_t> position = positionTire[i];
+        position.Rotate(units::angle::radian_t(M_PI / 2.0));
+
+        velocityTire.x = position.x * yawVelocity * units::inverse_radian(1);
+        velocityTire.x = position.y * yawVelocity * units::inverse_radian(1);
 
         // translation superposition
         velocityTire.Add(velocityCar);
@@ -158,17 +155,17 @@ void VehicleSimpleTT::ForceLocal(double timeStep, double angleTireFront, std::ve
         // rotational inertia
         //torqueTireX[i] -= tire_tmp->inertia * rotationVelocityGradTireX[i];
 
-        if (qFuzzyIsNull(velocityTire.x))
+        if (qFuzzyIsNull(velocityTire.x.value()))
         {
-            torqueTireSum = 0.0;
+            torqueTireSum = 0.0_Nm;
         }
-        else if (velocityTire.x < 0.0)
+        else if (velocityTire.x < 0.0_mps)
         {
             torqueTireSum = torqueTireXbrake[i];
         }
         else
         {
-            torqueTireSum = - torqueTireXbrake[i];
+            torqueTireSum = -torqueTireXbrake[i];
         }
         torqueTireSum += torqueTireXthrottle[i];
 
@@ -180,16 +177,17 @@ void VehicleSimpleTT::ForceLocal(double timeStep, double angleTireFront, std::ve
 
         // local tire force
         forceAbs = tire_tmp->GetForce(slipTire[i].Length());
-        forceTire[i] = slipTire[i]; // tire CS
-        forceTire[i].Norm();
-        forceTire[i].Scale(forceAbs);
 
+        Common::Vector2d<units::dimensionless::scalar_t> slipVector = slipTire[i];
+        auto normalizedSlipVector = slipVector.Norm();
+        forceTire[i].x = normalizedSlipVector.x * forceAbs;
+        forceTire[i].y = normalizedSlipVector.y * forceAbs;
         // roll friction
-        bool posForce = forceTire[i].x > 0.0;
+        bool posForce = forceTire[i].x > 0.0_N;
         forceTire[i].x += tire_tmp->GetRollFriction(velocityTire.x);
-        if ((forceTire[i].x < 0.0 && posForce) || (forceTire[i].x > 0.0 && !posForce))
+        if ((forceTire[i].x < 0.0_N && posForce) || (forceTire[i].x > 0.0_N && !posForce))
         {
-            forceTire[i].x = 0.0;
+            forceTire[i].x = 0.0_N;
         }
 
         forceTire[i].Rotate(angleTire[i]); // car's CS
@@ -198,16 +196,14 @@ void VehicleSimpleTT::ForceLocal(double timeStep, double angleTireFront, std::ve
         momentTireZ[i] = positionTire[i].Cross(forceTire[i]);
 
         // rotational velocity
-        rotVelNew = velocityTire.x / (1 - slipTire[i].x) / tire_tmp->radius;
+        rotVelNew = 1_rad * velocityTire.x / (1 - slipTire[i].x) / tire_tmp->radius;
 
         // memorize rotation velocity derivative for inertia torque
         rotationVelocityGradTireX[i] = (rotVelNew - rotationVelocityTireX[i]) / timeStep;
 
         // memorize rotation velocity
         rotationVelocityTireX[i] = rotVelNew;
-
     }
-
 }
 
 void VehicleSimpleTT::ForceGlobal()
@@ -225,8 +221,8 @@ void VehicleSimpleTT::ForceGlobal()
     }
 
     // air drag
-    double forceAirDrag = -0.5 * densityAir * coeffDrag * areaFace * velocityCar.Length() * velocityCar.Length();
-    double angleSlide = velocityCar.Angle(); // ISO
+    units::force::newton_t forceAirDrag = -0.5 * densityAir * coeffDrag * areaFace * velocityCar.Length() * velocityCar.Length();
+    const auto angleSlide = velocityCar.Angle(); // ISO
 
     forceTotalXY.Rotate(-angleSlide); // traj. CS
     forceTotalXY.Add(forceAirDrag); // traj. CS
@@ -234,12 +230,12 @@ void VehicleSimpleTT::ForceGlobal()
 
 }
 
-double VehicleSimpleTT::GetTireForce(int tireNumber)
+units::force::newton_t VehicleSimpleTT::GetTireForce(int tireNumber)
 {
-    return sqrt((forceTire[tireNumber].x * forceTire[tireNumber].x) + (forceTire[tireNumber].y * forceTire[tireNumber].y));
+    return units::math::sqrt((forceTire[tireNumber].x * forceTire[tireNumber].x) + (forceTire[tireNumber].y * forceTire[tireNumber].y));
 }
 
-double VehicleSimpleTT::GetForceTireVerticalStatic(int tireNumber)
+units::force::newton_t VehicleSimpleTT::GetForceTireVerticalStatic(int tireNumber)
 {
     return forceTireVerticalStatic[tireNumber];
 }
diff --git a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_vehicle.h b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_vehicle.h
index 1abf3cf9593b664282e358b243eec6dedfe53338..071c94df0a63742f23658c036df1a2fb67c4740a 100644
--- a/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_vehicle.h
+++ b/sim/src/components/Dynamics_RegularTwoTrack/src/dynamics_twotrack_vehicle.h
@@ -29,14 +29,14 @@ public:
      *    @{
     */
     //! Initialize tire characteristics
-    void InitSetEngine(double weight,
-                       double P_engine, double T_brakeLimit);
+    void InitSetEngine(units::mass::kilogram_t weight,
+                       units::power::watt_t P_engine, units::torque::newton_meter_t T_brakeLimit);
     //! Initialize car's physics
-    void InitSetGeometry(double x_wheelbase, double x_COG, double y_track, double y_COG);
+    void InitSetGeometry(units::length::meter_t x_wheelbase, units::length::meter_t x_COG, units::length::meter_t y_track, units::length::meter_t y_COG);
     //! Initialize car's velocity
-    void InitSetTire(double vel,
+    void InitSetTire(units::velocity::meters_per_second_t vel,
                      double mu_tire_max, double mu_tire_slide,
-                     double s_max, double r_tire, double frictionScaleRoll);
+                     double s_max, units::length::meter_t r_tire, double frictionScaleRoll);
     /**
      *    @}
     */
@@ -48,7 +48,7 @@ public:
     //! Refresh car's position
     void UpdatePosition(double);
     //! Refresh car's velocity
-    void SetVelocity(Common::Vector2d, const double);
+    void SetVelocity(Common::Vector2d<units::velocity::meters_per_second_t> velocityCars, const units::angular_velocity::radians_per_second_t w);
     /**
      *    @}
     */
@@ -60,13 +60,13 @@ public:
     //! Calculate local tire torques
     void DriveTrain(double throttlePedal, double brakePedal, std::vector<double> brakeSuperpose);
     //! Local forces and moments transferred onto road
-    void ForceLocal(double timeStep, double, std::vector<double> forceVertical);
+    void ForceLocal(units::time::second_t timeStep, units::angle::radian_t angleTireFront, std::vector<units::force::newton_t> forceVertical);
     //! Global force and moment
     void ForceGlobal();
 
-    double GetTireForce(int tireNumber);
+    units::force::newton_t GetTireForce(int tireNumber);
 
-    double GetForceTireVerticalStatic(int tireNumber);
+    units::force::newton_t GetForceTireVerticalStatic(int tireNumber);
     /**
      *    @}
     */
@@ -76,7 +76,7 @@ public:
      *    @{
     */
     //! Total force on vehicle's CoM
-    Common::Vector2d forceTotalXY;
+    Common::Vector2d<units::force::newton_t> forceTotalXY;
     //! Total momentum on the vehicle around the z-axes
     double momentTotalZ;
     /**
@@ -87,7 +87,7 @@ public:
      *    \name Parameters
      *    @{
     */
-    double forceTireVerticalStatic[NUMBER_OF_WHEELS];
+    units::force::newton_t forceTireVerticalStatic[NUMBER_OF_WHEELS];
     /**
      *    @}
     */
@@ -98,17 +98,17 @@ private:
      *    @{
     */
     //! Inertial moment of tires [kg*m^2]
-    double inertiaTireX[NUMBER_OF_WHEELS];
+    units::inertia inertiaTireX[NUMBER_OF_WHEELS];
 
     //! Maximal engine power [W]
-    double powerEngineLimit;
+    units::power::watt_t powerEngineLimit;
     //! Brake force limit [N]
-    double torqueBrakeLimit;
+    units::torque::newton_meter_t torqueBrakeLimit;
 
     //! Mass of the car [kg]
-    double massTotal;
+    units::mass::kilogram_t massTotal;
     //! Tire positions in car CS [m]
-    Common::Vector2d positionTire[NUMBER_OF_WHEELS];
+    Common::Vector2d<units::length::meter_t> positionTire[NUMBER_OF_WHEELS];
     /**
      *  @}
     */
@@ -120,30 +120,30 @@ private:
     //! Drag coefficient (Asbo from http://rc.opelgt.org/indexcw.php) []
     const double coeffDrag = 0.34;
     //! Face area (Asbo from http://rc.opelgt.org/indexcw.php) [m^2]
-    const double areaFace = 1.94;
+    const units::area::square_meter_t areaFace{1.94};
     //! Air density [kg/m^3]
-    const double densityAir = 1.29;
+    const units::density::kilograms_per_cubic_meter_t densityAir{1.29};
     //! Earth's gravitation acceleration
-    const double accelVerticalEarth = -9.81;
+    const units::acceleration::meters_per_second_squared_t accelVerticalEarth{-9.81};
     //! Toe-in/-out
-    const double anglePreSet = 0.0;//0.003;
+    const units::angle::radian_t anglePreSet{0.0}; //0.003;
     //! Brake balance
     const double brakeBalance = 0.67;
     //! Max. engine moment
-    const double torqueEngineLimit = 10000.0;
+    const units::torque::newton_meter_t torqueEngineLimit{10000.0};
     /**
      *  @}
     */
 
     // Dynamics to remember
-    double rotationVelocityTireX[NUMBER_OF_WHEELS];
-    double rotationVelocityGradTireX[NUMBER_OF_WHEELS];
-    double yawVelocity;
-    Common::Vector2d velocityCar;
-    Common::Vector2d forceTire[NUMBER_OF_WHEELS];
-    Common::Vector2d slipTire[NUMBER_OF_WHEELS];
-    double torqueTireXthrottle[NUMBER_OF_WHEELS];
-    double torqueTireXbrake[NUMBER_OF_WHEELS];
+    units::angular_velocity::radians_per_second_t rotationVelocityTireX[NUMBER_OF_WHEELS];
+    units::angular_acceleration::radians_per_second_squared_t rotationVelocityGradTireX[NUMBER_OF_WHEELS];
+    units::angular_velocity::radians_per_second_t yawVelocity;
+    Common::Vector2d<units::velocity::meters_per_second_t> velocityCar;
+    Common::Vector2d<units::force::newton_t> forceTire[NUMBER_OF_WHEELS];
+    Common::Vector2d<units::dimensionless::scalar_t> slipTire[NUMBER_OF_WHEELS];
+    units::torque::newton_meter_t torqueTireXthrottle[NUMBER_OF_WHEELS];
+    units::torque::newton_meter_t torqueTireXbrake[NUMBER_OF_WHEELS];
     double momentTireZ[NUMBER_OF_WHEELS];
 
     /** \name Container
diff --git a/sim/src/components/Dynamics_TF/CMakeLists.txt b/sim/src/components/Dynamics_TF/CMakeLists.txt
index 0add8bec0023bfbdbb79e32644c3eb171e909211..8c6100ac6c34c7dceec02825638ad1a679e229aa 100644
--- a/sim/src/components/Dynamics_TF/CMakeLists.txt
+++ b/sim/src/components/Dynamics_TF/CMakeLists.txt
@@ -17,11 +17,12 @@ add_openpass_target(
   HEADERS
     dynamics_tf.h
     src/tfImplementation.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/Common/position.h
 
   SOURCES
     dynamics_tf.cpp
     src/tfImplementation.cpp
-
+  
   LIBRARIES
     Qt5::Core
     Common
diff --git a/sim/src/components/Dynamics_TF/dynamics_tf.cpp b/sim/src/components/Dynamics_TF/dynamics_tf.cpp
index 5004676a381b2cbecb975881df2f455fcf68c011..40d3e2f2800a4434ba3d19a3ffb07ec293dd4f00 100644
--- a/sim/src/components/Dynamics_TF/dynamics_tf.cpp
+++ b/sim/src/components/Dynamics_TF/dynamics_tf.cpp
@@ -19,7 +19,7 @@
 #include "include/parameterInterface.h"
 #include "src/tfImplementation.h"
 
-const static std::string VERSION = "0.2.0";
+const static std::string VERSION = "0.1.0";
 static const CallbackInterface *Callbacks = nullptr;
 
 extern "C" DYNAMICS_TRAJECTORY_FOLLOWER_SHARED_EXPORT const std::string &OpenPASS_GetVersion()
@@ -39,7 +39,8 @@ extern "C" DYNAMICS_TRAJECTORY_FOLLOWER_SHARED_EXPORT ModelInterface *OpenPASS_C
     const ParameterInterface *parameters,
     PublisherInterface * const publisher,
     AgentInterface *agent,
-    const CallbackInterface *callbacks)
+    const CallbackInterface *callbacks,
+    std::shared_ptr<ControlStrategiesInterface> const controlStrategies)
 {
     Callbacks = callbacks;
 
@@ -57,7 +58,8 @@ extern "C" DYNAMICS_TRAJECTORY_FOLLOWER_SHARED_EXPORT ModelInterface *OpenPASS_C
             parameters,
             publisher,
             callbacks,
-            agent));
+            agent,
+            controlStrategies));
     }
     catch (const std::runtime_error &ex)
     {
diff --git a/sim/src/components/Dynamics_TF/src/tfImplementation.cpp b/sim/src/components/Dynamics_TF/src/tfImplementation.cpp
index aae1dd616c207602c321e8756581055ac7068937..687c89228e4a7f08e427eb2c93e45987343b2d4c 100644
--- a/sim/src/components/Dynamics_TF/src/tfImplementation.cpp
+++ b/sim/src/components/Dynamics_TF/src/tfImplementation.cpp
@@ -34,8 +34,9 @@ TrajectoryFollowerImplementation::TrajectoryFollowerImplementation(std::string c
                                                                    const ParameterInterface *parameters,
                                                                    PublisherInterface * const publisher,
                                                                    const CallbackInterface *callbacks,
-                                                                   AgentInterface *agent) :
-    UnrestrictedModelInterface(
+                                                                   AgentInterface *agent,
+                                                                   std::shared_ptr<ControlStrategiesInterface> const controlStrategies) :
+    UnrestrictedControllStrategyModelInterface(
         componentName,
         isInit,
         priority,
@@ -47,8 +48,9 @@ TrajectoryFollowerImplementation::TrajectoryFollowerImplementation(std::string c
         parameters,
         publisher,
         callbacks,
-        agent),
-    cycleTimeInSeconds{static_cast<double>(cycleTime) / 1000.0}
+        agent,
+        controlStrategies),
+    cycleTimeInSeconds(units::time::millisecond_t(cycleTime))
 {
     ParseParameters(parameters);
     Init();
@@ -71,11 +73,15 @@ void TrajectoryFollowerImplementation::ParseParameters(const ParameterInterface
 
 void TrajectoryFollowerImplementation::Init()
 {
-    lastWorldPosition = {0, GetAgent()->GetPositionX(), GetAgent()->GetPositionY(), GetAgent()->GetYaw()};
+    const mantle_api::Vec3<units::length::meter_t> position {GetAgent()->GetPositionX(), GetAgent()->GetPositionY(), 0.0_m};
+    const mantle_api::Orientation3<units::angle::radian_t> orientation {GetAgent()->GetYaw(), 0.0_rad, 0.0_rad};
+    const mantle_api::Pose pose {position, orientation};
+    const mantle_api::Time time {0};
+    lastWorldPosition = {pose, time};
     lastVelocity = GetAgent()->GetVelocity().Length();
 
-    nextTrajectoryIterator = trajectory.points.begin();
-    currentTime = 0;
+    nextTrajectoryIterator = polyLine.begin();
+    currentTime = time;
 }
 
 void TrajectoryFollowerImplementation::UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data,
@@ -123,21 +129,11 @@ void TrajectoryFollowerImplementation::UpdateInput(int localLinkId, const std::s
             }
             else
             {
-                inputAcceleration = 0;
+                inputAcceleration = 0_mps_sq;
             }
         }
     }
-    else if (localLinkId == 2)
-    {
-        const auto trajectorySignal = std::dynamic_pointer_cast<TrajectorySignal const>(data);
-        if (trajectorySignal && trajectorySignal->componentState == ComponentState::Acting)
-        {
-            trajectory = trajectorySignal->trajectory;
-            UpdateState(ComponentState::Acting);
-            previousTrajectoryIterator = trajectory.points.begin();
-            nextTrajectoryIterator = previousTrajectoryIterator + 1;
-        }
-    }
+
     else
     {
         const std::string msg = std::string(COMPONENTNAME) + " invalid signaltype";
@@ -172,6 +168,37 @@ void TrajectoryFollowerImplementation::UpdateOutput(int localLinkId, std::shared
 
 void TrajectoryFollowerImplementation::Trigger([[maybe_unused]]int time)
 {
+    // TODO CK How to deal with multiple controlstrategies in the longrun? The newest should probably override the others. 
+    // TODO CK How to ensure a trajectory is only triggered once? Should the module remove it from the strategies? once active?
+    for (auto strategy : GetControlStrategies()->GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
+    {
+        auto followTrajectoryStrategy = std::dynamic_pointer_cast<mantle_api::FollowTrajectoryControlStrategy>(strategy);
+
+        if (followTrajectoryStrategy != nullptr && GetState() != ComponentState::Acting)
+        {
+            trajectory = followTrajectoryStrategy->trajectory;
+
+            if (!std::holds_alternative<PolyLine>(trajectory.type))
+            {
+                LOGERRORANDTHROW("Trajectory: " + trajectory.name + " has invalid type. TrajectoryFollower currently only supports trajectories of the type PolyLine.");
+            }
+
+            polyLine = std::get<PolyLine>(trajectory.type);
+
+            for (auto& polyLinePoint : polyLine)
+            {
+                if (!polyLinePoint.time.has_value())
+                {
+                    LOGERRORANDTHROW("Trajectory: " + trajectory.name + " is incomplete. Time stamp is required for each polyline point.");
+                }
+            }
+
+            SetComponentState(ComponentState::Acting);
+            previousTrajectoryIterator = polyLine.begin();
+            nextTrajectoryIterator = previousTrajectoryIterator + 1;
+        }
+    }
+
     CalculateNextTimestep();
 }
 
@@ -213,15 +240,14 @@ void TrajectoryFollowerImplementation::UpdateState(const ComponentState newState
 
 bool TrajectoryFollowerImplementation::CheckEndOfTrajectory()
 {
-    constexpr double EPSILON = 1e-3;
-    if (nextTrajectoryIterator == trajectory.points.end())
+    if (nextTrajectoryIterator == polyLine.end())
     {
         return true;
     }
     if (!inputAccelerationActive)
     {
-        if (nextTrajectoryIterator + 1 == trajectory.points.end()
-            && nextTrajectoryIterator->time - lastCoordinateTimestamp < EPSILON)
+        if (nextTrajectoryIterator + 1 == polyLine.end()
+            && nextTrajectoryIterator->time.value() == lastCoordinateTimestamp)
         {
             return true;
         }
@@ -245,11 +271,11 @@ bool TrajectoryFollowerImplementation::CheckEndOfTrajectory()
 
 void TrajectoryFollowerImplementation::HandleEndOfTrajectory()
 {
-    dynamicsOutputSignal.velocity = 0;
-    dynamicsOutputSignal.acceleration = 0;
-    dynamicsOutputSignal.travelDistance = 0;
-    dynamicsOutputSignal.yawRate = 0;
-    dynamicsOutputSignal.yawAcceleration = 0;
+    dynamicsOutputSignal.dynamicsInformation.velocity = 0_mps;
+    dynamicsOutputSignal.dynamicsInformation.acceleration = 0_mps_sq;
+    dynamicsOutputSignal.dynamicsInformation.travelDistance = 0_m;
+    dynamicsOutputSignal.dynamicsInformation.yawRate = 0_rad_per_s;
+    dynamicsOutputSignal.dynamicsInformation.yawAcceleration = 0_rad_per_s_sq;
 
     if (automaticDeactivation)
     {
@@ -259,24 +285,24 @@ void TrajectoryFollowerImplementation::HandleEndOfTrajectory()
 
 void TrajectoryFollowerImplementation::TriggerWithActiveAccelerationInput()
 {
-    TrajectoryPoint previousPosition = lastWorldPosition;
-    TrajectoryPoint nextPosition = (*nextTrajectoryIterator);
+    PolyLinePoint previousPosition = lastWorldPosition;
+    PolyLinePoint nextPosition = (*nextTrajectoryIterator);
 
-    const double velocity = lastVelocity + inputAcceleration * cycleTimeInSeconds;
+    const units::velocity::meters_per_second_t velocity = lastVelocity + inputAcceleration * cycleTimeInSeconds;
 
-    if (velocity <= 0.0)
+    if (velocity <= 0.0_mps)
     {
         HandleEndOfTrajectory();
         return;
     }
 
-    double remainingDistance = velocity * cycleTimeInSeconds;
-    dynamicsOutputSignal.travelDistance = remainingDistance;
+    units::length::meter_t remainingDistance = velocity * cycleTimeInSeconds;
+    dynamicsOutputSignal.dynamicsInformation.travelDistance = remainingDistance;
     double percentageTraveledBetweenCoordinates = 0.0;
 
-    while (remainingDistance > 0.0)
+    while (remainingDistance > 0.0_m)
     {
-        double distanceBetweenPoints = CalculateDistanceBetweenWorldCoordinates(previousPosition, nextPosition);
+        const auto distanceBetweenPoints = CalculateDistanceBetweenWorldCoordinates(previousPosition, nextPosition);
         if (distanceBetweenPoints < remainingDistance)
         {
             previousTrajectoryIterator++;
@@ -284,7 +310,7 @@ void TrajectoryFollowerImplementation::TriggerWithActiveAccelerationInput()
 
             previousPosition = *previousTrajectoryIterator;
 
-            if (nextTrajectoryIterator != trajectory.points.end())
+            if (nextTrajectoryIterator != polyLine.end())
             {
                 nextPosition = *nextTrajectoryIterator;
             }
@@ -300,38 +326,38 @@ void TrajectoryFollowerImplementation::TriggerWithActiveAccelerationInput()
         remainingDistance -= distanceBetweenPoints;
     }
 
-    Common::Vector2d direction = CalculateScaledVector(previousPosition, nextPosition, percentageTraveledBetweenCoordinates);
-    const double deltaYawAngle = CalculateScaledDeltaYawAngle(previousPosition, nextPosition, percentageTraveledBetweenCoordinates);
+    Common::Vector2d<units::length::meter_t> direction = CalculateScaledVector(previousPosition, nextPosition, percentageTraveledBetweenCoordinates);
+    const units::angle::radian_t deltaYawAngle = CalculateScaledDeltaYawAngle(previousPosition, nextPosition, percentageTraveledBetweenCoordinates);
 
     UpdateDynamics(previousPosition, direction, deltaYawAngle, velocity, inputAcceleration);
 }
 
 void TrajectoryFollowerImplementation::TriggerWithInactiveAccelerationInput()
 {
-    double previousTimestamp = lastCoordinateTimestamp;
-    TrajectoryPoint previousCoordinate = lastWorldPosition;
-    TrajectoryPoint nextCoordinate = *nextTrajectoryIterator;
+    auto previousTimestamp = lastCoordinateTimestamp;
+    auto previousCoordinate = lastWorldPosition;
+    auto nextCoordinate = *nextTrajectoryIterator;
 
-    double remainingTime = GetCycleTime() / 1000.0;
-    double timeBetweenCoordinates = nextCoordinate.time - previousTimestamp;
-    double deltaS{0};
+    units::time::millisecond_t remainingTime {GetCycleTime()};
+    auto timeBetweenCoordinates = nextCoordinate.time.value() - previousTimestamp;
+    units::length::meter_t deltaS{0};
 
     while (timeBetweenCoordinates <= remainingTime &&
-           nextTrajectoryIterator != trajectory.points.end())
+           nextTrajectoryIterator != polyLine.end())
     {
 
         previousTrajectoryIterator = nextTrajectoryIterator;
-        previousTimestamp = previousTrajectoryIterator->time;
+        previousTimestamp = previousTrajectoryIterator->time.value();
         lastCoordinateTimestamp = previousTimestamp;
 
         nextTrajectoryIterator++;
-        if (nextTrajectoryIterator != trajectory.points.end())
+        if (nextTrajectoryIterator != polyLine.end())
         {
             deltaS += CalculateDistanceBetweenWorldCoordinates(previousCoordinate, nextCoordinate);
             previousCoordinate = *previousTrajectoryIterator;
             nextCoordinate = *nextTrajectoryIterator;
             remainingTime -= timeBetweenCoordinates;
-            timeBetweenCoordinates = nextCoordinate.time - previousTimestamp;
+            timeBetweenCoordinates = nextCoordinate.time.value() - previousTimestamp;
         }
     }
 
@@ -339,14 +365,14 @@ void TrajectoryFollowerImplementation::TriggerWithInactiveAccelerationInput()
     const auto &nextPosition = nextCoordinate;
 
     percentageTraveledBetweenCoordinates = remainingTime / timeBetweenCoordinates;
-    Common::Vector2d direction = CalculateScaledVector(previousPosition, nextPosition, percentageTraveledBetweenCoordinates);
-    const double deltaYawAngle = CalculateScaledDeltaYawAngle(previousPosition, nextPosition, percentageTraveledBetweenCoordinates);
+    Common::Vector2d<units::length::meter_t> direction = CalculateScaledVector(previousPosition, nextPosition, percentageTraveledBetweenCoordinates);
+    const units::angle::radian_t deltaYawAngle = CalculateScaledDeltaYawAngle(previousPosition, nextPosition, percentageTraveledBetweenCoordinates);
 
     deltaS += direction.Length();
-    dynamicsOutputSignal.travelDistance = deltaS;
+    dynamicsOutputSignal.dynamicsInformation.travelDistance = deltaS;
 
-    const double velocity = deltaS / cycleTimeInSeconds;
-    const double acceleration = (velocity - lastVelocity) / cycleTimeInSeconds;
+    const units::velocity::meters_per_second_t velocity = deltaS / cycleTimeInSeconds;
+    const units::acceleration::meters_per_second_squared_t acceleration = (velocity - lastVelocity) / cycleTimeInSeconds;
 
     UpdateDynamics(previousPosition, direction, deltaYawAngle, velocity, acceleration);
 }
@@ -354,7 +380,7 @@ void TrajectoryFollowerImplementation::TriggerWithInactiveAccelerationInput()
 void TrajectoryFollowerImplementation::CalculateNextTimestep()
 {
     lastCoordinateTimestamp = currentTime;
-    currentTime += GetCycleTime() / 1000.0;
+    currentTime += units::time::millisecond_t{GetCycleTime()};
 
     if (GetState() == ComponentState::Disabled)
     {
@@ -378,46 +404,48 @@ void TrajectoryFollowerImplementation::CalculateNextTimestep()
     }
 }
 
-Common::Vector2d TrajectoryFollowerImplementation::CalculateScaledVector(const TrajectoryPoint &previousPosition, const TrajectoryPoint &nextPosition, const double &factor)
+Common::Vector2d<units::length::meter_t> TrajectoryFollowerImplementation::CalculateScaledVector(const PolyLinePoint &previousPosition, const PolyLinePoint &nextPosition, const double &factor)
 {
-    Common::Vector2d result(nextPosition.x - previousPosition.x, nextPosition.y - previousPosition.y);
-    result.Scale(factor);
+    auto direction = nextPosition.pose.position - previousPosition.pose.position;
+    direction = direction * factor;
 
-    return result;
+    return {direction.x, direction.y};
 }
 
-double TrajectoryFollowerImplementation::CalculateScaledDeltaYawAngle(const TrajectoryPoint &previousPosition, const TrajectoryPoint &nextPosition, const double &factor)
+units::angle::radian_t TrajectoryFollowerImplementation::CalculateScaledDeltaYawAngle(const PolyLinePoint &previousPosition, const PolyLinePoint &nextPosition, const double &factor)
 {
-    return (nextPosition.yaw - previousPosition.yaw) * factor;
-    ;
+    return (nextPosition.pose.orientation.yaw - previousPosition.pose.orientation.yaw) * factor;
 }
 
-double TrajectoryFollowerImplementation::CalculateDistanceBetweenWorldCoordinates(TrajectoryPoint previousPosition, TrajectoryPoint nextPosition)
+units::length::meter_t TrajectoryFollowerImplementation::CalculateDistanceBetweenWorldCoordinates(PolyLinePoint previousPosition, PolyLinePoint nextPosition)
 {
-    return openpass::hypot(nextPosition.x - previousPosition.x, nextPosition.y - previousPosition.y);
+    const auto direction = nextPosition.pose.position - previousPosition.pose.position;
+    return openpass::hypot(direction.x, direction.y);
 }
 
-void TrajectoryFollowerImplementation::UpdateDynamics(const TrajectoryPoint &previousPosition,
-                                                      const Common::Vector2d &direction,
-                                                      double deltaYawAngle,
-                                                      double velocity,
-                                                      double acceleration)
+void TrajectoryFollowerImplementation::UpdateDynamics(const PolyLinePoint &previousPosition,
+                                                      const Common::Vector2d<units::length::meter_t> &direction,
+                                                      units::angle::radian_t deltaYawAngle,
+                                                      units::velocity::meters_per_second_t velocity,
+                                                      units::acceleration::meters_per_second_squared_t acceleration)
 {
-    dynamicsOutputSignal.positionX = previousPosition.x + direction.x;
-    dynamicsOutputSignal.positionY = previousPosition.y + direction.y;
-    dynamicsOutputSignal.yaw = previousPosition.yaw + deltaYawAngle;
-
-    dynamicsOutputSignal.yawRate = (dynamicsOutputSignal.yaw - lastWorldPosition.yaw) / cycleTimeInSeconds;
-    dynamicsOutputSignal.yawAcceleration = (dynamicsOutputSignal.yawRate - lastYawVelocity) / cycleTimeInSeconds;
-
-    dynamicsOutputSignal.velocity = velocity;
-    dynamicsOutputSignal.acceleration = acceleration;
-    dynamicsOutputSignal.centripetalAcceleration = dynamicsOutputSignal.yawRate * dynamicsOutputSignal.velocity;
-
-    lastWorldPosition = {currentTime,
-                         dynamicsOutputSignal.positionX,
-                         dynamicsOutputSignal.positionY,
-                         dynamicsOutputSignal.yaw};
-    lastVelocity = dynamicsOutputSignal.velocity;
-    lastYawVelocity = dynamicsOutputSignal.yawRate;
+    dynamicsOutputSignal.dynamicsInformation.positionX = previousPosition.pose.position.x + units::length::meter_t(direction.x);
+    dynamicsOutputSignal.dynamicsInformation.positionY = previousPosition.pose.position.y + units::length::meter_t(direction.y);
+    dynamicsOutputSignal.dynamicsInformation.yaw = previousPosition.pose.orientation.yaw + deltaYawAngle;
+
+    dynamicsOutputSignal.dynamicsInformation.yawRate = (dynamicsOutputSignal.dynamicsInformation.yaw - lastWorldPosition.pose.orientation.yaw) / cycleTimeInSeconds;
+    dynamicsOutputSignal.dynamicsInformation.yawAcceleration = (dynamicsOutputSignal.dynamicsInformation.yawRate - lastYawVelocity) / cycleTimeInSeconds;
+
+    dynamicsOutputSignal.dynamicsInformation.velocity = velocity;
+    dynamicsOutputSignal.dynamicsInformation.acceleration = acceleration;
+    dynamicsOutputSignal.dynamicsInformation.centripetalAcceleration = units::inverse_radian(1) * dynamicsOutputSignal.dynamicsInformation.yawRate * dynamicsOutputSignal.dynamicsInformation.velocity;
+
+    const mantle_api::Vec3<units::length::meter_t> position {dynamicsOutputSignal.dynamicsInformation.positionX, dynamicsOutputSignal.dynamicsInformation.positionY, 0.0_m};
+    const mantle_api::Orientation3<units::angle::radian_t> orientation {dynamicsOutputSignal.dynamicsInformation.yaw, 0.0_rad, 0.0_rad};
+    const mantle_api::Pose pose {position, orientation};
+    const mantle_api::Time time {currentTime};
+    
+    lastWorldPosition = {pose, time};
+    lastYawVelocity = dynamicsOutputSignal.dynamicsInformation.yawRate;
+    lastVelocity = dynamicsOutputSignal.dynamicsInformation.velocity;
 }
diff --git a/sim/src/components/Dynamics_TF/src/tfImplementation.h b/sim/src/components/Dynamics_TF/src/tfImplementation.h
index 84e4bb7bccac43563bc5117400b57179c473a1e4..0ba7557c5aa6af3d9ee03d5057fb66237d84f992 100644
--- a/sim/src/components/Dynamics_TF/src/tfImplementation.h
+++ b/sim/src/components/Dynamics_TF/src/tfImplementation.h
@@ -58,21 +58,22 @@
 #include "common/dynamicsSignal.h"
 #include "common/globalDefinitions.h"
 #include "common/steeringSignal.h"
-#include "common/openScenarioDefinitions.h"
 #include "common/vector2d.h"
 #include "include/eventNetworkInterface.h"
 #include "include/modelInterface.h"
 #include "include/publisherInterface.h"
+#include <MantleAPI/Common/trajectory.h>
 
-using openScenario::Trajectory;
-using openScenario::TrajectoryPoint;
+using mantle_api::Trajectory;
+using mantle_api::PolyLine;
+using mantle_api::PolyLinePoint;
 
 /*!
  * \brief Makes an agent strictly follow a predefined path.
  *
  * \ingroup Dynamics_TrajectoryFollower
  */
-class TrajectoryFollowerImplementation : public UnrestrictedModelInterface
+class TrajectoryFollowerImplementation : public UnrestrictedControllStrategyModelInterface
 {
 public:
     static constexpr char COMPONENTNAME[] = "Dynamics_TrajectoryFollower";
@@ -88,7 +89,8 @@ public:
                                      const ParameterInterface *parameters,
                                      PublisherInterface * const publisher,
                                      const CallbackInterface *callbacks,
-                                     AgentInterface *agent);
+                                     AgentInterface *agent,
+                                     std::shared_ptr<ControlStrategiesInterface> const controlStrategies);
 
     /*!
     * \brief Update Inputs
@@ -136,27 +138,28 @@ public:
     void CalculateNextTimestep();
 
 private:
-        const double cycleTimeInSeconds{0.0};
+    const units::time::second_t cycleTimeInSeconds{0.0};
 
     bool initialization{true};
     bool enforceTrajectory{false};
     bool automaticDeactivation{false};
     bool inputAccelerationActive{false};
 
-    double currentTime{0};
+    units::time::millisecond_t currentTime{0};
 
-    double inputAcceleration{0.0};
+    units::acceleration::meters_per_second_squared_t inputAcceleration{0.0};
 
     DynamicsSignal dynamicsOutputSignal{};
 
     Trajectory trajectory{};
-    std::vector<TrajectoryPoint>::iterator previousTrajectoryIterator{};
-    std::vector<TrajectoryPoint>::iterator nextTrajectoryIterator{};
-
-    double lastCoordinateTimestamp{0};
-    double lastVelocity{0.0};
-    double lastYawVelocity{0.0};
-    TrajectoryPoint lastWorldPosition;
+    PolyLine polyLine;
+    PolyLine::iterator previousTrajectoryIterator{};
+    PolyLine::iterator nextTrajectoryIterator{};
+
+    units::time::millisecond_t lastCoordinateTimestamp{0};
+    units::velocity::meters_per_second_t lastVelocity{0.0};
+    units::angular_velocity::radians_per_second_t lastYawVelocity{0.0};
+    PolyLinePoint lastWorldPosition;
     double percentageTraveledBetweenCoordinates{0};
 
     ComponentState componentState{ComponentState::Disabled};
@@ -176,19 +179,19 @@ private:
 
     void ParseParameters(const ParameterInterface *parameters);
 
-    Common::Vector2d CalculateScaledVector(const TrajectoryPoint &previousPosition, const TrajectoryPoint &nextPosition, const double &factor);
-    double CalculateScaledDeltaYawAngle(const TrajectoryPoint &previousPosition, const TrajectoryPoint &nextPosition, const double &factor);
+    Common::Vector2d<units::length::meter_t> CalculateScaledVector(const PolyLinePoint &previousPosition, const PolyLinePoint &nextPosition, const double &factor);
+    units::angle::radian_t CalculateScaledDeltaYawAngle(const PolyLinePoint &previousPosition, const PolyLinePoint &nextPosition, const double &factor);
 
-    double CalculateDistanceBetweenWorldCoordinates(TrajectoryPoint previousPosition, TrajectoryPoint nextPosition);
+    units::length::meter_t CalculateDistanceBetweenWorldCoordinates(PolyLinePoint previousPosition, PolyLinePoint nextPosition);
 
     void TriggerWithActiveAccelerationInput();
     void TriggerWithInactiveAccelerationInput();
 
     void SetComponentState(const ComponentState newState);
 
-    void UpdateDynamics(const TrajectoryPoint &previousPosition,
-                        const Common::Vector2d &direction,
-                        double deltaYawAngle,
-                        double velocity,
-                        double acceleration);
+    void UpdateDynamics(const PolyLinePoint &previousPosition,
+                        const Common::Vector2d<units::length::meter_t> &direction,
+                        units::angle::radian_t deltaYawAngle,
+                        units::velocity::meters_per_second_t velocity,
+                        units::acceleration::meters_per_second_squared_t acceleration);
 };
diff --git a/sim/src/components/Dynamics_TwoTrack/dynamics_twotrack_implementation.cpp b/sim/src/components/Dynamics_TwoTrack/dynamics_twotrack_implementation.cpp
index 6fa1ea50ea8f6c2bc1f824fd6a6752f09b0e58d2..6cbafe0608c0baaee33e3cf43907818ca81fd502 100644
--- a/sim/src/components/Dynamics_TwoTrack/dynamics_twotrack_implementation.cpp
+++ b/sim/src/components/Dynamics_TwoTrack/dynamics_twotrack_implementation.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2020-2021 ITK Engineering GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -75,7 +76,16 @@ Dynamics_TwoTrack_Implementation::Dynamics_TwoTrack_Implementation(
 
     LOGINFO(QString().sprintf("Constructing Dynamics_TwoTrack for agent %d...", agent->GetId()).toStdString());
 
-    timeStep = (double)GetCycleTime() / 1000.0;
+    if (agent->GetVehicleModelParameters()->type == mantle_api::EntityType::kVehicle)
+    {
+        vehicleProperties = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(agent->GetVehicleModelParameters());
+    }
+    else
+    {
+        throw std::runtime_error("Component " + componentName + " expects an entity of type Vehicle and VehicleProperties.");
+    }
+
+    timeStep = units::time::millisecond_t(GetCycleTime());
 
     try
     {
@@ -95,12 +105,11 @@ Dynamics_TwoTrack_Implementation::Dynamics_TwoTrack_Implementation(
 
     torqueBrakeMin.SetValue(-std::fabs(torqueBrakeMin.GetValue()));
 
-    yawVelocity = 0.0;
-    yawAcceleration = 0.0;
+    yawVelocity = 0.0_rad_per_s;
+    yawAcceleration = 0.0_rad_per_s_sq;
     vehicle = new VehicleSimpleTT();
 
-    auto weight = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, vehicle::properties::Mass);
-    THROWIFFALSE(weight.has_value(), "Mass was not defined in VehicleCatalog");
+    auto weight = vehicleProperties->mass;
 
     /** @addtogroup init_tt
      * Define vehicle's body and engine characteristics:
@@ -108,7 +117,7 @@ Dynamics_TwoTrack_Implementation::Dynamics_TwoTrack_Implementation(
      *  - power
      *  - maximum brake torque
     */
-    vehicle->InitSetEngine(weight.value(), powerEngineMax.GetValue(), torqueBrakeMin.GetValue());
+    vehicle->InitSetEngine(weight, units::power::watt_t(powerEngineMax.GetValue()), units::torque::newton_meter_t(torqueBrakeMin.GetValue()));
 
     /** @addtogroup init_tt
      * Define vehicle's geometry:
@@ -117,12 +126,12 @@ Dynamics_TwoTrack_Implementation::Dynamics_TwoTrack_Implementation(
      *  - set the wheelbase
      *  - set the track width
     */
-    vehicle->InitSetGeometry(agent->GetVehicleModelParameters().frontAxle.positionX - agent->GetVehicleModelParameters().rearAxle.positionX,
-                             0.0,//agent->GetVehicleModelParameters().wheelbase / 2.0 - agent->GetDistanceCOGtoFrontAxle(),
-                             agent->GetVehicleModelParameters().frontAxle.trackWidth,
-                             0.0);
+    vehicle->InitSetGeometry(vehicleProperties->front_axle.bb_center_to_axle_center.x - vehicleProperties->rear_axle.bb_center_to_axle_center.x,
+                             0.0_m,//agent->GetVehicleModelParameters().wheelbase / 2.0 - agent->GetDistanceCOGtoFrontAxle(),
+                             vehicleProperties->front_axle.track_width,
+                             0.0_m);
 
-    auto frictionCoeff = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, vehicle::properties::FrictionCoefficient);
+    auto frictionCoeff = helper::map::query(vehicleProperties->properties, vehicle::properties::FrictionCoefficient);
     THROWIFFALSE(frictionCoeff.has_value(), "FrictionCoefficient was not defined in VehicleCatalog");
 
     /** @addtogroup init_tt
@@ -136,7 +145,7 @@ Dynamics_TwoTrack_Implementation::Dynamics_TwoTrack_Implementation(
     */
     vehicle->InitSetTire(agent->GetVelocity().Length(),
                          muTireMax.GetValue(), muTireSlide.GetValue(),
-                         slipTireMax.GetValue(), radiusTire.GetValue(), frictionCoeff.value());
+                         slipTireMax.GetValue(), units::length::meter_t(radiusTire.GetValue()), std::stod(frictionCoeff.value()));
 
     ControlData defaultControl = {0.0, 1.0, 0.0, {0.0, 0.0, 0.0, 0.0}};
     if (!control.SetDefaultValue(defaultControl))
@@ -147,10 +156,10 @@ Dynamics_TwoTrack_Implementation::Dynamics_TwoTrack_Implementation(
     }
 
     std::vector<double> defaultForceVertical = {
-        vehicle->forceTireVerticalStatic[0],
-        vehicle->forceTireVerticalStatic[1],
-        vehicle->forceTireVerticalStatic[2],
-        vehicle->forceTireVerticalStatic[3]};
+        vehicle->forceTireVerticalStatic[0].value(),
+        vehicle->forceTireVerticalStatic[1].value(),
+        vehicle->forceTireVerticalStatic[2].value(),
+        vehicle->forceTireVerticalStatic[3].value()};
     if (!forceWheelVertical.SetDefaultValue(defaultForceVertical))
     {
         std::stringstream log;
@@ -219,7 +228,7 @@ void Dynamics_TwoTrack_Implementation::UpdateOutput(int localLinkId,
 
 void Dynamics_TwoTrack_Implementation::Trigger(int time)
 {
-    timeClock = (double)time;
+    timeClock = units::time::millisecond_t(time);
 
 
     /** @addtogroup sim_step_00_tt
@@ -253,7 +262,7 @@ void Dynamics_TwoTrack_Implementation::Trigger(int time)
      *  - calculate lateral tire slips and forces
      *  - calculate friction forces
     */
-    vehicle->ForceLocal(timeStep, control.GetValue().steer, forceWheelVertical.GetValue());
+    vehicle->ForceLocal(timeStep, units::angle::radian_t(control.GetValue().steer), forceWheelVertical.GetValue());
     LOGDEBUG(QString().sprintf("Vertical Force for Dynamics_TwoTrack for agent %d: %f, %f, %f, %f",
                                GetAgent()->GetId(),
                                forceWheelVertical.GetValue().at(0),
@@ -327,18 +336,21 @@ void Dynamics_TwoTrack_Implementation::NextStateTranslation()
 {
     // update position (constant velocity step)
     velocityCar.Rotate(yawAngle); // global CS
-    positionCar = positionCar + velocityCar * timeStep;
+    positionCar.x = positionCar.x + velocityCar.x * timeStep;
+    positionCar.y = positionCar.y + velocityCar.y * timeStep;
 
     velocityCar.Rotate(-yawAngle); // vehicle CS
 
     // update velocity
-    Vector2d velocityCarNew = velocityCar + accelerationCar * timeStep;
+    Vector2d<units::velocity::meters_per_second_t> velocityCarNew;
+    velocityCarNew.x = velocityCar.x + accelerationCar.x * timeStep;
+    velocityCarNew.y = velocityCar.y + accelerationCar.y * timeStep;
 
     // update acceleration
-    auto weight = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, vehicle::properties::Mass);
-    THROWIFFALSE(weight.has_value(), "Mass was not defined in VehicleCatalog");
+    auto weight = vehicleProperties->mass;
 
-    accelerationCar = vehicle->forceTotalXY * (1 / weight.value());
+    accelerationCar.x = vehicle->forceTotalXY.x * (1 / weight);
+    accelerationCar.y = vehicle->forceTotalXY.y * (1 / weight);
 
     // correct velocity and acceleration for zero-crossing
     if (velocityCarNew.Dot(velocityCar) < 0.0)
@@ -362,23 +374,23 @@ void Dynamics_TwoTrack_Implementation::NextStateRotation()
     accelerationCar.Rotate(yawAngle);
 
     // update yaw angle
-    yawAngle = std::fmod(yawAngle + timeStep * yawVelocity, 2*M_PI);
+    yawAngle = units::math::fmod(yawAngle + timeStep * yawVelocity, 2*units::angle::radian_t(M_PI));
 
     // update yaw velocity
-    double yawVelocityNew = yawVelocity + yawAcceleration * timeStep;
+    units::angular_velocity::radians_per_second_t yawVelocityNew = yawVelocity + yawAcceleration * timeStep;
 
     // update acceleration
-    auto momentInertiaYaw = helper::map::query(GetAgent()->GetVehicleModelParameters().properties, "MomentInertiaYaw");
+    auto momentInertiaYaw = helper::map::query(vehicleProperties->properties, "MomentInertiaYaw");
     THROWIFFALSE(momentInertiaYaw.has_value(), "MomentInertiaYaw was not defined in VehicleCatalog");
-    THROWIFFALSE(momentInertiaYaw != 0.0, "MomentInertiaYaw was defined as 0.0 in VehicleCatalog");
+    THROWIFFALSE(std::stod(momentInertiaYaw.value()) != 0.0, "MomentInertiaYaw was defined as 0.0 in VehicleCatalog");
 
-    yawAcceleration = vehicle->momentTotalZ / momentInertiaYaw.value();
+    yawAcceleration = units::angular_acceleration::radians_per_second_squared_t(vehicle->momentTotalZ / std::stod(momentInertiaYaw.value()));
 
     // correct velocity and acceleration for zero-crossing
-    if (yawVelocityNew * yawVelocity < 0.0)
+    if (units::unit_cast<double>(yawVelocityNew * yawVelocity) < 0.0)
     {
-        yawVelocity = 0.0;
-        yawAcceleration = 0.0;
+        yawVelocity = 0.0_rad_per_s;
+        yawAcceleration = 0.0_rad_per_s_sq;
         LOGDEBUG(QString().sprintf("Zero crossing in w for agent %d!",
                                    GetAgent()->GetId()).toStdString());
     }
@@ -403,7 +415,7 @@ void Dynamics_TwoTrack_Implementation::NextStateSet()
 
     // update velocity
     velocityCar.Rotate(yawAngle); // global CS
-    GetAgent()->SetVelocityVector(velocityCar.x, velocityCar.y, 0.0);
+    GetAgent()->SetVelocityVector({velocityCar.x, velocityCar.y, 0.0_mps});
     GetAgent()->SetYawRate(yawVelocity);
     velocityCar.Rotate(-yawAngle); // vehicle CS
 
@@ -417,7 +429,7 @@ void Dynamics_TwoTrack_Implementation::NextStateSet()
     GetAgent()->SetAcceleration(accelerationCar.x);
 
     // update outputs
-    std::vector<double> forceInert = {-vehicle->forceTotalXY.x, -vehicle->forceTotalXY.y};
+    std::vector<double> forceInert = {-vehicle->forceTotalXY.x.value(), -vehicle->forceTotalXY.y.value()};
     forceGlobalInertia.SetValue(forceInert);
 
     LOGDEBUG(QString().sprintf("Setting Acceleration by Dynamics_TwoTrack for agent %d: %f, %f, %f",
diff --git a/sim/src/components/Dynamics_TwoTrack/dynamics_twotrack_implementation.h b/sim/src/components/Dynamics_TwoTrack/dynamics_twotrack_implementation.h
index 8a8158e89132c80541c12aaad04642f7960c49bd..b85587ac51bb3b369860d75b8cd016ac8f34eac6 100644
--- a/sim/src/components/Dynamics_TwoTrack/dynamics_twotrack_implementation.h
+++ b/sim/src/components/Dynamics_TwoTrack/dynamics_twotrack_implementation.h
@@ -103,6 +103,8 @@ public:
     void Trigger(int time);
 
 private:
+    std::shared_ptr<const mantle_api::VehicleProperties> vehicleProperties;
+
     std::map<std::string, externalParameter<double>*> parameterMapDouble;
     /** \addtogroup Dynamics_Two_Track
      *  @{
@@ -154,21 +156,21 @@ private:
      *    @{
     */
     //! Time step as double in s
-    double timeStep;
+    units::time::second_t timeStep;
     //! Actual time double in s
-    double timeClock;
+    units::time::second_t timeClock;
     //! Yaw angle
-    double yawAngle;
+    units::angle::radian_t yawAngle;
     //! Car's position
-    Common::Vector2d positionCar;
+    Common::Vector2d<units::length::meter_t> positionCar;
     //! Yaw rate
-    double yawVelocity;
+    units::angular_velocity::radians_per_second_t yawVelocity;
     //! Car's velocity
-    Common::Vector2d velocityCar;
+    Common::Vector2d<units::velocity::meters_per_second_t> velocityCar;
     //! Yaw acceleration
-    double yawAcceleration;
+    units::angular_acceleration::radians_per_second_squared_t yawAcceleration;
     //! Car's acceleration
-    Common::Vector2d accelerationCar;
+    Common::Vector2d<units::acceleration::meters_per_second_squared_t> accelerationCar;
     /**
      *    @}
      *  @}
diff --git a/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_tire.cpp b/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_tire.cpp
index 9c6fc6d5b5a34463f54fbccb1ab44deb609cc245..bce127ede8eaad5477082282f91339637cfa7836 100644
--- a/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_tire.cpp
+++ b/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_tire.cpp
@@ -12,15 +12,17 @@
 #include <cmath>
 #include <QtGlobal>
 
+using namespace units::literals;
+
 Tire::Tire(): radius(1.0), forceZ_static(-100.0), forcePeak_static(100.0), forceSat_static (50.0), slipPeak(0.1)
 {
     Rescale(forceZ_static);
 }
 
-Tire::Tire(const double F_ref, const double mu_tire_max, const double mu_tire_slide, const double s_max,
-           const double r, const double mu_scale):
-    radius (r),
-    forceZ_static (F_ref)
+Tire::Tire(const units::force::newton_t F_ref, const double mu_tire_max, const double mu_tire_slide, const double s_max,
+           const units::length::meter_t r, const double mu_scale) :
+    radius(r),
+    forceZ_static(F_ref)
 {
     // implicite roll friction scaling
     forcePeak_static  = -F_ref*mu_tire_max*mu_scale;
@@ -30,15 +32,15 @@ Tire::Tire(const double F_ref, const double mu_tire_max, const double mu_tire_sl
     Rescale(forceZ_static);
 }
 
-double Tire::GetForce(const double slip)
+units::force::newton_t Tire::GetForce(const double slip)
 {
 
     double slipAbs = std::fabs(slip);
-    double force;
+    units::force::newton_t force;
     double slipAbsNorm = std::clamp(slipAbs, 0.0, 1.0) / slipPeak;
 
     if (qFuzzyIsNull(slip)) { // make it easy
-        return 0.0;
+        return 0.0_N;
     } else if (slipAbsNorm <= 1.0) { // adhesion
         force = forcePeak *
                 stiffnessRoll * slipAbsNorm /
@@ -59,44 +61,49 @@ double Tire::GetForce(const double slip)
 
 }
 
-double Tire::GetLongSlip(const double torque)
+double Tire::GetLongSlip(const units::torque::newton_meter_t torque)
 {
-    double force = torque / radius;
-    double forceAbs = std::fabs(force);
+    units::force::newton_t force = torque / radius;
+    units::force::newton_t forceAbs = units::math::fabs(force);
 
-    if (( qFuzzyIsNull(force) ))
+    if (( qFuzzyIsNull(force.value()) ))
     {
         return 0.0;
     } else if ( forceAbs <= forcePeak ) { // moderate force in adhesion (slip limited)
         double p_2 = 0.5 * ( stiffnessRoll * ( 1.0 - forcePeak / forceAbs ) - 2.0 );
         double slip = slipPeak * ( -p_2 - std::sqrt( p_2 * p_2 - 1.0 ) );
-        return force > 0.0 ? slip : -slip;
+        return force > 0.0_N ? slip : -slip;
     } else { // slide
         //return force > 0.0 ? 1.0 : -1.0;
-        return force > 0.0 ? slipSat : -slipSat;
+        return force > 0.0_N ? slipSat : -slipSat;
     }
 }
 
-double Tire::CalcSlipY(double slipX, double vx, double vy)
+double Tire::CalcSlipY(double slipX, units::velocity::meters_per_second_t vx, units::velocity::meters_per_second_t vy)
 {
-    if (qFuzzyIsNull(vy) || (qAbs(vx)<velocityLimit && qAbs(vy)<velocityLimit)) {
+    if (qFuzzyIsNull(vy.value()) || (units::math::abs(vx) < velocityLimit && units::math::abs(vy) < velocityLimit))
+    {
         return 0.0;
-    } else if (qFuzzyIsNull(vx)) {
-        return std::clamp(-vy, -1.0, 1.0); // non-ISO
-    } else {
-        return std::clamp((std::fabs(slipX) - 1) * vy / std::fabs(vx), -1.0, 1.0); // non-ISO
+    }
+    else if (qFuzzyIsNull(vx.value()))
+    {
+        return std::clamp(-vy.value(), -1.0, 1.0); // non-ISO
+    }
+    else
+    {
+        return std::clamp((std::fabs(slipX) - 1) * vy.value() / std::fabs(vx.value()), -1.0, 1.0); // non-ISO
     }
 }
 
-double Tire::GetRollFriction(const double velTireX)
+units::force::newton_t Tire::GetRollFriction(const units::velocity::meters_per_second_t velTireX)
 {
-    double forceFriction = forceZ * frictionRoll;
+    units::force::newton_t forceFriction = forceZ * frictionRoll;
 
-    if (velTireX < 0.0)
+    if (velTireX < 0.0_mps)
     {
         forceFriction *= -1.0;
     }
-    if (std::fabs(velTireX) < velocityLimit)
+    if (units::math::fabs(velTireX) < velocityLimit)
     {
         forceFriction *= (velTireX/velocityLimit);
     }
@@ -104,11 +111,11 @@ double Tire::GetRollFriction(const double velTireX)
     return forceFriction;
 }
 
-void Tire::Rescale(const double forceZ_update)
+void Tire::Rescale(const units::force::newton_t forceZ_update)
 {
 
     forceZ = forceZ_update;
-    double scaling = std::clamp(forceZ/forceZ_static, 0.1, 2.0);
+    double scaling = std::clamp(units::unit_cast<double>(forceZ / forceZ_static), 0.1, 2.0);
 
     forcePeak = forcePeak_static*scaling;
     forceSat = forceSat_static*scaling;
diff --git a/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_tire.h b/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_tire.h
index 4b7efeb1661a068ff9f7aac33750b3fb94f83081..4b32b15d932e87c15119926f3413b8561c89d440 100644
--- a/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_tire.h
+++ b/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_tire.h
@@ -11,43 +11,43 @@
 #ifndef TIRE_H
 #define TIRE_H
 
+#include "units.h"
+
 //! Static tire model based on TMEASY by Rill et al.
 class Tire
 {
 public:
 
     Tire();
-    Tire(const double F_ref, const double mu_tire_max, const double mu_tire_slide, const double s_max,
-         const double r, const double mu_scale);
+    Tire(const units::force::newton_t F_ref, const double mu_tire_max, const double mu_tire_slide, const double s_max,
+         const units::length::meter_t r, const double mu_scale);
 
     virtual ~Tire() = default;
 
-    double radius;
+    units::length::meter_t radius;
     const double inertia = 1.2;
 
-    double GetForce(const double);
-    double GetLongSlip(const double tq);
-    double CalcSlipY(double slipX, double vx, double vy);
-    double GetRollFriction(const double velTireX);
-    void Rescale(const double forceZ_update);
+    units::force::newton_t GetForce(const double);
+    double GetLongSlip(const units::torque::newton_meter_t tq);
+    double CalcSlipY(double slipX, units::velocity::meters_per_second_t vx, units::velocity::meters_per_second_t vy);
+    units::force::newton_t GetRollFriction(const units::velocity::meters_per_second_t velTireX);
+    void Rescale(const units::force::newton_t forceZ_update);
 
 private:
+    units::force::newton_t forceZ_static;
+    units::force::newton_t forceZ;
 
-    double forceZ_static;
-    double forceZ;
-
-    double forcePeak_static;
-    double forceSat_static;
+    units::force::newton_t forcePeak_static;
+    units::force::newton_t forceSat_static;
     double slipPeak;
     double slipSat;
-    double forcePeak;
-    double forceSat;
+    units::force::newton_t forcePeak;
+    units::force::newton_t forceSat;
 
     const double frictionRoll = 0.01;
     const double stiffnessRoll = 0.3;
-    const double velocityLimit = 0.27; // ca. 1 km/h
+    const units::velocity::meters_per_second_t velocityLimit{0.27}; // ca. 1 km/h
     const double s_slide = 0.4;
-
 };
 
 #endif // TIRE_H
diff --git a/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_vehicle.cpp b/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_vehicle.cpp
index 08eb28f76c11ecf5efeda11874e89a9d919135a9..405925576d2f1719ff5aa462ecb82a7fe8a90a5d 100644
--- a/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_vehicle.cpp
+++ b/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_vehicle.cpp
@@ -28,31 +28,30 @@ VehicleSimpleTT::~VehicleSimpleTT()
     }
 }
 
-void VehicleSimpleTT::InitSetEngine(double weight, double P_engine, double T_brakeLimit)
+void VehicleSimpleTT::InitSetEngine(units::mass::kilogram_t weight, units::power::watt_t P_engine, units::torque::newton_meter_t T_brakeLimit)
 {
-    powerEngineLimit = std::fabs(P_engine);
-    torqueBrakeLimit = std::fabs(T_brakeLimit);
+    powerEngineLimit = units::math::fabs(P_engine);
+    torqueBrakeLimit = units::math::fabs(T_brakeLimit);
     massTotal = weight;
 }
 
-void VehicleSimpleTT::InitSetGeometry(double x_wheelbase, double x_COG,
-                                      double y_track, double y_COG)
+void VehicleSimpleTT::InitSetGeometry(units::length::meter_t x_wheelbase, units::length::meter_t x_COG,
+                                      units::length::meter_t y_track, units::length::meter_t y_COG)
 {
+    yawVelocity = 0.0_rad_per_s;
 
-    yawVelocity = 0.0;
+    positionTire[0].x = x_wheelbase / 2.0 - x_COG;  // > 0
+    positionTire[1].x = positionTire[0].x;          // > 0
+    positionTire[2].x = -x_wheelbase / 2.0 - x_COG; // < 0
+    positionTire[3].x = positionTire[2].x;          // < 0
 
-    positionTire[0].x = x_wheelbase/2.0 - x_COG; // > 0
-    positionTire[1].x = positionTire[0].x; // > 0
-    positionTire[2].x = -x_wheelbase/2.0 - x_COG; // < 0
-    positionTire[3].x = positionTire[2].x; // < 0
+    positionTire[0].y = y_track / 2.0 - y_COG;  // > 0
+    positionTire[1].y = -y_track / 2.0 - y_COG; // < 0
+    positionTire[2].y = positionTire[0].y;      // > 0
+    positionTire[3].y = positionTire[1].y;      // < 0
 
-    positionTire[0].y = y_track/2.0 - y_COG; // > 0
-    positionTire[1].y = -y_track/2.0 - y_COG; // < 0
-    positionTire[2].y = positionTire[0].y; // > 0
-    positionTire[3].y = positionTire[1].y; // < 0
-
-    double massFront = -massTotal * positionTire[2].x / x_wheelbase;
-    double massRear = massTotal * positionTire[0].x / x_wheelbase;
+    units::mass::kilogram_t massFront = -massTotal * positionTire[2].x / x_wheelbase;
+    units::mass::kilogram_t massRear = massTotal * positionTire[0].x / x_wheelbase;
 
     forceTireVerticalStatic[0] = -accelVerticalEarth * massFront * positionTire[1].y / y_track;
     forceTireVerticalStatic[1] = accelVerticalEarth * massFront * positionTire[0].y / y_track;
@@ -60,23 +59,22 @@ void VehicleSimpleTT::InitSetGeometry(double x_wheelbase, double x_COG,
     forceTireVerticalStatic[3] = accelVerticalEarth * massRear * positionTire[2].y / y_track;
 
     // RWD
-    torqueTireXthrottle[0] = 0.0;
-    torqueTireXthrottle[1] = 0.0;
-
+    torqueTireXthrottle[0] = 0.0_Nm;
+    torqueTireXthrottle[1] = 0.0_Nm;
 }
 
-void VehicleSimpleTT::InitSetTire(double vel, double mu_tire_max, double mu_tire_slide, double s_max,
-                                  double r_tire, double frictionScaleRoll)
+void VehicleSimpleTT::InitSetTire(units::velocity::meters_per_second_t vel, double mu_tire_max, double mu_tire_slide, double s_max,
+                                  units::length::meter_t r_tire, double frictionScaleRoll)
 {
     for (int i = 0; i < NUMBER_OF_WHEELS; ++i)
     {
         tires[i] = new Tire(forceTireVerticalStatic[i], mu_tire_max, mu_tire_slide, s_max, r_tire, frictionScaleRoll);
-        rotationVelocityTireX[i] = vel / r_tire;
-        rotationVelocityGradTireX[i] = 0.0;
+        rotationVelocityTireX[i] = vel / r_tire * 1_rad;
+        rotationVelocityGradTireX[i] = 0.0_rad_per_s_sq;
     }
 }
 
-void VehicleSimpleTT::SetVelocity(Common::Vector2d velocityCars, const double w)
+void VehicleSimpleTT::SetVelocity(Common::Vector2d<units::velocity::meters_per_second_t> velocityCars, const units::angular_velocity::radians_per_second_t w)
 {
     velocityCar = velocityCars; // car CS
     yawVelocity = w;
@@ -85,23 +83,21 @@ void VehicleSimpleTT::SetVelocity(Common::Vector2d velocityCars, const double w)
 void VehicleSimpleTT::DriveTrain(double throttlePedal, double brakePedal,
                                  std::array<double, NUMBER_OF_WHEELS> brakeSuperpose)
 {
-
-    double torqueEngineMax;
-    double rotVelMean = 0.5 * (rotationVelocityTireX[2] + rotationVelocityTireX[3]);
-    if (!qFuzzyIsNull(rotVelMean))
+    units::torque::newton_meter_t torqueEngineMax;
+    units::angular_velocity::radians_per_second_t rotVelMean = 0.5 * (rotationVelocityTireX[2] + rotationVelocityTireX[3]);
+    if (!qFuzzyIsNull(rotVelMean.value()))
     {
-        torqueEngineMax = powerEngineLimit / rotVelMean;
+        torqueEngineMax = powerEngineLimit / rotVelMean * 1_rad;
     }
     else
     {
-        torqueEngineMax = powerEngineLimit / 0.001;
+        torqueEngineMax = powerEngineLimit / 0.001_rad_per_s * 1_rad;
     }
 
-    torqueEngineMax = std::clamp(torqueEngineMax, 0.0, torqueEngineLimit);
+    torqueEngineMax = std::clamp(torqueEngineMax, 0.0_Nm, torqueEngineLimit);
     double brakePedalMod;
     for (int i = 0; i < NUMBER_OF_WHEELS; ++i)
     {
-
         // brake balance
         if (i < 2)
         {
@@ -116,39 +112,40 @@ void VehicleSimpleTT::DriveTrain(double throttlePedal, double brakePedal,
         // tire torque
         torqueTireXbrake[i] = std::clamp(brakePedalMod, 0.0, 1.0) * torqueBrakeLimit;
 
-        if (i > 1)   // RWD with open differential
+        if (i > 1) // RWD with open differential
         {
             torqueTireXthrottle[i] = throttlePedal * torqueEngineMax / 2.0;
         }
-
     }
 }
 
-void VehicleSimpleTT::ForceLocal(double timeStep, double angleTireFront, std::vector<double> forceVertical)
+void VehicleSimpleTT::ForceLocal(units::time::second_t timeStep, units::angle::radian_t angleTireFront, std::vector<double> forceVertical)
 {
-
-    double angleTire[NUMBER_OF_WHEELS];
+    units::angle::radian_t angleTire[NUMBER_OF_WHEELS];
     angleTire[0] = angleTireFront + anglePreSet;
     angleTire[1] = angleTireFront - anglePreSet;
     angleTire[2] = -anglePreSet;
     angleTire[3] = anglePreSet;
 
     Tire *tire_tmp;
-    Common::Vector2d velocityTire(0.0, 0.0);
-    double rotVelNew, forceAbs, torqueTireSum;
+    Common::Vector2d<units::velocity::meters_per_second_t> velocityTire(0.0_mps, 0.0_mps);
+    units::angular_velocity::radians_per_second_t rotVelNew;
+    units::force::newton_t forceAbs;
+    units::torque::newton_meter_t torqueTireSum;
 
     // slips + forces
     for (int i = 0; i < NUMBER_OF_WHEELS; ++i)
     {
-
         tire_tmp = tires[i];
-        tire_tmp->Rescale(forceVertical[i]); // here goes the delta_F_z scaling
+        tire_tmp->Rescale(units::force::newton_t(forceVertical[i])); // here goes the delta_F_z scaling
         slipTire[i].Scale(0.0);
 
         // global rotation of the tire
-        velocityTire = positionTire[i];
-        velocityTire.Rotate(M_PI / 2.0);
-        velocityTire.Scale(yawVelocity);
+        Common::Vector2d<units::length::meter_t> position = positionTire[i];
+        position.Rotate(units::angle::radian_t(M_PI / 2.0));
+
+        velocityTire.x = position.x * yawVelocity * units::inverse_radian(1);
+        velocityTire.x = position.y * yawVelocity * units::inverse_radian(1);
 
         // translation superposition
         velocityTire.Add(velocityCar);
@@ -157,11 +154,11 @@ void VehicleSimpleTT::ForceLocal(double timeStep, double angleTireFront, std::ve
         // rotational inertia
         //torqueTireX[i] -= tire_tmp->inertia * rotationVelocityGradTireX[i];
 
-        if (qFuzzyIsNull(velocityTire.x))
+        if (qFuzzyIsNull(velocityTire.x.value()))
         {
-            torqueTireSum = 0.0;
+            torqueTireSum = 0.0_Nm;
         }
-        else if (velocityTire.x < 0.0)
+        else if (velocityTire.x < 0.0_mps)
         {
             torqueTireSum = torqueTireXbrake[i];
         }
@@ -179,16 +176,18 @@ void VehicleSimpleTT::ForceLocal(double timeStep, double angleTireFront, std::ve
 
         // local tire force
         forceAbs = tire_tmp->GetForce(slipTire[i].Length());
-        forceTire[i] = slipTire[i]; // tire CS
-        forceTire[i].Norm();
-        forceTire[i].Scale(forceAbs);
+
+        Common::Vector2d<units::dimensionless::scalar_t> slipVector = slipTire[i];
+        auto normalizedSlipVector = slipVector.Norm();
+        forceTire[i].x = normalizedSlipVector.x * forceAbs;
+        forceTire[i].y = normalizedSlipVector.y * forceAbs;
 
         // roll friction
-        bool posForce = forceTire[i].x > 0.0;
+        bool posForce = forceTire[i].x > 0.0_N;
         forceTire[i].x += tire_tmp->GetRollFriction(velocityTire.x);
-        if ((forceTire[i].x < 0.0 && posForce) || (forceTire[i].x > 0.0 && !posForce))
+        if ((forceTire[i].x < 0.0_N && posForce) || (forceTire[i].x > 0.0_N && !posForce))
         {
-            forceTire[i].x = 0.0;
+            forceTire[i].x = 0.0_N;
         }
 
         forceTire[i].Rotate(angleTire[i]); // car's CS
@@ -197,21 +196,18 @@ void VehicleSimpleTT::ForceLocal(double timeStep, double angleTireFront, std::ve
         momentTireZ[i] = positionTire[i].Cross(forceTire[i]);
 
         // rotational velocity
-        rotVelNew = velocityTire.x / (1 - slipTire[i].x) / tire_tmp->radius;
+        rotVelNew = 1_rad * velocityTire.x / (1 - slipTire[i].x) / tire_tmp->radius;
 
         // memorize rotation velocity derivative for inertia torque
         rotationVelocityGradTireX[i] = (rotVelNew - rotationVelocityTireX[i]) / timeStep;
 
         // memorize rotation velocity
         rotationVelocityTireX[i] = rotVelNew;
-
     }
-
 }
 
 void VehicleSimpleTT::ForceGlobal()
 {
-
     forceTotalXY.Scale(0.0);
     momentTotalZ = 0.0;
     for (int i = 0; i < NUMBER_OF_WHEELS; ++i)
@@ -224,21 +220,20 @@ void VehicleSimpleTT::ForceGlobal()
     }
 
     // air drag
-    double forceAirDrag = -0.5 * densityAir * coeffDrag * areaFace * velocityCar.Length() * velocityCar.Length();
-    double angleSlide = velocityCar.Angle(); // ISO
+    units::force::newton_t forceAirDrag = -0.5 * densityAir * coeffDrag * areaFace * velocityCar.Length() * velocityCar.Length();
+    const auto angleSlide = velocityCar.Angle(); // ISO
 
     forceTotalXY.Rotate(-angleSlide); // traj. CS
     forceTotalXY.Add(forceAirDrag); // traj. CS
     forceTotalXY.Rotate(angleSlide); // car CS
-
 }
 
-double VehicleSimpleTT::GetTireForce(int tireNumber)
+units::force::newton_t VehicleSimpleTT::GetTireForce(int tireNumber)
 {
-    return sqrt((forceTire[tireNumber].x * forceTire[tireNumber].x) + (forceTire[tireNumber].y * forceTire[tireNumber].y));
+    return units::math::sqrt((forceTire[tireNumber].x * forceTire[tireNumber].x) + (forceTire[tireNumber].y * forceTire[tireNumber].y));
 }
 
-double VehicleSimpleTT::GetForceTireVerticalStatic(int tireNumber)
+units::force::newton_t VehicleSimpleTT::GetForceTireVerticalStatic(int tireNumber)
 {
     return forceTireVerticalStatic[tireNumber];
 }
diff --git a/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_vehicle.h b/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_vehicle.h
index 342b69742b47402b586dd39cada3f224ac6eedb4..d0008b1688c50f36c21b29bd4b5f8d8e17e3a8ba 100644
--- a/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_vehicle.h
+++ b/sim/src/components/Dynamics_TwoTrack/src/dynamics_twotrack_vehicle.h
@@ -18,8 +18,13 @@
 
 #include "common/vector2d.h"
 #include "dynamics_twotrack_tire.h"
+#include "common/globalDefinitions.h"
+#include "MantleAPI/Common/orientation.h"
+
 #define NUMBER_OF_WHEELS 4
 
+using namespace units::literals;
+
 class Tire;
 
 //! Simple STATIC two-track vehicle model
@@ -34,14 +39,14 @@ public:
      *    @{
     */
     //! Initialize tire characteristics
-    void InitSetEngine(double weight,
-                       double P_engine, double T_brakeLimit);
+    void InitSetEngine(units::mass::kilogram_t weight,
+                       units::power::watt_t P_engine, units::torque::newton_meter_t T_brakeLimit);
     //! Initialize car's physics
-    void InitSetGeometry(double x_wheelbase, double x_COG, double y_track, double y_COG);
+    void InitSetGeometry(units::length::meter_t x_wheelbase, units::length::meter_t x_COG, units::length::meter_t y_track, units::length::meter_t y_COG);
     //! Initialize car's velocity
-    void InitSetTire(double vel,
+    void InitSetTire(units::velocity::meters_per_second_t vel,
                      double mu_tire_max, double mu_tire_slide,
-                     double s_max, double r_tire, double frictionScaleRoll);
+                     double s_max, units::length::meter_t r_tire, double frictionScaleRoll);
     /**
      *    @}
     */
@@ -53,7 +58,7 @@ public:
     //! Refresh car's position
     void UpdatePosition(double);
     //! Refresh car's velocity
-    void SetVelocity(Common::Vector2d, const double);
+    void SetVelocity(Common::Vector2d<units::velocity::meters_per_second_t> velocityCars, const units::angular_velocity::radians_per_second_t w);
     /**
      *    @}
     */
@@ -65,13 +70,13 @@ public:
     //! Calculate local tire torques
     void DriveTrain(double throttlePedal, double brakePedal, std::array<double, NUMBER_OF_WHEELS> brakeSuperpose);
     //! Local forces and moments transferred onto road
-    void ForceLocal(double timeStep, double, std::vector<double> forceVertical);
+    void ForceLocal(units::time::second_t timeStep, units::angle::radian_t angleTireFront, std::vector<double> forceVertical);
     //! Global force and moment
     void ForceGlobal();
 
-    double GetTireForce(int tireNumber);
+    units::force::newton_t GetTireForce(int tireNumber);
 
-    double GetForceTireVerticalStatic(int tireNumber);
+    units::force::newton_t GetForceTireVerticalStatic(int tireNumber);
     /**
      *    @}
     */
@@ -81,7 +86,7 @@ public:
      *    @{
     */
     //! Total force on vehicle's CoM
-    Common::Vector2d forceTotalXY;
+    Common::Vector2d<units::force::newton_t> forceTotalXY;
     //! Total momentum on the vehicle around the z-axes
     double momentTotalZ;
     /**
@@ -92,7 +97,7 @@ public:
      *    \name Parameters
      *    @{
     */
-    std::array<double, NUMBER_OF_WHEELS> forceTireVerticalStatic;
+    std::array<units::force::newton_t, NUMBER_OF_WHEELS> forceTireVerticalStatic;
     /**
      *    @}
     */
@@ -103,17 +108,17 @@ private:
      *    @{
     */
     //! Inertial moment of tires [kg*m^2]
-    std::array<double, NUMBER_OF_WHEELS> inertiaTireX;
+    std::array<units::inertia, NUMBER_OF_WHEELS> inertiaTireX;
 
     //! Maximal engine power [W]
-    double powerEngineLimit;
+    units::power::watt_t powerEngineLimit;
     //! Brake force limit [N]
-    double torqueBrakeLimit;
+    units::torque::newton_meter_t torqueBrakeLimit;
 
     //! Mass of the car [kg]
-    double massTotal;
+    units::mass::kilogram_t massTotal;
     //! Tire positions in car CS [m]
-    std::array<Common::Vector2d, NUMBER_OF_WHEELS> positionTire;
+    std::array<Common::Vector2d<units::length::meter_t>, NUMBER_OF_WHEELS> positionTire;
     /**
      *  @}
     */
@@ -125,30 +130,30 @@ private:
     //! Drag coefficient (Asbo from http://rc.opelgt.org/indexcw.php) []
     const double coeffDrag = 0.34;
     //! Face area (Asbo from http://rc.opelgt.org/indexcw.php) [m^2]
-    const double areaFace = 1.94;
+    const units::area::square_meter_t areaFace{1.94};
     //! Air density [kg/m^3]
-    const double densityAir = 1.29;
+    const units::density::kilograms_per_cubic_meter_t densityAir{1.29};
     //! Earth's gravitation acceleration
-    const double accelVerticalEarth = -9.81;
+    const units::acceleration::meters_per_second_squared_t accelVerticalEarth{-9.81};
     //! Toe-in/-out
-    const double anglePreSet = 0.0;//0.003;
+    const units::angle::radian_t anglePreSet{0.0}; //0.003;
     //! Brake balance
     const double brakeBalance = 0.67;
     //! Max. engine moment
-    const double torqueEngineLimit = 10000.0;
+    const units::torque::newton_meter_t torqueEngineLimit{10000.0};
     /**
      *  @}
     */
 
     // Dynamics to remember
-    std::array<double, NUMBER_OF_WHEELS> rotationVelocityTireX;
-    std::array<double, NUMBER_OF_WHEELS> rotationVelocityGradTireX;
-    double yawVelocity;
-    Common::Vector2d velocityCar;
-    std::array<Common::Vector2d, NUMBER_OF_WHEELS> forceTire;
-    std::array<Common::Vector2d, NUMBER_OF_WHEELS> slipTire;
-    std::array<double, NUMBER_OF_WHEELS> torqueTireXthrottle;
-    std::array<double, NUMBER_OF_WHEELS> torqueTireXbrake;
+    std::array<units::angular_velocity::radians_per_second_t, NUMBER_OF_WHEELS> rotationVelocityTireX;
+    std::array<units::angular_acceleration::radians_per_second_squared_t, NUMBER_OF_WHEELS> rotationVelocityGradTireX;
+    units::angular_velocity::radians_per_second_t yawVelocity;
+    Common::Vector2d<units::velocity::meters_per_second_t> velocityCar;
+    std::array<Common::Vector2d<units::force::newton_t>, NUMBER_OF_WHEELS> forceTire;
+    std::array<Common::Vector2d<units::dimensionless::scalar_t>, NUMBER_OF_WHEELS> slipTire;
+    std::array<units::torque::newton_meter_t, NUMBER_OF_WHEELS> torqueTireXthrottle;
+    std::array<units::torque::newton_meter_t, NUMBER_OF_WHEELS> torqueTireXbrake;
     std::array<double, NUMBER_OF_WHEELS> momentTireZ;
 
     /** \name Container
diff --git a/sim/src/components/LimiterAccVehComp/src/limiterAccVehCompImpl.cpp b/sim/src/components/LimiterAccVehComp/src/limiterAccVehCompImpl.cpp
index 8b16c381b6a4f32d0163695aa7e29f0e9f9de087..edc100442d3d9bd90dd928f4073e0b8259826626 100644
--- a/sim/src/components/LimiterAccVehComp/src/limiterAccVehCompImpl.cpp
+++ b/sim/src/components/LimiterAccVehComp/src/limiterAccVehCompImpl.cpp
@@ -1,6 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2020 HLRS, University of Stuttgart
  *               2017-2020 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -94,20 +95,20 @@ void LimiterAccelerationVehicleComponentsImplementation::Trigger(int time)
 {
     Q_UNUSED(time);
 
-    const double &accelerationLimit = CalculateAccelerationLimit();
-    const double &decelerationLimit = CalculateDecelerationLimit();
+    const auto &accelerationLimit = CalculateAccelerationLimit();
+    const auto &decelerationLimit = CalculateDecelerationLimit();
 
-    outgoingAcceleration = std::max(std::min(incomingAcceleration, accelerationLimit), decelerationLimit);
+    outgoingAcceleration = units::math::max(units::math::min(incomingAcceleration, accelerationLimit), decelerationLimit);
 }
 
 double LimiterAccelerationVehicleComponentsImplementation::GetVehicleProperty(const std::string& propertyName)
 {
     const auto property = helper::map::query(vehicleModelParameters.properties, propertyName);
     THROWIFFALSE(property.has_value(), "Vehicle property \"" + propertyName + "\" was not set in the VehicleCatalog");
-    return property.value();
+    return std::stod(property.value());
 }
 
-double LimiterAccelerationVehicleComponentsImplementation::InterpolateEngineTorqueBasedOnSpeed(const double &engineSpeed)
+units::torque::newton_meter_t LimiterAccelerationVehicleComponentsImplementation::InterpolateEngineTorqueBasedOnSpeed(const units::angular_velocity::revolutions_per_minute_t &engineSpeed)
 {
     if(engineSpeedReferences.size() != engineTorqueReferences.size() || engineSpeedReferences.empty())
     {
@@ -128,12 +129,12 @@ double LimiterAccelerationVehicleComponentsImplementation::InterpolateEngineTorq
     {
         if(engineSpeedReferences.at(i) >= engineSpeed)
         {
-            const double differenceBetweenEngineSpeedReferencePoints = engineSpeedReferences.at(i) - engineSpeedReferences.at(i-1);
+            const auto differenceBetweenEngineSpeedReferencePoints = engineSpeedReferences.at(i) - engineSpeedReferences.at(i-1);
             const double percentage = (engineSpeed - engineSpeedReferences.at(i-1)) / differenceBetweenEngineSpeedReferencePoints;
 
-            const double differenceBetweenEngineTorqueReferencePoints = engineTorqueReferences.at(i) - engineTorqueReferences.at(i-1);
+            const auto differenceBetweenEngineTorqueReferencePoints = engineTorqueReferences.at(i) - engineTorqueReferences.at(i-1);
 
-            const double interpolatedTorque = engineTorqueReferences.at(i-1) + (differenceBetweenEngineTorqueReferencePoints * percentage);
+            const units::torque::newton_meter_t interpolatedTorque = engineTorqueReferences.at(i-1) + (differenceBetweenEngineTorqueReferencePoints * percentage);
 
             return interpolatedTorque;
         }
@@ -142,9 +143,9 @@ double LimiterAccelerationVehicleComponentsImplementation::InterpolateEngineTorq
     throw std::runtime_error("Could not interpolate torque.");
 }
 
-std::vector<double> LimiterAccelerationVehicleComponentsImplementation::PrepareEngineTorqueVectorBasedOnGearRatios()
+std::vector<units::torque::newton_meter_t> LimiterAccelerationVehicleComponentsImplementation::PrepareEngineTorqueVectorBasedOnGearRatios()
 {
-    std::vector<double> engineTorquesBasedOnGearRatios {};
+    std::vector<units::torque::newton_meter_t> engineTorquesBasedOnGearRatios {};
 
     if(GetVehicleProperty(vehicle::properties::NumberOfGears) < 1)
     {
@@ -153,50 +154,50 @@ std::vector<double> LimiterAccelerationVehicleComponentsImplementation::PrepareE
 
     for(size_t i = 1; i <= GetVehicleProperty(vehicle::properties::NumberOfGears); i++)
     {
-        const double engineSpeedBasedOnGear = CalculateEngineSpeedBasedOnGear(GetAgent()->GetVelocity().Length(), i);
+        const auto engineSpeedBasedOnGear = CalculateEngineSpeedBasedOnGear(GetAgent()->GetVelocity().Length(), i);
 
-        if(engineSpeedBasedOnGear > GetVehicleProperty(vehicle::properties::MaximumEngineSpeed) || engineSpeedBasedOnGear < GetVehicleProperty(vehicle::properties::MinimumEngineSpeed))
+        if(engineSpeedBasedOnGear > units::angular_velocity::revolutions_per_minute_t(GetVehicleProperty(vehicle::properties::MaximumEngineSpeed)) || engineSpeedBasedOnGear < units::angular_velocity::revolutions_per_minute_t(GetVehicleProperty(vehicle::properties::MinimumEngineSpeed)))
         {
             continue;
         }
 
-        const double interpolatedEngineTorque = InterpolateEngineTorqueBasedOnSpeed(engineSpeedBasedOnGear);
+        const auto interpolatedEngineTorque = InterpolateEngineTorqueBasedOnSpeed(engineSpeedBasedOnGear);
 
-        double engineTorqueBasedOnGearRatio = interpolatedEngineTorque * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(i));
+        const units::torque::newton_meter_t engineTorqueBasedOnGearRatio = interpolatedEngineTorque * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(i));
         engineTorquesBasedOnGearRatios.push_back(engineTorqueBasedOnGearRatio);
     }
 
     return engineTorquesBasedOnGearRatios;
 }
 
-double LimiterAccelerationVehicleComponentsImplementation::CalculateEngineSpeedBasedOnGear(const double &currentVelocity, const size_t &gear)
+units::angular_velocity::revolutions_per_minute_t LimiterAccelerationVehicleComponentsImplementation::CalculateEngineSpeedBasedOnGear(const units::velocity::meters_per_second_t &currentVelocity, const size_t &gear)
 {
-    const double engineSpeed = currentVelocity * GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(gear)) / (M_PI * vehicleModelParameters.rearAxle.wheelDiameter) * 60.0;
+    const units::angular_velocity::revolutions_per_minute_t engineSpeed = 1_rad * currentVelocity * GetVehicleProperty(vehicle::properties::AxleRatio) * GetVehicleProperty(vehicle::properties::GearRatio+std::to_string(gear)) / (0.5 * vehicleModelParameters.rear_axle.wheel_diameter);
     return engineSpeed;
 }
 
 void LimiterAccelerationVehicleComponentsImplementation::PrepareReferences()
 {
-    const double& maxEngineTorque = GetVehicleProperty(vehicle::properties::MaximumEngineTorque);
-    const double& maxEngineSpeed = GetVehicleProperty(vehicle::properties::MaximumEngineSpeed);
-    const double& minEngineSpeed = GetVehicleProperty(vehicle::properties::MinimumEngineSpeed);
+    const auto& maxEngineTorque = units::torque::newton_meter_t(GetVehicleProperty(vehicle::properties::MaximumEngineTorque));
+    const auto& maxEngineSpeed = units::angular_velocity::revolutions_per_minute_t(GetVehicleProperty(vehicle::properties::MaximumEngineSpeed));
+    const auto& minEngineSpeed = units::angular_velocity::revolutions_per_minute_t(GetVehicleProperty(vehicle::properties::MinimumEngineSpeed));
 
     engineTorqueReferences = {0.5 * maxEngineTorque,
                               1.0 * maxEngineTorque,
                               1.0 * maxEngineTorque,
                               1.0 * maxEngineTorque,
-                              1.0 * maxEngineTorque / maxEngineSpeed * 5000.0};
+                              1.0 * maxEngineTorque / maxEngineSpeed * 5000.0_rpm};
 
     engineSpeedReferences = {minEngineSpeed,
-                             1350,
-                             4600,
-                             5000,
+                             1350_rpm,
+                             4600_rpm,
+                             5000_rpm,
                              maxEngineSpeed};
 }
 
-double LimiterAccelerationVehicleComponentsImplementation::CalculateAccelerationLimit()
+units::acceleration::meters_per_second_squared_t LimiterAccelerationVehicleComponentsImplementation::CalculateAccelerationLimit()
 {
-    const double currentVelocity = GetAgent()->GetVelocity().Length();
+    const auto currentVelocity = GetAgent()->GetVelocity().Length();
 
     const auto &engineTorquesBasedOnGearRatios = PrepareEngineTorqueVectorBasedOnGearRatios();
 
@@ -205,20 +206,20 @@ double LimiterAccelerationVehicleComponentsImplementation::CalculateAcceleration
         return oneG;
     }
 
-    const double &engineTorqueBasedOnVelocity = *(std::max_element(engineTorquesBasedOnGearRatios.begin(), engineTorquesBasedOnGearRatios.end()));
+    const auto &engineTorqueBasedOnVelocity = *(std::max_element(engineTorquesBasedOnGearRatios.begin(), engineTorquesBasedOnGearRatios.end()));
 
-    const double forceAtWheel = engineTorqueBasedOnVelocity * GetVehicleProperty(vehicle::properties::AxleRatio) / (0.5 * vehicleModelParameters.rearAxle.wheelDiameter);
-    const double forceRoll = GetVehicleProperty(vehicle::properties::Mass) * oneG * rollFrictionCoefficient;
-    const double forceAir = (airResistance / 2) * GetVehicleProperty(vehicle::properties::FrontSurface) * GetVehicleProperty(vehicle::properties::AirDragCoefficient) * std::pow(currentVelocity, 2);
+    const units::force::newton_t forceAtWheel = engineTorqueBasedOnVelocity * GetVehicleProperty(vehicle::properties::AxleRatio) / (0.5 * vehicleModelParameters.rear_axle.wheel_diameter);
+    const units::force::newton_t forceRoll = vehicleModelParameters.mass * oneG * rollFrictionCoefficient;
+    const units::force::newton_t forceAir = (airResistance / 2) * units::area::square_meter_t(GetVehicleProperty(vehicle::properties::FrontSurface)) * GetVehicleProperty(vehicle::properties::AirDragCoefficient) * units::math::pow<2>(currentVelocity);
 
-    const double accelerationLimit = (forceAtWheel - forceRoll - forceAir) / GetVehicleProperty(vehicle::properties::Mass);
+    const units::acceleration::meters_per_second_squared_t accelerationLimit = (forceAtWheel - forceRoll - forceAir) / vehicleModelParameters.mass;
 
     return accelerationLimit;
 }
 
-double LimiterAccelerationVehicleComponentsImplementation::CalculateDecelerationLimit()
+units::acceleration::meters_per_second_squared_t LimiterAccelerationVehicleComponentsImplementation::CalculateDecelerationLimit()
 {
-    const double decelerationLimit = GetWorld()->GetFriction() * GetVehicleProperty(vehicle::properties::FrictionCoefficient) * (-oneG);
+    const units::acceleration::meters_per_second_squared_t decelerationLimit = GetWorld()->GetFriction() * GetVehicleProperty(vehicle::properties::FrictionCoefficient) * (-oneG);
 
     return decelerationLimit;
 }
diff --git a/sim/src/components/LimiterAccVehComp/src/limiterAccVehCompImpl.h b/sim/src/components/LimiterAccVehComp/src/limiterAccVehCompImpl.h
index 7662ecda1fded2fa3edeb945519fb370755211ce..37d8e973fe9fc3cc16f9183952024721ec6606c4 100644
--- a/sim/src/components/LimiterAccVehComp/src/limiterAccVehCompImpl.h
+++ b/sim/src/components/LimiterAccVehComp/src/limiterAccVehCompImpl.h
@@ -106,29 +106,29 @@ public:
 private:
     double GetVehicleProperty(const std::string& propertyName);
 
-    double InterpolateEngineTorqueBasedOnSpeed(const double &engineSpeed);
+    units::torque::newton_meter_t InterpolateEngineTorqueBasedOnSpeed(const units::angular_velocity::revolutions_per_minute_t &engineSpeed);
 
-    std::vector<double> PrepareEngineTorqueVectorBasedOnGearRatios();
+    std::vector<units::torque::newton_meter_t> PrepareEngineTorqueVectorBasedOnGearRatios();
 
-    double CalculateEngineSpeedBasedOnGear(const double &currentVelocity,
+    units::angular_velocity::revolutions_per_minute_t CalculateEngineSpeedBasedOnGear(const units::velocity::meters_per_second_t &currentVelocity,
                                            const size_t &gear);
 
     void PrepareReferences();
-    double CalculateAccelerationLimit();
-    double CalculateDecelerationLimit();
+    units::acceleration::meters_per_second_squared_t CalculateAccelerationLimit();
+    units::acceleration::meters_per_second_squared_t CalculateDecelerationLimit();
 
     ComponentState componentState {ComponentState::Armed};
 
     const double twoPI {2.0 * M_PI};
-    const double oneG {9.81}; //mps^2
+    const units::acceleration::meters_per_second_squared_t oneG {9.81}; //mps^2
     const double rollFrictionCoefficient {0.015};
-    const double airResistance {1.2};
+    const units::density::kilograms_per_cubic_meter_t airResistance {1.2};
 
-    VehicleModelParameters vehicleModelParameters;
+    mantle_api::VehicleProperties vehicleModelParameters;
 
-    std::vector<double> engineTorqueReferences;
-    std::vector<double> engineSpeedReferences;
+    std::vector<units::torque::newton_meter_t> engineTorqueReferences;
+    std::vector<units::angular_velocity::revolutions_per_minute_t> engineSpeedReferences;
 
-    double incomingAcceleration {0.0};
-    double outgoingAcceleration {0.0};
+    units::acceleration::meters_per_second_squared_t incomingAcceleration {0.0};
+    units::acceleration::meters_per_second_squared_t outgoingAcceleration {0.0};
 };
diff --git a/sim/src/components/OpenScenarioActions/CMakeLists.txt b/sim/src/components/OpenScenarioActions/CMakeLists.txt
deleted file mode 100644
index 7208621c304fbbce9192b316400c15a132f8ff77..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/CMakeLists.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-################################################################################
-# Copyright (c) 2020-2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# http://www.eclipse.org/legal/epl-2.0.
-#
-# SPDX-License-Identifier: EPL-2.0
-################################################################################
-set(COMPONENT_NAME OpenScenarioActions)
-
-add_compile_definitions(OPENSCENARIO_ACTIONS_LIBRARY)
-
-add_openpass_target(
-  NAME ${COMPONENT_NAME} TYPE library LINKAGE shared COMPONENT module
-
-  HEADERS
-    openScenarioActions.h
-    src/oscActionsCalculation.h
-    src/openScenarioActionsImpl.h
-    src/oscActionsCalculation.h
-    src/actionTransformRepository.h
-    src/transformerBase.h
-    src/transformTrajectory.h
-    src/transformLaneChange.h
-    src/transformSpeedAction.h
-    src/transformAcquirePosition.h
-    src/transformDefaultCustomCommandAction.h
-
-  SOURCES
-    openScenarioActions.cpp
-    src/oscActionsCalculation.cpp
-    src/openScenarioActionsImpl.cpp
-    src/oscActionsCalculation.cpp
-    src/transformLaneChange.cpp
-    src/transformSpeedAction.cpp
-    src/transformAcquirePosition.cpp
-    src/transformDefaultCustomCommandAction.cpp
-
-  LIBRARIES
-    Qt5::Core
-)
diff --git a/sim/src/components/OpenScenarioActions/openScenarioActions.cpp b/sim/src/components/OpenScenarioActions/openScenarioActions.cpp
deleted file mode 100644
index f3a1d398f9d5d40086a6daa6f8549e800001ec1f..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/openScenarioActions.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** @file  OpenScenarioActions.cpp */
-//-----------------------------------------------------------------------------
-
-#include "openScenarioActions.h"
-
-#include "src/openScenarioActionsImpl.h"
-
-const std::string Version = "0.1.0";
-static const CallbackInterface *Callbacks = nullptr;
-
-extern "C" OPENSCENARIO_ACTIONS_SHARED_EXPORT const std::string &OpenPASS_GetVersion()
-{
-    return Version;
-}
-
-extern "C" OPENSCENARIO_ACTIONS_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance(
-    std::string componentName,
-    bool isInit,
-    int priority,
-    int offsetTime,
-    int responseTime,
-    int cycleTime,
-    StochasticsInterface *stochastics,
-    WorldInterface *world,
-    const ParameterInterface *parameters,
-    PublisherInterface *const publisher,
-    AgentInterface *agent,
-    const CallbackInterface *callbacks,
-    core::EventNetworkInterface *const eventNetwork)
-{
-    Callbacks = callbacks;
-
-    try
-    {
-        return (ModelInterface *)(new (std::nothrow) OpenScenarioActionsImplementation(
-            componentName,
-            isInit,
-            priority,
-            offsetTime,
-            responseTime,
-            cycleTime,
-            stochastics,
-            world,
-            parameters,
-            publisher,
-            callbacks,
-            agent,
-            eventNetwork));
-    }
-    catch (const std::runtime_error &ex)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
-        }
-
-        return nullptr;
-    }
-    catch (...)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-        }
-
-        return nullptr;
-    }
-}
-
-extern "C" OPENSCENARIO_ACTIONS_SHARED_EXPORT void OpenPASS_DestroyInstance(ModelInterface *implementation)
-{
-    delete (OpenScenarioActionsImplementation *)implementation;
-}
-
-extern "C" OPENSCENARIO_ACTIONS_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterface *implementation,
-                                                                        int localLinkId,
-                                                                        const std::shared_ptr<SignalInterface const> &data,
-                                                                        int time)
-{
-    try
-    {
-        implementation->UpdateInput(localLinkId, data, time);
-    }
-    catch (const std::runtime_error &ex)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
-        }
-
-        return false;
-    }
-    catch (...)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-        }
-
-        return false;
-    }
-
-    return true;
-}
-
-extern "C" OPENSCENARIO_ACTIONS_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterface *implementation,
-                                                                         int localLinkId,
-                                                                         std::shared_ptr<SignalInterface const> &data,
-                                                                         int time)
-{
-    try
-    {
-        implementation->UpdateOutput(localLinkId, data, time);
-    }
-    catch (const std::runtime_error &ex)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
-        }
-
-        return false;
-    }
-    catch (...)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-        }
-
-        return false;
-    }
-
-    return true;
-}
-
-extern "C" OPENSCENARIO_ACTIONS_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *implementation,
-                                                                    int time)
-{
-    try
-    {
-        implementation->Trigger(time);
-    }
-    catch (const std::runtime_error &ex)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
-        }
-
-        return false;
-    }
-    catch (...)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-        }
-
-        return false;
-    }
-
-    return true;
-}
diff --git a/sim/src/components/OpenScenarioActions/openScenarioActions.h b/sim/src/components/OpenScenarioActions/openScenarioActions.h
deleted file mode 100644
index 1a42986f8bba5468a929f0d7e76d6ceadb60e174..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/openScenarioActions.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** @file  OpenScenarioActions.h
-*	@brief This file provides the exported methods.
-*
-*   This file provides the exported methods which are available outside of the library. */
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <QtCore/qglobal.h>
-
-#if defined(OPENSCENARIO_ACTIONS_LIBRARY)
-#define OPENSCENARIO_ACTIONS_SHARED_EXPORT Q_DECL_EXPORT
-#else
-#define OPENSCENARIO_ACTIONS_SHARED_EXPORT Q_DECL_IMPORT
-#endif
-
-#include "include/modelInterface.h"
diff --git a/sim/src/components/OpenScenarioActions/src/actionTransformRepository.h b/sim/src/components/OpenScenarioActions/src/actionTransformRepository.h
deleted file mode 100644
index d5c1d6263bdb835712792111265860bdd067923a..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/actionTransformRepository.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include <map>
-#include <memory>
-#include <tuple>
-
-#include "include/agentInterface.h"
-#include "include/eventNetworkInterface.h"
-#include "include/signalInterface.h"
-#include "include/worldInterface.h"
-
-using Identifier = const std::string;
-using LinkId = int;
-using AgentAffected = bool;
-using Signal_ptr = std::shared_ptr<SignalInterface const>;
-using TransformResult = std::tuple<Identifier, bool, Signal_ptr>;
-using TransformResults = std::vector<TransformResult>;
-
-/// \brief Use this class as mixed set for fixed and auto registering transformations
-///
-/// When used as fixed resource simply call:
-/// ActionTransformRepository::Register(customTransformer);
-///
-/// This class can be used in conjunction with automatic compile time registration.
-/// Note that registration happens automatically without additional construction code,
-/// when the register method is used in a static assignment. This means that registering
-/// will be done if the translation unit holds an accodring statement (!)
-///
-/// Example:
-/// SomeClass.h -> static inline bool registered = ActionTransformRepository::Register(Transform);
-/// SomeClass.cpp is part of the translation unit
-///
-/// Effect:
-/// SomeOtherFile.cpp -> ActionTransformRepository::Register(customTransformer);
-class ActionTransformRepository final
-{
-    using TransformSignature = TransformResult (*)(const core::EventNetworkInterface *eventNetwork,
-                                                   WorldInterface *world,
-                                                   AgentInterface *agent,
-                                                   int cycleTime);
-
-public:
-    /// \brief Applies an event to signal transformation on each event for the internally defined identifier
-    /// \param args Relayed to the registered transformer
-    /// \return TransformResult holding a list of
-    ///         identifiers (for link id assignment),
-    ///         update state (does the current agent need an update),
-    ///         and signal (must not be nullptr)
-    template <typename... Args>
-    static TransformResults Transform(Args... args)
-    {
-        TransformResults transformedActions;
-        for (const auto &transform : repository())
-        {
-            auto [identifier, agent_is_affected, signal] = transform(std::forward<Args>(args)...);
-            transformedActions.emplace_back(identifier, agent_is_affected, signal);
-        }
-        return transformedActions;
-    }
-
-    /// \brief Register a new transformation
-    /// \param transform
-    /// \return true
-    static bool Register(TransformSignature transform)
-    {
-        repository().emplace_back(transform);
-        return true;
-    }
-
-private:
-    static std::vector<TransformSignature> &repository()
-    {
-        static std::vector<TransformSignature> repository;
-        return repository;
-    }
-};
diff --git a/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.cpp b/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.cpp
deleted file mode 100644
index f9406d600e2598c42b6c6b268a1c547fe8fb6df1..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *               2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-//! @file  ComponentControllerImplementation.cpp
-//! @brief This file contains the implementation of the header file
-//-----------------------------------------------------------------------------
-
-#include "openScenarioActionsImpl.h"
-
-#include "include/parameterInterface.h"
-
-OpenScenarioActionsImplementation::OpenScenarioActionsImplementation(std::string componentName,
-                                                                     bool isInit,
-                                                                     int priority,
-                                                                     int offsetTime,
-                                                                     int responseTime,
-                                                                     int cycleTime,
-                                                                     StochasticsInterface *stochastics,
-                                                                     WorldInterface *world,
-                                                                     const ParameterInterface *parameters,
-                                                                     PublisherInterface *const publisher,
-                                                                     const CallbackInterface *callbacks,
-                                                                     AgentInterface *agent,
-                                                                     core::EventNetworkInterface *const eventNetwork) :
-    UnrestrictedEventModelInterface(
-        componentName,
-        isInit,
-        priority,
-        offsetTime,
-        responseTime,
-        cycleTime,
-        stochastics,
-        world,
-        parameters,
-        publisher,
-        callbacks,
-        agent,
-        eventNetwork)
-{
-    if (parameters)
-    {
-        const auto customTransformerLinkAssignment = parameters->GetParametersInt();
-        for (auto [key, value] : customTransformerLinkAssignment)
-        {
-            linkIdMapping.emplace(key, value);
-        }
-    }
-}
-
-void OpenScenarioActionsImplementation::UpdateInput(int, const std::shared_ptr<const SignalInterface> &, int)
-{
-}
-
-void OpenScenarioActionsImplementation::UpdateOutput(LinkId localLinkId, std::shared_ptr<SignalInterface const> &data, [[maybe_unused]] int time)
-{
-    bool link_validated{false};
-    bool update_sent{false};
-    std::shared_ptr<SignalInterface const> unchanged_state{nullptr};
-
-    // Transformers are allowed to write onto the same link ids
-    // Yet, they are not allowed to write at the same time
-    // Further, on every update, data needs to be sent, even if there is no action available
-    // This data needs to carry the correct subtype of the SignalInterface (e.g TrajectorySignal)
-    // So every transformer delivers also an empty type, if nothing is to
-    // Case 1: Transformer1 and Transformer2 has nothing to do = 2 entries, each with an empty object => relay only one
-    // Case 2: Only one Transformer has something to do = still 2 entries => send only the active one
-    // Case 3: Transformer1 and Transformer2 has something to do = 2 entries => report error
-    for (auto [identifier, update_for_current_agent, signal] : pendingSignals)
-    {
-        if (linkIdMapping.find(identifier) == linkIdMapping.end())
-        {
-            if (update_for_current_agent)
-            {
-                ThrowUnregisteredIdentifier(identifier);
-            }
-            else
-            {
-                continue;
-            }
-        }
-
-        if (localLinkId != linkIdMapping[identifier])
-        {
-            continue;
-        }
-
-        if (!link_validated)
-        {
-            unchanged_state = signal;
-            link_validated = true;
-        }
-
-        if (update_for_current_agent)
-        {
-            if (update_sent)
-            {
-                ThrowOnTooManySignals(localLinkId);
-            }
-
-            update_sent = true;
-            data = signal;
-        }
-    }
-
-    if (link_validated && !update_sent)
-    {
-        data = unchanged_state;
-    }
-
-    if (!link_validated)
-    {
-        ThrowOnInvalidLinkId(localLinkId);
-    }
-}
-
-void OpenScenarioActionsImplementation::Trigger([[maybe_unused]] int time)
-{
-    pendingSignals = ActionTransformRepository::Transform(GetEventNetwork(), GetWorld(), GetAgent(), GetCycleTime());
-}
-
-void OpenScenarioActionsImplementation::ThrowUnregisteredIdentifier(const std::string& identifier)
-{
-    const std::string msg = std::string(COMPONENTNAME) + " Cannot find linkId assignment for identifier " + identifier;
-    LOG(CbkLogLevel::Error, msg);
-    throw std::runtime_error(msg);
-}
-
-void OpenScenarioActionsImplementation::ThrowOnTooManySignals(int localLinkId)
-{
-    const std::string msg = std::string(COMPONENTNAME) + " More than one signal for localLinkId " + std::to_string(localLinkId);
-    LOG(CbkLogLevel::Error, msg);
-    throw std::runtime_error(msg);
-}
-
-void OpenScenarioActionsImplementation::ThrowOnInvalidLinkId(int localLinkId)
-{
-    const std::string msg = std::string(COMPONENTNAME) + " No signal for localLinkId " + std::to_string(localLinkId);
-    LOG(CbkLogLevel::Error, msg);
-    throw std::runtime_error(msg);
-}
diff --git a/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.h b/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.h
deleted file mode 100644
index 3b9351e1abd30b8a62e463f564b15130bc280675..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *               2020-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include <map>
-
-#include "include/modelInterface.h"
-#include "transformAcquirePosition.h"
-#include "transformDefaultCustomCommandAction.h"
-#include "transformLaneChange.h"
-#include "transformSpeedAction.h"
-#include "transformTrajectory.h"
-/**
-* \brief Relays triggered OpenScenario actions as signals to other components
-*
-* When used in conjunction with autoregistering transformers (\sa actionTransformRepository),
-* the linkIdMapping has to be provided via the parameter interface.
-*
-* That means that when a transformer for e.g. event X is autoregistered,
-* a parameter for mapping X::Topic to a linkId needs to be defined.
-*
-* Syntax:
-* <parameter>
-*     <id>THE_TOPIC</id>
-*     <type>int</type>
-*     <unit/>
-*     <value>THE_LINK_ID</value>
-* </parameter>
-*
-* \ingroup OpenScenarioActions
-*/
-class OpenScenarioActionsImplementation : public UnrestrictedEventModelInterface
-{
-public:
-    static constexpr char COMPONENTNAME[]{"OpenScenarioActions"};
-
-    OpenScenarioActionsImplementation(std::string componentName,
-                                      bool isInit,
-                                      int priority,
-                                      int offsetTime,
-                                      int responseTime,
-                                      int cycleTime,
-                                      StochasticsInterface *stochastics,
-                                      WorldInterface *world,
-                                      const ParameterInterface *parameters,
-                                      PublisherInterface *const publisher,
-                                      const CallbackInterface *callbacks,
-                                      AgentInterface *agent,
-                                      core::EventNetworkInterface *const eventNetwork);
-
-    void UpdateInput(int, const std::shared_ptr<SignalInterface const> &, int) override;
-    void UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const> &data, int time) override;
-    void Trigger(int time) override;
-
-    using TrajectorySignalLinkId = std::integral_constant<LinkId, 0>;
-    using SpeedActionSignalLinkId = std::integral_constant<LinkId, 3>;
-    using AcquirePositionSignalLinkId = std::integral_constant<LinkId, 4>;
-    using StringSignalLinkId = std::integral_constant<LinkId, 5>;
-
-private:
-    [[noreturn]] void ThrowUnregisteredIdentifier(const std::string &identifier);
-    [[noreturn]] void ThrowOnTooManySignals(LinkId localLinkId);
-    [[noreturn]] void ThrowOnInvalidLinkId(LinkId localLinkId);
-
-    TransformResults pendingSignals;
-
-    inline static std::vector<bool> registeredActions{
-        ActionTransformRepository::Register(openScenario::transformation::Trajectory::Transform),
-        ActionTransformRepository::Register(openScenario::transformation::LaneChange::Transform),
-        ActionTransformRepository::Register(openScenario::transformation::SpeedAction::Transform),
-        ActionTransformRepository::Register(openScenario::transformation::AcquirePosition::Transform),
-        ActionTransformRepository::Register(openScenario::transformation::DefaultCustomCommandAction::Transform)};
-
-    std::map<const std::string, LinkId> linkIdMapping{
-        {openpass::events::TrajectoryEvent::TOPIC, TrajectorySignalLinkId::value},
-        {openpass::events::LaneChangeEvent::TOPIC, TrajectorySignalLinkId::value},
-        {openpass::events::SpeedActionEvent::TOPIC, SpeedActionSignalLinkId::value},
-        {openpass::events::AcquirePositionEvent::TOPIC, AcquirePositionSignalLinkId::value},
-        {openpass::events::DefaultCustomCommandActionEvent::TOPIC, StringSignalLinkId::value}};
-};
diff --git a/sim/src/components/OpenScenarioActions/src/oscActionsCalculation.cpp b/sim/src/components/OpenScenarioActions/src/oscActionsCalculation.cpp
deleted file mode 100644
index 7bde36824fee5a50564e41c1d1cdf529961d53bb..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/oscActionsCalculation.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "oscActionsCalculation.h"
-
-OscActionsCalculation::OscActionsCalculation(const WorldInterface *world) :
-    world(world)
-{
-}
-
-openScenario::Trajectory OscActionsCalculation::CalculateSinusiodalLaneChange(double deltaS, double deltaT, double deltaTime, double timeStep, GlobalRoadPosition startPosition, double startTime) const
-{
-    openScenario::Trajectory trajectory;
-    double startT = startPosition.roadPosition.t + (startPosition.laneId > 0 ? 0.5 : -0.5) * world->GetLaneWidth(startPosition.roadId, startPosition.laneId, startPosition.roadPosition.s);
-    if (startPosition.laneId > 0)
-    {
-        for (int laneId = 1; laneId < startPosition.laneId; ++laneId)
-        {
-            startT += world->GetLaneWidth(startPosition.roadId, laneId, startPosition.roadPosition.s);
-        }
-    }
-    else
-    {
-        for (int laneId = -1; laneId > startPosition.laneId; --laneId)
-        {
-            startT -= world->GetLaneWidth(startPosition.roadId, laneId, startPosition.roadPosition.s);
-        }
-    }
-    for (double timeSinceStart = 0; timeSinceStart <= deltaTime + 0.5 * timeStep; timeSinceStart += timeStep)
-    {
-        timeSinceStart = std::min(timeSinceStart, deltaTime); //For reducing rounding errors we also consider an additional point if difference of last time to deltaTime was at most half a timeStep
-        double alpha = timeSinceStart / deltaTime;            // Position on the sinus curve (0 = start, 1 = end)
-        double s = startPosition.roadPosition.s + alpha * deltaS;
-        double t = startT + deltaT * 0.5 * (1 - std::cos(alpha * M_PI));
-        double yaw = deltaT / deltaS * M_PI * 0.5 * std::sin(alpha * M_PI);
-        auto worldPosition = world->RoadCoord2WorldCoord({s, t, yaw}, startPosition.roadId);
-        openScenario::TrajectoryPoint nextPoint{startTime + timeSinceStart, worldPosition.xPos, worldPosition.yPos, worldPosition.yawAngle};
-        trajectory.points.push_back(nextPoint);
-    }
-    return trajectory;
-}
diff --git a/sim/src/components/OpenScenarioActions/src/oscActionsCalculation.h b/sim/src/components/OpenScenarioActions/src/oscActionsCalculation.h
deleted file mode 100644
index 52d1ec7d437f8bc155c6231d3ec19a4d84926fd9..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/oscActionsCalculation.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/openScenarioDefinitions.h"
-#include "include/worldInterface.h"
-
-//! This class makes calculations for the OpenScenarioActions module
-class OscActionsCalculation
-{
-public:
-    OscActionsCalculation(const WorldInterface *world);
-
-    //! Calculates a trajectory for a lane change with shape "sinusiodal"
-    //! The result has constant speed in s
-    //!
-    //! \param deltaS           length of the trajectory in s
-    //! \param deltaT           length of the trajectory in t
-    //! \param deltaTime        time of the trajectory
-    //! \param timeStep         delta time between two trajectory points
-    //! \param startPosition    start point of the trajectory
-    //! \param startTime        time of the first trajectory point
-    //! \return     sinusiodal lane change trajectory in world coordinates
-    openScenario::Trajectory CalculateSinusiodalLaneChange(double deltaS, double deltaT, double deltaTime, double timeStep, GlobalRoadPosition startPosition, double startTime) const;
-
-private:
-    const WorldInterface *world;
-};
diff --git a/sim/src/components/OpenScenarioActions/src/transformAcquirePosition.cpp b/sim/src/components/OpenScenarioActions/src/transformAcquirePosition.cpp
deleted file mode 100644
index 5d9ca4eb16cca6b2b7b4376af9125cbffde927bf..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/transformAcquirePosition.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "transformAcquirePosition.h"
-
-std::shared_ptr<AcquirePositionSignal>
-openScenario::transformation::AcquirePosition::ConvertToSignal(const openpass::events::AcquirePositionEvent &event,
-                                                               WorldInterface *world,
-                                                               AgentInterface *agent,
-                                                               int cycleTime)
-{
-    return std::make_shared<AcquirePositionSignal>(ComponentState::Acting, event.position);
-}
diff --git a/sim/src/components/OpenScenarioActions/src/transformAcquirePosition.h b/sim/src/components/OpenScenarioActions/src/transformAcquirePosition.h
deleted file mode 100644
index a387fae883e734ccf2753dd910628012f5087133..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/transformAcquirePosition.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include <src/common/acquirePositionSignal.h>
-#include <src/common/events/acquirePositionEvent.h>
-
-#include "transformerBase.h"
-
-namespace openScenario::transformation {
-
-struct AcquirePosition : public TransformerBase<AcquirePosition, AcquirePositionSignal, openpass::events::AcquirePositionEvent>
-{
-    static std::shared_ptr<AcquirePositionSignal> ConvertToSignal(const openpass::events::AcquirePositionEvent &event,
-                                                                  WorldInterface *world,
-                                                                  AgentInterface *agent,
-                                                                  int cycleTime);
-};
-
-} // namespace openScenario::transformation
diff --git a/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.cpp b/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.cpp
deleted file mode 100644
index aa52abd0dfb518b5cda55fac9528793130c773b9..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "transformDefaultCustomCommandAction.h"
-
-namespace openScenario::transformation {
-
-std::shared_ptr<StringSignal> DefaultCustomCommandAction::ConvertToSignal(const openpass::events::DefaultCustomCommandActionEvent &event, WorldInterface *, AgentInterface *, int)
-{
-    return std::make_shared<StringSignal>(ComponentState::Acting, event.command);
-}
-
-} // namespace openScenario::transformation
diff --git a/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.h b/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.h
deleted file mode 100644
index 65b038c1ced7adac230b46e1235527fa98e1dfb8..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/events/defaultCustomCommandActionEvent.h"
-#include "common/stringSignal.h"
-#include "transformerBase.h"
-
-namespace openScenario::transformation {
-
-struct DefaultCustomCommandAction : public TransformerBase<DefaultCustomCommandAction, StringSignal, openpass::events::DefaultCustomCommandActionEvent>
-{
-    static std::shared_ptr<StringSignal> ConvertToSignal(const openpass::events::DefaultCustomCommandActionEvent &event,
-                                                         WorldInterface *,
-                                                         AgentInterface *,
-                                                         int);
-};
-
-} // namespace openScenario::transformation
diff --git a/sim/src/components/OpenScenarioActions/src/transformLaneChange.h b/sim/src/components/OpenScenarioActions/src/transformLaneChange.h
deleted file mode 100644
index ab44c7e500deab890d9993005fe430bd376847b1..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/transformLaneChange.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/events/laneChangeEvent.h"
-#include "common/trajectorySignal.h"
-#include "transformerBase.h"
-
-namespace openScenario::transformation {
-
-struct LaneChange : public TransformerBase<LaneChange, TrajectorySignal, openpass::events::LaneChangeEvent>
-{
-    static std::shared_ptr<TrajectorySignal> ConvertToSignal(const openpass::events::LaneChangeEvent &event,
-                                                             WorldInterface *world,
-                                                             AgentInterface *agent,
-                                                             int cycleTime);
-};
-
-} // namespace openScenario::transformation
diff --git a/sim/src/components/OpenScenarioActions/src/transformSpeedAction.h b/sim/src/components/OpenScenarioActions/src/transformSpeedAction.h
deleted file mode 100644
index 553c3c26c1ec3e620d2dc3e719651d54ba57b1d4..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/transformSpeedAction.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/events/speedActionEvent.h"
-#include "common/speedActionSignal.h"
-#include "transformerBase.h"
-
-namespace openScenario::transformation {
-
-struct SpeedAction : public TransformerBase<SpeedAction, SpeedActionSignal, openpass::events::SpeedActionEvent>
-{
-    static std::shared_ptr<SpeedActionSignal> ConvertToSignal(const openpass::events::SpeedActionEvent &event,
-                                                              WorldInterface *world,
-                                                              AgentInterface *agent,
-                                                              int cycleTime);
-};
-
-} // namespace openScenario::transformation
diff --git a/sim/src/components/OpenScenarioActions/src/transformTrajectory.h b/sim/src/components/OpenScenarioActions/src/transformTrajectory.h
deleted file mode 100644
index 836aa29a0df2a4e38c99b4736bc06878755c25ac..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/transformTrajectory.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/events/trajectoryEvent.h"
-#include "common/trajectorySignal.h"
-#include "transformerBase.h"
-
-namespace openScenario::transformation {
-
-struct Trajectory : public TransformerBase<Trajectory, TrajectorySignal, openpass::events::TrajectoryEvent>
-{
-    static std::shared_ptr<TrajectorySignal> ConvertToSignal(const openpass::events::TrajectoryEvent &event, WorldInterface *, AgentInterface *, int)
-    {
-        return std::make_shared<TrajectorySignal>(ComponentState::Acting, event.trajectory);
-    }
-};
-
-} // namespace openScenario::transformation
diff --git a/sim/src/components/OpenScenarioActions/src/transformerBase.h b/sim/src/components/OpenScenarioActions/src/transformerBase.h
deleted file mode 100644
index e33935688fcbe333d35091c109de7ec7c342ccfb..0000000000000000000000000000000000000000
--- a/sim/src/components/OpenScenarioActions/src/transformerBase.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include <tuple>
-
-#include "include/agentInterface.h"
-#include "include/eventNetworkInterface.h"
-#include "include/worldInterface.h"
-#include "actionTransformRepository.h"
-
-namespace openScenario::transformation {
-
-/// \brief CRTP Base class for Transformer
-///
-/// This class encapsulates the extraction of a specific TriggeringEvent from the eventNetwork,
-/// so that the derived classes only need to take care of the tranformation to the Signal itself
-template <typename T, typename Signal, typename TriggeringEvent>
-class TransformerBase
-{
-public:
-    /// \brief Entry point for the transformation
-    /// \param eventNetwork Necessary for extracting the TriggeringEvent
-    /// \param world     Releayed to the actual transformer
-    /// \param agent     Releayed to the actual transformer
-    /// \param cycleTime Releayed to the actual transformer
-    /// \return Transform result for the given triggering event
-    static TransformResult Transform(const core::EventNetworkInterface *eventNetwork,
-                                     WorldInterface *world,
-                                     AgentInterface *agent,
-                                     int cycleTime)
-    {
-        const auto agentId = agent->GetId();
-        const auto triggers = eventNetwork->GetTrigger(TriggeringEvent::TOPIC);
-
-        for (const auto &trigger : triggers)
-        {
-            if (TriggeringEvent const *genericTrigger = dynamic_cast<TriggeringEvent const *>(trigger);
-                genericTrigger && AgentIsAffected(agentId, genericTrigger))
-            {
-                return {TriggeringEvent::TOPIC, true, T::ConvertToSignal(*genericTrigger, world, agent, cycleTime)};
-            }
-        }
-        return {TriggeringEvent::TOPIC, false, std::make_shared<Signal const>()};
-    }
-
-private:
-    /// \brief Checks if the agentId is affected of the triggering event
-    /// \param agentId  the current agent id
-    /// \param event    the triggering event
-    /// \return true if the agentId is contained in the acting agents
-    static bool AgentIsAffected(const int agentId, EventInterface const *event)
-    {
-        const auto &actingEntities = event->GetActingAgents().entities;
-        return std::find(actingEntities.cbegin(), actingEntities.cend(), agentId) != actingEntities.end();
-    }
-};
-
-} // namespace openScenario::transformation
diff --git a/sim/src/components/Parameters_Vehicle/src/parameters_vehicleImpl.cpp b/sim/src/components/Parameters_Vehicle/src/parameters_vehicleImpl.cpp
index a61ddc4b082740ef5c130abc0d0a020af4f827f6..07608255ee8ec6414bd5c6b61fcf6b3ae6a8c1ed 100644
--- a/sim/src/components/Parameters_Vehicle/src/parameters_vehicleImpl.cpp
+++ b/sim/src/components/Parameters_Vehicle/src/parameters_vehicleImpl.cpp
@@ -46,6 +46,10 @@ ParametersVehicleImplementation::ParametersVehicleImplementation(
         callbacks,
         agent)
 {
+    if (agent->GetVehicleModelParameters()->type != mantle_api::EntityType::kVehicle)
+    {
+        throw std::runtime_error("Component " + componentName + " expects an entity of type Vehicle and VehicleProperties.");
+    }
 }
 
 void ParametersVehicleImplementation::UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const>& data,
@@ -67,7 +71,7 @@ void ParametersVehicleImplementation::UpdateOutput(int localLinkId, std::shared_
         {
             case 1:
                 // vehicle parameters
-                data = std::make_shared<ParametersVehicleSignal const>(GetAgent()->GetVehicleModelParameters());
+                data = std::make_shared<ParametersVehicleSignal const>(*(std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(GetAgent()->GetVehicleModelParameters())));
                 break;
 
             default:
diff --git a/sim/src/components/Sensor_Distance/sensor_distance_implementation.h b/sim/src/components/Sensor_Distance/sensor_distance_implementation.h
index cf2405d9c46a73dba33d50d44b2f7550397a3a43..95e37620d485ccfb7e0be107c60e89509af9720a 100644
--- a/sim/src/components/Sensor_Distance/sensor_distance_implementation.h
+++ b/sim/src/components/Sensor_Distance/sensor_distance_implementation.h
@@ -129,7 +129,7 @@ private:
     //! The distance to the next agent in front.
     double out_distanceToNextAgent = 0;
     //! The velocity of the agent.
-    double out_agentVelocity = 0;
+    units::velocity::meters_per_second_t out_agentVelocity = 0;
 };
 
 #endif // SENSOR_DISTANCE_IMPLEMENTATION_H
diff --git a/sim/src/components/Sensor_Driver/src/Signals/sensor_driverDefinitions.h b/sim/src/components/Sensor_Driver/src/Signals/sensor_driverDefinitions.h
index 971cb97d104944ee6129bad288a584505f886efd..f99fef1b4885918b8f6fe3765e16338835e85e20 100644
--- a/sim/src/components/Sensor_Driver/src/Signals/sensor_driverDefinitions.h
+++ b/sim/src/components/Sensor_Driver/src/Signals/sensor_driverDefinitions.h
@@ -28,21 +28,21 @@ struct ObjectInformation
     //! true if stationary object, false if agent
     bool isStatic {false};
     //! Absolute velocity of the agent (default if object is not an agent)
-    double absoluteVelocity {-999.0};
+    units::velocity::meters_per_second_t absoluteVelocity {-999.0};
     //! Acceleration of the agent (default if object is not an agent)
-    double acceleration {-999.0};
+    units::acceleration::meters_per_second_squared_t acceleration{-999.0};
     //! Heading relative to the street (default if not existing)
-    double heading {-999.0};
+    units::angle::radian_t heading {-999.0};
     //! Length of object (default if not existing)
-    double length {-999.0};
+    units::length::meter_t length {-999.0};
     //! Width of object (default if not existing)
-    double width {-999.0};
+    units::length::meter_t width {-999.0};
     //! Height of object (default if not existing)
-    double height {-999.0};
+    units::length::meter_t height {-999.0};
     //! Relative distance along the road (i.e in direction s) between own agent and object (default if not existing)
-    double relativeLongitudinalDistance {-999.0};
+    units::length::meter_t relativeLongitudinalDistance {-999.0};
     //! Relative distance at right angle to the road (i.e. in direction t) between own agent and object (default if not existing)
-    double relativeLateralDistance {-999.0};
+    units::length::meter_t relativeLateralDistance {-999.0};
 };
 
 //! This struct is used to trasport data of a lane concerning traffic rules as seen by the driver
@@ -60,30 +60,30 @@ struct LaneInformationGeometry
     //! Wether there is a lane on this position
     bool exists {false};
     //! Curvature at current s position (default if not existing)
-    double curvature {-999.0};
+    units::curvature::inverse_meter_t curvature {-999.0};
     //! Width at current s position (default if not existing)
-    double width {-999.0};
+    units::length::meter_t width {-999.0};
     //! Distance from current position to the end of the lane or infinity if the end is farther away than the visibility distance
-    double distanceToEndOfLane {-999.0};
+    units::length::meter_t distanceToEndOfLane {-999.0};
 };
 
 //! Data about the lane to left (in driving direction) of the mainLane
 struct OwnVehicleInformation
 {
     //! Absolute velocity of agent
-    double absoluteVelocity {-999.0};
+    units::velocity::meters_per_second_t absoluteVelocity {-999.0};
     //! Acceleration of agent
-    double acceleration {-999.0};
+    units::acceleration::meters_per_second_squared_t acceleration{-999.0};
     //! t-coordinate
-    double lateralPosition {-999.0};
+    units::length::meter_t lateralPosition {-999.0};
     //! Heading relative to lane
-    double heading {-999.0};
+    units::angle::radian_t heading {-999.0};
     //! Angle of the steering wheel
-    double steeringWheelAngle {-999.0};
+    units::angle::radian_t steeringWheelAngle {-999.0};
     //! Distance between the left front point and the left boundary of the lane it is in.
-    double distanceToLaneBoundaryLeft {-999.0};
+    units::length::meter_t distanceToLaneBoundaryLeft {-999.0};
     //! Distance between the right front point and the right boundary of the lane it is in.
-    double distanceToLaneBoundaryRight {-999.0};
+    units::length::meter_t distanceToLaneBoundaryRight {-999.0};
     //! Wether this agent has collided with another object
     bool collision {false};
 };
@@ -129,7 +129,7 @@ struct TrafficRuleInformation
 struct GeometryInformation
 {
     //! Current maximum visibility distance as specified by the world
-    double visibilityDistance {-999.0};
+    units::length::meter_t visibilityDistance {-999.0};
     //! Data about the lane to left (in driving direction) of the mainLane
     LaneInformationGeometry laneLeft;
     //! Data about the lane the where the middle of the front of the agent is (i.e. mainLane)
diff --git a/sim/src/components/Sensor_Driver/src/sensor_driverCalculations.cpp b/sim/src/components/Sensor_Driver/src/sensor_driverCalculations.cpp
index 6938281eec520f8a5ad0bf6b34ad29e88bdfd35b..31559c0e4743a6c0fdc147f24a955cf3021f2bbe 100644
--- a/sim/src/components/Sensor_Driver/src/sensor_driverCalculations.cpp
+++ b/sim/src/components/Sensor_Driver/src/sensor_driverCalculations.cpp
@@ -9,15 +9,15 @@
  ********************************************************************************/
 #include "sensor_driverCalculations.h"
 
-double SensorDriverCalculations::GetLateralDistanceToObject(const std::string& roadId, const AgentInterface *otherObject)
+units::length::meter_t SensorDriverCalculations::GetLateralDistanceToObject(const std::string& roadId, const AgentInterface *otherObject)
 {
     if (otherObject == nullptr)
     {
-        return INFINITY;
+        return units::length::meter_t(INFINITY);
     }
 
     const auto& otherReferencePoint = otherObject->GetRoadPosition(ObjectPointPredefined::Reference);
-    double lateralPositionOfOtherObject = otherReferencePoint.at(roadId).roadPosition.t;
+    const auto lateralPositionOfOtherObject = otherReferencePoint.at(roadId).roadPosition.t;
     if (otherReferencePoint.at(roadId).laneId == egoAgent.GetLaneIdFromRelative(0))
     {
         return lateralPositionOfOtherObject - egoAgent.GetPositionLateral();
@@ -30,5 +30,5 @@ double SensorDriverCalculations::GetLateralDistanceToObject(const std::string& r
     {
         return lateralPositionOfOtherObject - egoAgent.GetPositionLateral() - 0.5 * egoAgent.GetLaneWidth() - 0.5 * egoAgent.GetLaneWidth(-1);
     }
-    return INFINITY;
+    return units::length::meter_t(INFINITY);
 }
diff --git a/sim/src/components/Sensor_Driver/src/sensor_driverCalculations.h b/sim/src/components/Sensor_Driver/src/sensor_driverCalculations.h
index dfde155d91879efb3588fe4c3a72e90282f39ff8..d779f5782b188cdf036428972f86274c79c3fa6d 100644
--- a/sim/src/components/Sensor_Driver/src/sensor_driverCalculations.h
+++ b/sim/src/components/Sensor_Driver/src/sensor_driverCalculations.h
@@ -23,7 +23,7 @@ public:
     //! \brief Calculates the lateral distance (i.e. distance in t) between the own
     //! agent and another agent
     //!
-    double GetLateralDistanceToObject(const std::string& roadId, const AgentInterface *otherObject);
+    units::length::meter_t GetLateralDistanceToObject(const std::string& roadId, const AgentInterface *otherObject);
 
 private:
     const EgoAgentInterface& egoAgent;
diff --git a/sim/src/components/Sensor_Driver/src/sensor_driverImpl.cpp b/sim/src/components/Sensor_Driver/src/sensor_driverImpl.cpp
index d400f3ff426197d50540310b380471aabe5e248a..1190a586202a4b0fb55d1a14ee5ec435b0271373 100644
--- a/sim/src/components/Sensor_Driver/src/sensor_driverImpl.cpp
+++ b/sim/src/components/Sensor_Driver/src/sensor_driverImpl.cpp
@@ -13,27 +13,29 @@
 /** \file  SensorDriverImplementation.cpp */
 //-----------------------------------------------------------------------------
 
+#include "sensor_driverImpl.h"
+
 #include <memory>
+
 #include <qglobal.h>
 
-#include "include/worldInterface.h"
-#include "common/RoutePlanning/RouteCalculation.h"
-#include "sensor_driverImpl.h"
 #include "Signals/sensorDriverSignal.h"
+#include "common/RoutePlanning/RouteCalculation.h"
+#include "include/worldInterface.h"
 
 SensorDriverImplementation::SensorDriverImplementation(
-        std::string componentName,
-        bool isInit,
-        int priority,
-        int offsetTime,
-        int responseTime,
-        int cycleTime,
-        StochasticsInterface *stochastics,
-        WorldInterface *world,
-        const ParameterInterface *parameters,
-        PublisherInterface * const publisher,
-        const CallbackInterface *callbacks,
-        AgentInterface *agent) :
+    std::string componentName,
+    bool isInit,
+    int priority,
+    int offsetTime,
+    int responseTime,
+    int cycleTime,
+    StochasticsInterface *stochastics,
+    WorldInterface *world,
+    const ParameterInterface *parameters,
+    PublisherInterface *const publisher,
+    const CallbackInterface *callbacks,
+    AgentInterface *agent) :
     SensorInterface(
         componentName,
         isInit,
@@ -70,7 +72,7 @@ void SensorDriverImplementation::UpdateOutput(int localLinkId,
 
     try
     {
-        switch(localLinkId)
+        switch (localLinkId)
         {
         case 0:
             // driver sensor data
@@ -82,7 +84,7 @@ void SensorDriverImplementation::UpdateOutput(int localLinkId,
             throw std::runtime_error(msg);
         }
     }
-    catch(const std::bad_alloc&)
+    catch (const std::bad_alloc &)
     {
         const std::string msg = COMPONENTNAME + " could not instantiate signal";
         LOG(CbkLogLevel::Debug, msg);
@@ -114,7 +116,7 @@ bool SensorDriverImplementation::UpdateGraphPosition()
         const auto& referencePosition = egoAgent.GetReferencePointPosition();
         if (referencePosition)
         {
-            lastReferenceRoad = std::make_optional<RouteElement>(referencePosition->roadId, std::abs(referencePosition->roadPosition.hdg) <= M_PI_2);
+            lastReferenceRoad = std::make_optional<RouteElement>(referencePosition->roadId, std::abs(referencePosition->roadPosition.hdg.value()) <= M_PI_2);
             if (!world->IsDirectionalRoadExisting(lastReferenceRoad->roadId, lastReferenceRoad->inOdDirection))
             {
                 lastReferenceRoad->inOdDirection = !lastReferenceRoad->inOdDirection;
@@ -130,26 +132,26 @@ bool SensorDriverImplementation::UpdateGraphPosition()
 
 void SensorDriverImplementation::GetOwnVehicleInformation()
 {
-    ownVehicleInformation.absoluteVelocity              = GetAgent()->GetVelocity().Length();
-    ownVehicleInformation.acceleration                  = GetAgent()->GetAcceleration().Projection(GetAgent()->GetYaw());
-    ownVehicleInformation.lateralPosition               = egoAgent.GetPositionLateral();
-    ownVehicleInformation.heading                       = egoAgent.GetRelativeYaw();
-    ownVehicleInformation.steeringWheelAngle            = GetAgent()->GetSteeringWheelAngle();
-    ownVehicleInformation.distanceToLaneBoundaryLeft    = egoAgent.GetLaneRemainder(Side::Left);
-    ownVehicleInformation.distanceToLaneBoundaryRight   = egoAgent.GetLaneRemainder(Side::Right);
-    ownVehicleInformation.collision                     = GetAgent()->GetCollisionPartners().size() > 0;
+    ownVehicleInformation.absoluteVelocity = GetAgent()->GetVelocity().Length();
+    ownVehicleInformation.acceleration = GetAgent()->GetAcceleration().Projection(GetAgent()->GetYaw());
+    ownVehicleInformation.lateralPosition = egoAgent.GetPositionLateral();
+    ownVehicleInformation.heading = egoAgent.GetRelativeYaw();
+    ownVehicleInformation.steeringWheelAngle = GetAgent()->GetSteeringWheelAngle();
+    ownVehicleInformation.distanceToLaneBoundaryLeft = egoAgent.GetLaneRemainder(Side::Left);
+    ownVehicleInformation.distanceToLaneBoundaryRight = egoAgent.GetLaneRemainder(Side::Right);
+    ownVehicleInformation.collision = GetAgent()->GetCollisionPartners().size() > 0;
 }
 
 void SensorDriverImplementation::GetTrafficRuleInformation()
 {
-    const double visibilityDistance = GetWorld()->GetVisibilityDistance();
-    trafficRuleInformation.laneEgo    = GetTrafficRuleLaneInformationEgo();
-    trafficRuleInformation.laneLeft   = GetTrafficRuleLaneInformationLeft();
-    trafficRuleInformation.laneRight  = GetTrafficRuleLaneInformationRight();
+    const auto visibilityDistance = GetWorld()->GetVisibilityDistance();
+    trafficRuleInformation.laneEgo = GetTrafficRuleLaneInformationEgo();
+    trafficRuleInformation.laneLeft = GetTrafficRuleLaneInformationLeft();
+    trafficRuleInformation.laneRight = GetTrafficRuleLaneInformationRight();
     trafficRuleInformation.laneMarkingsLeft = egoAgent.GetLaneMarkingsInRange(visibilityDistance, Side::Left);
     trafficRuleInformation.laneMarkingsRight = egoAgent.GetLaneMarkingsInRange(visibilityDistance, Side::Right);
 
-    const auto laneIntervals = egoAgent.GetRelativeLanes(0.0);
+    const auto laneIntervals = egoAgent.GetRelativeLanes(0.0_m);
 
     if (laneIntervals.size() > 0)
     {
@@ -157,13 +159,13 @@ void SensorDriverImplementation::GetTrafficRuleInformation()
 
         for (auto relativeLane : relativeLanes)
         {
-            if(relativeLane.relativeId == 1)
+            if (relativeLane.relativeId == 1)
             {
                 trafficRuleInformation.laneMarkingsLeftOfLeftLane = egoAgent.GetLaneMarkingsInRange(visibilityDistance, Side::Left, 1);
             }
-            if(relativeLane.relativeId == -1)
+            if (relativeLane.relativeId == -1)
             {
-                trafficRuleInformation.laneMarkingsRightOfRightLane = egoAgent.GetLaneMarkingsInRange(visibilityDistance,Side::Right, -1);
+                trafficRuleInformation.laneMarkingsRightOfRightLane = egoAgent.GetLaneMarkingsInRange(visibilityDistance, Side::Right, -1);
             }
         }
     }
@@ -172,10 +174,10 @@ void SensorDriverImplementation::GetTrafficRuleInformation()
 LaneInformationTrafficRules SensorDriverImplementation::GetTrafficRuleLaneInformationEgo()
 {
     LaneInformationTrafficRules laneInformation;
-    const double visibilityDistance = GetWorld()->GetVisibilityDistance();
+    const auto visibilityDistance = GetWorld()->GetVisibilityDistance();
 
-    laneInformation.trafficSigns            = egoAgent.GetTrafficSignsInRange(visibilityDistance);
-    laneInformation.trafficLights           = egoAgent.GetTrafficLightsInRange(visibilityDistance);
+    laneInformation.trafficSigns = egoAgent.GetTrafficSignsInRange(visibilityDistance);
+    laneInformation.trafficLights = egoAgent.GetTrafficLightsInRange(visibilityDistance);
 
     return laneInformation;
 }
@@ -184,10 +186,10 @@ LaneInformationTrafficRules SensorDriverImplementation::GetTrafficRuleLaneInform
 {
     LaneInformationTrafficRules laneInformation;
     const int relativeLaneId = 1;
-    const double visibilityDistance = GetWorld()->GetVisibilityDistance();
+    const auto visibilityDistance = GetWorld()->GetVisibilityDistance();
 
-    laneInformation.trafficSigns            = egoAgent.GetTrafficSignsInRange(visibilityDistance, relativeLaneId);
-    laneInformation.trafficLights           = egoAgent.GetTrafficLightsInRange(visibilityDistance, relativeLaneId);
+    laneInformation.trafficSigns = egoAgent.GetTrafficSignsInRange(visibilityDistance, relativeLaneId);
+    laneInformation.trafficLights = egoAgent.GetTrafficLightsInRange(visibilityDistance, relativeLaneId);
 
     return laneInformation;
 }
@@ -196,31 +198,31 @@ LaneInformationTrafficRules SensorDriverImplementation::GetTrafficRuleLaneInform
 {
     LaneInformationTrafficRules laneInformation;
     const int relativeLaneId = -1;
-    const double visibilityDistance = GetWorld()->GetVisibilityDistance();
+    const auto visibilityDistance = GetWorld()->GetVisibilityDistance();
 
-    laneInformation.trafficSigns            = egoAgent.GetTrafficSignsInRange(visibilityDistance, relativeLaneId);
-    laneInformation.trafficLights           = egoAgent.GetTrafficLightsInRange(visibilityDistance, relativeLaneId);
+    laneInformation.trafficSigns = egoAgent.GetTrafficSignsInRange(visibilityDistance, relativeLaneId);
+    laneInformation.trafficLights = egoAgent.GetTrafficLightsInRange(visibilityDistance, relativeLaneId);
 
     return laneInformation;
 }
 
 void SensorDriverImplementation::GetGeometryInformation()
 {
-    geometryInformation.visibilityDistance            = GetWorld()->GetVisibilityDistance();
-    geometryInformation.laneEgo    = GetGeometryLaneInformationEgo();
-    geometryInformation.laneLeft   = GetGeometryLaneInformation(1);
-    geometryInformation.laneRight  = GetGeometryLaneInformation(-1);
+    geometryInformation.visibilityDistance = GetWorld()->GetVisibilityDistance();
+    geometryInformation.laneEgo = GetGeometryLaneInformationEgo();
+    geometryInformation.laneLeft = GetGeometryLaneInformation(1);
+    geometryInformation.laneRight = GetGeometryLaneInformation(-1);
 }
 
 LaneInformationGeometry SensorDriverImplementation::GetGeometryLaneInformationEgo()
 {
     LaneInformationGeometry laneInformation;
-    const double visibilityDistance = GetWorld()->GetVisibilityDistance();
+    const auto visibilityDistance = GetWorld()->GetVisibilityDistance();
 
-    laneInformation.exists                  = true;     // Ego lane must exist by definition, or else vehicle would have despawned by now. Information not necessary atm!
-    laneInformation.curvature               = egoAgent.GetLaneCurvature();
-    laneInformation.width                   = egoAgent.GetLaneWidth();
-    laneInformation.distanceToEndOfLane     = egoAgent.GetDistanceToEndOfLane(visibilityDistance);
+    laneInformation.exists = true; // Ego lane must exist by definition, or else vehicle would have despawned by now. Information not necessary atm!
+    laneInformation.curvature = egoAgent.GetLaneCurvature();
+    laneInformation.width = egoAgent.GetLaneWidth();
+    laneInformation.distanceToEndOfLane = egoAgent.GetDistanceToEndOfLane(visibilityDistance);
 
     return laneInformation;
 }
@@ -228,26 +230,26 @@ LaneInformationGeometry SensorDriverImplementation::GetGeometryLaneInformationEg
 LaneInformationGeometry SensorDriverImplementation::GetGeometryLaneInformation(int relativeLaneId)
 {
     LaneInformationGeometry laneInformation;
-    const double visibilityDistance = GetWorld()->GetVisibilityDistance();
+    const auto visibilityDistance = GetWorld()->GetVisibilityDistance();
 
     laneInformation.exists = false;
 
-    const auto laneIntervals = egoAgent.GetRelativeLanes(0.0);
+    const auto laneIntervals = egoAgent.GetRelativeLanes(0.0_m);
 
     if (!laneIntervals.empty())
     {
-        const auto& relativeLanes = laneIntervals.front().lanes;
+        const auto &relativeLanes = laneIntervals.front().lanes;
 
         if (std::find_if(relativeLanes.cbegin(),
                          relativeLanes.cend(),
-                         [relativeLaneId](const auto& relativeLane) {
+                         [relativeLaneId](const auto &relativeLane) {
                              return relativeLane.relativeId == relativeLaneId;
                          }) != relativeLanes.cend())
         {
             laneInformation.exists = true;
-            laneInformation.curvature               = egoAgent.GetLaneCurvature(relativeLaneId);
-            laneInformation.width                   = egoAgent.GetLaneWidth(relativeLaneId);
-            laneInformation.distanceToEndOfLane     = egoAgent.GetDistanceToEndOfLane(visibilityDistance, relativeLaneId);
+            laneInformation.curvature = egoAgent.GetLaneCurvature(relativeLaneId);
+            laneInformation.width = egoAgent.GetLaneWidth(relativeLaneId);
+            laneInformation.distanceToEndOfLane = egoAgent.GetDistanceToEndOfLane(visibilityDistance, relativeLaneId);
         }
     }
 
@@ -256,7 +258,7 @@ LaneInformationGeometry SensorDriverImplementation::GetGeometryLaneInformation(i
 
 void SensorDriverImplementation::GetSurroundingObjectsInformation()
 {
-    const double visibilityDistance = GetWorld()->GetVisibilityDistance();
+    const auto visibilityDistance = GetWorld()->GetVisibilityDistance();
 
     surroundingObjects.objectFront = GetOtherObjectInformation(GetObject(visibilityDistance, 0, true));
     surroundingObjects.objectRear = GetOtherObjectInformation(GetObject(visibilityDistance, 0, false));
@@ -268,10 +270,10 @@ void SensorDriverImplementation::GetSurroundingObjectsInformation()
     GetPublisher()->Publish("AgentInFront", surroundingObjects.objectFront.exist ? surroundingObjects.objectFront.id : -1);
 }
 
-const WorldObjectInterface* SensorDriverImplementation::GetObject(double visibilityDistance, int relativeLane, bool forwardSearch)
+const WorldObjectInterface *SensorDriverImplementation::GetObject(units::length::meter_t visibilityDistance, int relativeLane, bool forwardSearch)
 {
-    const auto objectsInRange = egoAgent.GetObjectsInRange(forwardSearch ? 0 : visibilityDistance,
-                                                           forwardSearch ? visibilityDistance : 0,
+    const auto objectsInRange = egoAgent.GetObjectsInRange(forwardSearch ? 0_m : visibilityDistance,
+                                                           forwardSearch ? visibilityDistance : 0_m,
                                                            relativeLane);
     if (objectsInRange.empty())
     {
@@ -280,11 +282,11 @@ const WorldObjectInterface* SensorDriverImplementation::GetObject(double visibil
     return forwardSearch ? objectsInRange.front() : objectsInRange.back();
 }
 
-ObjectInformation SensorDriverImplementation::GetOtherObjectInformation(const WorldObjectInterface* surroundingObject)
+ObjectInformation SensorDriverImplementation::GetOtherObjectInformation(const WorldObjectInterface *surroundingObject)
 {
     ObjectInformation objectInformation;
 
-    auto surroundingVehicle = dynamic_cast<const AgentInterface*>(surroundingObject);
+    auto surroundingVehicle = dynamic_cast<const AgentInterface *>(surroundingObject);
 
     if (!surroundingObject)
     {
@@ -306,10 +308,10 @@ ObjectInformation SensorDriverImplementation::GetOtherObjectInformation(const Wo
         else
         {
             objectInformation.isStatic = false;
-//            objectInformation.heading = surroundingVehicle->GetRelativeYaw(get(RouteElement(), route, currentPositionInGraph).roadId);
+            //            objectInformation.heading = surroundingVehicle->GetRelativeYaw(get(RouteElement(), route, currentPositionInGraph).roadId);
             objectInformation.absoluteVelocity = surroundingVehicle->GetVelocity().Length();
             objectInformation.acceleration = surroundingVehicle->GetAcceleration().Projection(GetAgent()->GetYaw());
-//            objectInformation.relativeLateralDistance = sensorDriverCalculations.GetLateralDistanceToObject(get(RouteElement(), route, currentPositionInGraph).roadId, surroundingVehicle);
+            //            objectInformation.relativeLateralDistance = sensorDriverCalculations.GetLateralDistanceToObject(get(RouteElement(), route, currentPositionInGraph).roadId, surroundingVehicle);
         }
     }
 
diff --git a/sim/src/components/Sensor_Driver/src/sensor_driverImpl.h b/sim/src/components/Sensor_Driver/src/sensor_driverImpl.h
index 4223cbe773ab317c11091eda200796135290b4c5..37641d2bfa315e6cae43c5440739fd3f28b0d851 100644
--- a/sim/src/components/Sensor_Driver/src/sensor_driverImpl.h
+++ b/sim/src/components/Sensor_Driver/src/sensor_driverImpl.h
@@ -135,7 +135,7 @@ private:
 
     //! \brief Returns the objects in the specified lane in front of (if forwardSearch) or behind (if
     //! not forwardSearch) the agent.
-    const WorldObjectInterface* GetObject(double visibilityDistance, int relativeLane, bool forwardSearch);
+    const WorldObjectInterface* GetObject(units::length::meter_t visibilityDistance, int relativeLane, bool forwardSearch);
 
     //! \brief Get sensor data of surrounding objects.
     virtual void GetSurroundingObjectsInformation();
diff --git a/sim/src/components/Sensor_OSI/src/objectDetectorBase.cpp b/sim/src/components/Sensor_OSI/src/objectDetectorBase.cpp
index a0a98760b897e91aaa1a5369a5bc8e2728d99c64..dfbce72d5e50b306dfa881ea23f907940b624c7c 100644
--- a/sim/src/components/Sensor_OSI/src/objectDetectorBase.cpp
+++ b/sim/src/components/Sensor_OSI/src/objectDetectorBase.cpp
@@ -148,12 +148,12 @@ Position ObjectDetectorBase::GetAbsolutePosition()
 {
     Position absolutePosition;
 
-    double posX = GetAgent()->GetPositionX();
-    double posY = GetAgent()->GetPositionY();
-    double yaw = GetAgent()->GetYaw();
+    const auto posX = GetAgent()->GetPositionX();
+    const auto posY = GetAgent()->GetPositionY();
+    const auto yaw = GetAgent()->GetYaw();
 
-    absolutePosition.xPos = posX + position.longitudinal * std::cos(yaw) - position.lateral * std::sin(yaw);
-    absolutePosition.yPos = posY + position.longitudinal * std::sin(yaw) + position.lateral * std::cos(yaw);
+    absolutePosition.xPos = posX + position.pose.position.x * units::math::cos(yaw) - position.pose.position.y * units::math::sin(yaw);
+    absolutePosition.yPos = posY + position.pose.position.x * units::math::sin(yaw) + position.pose.position.y * units::math::cos(yaw);
     absolutePosition.yawAngle = yaw;
 
     return absolutePosition;
@@ -189,13 +189,13 @@ osi3::SensorViewConfiguration ObjectDetectorBase::GenerateSensorViewConfiguratio
 
     viewConfiguration.mutable_sensor_id()->set_value(static_cast<unsigned int>(id));
 
-    viewConfiguration.mutable_mounting_position()->mutable_orientation()->set_pitch(position.pitch);
-    viewConfiguration.mutable_mounting_position()->mutable_orientation()->set_roll(position.roll);
-    viewConfiguration.mutable_mounting_position()->mutable_orientation()->set_yaw(position.yaw);
+    viewConfiguration.mutable_mounting_position()->mutable_orientation()->set_pitch(units::unit_cast<double>(position.pose.orientation.pitch));
+    viewConfiguration.mutable_mounting_position()->mutable_orientation()->set_roll(units::unit_cast<double>(position.pose.orientation.roll));
+    viewConfiguration.mutable_mounting_position()->mutable_orientation()->set_yaw(units::unit_cast<double>(position.pose.orientation.yaw));
 
-    viewConfiguration.mutable_mounting_position()->mutable_position()->set_x(position.longitudinal);
-    viewConfiguration.mutable_mounting_position()->mutable_position()->set_y(position.lateral);
-    viewConfiguration.mutable_mounting_position()->mutable_position()->set_z(position.height);
+    viewConfiguration.mutable_mounting_position()->mutable_position()->set_x(units::unit_cast<double>(position.pose.position.x));
+    viewConfiguration.mutable_mounting_position()->mutable_position()->set_y(units::unit_cast<double>(position.pose.position.y));
+    viewConfiguration.mutable_mounting_position()->mutable_position()->set_z(units::unit_cast<double>(position.pose.position.z));
 
     return viewConfiguration;
 }
@@ -261,7 +261,7 @@ polygon_t ObjectDetectorBase::TransformPolygonToGlobalCoordinates(polygon_t poly
 
 point_t ObjectDetectorBase::CalculateGlobalSensorPosition(point_t vehiclePosition, double yaw) const
 {
-    point_t sensorPositionVehicle{position.longitudinal, position.lateral};
+    point_t sensorPositionVehicle{units::unit_cast<double>(position.pose.position.x), units::unit_cast<double>(position.pose.position.y)};
     point_t sensorPositionGlobal;
     point_t tempPoint;
     bt::rotate_transformer<bg::radian, double, 2, 2> vehicleRotation(-yaw);
@@ -293,12 +293,9 @@ void ObjectDetectorBase::ParseBasicParameter()
     latency = doubleParameters.at("Latency");
     latencyInMs = static_cast<int>(latency * 1000.0);
 
-    position.longitudinal = doubleParameters.at("Longitudinal");
-    position.lateral = doubleParameters.at("Lateral");
-    position.height = doubleParameters.at("Height");
-    position.pitch = doubleParameters.at("Pitch");
-    position.yaw = doubleParameters.at("Yaw");
-    position.roll = doubleParameters.at("Roll");
+    const auto vehicleProperties = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(GetAgent()->GetVehicleModelParameters());
+    position = openpass::sensors::GetPosition(parameters->GetParametersString().at("Position"), *vehicleProperties);
+
 }
 
 const osi3::MovingObject* ObjectDetectorBase::FindHostVehicleInSensorView(const osi3::SensorView& sensorView)
@@ -320,7 +317,7 @@ const osi3::MovingObject* ObjectDetectorBase::FindHostVehicleInSensorView(const
 
 point_t ObjectDetectorBase::GetSensorPosition() const
 {
-    const ObjectPointCustom mountingPosition{position.longitudinal, position.lateral};
+    const ObjectPointCustom mountingPosition{position.pose.position.x, position.pose.position.y};
     const auto sensorPosition = GetAgent()->GetAbsolutePosition(mountingPosition);
-    return {sensorPosition.x, sensorPosition.y};
+    return {sensorPosition.x.value(), sensorPosition.y.value()};
 }
diff --git a/sim/src/components/Sensor_OSI/src/sensorGeometric2D.cpp b/sim/src/components/Sensor_OSI/src/sensorGeometric2D.cpp
index 2aa2dbcdca58d49ad7ccfc4116943da01baafcc2..8cfc6eb89a97af64b26173d226f55b057e04d482 100644
--- a/sim/src/components/Sensor_OSI/src/sensorGeometric2D.cpp
+++ b/sim/src/components/Sensor_OSI/src/sensorGeometric2D.cpp
@@ -21,6 +21,8 @@
 #include "common/osiUtils.h"
 #include "common/hypot.h"
 
+using namespace units::literals;
+
 SensorGeometric2D::SensorGeometric2D(
         std::string componentName,
         bool isInit,
@@ -50,9 +52,9 @@ SensorGeometric2D::SensorGeometric2D(
 {
     try
     {
-        openingAngleH = parameters->GetParametersDouble().at("OpeningAngleH");
+        openingAngleH = units::angle::radian_t(parameters->GetParametersDouble().at("OpeningAngleH"));
         enableVisualObstruction = parameters->GetParametersBool().at("EnableVisualObstruction");
-        detectionRange = parameters->GetParametersDouble().at("DetectionRange");
+        detectionRange = units::length::meter_t(parameters->GetParametersDouble().at("DetectionRange"));
 
         if (parameters->GetParametersDouble().count("RequiredPercentageOfVisibleArea") == 1)
         {
@@ -162,27 +164,27 @@ SensorDetectionResults SensorGeometric2D::ApplyLatencyToResults(const int time,
 
 bool SensorGeometric2D::OpeningAngleWithinHalfCircle() const
 {
-    return openingAngleH < M_PI;
+    return openingAngleH < 1_rad * M_PI;
 }
 
 bool SensorGeometric2D::OpeningAngleWithinFullCircle() const
 {
-    return openingAngleH < 2 * M_PI;
+    return openingAngleH < 2_rad * M_PI;
 }
 
 polygon_t SensorGeometric2D::CreateFourPointDetectionField() const
 {
     polygon_t detectionField;
 
-    double cosResult = std::cos(openingAngleH/2.0);
-    double upperPointX = detectionRange * cosResult ;
-    double upperPointY = detectionRange * std::sin(openingAngleH/2);
-    double frontPointX = detectionRange / cosResult;
+    auto cosResult = units::math::cos(openingAngleH/2.0);
+    units::length::meter_t upperPointX = detectionRange * cosResult ;
+    units::length::meter_t upperPointY = detectionRange * units::math::sin(openingAngleH/2);
+    units::length::meter_t frontPointX = detectionRange / cosResult;
 
     bg::append(detectionField, point_t{0, 0});
-    bg::append(detectionField, point_t{upperPointX, upperPointY});
-    bg::append(detectionField, point_t{frontPointX, 0});
-    bg::append(detectionField, point_t{upperPointX, -upperPointY});
+    bg::append(detectionField, point_t{units::unit_cast<double>(upperPointX), units::unit_cast<double>(upperPointY)});
+    bg::append(detectionField, point_t{units::unit_cast<double>(frontPointX), 0});
+    bg::append(detectionField, point_t{units::unit_cast<double>(upperPointX), units::unit_cast<double>(-upperPointY)});
     bg::append(detectionField, point_t{0, 0});
 
     return detectionField;
@@ -192,15 +194,15 @@ polygon_t SensorGeometric2D::CreateFivePointDetectionField() const
 {
     polygon_t detectionField;
 
-    double leftUpperPointX = detectionRange * std::cos(openingAngleH/2.0);
-    double leftUpperPointY = detectionRange * std::sin(openingAngleH/2.0);
-    double righttUpperPointY = detectionRange * std::tan(openingAngleH/4.0);
+    units::length::meter_t leftUpperPointX = detectionRange * units::math::cos(openingAngleH/2.0);
+    units::length::meter_t leftUpperPointY = detectionRange * units::math::sin(openingAngleH/2.0);
+    units::length::meter_t righttUpperPointY = detectionRange * units::math::tan(openingAngleH/4.0);
 
     bg::append(detectionField, point_t{0, 0});
-    bg::append(detectionField, point_t{leftUpperPointX, leftUpperPointY});
-    bg::append(detectionField, point_t{detectionRange, righttUpperPointY});
-    bg::append(detectionField, point_t{detectionRange, -righttUpperPointY});
-    bg::append(detectionField, point_t{leftUpperPointX, -leftUpperPointY});
+    bg::append(detectionField, point_t{units::unit_cast<double>(leftUpperPointX), units::unit_cast<double>(leftUpperPointY)});
+    bg::append(detectionField, point_t{units::unit_cast<double>(detectionRange), units::unit_cast<double>(righttUpperPointY)});
+    bg::append(detectionField, point_t{units::unit_cast<double>(detectionRange), units::unit_cast<double>(-righttUpperPointY)});
+    bg::append(detectionField, point_t{units::unit_cast<double>(leftUpperPointX), units::unit_cast<double>(-leftUpperPointY)});
     bg::append(detectionField, point_t{0, 0});
 
     return detectionField;
@@ -224,7 +226,7 @@ std::pair<point_t, polygon_t> SensorGeometric2D::CreateSensorDetectionField(cons
     }
 
     const auto sensorPosition = GetSensorPosition();
-    double yaw = hostVehicle->base().orientation().yaw() + position.yaw;
+    double yaw = hostVehicle->base().orientation().yaw() + position.pose.orientation.yaw.value();
 
     detectionField = TransformPolygonToGlobalCoordinates(detectionField, sensorPosition, yaw);
 
@@ -285,10 +287,12 @@ SensorDetectionResults SensorGeometric2D::DetectObjects()
     }
 
     const auto sensorPosition = GetSensorPosition();
-    const auto yaw = hostVehicle->base().orientation().yaw() + position.yaw;
+    const auto yawHost = hostVehicle->base().orientation().yaw();
+    const auto yawSensor = position.pose.orientation.yaw.value();
+    const auto yaw = hostVehicle->base().orientation().yaw() + position.pose.orientation.yaw.value();
     const auto yawRate = hostVehicle->base().orientation_rate().yaw();
     const auto yawAcceleration = hostVehicle->base().orientation_acceleration().yaw();
-    const ObjectPointCustom mountingPosition{position.longitudinal, position.lateral};
+    const ObjectPointCustom mountingPosition{position.pose.position.x, position.pose.position.y};
     const auto ownVelocity = GetAgent()->GetVelocity(mountingPosition);
     const auto ownAcceleration = GetAgent()->GetAcceleration(mountingPosition);
 
@@ -299,7 +303,7 @@ SensorDetectionResults SensorGeometric2D::DetectObjects()
             continue;
         }
         results.detectedMovingObjects.push_back(object);
-        AddMovingObjectToSensorData(object, {ownVelocity.x, ownVelocity.y}, {ownAcceleration.x, ownAcceleration.y}, sensorPosition, yaw, yawRate, yawAcceleration);
+        AddMovingObjectToSensorData(object, {ownVelocity.x.value(), ownVelocity.y.value()}, {ownAcceleration.x.value(), ownAcceleration.y.value()}, sensorPosition, yaw, yawRate, yawAcceleration);
     }
     for (const auto &object : detectedStationaryObjectsWithoutFailure)
     {
@@ -347,22 +351,22 @@ bool SensorGeometric2D::ObjectIsInDetectionArea(const T& object,
     polygon_t objectBoundingBox = CalculateBoundingBox(object.base().dimension(), object.base().position(),
                                                   object.base().orientation());
 
-    double distanceToObjectBoundary = bg::distance(sensorPositionGlobal, objectBoundingBox);
+    units::length::meter_t distanceToObjectBoundary{bg::distance(sensorPositionGlobal, objectBoundingBox)};
 
     return distanceToObjectBoundary <= detectionRange &&
-           (openingAngleH >= 2 * M_PI || bg::intersects(detectionField, objectBoundingBox));
+           (openingAngleH >= 2_rad * M_PI || bg::intersects(detectionField, objectBoundingBox));
 }
 
 osi3::SensorViewConfiguration SensorGeometric2D::GenerateSensorViewConfiguration()
 {
     // The sensor has to specify an area which contains all objects of interest. To take objects on the edge of this area into account,
     // an arbitrary margin is added deliberately, as no other specification is available at the moment.
-    constexpr double rangeBuffer = 20.0;
+    const units::length::meter_t rangeBuffer{20.0};
     constexpr double fieldOfViewBuffer = 0.2;
 
     osi3::SensorViewConfiguration viewConfiguration = ObjectDetectorBase::GenerateSensorViewConfiguration();
-    viewConfiguration.set_field_of_view_horizontal(openingAngleH + fieldOfViewBuffer);
-    viewConfiguration.set_range(detectionRange + rangeBuffer);
+    viewConfiguration.set_field_of_view_horizontal(units::unit_cast<double>(openingAngleH) + fieldOfViewBuffer);
+    viewConfiguration.set_range(units::unit_cast<double>(detectionRange + rangeBuffer));
 
     return viewConfiguration;
 }
@@ -412,26 +416,26 @@ std::pair<std::vector<T>, std::vector<T>> SensorGeometric2D::CalcVisualObstructi
 
 polygon_t SensorGeometric2D::CalcInitialBrightArea(point_t sensorPosition)
 {
-    const double stepSize = 0.1;
-    double sensorX = sensorPosition.x();
-    double sensorY = sensorPosition.y();
+    const units::angle::radian_t stepSize{0.1};
+    units::length::meter_t sensorX{sensorPosition.x()};
+    units::length::meter_t sensorY{sensorPosition.y()};
     polygon_t brightArea;
     bg::append(brightArea, sensorPosition);
 
-    double angle = position.yaw + GetAgent()->GetYaw() - 0.5 * openingAngleH;
-    double maxAngle = position.yaw + GetAgent()->GetYaw() + 0.5 * openingAngleH;
+    auto angle = position.pose.orientation.yaw + GetAgent()->GetYaw() - 0.5 * openingAngleH;
+    auto maxAngle = position.pose.orientation.yaw + GetAgent()->GetYaw() + 0.5 * openingAngleH;
 
     while (angle < maxAngle)
     {
-        double x = sensorX + detectionRange * std::cos(angle);
-        double y = sensorY + detectionRange * std::sin(angle);
-        bg::append(brightArea, point_t{x,y});
+        units::length::meter_t x = sensorX + detectionRange * units::math::cos(angle);
+        units::length::meter_t y = sensorY + detectionRange * units::math::sin(angle);
+        bg::append(brightArea, point_t{units::unit_cast<double>(x),units::unit_cast<double>(y)});
         angle += stepSize;
     }
 
-    double x = sensorX + detectionRange * std::cos(maxAngle);
-    double y = sensorY + detectionRange * std::sin(maxAngle);
-    bg::append(brightArea, point_t{x,y});
+    units::length::meter_t x = sensorX + detectionRange * units::math::cos(maxAngle);
+    units::length::meter_t y = sensorY + detectionRange * units::math::sin(maxAngle);
+    bg::append(brightArea, point_t{units::unit_cast<double>(x),units::unit_cast<double>(y)});
 
     bg::append(brightArea, sensorPosition);
     return brightArea;
@@ -481,7 +485,7 @@ multi_polygon_t SensorGeometric2D::CalcObjectShadow(const polygon_t& boundingBox
     const auto leftVectorLength = openpass::hypot(leftVector.x(), leftVector.y());
     const auto rightVectorLength = openpass::hypot(rightVector.x(), rightVector.y());
     const auto height = std::min(leftVectorLength, rightVectorLength) * std::cos(0.5 * (maxRightAngle + maxLeftAngle));
-    const auto scale = detectionRange / height;
+    const auto scale = units::unit_cast<double>(detectionRange) / height;
     
     if(scale > WARNING_THRESHOLD_SCALE)
     {
diff --git a/sim/src/components/Sensor_OSI/src/sensorGeometric2D.h b/sim/src/components/Sensor_OSI/src/sensorGeometric2D.h
index 4099958bad481d2749f4e0e987b4dc778b713092..d7c802852fbe7886570dc4de04bb2944e3e45999 100644
--- a/sim/src/components/Sensor_OSI/src/sensorGeometric2D.h
+++ b/sim/src/components/Sensor_OSI/src/sensorGeometric2D.h
@@ -27,7 +27,7 @@ struct ObjectView
     long objectId;
     double minAngle;
     double maxAngle;
-    double distance;
+    units::length::meter_t distance;
 };
 
 struct SensorDetectionResults
@@ -165,8 +165,8 @@ private:
 
     bool enableVisualObstruction = false;
     double requiredPercentageOfVisibleArea = 0.001;
-    double detectionRange;
-    double openingAngleH;
+    units::length::meter_t detectionRange;
+    units::angle::radian_t openingAngleH;
     std::map<int, SensorDetectionResults> latentSensorDetectionResultsBuffer;
 
     static constexpr double MIN_VISIBLE_UNOBSTRUCTED_PERCENTAGE = 0.0001;
diff --git a/sim/src/components/common/vehicleProperties.h b/sim/src/components/common/vehicleProperties.h
index 35f3c40383fb6b5ee36d66d9ec07375984262b94..1b6cb5b6bd2167a958d21206c94bb60e3f68d624 100644
--- a/sim/src/components/common/vehicleProperties.h
+++ b/sim/src/components/common/vehicleProperties.h
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2021 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -19,7 +20,6 @@ constexpr char FrictionCoefficient[] {"FrictionCoefficient"};
 constexpr char FrontSurface[] {"FrontSurface"};
 constexpr char GearRatio[] {"GearRatio"};
 constexpr char NumberOfGears[] {"NumberOfGears"};
-constexpr char Mass[] {"Mass"};
 constexpr char MaximumEngineSpeed[] {"MaximumEngineSpeed"};
 constexpr char MaximumEngineTorque[] {"MaximumEngineTorque"};
 constexpr char MinimumEngineSpeed[] {"MinimumEngineSpeed"};
diff --git a/sim/src/core/opSimulation/CMakeLists.txt b/sim/src/core/opSimulation/CMakeLists.txt
index 7962ac20b764771ac1e7997f3363230ce9852ec8..2491c1568432a8c3ba5d12e824eda8b0b51759e6 100644
--- a/sim/src/core/opSimulation/CMakeLists.txt
+++ b/sim/src/core/opSimulation/CMakeLists.txt
@@ -11,6 +11,53 @@ set(COMPONENT_NAME SimulationCore)
 
 add_subdirectory(modules)
 
+################################################################
+# openScenarioParser specific content
+# Set path to the OpenSCENARIO libs
+set( CMAKE_LIBRARY_PATH "${CMAKE_LIBRARY_PATH}; ${CMAKE_SOURCE_DIR}/openScenario.v1_0.API" )
+set(BUILD_STATIC_LIBS OFF)
+
+# Add OpenSCENARIO lib
+set( LIB_PREFIX "" )
+set( LIB_SUFFIX "" )
+if( BUILD_STATIC_LIBS STREQUAL "ON" )
+  if( WIN32 )
+    set( LIB_SUFFIX ".lib" )
+  elseif( UNIX )
+    set( LIB_PREFIX "lib" )
+    set( LIB_SUFFIX ".a" )
+  endif()
+else()
+  if( WIN32 )
+    set( LIB_SUFFIX ".dll" )
+  elseif( UNIX )
+    set( LIB_PREFIX "lib" )
+    set( LIB_SUFFIX ".so" )
+  endif()
+endif()
+
+unset( XOSC_LIB CACHE )
+unset( ANTLR4_LIB CACHE )
+unset( EXP_LIB CACHE )
+find_library( XOSC_LIB name "${LIB_PREFIX}OpenScenarioLib${LIB_SUFFIX}" HINTS "${OPENSCENARIOPARSER_INCLUDE_DIR}/../lib/Linux" )
+find_library( ANTLR4_LIB name "${LIB_PREFIX}antlr4-runtime${LIB_SUFFIX}" HINTS "${OPENSCENARIOPARSER_INCLUDE_DIR}/../lib/Linux" )
+find_library( EXP_LIB name "${LIB_PREFIX}ExpressionsLib${LIB_SUFFIX}" HINTS "${OPENSCENARIOPARSER_INCLUDE_DIR}/../lib/Linux" )
+
+if(NOT XOSC_LIB)
+  message(FATAL_ERROR "XOSC_LIB library not found")
+endif()
+
+if(NOT ANTLR4_LIB)
+  message(FATAL_ERROR "ANTLR4_LIB library not found")
+endif()
+
+if(NOT EXP_LIB)
+  message(FATAL_ERROR "EXP_LIB library not found")
+endif()
+#add_subdirectory(${OPENSCENARIOPARSER_INCLUDE_DIR}/externalLibs/ANTLR4-Cpp-src ${PROJECT_BINARY_DIR}/deps/openScenarioEngine/deps/openScenarioParser)
+
+
+
 add_openpass_target(
   NAME ${COMPONENT_NAME} TYPE library LINKAGE shared COMPONENT common
 
@@ -40,17 +87,26 @@ add_openpass_target(
     framework/agentFactory.h
     framework/commandLineParser.h
     framework/configurationContainer.h
+    framework/controlStrategies.h
     framework/directories.h
     framework/dynamicAgentTypeGenerator.h
     framework/dynamicParametersSampler.h
     framework/dynamicProfileSampler.h
+    framework/entity.h
+    framework/entityRepository.h
+    framework/controllerRepository.h
+    framework/environment.h
     framework/eventNetwork.h
     framework/frameworkModuleContainer.h
+    framework/laneLocationQueryService.h
     framework/observationModule.h
     framework/observationNetwork.h
     framework/parameterbuilder.h
+    framework/pedestrian.h
+    framework/routeSampler.h
     framework/runInstantiator.h
     framework/sampler.h
+    framework/vehicle.h
     framework/scheduler/agentParser.h
     framework/scheduler/runResult.h
     framework/scheduler/scheduler.h
@@ -61,31 +117,23 @@ add_openpass_target(
     importer/configurationFiles.h
     importer/connection.h
     importer/csvParser.h
-    importer/eventDetectorImporter.h
     importer/frameworkModules.h
     importer/importerLoggingHelper.h
     importer/junction.h
-    importer/oscImporterCommon.h
     importer/parameterImporter.h
     importer/profiles.h
     importer/profilesImporter.h
     importer/road.h
-    importer/scenario.h
-    importer/scenarioImporter.h
-    importer/scenarioImporterHelper.h
     importer/scenery.h
-    importer/sceneryDynamics.h
     importer/sceneryImporter.h
     importer/simulationConfig.h
     importer/simulationConfigImporter.h
     importer/systemConfig.h
     importer/systemConfigImporter.h
     importer/vehicleModels.h
-    importer/vehicleModelsImporter.h
     importer/road/roadObject.h
     importer/road/roadSignal.h
     modelElements/agent.h
-    modelElements/agentBlueprint.h
     modelElements/agentType.h
     modelElements/channel.h
     modelElements/channelBuffer.h
@@ -100,6 +148,71 @@ add_openpass_target(
     modelElements/spawnPoint.h
     modelElements/spawnPointNetwork.h
     ../common/log.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/Execution/i_environment.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/EnvironmentalConditions/road_condition.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/EnvironmentalConditions/weather.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/Map/i_coord_converter.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/Map/i_lane_location_query_service.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/Traffic/i_entity_repository.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/Traffic/entity_properties.h
+    ${MANTLE_INCLUDE_DIR}/MantleAPI/Common/position.h
+    ${OPENSCENARIOENGINE_INCLUDE_DIR}/OpenScenarioEngine/OpenScenarioEngine.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Constants.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/ControllerCreator.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/EntityCreator.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StateMachine/StateMachine.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StateMachine/StateMachineBuilder.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Act.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Event.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Maneuver.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/ManeuverGroup.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Story.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Storyboard.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/StoryboardElement.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/Action.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/CustomCommandAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/FollowTrajectoryAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/GlobalAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/LaneChangeAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/LongitudinalDistanceAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/MotionControlAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/PrivateAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/SpeedAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/TeleportAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/TrafficSignalStateAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/UserDefinedAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/VisibilityAction.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/Condition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ConditionGroup.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/Trigger.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/AccelerationCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/CollisionCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/DistanceCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/EndOfRoadCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/OffroadCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/ReachPositionCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/RelativeDistanceCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/RelativeSpeedCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/SpeedCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/StandStillCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/TimeHeadwayCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/TimeToCollisionCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/TraveledDistanceCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/ParameterCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/SimulationTimeCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/StoryboardElementStateCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/TimeOfDayCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/TrafficSignalCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/TrafficSignalControllerCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/UserDefinedValueCondition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/Common/EdgeEvaluators.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Utils/ConvertScenarioPosition.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Utils/EntityUtils.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StoryboardElementStates/StandbyState.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StoryboardElementStates/StoryboardStandbyState.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StoryboardElementStates/RunningState.h
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StoryboardElementStates/StoryboardRunningState.h
+    ${UNITS_INCLUDE_DIR}/units.h
 
   SOURCES
     bindings/dataBufferBinding.cpp
@@ -123,48 +236,48 @@ add_openpass_target(
     framework/agentFactory.cpp
     framework/commandLineParser.cpp
     framework/configurationContainer.cpp
+    framework/controlStrategies.cpp
     framework/directories.cpp
     framework/dynamicAgentTypeGenerator.cpp
     framework/dynamicParametersSampler.cpp
     framework/dynamicProfileSampler.cpp
+    framework/entity.cpp
+    framework/entityRepository.cpp
+    framework/controllerRepository.cpp
+    framework/environment.cpp
     framework/eventNetwork.cpp
     framework/frameworkModuleContainer.cpp
+    framework/laneLocationQueryService.cpp
     framework/observationModule.cpp
     framework/observationNetwork.cpp
+    framework/pedestrian.cpp
     framework/runInstantiator.cpp
     framework/sampler.cpp
+    framework/vehicle.cpp
     framework/scheduler/agentParser.cpp
     framework/scheduler/runResult.cpp
     framework/scheduler/scheduler.cpp
     framework/scheduler/schedulerTasks.cpp
     framework/scheduler/taskBuilder.cpp
     framework/scheduler/tasks.cpp
+    importer/importerCommon.cpp
     importer/connection.cpp
     importer/csvParser.cpp
-    importer/eventDetectorImporter.cpp
-    importer/importerCommon.cpp
     importer/junction.cpp
-    importer/oscImporterCommon.cpp
     importer/parameterImporter.cpp
     importer/profiles.cpp
     importer/profilesImporter.cpp
     importer/road.cpp
-    importer/scenario.cpp
-    importer/scenarioImporter.cpp
-    importer/scenarioImporterHelper.cpp
     importer/scenery.cpp
-    importer/sceneryDynamics.cpp
     importer/sceneryImporter.cpp
     importer/simulationConfig.cpp
     importer/simulationConfigImporter.cpp
     importer/systemConfig.cpp
     importer/systemConfigImporter.cpp
     importer/vehicleModels.cpp
-    importer/vehicleModelsImporter.cpp
     importer/road/roadObject.cpp
     importer/road/roadSignal.cpp
     modelElements/agent.cpp
-    modelElements/agentBlueprint.cpp
     modelElements/agentType.cpp
     modelElements/channel.cpp
     modelElements/component.cpp
@@ -175,11 +288,105 @@ add_openpass_target(
     modelElements/parameters.cpp
     modelElements/spawnPointNetwork.cpp
     ../common/log.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/OpenScenarioEngine.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/ControllerCreator.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/EntityCreator.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StateMachine/StateMachine.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StateMachine/StateMachineBuilder.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Act.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Event.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Maneuver.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/ManeuverGroup.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Story.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Storyboard.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/StoryboardElement.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/Action.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/CustomCommandAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/FollowTrajectoryAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/GlobalAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/LaneChangeAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/LongitudinalDistanceAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/MotionControlAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/PrivateAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/SpeedAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/TeleportAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/TrafficSignalStateAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/UserDefinedAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Actions/VisibilityAction.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/Condition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ConditionGroup.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/Trigger.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/AccelerationCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/CollisionCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/DistanceCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/EndOfRoadCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/OffroadCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/ReachPositionCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/RelativeDistanceCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/RelativeSpeedCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/SpeedCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/StandStillCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/TimeHeadwayCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/TimeToCollisionCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByEntityConditions/TraveledDistanceCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/ParameterCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/SimulationTimeCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/StoryboardElementStateCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/TimeOfDayCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/TrafficSignalCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/TrafficSignalControllerCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/ByValueConditions/UserDefinedValueCondition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Conditions/Common/EdgeEvaluators.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Utils/ConvertScenarioPosition.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/Storyboard/Utils/EntityUtils.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StoryboardElementStates/StandbyState.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StoryboardElementStates/StoryboardStandbyState.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StoryboardElementStates/RunningState.cpp
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}/StoryboardElementStates/StoryboardRunningState.cpp
 
   INCDIRS
     .
     ../..
     ../../../..
+    ${MANTLE_INCLUDE_DIR}
+    ${OPENSCENARIOENGINE_INCLUDE_DIR}
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}
+    # OPENSCENARIOPARSER
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/common
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/expressionsLib/inc
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/externalLibs/Filesystem
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/externalLibs/TinyXML2
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_0/api
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/api
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/api/writer
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/common
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/checker
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/checker/impl
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/catalog
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/impl
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/api
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/checker
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/checker/tree
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/common
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/export
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/impl
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/loader
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/parameter
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/expression
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/parser
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/parser/modelgroup
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/parser/type
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/simple/struct
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/xmlIndexer
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/catalog
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/checker
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/loader
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/parameter
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/expression
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/parser
+    #
+    ${UNITS_INCLUDE_DIR}
     ../common
     framework
     importer
@@ -195,6 +402,8 @@ add_openpass_target(
     CoreCommon
 )
 
+target_link_libraries( ${COMPONENT_NAME} ${XOSC_LIB} ${ANTLR4_LIB} ${EXP_LIB} )
+
 set(COMPONENT_NAME opSimulation)
 
 add_openpass_target(
@@ -211,10 +420,50 @@ add_openpass_target(
   INCDIRS
     .
     ../../../..
+    ${MANTLE_INCLUDE_DIR}
+    ${OPENSCENARIOENGINE_INCLUDE_DIR}
+    ${OPENSCENARIOENGINE_SRC_INCLUDE_DIR}
+    # OPENSCENARIOPARSER
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/common
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/expressionsLib/inc
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/externalLibs/Filesystem
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/externalLibs/TinyXML2
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_0/api
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/api
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/api/writer
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/common
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/checker
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/checker/impl
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/catalog
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/generated/v1_1/impl
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/api
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/checker
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/checker/tree
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/common
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/export
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/impl
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/loader
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/parameter
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/expression
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/parser
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/parser/modelgroup
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/parser/type
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/simple/struct
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/xmlIndexer
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/catalog
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/checker
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/loader
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/parameter
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/expression
+    ${OPENSCENARIOPARSER_INCLUDE_DIR}/openScenarioLib/src/v1_1/parser
+    ${UNITS_INCLUDE_DIR}
     ../common
+    ../../common
     bindings
     framework
     importer
     modelElements
     modules
 )
+
diff --git a/sim/src/core/opSimulation/bindings/eventDetectorBinding.cpp b/sim/src/core/opSimulation/bindings/eventDetectorBinding.cpp
index 13057afc7b2f65ddaad1fa7fd7b5073f4c34042a..d06668159fdd2da93be0b16e78bad48dc80c5eae 100644
--- a/sim/src/core/opSimulation/bindings/eventDetectorBinding.cpp
+++ b/sim/src/core/opSimulation/bindings/eventDetectorBinding.cpp
@@ -25,7 +25,6 @@ EventDetectorBinding::~EventDetectorBinding()
 }
 
 std::vector<const EventDetector*> EventDetectorBinding::Instantiate(const std::string libraryPath,
-                                                              const ScenarioInterface *scenario,
                                                               EventNetworkInterface* eventNetwork,
                                                               WorldInterface *world,
                                                               StochasticsInterface *stochastics)
@@ -54,16 +53,6 @@ std::vector<const EventDetector*> EventDetectorBinding::Instantiate(const std::s
                                                                 stochastics);
     eventDetectors.push_back(eventDetector);
 
-    //Instantiates an eventdetector for each true flag
-    for(const auto eventDetectorInformation : scenario->GetEventDetectorInformations())
-    {
-        const auto eventDetector = library->CreateConditionalDetector(eventDetectorInformation,
-                                                                      eventNetwork,
-                                                                      world,
-                                                                      stochastics);
-        eventDetectors.push_back(eventDetector);
-    }
-
     return eventDetectors;
 }
 
diff --git a/sim/src/core/opSimulation/bindings/eventDetectorBinding.h b/sim/src/core/opSimulation/bindings/eventDetectorBinding.h
index 926bd8c8b2ec42d2e07772a3ffbdbaa3b20929f7..d2681eda5834396c08be7363567f32e198a7a3ca 100644
--- a/sim/src/core/opSimulation/bindings/eventDetectorBinding.h
+++ b/sim/src/core/opSimulation/bindings/eventDetectorBinding.h
@@ -18,7 +18,6 @@
 #include "common/callbacks.h"
 #include "common/opExport.h"
 #include "include/worldInterface.h"
-#include "include/scenarioInterface.h"
 #include "include/stochasticsInterface.h"
 
 namespace core
@@ -45,14 +44,12 @@ public:
     //! detector using the provided parameters.
     //!
     //! @param[in]  libraryPath         Path to the library
-    //! @param[in]  scenario            Scenario
     //! @param[in]  eventNetwork        Interface of the eventNetwork
     //! @param[in]  world               World instance
     //! @param[in]  stochastics         The stochastics object
     //! @return                         Vector of created EventDetectors from the library
     //-----------------------------------------------------------------------------
     std::vector<const EventDetector *> Instantiate(const std::string libraryPath,
-                                             const ScenarioInterface *scenario,
                                              EventNetworkInterface *eventNetwork,
                                              WorldInterface *world,
                                              StochasticsInterface *stochastics);
diff --git a/sim/src/core/opSimulation/bindings/eventDetectorLibrary.cpp b/sim/src/core/opSimulation/bindings/eventDetectorLibrary.cpp
index cfc131389cd550b754a8020a02ec6e7dc27ea483..9d544a627f077a8b564ca201f7267c9aa2753090 100644
--- a/sim/src/core/opSimulation/bindings/eventDetectorLibrary.cpp
+++ b/sim/src/core/opSimulation/bindings/eventDetectorLibrary.cpp
@@ -9,29 +9,31 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-#include <iostream>
+#include "bindings/eventDetectorLibrary.h"
+
 #include <algorithm>
-#include <QLibrary>
+#include <iostream>
 #include <sstream>
-#include "bindings/eventDetectorLibrary.h"
+
+#include <QLibrary>
+
 #include "bindings/observationBinding.h"
-#include "eventDetector.h"
 #include "common/log.h"
+#include "eventDetector.h"
 
-namespace core
-{
+namespace core {
 
 bool EventDetectorLibrary::Init()
 {
     std::string suffix = DEBUG_POSTFIX;
 
-    library = new (std::nothrow) QLibrary(QString::fromStdString(libraryPath+suffix));
-    if(!library)
+    library = new (std::nothrow) QLibrary(QString::fromStdString(libraryPath + suffix));
+    if (!library)
     {
         return false;
     }
 
-    if(!library->load())
+    if (!library->load())
     {
         LOG_INTERN(LogLevel::Error) << library->errorString().toStdString();
         delete library;
@@ -40,27 +42,21 @@ bool EventDetectorLibrary::Init()
     }
 
     getVersionFunc = (EventDetectorInterface_GetVersion)library->resolve(DllGetVersionId.c_str());
-    if(!getVersionFunc)
+    if (!getVersionFunc)
     {
         LOG_INTERN(LogLevel::Error) << "could not retrieve version information from DLL";
         return false;
     }
 
     createCollisionDetectorInstanceFunc = (EventDetectorInterface_CreateCollisionDetectorInstanceType)library->resolve(DllCreateCollisionDetectorInstanceId.c_str());
-    if(!createCollisionDetectorInstanceFunc)
-    {
-        LOG_INTERN(LogLevel::Error) << "could not instantiate class from DLL";
-        return false;
-    }
-    createConditionalDetectorInstanceFunc = (EventDetectorInterface_CreateConditionalDetectorInstanceType)library->resolve(DllCreateConditionalDetectorInstanceId.c_str());
-    if(!createConditionalDetectorInstanceFunc)
+    if (!createCollisionDetectorInstanceFunc)
     {
         LOG_INTERN(LogLevel::Error) << "could not instantiate class from DLL";
         return false;
     }
 
     destroyInstanceFunc = (EventDetectorInterface_DestroyInstanceType)library->resolve(DllDestroyInstanceId.c_str());
-    if(!destroyInstanceFunc)
+    if (!destroyInstanceFunc)
     {
         LOG_INTERN(LogLevel::Warning) << "event detector could not be released";
         return false;
@@ -71,12 +67,12 @@ bool EventDetectorLibrary::Init()
         LOG_INTERN(LogLevel::DebugCore) << "loaded event detector library " << library->fileName().toStdString()
                                         << ", version " << getVersionFunc();
     }
-    catch(std::runtime_error const &ex)
+    catch (std::runtime_error const &ex)
     {
         LOG_INTERN(LogLevel::Error) << "could not retrieve version information from DLL: " << ex.what();
         return false;
     }
-    catch(...)
+    catch (...)
     {
         LOG_INTERN(LogLevel::Error) << "could not retrieve version information from DLL";
         return false;
@@ -87,14 +83,14 @@ bool EventDetectorLibrary::Init()
 
 EventDetectorLibrary::~EventDetectorLibrary()
 {
-    if(!(eventDetectors.empty()))
+    if (!(eventDetectors.empty()))
     {
         LOG_INTERN(LogLevel::Warning) << "unloading library which is still in use";
     }
 
-    if(library)
+    if (library)
     {
-        if(library->isLoaded())
+        if (library->isLoaded())
         {
             LOG_INTERN(LogLevel::DebugCore) << "unloading event detector library ";
             library->unload();
@@ -107,13 +103,13 @@ EventDetectorLibrary::~EventDetectorLibrary()
 
 bool EventDetectorLibrary::ReleaseEventDetector(EventDetector *eventDetector)
 {
-    if(!library)
+    if (!library)
     {
         return false;
     }
 
     auto findIter = std::find(eventDetectors.begin(), eventDetectors.end(), eventDetector);
-    if(eventDetectors.end() == findIter)
+    if (eventDetectors.end() == findIter)
     {
         LOG_INTERN(LogLevel::Warning) << "event detector doesn't belong to library";
         return false;
@@ -123,12 +119,12 @@ bool EventDetectorLibrary::ReleaseEventDetector(EventDetector *eventDetector)
     {
         destroyInstanceFunc(eventDetector->GetImplementation());
     }
-    catch(std::runtime_error const &ex)
+    catch (std::runtime_error const &ex)
     {
         LOG_INTERN(LogLevel::Error) << "event detector could not be released: " << ex.what();
         return false;
     }
-    catch(...)
+    catch (...)
     {
         LOG_INTERN(LogLevel::Error) << "event detector could not be released";
         return false;
@@ -139,18 +135,18 @@ bool EventDetectorLibrary::ReleaseEventDetector(EventDetector *eventDetector)
     return true;
 }
 
-EventDetector *EventDetectorLibrary::CreateCollisionDetector(EventNetworkInterface* eventNetwork,
+EventDetector *EventDetectorLibrary::CreateCollisionDetector(EventNetworkInterface *eventNetwork,
                                                              WorldInterface *world,
                                                              StochasticsInterface *stochastics)
 {
-    if(!library)
+    if (!library)
     {
         return nullptr;
     }
 
-    if(!library->isLoaded())
+    if (!library->isLoaded())
     {
-        if(!library->load())
+        if (!library->load())
         {
             return nullptr;
         }
@@ -161,7 +157,7 @@ EventDetector *EventDetectorLibrary::CreateCollisionDetector(EventNetworkInterfa
                                                                       callbacks,
                                                                       stochastics);
 
-    if(!eventDetectorInterface)
+    if (!eventDetectorInterface)
     {
         throw std::runtime_error("Could not create CollisionEventDetector");
     }
@@ -173,40 +169,4 @@ EventDetector *EventDetectorLibrary::CreateCollisionDetector(EventNetworkInterfa
     return eventDetector;
 }
 
-EventDetector *EventDetectorLibrary::CreateConditionalDetector(const openScenario::ConditionalEventDetectorInformation &eventDetectorInformation,
-                                                               EventNetworkInterface *eventNetwork,
-                                                               WorldInterface *world,
-                                                               StochasticsInterface *stochastics)
-{
-    if(!library)
-    {
-        return nullptr;
-    }
-
-    if(!library->isLoaded())
-    {
-        if(!library->load())
-        {
-            return nullptr;
-        }
-    }
-
-    auto eventDetectorInterface = createConditionalDetectorInstanceFunc(world,
-                                                                        eventDetectorInformation,
-                                                                        eventNetwork,
-                                                                        callbacks,
-                                                                        stochastics);
-
-    if(!eventDetectorInterface)
-    {
-        throw std::runtime_error("Could not create Conditional Event Detector");
-    }
-
-    EventDetector *eventDetector = new EventDetector(eventDetectorInterface,
-                                                     this);
-
-    eventDetectors.push_back(eventDetector);
-    return eventDetector;
-}
-
 } // namespace core
diff --git a/sim/src/core/opSimulation/bindings/eventDetectorLibrary.h b/sim/src/core/opSimulation/bindings/eventDetectorLibrary.h
index 1e6d826063139d7811811ce84f06d89114dda424..f1f37cd2b8f2a29ee0368168a3fd5dd0fc1bae95 100644
--- a/sim/src/core/opSimulation/bindings/eventDetectorLibrary.h
+++ b/sim/src/core/opSimulation/bindings/eventDetectorLibrary.h
@@ -32,11 +32,6 @@ public:
                                                                                  EventNetworkInterface* eventNetwork,
                                                                                  const CallbackInterface *callbacks,
                                                                                  StochasticsInterface *stochastics);
-    typedef EventDetectorInterface *(*EventDetectorInterface_CreateConditionalDetectorInstanceType)(WorldInterface *world,
-                                                                                 const openScenario::ConditionalEventDetectorInformation &eventDetectorInformation,
-                                                                                 EventNetworkInterface* eventNetwork,
-                                                                                 const CallbackInterface *callbacks,
-                                                                                 StochasticsInterface *stochastics);
     typedef void (*EventDetectorInterface_DestroyInstanceType)(EventDetectorInterface *implementation);
 
     EventDetectorLibrary(const std::string &libraryPath,
@@ -91,15 +86,9 @@ public:
                                            WorldInterface *world,
                                            StochasticsInterface *stochastics);
 
-    EventDetector *CreateConditionalDetector(const openScenario::ConditionalEventDetectorInformation &eventDetectorInformation,
-                                             EventNetworkInterface *eventNetwork,
-                                             WorldInterface *world,
-                                             StochasticsInterface *stochastics);
-
 private:
     const std::string DllGetVersionId = "OpenPASS_GetVersion";
     const std::string DllCreateCollisionDetectorInstanceId = "OpenPASS_CreateCollisionDetectorInstance";
-    const std::string DllCreateConditionalDetectorInstanceId = "OpenPASS_CreateConditionalDetectorInstance";
     const std::string DllDestroyInstanceId = "OpenPASS_DestroyInstance";
 
     std::string libraryPath;
@@ -108,7 +97,6 @@ private:
     CallbackInterface *callbacks;
     EventDetectorInterface_GetVersion getVersionFunc{nullptr};
     EventDetectorInterface_CreateCollisionDetectorInstanceType createCollisionDetectorInstanceFunc{nullptr};
-    EventDetectorInterface_CreateConditionalDetectorInstanceType createConditionalDetectorInstanceFunc{nullptr};
     EventDetectorInterface_DestroyInstanceType destroyInstanceFunc{nullptr};
 };
 
diff --git a/sim/src/core/opSimulation/bindings/manipulatorBinding.cpp b/sim/src/core/opSimulation/bindings/manipulatorBinding.cpp
index fc95a87910049a23b041173bf4f2efe1b3c53069..52e23481fe356400a60029ee696f70b0f0c65c4e 100644
--- a/sim/src/core/opSimulation/bindings/manipulatorBinding.cpp
+++ b/sim/src/core/opSimulation/bindings/manipulatorBinding.cpp
@@ -25,7 +25,6 @@ ManipulatorBinding::~ManipulatorBinding()
 }
 
 std::vector<const Manipulator*> ManipulatorBinding::Instantiate(const std::string libraryPath,
-                                                          const ScenarioInterface *scenario,
                                                           EventNetworkInterface* eventNetwork,
                                                           WorldInterface *world,
                                                           PublisherInterface *publisher)
@@ -59,15 +58,6 @@ std::vector<const Manipulator*> ManipulatorBinding::Instantiate(const std::strin
         manipulators.push_back(manipulator);
     }
 
-    //Instantiates all manipulators
-    for(const auto& action : scenario->GetActions())
-    {
-        const auto manipulator = library->CreateManipulator(action,
-                                                            eventNetwork,
-                                                            world);
-        manipulators.push_back(manipulator);
-    }
-
     return manipulators;
 }
 
diff --git a/sim/src/core/opSimulation/bindings/manipulatorBinding.h b/sim/src/core/opSimulation/bindings/manipulatorBinding.h
index b4292a98d45b90373476c04867da590433140064..9cae8d5d8eb99c42bd69b58295561fc9ea2e3cb0 100644
--- a/sim/src/core/opSimulation/bindings/manipulatorBinding.h
+++ b/sim/src/core/opSimulation/bindings/manipulatorBinding.h
@@ -18,7 +18,6 @@
 #include "common/opExport.h"
 #include "common/callbacks.h"
 #include "include/worldInterface.h"
-#include "include/scenarioInterface.h"
 
 class PublisherInterface;
 
@@ -43,13 +42,11 @@ public:
     //! Creates all manipulators and returns them as a vector
     //!
     //! @param[in]  libraryPath         Path to the library
-    //! @param[in]  scenario            Scenario
     //! @param[in]  eventNetwork        Interface of the eventNetwork
     //! @param[in]  world               World instance
     //! @return                         Vector of created manipulators
     //-----------------------------------------------------------------------------
     std::vector<const Manipulator *> Instantiate(const std::string libraryPath,
-                                                 const ScenarioInterface *scenario,
                                                  EventNetworkInterface *eventNetwork,
                                                  WorldInterface *world,
                                                  PublisherInterface* publisher);
diff --git a/sim/src/core/opSimulation/bindings/manipulatorLibrary.cpp b/sim/src/core/opSimulation/bindings/manipulatorLibrary.cpp
index 7e3f0824a6fcd140d2b114774d3097428d922c21..4081896c3c0296414316356425591e7627f3719a 100644
--- a/sim/src/core/opSimulation/bindings/manipulatorLibrary.cpp
+++ b/sim/src/core/opSimulation/bindings/manipulatorLibrary.cpp
@@ -46,13 +46,6 @@ bool ManipulatorLibrary::Init()
         return false;
     }
 
-    createInstanceFunc = (ManipulatorInterface_CreateInstanceType)library->resolve(DllCreateInstanceId.c_str());
-    if(!createInstanceFunc)
-    {
-        LOG_INTERN(LogLevel::Error) << "could not instantiate class from DLL";
-        return false;
-    }
-
     createDefaultInstanceFunc = (ManipulatorInterface_CreateDefaultInstanceType)library->resolve(DllCreateDefaultInstanceId.c_str());
     if(!createDefaultInstanceFunc)
     {
@@ -140,34 +133,6 @@ bool ManipulatorLibrary::ReleaseManipulator(Manipulator *manipulator)
     return true;
 }
 
-Manipulator *ManipulatorLibrary::CreateManipulator(const openScenario::ManipulatorInformation manipulatorInformation,
-                                                   EventNetworkInterface* eventNetwork,
-                                                   WorldInterface* world)
-{
-    if(!library)
-    {
-        return nullptr;
-    }
-
-    if(!library->isLoaded())
-    {
-        if(!library->load())
-        {
-            return nullptr;
-        }
-    }
-
-    auto manipulatorInterface = createInstanceFunc(world,
-                                                   manipulatorInformation,
-                                                   eventNetwork,
-                                                   callbacks);
-
-    Manipulator *manipulator = new Manipulator(manipulatorInterface,
-                                               this);
-    manipulators.push_back(manipulator);
-    return manipulator;
-}
-
 Manipulator *ManipulatorLibrary::CreateManipulator(const std::string& manipulatorType,
                                                    EventNetworkInterface* eventNetwork,
                                                    WorldInterface* world,
diff --git a/sim/src/core/opSimulation/bindings/manipulatorLibrary.h b/sim/src/core/opSimulation/bindings/manipulatorLibrary.h
index 92039dd456665b0f374e3821536b74fcf6968784..daf535280a200afc6f717dee6d3fe42614e0c6ea 100644
--- a/sim/src/core/opSimulation/bindings/manipulatorLibrary.h
+++ b/sim/src/core/opSimulation/bindings/manipulatorLibrary.h
@@ -30,10 +30,6 @@ class ManipulatorLibrary
 {
 public:
     typedef const std::string &(*ManipulatorInterface_GetVersion)();
-    typedef ManipulatorInterface *(*ManipulatorInterface_CreateInstanceType)(WorldInterface *world,
-                                                                             openScenario::ManipulatorInformation manipulatorInformation,
-                                                                             EventNetworkInterface* eventNetwork,
-                                                                             const CallbackInterface *callbacks);
     typedef ManipulatorInterface *(*ManipulatorInterface_CreateDefaultInstanceType)(WorldInterface *world,
                                                                              std::string manipulatorType,
                                                                              EventNetworkInterface* eventNetwork,
@@ -81,20 +77,13 @@ public:
     //! function pointer using the parameters from either the action interface
     //! or the ManipulatorParameters to get a manipulator
     //!
-    //! @param[in]  action              Action interface containing manipulator
-    //!                                 parameters
     //! @param[in]  manipulatorType     The type of the manipulator to be instantiated;
     //!                                 this is only necessary if no action is passed
-    //! @param[in]  parameters          The parameters for the manipulator; this is
-    //!                                 only necessary if no action is passed
     //! @param[in]  eventNetwork        The event network within which the manipulator inserts events
     //! @param[in]  world               World instance
+    //! @param[in]  publisher           Publisher
     //! @return                         Manipulator created
     //-----------------------------------------------------------------------------
-    Manipulator *CreateManipulator(const openScenario::ManipulatorInformation manipulatorInformation,
-                                   EventNetworkInterface* eventNetwork,
-                                   WorldInterface* world);
-
     Manipulator *CreateManipulator(const std::string& manipulatorType,
                                    EventNetworkInterface* eventNetwork,
                                    WorldInterface* world,
@@ -102,7 +91,6 @@ public:
 
 private:
     const std::string DllGetVersionId = "OpenPASS_GetVersion";
-    const std::string DllCreateInstanceId = "OpenPASS_CreateInstance";
     const std::string DllCreateDefaultInstanceId = "OpenPASS_CreateDefaultInstance";
     const std::string DllDestroyInstanceId = "OpenPASS_DestroyInstance";
 
@@ -111,7 +99,6 @@ private:
     QLibrary *library = nullptr;
     CallbackInterface *callbacks;
     ManipulatorInterface_GetVersion getVersionFunc;
-    ManipulatorInterface_CreateInstanceType createInstanceFunc;
     ManipulatorInterface_CreateDefaultInstanceType createDefaultInstanceFunc;
     ManipulatorInterface_DestroyInstanceType destroyInstanceFunc;
 };
diff --git a/sim/src/core/opSimulation/bindings/modelBinding.cpp b/sim/src/core/opSimulation/bindings/modelBinding.cpp
index 27d8552f8e180debf3fd161912dd1ffa3344626e..71de4918dd5bbbe77ee50f6b2e89e867e31d1eb6 100644
--- a/sim/src/core/opSimulation/bindings/modelBinding.cpp
+++ b/sim/src/core/opSimulation/bindings/modelBinding.cpp
@@ -38,7 +38,7 @@ ComponentInterface *ModelBinding::Instantiate(std::shared_ptr<ComponentType> com
                                               WorldInterface *world,
                                               ObservationNetworkInterface *observationNetwork,
                                               Agent *agent,
-                                              EventNetworkInterface *eventNetwork,
+                                              std::shared_ptr<ControlStrategiesInterface> const controlStrategies,
                                               PublisherInterface *publisher)
 {
     const std::string name = componentType->GetModelLibrary();
@@ -83,7 +83,7 @@ ComponentInterface *ModelBinding::Instantiate(std::shared_ptr<ComponentType> com
                                          world,
                                          observationNetwork,
                                          agent,
-                                         eventNetwork,
+                                         controlStrategies,
                                          publisher);
 }
 
diff --git a/sim/src/core/opSimulation/bindings/modelBinding.h b/sim/src/core/opSimulation/bindings/modelBinding.h
index b00b36f75168f16c161c46720e42f547d7f015d1..ff4508896661779ffc28f8481c4c19a96b79fbc5 100644
--- a/sim/src/core/opSimulation/bindings/modelBinding.h
+++ b/sim/src/core/opSimulation/bindings/modelBinding.h
@@ -74,7 +74,7 @@ public:
                                     WorldInterface *world,
                                     ObservationNetworkInterface *observationNetwork,
                                     Agent *agent,
-                                    EventNetworkInterface *eventNetwork,
+                                    std::shared_ptr<ControlStrategiesInterface> const controlStrategies,
                                     PublisherInterface *publisher);
 
     //-----------------------------------------------------------------------------
diff --git a/sim/src/core/opSimulation/bindings/modelLibrary.cpp b/sim/src/core/opSimulation/bindings/modelLibrary.cpp
index 9bf27a1c2a0479173fadf31e7f09dd398f7a5639..ef8b7f614806076c16749136c482504c8d768f3e 100644
--- a/sim/src/core/opSimulation/bindings/modelLibrary.cpp
+++ b/sim/src/core/opSimulation/bindings/modelLibrary.cpp
@@ -184,7 +184,7 @@ ComponentInterface* ModelLibrary::CreateComponent(std::shared_ptr<ComponentType>
         WorldInterface* world,
         ObservationNetworkInterface* observationNetwork,
         Agent* agent,
-        EventNetworkInterface* eventNetwork,
+        std::shared_ptr<ControlStrategiesInterface> const controlStrategies,
         PublisherInterface* publisher)
 {
     if (!library)
@@ -255,7 +255,7 @@ ComponentInterface* ModelLibrary::CreateComponent(std::shared_ptr<ComponentType>
         }
         else*/ if (version == "0.1.0")
         {
-            implementation = reinterpret_cast<UnrestrictedEventModelInterface_CreateInstanceType>(createInstanceFunc)(
+            implementation = reinterpret_cast<UnrestrictedControllStrategyModelInterface_CreateInstanceType>(createInstanceFunc)(
                                  componentName,
                                  componentType->GetInit(),
                                  componentType->GetPriority(),
@@ -268,7 +268,7 @@ ComponentInterface* ModelLibrary::CreateComponent(std::shared_ptr<ComponentType>
                                  publisher,
                                  agent->GetAgentAdapter(),
                                  callbacks,
-                                 eventNetwork);
+                                 controlStrategies);
         }
         else
         {
diff --git a/sim/src/core/opSimulation/bindings/modelLibrary.h b/sim/src/core/opSimulation/bindings/modelLibrary.h
index 52de56ecf8dc744da40b795faf570b8812336f1d..50444021ac4ad7fb3aba17eab08f124287a0621a 100644
--- a/sim/src/core/opSimulation/bindings/modelLibrary.h
+++ b/sim/src/core/opSimulation/bindings/modelLibrary.h
@@ -49,7 +49,7 @@ public:
                                                                  PublisherInterface * const publisher,
                                                                  AgentInterface *agent,
                                                                  const CallbackInterface *callbacks);
-    typedef ModelInterface *(*UnrestrictedEventModelInterface_CreateInstanceType)(std::string componentName,
+    typedef ModelInterface *(*UnrestrictedControllStrategyModelInterface_CreateInstanceType)(std::string componentName,
                                                                                   bool isInit,
                                                                                   int priority,
                                                                                   int offsetTime,
@@ -61,7 +61,7 @@ public:
                                                                                   PublisherInterface * const publisher,
                                                                                   AgentInterface *agent,
                                                                                   const CallbackInterface *callbacks,
-                                                                                  const core::EventNetworkInterface *eventNetwork);
+                                                                                  std::shared_ptr<ControlStrategiesInterface> const controlStrategies);
     typedef void (*ModelInterface_DestroyInstanceType)(ModelInterface *implementation);
     typedef bool (*ModelInterface_UpdateInputType)(ModelInterface *implementation,
                                                    int localLinkId,
@@ -119,7 +119,7 @@ public:
     //! @param[in]     world                The world interface
     //! @param[in]     observationNetwork   Network of the observation modules
     //! @param[in]     agent                Agent instance
-    //! @param[in]     eventNetwork         Instance of the internal event logic
+    //! @param[in]     controlStrategies    Contrl strategies of the entity
     //! @param[in]     publisher            Publisher instance
     //! @return
     //-----------------------------------------------------------------------------
@@ -130,7 +130,7 @@ public:
                                         WorldInterface *world,
                                         ObservationNetworkInterface *observationNetwork,
                                         Agent *agent,
-                                        EventNetworkInterface *eventNetwork,
+                                        std::shared_ptr<ControlStrategiesInterface> const controlStrategies,
                                         PublisherInterface *publisher);
 
     //-----------------------------------------------------------------------------
diff --git a/sim/src/core/opSimulation/bindings/spawnPointLibrary.h b/sim/src/core/opSimulation/bindings/spawnPointLibrary.h
index b37116508254e95fa65f42dd6c4402a4601300ea..b2c8a2575235b6f6e324afd4acc8bb253158a755 100644
--- a/sim/src/core/opSimulation/bindings/spawnPointLibrary.h
+++ b/sim/src/core/opSimulation/bindings/spawnPointLibrary.h
@@ -25,7 +25,6 @@
 #include "include/callbackInterface.h"
 #include "include/agentBlueprintInterface.h"
 #include "include/agentBlueprintProviderInterface.h"
-#include "include/scenarioInterface.h"
 #include "common/spawnPointLibraryDefinitions.h"
 
 namespace core
diff --git a/sim/src/core/opSimulation/bindings/world.h b/sim/src/core/opSimulation/bindings/world.h
index 81d2f3a6cc1274b7660caea4ec7767fea642adce..204083ce242209c2e599e6bde9ebbcd7d9d69596 100644
--- a/sim/src/core/opSimulation/bindings/world.h
+++ b/sim/src/core/opSimulation/bindings/world.h
@@ -88,7 +88,7 @@ public:
         return implementation->GetTimeOfDay();
     }
 
-    double GetVisibilityDistance() const override
+    units::length::meter_t GetVisibilityDistance() const override
     {
         return implementation->GetVisibilityDistance();
     }
@@ -133,9 +133,14 @@ public:
         return implementation->SyncGlobalData(timestamp);
     }
 
-    bool CreateScenery(const SceneryInterface* scenery, const SceneryDynamicsInterface& sceneryDynamics, const TurningRates& turningRates) override
+    bool CreateScenery(const SceneryInterface* scenery, const TurningRates& turningRates) override
     {
-        return implementation->CreateScenery(scenery, sceneryDynamics, turningRates);
+        return implementation->CreateScenery(scenery, turningRates);
+    }
+
+    void SetWeather(const mantle_api::Weather& weather) override
+    {
+        return implementation->SetWeather(weather);
     }
 
     AgentInterface* CreateAgentAdapterForAgent() override
@@ -143,7 +148,7 @@ public:
         return implementation->CreateAgentAdapterForAgent();
     }
 
-    AgentInterface& CreateAgentAdapter(const AgentBlueprintInterface& agentBlueprint) override
+    AgentInterface &CreateAgentAdapter(const AgentBuildInstructions &agentBlueprint) override
     {
         return implementation->CreateAgentAdapter(agentBlueprint);
     }
@@ -159,44 +164,44 @@ public:
         return implementation->ResolveRelativePoint(roadGraph, startNode, relativePoint, object);
     }
 
-    RouteQueryResult<AgentInterfaces> GetAgentsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance,
-                                                                       double backwardRange, double forwardRange) const override
+    RouteQueryResult<AgentInterfaces> GetAgentsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance,
+                                                                       units::length::meter_t backwardRange, units::length::meter_t forwardRange) const override
     {
         return implementation->GetAgentsInRange(roadGraph, startNode, laneId, startDistance, backwardRange, forwardRange);
     }
 
-    RouteQueryResult<std::vector<const WorldObjectInterface*>> GetObjectsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance,
-                                                                       double backwardRange, double forwardRange) const override
+    RouteQueryResult<std::vector<const WorldObjectInterface*>> GetObjectsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance,
+                                                                       units::length::meter_t backwardRange, units::length::meter_t forwardRange) const override
     {
         return implementation->GetObjectsInRange(roadGraph, startNode, laneId, startDistance, backwardRange, forwardRange);
     }
 
-    AgentInterfaces GetAgentsInRangeOfJunctionConnection(std::string connectingRoadId, double range) const override
+    AgentInterfaces GetAgentsInRangeOfJunctionConnection(std::string connectingRoadId, units::length::meter_t range) const override
     {
         return implementation->GetAgentsInRangeOfJunctionConnection(connectingRoadId, range);
     }
 
-    double GetDistanceToConnectorEntrance(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override
+    units::length::meter_t GetDistanceToConnectorEntrance(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override
     {
         return implementation->GetDistanceToConnectorEntrance(/*position,*/ intersectingConnectorId, intersectingLaneId, ownConnectorId);
     }
 
-    double GetDistanceToConnectorDeparture(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override
+    units::length::meter_t GetDistanceToConnectorDeparture(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override
     {
         return implementation->GetDistanceToConnectorDeparture(/*position,*/ intersectingConnectorId, intersectingLaneId, ownConnectorId);
     }
 
-    Position LaneCoord2WorldCoord(double distance, double offset, std::string roadId, int laneId) const override
+    Position LaneCoord2WorldCoord(units::length::meter_t distance, units::length::meter_t offset, std::string roadId, int laneId) const override
     {
         return implementation->LaneCoord2WorldCoord(distance, offset, roadId, laneId);
     }
 
-    GlobalRoadPositions WorldCoord2LaneCoord(double x, double y, double heading) const override
+    GlobalRoadPositions WorldCoord2LaneCoord(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t heading) const override
     {
         return implementation->WorldCoord2LaneCoord(x, y, heading);
     }
 
-    bool IsSValidOnLane(std::string roadId, int laneId, double distance) override
+    bool IsSValidOnLane(std::string roadId, int laneId, units::length::meter_t distance) override
     {
         return implementation->IsSValidOnLane(roadId, laneId, distance);
     }
@@ -206,49 +211,49 @@ public:
         return implementation->IsDirectionalRoadExisting(roadId, inOdDirection);
     }
 
-    bool IsLaneTypeValid(const std::string &roadId, const int laneId, const double distanceOnLane, const LaneTypes& validLaneTypes) override
+    bool IsLaneTypeValid(const std::string &roadId, const int laneId, const units::length::meter_t distanceOnLane, const LaneTypes& validLaneTypes) override
     {
         return implementation->IsLaneTypeValid(roadId, laneId, distanceOnLane, validLaneTypes);
     }
 
-    double GetLaneCurvature(std::string roadId, int laneId, double position) const override
+    units::curvature::inverse_meter_t GetLaneCurvature(std::string roadId, int laneId, units::length::meter_t position) const override
     {
         return implementation->GetLaneCurvature(roadId, laneId, position);
     }
 
-    RouteQueryResult<std::optional<double> > GetLaneCurvature(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const override
+    RouteQueryResult<std::optional<units::curvature::inverse_meter_t> > GetLaneCurvature(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const override
     {
         return  implementation->GetLaneCurvature(roadGraph, startNode, laneId, position, distance);
     }
 
-    double GetLaneWidth(std::string roadId, int laneId, double position) const override
+    units::length::meter_t GetLaneWidth(std::string roadId, int laneId, units::length::meter_t position) const override
     {
         return implementation->GetLaneWidth(roadId, laneId, position);
     }
 
-    RouteQueryResult<std::optional<double> > GetLaneWidth(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const override
+    RouteQueryResult<std::optional<units::length::meter_t> > GetLaneWidth(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const override
     {
         return  implementation->GetLaneWidth(roadGraph, startNode, laneId, position, distance);
     }
 
-    double GetLaneDirection(std::string roadId, int laneId, double position) const override
+    units::angle::radian_t GetLaneDirection(std::string roadId, int laneId, units::length::meter_t position) const override
     {
         return implementation->GetLaneDirection(roadId, laneId, position);
     }
 
-    RouteQueryResult<std::optional<double> > GetLaneDirection(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const override
+    RouteQueryResult<std::optional<units::angle::radian_t> > GetLaneDirection(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const override
     {
         return  implementation->GetLaneDirection(roadGraph, startNode, laneId, position, distance);
     }
 
-    RouteQueryResult<double> GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance,
-                                                                     double maximumSearchLength) const override
+    RouteQueryResult<units::length::meter_t> GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance,
+                                                                     units::length::meter_t maximumSearchLength) const override
     {
         return implementation->GetDistanceToEndOfLane(roadGraph, startNode, laneId, initialSearchDistance, maximumSearchLength);
     }
 
-    RouteQueryResult<double> GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance,
-                                                                     double maximumSearchLength, const LaneTypes& laneTypes) const override
+    RouteQueryResult<units::length::meter_t> GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance,
+                                                                     units::length::meter_t maximumSearchLength, const LaneTypes& laneTypes) const override
     {
         return implementation->GetDistanceToEndOfLane(roadGraph, startNode, laneId, initialSearchDistance, maximumSearchLength, laneTypes);
     }
@@ -258,7 +263,7 @@ public:
         return implementation->GetLaneSections(roadId);
     }
 
-    bool IntersectsWithAgent(double x, double y, double rotation, double length, double width, double center) override
+    bool IntersectsWithAgent(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t rotation, units::length::meter_t length, units::length::meter_t width, units::length::meter_t center) override
     {
         return implementation->IntersectsWithAgent(x, y, rotation, length, width, center);
     }
@@ -268,7 +273,7 @@ public:
         return implementation->RoadCoord2WorldCoord(roadCoord, roadID);
     }
 
-    double GetRoadLength (const std::string& roadId) const override
+    units::length::meter_t GetRoadLength (const std::string& roadId) const override
     {
         return implementation->GetRoadLength(roadId);
     }
@@ -307,45 +312,45 @@ public:
     }
 
     RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetTrafficSignsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                    double startDistance, double searchRange) const override
+                                                                                    units::length::meter_t startDistance, units::length::meter_t searchRange) const override
     {
         return implementation->GetTrafficSignsInRange(roadGraph, startNode, laneId, startDistance, searchRange);
     }
 
     RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetRoadMarkingsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                                double startDistance, double searchRange) const override
+                                                                                                units::length::meter_t startDistance, units::length::meter_t searchRange) const override
     {
         return implementation->GetRoadMarkingsInRange(roadGraph, startNode, laneId, startDistance, searchRange);
     }
 
     RouteQueryResult<std::vector<CommonTrafficLight::Entity>> GetTrafficLightsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                      double startDistance, double searchRange) const override
+                                                                                      units::length::meter_t startDistance, units::length::meter_t searchRange) const override
     {
         return implementation->GetTrafficLightsInRange(roadGraph, startNode, laneId, startDistance, searchRange);
     }
 
     RouteQueryResult<std::vector<LaneMarking::Entity>> GetLaneMarkings(const RoadGraph& roadGraph, RoadGraphVertex startNode,
-                                                                       int laneId, double startDistance, double range, Side side) const override
+                                                                       int laneId, units::length::meter_t startDistance, units::length::meter_t range, Side side) const override
     {
         return implementation->GetLaneMarkings(roadGraph, startNode,laneId, startDistance, range, side);
     }
 
-    [[deprecated]] RouteQueryResult<RelativeWorldView::Roads> GetRelativeJunctions(const RoadGraph &roadGraph, RoadGraphVertex startNode, double startDistance, double range) const override
+    [[deprecated]] RouteQueryResult<RelativeWorldView::Roads> GetRelativeJunctions(const RoadGraph &roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range) const override
     {
         return implementation->GetRelativeJunctions(roadGraph, startNode, startDistance, range);
     }
 
-    RouteQueryResult<RelativeWorldView::Roads> GetRelativeRoads(const RoadGraph& roadGraph, RoadGraphVertex startNode, double startDistance, double range) const override
+    RouteQueryResult<RelativeWorldView::Roads> GetRelativeRoads(const RoadGraph& roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range) const override
     {
         return implementation->GetRelativeRoads(roadGraph, startNode, startDistance, range);
     }
 
-    RouteQueryResult<RelativeWorldView::Lanes> GetRelativeLanes(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, double range, bool includeOncoming = true) const override
+    RouteQueryResult<RelativeWorldView::Lanes> GetRelativeLanes(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, units::length::meter_t range, bool includeOncoming = true) const override
     {
         return implementation->GetRelativeLanes(roadGraph, startNode, laneId, distance, range, includeOncoming);
     }
 
-    RouteQueryResult<std::optional<int>> GetRelativeLaneId(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, GlobalRoadPositions targetPosition) const override
+    RouteQueryResult<std::optional<int>> GetRelativeLaneId(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, GlobalRoadPositions targetPosition) const override
     {
         return implementation->GetRelativeLaneId(roadGraph, startNode, laneId, distance, targetPosition);
     }
@@ -391,7 +396,7 @@ public:
     }
 
     virtual RouteQueryResult<Obstruction> GetObstruction(const RoadGraph &roadGraph, RoadGraphVertex startNode, const GlobalRoadPosition &ownPosition,
-                                                         const std::map<ObjectPoint, Common::Vector2d> &points, const RoadIntervals &touchedRoads) const override
+                                                         const std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> &points, const RoadIntervals &touchedRoads) const override
     {
         return implementation->GetObstruction(roadGraph, startNode, ownPosition, points, touchedRoads);
     }
@@ -445,7 +450,7 @@ public:
     {
         return implementation->CreateWorldScenario(scenarioFilename);
     }
-    RouteQueryResult<std::optional<double>> GetDistanceBetweenObjects(const RoadGraph& roadGraph, RoadGraphVertex startNode, double ownPosition, const GlobalRoadPositions &target) const override
+    RouteQueryResult<std::optional<units::length::meter_t>> GetDistanceBetweenObjects(const RoadGraph& roadGraph, RoadGraphVertex startNode, units::length::meter_t ownPosition, const GlobalRoadPositions &target) const override
     {
         return implementation->GetDistanceBetweenObjects(roadGraph, startNode, ownPosition, target);
     }
@@ -453,6 +458,10 @@ public:
     {
         return implementation->GetRadio();
     }
+    virtual uint64_t GetUniqueLaneId(std::string roadId, int laneId, units::length::meter_t position) const override
+    {
+        return implementation->GetUniqueLaneId(roadId, laneId, position);
+    }
 
 private:
     WorldBinding* worldBinding = nullptr;
diff --git a/sim/src/core/opSimulation/framework/agentBlueprintProvider.cpp b/sim/src/core/opSimulation/framework/agentBlueprintProvider.cpp
index 50d9ef7225f424e1a3179f8fd6206e0d5b0b3065..577d8c8f91ed4011d573d75f86afd92ad0d762aa 100644
--- a/sim/src/core/opSimulation/framework/agentBlueprintProvider.cpp
+++ b/sim/src/core/opSimulation/framework/agentBlueprintProvider.cpp
@@ -12,26 +12,48 @@
 #include "systemConfigImporter.h"
 #include "dynamicProfileSampler.h"
 #include "dynamicParametersSampler.h"
-#include "agentBlueprint.h"
+#include "sampler.h"
 #include "common/log.h"
 
-AgentBlueprintProvider::AgentBlueprintProvider(ConfigurationContainerInterface *configurationContainer, StochasticsInterface& stochastics) :
+AgentBlueprintProvider::AgentBlueprintProvider(ConfigurationContainerInterface *configurationContainer, StochasticsInterface* stochastics) :
     stochastics(stochastics),
     profiles(configurationContainer->GetProfiles()),
-    agentProfiles(configurationContainer->GetProfiles()->GetAgentProfiles()),
-    vehicleModels(configurationContainer->GetVehicleModels()),
+    agentProfiles(&(configurationContainer->GetProfiles()->GetAgentProfiles())),
     systemConfigBlueprint(configurationContainer->GetSystemConfigBlueprint()),
-    systemConfigs(configurationContainer->GetSystemConfigs())
+    systemConfigs(&(configurationContainer->GetSystemConfigs()))
 {
 }
 
-AgentBlueprint AgentBlueprintProvider::SampleAgent(const std::string& agentProfileName, const openScenario::Parameters& assignedParameters) const
+void AgentBlueprintProvider::Init(ConfigurationContainerInterface *configurationContainer, StochasticsInterface* stochastics)
 {
-    AgentBlueprint agentBlueprint;
+    profiles = configurationContainer->GetProfiles();
+    agentProfiles = &(configurationContainer->GetProfiles()->GetAgentProfiles());
+    systemConfigBlueprint = configurationContainer->GetSystemConfigBlueprint();
+    systemConfigs = &(configurationContainer->GetSystemConfigs());
 
+    this->stochastics = stochastics;
+}
+
+std::string AgentBlueprintProvider::SampleVehicleModelName(const std::string &agentProfileName) const
+{
+    auto agentProfile = agentProfiles->at(agentProfileName);
+
+    if (agentProfile.type == AgentProfileType::Dynamic)
+    {
+        auto probabilities = profiles->GetVehicleModelsProbabilities(agentProfileName);
+        return Sampler::Sample(probabilities, stochastics);
+    }
+    else
+    {
+        return agentProfile.vehicleModel;
+    }
+}
+
+System AgentBlueprintProvider::SampleSystem(const std::string &agentProfileName) const
+{
     try
     {
-        const auto agentProfile = agentProfiles.at(agentProfileName);
+        const auto agentProfile = agentProfiles->at(agentProfileName);
         if (agentProfile.type == AgentProfileType::Dynamic)
         {
             if(systemConfigBlueprint == nullptr)
@@ -39,27 +61,22 @@ AgentBlueprint AgentBlueprintProvider::SampleAgent(const std::string& agentProfi
                 LogErrorAndThrow("Couldn't instantiate AgentProfile:" + agentProfileName + ". SystemConfigBlueprint is either missing or invalid.");
             }
 
-            SampledProfiles sampledProfiles = SampledProfiles::make(agentProfileName, stochastics, profiles)
+            SampledProfiles sampledProfiles = SampledProfiles::make(agentProfileName, *stochastics, profiles)
                     .SampleDriverProfile()
-                    .SampleVehicleProfile()
+                    .SampleSystemProfile()
                     .SampleVehicleComponentProfiles();
-            DynamicParameters dynamicParameters = DynamicParameters::make(stochastics, sampledProfiles.vehicleProfileName, profiles)
+            DynamicParameters dynamicParameters = DynamicParameters::make(*stochastics, sampledProfiles.systemProfileName, profiles)
                     .SampleSensorLatencies();
-            AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, profiles, vehicleModels)
-                    .SetVehicleModelParameters(assignedParameters)
+            AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, profiles)
                     .GatherBasicComponents()
                     .GatherDriverComponents()
                     .GatherVehicleComponents()
                     .GatherSensors();
-            GenerateDynamicAgentBlueprint(agentBlueprint, agentBuildInformation, sampledProfiles.driverProfileName);
-
-            return agentBlueprint;
+            return GenerateDynamicAgentBlueprint(agentBuildInformation, agentProfileName, sampledProfiles.driverProfileName);
         }
         else
         {
-            GenerateStaticAgentBlueprint(agentBlueprint, agentProfile.systemConfigFile, agentProfile.systemId, agentProfile.vehicleModel);
-
-            return agentBlueprint;
+            return GenerateStaticAgentBlueprint(agentProfile.systemConfigFile, agentProfile.systemId, agentProfileName);
         }
     }
     catch (const std::out_of_range& e)
@@ -76,25 +93,28 @@ AgentBlueprint AgentBlueprintProvider::SampleAgent(const std::string& agentProfi
     }
 }
 
-void AgentBlueprintProvider::GenerateDynamicAgentBlueprint(AgentBlueprintInterface &agentBlueprint, AgentBuildInformation agentBuildInformation, std::string &driverProfileName) const
+System AgentBlueprintProvider::GenerateDynamicAgentBlueprint(AgentBuildInformation agentBuildInformation,
+                                                           const std::string agentProfileName,
+                                                           const std::string& driverProfileName) const
 {
-    agentBlueprint.SetVehicleModelName(agentBuildInformation.vehicleModelName);
-    agentBlueprint.SetVehicleModelParameters(agentBuildInformation.vehicleModelParameters);
-    agentBlueprint.SetDriverProfileName(driverProfileName);
-    agentBlueprint.SetAgentType(agentBuildInformation.agentType);
-
-    for(const auto& sensor : agentBuildInformation.sensorParameters)
-    {
-        agentBlueprint.AddSensor(sensor);
-    }
+    System system;
+    system.agentProfileName = agentProfileName;
+    system.driverProfileName = driverProfileName;
+    system.agentType = agentBuildInformation.agentType;
+    system.sensorParameters = agentBuildInformation.sensorParameters;
+    return system;
 }
 
-void AgentBlueprintProvider::GenerateStaticAgentBlueprint(AgentBlueprintInterface &agentBlueprint, std::string systemConfigName, int systemId, std::string vehicleModelName) const
+System AgentBlueprintProvider::GenerateStaticAgentBlueprint(std::string systemConfigName,
+                                                          int systemId,
+                                                          const std::string& agentProfileName) const
 {
+    System system;
+    system.agentProfileName = agentProfileName;
     try
     {
-        const auto& systems = systemConfigs.at(systemConfigName)->GetSystems();
-        agentBlueprint.SetAgentType(systems.at(systemId));
+        const auto& systems = systemConfigs->at(systemConfigName)->GetSystems();
+        system.agentType = systems.at(systemId);
     }
     catch (const std::out_of_range& e)
     {
@@ -102,8 +122,5 @@ void AgentBlueprintProvider::GenerateStaticAgentBlueprint(AgentBlueprintInterfac
         LOG_INTERN(LogLevel::Error) << message;
         throw std::runtime_error(message);
     }
-
-    agentBlueprint.SetVehicleModelName(vehicleModelName);
-    const auto vehicleModelParameters = vehicleModels->GetVehicleModel(vehicleModelName);
-    agentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
+    return system;
 }
diff --git a/sim/src/core/opSimulation/framework/agentBlueprintProvider.h b/sim/src/core/opSimulation/framework/agentBlueprintProvider.h
index 2458c54f1a54ea070f7fae1592427329c8344b2d..e5ac6998cd0cbec1f5fff935ab3f97d7e9323e1a 100644
--- a/sim/src/core/opSimulation/framework/agentBlueprintProvider.h
+++ b/sim/src/core/opSimulation/framework/agentBlueprintProvider.h
@@ -24,7 +24,11 @@
 class SIMULATIONCOREEXPORT AgentBlueprintProvider : public AgentBlueprintProviderInterface
 {
 public:
-    AgentBlueprintProvider(ConfigurationContainerInterface* configurationContainer, StochasticsInterface& stochastics);
+    AgentBlueprintProvider() = default;
+
+    AgentBlueprintProvider(ConfigurationContainerInterface* configurationContainer, StochasticsInterface* stochastics);
+
+    void Init(ConfigurationContainerInterface *configurationContainer, StochasticsInterface* stochastics);
 
     /*!
     * \brief Samples an entire agent
@@ -33,11 +37,12 @@ public:
     * profiles and builds an AgentType from this or loads the AgentType from the specified SystemConfig
     *
     * \param    agentProfileName    name of agent profile to sample
-    * \param    assignedParameters  parameters assigned by a catalog reference if appropriate
     *
     * \return   sampled AgentBlueprint if successful
     */
-    virtual AgentBlueprint SampleAgent(const std::string& agentProfileName, const openScenario::Parameters& assignedParameters) const override;
+    virtual System SampleSystem(const std::string &agentProfileName) const override;
+
+    std::string SampleVehicleModelName(const std::string &agentProfileName) const override;
 
     /*!
      * \brief Store sampled information in AgentBlueprint for dynamic AgentProfile
@@ -45,9 +50,9 @@ public:
      * \param agentBuildInformation     AgentBuildInformation with information to store into the agentBlueprint
      * \param driverProfileName         name of sampled DriverProfile
      */
-    void GenerateDynamicAgentBlueprint(AgentBlueprintInterface& agentBlueprint,
-                                       AgentBuildInformation agentBuildInformation,
-                                       std::string& driverProfileName) const;
+    System GenerateDynamicAgentBlueprint(AgentBuildInformation agentBuildInformation,
+                                         const std::string agentProfileName,
+                                         const std::string& driverProfileName) const;
 
     /*!
     * \brief Store sampled information in AgentBlueprint for static AgentProfile
@@ -57,17 +62,15 @@ public:
     * @param[in]        systemId                Id of system to build (referes to given systemConfig
     * @param[in]        vehicleModelName        Name of vehicle model for system
     */
-    void GenerateStaticAgentBlueprint(AgentBlueprintInterface& agentBlueprint,
-                                      std::string systemConfigName,
-                                      int systemId,
-                                      std::string vehicleModelName) const;
+    System GenerateStaticAgentBlueprint(std::string systemConfigName,
+                                        int systemId,
+                                        const std::string& agentProfileName) const;
 
 private:
-    StochasticsInterface& stochastics;
+    StochasticsInterface* stochastics {nullptr};
     const ProfilesInterface* profiles {nullptr};
-    const std::unordered_map<std::string, AgentProfile>& agentProfiles;
-    const VehicleModelsInterface* vehicleModels {nullptr};
-    std::shared_ptr<SystemConfigInterface> systemConfigBlueprint;
-    const std::map<std::string, std::shared_ptr<SystemConfigInterface>>& systemConfigs;
+    const std::unordered_map<std::string, AgentProfile>* agentProfiles {nullptr};
+    std::shared_ptr<SystemConfigInterface> systemConfigBlueprint {nullptr};
+    const std::map<std::string, std::shared_ptr<SystemConfigInterface>>* systemConfigs {nullptr};
 
 };
diff --git a/sim/src/core/opSimulation/framework/agentFactory.cpp b/sim/src/core/opSimulation/framework/agentFactory.cpp
index 4a8ecb6d770b73fc06f085f3a55c9d9a08e2f104..020c4d82e02c167e1af722298ebdc8395a222069 100644
--- a/sim/src/core/opSimulation/framework/agentFactory.cpp
+++ b/sim/src/core/opSimulation/framework/agentFactory.cpp
@@ -9,50 +9,45 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
+#include "agentFactory.h"
+
 #include <algorithm>
 #include <list>
 #include <sstream>
 
 #include "agent.h"
-#include "agentFactory.h"
-#include "agentType.h"
-#include "channel.h"
-#include "channelBuffer.h"
-
 #include "agentDataPublisher.h"
+#include "agentType.h"
 #include "bindings/modelBinding.h"
-#include "spawnPoint.h"
 #include "bindings/stochastics.h"
-
+#include "channel.h"
+#include "channelBuffer.h"
 #include "common/log.h"
-#include "modelElements/parameters.h"
 #include "include/componentInterface.h"
 #include "include/observationNetworkInterface.h"
 #include "include/worldInterface.h"
+#include "modelElements/parameters.h"
+#include "spawnPoint.h"
 
 const std::string AgentCategoryStrings[] =
-{
-    "Ego",
-    "Scenario",
-    "Common"
-};
+    {
+        "Ego",
+        "Scenario",
+        "Common"};
 
 class DataBufferInterface;
 
-namespace core
-{
+namespace core {
 
 AgentFactory::AgentFactory(ModelBinding *modelBinding,
                            WorldInterface *world,
                            Stochastics *stochastics,
                            ObservationNetworkInterface *observationNetwork,
-                           EventNetworkInterface *eventNetwork,
-                           DataBufferWriteInterface* dataBuffer) :
+                           DataBufferWriteInterface *dataBuffer) :
     modelBinding(modelBinding),
     world(world),
     stochastics(stochastics),
     observationNetwork(observationNetwork),
-    eventNetwork(eventNetwork),
     dataBuffer(dataBuffer)
 {
 }
@@ -62,27 +57,27 @@ void AgentFactory::Clear()
     agentList.clear();
 }
 
-Agent* AgentFactory::AddAgent(AgentBlueprintInterface* agentBlueprint)
+Agent *AgentFactory::AddAgent(const AgentBuildInstructions &agentBuildInstructions)
 {
     try
     {
-        auto agent = CreateAgent(*agentBlueprint);
-        PublishProperties(*agent);
+        auto agent = CreateAgent(agentBuildInstructions);
+        PublishProperties(agentBuildInstructions, agent->GetId());
         agentList.push_back(std::move(agent));
         return agentList.back().get();
     }
-    catch (const std::runtime_error& e)
+    catch (const std::runtime_error &e)
     {
         LOG_INTERN(LogLevel::Error) << "could not create agent: " << e.what();
         return nullptr;
     }
 }
 
-std::unique_ptr<Agent> AgentFactory::CreateAgent(const AgentBlueprintInterface& agentBlueprint)
+std::unique_ptr<Agent> AgentFactory::CreateAgent(const AgentBuildInstructions &agentBuildInstructions)
 {
     LOG_INTERN(LogLevel::DebugCore) << "create new agent";
 
-    auto agent = std::make_unique<Agent>(world, agentBlueprint);
+    auto agent = std::make_unique<Agent>(world, agentBuildInstructions);
 
     if (!agent)
     {
@@ -94,11 +89,10 @@ std::unique_ptr<Agent> AgentFactory::CreateAgent(const AgentBlueprintInterface&
         LOG_INTERN(LogLevel::DebugCore) << "agent created (" << agent->GetId() << ")";
     }
 
-    if (!agent->Instantiate(agentBlueprint,
+    if (!agent->Instantiate(agentBuildInstructions,
                             modelBinding,
                             stochastics,
                             observationNetwork,
-                            eventNetwork,
                             dataBuffer))
     {
         LOG_INTERN(LogLevel::Error) << "agent could not be instantiated";
@@ -117,36 +111,36 @@ std::unique_ptr<Agent> AgentFactory::CreateAgent(const AgentBlueprintInterface&
 
 bool AgentFactory::ConnectAgentLinks(Agent *agent)
 {
-    for(const std::pair<const std::string, ComponentInterface*> &itemComponent : agent->GetComponents())
+    for (const std::pair<const std::string, ComponentInterface *> &itemComponent : agent->GetComponents())
     {
-        if(!itemComponent.second)
+        if (!itemComponent.second)
         {
             return false;
         }
 
-        for(const std::pair<const int, Channel*> &itemChannel : itemComponent.second->GetOutputLinks())
+        for (const std::pair<const int, Channel *> &itemChannel : itemComponent.second->GetOutputLinks())
         {
             int outputLinkId = itemChannel.first;
             Channel *channel = itemChannel.second;
-            if(!channel)
+            if (!channel)
             {
                 return false;
             }
 
             ComponentInterface *source = channel->GetSource();
-            if(!source)
+            if (!source)
             {
                 return false;
             }
 
             ChannelBuffer *buffer = source->CreateOutputBuffer(outputLinkId);
-            if(!buffer || !(channel->AttachSourceBuffer(buffer)))
+            if (!buffer || !(channel->AttachSourceBuffer(buffer)))
             {
                 return false;
             }
 
             // channel buffer is now attached to channel and will be released when deleting the agent
-            for(const std::tuple<int, ComponentInterface*> &item : channel->GetTargets())
+            for (const std::tuple<int, ComponentInterface *> &item : channel->GetTargets())
             {
                 int targetLinkId = std::get<static_cast<size_t>(Channel::TargetLinkType::LinkId)>(item);
                 ComponentInterface *targetComponent = std::get<static_cast<size_t>(Channel::TargetLinkType::Component)>(item);
@@ -158,34 +152,39 @@ bool AgentFactory::ConnectAgentLinks(Agent *agent)
     return true;
 }
 
-void AgentFactory::PublishProperties(const Agent& agent)
+void AgentFactory::PublishProperties(const AgentBuildInstructions &agentBuildInstructions, int agentId)
 {
-    const auto adapter = agent.GetAgentAdapter();
-    const std::string keyPrefix = "Agents/" + std::to_string(agent.GetId()) + "/";
-    dataBuffer->PutStatic(keyPrefix + "AgentTypeGroupName", AgentCategoryStrings[static_cast<int>(adapter->GetAgentCategory())]);
-    dataBuffer->PutStatic(keyPrefix + "AgentTypeName", adapter->GetAgentTypeName());
-    dataBuffer->PutStatic(keyPrefix + "VehicleModelType", adapter->GetVehicleModelType());
-    dataBuffer->PutStatic(keyPrefix + "DriverProfileName", adapter->GetDriverProfileName());
-    dataBuffer->PutStatic(keyPrefix + "AgentType", std::string(openpass::utils::to_cstr(adapter->GetVehicleModelParameters().vehicleType)));   // std::string for compatibility with gcc-9 std::ariant
-
-    const auto& vehicleModelParameters = adapter->GetVehicleModelParameters();
-    dataBuffer->PutStatic(keyPrefix + "Vehicle/Width", vehicleModelParameters.boundingBoxDimensions.width);
-    dataBuffer->PutStatic(keyPrefix + "Vehicle/Length", vehicleModelParameters.boundingBoxDimensions.length);
-    dataBuffer->PutStatic(keyPrefix + "Vehicle/Height", vehicleModelParameters.boundingBoxDimensions.height);
-    dataBuffer->PutStatic(keyPrefix + "Vehicle/LongitudinalPivotOffset", -vehicleModelParameters.boundingBoxCenter.x);
-
-    for (const auto& sensor : adapter->GetSensorParameters())
+    const std::string keyPrefix = "Agents/" + std::to_string(agentId) + "/";
+    dataBuffer->PutStatic(keyPrefix + "AgentTypeGroupName", AgentCategoryStrings[static_cast<int>(agentBuildInstructions.agentCategory)]);
+    dataBuffer->PutStatic(keyPrefix + "AgentTypeName", agentBuildInstructions.system.agentProfileName);
+    dataBuffer->PutStatic(keyPrefix + "VehicleModelType", agentBuildInstructions.entityProperties->model);
+    dataBuffer->PutStatic(keyPrefix + "DriverProfileName", agentBuildInstructions.system.driverProfileName);
+    dataBuffer->PutStatic(keyPrefix + "EntityType", std::string(openpass::utils::to_cstr(agentBuildInstructions.entityProperties->type))); // std::string for compatibility with gcc-9 std::ariant
+
+    const auto &entityProperties = agentBuildInstructions.entityProperties;
+    if (entityProperties->type == mantle_api::EntityType::kVehicle)
+    {
+        dataBuffer->PutStatic(keyPrefix + "VehicleClassification", std::string(openpass::utils::to_cstr(std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(entityProperties)->classification))); // std::string for compatibility with gcc-9 std::ariant
+    }
+
+    dataBuffer->PutStatic(keyPrefix + "Vehicle/Width", units::unit_cast<double>(entityProperties->bounding_box.dimension.width));
+    dataBuffer->PutStatic(keyPrefix + "Vehicle/Length", units::unit_cast<double>(entityProperties->bounding_box.dimension.length));
+    dataBuffer->PutStatic(keyPrefix + "Vehicle/Height", units::unit_cast<double>(entityProperties->bounding_box.dimension.height));
+    dataBuffer->PutStatic(keyPrefix + "Vehicle/LongitudinalPivotOffset", units::unit_cast<double>(-entityProperties->bounding_box.geometric_center.x));
+
+    for (const auto &sensor : agentBuildInstructions.system.sensorParameters)
     {
+        const auto sensorPosition = openpass::sensors::GetPosition(sensor.positionName, *std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(entityProperties));
         const std::string sensorKeyPrefix = keyPrefix + "Vehicle/Sensors/" + std::to_string(sensor.id) + "/";
         dataBuffer->PutStatic(sensorKeyPrefix + "Type", sensor.profile.type);
-        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Position/Longitudinal", sensor.position.longitudinal);
-        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Position/Lateral", sensor.position.lateral);
-        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Position/Height", sensor.position.height);
-        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Orientation/Yaw", sensor.position.yaw);
-        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Orientation/Pitch", sensor.position.pitch);
-        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Orientation/Roll", sensor.position.roll);
-
-        const auto& parameters = sensor.profile.parameter;
+        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Position/Longitudinal", units::unit_cast<double>(sensorPosition.pose.position.x));
+        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Position/Lateral", units::unit_cast<double>(sensorPosition.pose.position.y));
+        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Position/Height", units::unit_cast<double>(sensorPosition.pose.position.z));
+        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Orientation/Yaw", units::unit_cast<double>(sensorPosition.pose.orientation.yaw));
+        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Orientation/Pitch", units::unit_cast<double>(sensorPosition.pose.orientation.pitch));
+        dataBuffer->PutStatic(sensorKeyPrefix + "Mounting/Orientation/Roll", units::unit_cast<double>(sensorPosition.pose.orientation.roll));
+
+        const auto &parameters = sensor.profile.parameter;
 
         if (auto latency = openpass::parameter::Get<double>(parameters, "Latency"))
         {
diff --git a/sim/src/core/opSimulation/framework/agentFactory.h b/sim/src/core/opSimulation/framework/agentFactory.h
index 7ef2adb625dd715b1977cfeb57c6cd78b9870122..2cc78f01cf685f37edc0551b2bb479d8616081f4 100644
--- a/sim/src/core/opSimulation/framework/agentFactory.h
+++ b/sim/src/core/opSimulation/framework/agentFactory.h
@@ -26,7 +26,6 @@
 #include <memory>
 
 #include "include/agentFactoryInterface.h"
-#include "include/eventNetworkInterface.h"
 #include "include/worldInterface.h"
 #include "common/opExport.h"
 
@@ -48,12 +47,11 @@ public:
                  WorldInterface *world,
                  Stochastics *stochastics,
                  ObservationNetworkInterface *observationNetwork,
-                 core::EventNetworkInterface *eventNetwork,
                  DataBufferWriteInterface* dataBuffer);
     virtual ~AgentFactory() override = default;
 
     virtual void Clear() override;
-    virtual Agent *AddAgent(AgentBlueprintInterface* agentBlueprint) override;
+    virtual Agent *AddAgent(const AgentBuildInstructions &agentBuildInstructions) override;
 
 private:
     //-----------------------------------------------------------------------------
@@ -78,15 +76,14 @@ private:
     //!                                 informations to create an agent
     //! @return                         The created agent
     //-----------------------------------------------------------------------------
-    std::unique_ptr<Agent> CreateAgent(const AgentBlueprintInterface& agentBlueprint);
+    std::unique_ptr<Agent> CreateAgent(const AgentBuildInstructions &agentBuildInstructions);
 
-    void PublishProperties(const Agent& agent);
+    void PublishProperties(const AgentBuildInstructions &agentBuildInstructions, int agentId);
 
     ModelBinding *modelBinding;
     WorldInterface *world;
     Stochastics *stochastics;
     ObservationNetworkInterface *observationNetwork;
-    EventNetworkInterface *eventNetwork;
     DataBufferWriteInterface *dataBuffer;
 
     std::vector<std::unique_ptr<Agent>> agentList;
diff --git a/sim/src/core/opSimulation/framework/configurationContainer.cpp b/sim/src/core/opSimulation/framework/configurationContainer.cpp
index 6ffb7c7af22b65afd8e4367fd65ec7a2d8a49731..2e62c9637fdcc6705f7a29ad70ac922bcd57d86a 100644
--- a/sim/src/core/opSimulation/framework/configurationContainer.cpp
+++ b/sim/src/core/opSimulation/framework/configurationContainer.cpp
@@ -13,9 +13,10 @@
 /** \file  ConfigurationContainer.cpp */
 //-----------------------------------------------------------------------------
 
-#include "directories.h"
 #include "configurationContainer.h"
 
+#include "directories.h"
+
 using namespace Importer;
 
 bool ConfigurationContainer::ImportAllConfigurations()
@@ -30,8 +31,8 @@ bool ConfigurationContainer::ImportAllConfigurations()
 
     //Import SimulationConfig
     if (!SimulationConfigImporter::Import(configurationFiles.configurationDir,
-                                     configurationFiles.simulationConfigFile,
-                                     simulationConfig))
+                                          configurationFiles.simulationConfigFile,
+                                          simulationConfig))
     {
         LOG_INTERN(LogLevel::Error) << "could not import simulation configuration '" << configurationFiles.simulationConfigFile << "'";
         return false;
@@ -44,44 +45,12 @@ bool ConfigurationContainer::ImportAllConfigurations()
         return false;
     }
 
-    //Import Scenario
-    if (!ScenarioImporter::Import(simulationConfig.GetScenarioConfig().scenarioPath, &scenario))
-    {
-        LOG_INTERN(LogLevel::Error) << "could not import scenario";
-        return false;
-    }
-
-    //Import Scenery
-    if (!SceneryImporter::Import(openpass::core::Directories::Concat(configurationFiles.configurationDir, scenario.GetSceneryPath()),
-                                 &scenery))
-    {
-        LOG_INTERN(LogLevel::Error) << "could not import scenery";
-        return false;
-    }
-
-    //Import VehicleModels
-    std::string vehicleCatalogPath = "";
-    if (!scenario.GetVehicleCatalogPath().empty())
-    {
-        vehicleCatalogPath = openpass::core::Directories::Concat(configurationFiles.configurationDir, scenario.GetVehicleCatalogPath());
-    }
-    std::string pedestrianCatalogPath = "";
-    if (!scenario.GetPedestrianCatalogPath().empty())
-    {
-        pedestrianCatalogPath = openpass::core::Directories::Concat(configurationFiles.configurationDir, scenario.GetPedestrianCatalogPath());
-    }
-    if (!VehicleModelsImporter::Import(vehicleCatalogPath,pedestrianCatalogPath,vehicleModels))
-    {
-        LOG_INTERN(LogLevel::Error) << "could not import vehicle models";
-        return false;
-    }
-
     std::set<std::string> systemConfigFiles;
     std::transform(profiles.GetAgentProfiles().begin(), profiles.GetAgentProfiles().end(), std::inserter(systemConfigFiles, systemConfigFiles.begin()),
-                   [](const auto& agentProfile){return agentProfile.second.systemConfigFile;});
+                   [](const auto &agentProfile) { return agentProfile.second.systemConfigFile; });
 
     //Import SystemConfigs
-    for (const auto& systemConfigFile : systemConfigFiles)
+    for (const auto &systemConfigFile : systemConfigFiles)
     {
         if (systemConfigFile == "")
         {
@@ -89,7 +58,7 @@ bool ConfigurationContainer::ImportAllConfigurations()
         }
         auto systemConfig = std::make_shared<SystemConfig>();
 
-        if(!SystemConfigImporter::Import(openpass::core::Directories::Concat(configurationFiles.configurationDir, systemConfigFile), systemConfig))
+        if (!SystemConfigImporter::Import(openpass::core::Directories::Concat(configurationFiles.configurationDir, systemConfigFile), systemConfig))
         {
             LOG_INTERN(LogLevel::Error) << "could not import system configs";
             return false;
@@ -105,37 +74,22 @@ std::shared_ptr<SystemConfigInterface> ConfigurationContainer::GetSystemConfigBl
     return systemConfigBlueprint;
 }
 
-const SimulationConfigInterface* ConfigurationContainer::GetSimulationConfig() const
+const SimulationConfigInterface *ConfigurationContainer::GetSimulationConfig() const
 {
     return &simulationConfig;
 }
 
-const ProfilesInterface* ConfigurationContainer::GetProfiles() const
+const ProfilesInterface *ConfigurationContainer::GetProfiles() const
 {
     return &profiles;
 }
 
-const SceneryInterface* ConfigurationContainer::GetScenery() const
-{
-    return &scenery;
-}
-
-const ScenarioInterface* ConfigurationContainer::GetScenario() const
-{
-    return &scenario;
-}
-
-const std::map<std::string, std::shared_ptr<SystemConfigInterface>>& ConfigurationContainer::GetSystemConfigs() const
+const std::map<std::string, std::shared_ptr<SystemConfigInterface>> &ConfigurationContainer::GetSystemConfigs() const
 {
     return systemConfigs;
 }
 
-const VehicleModelsInterface* ConfigurationContainer::GetVehicleModels() const
-{
-    return &vehicleModels;
-}
-
-const openpass::common::RuntimeInformation& ConfigurationContainer::GetRuntimeInformation() const
+const openpass::common::RuntimeInformation &ConfigurationContainer::GetRuntimeInformation() const
 {
     return runtimeInformation;
-}
+}
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/framework/configurationContainer.h b/sim/src/core/opSimulation/framework/configurationContainer.h
index da7487b3529e0b51780448ef4cb2c53cf6d057af..c6cb747e5fe0c99b7fdae64e4d6359da27cbf9cf 100644
--- a/sim/src/core/opSimulation/framework/configurationContainer.h
+++ b/sim/src/core/opSimulation/framework/configurationContainer.h
@@ -19,20 +19,14 @@
 
 #include <unordered_map>
 
-#include "simulationConfig.h"
-#include "simulationConfigImporter.h"
+#include "configurationFiles.h"
 #include "include/configurationContainerInterface.h"
 #include "profilesImporter.h"
-#include "scenery.h"
 #include "sceneryImporter.h"
-#include "systemConfigImporter.h"
+#include "simulationConfig.h"
+#include "simulationConfigImporter.h"
 #include "systemConfig.h"
-#include "scenario.h"
-#include "scenarioImporter.h"
 #include "systemConfigImporter.h"
-#include "vehicleModels.h"
-#include "vehicleModelsImporter.h"
-#include "configurationFiles.h"
 
 namespace Configuration {
 
@@ -44,10 +38,11 @@ namespace Configuration {
 class SIMULATIONCOREEXPORT ConfigurationContainer : public ConfigurationContainerInterface
 {
 public:
-    ConfigurationContainer(const ConfigurationFiles& configurationFiles, const openpass::common::RuntimeInformation& runtimeInformation) :
+    ConfigurationContainer(const ConfigurationFiles &configurationFiles, const openpass::common::RuntimeInformation &runtimeInformation) :
         configurationFiles{configurationFiles},
         runtimeInformation(runtimeInformation)
-    {}
+    {
+    }
 
     virtual ~ConfigurationContainer() override = default;
 
@@ -72,59 +67,35 @@ public:
     *
     * @return        SimulationConfig pointer
     */
-    const SimulationConfigInterface* GetSimulationConfig() const override;
+    const SimulationConfigInterface *GetSimulationConfig() const override;
 
     /*!
     * \brief Returns a pointer to the Profiles
     *
     * @return        Profiles pointer
     */
-    const ProfilesInterface* GetProfiles() const override;
-
-    /*!
-    * \brief Returns a pointer to the Scenery
-    *
-    * @return        Scenery pointer
-    */
-    const SceneryInterface* GetScenery() const override;
-
-    /*!
-    * \brief Returns a pointer to the Scenario
-    *
-    * @return        Scenario pointer
-    */
-    const ScenarioInterface* GetScenario() const override;
+    const ProfilesInterface *GetProfiles() const override;
 
     /*!
     * \brief Returns imported systemConfigs
     *
     * @return        systemConfigs map
     */
-    const std::map<std::string, std::shared_ptr<SystemConfigInterface>>& GetSystemConfigs() const override;
-
-    /*!
-    * \brief Returns a pointer to the VehicleModels
-    *
-    * @return        VehicleModels pointer
-    */
-    const VehicleModelsInterface* GetVehicleModels() const override;
+    const std::map<std::string, std::shared_ptr<SystemConfigInterface>> &GetSystemConfigs() const override;
 
     /*!
     * \brief Returns the RunTimeInformation
     *
     * @return        RunTimeInformation
     */
-    const openpass::common::RuntimeInformation& GetRuntimeInformation() const override;
+    const openpass::common::RuntimeInformation &GetRuntimeInformation() const override;
 
 private:
-    const ConfigurationFiles& configurationFiles;
+    const ConfigurationFiles &configurationFiles;
 
     std::shared_ptr<SystemConfig> systemConfigBlueprint;
     SimulationConfig simulationConfig;
-    Scenery scenery;
-    Scenario scenario;
     std::map<std::string, std::shared_ptr<SystemConfigInterface>> systemConfigs;
-    VehicleModels vehicleModels;
     Profiles profiles;
     openpass::common::RuntimeInformation runtimeInformation;
 };
diff --git a/sim/src/core/opSimulation/framework/controlStrategies.cpp b/sim/src/core/opSimulation/framework/controlStrategies.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5b6572be21f14f5d382437df2df9c8948d7c4a82
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/controlStrategies.cpp
@@ -0,0 +1,54 @@
+/********************************************************************************
+ * Copyright (c) 2021 in-tech GmbH
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+//-----------------------------------------------------------------------------
+//! @file  controlStrategies.cpp
+//! @brief This class holds all control strategies for a single entity
+//-----------------------------------------------------------------------------
+
+#include "controlStrategies.h"
+
+ControlStrategies::~ControlStrategies()
+{}
+
+std::vector<std::shared_ptr<mantle_api::ControlStrategy>> ControlStrategies::GetStrategies(mantle_api::ControlStrategyType type)
+{
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> result {};
+    
+    for (auto strategy : strategies)
+    {
+        if (type == strategy->type)
+        {
+            result.push_back(strategy);
+        }
+    }
+
+    return result;
+}
+
+void ControlStrategies::SetStrategies(std::vector<std::shared_ptr<mantle_api::ControlStrategy>> strategies)
+{
+    this->strategies = strategies;
+}
+
+const std::vector<std::string>& ControlStrategies::GetCustomCommands()
+{
+    return customCommands;
+}
+
+void ControlStrategies::AddCustomCommand(const std::string& command)
+{
+    customCommands.push_back(command);
+}
+
+void ControlStrategies::ResetCustomCommands()
+{
+    customCommands.clear();
+}
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/framework/controlStrategies.h b/sim/src/core/opSimulation/framework/controlStrategies.h
new file mode 100644
index 0000000000000000000000000000000000000000..ad86de1b4065b555089a21ef1721acbf602f2117
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/controlStrategies.h
@@ -0,0 +1,40 @@
+/********************************************************************************
+ * Copyright (c) 2021 in-tech GmbH
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+//-----------------------------------------------------------------------------
+//! @file  controlStrategies.h
+//! @brief This class holds all control strategies for a single entity
+//-----------------------------------------------------------------------------
+
+#include "../../../../include/controlStrategiesInterface.h"
+
+class ControlStrategies : public ControlStrategiesInterface
+{
+public:
+    ControlStrategies() = default;
+    ~ControlStrategies() override;
+
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> GetStrategies(mantle_api::ControlStrategyType type) override;
+
+    void SetStrategies(std::vector<std::shared_ptr<mantle_api::ControlStrategy>> strategies) override;
+
+    const std::vector<std::string>& GetCustomCommands() override;
+
+    void AddCustomCommand(const std::string& command) override;
+
+    void ResetCustomCommands() override;
+
+    // TODO CK Extend this for methods to set controlstrategies to finished. And probably utilize a map instead of a vector based on type.
+    // TODO CK also we should tag controlstrategies with unique ids
+    
+private:
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> strategies {};
+    std::vector<std::string> customCommands;
+};
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/framework/controller.h b/sim/src/core/opSimulation/framework/controller.h
new file mode 100644
index 0000000000000000000000000000000000000000..90fbced6e237dd478dfe4bc63fc9492f115951f6
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/controller.h
@@ -0,0 +1,56 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include "MantleAPI/Traffic/i_controller.h"
+#include "include/agentBlueprintInterface.h"
+
+namespace core {
+
+class Controller : public virtual mantle_api::IController
+{
+public:
+    Controller(const mantle_api::UniqueId id,
+               const mantle_api::ExternalControllerConfig& config,
+               const System& system):
+            id(id),
+            config(config),
+            system(system)
+    {}
+
+    virtual mantle_api::UniqueId GetUniqueId() const override final
+    {
+        return id;
+    }
+
+    virtual void SetName(const std::string& name) final
+    {
+        this->name = name;
+    }
+
+    virtual const std::string& GetName() const final
+    {
+        return name;
+    }
+
+    const System& GetSystem() const
+    {
+        return system;
+    }
+
+private:
+    const mantle_api::UniqueId id;
+    const mantle_api::ExternalControllerConfig config;
+    const System system;
+
+    std::string name = "";
+};
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/controllerRepository.cpp b/sim/src/core/opSimulation/framework/controllerRepository.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..aa53daaeeb2f788c32f8c3822b60aafa8415e78a
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/controllerRepository.cpp
@@ -0,0 +1,65 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#include "controllerRepository.h"
+#include "common/commonTools.h"
+#include "common/log.h"
+
+#include <stdexcept>
+
+namespace core {
+
+    mantle_api::IController& ControllerRepository::Create(std::unique_ptr<mantle_api::IControllerConfig> config)
+    {
+        try
+        {
+            const auto externalControllerConfig = dynamic_cast<mantle_api::ExternalControllerConfig*>(config.get());
+            auto agentProfile = helper::map::query(externalControllerConfig->parameters, "AgentProfile");
+            ThrowIfFalse(agentProfile.has_value(), "Missing property AgentProfile");
+
+            auto controller = std::make_shared<Controller>(nextId, *externalControllerConfig, agentBlueprintProvider.get().SampleSystem(agentProfile.value()));
+            controllers.emplace(std::make_pair(nextId, controller));
+            nextId++;
+
+            return *(std::dynamic_pointer_cast<mantle_api::IController>(controller));
+        }
+        catch (std::bad_cast error)
+        {
+            LogErrorAndThrow(error.what());
+        }
+    }
+
+    mantle_api::IController& ControllerRepository::Create(mantle_api::UniqueId id, std::unique_ptr<mantle_api::IControllerConfig> config)
+    {
+        throw std::runtime_error("Deprecated function Create of ControllerRepository is not supported.");
+    }
+
+    std::optional<std::reference_wrapper<mantle_api::IController>> ControllerRepository::Get(mantle_api::UniqueId id)
+    {
+        if (!Contains(id))
+        {
+            return std::nullopt;
+        }
+        else
+        {
+           return *((std::static_pointer_cast<mantle_api::IController>(controllers.at(id))));
+        }
+    }
+    
+    bool ControllerRepository::Contains(mantle_api::UniqueId id) const
+    {
+       return controllers.find(id) != controllers.end();
+    }
+
+    void ControllerRepository::Delete(mantle_api::UniqueId id)
+    {
+    }
+    
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/controllerRepository.h b/sim/src/core/opSimulation/framework/controllerRepository.h
new file mode 100644
index 0000000000000000000000000000000000000000..77687c9a726d81ca9deb617ea6d20f795997a0a9
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/controllerRepository.h
@@ -0,0 +1,44 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include <map>
+
+#include "MantleAPI/Traffic/i_controller_repository.h"
+#include "agentBlueprintProvider.h"
+#include "controller.h"
+#include <functional>
+
+//TODO CK add an additional class UniqueId Generator, which delivers a set of id regardless of the object being instantiated. Simmilar to the current state.
+
+namespace core {
+class ControllerRepository final : public mantle_api::IControllerRepository
+{
+public:
+    ControllerRepository(const AgentBlueprintProvider &agentBlueprintProvider):
+    agentBlueprintProvider(agentBlueprintProvider)
+    {}
+
+    virtual mantle_api::IController& Create(std::unique_ptr<mantle_api::IControllerConfig> config) override final;
+    virtual mantle_api::IController& Create(mantle_api::UniqueId id, std::unique_ptr<mantle_api::IControllerConfig> config) override final;
+
+    virtual std::optional<std::reference_wrapper<mantle_api::IController>> Get(mantle_api::UniqueId id) override final;
+    virtual bool Contains(mantle_api::UniqueId id) const override final;
+
+    virtual void Delete(mantle_api::UniqueId id) override final;
+
+    mantle_api::UniqueId nextId{0};
+    std::map<mantle_api::UniqueId, std::shared_ptr<Controller>> controllers;
+
+private:
+    std::reference_wrapper<const AgentBlueprintProvider> agentBlueprintProvider;
+};
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/coordConverter.h b/sim/src/core/opSimulation/framework/coordConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..065c0309e2e229d8da449a8c5d26e19cb67f5955
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/coordConverter.h
@@ -0,0 +1,54 @@
+/*******************************************************************************
+* Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include "include/worldInterface.h"
+#include "MantleAPI/Map/i_coord_converter.h"
+
+using namespace units::literals;
+
+namespace core {
+
+class SIMULATIONCOREEXPORT CoordConverter final : public mantle_api::ICoordConverter
+{
+public:
+    CoordConverter() = default;
+    ~CoordConverter() = default;
+
+    // This class could potentially be added to the world and directly utilize localizer + worldDataquery.
+    void Init(WorldInterface* world)
+    {
+        this->world = world;
+    }
+
+    mantle_api::Vec3<units::length::meter_t> Convert(mantle_api::Position position) const final
+    {
+        if (std::holds_alternative<mantle_api::OpenDrivePosition>(position))
+        {
+            const auto openDrivePosition = std::get<mantle_api::OpenDrivePosition>(position);
+            std::string roadId = std::to_string(openDrivePosition.referenced_object.road); //TODO Change RoadId in mantle to string;
+            const auto worldPosition = world->LaneCoord2WorldCoord(openDrivePosition.s_offset, openDrivePosition.t_offset, roadId, openDrivePosition.referenced_object.lane);
+            return {worldPosition.xPos, worldPosition.yPos, 0.0_m};
+        }
+
+        return {};
+    }
+
+    mantle_api::Position Convert(const mantle_api::Vec3<units::length::meter_t>& vec) const final
+    {
+        // TODO
+        return {};
+    }
+
+private:
+    WorldInterface* world;
+};
+}
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/framework/dynamicAgentTypeGenerator.cpp b/sim/src/core/opSimulation/framework/dynamicAgentTypeGenerator.cpp
index ca23e32593a572d41c8371dfd66182d5292a9dd5..adbdb49433771a3c6ad9e5d4aaa221205c65ffd4 100644
--- a/sim/src/core/opSimulation/framework/dynamicAgentTypeGenerator.cpp
+++ b/sim/src/core/opSimulation/framework/dynamicAgentTypeGenerator.cpp
@@ -13,13 +13,11 @@
 constexpr char DRIVER[] = "Driver";
 
 DynamicAgentTypeGenerator::DynamicAgentTypeGenerator(SampledProfiles& sampledProfiles,
-        DynamicParameters& dynamicParameters, std::shared_ptr<SystemConfigInterface> systemConfigBlueprint, const ProfilesInterface* profiles,
-        const VehicleModelsInterface* vehicleModels) :
+        DynamicParameters& dynamicParameters, std::shared_ptr<SystemConfigInterface> systemConfigBlueprint, const ProfilesInterface* profiles) :
     sampledProfiles(sampledProfiles),
     dynamicParameters(dynamicParameters),
     systemConfigBlueprint(systemConfigBlueprint),
-    profiles(profiles),
-    vehicleModels(vehicleModels)
+    profiles(profiles)
 {
 }
 
@@ -83,14 +81,14 @@ DynamicAgentTypeGenerator& DynamicAgentTypeGenerator::GatherVehicleComponents()
     {
         auto parameters = profiles->CloneProfile(vehicleComponentProfile.first, vehicleComponentProfile.second);
 
-        if (profiles->GetVehicleProfiles().count(sampledProfiles.vehicleProfileName) == 0)
+        if (profiles->GetSystemProfiles().count(sampledProfiles.systemProfileName) == 0)
         {
-            throw std::logic_error("No vehicle profile of type " + sampledProfiles.vehicleProfileName);
+            throw std::logic_error("No vehicle profile of type " + sampledProfiles.systemProfileName);
         }
-        auto vehicleProfile = profiles->GetVehicleProfiles().at(sampledProfiles.vehicleProfileName); // Existence checked by DynamicProfileSampler
+        auto systemProfile = profiles->GetSystemProfiles().at(sampledProfiles.systemProfileName); // Existence checked by DynamicProfileSampler
 
-        auto matchedComponent = std::find_if(vehicleProfile.vehicleComponents.begin(),
-                                             vehicleProfile.vehicleComponents.end(), [vehicleComponentProfile](VehicleComponent curComponent)
+        auto matchedComponent = std::find_if(systemProfile.vehicleComponents.begin(),
+                                             systemProfile.vehicleComponents.end(), [vehicleComponentProfile](VehicleComponent curComponent)
         { return curComponent.type == vehicleComponentProfile.first; });
 
         openpass::parameter::internal::ParameterListLevel2 parameterList;
@@ -118,9 +116,9 @@ DynamicAgentTypeGenerator& DynamicAgentTypeGenerator::GatherSensors()
 
     int inputIdSensorAggregation = systemConfigBlueprint->GetSystems().at(0)->GetComponents().at(sensorAggregationModulName)->GetInputLinks().at(0);
     int sensorNumber = 0;
-    const auto vehicleProfile = profiles->GetVehicleProfiles().at(sampledProfiles.vehicleProfileName); // Existence checked by DynamicProfileSampler
+    const auto systemProfile = profiles->GetSystemProfiles().at(sampledProfiles.systemProfileName); // Existence checked by DynamicProfileSampler
 
-    for (const auto& sensor : vehicleProfile.sensors)
+    for (const auto& sensor : systemProfile.sensors)
     {
         auto sensorParam = profiles->CloneProfile(sensor.profile.type, sensor.profile.name);
 
@@ -128,12 +126,7 @@ DynamicAgentTypeGenerator& DynamicAgentTypeGenerator::GatherSensors()
         sensorParam.emplace_back("Name", sensor.profile.name);
         sensorParam.emplace_back("Type", sensor.profile.type);
         sensorParam.emplace_back("Id", sensor.id);
-        sensorParam.emplace_back("Longitudinal", sensor.position.longitudinal);
-        sensorParam.emplace_back("Lateral", sensor.position.lateral);
-        sensorParam.emplace_back("Height", sensor.position.height);
-        sensorParam.emplace_back("Pitch", sensor.position.pitch);
-        sensorParam.emplace_back("Yaw", sensor.position.yaw);
-        sensorParam.emplace_back("Roll", sensor.position.roll);
+        sensorParam.emplace_back("Position", sensor.positionName);
         sensorParam.emplace_back("Latency", dynamicParameters.sensorLatencies.at(sensor.id));
 
         const std::string uniqueSensorName =  "Sensor_" + std::to_string(sensor.id);
@@ -157,15 +150,6 @@ DynamicAgentTypeGenerator& DynamicAgentTypeGenerator::GatherSensors()
     return *this;
 }
 
-DynamicAgentTypeGenerator& DynamicAgentTypeGenerator::SetVehicleModelParameters(const openScenario::Parameters& assignedParameters)
-{
-    const VehicleProfile vehicleProfile = profiles->GetVehicleProfiles().at(sampledProfiles.vehicleProfileName); // Existence checked by DynamicProfileSampler
-    agentBuildInformation.vehicleModelName = vehicleProfile.vehicleModel;
-    agentBuildInformation.vehicleModelParameters = vehicleModels->GetVehicleModel(vehicleProfile.vehicleModel, assignedParameters);
-
-    return *this;
-}
-
 void DynamicAgentTypeGenerator::GatherComponent(const std::string componentName,
         std::shared_ptr<core::AgentType> agentType)
 {
@@ -236,8 +220,7 @@ void DynamicAgentTypeGenerator::GatherComponentWithParameters(std::string compon
 DynamicAgentTypeGenerator AgentBuildInformation::make(SampledProfiles& sampledProfiles,
         DynamicParameters& dynamicParameters,
         std::shared_ptr<SystemConfigInterface> systemConfigBlueprint,
-        const ProfilesInterface* profiles,
-        const VehicleModelsInterface* vehicleModels)
+        const ProfilesInterface* profiles)
 {
-    return DynamicAgentTypeGenerator(sampledProfiles, dynamicParameters, systemConfigBlueprint, profiles, vehicleModels);
+    return DynamicAgentTypeGenerator(sampledProfiles, dynamicParameters, systemConfigBlueprint, profiles);
 }
diff --git a/sim/src/core/opSimulation/framework/dynamicAgentTypeGenerator.h b/sim/src/core/opSimulation/framework/dynamicAgentTypeGenerator.h
index 338aa4d9234eed1b31b8b1e923e3bc3d14b7a515..d1a827fec01a7573bb513c63b4f21bece8e5c98e 100644
--- a/sim/src/core/opSimulation/framework/dynamicAgentTypeGenerator.h
+++ b/sim/src/core/opSimulation/framework/dynamicAgentTypeGenerator.h
@@ -10,13 +10,12 @@
 
 #pragma once
 
-#include "include/profilesInterface.h"
 #include "agentType.h"
 #include "componentType.h"
-#include "dynamicProfileSampler.h"
 #include "dynamicParametersSampler.h"
+#include "dynamicProfileSampler.h"
+#include "include/profilesInterface.h"
 #include "include/systemConfigInterface.h"
-#include "include/vehicleModelsInterface.h"
 
 /*!
  * \brief Defines the default components that all agents need
@@ -24,37 +23,30 @@
 struct DefaultComponents
 {
     // Basic components that are always needed
-    const std::vector<std::string> basicComponentNames
-    {
+    const std::vector<std::string> basicComponentNames{
         "AgentUpdater",
         "ComponentController",
         "Dynamics_Collision",
         "Dynamics_RegularDriving",
-        "OpenScenarioActions",
         "Parameters_Vehicle",
         "PrioritizerDynamics",
         "PrioritizerLongitudinal",
         "PrioritizerSteering",
-        "Sensor_RecordState"
-    };
+        "Sensor_RecordState"};
 
     //Components that are needed, if at least one driver is present
-    const std::vector<std::string> driverComponentNames
-    {
+    const std::vector<std::string> driverComponentNames{
         "Action_LongitudinalDriver",
         "Action_SecondaryDriverTasks",
-        "PrioritizerTurningIndicator"
-    };
+        "PrioritizerTurningIndicator"};
 
     //Components that are needed, if at least one vehicle component is present
-    const std::vector<std::string> vehicleComponentNames
-    {
+    const std::vector<std::string> vehicleComponentNames{
         "Algorithm_LongitudinalVehicleComponents",
         "PrioritizerAccelerationVehicleComponents",
         "PrioritizerSteeringVehicleComponents",
         "LimiterAccelerationVehicleComponents",
-        "SensorFusionErrorless"
-    };
+        "SensorFusionErrorless"};
 };
 
 class DynamicAgentTypeGenerator;
@@ -70,8 +62,6 @@ struct AgentBuildInformation
 {
     friend class DynamicAgentTypeGenerator;
     std::shared_ptr<core::AgentType> agentType = std::make_shared<core::AgentType>();
-    std::string vehicleModelName;
-    VehicleModelParameters vehicleModelParameters;
     openpass::sensors::Parameters sensorParameters;
 
     /*!
@@ -81,11 +71,10 @@ struct AgentBuildInformation
      * \param dynamicParameters       Parameters samplied by the DynamicParametersSampler
      * \param systemConfigBlueprint   Imported SystemConfigBlueprint
      * \param profiles                Imported profiles from the ProfilesCatalog
-     * \param vehicleModels           Imported vehicleModels from the VehiclesModelCatalog
      *
      * \return new instance of DynamicAgentTypeGenerator
      */
-    static DynamicAgentTypeGenerator make(SampledProfiles& sampledProfiles, DynamicParameters& dynamicParameters, std::shared_ptr<SystemConfigInterface> systemConfigBlueprint, const ProfilesInterface* profiles, const VehicleModelsInterface* vehicleModels);
+    static DynamicAgentTypeGenerator make(SampledProfiles &sampledProfiles, DynamicParameters &dynamicParameters, std::shared_ptr<SystemConfigInterface> systemConfigBlueprint, const ProfilesInterface *profiles);
 
 private:
     /*! Private constructor to be called by the DynamicAgentTypeGenerator
@@ -103,12 +92,12 @@ private:
 class DynamicAgentTypeGenerator
 {
 public:
-    DynamicAgentTypeGenerator(SampledProfiles& sampledProfiles, DynamicParameters& dynamicParameters, std::shared_ptr<SystemConfigInterface> systemConfigBlueprint, const ProfilesInterface* profiles, const VehicleModelsInterface* vehicleModels);
+    DynamicAgentTypeGenerator(SampledProfiles &sampledProfiles, DynamicParameters &dynamicParameters, std::shared_ptr<SystemConfigInterface> systemConfigBlueprint, const ProfilesInterface *profiles);
 
     /*!
      * \brief Returns the generated AgentBuildInformation;
      */
-    operator AgentBuildInformation&&()
+    operator AgentBuildInformation &&()
     {
         return std::move(agentBuildInformation);
     }
@@ -119,7 +108,7 @@ public:
      *
      * \return reference to itself
      */
-    DynamicAgentTypeGenerator& GatherBasicComponents();
+    DynamicAgentTypeGenerator &GatherBasicComponents();
 
     /*!
      * \brief Creates a new ComponentType for all default driver components defined in DefaultComponents.basicComponents, the ParametersAgents and
@@ -127,7 +116,7 @@ public:
      *
      * \return reference to itself
      */
-    DynamicAgentTypeGenerator& GatherDriverComponents();
+    DynamicAgentTypeGenerator &GatherDriverComponents();
 
     /*!
      * \brief Creates a new ComponentType for all default vehicle components defined in DefaultComponents.basicComponents and
@@ -135,7 +124,7 @@ public:
      *
      * \return reference to itself
      */
-    DynamicAgentTypeGenerator& GatherVehicleComponents();
+    DynamicAgentTypeGenerator &GatherVehicleComponents();
 
     /*!
      * \brief Creates a new ComponentType for all sensor defined by the VehicleModel and the SensorFusion module if needed
@@ -143,13 +132,7 @@ public:
      *
      * \return reference to itself
      */
-    DynamicAgentTypeGenerator& GatherSensors();
-
-    /*!
-     * \brief Sets the VehicleModelParameters in the AgentBuildInformation depending on the vehicle model name.
-     * \return  reference to itself
-     */
-    DynamicAgentTypeGenerator& SetVehicleModelParameters(const openScenario::Parameters& assignedParameters);
+    DynamicAgentTypeGenerator &GatherSensors();
 
     /*!
     * \brief Gathers a component and adds it to the AgentType
@@ -188,7 +171,7 @@ public:
     * @param[in]    channelIncrease             Increase in the ids of the output channels (currently used for sensors)
     */
     void GatherComponentWithParameters(std::string componentName, std::shared_ptr<core::AgentType> agentType, const openpass::parameter::ParameterSetLevel1 &parameters,
-                                                                                  std::string componentNameInSystemConfigBlueprint, int channelOffset);
+                                       std::string componentNameInSystemConfigBlueprint, int channelOffset);
 
     /*!
     * \brief Samples the latency of a sensor
@@ -199,13 +182,13 @@ public:
     * @return       latency in s
     */
     double SampleSensorLatency(std::shared_ptr<ParameterInterface> curParameters);
+
 private:
     AgentBuildInformation agentBuildInformation;
 
-    SampledProfiles& sampledProfiles;
-    DynamicParameters& dynamicParameters;
+    SampledProfiles &sampledProfiles;
+    DynamicParameters &dynamicParameters;
     std::shared_ptr<SystemConfigInterface> systemConfigBlueprint;
-    const ProfilesInterface* profiles;
-    const VehicleModelsInterface* vehicleModels;
+    const ProfilesInterface *profiles;
     DefaultComponents defaultComponents;
 };
diff --git a/sim/src/core/opSimulation/framework/dynamicParametersSampler.cpp b/sim/src/core/opSimulation/framework/dynamicParametersSampler.cpp
index 36f9cbedb28b043b5a4fb3dac2ffc6f4c3412388..6522e9c2cfef766b64116ab9a2c40ada34debd2a 100644
--- a/sim/src/core/opSimulation/framework/dynamicParametersSampler.cpp
+++ b/sim/src/core/opSimulation/framework/dynamicParametersSampler.cpp
@@ -23,7 +23,7 @@ DynamicParameterSampler::DynamicParameterSampler(StochasticsInterface& stochasti
 
 DynamicParameterSampler &DynamicParameterSampler::SampleSensorLatencies()
 {
-    const auto& vehicleProfiles = profiles->GetVehicleProfiles();
+    const auto& vehicleProfiles = profiles->GetSystemProfiles();
 
     if (vehicleProfiles.find(vehicleProfileName) != vehicleProfiles.end())
     {
diff --git a/sim/src/core/opSimulation/framework/dynamicProfileSampler.cpp b/sim/src/core/opSimulation/framework/dynamicProfileSampler.cpp
index ab1606a05841ffbd9902f463df7ca1a7ff5d8c77..84a4ea6b442b82c5b1a48f43a6d807fdce738e1e 100644
--- a/sim/src/core/opSimulation/framework/dynamicProfileSampler.cpp
+++ b/sim/src/core/opSimulation/framework/dynamicProfileSampler.cpp
@@ -18,22 +18,22 @@ DynamicProfileSampler& DynamicProfileSampler::SampleDriverProfile()
     return *this;
 }
 
-DynamicProfileSampler& DynamicProfileSampler::SampleVehicleProfile()
+DynamicProfileSampler& DynamicProfileSampler::SampleSystemProfile()
 {
-    const auto probabilities = profiles->GetVehicleProfileProbabilities(agentProfileName);
-    sampledProfiles.vehicleProfileName = Sampler::Sample(probabilities, &stochastics);
+    const auto probabilities = profiles->GetSystemProfileProbabilities(agentProfileName);
+    sampledProfiles.systemProfileName = Sampler::Sample(probabilities, &stochastics);
     return *this;
 }
 
 DynamicProfileSampler& DynamicProfileSampler::SampleVehicleComponentProfiles()
 {
-    const auto find_result = profiles->GetVehicleProfiles().find(sampledProfiles.vehicleProfileName);
-    if (find_result == profiles->GetVehicleProfiles().end())
+    const auto find_result = profiles->GetSystemProfiles().find(sampledProfiles.systemProfileName);
+    if (find_result == profiles->GetSystemProfiles().end())
     {
-        throw std::runtime_error("No vehicle profile with name \""+sampledProfiles.vehicleProfileName+"\" defined");
+        throw std::runtime_error("No vehicle profile with name \""+sampledProfiles.systemProfileName+"\" defined");
     }
-    const VehicleProfile& vehicleProfile = find_result->second;
-    for (VehicleComponent vehicleComponentInProfile : vehicleProfile.vehicleComponents)
+    const SystemProfile& systemProfile = find_result->second;
+    for (VehicleComponent vehicleComponentInProfile : systemProfile.vehicleComponents)
     {
         std::string vehicleComponentName = Sampler::Sample(vehicleComponentInProfile.componentProfiles, &stochastics);
         if (vehicleComponentName != "")
diff --git a/sim/src/core/opSimulation/framework/dynamicProfileSampler.h b/sim/src/core/opSimulation/framework/dynamicProfileSampler.h
index b6a87a7a1e827682959b31307e31cb9e4f4e4680..f09dd4c32d6b557edbeddce7961d3f73ea5107de 100644
--- a/sim/src/core/opSimulation/framework/dynamicProfileSampler.h
+++ b/sim/src/core/opSimulation/framework/dynamicProfileSampler.h
@@ -25,7 +25,7 @@ struct SampledProfiles
 {
     friend class DynamicProfileSampler;
     std::string driverProfileName;
-    std::string vehicleProfileName;
+    std::string systemProfileName;
     std::unordered_map<std::string, std::string> vehicleComponentProfileNames;
 
     /*!
@@ -64,11 +64,11 @@ public:
      * \brief Samples the vehicle profile name based on the agent profile name.
      * \return reference to itself
      */
-    DynamicProfileSampler &SampleVehicleProfile();
+    DynamicProfileSampler &SampleSystemProfile();
 
     /*!
      * \brief Samples all vehicle component profile names based on the vehicle profile name.
-     * Therefore SampleVehicleProfile has to be called before this method.
+     * Therefore SampleSystemProfile has to be called before this method.
      *
      * \return reference to itself
      */
diff --git a/sim/src/core/opSimulation/framework/entity.cpp b/sim/src/core/opSimulation/framework/entity.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..eb6c2188511da5af4ae555770b7c6bb5397f4747
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/entity.cpp
@@ -0,0 +1,235 @@
+#include "entity.h"
+
+#include "agent.h"
+#include "controlStrategies.h"
+#include "geometryHelper.h"
+
+namespace core {
+Entity::Entity(mantle_api::UniqueId id,
+               const std::string &name,
+               const RouteSamplerInterface *routeSampler,
+               std::shared_ptr<mantle_api::EntityProperties> properties,
+               AgentCategory agentCategory) :
+    id(id),
+    name(name),
+    routeSampler(routeSampler),
+    properties(properties),
+    agentCategory(agentCategory),
+    controlStrategies(std::make_shared<ControlStrategies>())
+{
+}
+
+mantle_api::UniqueId Entity::GetUniqueId() const
+{
+    return id;
+}
+
+void Entity::SetName(const std::string &name)
+{
+    this->name = name;
+}
+
+const std::string &Entity::GetName() const
+{
+    return name;
+}
+
+void Entity::SetPosition(const mantle_api::Vec3<units::length::meter_t> &inert_pos)
+{
+    GeometryHelper geometryHelper;
+    if (!agent)
+    {
+        auto position = geometryHelper.TranslateGlobalPositionLocally(inert_pos, spawnParameter.orientation, -properties->bounding_box.geometric_center);
+        spawnParameter.position = position;
+        spawnParameter.route = routeSampler->Sample(inert_pos, spawnParameter.orientation.yaw);
+        shouldBeSpawned = true;
+    }
+    else
+    {
+        auto position = geometryHelper.TranslateGlobalPositionLocally(inert_pos, {agent->GetYaw(), 0_rad, 0_rad}, -properties->bounding_box.geometric_center);
+        agent->SetPositionX(inert_pos.x);
+        agent->SetPositionY(inert_pos.y);
+    }
+}
+
+mantle_api::Vec3<units::length::meter_t> Entity::GetPosition() const
+{
+    GeometryHelper geometryHelper;
+    if (!agent)
+    {
+        return geometryHelper.TranslateGlobalPositionLocally(spawnParameter.position, spawnParameter.orientation, properties->bounding_box.geometric_center);
+    }
+    else
+    {
+        return geometryHelper.TranslateGlobalPositionLocally({agent->GetPositionX(), agent->GetPositionY(), 0_m}, {agent->GetYaw(), 0_rad, 0_rad}, properties->bounding_box.geometric_center);
+    }
+}
+
+void Entity::SetVelocity(const mantle_api::Vec3<units::velocity::meters_per_second_t> &velocity)
+{
+    if (!agent)
+    {
+        spawnParameter.velocity = velocity.Length();
+    }
+    else
+    {
+        agent->SetVelocityVector(velocity);
+    }
+}
+
+mantle_api::Vec3<units::velocity::meters_per_second_t> Entity::GetVelocity() const
+{
+    if (!agent)
+    {
+        return {spawnParameter.velocity * units::math::cos(spawnParameter.orientation.yaw), spawnParameter.velocity * units::math::sin(spawnParameter.orientation.yaw), 0_mps};
+    }
+    else
+    {
+        const auto velocity = agent->GetVelocity();
+        return {velocity.x, velocity.y, 0_mps};
+    }
+}
+
+void Entity::SetAcceleration(const mantle_api::Vec3<units::acceleration::meters_per_second_squared_t> &acceleration)
+{
+    if (!agent)
+    {
+        //spawn acceleration not implemented
+    }
+    else
+    {
+        //TODO SetAccelerationX/Y is not implemented
+        const auto absAcceleration = units::math::hypot(acceleration.x, acceleration.y);
+        agent->SetAcceleration(absAcceleration);
+    }
+}
+
+mantle_api::Vec3<units::acceleration::meters_per_second_squared_t> Entity::GetAcceleration() const
+{
+    if (!agent)
+    {
+        return {0_mps_sq, 0_mps_sq, 0_mps_sq};
+    }
+    else
+    {
+        const auto acceleration = agent->GetAcceleration();
+        return {acceleration.x, acceleration.y, 0_mps_sq};
+    }
+}
+
+void Entity::SetOrientation(const mantle_api::Orientation3<units::angle::radian_t> &orientation)
+{
+    if (!agent)
+    {
+        spawnParameter.orientation = orientation;
+        GeometryHelper geometryHelper;
+        auto position = geometryHelper.TranslateGlobalPositionLocally(spawnParameter.position, orientation, -properties->bounding_box.geometric_center);
+        spawnParameter.position = position;
+    }
+    else
+    {
+        agent->SetYaw(orientation.yaw);
+    }
+}
+
+mantle_api::Orientation3<units::angle::radian_t> Entity::GetOrientation() const
+{
+    if (!agent)
+    {
+        return spawnParameter.orientation;
+    }
+    else
+    {
+        return {agent->GetYaw(), 0_rad, 0_rad};
+    }
+}
+
+void Entity::SetOrientationRate(const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t> &orientation_rate)
+{
+    if (!agent)
+    {
+    }
+    else
+    {
+        agent->SetYawRate(orientation_rate.yaw);
+    }
+}
+
+mantle_api::Orientation3<units::angular_velocity::radians_per_second_t> Entity::GetOrientationRate() const
+{
+    if (!agent)
+    {
+        return {0_rad_per_s, 0_rad_per_s, 0_rad_per_s};
+    }
+    else
+    {
+        return {agent->GetYawRate(), 0_rad_per_s, 0_rad_per_s};
+    }
+}
+
+void Entity::SetOrientationAcceleration(const mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t> &orientation_acceleration)
+{
+    if (!agent)
+    {
+    }
+    else
+    {
+        agent->SetYawAcceleration(orientation_acceleration.yaw);
+    }
+}
+
+mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t> Entity::GetOrientationAcceleration() const
+{
+    if (!agent)
+    {
+        return {0_rad_per_s_sq, 0_rad_per_s_sq, 0_rad_per_s_sq};
+    }
+    else
+    {
+        return {agent->GetYawAcceleration(), 0_rad_per_s_sq, 0_rad_per_s_sq};
+    }
+}
+
+void Entity::SetAssignedLaneIds(const std::vector<uint64_t> &assigned_lane_ids)
+{
+}
+
+std::vector<uint64_t> Entity::GetAssignedLaneIds() const
+{
+    return {};
+}
+
+void Entity::SetVisibility(const mantle_api::EntityVisibilityConfig &visibility)
+{
+}
+
+mantle_api::EntityVisibilityConfig Entity::GetVisibility() const
+{
+    return {};
+}
+
+void Entity::SetSystem(const System &system)
+{
+    this->system = system;
+}
+
+AgentBuildInstructions Entity::GetAgentBuildInstructions()
+{
+    return {name, agentCategory, properties, system, spawnParameter, controlStrategies};
+}
+
+void Entity::SetAgent(AgentInterface *agent)
+{
+    this->agent = agent;
+}
+
+std::shared_ptr<ControlStrategiesInterface> const Entity::GetControlStrategies()
+{
+    return controlStrategies;
+}
+
+bool Entity::ShouldBeSpawned()
+{
+    return shouldBeSpawned;
+}
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/entity.h b/sim/src/core/opSimulation/framework/entity.h
new file mode 100644
index 0000000000000000000000000000000000000000..e926fb1c11f15aa67d55eba05e9c5ea3f12ec1c4
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/entity.h
@@ -0,0 +1,79 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include "MantleAPI/Traffic/i_entity.h"
+#include "include/agentBlueprintInterface.h"
+#include "include/agentFactoryInterface.h"
+#include "include/agentInterface.h"
+#include "routeSampler.h"
+
+namespace core {
+class Entity : public virtual mantle_api::IEntity
+{
+public:
+    Entity(mantle_api::UniqueId id,
+           const std::string &name,
+           const RouteSamplerInterface *routeSampler,
+           std::shared_ptr<mantle_api::EntityProperties> properties,
+           const AgentCategory agentCategory);
+
+    virtual mantle_api::UniqueId GetUniqueId() const override;
+
+    virtual void SetName(const std::string &name) override;
+    virtual const std::string &GetName() const override;
+
+    virtual void SetPosition(const mantle_api::Vec3<units::length::meter_t> &inert_pos) override;
+    virtual mantle_api::Vec3<units::length::meter_t> GetPosition() const override;
+
+    virtual void SetVelocity(const mantle_api::Vec3<units::velocity::meters_per_second_t> &velocity) override;
+    virtual mantle_api::Vec3<units::velocity::meters_per_second_t> GetVelocity() const override;
+
+    virtual void SetAcceleration(const mantle_api::Vec3<units::acceleration::meters_per_second_squared_t> &acceleration) override;
+    virtual mantle_api::Vec3<units::acceleration::meters_per_second_squared_t> GetAcceleration() const override;
+
+    virtual void SetOrientation(const mantle_api::Orientation3<units::angle::radian_t> &orientation) override;
+    virtual mantle_api::Orientation3<units::angle::radian_t> GetOrientation() const override;
+
+    virtual void SetOrientationRate(const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t> &orientation_rate) override;
+    virtual mantle_api::Orientation3<units::angular_velocity::radians_per_second_t> GetOrientationRate() const override;
+
+    virtual void SetOrientationAcceleration(const mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t> &orientation_acceleration) override;
+    virtual mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t> GetOrientationAcceleration() const override;
+
+    virtual void SetAssignedLaneIds(const std::vector<std::uint64_t> &assigned_lane_ids) override;
+    virtual std::vector<std::uint64_t> GetAssignedLaneIds() const override;
+
+    virtual void SetVisibility(const mantle_api::EntityVisibilityConfig &visibility) override;
+    virtual mantle_api::EntityVisibilityConfig GetVisibility() const override;
+
+    void SetSystem(const System &system);
+    AgentBuildInstructions GetAgentBuildInstructions();
+
+    void SetAgent(AgentInterface *agent);
+
+    std::shared_ptr<ControlStrategiesInterface> const GetControlStrategies();
+
+    bool ShouldBeSpawned();
+
+private:
+    mantle_api::UniqueId id;
+    std::string name;
+    AgentCategory agentCategory;
+    SpawnParameter spawnParameter;
+    System system;
+    AgentInterface *agent{nullptr};
+    const RouteSamplerInterface *routeSampler;
+    std::shared_ptr<mantle_api::EntityProperties> properties;
+    bool shouldBeSpawned{false};
+    std::shared_ptr<ControlStrategiesInterface> const controlStrategies;
+};
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/entityRepository.cpp b/sim/src/core/opSimulation/framework/entityRepository.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a1d8260e692adab1c7069a4d3b2183be82209ad9
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/entityRepository.cpp
@@ -0,0 +1,188 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#include "entityRepository.h"
+#include "modelElements/agent.h"
+#include <stdexcept>
+
+namespace core {
+EntityRepository::EntityRepository(AgentFactoryInterface *agentFactory, const RouteSamplerInterface *routeSampler) :
+    agentFactory(agentFactory),
+    routeSampler(routeSampler)
+{
+
+}
+
+mantle_api::IVehicle &EntityRepository::Create(const std::string &name, const mantle_api::VehicleProperties &properties)
+{
+    // This is to verify if scenarioEngine set the correct EntityType when creating Entities
+    if (properties.type != mantle_api::EntityType::kVehicle)
+    {
+        throw std::runtime_error("Vehicle could not be created. Vehicle requires EntityType: Vehicle.");
+    }
+
+    bool success{false};
+    std::map<mantle_api::UniqueId, std::shared_ptr<Entity>>::iterator entry;
+    while(!success)
+    {
+        std::tie(entry, success) = entitiesById.try_emplace(nextId, std::make_shared<Vehicle>(nextId, name, std::make_shared<mantle_api::VehicleProperties>(properties), routeSampler));
+        ++nextId;
+    }
+
+    // entitiesByName.insert({name, entry->second});
+    // unspawnedEntities.push_back(entry->second);
+    // return *(entry->second);
+    return CreateHelper<mantle_api::IVehicle>(name, entry->second);
+}
+
+mantle_api::IVehicle &EntityRepository::Create(mantle_api::UniqueId id, const std::string &name, const mantle_api::VehicleProperties &properties)
+{
+    // This is to verify if scenarioEngine set the correct EntityType when creating Entities
+    if (properties.type != mantle_api::EntityType::kVehicle)
+    {
+        throw std::runtime_error("Vehicle could not be created. Vehicle requires EntityType: Vehicle.");
+    }
+
+    auto [entry, success] = entitiesById.try_emplace(id, std::make_shared<Vehicle>(nextId, name, std::make_shared<mantle_api::VehicleProperties>(properties), routeSampler));
+    if(!success)
+    {
+        throw std::runtime_error("Id \"" + std::to_string(id) + "\" is already in use");
+    }
+
+    return CreateHelper<mantle_api::IVehicle>(name, entry->second);
+}
+
+mantle_api::IPedestrian &EntityRepository::Create(const std::string &name, const mantle_api::PedestrianProperties &properties)
+{
+    // This is to verify if scenarioEngine set the correct EntityType when creating Entities
+    if (properties.type != mantle_api::EntityType::kPedestrian)
+    {
+        throw std::runtime_error("Pedestrian could not be created. Pedestrian requires EntityType: Pedestrian.");
+    }
+
+    bool success{false};
+    std::map<mantle_api::UniqueId, std::shared_ptr<Entity>>::iterator entry;
+    while (!success)
+    {
+        std::tie(entry, success) = entitiesById.try_emplace(nextId, std::make_shared<Pedestrian>(nextId, name, std::make_shared<mantle_api::PedestrianProperties>(properties), routeSampler));
+        ++nextId;
+    }
+
+    return CreateHelper<mantle_api::IPedestrian>(name, entry->second);
+}
+
+mantle_api::IPedestrian &EntityRepository::Create(mantle_api::UniqueId id, const std::string &name, const mantle_api::PedestrianProperties &properties)
+{
+    // This is to verify if scenarioEngine set the correct EntityType when creating Entities
+    if (properties.type != mantle_api::EntityType::kPedestrian)
+    {
+        throw std::runtime_error("Pedestrian could not be created. Pedestrian requires EntityType: Pedestrian.");
+    }
+
+    auto [entry, success] = entitiesById.try_emplace(id, std::make_shared<Pedestrian>(nextId, name, std::make_shared<mantle_api::PedestrianProperties>(properties), routeSampler));
+    if (!success)
+    {
+        throw std::runtime_error("Id \"" + std::to_string(id) + "\" is already in use");
+    }
+    return CreateHelper<mantle_api::IPedestrian>(name, entry->second);
+}
+
+mantle_api::IStaticObject &EntityRepository::Create(const std::string &name, const mantle_api::StaticObjectProperties &properties)
+{
+
+}
+
+mantle_api::IStaticObject &EntityRepository::Create(mantle_api::UniqueId id, const std::string &name, const mantle_api::StaticObjectProperties &properties)
+{
+
+}
+
+mantle_api::IVehicle &EntityRepository::GetHost()
+{
+
+}
+
+std::optional<std::reference_wrapper<mantle_api::IEntity>> EntityRepository::Get(const std::string &name)
+{
+    return *entitiesByName.at(name);
+}
+
+std::optional<std::reference_wrapper<mantle_api::IEntity>> EntityRepository::Get(mantle_api::UniqueId id)
+{
+    if (entitiesById.find(id) == entitiesById.end())
+    {
+        return std::nullopt;
+    }
+    else
+    {
+        return *((std::static_pointer_cast<mantle_api::IEntity>(entitiesById.at(id))));
+    }
+}
+
+bool EntityRepository::Contains(mantle_api::UniqueId id) const
+{
+
+}
+
+void EntityRepository::Delete(const std::string &name)
+{
+
+}
+
+void EntityRepository::Delete(mantle_api::UniqueId id)
+{
+
+}
+
+const std::vector<std::unique_ptr<mantle_api::IEntity> > &EntityRepository::GetEntities() const
+{
+}
+
+Entity &EntityRepository::GetEntity(mantle_api::UniqueId id)
+{
+    return *((std::static_pointer_cast<Entity>(entitiesById.at(id))));
+}
+
+bool EntityRepository::SpawnReadyAgents()
+{
+    bool successfullySpawnedAgents = true;
+    std::vector<std::shared_ptr<Entity>> stillUnspawnedVehicles;
+    for (auto vehicle : unspawnedEntities)
+    {
+        if (vehicle->ShouldBeSpawned())
+        {
+            auto newAgent = agentFactory->AddAgent(vehicle->GetAgentBuildInstructions());
+
+            if (newAgent == nullptr)
+            {
+                successfullySpawnedAgents = false;
+            }
+            else
+            {
+                newAgents.push_back(newAgent);
+                vehicle->SetAgent(newAgent->GetAgentAdapter());
+            }
+        }
+        else
+        {
+            stillUnspawnedVehicles.push_back(vehicle);
+        }
+    }
+    unspawnedEntities = stillUnspawnedVehicles;
+    return successfullySpawnedAgents;
+}
+
+std::vector<Agent *> EntityRepository::ConsumeNewAgents()
+{
+    std::vector<Agent*> tmpAgents;
+    std::swap(tmpAgents, newAgents);
+    return tmpAgents;
+}
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/entityRepository.h b/sim/src/core/opSimulation/framework/entityRepository.h
new file mode 100644
index 0000000000000000000000000000000000000000..e0a680a29ca808d3d222c23774905f2d25bb733f
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/entityRepository.h
@@ -0,0 +1,82 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include <map>
+
+#include "include/agentFactoryInterface.h"
+#include "include/entityRepositoryInterface.h"
+#include "pedestrian.h"
+#include "vehicle.h"
+
+namespace core {
+class EntityRepository final : public EntityRepositoryInterface
+{
+public:
+    EntityRepository(core::AgentFactoryInterface *agentFactory, const RouteSamplerInterface *routeSampler);
+
+    virtual mantle_api::IVehicle &Create(const std::string &name, const mantle_api::VehicleProperties &properties) override;
+    virtual mantle_api::IVehicle &Create(mantle_api::UniqueId id, const std::string &name, const mantle_api::VehicleProperties &properties) override;
+    virtual mantle_api::IPedestrian &Create(const std::string &name, const mantle_api::PedestrianProperties &properties) override;
+    virtual mantle_api::IPedestrian &Create(mantle_api::UniqueId id, const std::string &name, const mantle_api::PedestrianProperties &properties) override;
+    virtual mantle_api::IStaticObject &Create(const std::string &name, const mantle_api::StaticObjectProperties &properties) override;
+    virtual mantle_api::IStaticObject &Create(mantle_api::UniqueId id, const std::string &name, const mantle_api::StaticObjectProperties &properties) override;
+
+    virtual mantle_api::IVehicle &GetHost() override;
+    virtual std::optional<std::reference_wrapper<mantle_api::IEntity>> Get(const std::string &name) override;
+    virtual std::optional<std::reference_wrapper<mantle_api::IEntity>> Get(mantle_api::UniqueId id) override;
+    virtual bool Contains(mantle_api::UniqueId id) const override;
+
+    virtual void Delete(const std::string &name) override;
+    virtual void Delete(mantle_api::UniqueId id) override;
+
+    virtual const std::vector<std::unique_ptr<mantle_api::IEntity>> &GetEntities() const override;
+
+    virtual void RegisterEntityCreatedCallback(const std::function<void(mantle_api::IEntity &)> &callback)
+    {
+    }
+    virtual void RegisterEntityDeletedCallback(const std::function<void(const std::string &)> &callback)
+    {
+    }
+    virtual void RegisterEntityDeletedCallback(const std::function<void(mantle_api::UniqueId)> &callback)
+    {
+    }
+
+    Entity &GetEntity(mantle_api::UniqueId id);
+
+    std::map<mantle_api::UniqueId, std::shared_ptr<Entity>> &GetEntitiesById()
+    {
+        return entitiesById;
+    }
+
+    bool SpawnReadyAgents();
+
+    std::vector<Agent *> ConsumeNewAgents();
+
+private:
+    template <typename T>
+    T &CreateHelper(const std::string &name, std::shared_ptr<Entity> entity)
+    {
+        entitiesByName.insert({name, entity});
+        unspawnedEntities.push_back(entity);
+
+        return *(std::dynamic_pointer_cast<T>(entity));
+    }
+
+    mantle_api::UniqueId nextId{0};
+    std::map<mantle_api::UniqueId, std::shared_ptr<Entity>> entitiesById;
+    std::map<std::string, std::shared_ptr<Entity>> entitiesByName;
+    std::vector<std::shared_ptr<Entity>> unspawnedEntities;
+    core::AgentFactoryInterface *agentFactory{nullptr};
+    const RouteSamplerInterface* routeSampler;
+    std::vector<Agent*> newAgents;
+};
+} // namespace core
diff --git a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioGlobal.h b/sim/src/core/opSimulation/framework/environment.cpp
similarity index 63%
rename from sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioGlobal.h
rename to sim/src/core/opSimulation/framework/environment.cpp
index 84fc8438bef2ff4e3193e033b0c30f8cdadb5a3b..d43537a8a6c5d83022e525c732542a8e9b5609ed 100644
--- a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioGlobal.h
+++ b/sim/src/core/opSimulation/framework/environment.cpp
@@ -1,5 +1,5 @@
 /********************************************************************************
- * Copyright (c) 2017-2019 in-tech GmbH
+ * Copyright (c) 2021 in-tech GmbH
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -9,18 +9,11 @@
  ********************************************************************************/
 
 //-----------------------------------------------------------------------------
-/** @file  SpawnpointGlobal.h
-*	@brief This file contains DLL export declarations
-**/
+/** \file  environment.cpp */
 //-----------------------------------------------------------------------------
 
-#pragma once
+#include "environment.h"
 
-#include <QtCore/qglobal.h>
-
-#if defined(SPAWNER_SCENARIO_LIBRARY)
-#  define SPAWNPOINT_SHARED_EXPORT Q_DECL_EXPORT
-#else
-#  define SPAWNPOINT_SHARED_EXPORT Q_DECL_IMPORT
-#endif
+namespace core {
 
+} //namespace core
diff --git a/sim/src/core/opSimulation/framework/environment.h b/sim/src/core/opSimulation/framework/environment.h
new file mode 100644
index 0000000000000000000000000000000000000000..014d0c60bdb7432091208215e48c0e66d75e9f2a
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/environment.h
@@ -0,0 +1,215 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** \addtogroup Environment
+* @{
+* \file  environment.h
+* @} */
+//-----------------------------------------------------------------------------
+
+#pragma once
+
+#include "include/environmentInterface.h"
+#include "agentBlueprintProvider.h"
+#include "directories.h"
+#include "entityRepository.h"
+#include "controllerRepository.h"
+#include "coordConverter.h"
+#include "geometryHelper.h"
+#include "importer/scenery.h"
+#include "importer/sceneryImporter.h"
+#include "include/worldInterface.h"
+#include "laneLocationQueryService.h"
+
+using namespace units::literals;
+
+namespace core {
+
+//-----------------------------------------------------------------------------
+/** \brief Implements the functionality of the interface.
+*
+* 	\ingroup EventNetwork */
+//-----------------------------------------------------------------------------
+class SIMULATIONCOREEXPORT Environment final : public EnvironmentInterface
+{
+public:
+    Environment(const std::string &configurationDir,
+                AgentBlueprintProvider &agentBlueprintProvider,
+                core::AgentFactoryInterface *agentFactory,
+                StochasticsInterface *stochastics,
+                const TurningRates& turningRates) :
+        configurationDir(configurationDir),
+        agentBlueprintProvider(agentBlueprintProvider),
+        agentFactory(agentFactory),
+        routeSampler(stochastics),
+        entityRepository(agentFactory, &routeSampler),
+        controllerRepository(agentBlueprintProvider),
+        turningRates(turningRates)
+    {}
+
+    ~Environment() = default;
+
+    void Step(const mantle_api::Time &simulationTime)
+    {
+        world->SyncGlobalData(int(simulationTime.value()));
+
+        this->simulationTime = simulationTime;
+
+        for ( const auto& [id, entity] : entityRepository.GetEntitiesById() )
+        {
+            entity->GetControlStrategies()->ResetCustomCommands();
+        }
+    }
+
+    void CreateMap(const std::string &map_file_path, const mantle_api::MapDetails &map_details) final
+    {
+        if (world->isInstantiated())
+        {
+            return;
+        }
+        auto concaternated_path = openpass::core::Directories::Concat(configurationDir, map_file_path);
+        ThrowIfFalse(world, "World has not been set");
+
+        ThrowIfFalse(Importer::SceneryImporter::Import(concaternated_path, &scenery),
+                     "Could not import scenery");
+
+        ThrowIfFalse(world->Instantiate(),
+                     "Failed to instantiate World");
+        world->CreateScenery(&scenery, turningRates);
+    }
+
+    void AddEntityToController(mantle_api::IEntity& entity, std::uint64_t controller_id) final
+    {
+        const Controller& controller = dynamic_cast<Controller &>(controllerRepository.Get(controller_id).value().get());
+
+        entityRepository.GetEntity(entity.GetUniqueId()).SetSystem(controller.GetSystem());
+    }
+
+    void RemoveControllerFromEntity(std::uint64_t entity_id) final
+    {
+
+    }
+
+    void UpdateControlStrategies(std::uint64_t entity_id, std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) final
+    {
+        // TODO CK Implement reasonable strategy to add and remove control strategies regarding movement domain.
+        entityRepository.GetEntity(entity_id).GetControlStrategies()->SetStrategies(control_strategies);
+    }
+
+    // TODO CK: This IQueryService needs to be derived by the worlddataquery
+    const mantle_api::ILaneLocationQueryService& GetQueryService() const final
+    {
+        return laneLocationQueryService;
+    }
+
+    const mantle_api::ICoordConverter* GetConverter() const final
+    {
+        return &coordConverter;
+    }
+
+    const mantle_api::IGeometryHelper* GetGeometryHelper() const final
+    {
+        return &geometryHelper;
+    }
+
+    EntityRepository& GetEntityRepository() final
+    {
+        return entityRepository;
+    }
+
+    ControllerRepository& GetControllerRepository() final
+    {
+        return controllerRepository;
+    }
+
+    void SetDateTime(mantle_api::Time date_time) final
+    {
+
+    }
+
+    mantle_api::Time GetDateTime() final
+    {
+        return {};
+    }
+
+    void SetWeather(mantle_api::Weather weather) final
+    {
+        world->SetWeather(weather);
+    }
+
+    void SetRoadCondition(std::vector<mantle_api::FrictionPatch> friction_patches) final
+    {
+
+    }
+
+    void SetTrafficSignalState(const std::string& traffic_signal_name, const std::string& traffic_signal_state) final
+    {
+        
+    }
+
+    bool HasControlStrategyGoalBeenReached(std::uint64_t controller_id,
+                                           mantle_api::ControlStrategyType type) const final
+    {
+
+    }
+
+    // This needs to be called before calling create map
+    // This should actually be part of the init function to ensure correct usage. WorldBinding & library might need to move into this class
+    void SetWorld(WorldInterface* world)
+    {
+        this->world = world;
+        laneLocationQueryService.Init(world);
+        coordConverter.Init(world);
+        routeSampler.SetWorld(world);
+    }
+
+    mantle_api::Time GetSimulationTime() final
+    {
+        return simulationTime;
+    }
+
+    virtual void ExecuteCustomCommand(const std::vector<std::string>& actors, const std::string& type, const std::string& command)
+    {
+        for (const auto& actor : actors)
+        {
+            auto entity = entityRepository.Get(actor);
+            if (!entity.has_value())
+            {
+                continue;
+            }
+            entityRepository.GetEntity(entity.value().get().GetUniqueId()).GetControlStrategies()->AddCustomCommand(command);
+        }
+    }
+
+    void Reset()
+    {
+        entityRepository = {agentFactory, &routeSampler};
+        controllerRepository = {agentBlueprintProvider};
+        world->Reset();
+        }
+
+    Scenery scenery;
+    WorldInterface* world {nullptr};
+    LaneLocationQueryService laneLocationQueryService;
+    CoordConverter coordConverter;
+    GeometryHelper geometryHelper;
+    const std::string& configurationDir;
+    AgentBlueprintProvider& agentBlueprintProvider;
+    core::AgentFactoryInterface *agentFactory{nullptr};
+    const TurningRates& turningRates;
+    RouteSampler routeSampler;
+    EntityRepository entityRepository;
+    ControllerRepository controllerRepository;
+
+    mantle_api::Time simulationTime{};
+};
+
+} //namespace core
diff --git a/sim/src/core/opSimulation/framework/frameworkModuleContainer.cpp b/sim/src/core/opSimulation/framework/frameworkModuleContainer.cpp
index faa543e2c8c477d11764e5d5d119f19d26dcdaf2..d6d5ebd8190ef56b607ea5fe47cf0db77c8b5acb 100644
--- a/sim/src/core/opSimulation/framework/frameworkModuleContainer.cpp
+++ b/sim/src/core/opSimulation/framework/frameworkModuleContainer.cpp
@@ -16,7 +16,6 @@ namespace core {
 
 FrameworkModuleContainer::FrameworkModuleContainer(
     FrameworkModules frameworkModules,
-    ConfigurationContainerInterface *configurationContainer,
     const openpass::common::RuntimeInformation &runtimeInformation,
     CallbackInterface *callbacks) :
     dataBufferBinding(frameworkModules.dataBufferLibrary, runtimeInformation, callbacks),
@@ -32,8 +31,7 @@ FrameworkModuleContainer::FrameworkModuleContainer(
     manipulatorBinding(callbacks),
     manipulatorNetwork(&manipulatorBinding, &world, &coreDataPublisher),
     modelBinding(frameworkModules.libraryDir, runtimeInformation, callbacks),
-    agentFactory(&modelBinding, &world, &stochastics, &observationNetwork, &eventNetwork, &dataBuffer),
-    agentBlueprintProvider(configurationContainer, stochastics),
+    agentFactory(&modelBinding, &world, &stochastics, &observationNetwork, &dataBuffer),
     eventNetwork(&dataBuffer),
     spawnPointNetwork(&spawnPointBindings, &world, runtimeInformation)
 {
@@ -48,11 +46,6 @@ FrameworkModuleContainer::FrameworkModuleContainer(
     }
 }
 
-const AgentBlueprintProviderInterface *FrameworkModuleContainer::GetAgentBlueprintProvider() const
-{
-    return &agentBlueprintProvider;
-}
-
 AgentFactoryInterface *FrameworkModuleContainer::GetAgentFactory()
 {
     return &agentFactory;
diff --git a/sim/src/core/opSimulation/framework/frameworkModuleContainer.h b/sim/src/core/opSimulation/framework/frameworkModuleContainer.h
index 3c7705a54c8792041a3300e56a3021ff2c6ddb93..46d6499d0f82609695a1087f43438cad1ddb528d 100644
--- a/sim/src/core/opSimulation/framework/frameworkModuleContainer.h
+++ b/sim/src/core/opSimulation/framework/frameworkModuleContainer.h
@@ -48,11 +48,9 @@ class SIMULATIONCOREEXPORT FrameworkModuleContainer final : public FrameworkModu
 {
 public:
     FrameworkModuleContainer(FrameworkModules frameworkModules,
-                             ConfigurationContainerInterface *configurationContainer,
                              const openpass::common::RuntimeInformation &runtimeInformation,
                              CallbackInterface *callbacks);
 
-    const AgentBlueprintProviderInterface *GetAgentBlueprintProvider() const override;
     AgentFactoryInterface *GetAgentFactory() override;
     DataBufferInterface *GetDataBuffer() override;
     EventDetectorNetworkInterface *GetEventDetectorNetwork() override;
@@ -87,8 +85,6 @@ private:
 
     AgentFactory agentFactory;
 
-    AgentBlueprintProvider agentBlueprintProvider;
-
     EventNetwork eventNetwork;
 
     std::map<std::string, SpawnPointBinding> spawnPointBindings;
diff --git a/sim/src/core/opSimulation/framework/geometryHelper.h b/sim/src/core/opSimulation/framework/geometryHelper.h
new file mode 100644
index 0000000000000000000000000000000000000000..a90e310053a09dbe2778c37edac06ef5fdf6b18c
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/geometryHelper.h
@@ -0,0 +1,55 @@
+/*******************************************************************************
+* Copyright (c) 2022 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** \addtogroup Environment
+* @{
+* \file  geometryHelper.h
+* @} */
+//-----------------------------------------------------------------------------
+
+#pragma once
+
+#include "MantleAPI/Common/i_geometry_helper.h"
+
+using namespace units::literals;
+
+namespace core {
+class SIMULATIONCOREEXPORT GeometryHelper final : public mantle_api::IGeometryHelper
+{
+public:
+  mantle_api::Vec3<units::length::meter_t> TranslateGlobalPositionLocally(
+      const mantle_api::Vec3<units::length::meter_t>& global_position,
+      const mantle_api::Orientation3<units::angle::radian_t>& local_orientation,
+      const mantle_api::Vec3<units::length::meter_t>& local_translation) const override
+      {
+          const units::length::meter_t x = global_position.x + units::math::cos(local_orientation.yaw) * local_translation.x - units::math::sin(local_orientation.yaw) * local_translation.y;
+          const units::length::meter_t y = global_position.y + units::math::sin(local_orientation.yaw) * local_translation.x + units::math::cos(local_orientation.yaw) * local_translation.y;
+          const units::length::meter_t z = global_position.z;
+          return{x, y, z};
+      }
+
+  std::vector<mantle_api::Vec3<units::length::meter_t>> TransformPolylinePointsFromWorldToLocal(
+      const std::vector<mantle_api::Vec3<units::length::meter_t>>& polyline_points,
+      const mantle_api::Vec3<units::length::meter_t>& local_origin,
+      const mantle_api::Orientation3<units::angle::radian_t>& local_orientation) const override
+      {
+          
+      }
+
+  mantle_api::Vec3<units::length::meter_t> TransformPositionFromWorldToLocal(
+      const mantle_api::Vec3<units::length::meter_t>& world_position,
+      const mantle_api::Vec3<units::length::meter_t>& local_origin,
+      const mantle_api::Orientation3<units::angle::radian_t>& local_orientation) const override
+      {
+          
+      }
+};
+}
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/framework/laneLocationQueryService.cpp b/sim/src/core/opSimulation/framework/laneLocationQueryService.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7e1444e00a78fb307b294853c2ca8738b171623b
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/laneLocationQueryService.cpp
@@ -0,0 +1,108 @@
+/*******************************************************************************
+* Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#include "laneLocationQueryService.h"
+
+using namespace units::literals;
+
+namespace core {
+    
+    mantle_api::Orientation3<units::angle::radian_t> LaneLocationQueryService::GetLaneOrientation(
+        const mantle_api::Vec3<units::length::meter_t>& position) const
+    {
+        const auto lanePosition = world->WorldCoord2LaneCoord(position.x, position.y, 0_rad);
+        if(lanePosition.empty())
+        {
+           throw std::runtime_error("Position is outside of road network!");
+        }
+
+        const auto direction = world->GetLaneDirection(lanePosition.cbegin()->second.roadId, lanePosition.cbegin()->second.laneId, lanePosition.cbegin()->second.roadPosition.s);
+        return {direction, 0_rad, 0_rad};
+    }
+
+    mantle_api::Vec3<units::length::meter_t> LaneLocationQueryService::GetUpwardsShiftedLanePosition(const mantle_api::Vec3<units::length::meter_t>& position,
+                                                                       double upwards_shift,
+                                                                       bool allow_invalid_positions) const
+    {}
+
+    bool LaneLocationQueryService::IsPositionOnLane(const mantle_api::Vec3<units::length::meter_t>& position) const
+    {
+        const auto lanePosition = world->WorldCoord2LaneCoord(position.x, position.y, 0_rad);
+        return !lanePosition.empty();
+    }
+
+    std::vector<mantle_api::UniqueId> LaneLocationQueryService::GetLaneIdsAtPosition(const mantle_api::Vec3<units::length::meter_t>& position) const
+    {
+        const auto lanePositions = world->WorldCoord2LaneCoord(position.x, position.y, 0_rad);
+
+        std::vector<mantle_api::UniqueId> laneIds{};
+        for(const auto& lanePosition : lanePositions)
+        {
+            auto laneId = world->GetUniqueLaneId(lanePosition.second.roadId, lanePosition.second.laneId, lanePosition.second.roadPosition.s);
+            laneIds.push_back(laneId);
+        }
+        return laneIds;
+    }
+
+    std::optional<mantle_api::Pose> LaneLocationQueryService::FindLanePoseAtDistanceFrom(const mantle_api::Pose& reference_pose_on_lane, units::length::meter_t distance, mantle_api::Direction direction) const
+    {
+        if(IsPositionOnLane(reference_pose_on_lane.position))
+        {
+            const auto lanePosition = world->WorldCoord2LaneCoord(reference_pose_on_lane.position.x, reference_pose_on_lane.position.y, reference_pose_on_lane.orientation.yaw);
+            
+            bool forwardDirection = (direction == mantle_api::Direction::kForward);
+            auto roadStream = world->GetRoadStream({{lanePosition.cbegin()->second.roadId, forwardDirection}});
+            auto laneStream = roadStream->GetLaneStream(lanePosition.cbegin()->second);
+            auto laneStreamPosition = laneStream->GetStreamPosition(lanePosition.cbegin()->second);
+            StreamPosition targetStreamPosition = {laneStreamPosition.s + distance, laneStreamPosition.t};
+            auto targetRoadPosition = laneStream->GetRoadPosition(targetStreamPosition);
+
+            mantle_api::Pose newPose;
+            auto worldPosition = world->LaneCoord2WorldCoord(targetRoadPosition.roadPosition.s, targetRoadPosition.roadPosition.t, targetRoadPosition.roadId, targetRoadPosition.laneId);
+            newPose.position = {worldPosition.xPos, worldPosition.yPos, 0.0_m};
+            newPose.orientation.yaw = CommonHelper::SetAngleToValidRange(worldPosition.yawAngle + reference_pose_on_lane.orientation.yaw);
+            return newPose;
+        }
+        return std::nullopt;
+    }
+
+    std::optional<mantle_api::Pose> LaneLocationQueryService::FindRelativeLanePoseAtDistanceFrom(const mantle_api::Pose& reference_pose_on_lane, int relative_target_lane, units::length::meter_t distance, units::length::meter_t lateral_offset) const
+    {
+        
+        if(IsPositionOnLane(reference_pose_on_lane.position))
+        {
+            const auto lanePosition = world->WorldCoord2LaneCoord(reference_pose_on_lane.position.x, reference_pose_on_lane.position.y, reference_pose_on_lane.orientation.yaw);
+            
+            bool direction = (std::abs(lanePosition.cbegin()->second.roadPosition.hdg.value()) <= M_PI_2);
+            auto roadStream = world->GetRoadStream({{lanePosition.cbegin()->second.roadId, direction}});
+            auto laneStream = roadStream->GetLaneStream(lanePosition.cbegin()->second);
+            auto laneStreamPosition = laneStream->GetStreamPosition(lanePosition.cbegin()->second);
+            StreamPosition targetStreamPosition = {laneStreamPosition.s + distance, laneStreamPosition.t};
+            auto targetRoadPosition = laneStream->GetRoadPosition(targetStreamPosition);
+
+            mantle_api::Pose newPose;
+            auto worldPosition = world->LaneCoord2WorldCoord(targetRoadPosition.roadPosition.s, lateral_offset, targetRoadPosition.roadId, targetRoadPosition.laneId + relative_target_lane);
+            newPose.position = {worldPosition.xPos, worldPosition.yPos, 0.0_m};
+            newPose.orientation.yaw = CommonHelper::SetAngleToValidRange(worldPosition.yawAngle + reference_pose_on_lane.orientation.yaw);
+            return newPose;
+        }
+        return std::nullopt;
+    }
+
+    std::optional<mantle_api::UniqueId> LaneLocationQueryService::GetRelativeLaneId(const mantle_api::Pose& reference_pose_on_lane, int relative_lane_target) const
+    {
+        if(IsPositionOnLane(reference_pose_on_lane.position))
+        {
+            const auto lanePosition = world->WorldCoord2LaneCoord(reference_pose_on_lane.position.x, reference_pose_on_lane.position.y, 0_rad);
+            return world->GetUniqueLaneId(lanePosition.cbegin()->second.roadId, lanePosition.cbegin()->second.laneId, lanePosition.cbegin()->second.roadPosition.s) + relative_lane_target;
+        }
+        return std::nullopt;
+    }
+} // namespace core
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/framework/laneLocationQueryService.h b/sim/src/core/opSimulation/framework/laneLocationQueryService.h
new file mode 100644
index 0000000000000000000000000000000000000000..e7e47f2dc61f0438a981f3a8be112e336627208f
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/laneLocationQueryService.h
@@ -0,0 +1,46 @@
+/*******************************************************************************
+* Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include <limits>   // workaround for missing includes in MantleAPI headers
+
+#include "MantleAPI/Map/i_lane_location_query_service.h"
+#include "include/worldInterface.h"
+
+namespace core {
+class LaneLocationQueryService : public mantle_api::ILaneLocationQueryService
+{
+public:
+
+    LaneLocationQueryService() = default;
+    ~LaneLocationQueryService() = default;
+
+    void Init(WorldInterface* world)
+    {
+        this->world = world;
+    }
+
+    virtual mantle_api::Orientation3<units::angle::radian_t> GetLaneOrientation(
+        const mantle_api::Vec3<units::length::meter_t>& position) const override;
+    virtual mantle_api::Vec3<units::length::meter_t> GetUpwardsShiftedLanePosition(const mantle_api::Vec3<units::length::meter_t>& position,
+                                                                       double upwards_shift,
+                                                                       bool allow_invalid_positions = false) const override;
+    virtual bool IsPositionOnLane(const mantle_api::Vec3<units::length::meter_t>& position) const override;
+    virtual std::vector<mantle_api::UniqueId> GetLaneIdsAtPosition(const mantle_api::Vec3<units::length::meter_t>& position) const override;
+
+    virtual std::optional<mantle_api::Pose> FindLanePoseAtDistanceFrom(const mantle_api::Pose& reference_pose_on_lane, units::length::meter_t distance, mantle_api::Direction direction) const override;
+    virtual std::optional<mantle_api::Pose> FindRelativeLanePoseAtDistanceFrom(const mantle_api::Pose& reference_pose_on_lane, int relative_target_lane, units::length::meter_t distance, units::length::meter_t lateral_offset) const override;
+    virtual std::optional<mantle_api::UniqueId> GetRelativeLaneId(const mantle_api::Pose& reference_pose_on_lane, int relative_lane_target) const override;
+
+private:
+    WorldInterface* world; 
+};
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/main.cpp b/sim/src/core/opSimulation/framework/main.cpp
index 38ca394fb37f610ab7c5ce89f4790ffe0fcc1fb5..5b7171aef35ed85c12f706bec2bc5825250bf05b 100644
--- a/sim/src/core/opSimulation/framework/main.cpp
+++ b/sim/src/core/opSimulation/framework/main.cpp
@@ -126,7 +126,6 @@ int main(int argc, char* argv[])
 
     SimulationCommon::Callbacks callbacks;
     FrameworkModuleContainer frameworkModuleContainer(frameworkModules,
-                                                      &configurationContainer,
                                                       runtimeInformation,
                                                       &callbacks);
 
diff --git a/sim/src/core/opSimulation/framework/pedestrian.cpp b/sim/src/core/opSimulation/framework/pedestrian.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9d2236918b9c502e41ba16c34378f4fa68476761
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/pedestrian.cpp
@@ -0,0 +1,21 @@
+#include "pedestrian.h"
+
+#include "agent.h"
+
+namespace core {
+Pedestrian::Pedestrian(mantle_api::UniqueId id,
+                       const std::string &name,
+                       const std::shared_ptr<mantle_api::PedestrianProperties> properties,
+                       const RouteSamplerInterface *routeSampler) :
+    Entity(id, name, routeSampler, properties, AgentCategory::Scenario)
+{
+}
+
+void Pedestrian::SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties)
+{
+}
+
+mantle_api::PedestrianProperties *Pedestrian::GetProperties() const
+{
+}
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/pedestrian.h b/sim/src/core/opSimulation/framework/pedestrian.h
new file mode 100644
index 0000000000000000000000000000000000000000..fa99b6a895bdc1bde93052d3addca2ad33dac7bc
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/pedestrian.h
@@ -0,0 +1,32 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include "MantleAPI/Traffic/i_entity.h"
+#include "entity.h"
+#include "include/agentBlueprintInterface.h"
+#include "include/agentFactoryInterface.h"
+#include "include/agentInterface.h"
+#include "routeSampler.h"
+
+namespace core {
+class Pedestrian : public Entity, public mantle_api::IPedestrian
+{
+public:
+    Pedestrian(mantle_api::UniqueId id,
+               const std::string &name,
+               const std::shared_ptr<mantle_api::PedestrianProperties> properties,
+               const RouteSamplerInterface *routeSampler);
+
+    virtual void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override;
+    virtual mantle_api::PedestrianProperties *GetProperties() const override;
+};
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/routeSampler.h b/sim/src/core/opSimulation/framework/routeSampler.h
new file mode 100644
index 0000000000000000000000000000000000000000..c28ad36d7e38ef9a81fc72b1b55d1671f508ef29
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/routeSampler.h
@@ -0,0 +1,60 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** \addtogroup Environment
+* @{
+* \file  environment.h
+* @} */
+//-----------------------------------------------------------------------------
+
+#pragma once
+
+#include "include/agentBlueprintInterface.h"
+#include "include/stochasticsInterface.h"
+#include "include/worldInterface.h"
+#include "MantleAPI/Common/vector.h"
+#include "common/commonTools.h"
+#include "common/RoutePlanning/RouteCalculation.h"
+
+constexpr size_t MAX_DEPTH = 10; //! Limits search depths in case of cyclic network
+
+class RouteSamplerInterface
+{
+public:
+    virtual Route Sample(const mantle_api::Vec3<units::length::meter_t>& inert_pos, units::angle::radian_t yaw) const = 0;
+};
+
+class RouteSampler : public RouteSamplerInterface
+{
+public:
+    RouteSampler(StochasticsInterface* stochastics) :
+        stochastics(stochastics)
+    {}
+
+    void SetWorld(const WorldInterface* world)
+    {
+        this->world = world;
+    }
+
+    Route Sample(const mantle_api::Vec3<units::length::meter_t>& inert_pos, units::angle::radian_t yaw) const override
+    {
+        const auto& roadPositions = world->WorldCoord2LaneCoord(inert_pos.x, inert_pos.y, yaw);
+        auto [roadGraph, root] = world->GetRoadGraph(CommonHelper::GetRoadWithLowestHeading(roadPositions, *world), MAX_DEPTH);
+        std::map<RoadGraph::edge_descriptor, double> weights = world->GetEdgeWeights(roadGraph);
+        auto target = RouteCalculation::SampleRoute(roadGraph, root, weights, *stochastics);
+
+        return Route{roadGraph, root, target};
+    }
+
+private:
+    const WorldInterface* world;
+    StochasticsInterface* stochastics;
+};
diff --git a/sim/src/core/opSimulation/framework/runInstantiator.cpp b/sim/src/core/opSimulation/framework/runInstantiator.cpp
index 41760fbdf01902244b0b086cf157de8208b18da3..ce2a69ba0d857e676fb0088ca9c17eca8cb578fb 100644
--- a/sim/src/core/opSimulation/framework/runInstantiator.cpp
+++ b/sim/src/core/opSimulation/framework/runInstantiator.cpp
@@ -13,25 +13,31 @@
 
 #include <functional>
 #include <sstream>
+#include <QDir>
 
-#include "common/log.h"
-#include "include/agentBlueprintProviderInterface.h"
-#include "include/observationNetworkInterface.h"
-#include "include/eventDetectorNetworkInterface.h"
-#include "include/manipulatorNetworkInterface.h"
 #include "agentFactory.h"
 #include "agentType.h"
+#include "bindings/dataBuffer.h"
+#include "bindings/stochastics.h"
 #include "channel.h"
+#include "common/log.h"
 #include "component.h"
-#include "bindings/dataBuffer.h"
-#include "observationModule.h"
+#include "directories.h"
+#include "importer/entityPropertiesImporter.h"
+#include "include/eventDetectorNetworkInterface.h"
+#include "include/manipulatorNetworkInterface.h"
+#include "include/observationNetworkInterface.h"
 #include "modelElements/parameters.h"
+#include "observationModule.h"
+#include "parameterbuilder.h"
+#include "sampler.h"
 #include "scheduler/runResult.h"
 #include "scheduler/scheduler.h"
 #include "spawnPointNetwork.h"
-#include "bindings/stochastics.h"
-#include "parameterbuilder.h"
-#include "sampler.h"
+
+const std::string SCENERYPATH = "full_map_path";
+const std::string VEHICLEMODELSFILENAME = "VehicleModelsCatalog.xosc";
+
 
 constexpr char SPAWNER[] = {"Spawner"};
 
@@ -46,24 +52,41 @@ bool RunInstantiator::ExecuteRun()
     stopped = false;
     stopMutex.unlock();
 
-    const auto &scenario = *configurationContainer.GetScenario();
-    const auto &scenery = *configurationContainer.GetScenery();
     const auto &simulationConfig = *configurationContainer.GetSimulationConfig();
     const auto &profiles = *configurationContainer.GetProfiles();
     const auto &experimentConfig = simulationConfig.GetExperimentConfig();
     const auto &environmentConfig = simulationConfig.GetEnvironmentConfig();
 
-    if (!InitPreRun(scenario, scenery, simulationConfig))
+    ThrowIfFalse(dataBuffer.Instantiate(), "Failed to instantiate DataBuffer");
+
+    ThrowIfFalse(stochastics.Instantiate(frameworkModules.stochasticsLibrary),
+                 "Failed to instantiate Stochastics");
+
+    agentBlueprintProvider.Init(&configurationContainer,
+                                &stochastics);
+
+    environment->SetWorld(&world);
+    scenarioEngine->Init();
+
+    const auto configurationDir = QString::fromStdString(configurationContainer.GetRuntimeInformation().directories.configuration) + QDir::separator();
+    const QDir sceneryPath = configurationDir + QString::fromStdString(scenarioEngine->GetScenarioInfo().additional_information.at(SCENERYPATH));
+    const QDir vehicleCatalogFilepath = configurationDir + QString::fromStdString(scenarioEngine->GetScenarioInfo().additional_information.at("vehicle_catalog_path")) + QDir::separator() + QString::fromStdString(VEHICLEMODELSFILENAME);
+
+    Importer::EntityPropertiesImporter entityPropertiesImporter;
+    entityPropertiesImporter.Import(vehicleCatalogFilepath.absolutePath().toStdString());
+    vehicles = entityPropertiesImporter.GetVehicleProperties();
+
+    if (!InitPreRun(sceneryPath.absolutePath().toStdString()))
     {
         LOG_INTERN(LogLevel::DebugCore) << std::endl
                                         << "### initialization failed ###";
         return false;
     }
 
-    dataBuffer.PutStatic("SceneryFile", scenario.GetSceneryPath(), true);
+    dataBuffer.PutStatic("SceneryFile", sceneryPath.absolutePath().toStdString(), true);
     ThrowIfFalse(observationNetwork.InitAll(), "Failed to initialize ObservationNetwork");
 
-    core::scheduling::Scheduler scheduler(world, spawnPointNetwork, eventDetectorNetwork, manipulatorNetwork, observationNetwork, dataBuffer);
+    core::scheduling::Scheduler scheduler(world, spawnPointNetwork, eventDetectorNetwork, manipulatorNetwork, observationNetwork, dataBuffer, *environment);
     bool scheduler_state{false};
 
     for (auto invocation = 0; invocation < experimentConfig.numberOfInvocations; invocation++)
@@ -73,6 +96,10 @@ bool RunInstantiator::ExecuteRun()
         LOG_INTERN(LogLevel::DebugCore) << std::endl
                                         << "### run number: " << invocation << " ###";
         auto seed = static_cast<std::uint32_t>(experimentConfig.randomSeed + invocation);
+        if (invocation != 0)
+        {
+            ResetScenarioEngine();
+        }
         if (!InitRun(seed, environmentConfig, profiles, runResult))
         {
             LOG_INTERN(LogLevel::DebugCore) << std::endl
@@ -82,7 +109,7 @@ bool RunInstantiator::ExecuteRun()
 
         LOG_INTERN(LogLevel::DebugCore) << std::endl
                                         << "### run started ###";
-        scheduler_state = scheduler.Run(0, scenario.GetEndTime(), runResult, eventNetwork);
+        scheduler_state = scheduler.Run(0, runResult, eventNetwork, std::move(scenarioEngine));
         if (scheduler_state == core::scheduling::Scheduler::FAILURE)
         {
             LOG_INTERN(LogLevel::DebugCore) << std::endl
@@ -103,12 +130,17 @@ bool RunInstantiator::ExecuteRun()
     return (scheduler_state && observations_state);
 }
 
-bool RunInstantiator::InitPreRun(const ScenarioInterface& scenario, const SceneryInterface& scenery, const SimulationConfigInterface& simulationConfig)
+bool RunInstantiator::InitPreRun(const std::string &sceneryPath)
 {
     try
     {
-        InitializeFrameworkModules(scenario);
-        world.CreateScenery(&scenery, scenario.GetSceneryDynamics(), simulationConfig.GetEnvironmentConfig().turningRates);
+        ThrowIfFalse(eventDetectorNetwork.Instantiate(frameworkModules.eventDetectorLibrary, &eventNetwork, &stochastics),
+                     "Failed to instantiate EventDetectorNetwork");
+        ThrowIfFalse(manipulatorNetwork.Instantiate(frameworkModules.manipulatorLibrary, &eventNetwork),
+                     "Failed to instantiate ManipulatorNetwork");
+        ThrowIfFalse(observationNetwork.Instantiate(frameworkModules.observationLibraries, &stochastics, &world, &eventNetwork, sceneryPath, &dataBuffer),
+                     "Failed to instantiate ObservationNetwork");
+
         return true;
     }
     catch (const std::exception &error)
@@ -123,22 +155,6 @@ bool RunInstantiator::InitPreRun(const ScenarioInterface& scenario, const Scener
     return false;
 }
 
-void RunInstantiator::InitializeFrameworkModules(const ScenarioInterface& scenario)
-{
-    ThrowIfFalse(dataBuffer.Instantiate(),
-                 "Failed to instantiate DataBuffer");
-    ThrowIfFalse(stochastics.Instantiate(frameworkModules.stochasticsLibrary),
-                 "Failed to instantiate Stochastics");
-    ThrowIfFalse(world.Instantiate(),
-                 "Failed to instantiate World");
-    ThrowIfFalse(eventDetectorNetwork.Instantiate(frameworkModules.eventDetectorLibrary, &scenario, &eventNetwork, &stochastics),
-                 "Failed to instantiate EventDetectorNetwork");
-    ThrowIfFalse(manipulatorNetwork.Instantiate(frameworkModules.manipulatorLibrary, &scenario, &eventNetwork),
-                 "Failed to instantiate ManipulatorNetwork");
-    ThrowIfFalse(observationNetwork.Instantiate(frameworkModules.observationLibraries, &stochastics, &world, &eventNetwork, scenario.GetSceneryPath(), &dataBuffer),
-                 "Failed to instantiate ObservationNetwork");
-}
-
 void RunInstantiator::InitializeSpawnPointNetwork()
 {
     const auto &profileGroups = configurationContainer.GetProfiles()->GetProfileGroups();
@@ -146,14 +162,15 @@ void RunInstantiator::InitializeSpawnPointNetwork()
 
     ThrowIfFalse(spawnPointNetwork.Instantiate(frameworkModules.spawnPointLibraries,
                                                &agentFactory,
-                                               &agentBlueprintProvider,
                                                &stochastics,
-                                               configurationContainer.GetScenario(),
-                                               existingSpawnProfiles ? std::make_optional(profileGroups.at(SPAWNER)) : std::nullopt),
+                                               existingSpawnProfiles ? std::make_optional(profileGroups.at(SPAWNER)) : std::nullopt,
+                                               &configurationContainer,
+                                               environment,
+                                               vehicles),
                  "Failed to instantiate SpawnPointNetwork");
 }
 
-std::unique_ptr<ParameterInterface> RunInstantiator::SampleWorldParameters(const EnvironmentConfig& environmentConfig, const ProfileGroup& trafficRules, StochasticsInterface* stochastics, const openpass::common::RuntimeInformation& runtimeInformation)
+std::unique_ptr<ParameterInterface> RunInstantiator::SampleWorldParameters(const EnvironmentConfig &environmentConfig, const ProfileGroup &trafficRules, StochasticsInterface *stochastics, const openpass::common::RuntimeInformation &runtimeInformation)
 {
     auto trafficRule = helper::map::query(trafficRules, environmentConfig.trafficRules);
     ThrowIfFalse(trafficRule.has_value(), "No traffic rule set with name " + environmentConfig.trafficRules + " defined in ProfilesCatalog");
@@ -165,7 +182,7 @@ std::unique_ptr<ParameterInterface> RunInstantiator::SampleWorldParameters(const
 
     return openpass::parameter::make<SimulationCommon::Parameters>(runtimeInformation, parameters);
 }
-bool RunInstantiator::InitRun(std::uint32_t seed, const EnvironmentConfig &environmentConfig, const ProfilesInterface& profiles, RunResult &runResult)
+bool RunInstantiator::InitRun(std::uint32_t seed, const EnvironmentConfig &environmentConfig, const ProfilesInterface &profiles, RunResult &runResult)
 {
     try
     {
@@ -194,9 +211,15 @@ bool RunInstantiator::InitRun(std::uint32_t seed, const EnvironmentConfig &envir
     return false;
 }
 
+void RunInstantiator::ResetScenarioEngine()
+{
+    scenarioEngine = std::make_unique<OPENSCENARIO::OpenScenarioEngine>(configurationContainer.GetSimulationConfig()->GetScenarioConfig().scenarioPath, environment);
+    scenarioEngine->Init();
+}
+
 void RunInstantiator::ClearRun()
 {
-    world.Reset();
+    environment->Reset();
     agentFactory.Clear();
     spawnPointNetwork.Clear();
     eventNetwork.Clear();
diff --git a/sim/src/core/opSimulation/framework/runInstantiator.h b/sim/src/core/opSimulation/framework/runInstantiator.h
index 42614b650bc8846a42ae24383cc5174bdeb518b8..cea4abbad212455703a26ba9afd3882d7fdaf186 100644
--- a/sim/src/core/opSimulation/framework/runInstantiator.h
+++ b/sim/src/core/opSimulation/framework/runInstantiator.h
@@ -17,14 +17,16 @@
 
 #pragma once
 
-#include <QMutex>
-
-#include "common/opExport.h"
 #include <map>
 #include <string>
 
-#include "frameworkModules.h"
+#include <QMutex>
 
+#include "OpenScenarioEngine/OpenScenarioEngine.h"
+#include "agentBlueprintProvider.h"
+#include "common/opExport.h"
+#include "environment.h"
+#include "frameworkModules.h"
 #include "include/agentFactoryInterface.h"
 #include "include/configurationContainerInterface.h"
 #include "include/dataBufferInterface.h"
@@ -32,19 +34,19 @@
 #include "include/observationNetworkInterface.h"
 #include "include/parameterInterface.h"
 #include "include/stochasticsInterface.h"
+#include "vehicleModels.h"
 
 namespace core {
 
 class SIMULATIONCOREEXPORT RunInstantiator
 {
 public:
-    RunInstantiator(ConfigurationContainerInterface& configurationContainer,
-                    FrameworkModuleContainerInterface& frameworkModuleContainer,
-                    FrameworkModules& frameworkModules) :
+    RunInstantiator(ConfigurationContainerInterface &configurationContainer,
+                    FrameworkModuleContainerInterface &frameworkModuleContainer,
+                    FrameworkModules &frameworkModules) :
         configurationContainer(configurationContainer),
         observationNetwork(*frameworkModuleContainer.GetObservationNetwork()),
         agentFactory(*frameworkModuleContainer.GetAgentFactory()),
-        agentBlueprintProvider(*frameworkModuleContainer.GetAgentBlueprintProvider()),
         eventNetwork(*frameworkModuleContainer.GetEventNetwork()),
         world(*frameworkModuleContainer.GetWorld()),
         spawnPointNetwork(*frameworkModuleContainer.GetSpawnPointNetwork()),
@@ -52,8 +54,15 @@ public:
         eventDetectorNetwork(*frameworkModuleContainer.GetEventDetectorNetwork()),
         manipulatorNetwork(*frameworkModuleContainer.GetManipulatorNetwork()),
         dataBuffer(*frameworkModuleContainer.GetDataBuffer()),
-        frameworkModules{frameworkModules}
-    {}
+        frameworkModules(frameworkModules),
+        environment(std::make_shared<Environment>(configurationContainer.GetRuntimeInformation().directories.configuration,
+                                                  agentBlueprintProvider,
+                                                  &agentFactory,
+                                                  &stochastics,
+                                                  configurationContainer.GetSimulationConfig()->GetEnvironmentConfig().turningRates)),
+        scenarioEngine(std::make_unique<OPENSCENARIO::OpenScenarioEngine>(configurationContainer.GetSimulationConfig()->GetScenarioConfig().scenarioPath, environment))
+    {
+    }
 
     //-----------------------------------------------------------------------------
     //! @brief Executes the run by preparing the stochastics, world and observation
@@ -86,31 +95,38 @@ public:
     //void StopRun();
 
 private:
-    bool InitPreRun(const ScenarioInterface& scenario, const SceneryInterface& scenery, const SimulationConfigInterface& simulationConfig);
-    bool InitRun(std::uint32_t seed, const EnvironmentConfig& environmentConfig, const ProfilesInterface &profiles, RunResult& runResult);
-    void InitializeFrameworkModules(const ScenarioInterface &scenario);
+    bool InitPreRun(const std::string &sceneryPath);
+    void ResetScenarioEngine();
+    bool InitRun(std::uint32_t seed, const EnvironmentConfig &environmentConfig, const ProfilesInterface &profiles, RunResult &runResult);
     void InitializeSpawnPointNetwork();
-    std::unique_ptr<ParameterInterface> SampleWorldParameters(const EnvironmentConfig& environmentConfig, const ProfileGroup& trafficRules, StochasticsInterface* stochastics, const openpass::common::RuntimeInformation& runtimeInformation);
+    std::unique_ptr<ParameterInterface> SampleWorldParameters(const EnvironmentConfig &environmentConfig, const ProfileGroup &trafficRules, StochasticsInterface *stochastics, const openpass::common::RuntimeInformation &runtimeInformation);
 
     void ClearRun();
 
     QMutex stopMutex;
     bool stopped = true;
 
-    ConfigurationContainerInterface& configurationContainer;
-    ObservationNetworkInterface& observationNetwork;
-    AgentFactoryInterface& agentFactory;
-    const AgentBlueprintProviderInterface& agentBlueprintProvider;
-    EventNetworkInterface& eventNetwork;
-    WorldInterface& world;
-    SpawnPointNetworkInterface& spawnPointNetwork;
-    StochasticsInterface& stochastics;
-    EventDetectorNetworkInterface& eventDetectorNetwork;
-    ManipulatorNetworkInterface& manipulatorNetwork;
-    DataBufferInterface& dataBuffer;
-    FrameworkModules& frameworkModules;
+    ConfigurationContainerInterface &configurationContainer;
+    ObservationNetworkInterface &observationNetwork;
+    AgentFactoryInterface &agentFactory;
+    EventNetworkInterface &eventNetwork;
+
+    SpawnPointNetworkInterface &spawnPointNetwork;
+    StochasticsInterface &stochastics;
+    EventDetectorNetworkInterface &eventDetectorNetwork;
+    WorldInterface &world;
+    ManipulatorNetworkInterface &manipulatorNetwork;
+    DataBufferInterface &dataBuffer;
+    FrameworkModules &frameworkModules;
+
+    AgentBlueprintProvider agentBlueprintProvider;
 
     std::unique_ptr<ParameterInterface> worldParameter;
+
+    std::shared_ptr<Environment> environment{nullptr};
+
+    std::unique_ptr<mantle_api::IScenarioEngine> scenarioEngine;
+    std::shared_ptr<Vehicles> vehicles{};
 };
 
 } // namespace core
diff --git a/sim/src/core/opSimulation/framework/scheduler/scheduler.cpp b/sim/src/core/opSimulation/framework/scheduler/scheduler.cpp
index 0520c125b431f2f82c52ffbaca13b7a06724c718..a77d27324ab8f48755119da98ce04a0d4cdaa77d 100644
--- a/sim/src/core/opSimulation/framework/scheduler/scheduler.cpp
+++ b/sim/src/core/opSimulation/framework/scheduler/scheduler.cpp
@@ -27,22 +27,25 @@ Scheduler::Scheduler(WorldInterface &world,
                      EventDetectorNetworkInterface &eventDetectorNetwork,
                      ManipulatorNetworkInterface &manipulatorNetwork,
                      ObservationNetworkInterface &observationNetwork,
-                     DataBufferInterface &dataInterface) :
+                     DataBufferInterface &dataInterface,
+                     EnvironmentInterface &environment) :
     world(world),
     spawnPointNetwork(spawnPointNetwork),
     eventDetectorNetwork(eventDetectorNetwork),
     manipulatorNetwork(manipulatorNetwork),
     observationNetwork(observationNetwork),
-    dataInterface(dataInterface)
+    dataInterface(dataInterface),
+    environment(environment)
 {
 }
 
 bool Scheduler::Run(
     int startTime,
-    int endTime,
     RunResult &runResult,
-    EventNetworkInterface &eventNetwork)
+    EventNetworkInterface &eventNetwork,
+    std::unique_ptr<mantle_api::IScenarioEngine> scenarioEngine)
 {
+    auto endTime = units::unit_cast<int>(scenarioEngine->GetScenarioInfo().scenario_timeout_duration);
     if (startTime > endTime)
     {
         LOG_INTERN(LogLevel::Error) << "start time greater than end time";
@@ -59,7 +62,8 @@ bool Scheduler::Run(
                             &observationNetwork,
                             &eventDetectorNetwork,
                             &manipulatorNetwork,
-                            &dataInterface);
+                            &dataInterface,
+                            &environment);
 
     auto bootstrapTasks = taskBuilder.CreateBootstrapTasks();
     auto spawningTasks = taskBuilder.CreateSpawningTasks();
@@ -75,13 +79,19 @@ bool Scheduler::Run(
         finalizeTasks,
         FRAMEWORK_UPDATE_RATE);
 
+    // TODO CK Add ScenarioEngine->Step() to tasks
+    scenarioEngine->Step();
+
     if (ExecuteTasks(taskList.GetBootstrapTasks()) == false)
     {
         return Scheduler::FAILURE;
     }
 
-    while (currentTime <= endTime)
+    while (currentTime <= endTime && !scenarioEngine->IsFinished())
     {
+        // TODO CK Add ScenarioEngine->Step() to tasks
+        scenarioEngine->Step();
+
         if (!ExecuteTasks(taskList.GetSpawningTasks(currentTime)))
         {
             return Scheduler::FAILURE;
@@ -132,7 +142,7 @@ bool Scheduler::ExecuteTasks(T tasks)
 
 void Scheduler::UpdateAgents(SchedulerTasks &taskList, WorldInterface &world)
 {
-    for (const auto &agent : spawnPointNetwork.ConsumeNewAgents())
+    for (const auto &agent : environment.GetEntityRepository().ConsumeNewAgents())
     {
         agent->LinkSchedulerTime(&currentTime);
         ScheduleAgentTasks(taskList, *agent);
diff --git a/sim/src/core/opSimulation/framework/scheduler/scheduler.h b/sim/src/core/opSimulation/framework/scheduler/scheduler.h
index 6f803ec7374ee1a5aa328da025829abb2338e00c..0bb6f4ef1b610f05dc02c1600d3361e02b85f753 100644
--- a/sim/src/core/opSimulation/framework/scheduler/scheduler.h
+++ b/sim/src/core/opSimulation/framework/scheduler/scheduler.h
@@ -11,11 +11,13 @@
 
 #pragma once
 
+#include <chrono>
 #include <functional>
 #include <memory>
 
 #include "include/worldInterface.h"
 #include "schedulerTasks.h"
+#include "MantleAPI/Execution/i_scenario_engine.h"
 
 class DataBufferInterface;
 
@@ -28,6 +30,7 @@ class ManipulatorNetworkInterface;
 class ObservationNetworkInterface;
 class SchedulePolicy;
 class SpawnPointNetworkInterface;
+class EnvironmentInterface;
 
 namespace scheduling {
 
@@ -52,7 +55,8 @@ public:
               core::EventDetectorNetworkInterface &eventDetectorNetwork,
               core::ManipulatorNetworkInterface &manipulatorNetwork,
               core::ObservationNetworkInterface &observationNetwork,
-              DataBufferInterface& dataInterface);
+              DataBufferInterface &dataInterface,
+              EnvironmentInterface &environment);
 
     /*!
     * \brief Run
@@ -60,15 +64,15 @@ public:
     * \details execute all tasks for one simulation run
     *
     * @param[in]     startTime              simulation start
-    * @param[in]     endTime                simulation end
     * @param[out]    runResult              RunResult
     * @param[in,out] EventNetwork           EventNetwork
+    * @param[in]     ScenarioEngine         ScenarioEngine
     * @returns true if simulation ends withuot error
     */
     bool Run(int startTime,
-             int endTime,
              RunResult &runResult,
-             EventNetworkInterface &eventNetwork);
+             EventNetworkInterface &eventNetwork,
+             std::unique_ptr<mantle_api::IScenarioEngine> scenarioEngine);
 
     /*!
     * \brief ScheduleAgentTasks
@@ -87,7 +91,8 @@ private:
     EventDetectorNetworkInterface &eventDetectorNetwork;
     ManipulatorNetworkInterface &manipulatorNetwork;
     ObservationNetworkInterface &observationNetwork;
-    DataBufferInterface& dataInterface;
+    DataBufferInterface &dataInterface;
+    EnvironmentInterface &environment;
 
     int currentTime;
 
diff --git a/sim/src/core/opSimulation/framework/scheduler/taskBuilder.cpp b/sim/src/core/opSimulation/framework/scheduler/taskBuilder.cpp
index f40224c498f73f49b013cc3b92749b39a8a1c0b3..41476fb41570847073864d750ab8201a0d21cc08 100644
--- a/sim/src/core/opSimulation/framework/scheduler/taskBuilder.cpp
+++ b/sim/src/core/opSimulation/framework/scheduler/taskBuilder.cpp
@@ -30,7 +30,8 @@ TaskBuilder::TaskBuilder(const int &currentTime,
                          ObservationNetworkInterface *const observationNetwork,
                          EventDetectorNetworkInterface *const eventDetectorNetwork,
                          ManipulatorNetworkInterface *const manipulatorNetwork,
-                         DataBufferInterface * const dataInterface) :
+                         DataBufferInterface * const dataInterface,
+                         EnvironmentInterface* environment) :
     currentTime{currentTime},
     runResult{runResult},
     frameworkUpdateRate{frameworkUpdateRate},
@@ -39,7 +40,8 @@ TaskBuilder::TaskBuilder(const int &currentTime,
     observationNetwork{observationNetwork},
     eventDetectorNetwork{eventDetectorNetwork},
     manipulatorNetwork{manipulatorNetwork},
-    dataInterface{dataInterface}
+    dataInterface{dataInterface},
+    environment{environment}
 {
     BuildEventDetectorTasks();
     BuildManipulatorTasks();
@@ -56,6 +58,7 @@ std::vector<TaskItem> TaskBuilder::CreateSpawningTasks()
 {
     return {
         SpawningTaskItem(frameworkUpdateRate, [&] { return spawnPointNetwork->TriggerRuntimeSpawnPoints(currentTime); }),
+        SpawningTaskItem(frameworkUpdateRate, [&] { return environment->GetEntityRepository().SpawnReadyAgents(); }),
         SyncWorldTaskItem(ScheduleAtEachCycle, [&] { dataInterface->ClearTimeStep(); })};
 }
 
diff --git a/sim/src/core/opSimulation/framework/scheduler/taskBuilder.h b/sim/src/core/opSimulation/framework/scheduler/taskBuilder.h
index 02a09377d86799d19aedb70860279869d71209c5..bd68b2897cd843184287ed677756a2669ac99501 100644
--- a/sim/src/core/opSimulation/framework/scheduler/taskBuilder.h
+++ b/sim/src/core/opSimulation/framework/scheduler/taskBuilder.h
@@ -20,12 +20,13 @@
 #include <list>
 #include <vector>
 
-#include "include/spawnPointNetworkInterface.h"
-#include "include/worldInterface.h"
 #include "include/dataBufferInterface.h"
+#include "include/environmentInterface.h"
 #include "include/eventDetectorNetworkInterface.h"
 #include "include/manipulatorNetworkInterface.h"
 #include "include/observationNetworkInterface.h"
+#include "include/spawnPointNetworkInterface.h"
+#include "include/worldInterface.h"
 #include "runResult.h"
 #include "tasks.h"
 
@@ -68,6 +69,7 @@ private:
     core::EventDetectorNetworkInterface *const eventDetectorNetwork;
     core::ManipulatorNetworkInterface *const manipulatorNetwork;
     DataBufferInterface *const dataInterface;
+    EnvironmentInterface *environment;
 
     std::vector<TaskItem> eventDetectorTasks;
     std::vector<TaskItem> manipulatorTasks;
@@ -98,7 +100,8 @@ public:
                 core::ObservationNetworkInterface *const observationNetwork,
                 core::EventDetectorNetworkInterface *const eventDetectorNetwork,
                 core::ManipulatorNetworkInterface *const manipulatorNetwork,
-                DataBufferInterface *const dataInterface);
+                DataBufferInterface *const dataInterface,
+                EnvironmentInterface *environment);
 
     virtual ~TaskBuilder() = default;
     /*!
@@ -144,4 +147,4 @@ public:
     std::vector<TaskItem> CreateFinalizeTasks() override;
 };
 
-} // namespace openpass::scheduling
+} // namespace core::scheduling
diff --git a/sim/src/core/opSimulation/framework/vehicle.cpp b/sim/src/core/opSimulation/framework/vehicle.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d65f02de0c4bf87b230b7943a485df7351f65056
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/vehicle.cpp
@@ -0,0 +1,32 @@
+#include "vehicle.h"
+#include "agent.h"
+
+namespace core {
+Vehicle::Vehicle(mantle_api::UniqueId id,
+                 const std::string &name,
+                 std::shared_ptr<mantle_api::VehicleProperties> properties,
+                 const RouteSamplerInterface *routeSampler) :
+    Entity(id, name, routeSampler, properties, properties->is_host ? AgentCategory::Ego : AgentCategory::Scenario),
+    properties(properties)
+{
+}
+
+void Vehicle::SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties)
+{
+
+}
+
+mantle_api::VehicleProperties *Vehicle::GetProperties() const
+{
+    return properties.get();
+}
+
+void Vehicle::SetIndicatorState(mantle_api::IndicatorState state)
+{
+
+}
+
+mantle_api::IndicatorState Vehicle::GetIndicatorState() const
+{
+}
+} // namespace core
diff --git a/sim/src/core/opSimulation/framework/vehicle.h b/sim/src/core/opSimulation/framework/vehicle.h
new file mode 100644
index 0000000000000000000000000000000000000000..f5b53a04cd9c7b73e901fa611502f11688292b08
--- /dev/null
+++ b/sim/src/core/opSimulation/framework/vehicle.h
@@ -0,0 +1,38 @@
+/*******************************************************************************
+* Copyright (c) 2021 in-tech GmbH
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+#pragma once
+
+#include "MantleAPI/Traffic/i_entity.h"
+#include "entity.h"
+#include "include/agentBlueprintInterface.h"
+#include "include/agentFactoryInterface.h"
+#include "include/agentInterface.h"
+#include "routeSampler.h"
+
+namespace core {
+class Vehicle : public Entity, public mantle_api::IVehicle
+{
+public:
+    Vehicle(mantle_api::UniqueId id,
+            const std::string &name,
+            std::shared_ptr<mantle_api::VehicleProperties> properties,
+            const RouteSamplerInterface *routeSampler);
+
+    virtual void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override;
+    virtual mantle_api::VehicleProperties* GetProperties() const override;
+
+    virtual void SetIndicatorState(mantle_api::IndicatorState state) override;
+    virtual mantle_api::IndicatorState GetIndicatorState() const override;
+
+private:
+    std::shared_ptr<mantle_api::VehicleProperties> properties;
+};
+} // namespace core
diff --git a/sim/tests/fakes/gmock/fakeSceneryDynamics.h b/sim/src/core/opSimulation/importer/entityPropertiesImporter.cpp
similarity index 55%
rename from sim/tests/fakes/gmock/fakeSceneryDynamics.h
rename to sim/src/core/opSimulation/importer/entityPropertiesImporter.cpp
index 728a5ea51711fa7b66967d62a7b2d515d459ca9f..9ee2608dfcd3e09935f19c7c418919784726603f 100644
--- a/sim/tests/fakes/gmock/fakeSceneryDynamics.h
+++ b/sim/src/core/opSimulation/importer/entityPropertiesImporter.cpp
@@ -8,14 +8,6 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-#pragma once
+namespace Importer {
 
-#include "gmock/gmock.h"
-#include "include/sceneryDynamicsInterface.h"
-
-class FakeSceneryDynamics : public SceneryDynamicsInterface
-{
-public:
-    MOCK_CONST_METHOD0(GetEnvironment, openScenario::EnvironmentAction ());
-    MOCK_CONST_METHOD0(GetTrafficSignalControllers, std::vector<openScenario::TrafficSignalController> ());
-};
+} //namespace Importer
diff --git a/sim/src/core/opSimulation/importer/entityPropertiesImporter.h b/sim/src/core/opSimulation/importer/entityPropertiesImporter.h
new file mode 100644
index 0000000000000000000000000000000000000000..1d3865c8c741627e8d9069ff859ed5cfb978e536
--- /dev/null
+++ b/sim/src/core/opSimulation/importer/entityPropertiesImporter.h
@@ -0,0 +1,162 @@
+/********************************************************************************
+ * Copyright (c) 2021 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+#pragma once
+
+#include <openScenarioLib/generated/v1_1/api/ApiClassInterfacesV1_1.h>
+#include <openScenarioLib/src/common/SimpleMessageLogger.h>
+#include <openScenarioLib/src/loader/FileResourceLocator.h>
+#include <openScenarioLib/src/v1_1/loader/XmlScenarioLoaderFactoryV1_1.h>
+
+#include "MantleAPI/Traffic/entity_properties.h"
+
+using Vehicles = std::map<std::string, std::shared_ptr<const mantle_api::VehicleProperties>>;
+
+namespace Importer {
+
+std::map<NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::VehicleCategoryEnum, mantle_api::VehicleClass> map_vehicle_class{
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::UNKNOWN, mantle_api::VehicleClass::kOther},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::BICYCLE, mantle_api::VehicleClass::kBicycle},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::BUS, mantle_api::VehicleClass::kBus},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::CAR, mantle_api::VehicleClass::kMedium_car},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::MOTORBIKE, mantle_api::VehicleClass::kMotorbike},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::SEMITRAILER, mantle_api::VehicleClass::kSemitrailer},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::TRAILER, mantle_api::VehicleClass::kTrailer},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::TRAIN, mantle_api::VehicleClass::kTrain},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::TRAM, mantle_api::VehicleClass::kTram},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::TRUCK, mantle_api::VehicleClass::kHeavy_truck},
+    {NET_ASAM_OPENSCENARIO::v1_1::VehicleCategory::VAN, mantle_api::VehicleClass::kDelivery_van}};
+
+class EntityPropertiesImporter
+{
+public:
+    bool Import(const std::string &filepath)
+    {
+        auto messageLogger =
+            std::make_shared<NET_ASAM_OPENSCENARIO::SimpleMessageLogger>(NET_ASAM_OPENSCENARIO::ErrorLevel::INFO);
+        auto loaderFactory = NET_ASAM_OPENSCENARIO::v1_1::XmlScenarioLoaderFactory(filepath);
+        auto loader = loaderFactory.CreateLoader(std::make_shared<NET_ASAM_OPENSCENARIO::FileResourceLocator>());
+
+        auto scenarioPointer = std::static_pointer_cast<NET_ASAM_OPENSCENARIO::v1_1::IOpenScenario>(
+            loader->Load(messageLogger)->GetAdapter(typeid(NET_ASAM_OPENSCENARIO::v1_1::IOpenScenario).name()));
+
+        if (!(scenarioPointer && scenarioPointer->GetOpenScenarioCategory() && scenarioPointer->GetOpenScenarioCategory()->GetCatalogDefinition()))
+        {
+            throw std::runtime_error("Scenario file not found or file does not contain scenario definition.");
+        }
+
+        // TODO Verify all GetMethods to return != nullptr
+        auto vehicleCatalog = scenarioPointer->GetOpenScenarioCategory()->GetCatalogDefinition()->GetCatalog();
+        if (!vehicleCatalog)
+        {
+            throw std::runtime_error("VehiclesCatalog does not exist.");
+        }
+        const auto &vehicles = vehicleCatalog->GetVehicles();
+
+        for (const auto &vehicle : vehicles)
+        {
+            const auto& name{vehicle->GetName()};
+
+            mantle_api::VehicleProperties properties;
+            properties.type = mantle_api::EntityType::kVehicle;
+            properties.mass = units::mass::kilogram_t(vehicle->GetMass());
+
+            // TODO CK Use openScenarioEngine Methods of the EntityCreator or create separate method
+            const auto& vehicle_category = vehicle->GetVehicleCategory();
+            if (map_vehicle_class.find(vehicle_category.GetFromLiteral(vehicle_category.GetLiteral())) != map_vehicle_class.end())
+            {
+                properties.classification = map_vehicle_class[vehicle_category.GetFromLiteral(vehicle_category.GetLiteral())];
+            }
+            else
+            {
+                throw std::runtime_error(std::string("No vehicle class for vehicle category " + vehicle_category.GetLiteral()));
+            }
+
+            // TODO: set "model" property once "model3d" attribute is available in OSC 1.1
+
+            const auto& bounding_box = vehicle->GetBoundingBox();
+            if (!bounding_box)
+            {
+                throw std::runtime_error(std::string("Entity " + name + " without bounding box."));
+            }
+            const auto& dimensions = bounding_box->GetDimensions();
+            if (!dimensions)
+            {
+                throw std::runtime_error(std::string("Bounding box of entity " + name + " without Dimensions."));
+            }
+
+            properties.bounding_box.dimension.length = units::length::meter_t(dimensions->GetLength());
+            properties.bounding_box.dimension.width = units::length::meter_t(dimensions->GetWidth());
+            properties.bounding_box.dimension.height = units::length::meter_t(dimensions->GetHeight());
+
+            const auto& center = bounding_box->GetCenter();
+            if (!center)
+            {
+                throw std::runtime_error(std::string("Bounding box of entity " + name + " without Center."));
+            }
+
+            properties.bounding_box.geometric_center.x = units::length::meter_t(center->GetX());
+            properties.bounding_box.geometric_center.y = units::length::meter_t(center->GetY());
+            properties.bounding_box.geometric_center.z = units::length::meter_t(center->GetZ());
+
+            for (const auto &property : vehicle->GetProperties()->GetProperties())
+            {
+                properties.properties.emplace(property->GetName(), property->GetValue());
+            }
+
+            properties.performance.max_acceleration =
+                units::acceleration::meters_per_second_squared_t(vehicle->GetPerformance()->GetMaxAcceleration());
+            properties.performance.max_deceleration =
+                units::acceleration::meters_per_second_squared_t(vehicle->GetPerformance()->GetMaxDeceleration());
+            properties.performance.max_speed = units::velocity::meters_per_second_t(vehicle->GetPerformance()->GetMaxSpeed());
+
+            const auto& openScenarioFrontAxle = vehicle->GetAxles()->GetFrontAxle();
+            if (openScenarioFrontAxle == nullptr)
+            {
+                throw std::runtime_error(std::string("Entity " + name + " is missing axle information."));
+            }
+
+            properties.front_axle.bb_center_to_axle_center = {units::length::meter_t(openScenarioFrontAxle->GetPositionX()),
+                                                              0.0_m,
+                                                              units::length::meter_t(openScenarioFrontAxle->GetPositionZ())};
+            properties.front_axle.max_steering = units::angle::radian_t(openScenarioFrontAxle->GetMaxSteering());
+            properties.front_axle.track_width = units::length::meter_t(openScenarioFrontAxle->GetTrackWidth());
+            properties.front_axle.wheel_diameter = units::length::meter_t(openScenarioFrontAxle->GetWheelDiameter());
+
+            const auto& openScenarioRearAxle = vehicle->GetAxles()->GetRearAxle();
+            if (openScenarioRearAxle == nullptr)
+            {
+                throw std::runtime_error(std::string("Entity " + name + " is missing axle information."));
+            }
+
+            properties.rear_axle.bb_center_to_axle_center = {units::length::meter_t(openScenarioRearAxle->GetPositionX()),
+                                                             0.0_m,
+                                                             units::length::meter_t(openScenarioRearAxle->GetPositionZ())};
+            properties.rear_axle.max_steering = units::angle::radian_t(openScenarioRearAxle->GetMaxSteering());
+            properties.rear_axle.track_width = units::length::meter_t(openScenarioRearAxle->GetTrackWidth());
+            properties.rear_axle.wheel_diameter = units::length::meter_t(openScenarioRearAxle->GetWheelDiameter());
+
+            vehicleProperties->insert({name, std::make_shared<const mantle_api::VehicleProperties>(properties)});
+        }
+
+        return true;
+    }
+
+    std::shared_ptr<Vehicles> GetVehicleProperties()
+    {
+        return vehicleProperties;
+    }
+
+private:
+    std::shared_ptr<Vehicles> vehicleProperties{std::make_shared<Vehicles>()};
+};
+
+} // namespace Importer
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/importer/eventDetectorImporter.cpp b/sim/src/core/opSimulation/importer/eventDetectorImporter.cpp
deleted file mode 100644
index 78469381cddd83782862527c861f6f639e375e00..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/eventDetectorImporter.cpp
+++ /dev/null
@@ -1,215 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "eventDetectorImporter.h"
-#include "scenarioImporterHelper.h"
-#include "importer/importerCommon.h"
-
-namespace TAG = openpass::importer::xml::eventDetectorImporter::tag;
-namespace ATTRIBUTE = openpass::importer::xml::eventDetectorImporter::attribute;
-
-namespace Importer
-{
-openScenario::ConditionalEventDetectorInformation EventDetectorImporter::ImportEventDetector(QDomElement &eventElement,
-                                                                                             const std::string &eventName,
-                                                                                             const int numberOfExecutions,
-                                                                                             const openScenario::ActorInformation &actorInformation,
-                                                                                             const std::vector<ScenarioEntity> &entities,
-                                                                                             openScenario::Parameters& parameters)
-{
-    QDomElement startConditionsElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(eventElement, TAG::startTrigger, startConditionsElement),
-                 eventElement, "Tag " + std::string(TAG::startTrigger) + " missing.");
-
-    QDomElement conditionGroupElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(startConditionsElement, TAG::conditionGroup, conditionGroupElement),
-                 startConditionsElement, "Tag " + std::string(TAG::conditionGroup) + " missing.");
-
-    QDomElement conditionElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(conditionGroupElement, TAG::condition, conditionElement),
-                 conditionGroupElement, "Tag " + std::string(TAG::condition) + " missing.");
-
-    openScenario::ConditionGroup conditions{};
-
-    while (!conditionElement.isNull())
-    {
-        conditions.emplace_back(ImportConditionElement(conditionElement, entities, parameters));
-        conditionElement = conditionElement.nextSiblingElement(TAG::condition);
-    }
-
-    return openScenario::ConditionalEventDetectorInformation{actorInformation,
-                                                             numberOfExecutions,
-                                                             eventName,
-                                                             conditions};
-}
-
-    openScenario::Condition EventDetectorImporter::ImportConditionElement(QDomElement& conditionElement,
-                                                                          const std::vector<ScenarioEntity>& entities,
-                                                                          openScenario::Parameters& parameters)
-    {
-        QDomElement byEntityElement;
-
-        //Parse specific entity
-        if (SimulationCommon::GetFirstChildElement(conditionElement, TAG::byEntityCondition, byEntityElement))
-        {
-            return ImportByEntityElement(byEntityElement, entities, parameters);
-        }
-
-        QDomElement byValueElement;
-        if (SimulationCommon::GetFirstChildElement(conditionElement, TAG::byValueCondition, byValueElement))
-        {
-            return ImportConditionByValueElement(byValueElement, parameters);
-        }
-
-        LogErrorAndThrow("No valid Condition found.");
-    }
-
-    openScenario::Condition EventDetectorImporter::ImportByEntityElement(QDomElement byEntityConditionElement,
-                                                                         const std::vector<ScenarioEntity>& entities,
-                                                                         openScenario::Parameters& parameters)
-    {
-        std::vector<std::string> triggeringEntities;
-
-        QDomElement triggeringEntitiesElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(byEntityConditionElement, TAG::triggeringEntities, triggeringEntitiesElement),
-                     byEntityConditionElement, "Tag " + std::string(TAG::triggeringEntities) + " is missing.");
-
-        QDomElement entityElement;
-        SimulationCommon::GetFirstChildElement(triggeringEntitiesElement, TAG::entityRef, entityElement);
-
-        while (!entityElement.isNull())
-        {
-            std::string entityName = ParseAttribute<std::string>(entityElement, ATTRIBUTE::entityRef, parameters);
-
-            ThrowIfFalse(ContainsEntity(entities, entityName),
-                         entityElement, "TriggeringEntity '" + entityName + "' not declared in 'Entities'");
-
-            triggeringEntities.push_back(entityName);
-            entityElement = entityElement.nextSiblingElement(TAG::entityRef);
-        }
-
-
-        QDomElement entityConditionElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(byEntityConditionElement, TAG::entityCondition, entityConditionElement),
-                     byEntityConditionElement, "Tag " + std::string(TAG::entityCondition) + " is missing.");
-
-        QDomElement reachPositionElement;
-        if (SimulationCommon::GetFirstChildElement(entityConditionElement, TAG::reachPositionCondition, reachPositionElement))
-        {
-            double tolerance = ParseAttribute<double>(reachPositionElement, ATTRIBUTE::tolerance, parameters);
-
-            const auto position = openScenario::ScenarioImporterHelper::ImportPosition(reachPositionElement, parameters);
-
-            auto condition = openScenario::ReachPositionCondition(triggeringEntities,
-                                                                  tolerance,
-                                                                  position);
-
-            return condition;
-        }
-
-        QDomElement relativeSpeedElement;
-        if (SimulationCommon::GetFirstChildElement(entityConditionElement, TAG::relativeSpeedCondition, relativeSpeedElement))
-        {
-            std::string referenceEntityName = ParseAttribute<std::string>(relativeSpeedElement, ATTRIBUTE::entityRef, parameters);
-
-            double value = ParseAttribute<double>(relativeSpeedElement, ATTRIBUTE::value, parameters);
-
-            std::string ruleString = ParseAttribute<std::string>(relativeSpeedElement, ATTRIBUTE::rule, parameters);
-
-            auto condition = openScenario::RelativeSpeedCondition(triggeringEntities,
-                                                                  referenceEntityName,
-                                                                  value,
-                                                                  ruleConversionMap.at(ruleString));
-            return condition;
-        }
-
-        QDomElement timeToCollisionElement;
-        if (SimulationCommon::GetFirstChildElement(entityConditionElement, TAG::timeToCollisionCondition, timeToCollisionElement))
-        {
-            double targetTTC = ParseAttribute<double>(timeToCollisionElement, ATTRIBUTE::value, parameters);
-
-            std::string ruleString = ParseAttribute<std::string>(timeToCollisionElement, ATTRIBUTE::rule, parameters);
-
-            QDomElement targetElement;
-            ThrowIfFalse(SimulationCommon::GetFirstChildElement(timeToCollisionElement, TAG::timeToCollisionConditionTarget, targetElement),
-                         timeToCollisionElement, "Tag " + std::string(TAG::timeToCollisionConditionTarget) + " is missing.");
-
-            QDomElement entityElement;
-            ThrowIfFalse(SimulationCommon::GetFirstChildElement(targetElement, TAG::entityRef, entityElement),
-                         targetElement, "Tag " + std::string(TAG::entityRef) + " is missing.");
-
-            std::string targetEntityName = ParseAttribute<std::string>(entityElement, ATTRIBUTE::entityRef, parameters);
-
-            auto condition = openScenario::TimeToCollisionCondition(triggeringEntities,
-                                                                    targetEntityName,
-                                                                    targetTTC,
-                                                                    ruleConversionMap.at(ruleString));
-
-            return condition;
-        }
-
-        QDomElement timeHeadwayElement;
-        if (SimulationCommon::GetFirstChildElement(entityConditionElement, TAG::timeHeadwayCondition, timeHeadwayElement))
-        {
-            std::string targetEntityName = ParseAttribute<std::string>(timeHeadwayElement, ATTRIBUTE::entityRef, parameters);
-
-            double targetTHW = ParseAttribute<double>(timeHeadwayElement, ATTRIBUTE::value, parameters);
-
-            bool freeSpace = ParseAttribute<bool>(timeHeadwayElement, ATTRIBUTE::freespace, parameters);
-
-            std::string ruleString = ParseAttribute<std::string>(timeHeadwayElement, ATTRIBUTE::rule, parameters);
-
-            bool alongRoute = ParseAttribute<bool>(timeHeadwayElement, ATTRIBUTE::alongRoute, parameters);
-            ThrowIfFalse(alongRoute, timeHeadwayElement, "Attribute alongRoute=\"false\" in TimeHeadway condition is currently not supported.");
-
-            auto condition = openScenario::TimeHeadwayCondition(triggeringEntities,
-                                                                targetEntityName,
-                                                                targetTHW,
-                                                                freeSpace,
-                                                                ruleConversionMap.at(ruleString));
-
-            return condition;
-        }
-
-        // if no element was parsed successfully
-        LogErrorAndThrow("No valid ByEntity Condition found.");
-    }
-
-    openScenario::Condition EventDetectorImporter::ImportConditionByValueElement(QDomElement& byValueElement, openScenario::Parameters& parameters)
-    {
-        QDomElement simulationTimeElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(byValueElement, TAG::simulationTimeCondition, simulationTimeElement),
-                     byValueElement, "Tag " + std::string(TAG::simulationTimeCondition) + " is missing.");
-
-        double value = ParseAttribute<double>(simulationTimeElement, ATTRIBUTE::value, parameters);
-
-        std::string ruleString = ParseAttribute<std::string>(simulationTimeElement, ATTRIBUTE::rule, parameters);
-
-        openScenario::Rule rule = ruleConversionMap.at(ruleString);
-
-        // this return must occur across two lines to appropriately construct the std::variant
-        openScenario::SimulationTimeCondition condition = openScenario::SimulationTimeCondition(rule,
-                                                                                                value);
-        return condition;
-    }
-
-    bool EventDetectorImporter::ContainsEntity(const std::vector<ScenarioEntity>& entities,
-                                               const std::string& entityName)
-    {
-        auto entitiesFound = std::find_if(entities.cbegin(),
-                                          entities.cend(),
-                                          [entityName](const ScenarioEntity& elem)
-        {
-            return elem.name == entityName;
-        });
-
-        return entitiesFound != entities.cend();
-    }
-} // Importer
diff --git a/sim/src/core/opSimulation/importer/eventDetectorImporter.h b/sim/src/core/opSimulation/importer/eventDetectorImporter.h
deleted file mode 100644
index 950e91d29a075bf45fa35a7a1c3f9742ee522011..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/eventDetectorImporter.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include <QDomDocument>
-#include "include/scenarioInterface.h"
-#include "common/eventDetectorDefinitions.h"
-#include "importerLoggingHelper.h"
-#include "oscImporterCommon.h"
-
-namespace RULE = openpass::importer::xml::openScenario::rule;
-
-namespace Importer
-{
-
-const std::map<std::string, openScenario::Rule> ruleConversionMap = {{RULE::greaterThan, openScenario::Rule::GreaterThan},
-                                                                     {RULE::lessThan, openScenario::Rule::LessThan},
-                                                                     {RULE::equalTo, openScenario::Rule::EqualTo}};
-
-class EventDetectorImporter
-{
-public:
-    EventDetectorImporter() = default;
-    EventDetectorImporter(const EventDetectorImporter&) = delete;
-    EventDetectorImporter(EventDetectorImporter&&) = delete;
-    EventDetectorImporter& operator=(const EventDetectorImporter&) = delete;
-    EventDetectorImporter& operator=(EventDetectorImporter&&) = delete;
-    virtual ~EventDetectorImporter() = default;
-
-    /*!
-     * ------------------------------------------------------------------------
-     * \brief ImportEventDetector parses information from an EventElement for
-     *        instantiation of a ConditionalEventDetector.
-     *
-     * \param[in] eventElement       the element from which to parse
-     *                               ConditionalEventDetector instantiation
-     *                               information
-     * \param[in] eventName          Name of the event used for identification
-     *                               e.g. "MyStory/MyAct/MySequence/MyManeuver/MyEvent"
-     * \param[in] numberOfExecutions the maximum number of times the
-     *                               ConditionalEventDetector is to emit an
-     *                               event
-     * \param[in] actorInformation   information detailing what entities are the
-     *                               actors to be targeted by the
-     *                               ConditionalEventDetector's emitted events
-     * \param[in] entities           entities defined in openScenario Entities
-     *
-     * \return a struct containing all information relevant for the
-     *         instantiation of a ConditionalEventDetector
-     * ------------------------------------------------------------------------
-     */
-    static openScenario::ConditionalEventDetectorInformation ImportEventDetector(QDomElement &eventElement,
-                                                                                 const std::string &eventName,
-                                                                                 const int numberOfExecutions,
-                                                                                 const openScenario::ActorInformation &actorInformation,
-                                                                                 const std::vector<ScenarioEntity>& entities,
-                                                                                 openScenario::Parameters& parameters);
-
-private:
-    /*!
-     * \brief Imports a condition element of a OpenSCENARIO storyboard DOM
-     *
-     * \param[in]   conditionElement   The DOM root of the condition element
-     * \param[in]   entities           Objects from 'Entities' tag
-     * \param[in]   parameters         Declared parameters
-     */
-    static openScenario::Condition ImportConditionElement(QDomElement& conditionElement,
-                                                          const std::vector<ScenarioEntity>& entities,
-                                                          openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a ByEntity condition element of a OpenSCENARIO storyboard DOM
-     *
-     * \param[in]   byEntityElement   The DOM root of the by-entity element
-     * \param[in]   entities          Objects from 'Entities' tag
-     * \param[in]   parameters         Declared parameters
-     */
-    static openScenario::Condition ImportByEntityElement(QDomElement byEntityElement,
-                                                         const std::vector<ScenarioEntity>& entities,
-                                                         openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a EntityCondition element of a OpenSCENARIO storyboard DOM
-     *
-     * \param[in]   byEntityCondition   The DOM root of the byEntityCondition element
-     * \param[in]   triggeringEntities  Objects from 'Entities' tag
-     *
-     * return Condition
-     */
-    static openScenario::Condition ImportEntityCondition(QDomElement byEntityCondition,
-                                                         std::vector<std::string> triggeringEntities);
-
-    /*!
-     * ------------------------------------------------------------------------
-     * \brief ImportConditionByValueElement Imports a Condition ByValue element
-     *        into a condition parameter interface.
-     *
-     * \param[in] byValueElement the ByValue element to parse for condition
-     *            details.
-     * \param[in] parameters   Declared parameters
-     * \return      openScenario Condition
-     * ------------------------------------------------------------------------
-     */
-    static openScenario::Condition ImportConditionByValueElement(QDomElement& byValueElement, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Tests, if a entity with a given name is included in the provided vector of scenario entities
-     *
-     * \param[in]   entities        Vector of entities to test against
-     * \param[in]   entityName      Name of the entity to check for existence
-     *
-     * \return true, if entityName is included in entities, false otherwise.
-     */
-    static bool ContainsEntity(const std::vector<ScenarioEntity>& entities,
-                               const std::string& entityName);
-};
-
-}; // Importer
diff --git a/sim/src/core/opSimulation/importer/importerLoggingHelper.h b/sim/src/core/opSimulation/importer/importerLoggingHelper.h
index fe051a8b314e760a9817d484225a011bd4c25d48..30fad7b07889d4199fbfed9c95fa543e6abd6cd2 100644
--- a/sim/src/core/opSimulation/importer/importerLoggingHelper.h
+++ b/sim/src/core/opSimulation/importer/importerLoggingHelper.h
@@ -10,88 +10,6 @@
 
 #pragma once
 
-namespace openpass::importer::xml::openScenario::rule
-{
-    constexpr char greaterThan[] {"greaterThan"};
-    constexpr char lessThan[] {"lessThan"};
-    constexpr char equalTo[] {"equalTo"};
-}
-
-namespace openpass::importer::xml::openScenario::dynamicsShape
-{
-    constexpr char linear[] {"linear"};
-    constexpr char step[] {"step"};
-}
-
-namespace openpass::importer::xml::openScenario::speedTargetValueType
-{
-    constexpr char delta[] {"delta"};
-    constexpr char factor[] {"factor"};
-}
-
-namespace openpass::importer::xml::openScenario::dynamicsDimension
-{
-    constexpr char rate[] {"rate"};
-}
-
-namespace openpass::importer::xml::eventDetectorImporter::tag
-{
-    constexpr char byEntityCondition[] {"ByEntityCondition"};
-    constexpr char byValueCondition[] {"ByValueCondition"};
-    constexpr char condition[] {"Condition"};
-    constexpr char conditionGroup[] {"ConditionGroup"};
-    constexpr char entityRef[] {"EntityRef"};
-    constexpr char entityCondition[] {"EntityCondition"};
-    constexpr char position[] {"Position"};
-    constexpr char reachPositionCondition[] {"ReachPositionCondition"};
-    constexpr char relativeLanePosition[] {"RelativeLanePosition"};
-    constexpr char relativeSpeedCondition[] {"RelativeSpeedCondition"};
-    constexpr char roadPosition[] {"RoadPosition"};
-    constexpr char simulationTimeCondition[] {"SimulationTimeCondition"};
-    constexpr char startTrigger[] {"StartTrigger"};
-    constexpr char timeToCollisionConditionTarget[] {"TimeToCollisionConditionTarget"};
-    constexpr char timeHeadwayCondition[] {"TimeHeadwayCondition"};
-    constexpr char timeToCollisionCondition[] {"TimeToCollisionCondition"};
-    constexpr char triggeringEntities[] {"TriggeringEntities"};
-}
-
-namespace openpass::importer::xml::eventDetectorImporter::attribute
-{
-    constexpr char alongRoute[] {"alongRoute"};
-    constexpr char entityRef[] {"entityRef"};
-    constexpr char freespace[] {"freespace"};
-    constexpr char name[] {"name"};
-    constexpr char rule[] {"rule"};
-    constexpr char tolerance[] {"tolerance"};
-    constexpr char value[] {"value"};
-}
-
-namespace openpass::importer::xml::manipulatorImporter::tag
-{
-    constexpr char addEntityAction[] {"AddEntityAction"};
-    constexpr char catalogReference[] {"CatalogReference"};
-    constexpr char position[] {"Position"};
-    constexpr char routingAction[] {"RoutingAction"};
-    constexpr char worldPosition[] {"WorldPosition"};
-}
-
-namespace openpass::importer::xml::manipulatorImporter::attribute
-{
-    constexpr char catalogName[] {"catalogName"};
-    constexpr char distance[] {"distance"};
-    constexpr char dynamicsDimension[] {"dynamicsDimension"};
-    constexpr char entityRef[] {"entityRef"};
-    constexpr char entryName[] {"entryName"};
-    constexpr char h[] {"h"};
-    constexpr char name[] {"name"};
-    constexpr char object[] {"object"};
-    constexpr char dynamicsShape[] {"dynamicsShape"};
-    constexpr char time[] {"time"};
-    constexpr char value[] {"value"};
-    constexpr char x[] {"x"};
-    constexpr char y[] {"y"};
-}
-
 namespace openpass::importer::xml::parameterImporter::tag
 {
     constexpr char Bool[] {"Bool"};
@@ -148,26 +66,23 @@ namespace openpass::importer::xml::profilesImporter::tag
     constexpr char sensorLink[] {"SensorLink"};
     constexpr char sensorLinks[] {"SensorLinks"};
     constexpr char system[] {"System"};
-    constexpr char vehicleProfile[] {"VehicleProfile"};
-    constexpr char vehicleProfiles[] {"VehicleProfiles"};
+    constexpr char systemProfile[] {"SystemProfile"};
+    constexpr char systemProfiles[] {"SystemProfiles"};
+    constexpr char vehicleModel[] {"VehicleModel"};
+    constexpr char vehicleModels[] {"VehicleModels"};
 }
 
 namespace openpass::importer::xml::profilesImporter::attribute
 {
     constexpr char file[] {"File"};
-    constexpr char height[] {"Height"};
     constexpr char id[] {"Id"};
     constexpr char inputId[] {"InputId"};
-    constexpr char lateral[] {"Lateral"};
-    constexpr char longitudinal[] {"Longitudinal"};
     constexpr char name[] {"Name"};
-    constexpr char pitch[] {"Pitch"};
-    constexpr char roll[] {"Roll"};
+    constexpr char position[] {"Position"};
     constexpr char schemaVersion[] {"SchemaVersion"};
     constexpr char sensorId[] {"SensorId"};
     constexpr char type[] {"Type"};
     constexpr char vehicleModel[] {"VehicleModel"};
-    constexpr char yaw[] {"Yaw"};
     constexpr char latency[] {"Latency"};
 }
 
diff --git a/sim/src/core/opSimulation/importer/oscImporterCommon.cpp b/sim/src/core/opSimulation/importer/oscImporterCommon.cpp
deleted file mode 100644
index 2e2b4e68f150d0a050b7f62c65d611d90ba10a67..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/oscImporterCommon.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "oscImporterCommon.h"
-#include "importerLoggingHelper.h"
-
-namespace TAG = openpass::importer::xml::scenarioImporter::tag;
-namespace ATTRIBUTE = openpass::importer::xml::scenarioImporter::attribute;
-
-void Importer::ImportParameterElement(QDomElement& parameterElement, openScenario::Parameters& parameters)
-{
-    std::string parameterName;
-    ThrowIfFalse(SimulationCommon::ParseAttribute(parameterElement, ATTRIBUTE::name, parameterName),
-                 parameterElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
-
-    std::string parameterType;
-    ThrowIfFalse(SimulationCommon::ParseAttribute(parameterElement, ATTRIBUTE::parameterType, parameterType),
-                 parameterElement, "Attribute " + std::string(ATTRIBUTE::parameterType) + " is missing.");
-
-    if (parameterType == "bool")
-    {
-        bool parameterValueBool;
-        ThrowIfFalse(SimulationCommon::ParseAttribute(parameterElement, ATTRIBUTE::value, parameterValueBool),
-                     parameterElement, "Attribute " + std::string(ATTRIBUTE::value) + " is missing.");
-        parameters.insert({parameterName, parameterValueBool});
-    }
-    else if (parameterType == "integer")
-    {
-        int parameterValueInt;
-        ThrowIfFalse(SimulationCommon::ParseAttribute(parameterElement, ATTRIBUTE::value, parameterValueInt),
-                     parameterElement, "Attribute " + std::string(ATTRIBUTE::value) + " is missing.");
-        parameters.insert({parameterName, parameterValueInt});
-    }
-    else if (parameterType == "double")
-    {
-        double parameterValueDouble;
-        ThrowIfFalse(SimulationCommon::ParseAttribute(parameterElement, ATTRIBUTE::value, parameterValueDouble),
-                     parameterElement, "Attribute " + std::string(ATTRIBUTE::value) + " is missing.");
-        parameters.insert({parameterName, parameterValueDouble});
-    }
-    else if (parameterType == "string")
-    {
-        std::string parameterValueString;
-        ThrowIfFalse(SimulationCommon::ParseAttribute(parameterElement, ATTRIBUTE::value, parameterValueString),
-                     parameterElement, "Attribute " + std::string(ATTRIBUTE::value) + " is missing.");
-        parameters.insert({parameterName, parameterValueString});
-    }
-    else
-    {
-        ThrowIfFalse(false, parameterElement, "Unknown parameter type "+ parameterType);
-    }
-}
-
-void Importer::ImportParameterDeclarationElement(QDomElement& parameterDeclarationElement, openScenario::Parameters& parameters)
-{
-    QDomElement parameterElement;
-    if (SimulationCommon::GetFirstChildElement(parameterDeclarationElement, TAG::parameterDeclaration, parameterElement))
-    {
-        while (!parameterElement.isNull())
-        {
-            ImportParameterElement(parameterElement, parameters);
-            parameterElement = parameterElement.nextSiblingElement(TAG::parameterDeclaration);
-        }
-    }
-}
diff --git a/sim/src/core/opSimulation/importer/oscImporterCommon.h b/sim/src/core/opSimulation/importer/oscImporterCommon.h
deleted file mode 100644
index c2a667f716f7e04286994f7e33f7a66d4e72a6cd..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/oscImporterCommon.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include <QDomDocument>
-#include <optional>
-
-#include "importer/importerCommon.h"
-#include "common/openScenarioDefinitions.h"
-
-namespace Importer
-{
-
-//! Parse an XML attribute from a .xosc file, which is either given by value or by referencing a parameter declared before
-//!
-//! \param element              xml element
-//! \param attributeName        name of the attribute to parse
-//! \param parameters           parameters declared by the ParameterDeclarations element
-//! \param assignedParameters   if the element is from a referenced catalog, these are the parameters declared by the ParameterAssignments element
-template<typename T>
-T ParseAttribute(const QDomElement& element, const char attributeName[], openScenario::Parameters& parameters, const openScenario::Parameters& assignedParameters = {})
-{
-    std::string valueString;
-    ThrowIfFalse(SimulationCommon::ParseAttribute(element, attributeName, valueString), element,
-                 "Attribute " + std::string(attributeName) + " is missing");
-    if constexpr (!std::is_same_v<T, std::string>)
-    {
-        ThrowIfFalse(!valueString.empty(), element,
-                     "Attribute " + std::string(attributeName) + " is empty");
-    }
-    if (!valueString.empty() && valueString[0] == '$')
-    {
-        auto foundAssignedValue = assignedParameters.find(valueString.substr(1));
-        if (foundAssignedValue != assignedParameters.cend())
-        {
-            ThrowIfFalse(std::holds_alternative<T>(foundAssignedValue->second), element,
-                         "Parameter " + valueString + " has wrong type.");
-            return std::get<T>(foundAssignedValue->second);
-        }
-        auto foundValue = parameters.find(valueString.substr(1));
-        ThrowIfFalse(foundValue != parameters.end(), element,
-                     "No parameter " + valueString + " defined.");
-        ThrowIfFalse(std::holds_alternative<T>(foundValue->second), element,
-                     "Parameter " + valueString + " has wrong type.");
-        return std::get<T>(foundValue->second);
-    }
-    else
-    {
-        T value;
-        SimulationCommon::ParseAttribute(element, attributeName, value);
-        return value;
-    }
-}
-
-//! Parse an optional XML attribute from a .xosc file, which is either given by value or by referencing a parameter declared before
-//!
-//! \param element              xml element
-//! \param attributeName        name of the attribute to parse
-//! \param parameters           parameters declared by the ParameterDeclarations element
-//! \param assignedParameters   if the element is from a referenced catalog, these are the parameters declared by the ParameterAssignments element
-template<typename T>
-std::optional<T> ParseOptionalAttribute(const QDomElement& element, const char attributeName[], openScenario::Parameters& parameters, const openScenario::Parameters& assignedParameters = {})
-{
-    if(SimulationCommon::HasAttribute(element, attributeName))
-    {
-        return ParseAttribute<T>(element, attributeName, parameters);
-    }
-
-    return std::nullopt;
-}
-
-//! Parse an XML attribute from a .xosc file, which is either given by value or by reference a parameter declared before.
-//! This variant is for attributes in catalog that may later be overruled by parameter assignments
-//!
-//! \param element              xml element
-//! \param attributeName        name of the attribute to parse
-//! \param parameters           parameters declared by the ParameterDeclarations element
-template<typename T>
-openScenario::ParameterizedAttribute<T> ParseParametrizedAttribute(const QDomElement& element, const char attributeName[], const openScenario::Parameters& defaultParameters)
-{
-    std::string valueString;
-    ThrowIfFalse(SimulationCommon::ParseAttribute(element, attributeName, valueString), element,
-                 "Attribute " + std::string(attributeName) + " is missing");
-    if constexpr (!std::is_same_v<T, std::string>)
-    {
-        ThrowIfFalse(!valueString.empty(), element,
-                     "Attribute " + std::string(attributeName) + " is empty");
-    }
-    if (!valueString.empty() && valueString.at(0) == '$')
-    {
-        auto foundDefaultValue = defaultParameters.find(valueString.substr(1));
-        ThrowIfFalse(foundDefaultValue != defaultParameters.end(), element,
-                     "No parameter " + valueString + " defined.");
-        ThrowIfFalse(std::holds_alternative<T>(foundDefaultValue->second), element,
-                     "Parameter " + valueString + " has wrong type.");
-        return {valueString.substr(1), std::get<T>(foundDefaultValue->second)};
-    }
-    else
-    {
-        T value;
-        SimulationCommon::ParseAttribute(element, attributeName, value);
-        return openScenario::ParameterizedAttribute<T>{attributeName,value};
-    }
-}
-
-//! Import a ParameterElement from an .xosc file
-//!
-//! \param parameterElement     element to parse
-//! \param parameters           map where result is stored
-void ImportParameterElement(QDomElement& parameterElement, openScenario::Parameters& parameters);
-
-
-//! Import a ParameterDeclarationElement from an .xosc file
-//!
-//! \param parameterDeclarationElement  element to parse
-//! \param parameters                   map where result is stored
-void ImportParameterDeclarationElement(QDomElement& parameterDeclarationElement, openScenario::Parameters& parameters);
-}
diff --git a/sim/src/core/opSimulation/importer/profiles.cpp b/sim/src/core/opSimulation/importer/profiles.cpp
index 8b4bedb726d329981dddfdc653baf3facde5384c..ffc863647816c2fa4decee430d7f47b85a10075d 100644
--- a/sim/src/core/opSimulation/importer/profiles.cpp
+++ b/sim/src/core/opSimulation/importer/profiles.cpp
@@ -24,14 +24,14 @@ bool Profiles::AddAgentProfile(std::string agentProfileName, AgentProfile agentP
     return agentProfiles.insert({agentProfileName, agentProfile}).second;
 }
 
-const std::unordered_map<std::string, VehicleProfile>& Profiles::GetVehicleProfiles() const
+const std::unordered_map<std::string, SystemProfile>& Profiles::GetSystemProfiles() const
 {
-    return vehicleProfiles;
+    return systemProfiles;
 }
 
-void Profiles::AddVehicleProfile(const std::string& profileName, const VehicleProfile& vehicleProfile)
+void Profiles::AddSystemProfile(const std::string& profileName, const SystemProfile& systemProfile)
 {
-    vehicleProfiles.insert({profileName, vehicleProfile});
+    systemProfiles.insert({profileName, systemProfile});
 }
 
 const ProfileGroups& Profiles::GetProfileGroups() const
@@ -56,11 +56,23 @@ const StringProbabilities& Profiles::GetDriverProbabilities(std::string agentPro
     }
 }
 
-const StringProbabilities& Profiles::GetVehicleProfileProbabilities(std::string agentProfileName) const
+const StringProbabilities& Profiles::GetSystemProfileProbabilities(std::string agentProfileName) const
 {
     try
     {
-        return agentProfiles.at(agentProfileName).vehicleProfiles;
+        return agentProfiles.at(agentProfileName).systemProfiles;
+    }
+    catch (const std::out_of_range&)
+    {
+        throw std::runtime_error("Cannot retrieve vehicle probabilities. Unknown agent profile " + agentProfileName);
+    }
+}
+
+const StringProbabilities &Profiles::GetVehicleModelsProbabilities(std::string agentProfileName) const
+{
+    try
+    {
+        return agentProfiles.at(agentProfileName).vehicleModels;
     }
     catch (const std::out_of_range&)
     {
diff --git a/sim/src/core/opSimulation/importer/profiles.h b/sim/src/core/opSimulation/importer/profiles.h
index d436802ec6c4a73f5b09a8c36711326f0b86759e..be5c729ab422dd3d541b5be8309b0aee285a2f83 100644
--- a/sim/src/core/opSimulation/importer/profiles.h
+++ b/sim/src/core/opSimulation/importer/profiles.h
@@ -22,9 +22,9 @@ public:
 
     virtual bool AddAgentProfile(std::string agentProfileName, AgentProfile agentProfile) override;
 
-    virtual const std::unordered_map<std::string, VehicleProfile>& GetVehicleProfiles() const override;
+    virtual const std::unordered_map<std::string, SystemProfile>& GetSystemProfiles() const override;
 
-    virtual void AddVehicleProfile(const std::string& profileName, const VehicleProfile& vehicleProfile) override;
+    virtual void AddSystemProfile(const std::string& profileName, const SystemProfile& systemProfile) override;
 
     virtual const ProfileGroups& GetProfileGroups() const override;
 
@@ -32,7 +32,9 @@ public:
 
     virtual const StringProbabilities& GetDriverProbabilities(std::string agentProfileName) const override;
 
-    virtual const StringProbabilities& GetVehicleProfileProbabilities(std::string agentProfileName) const override;
+    virtual const StringProbabilities& GetSystemProfileProbabilities(std::string agentProfileName) const override;
+
+    virtual const StringProbabilities& GetVehicleModelsProbabilities(std::string agentProfileName) const override;
 
     virtual const openpass::parameter::ParameterSetLevel1& GetProfile(const std::string& type, const std::string& name) const override;
 
@@ -40,6 +42,6 @@ public:
 
 private:
     std::unordered_map<std::string, AgentProfile> agentProfiles {};
-    std::unordered_map<std::string, VehicleProfile> vehicleProfiles {};
+    std::unordered_map<std::string, SystemProfile> systemProfiles {};
     ProfileGroups profileGroups;
 };
diff --git a/sim/src/core/opSimulation/importer/profilesImporter.cpp b/sim/src/core/opSimulation/importer/profilesImporter.cpp
index 5fe60a079215eebb3555568e15d7937b339f3f69..5864985f18aa123d03af952800537c123698dfd2 100644
--- a/sim/src/core/opSimulation/importer/profilesImporter.cpp
+++ b/sim/src/core/opSimulation/importer/profilesImporter.cpp
@@ -49,11 +49,18 @@ void ProfilesImporter::ImportAgentProfiles(QDomElement agentProfilesElement,
                          driverProfilesElement, "Invalid probalities");
 
             //Parses all vehicle profiles
-            QDomElement vehicleProfilesElement;
-            ThrowIfFalse(GetFirstChildElement(agentProfileElement, TAG::vehicleProfiles, vehicleProfilesElement),
-                         agentProfileElement, "Tag " + std::string(TAG::vehicleProfiles) + " is missing.");
-            ThrowIfFalse(ImportProbabilityMap(vehicleProfilesElement, ATTRIBUTE::name, TAG::vehicleProfile, agentProfile.vehicleProfiles, LogErrorAndThrow),
-                         vehicleProfilesElement, "Invalid probalities");
+            QDomElement systemProfilesElement;
+            ThrowIfFalse(GetFirstChildElement(agentProfileElement, TAG::systemProfiles, systemProfilesElement),
+                         agentProfileElement, "Tag " + std::string(TAG::systemProfiles) + " is missing.");
+            ThrowIfFalse(ImportProbabilityMap(systemProfilesElement, ATTRIBUTE::name, TAG::systemProfile, agentProfile.systemProfiles, LogErrorAndThrow),
+                         systemProfilesElement, "Invalid probalities");
+
+            //Parses all vehicle profiles
+            QDomElement vehicleModelsElement;
+            ThrowIfFalse(GetFirstChildElement(agentProfileElement, TAG::vehicleModels, vehicleModelsElement),
+                         agentProfileElement, "Tag " + std::string(TAG::vehicleModels) + " is missing.");
+            ThrowIfFalse(ImportProbabilityMap(vehicleModelsElement, ATTRIBUTE::name, TAG::vehicleModel, agentProfile.vehicleModels, LogErrorAndThrow),
+                         vehicleModelsElement, "Invalid probalities");
         }
         else
         {
@@ -78,7 +85,7 @@ void ProfilesImporter::ImportAgentProfiles(QDomElement agentProfilesElement,
 
             std::string vehicleModel;
             ThrowIfFalse(ParseString(agentProfileElement, ATTRIBUTE::vehicleModel, vehicleModel),
-                         agentProfileElement, "Attribute " + std::string(ATTRIBUTE::vehicleModel) + " is missing.");
+            agentProfileElement, "Attribute " + std::string(ATTRIBUTE::vehicleModel) + " is missing.");
 
             agentProfile.vehicleModel = vehicleModel;
         }
@@ -168,12 +175,12 @@ void ProfilesImporter::ImportVehicleComponent(QDomElement vehicleComponentElemen
     ImportSensorLinksOfComponent(sensorLinksElement, vehicleComponent.sensorLinks);
 }
 
-void ProfilesImporter::ImportAllVehicleComponentsOfVehicleProfile(QDomElement vehicleProfileElement,
-                                                                  VehicleProfile& vehicleProfile)
+void ProfilesImporter::ImportAllVehicleComponentsOfSystemProfile(QDomElement systemProfileElement,
+                                                                  SystemProfile& systemProfile)
 {
     QDomElement vehicleComponentsElement;
-    ThrowIfFalse(GetFirstChildElement(vehicleProfileElement, TAG::components, vehicleComponentsElement),
-                 vehicleProfileElement, "Tag " + std::string(TAG::components) + " is missing.");
+    ThrowIfFalse(GetFirstChildElement(systemProfileElement, TAG::components, vehicleComponentsElement),
+                 systemProfileElement, "Tag " + std::string(TAG::components) + " is missing.");
 
     QDomElement componentElement;
     GetFirstChildElement(vehicleComponentsElement, TAG::component, componentElement);
@@ -183,7 +190,7 @@ void ProfilesImporter::ImportAllVehicleComponentsOfVehicleProfile(QDomElement ve
         VehicleComponent vehicleComponent;
         ImportVehicleComponent(componentElement, vehicleComponent);
 
-        vehicleProfile.vehicleComponents.push_back(vehicleComponent);
+        systemProfile.vehicleComponents.push_back(vehicleComponent);
         componentElement = componentElement.nextSiblingElement(TAG::component);
     }
 }
@@ -192,24 +199,8 @@ void ProfilesImporter::ImportSensorParameters(QDomElement sensorElement, openpas
 {
     ThrowIfFalse(ParseAttributeInt(sensorElement, ATTRIBUTE::id, sensor.id),
                  sensorElement, "Attribute " + std::string(ATTRIBUTE::id) + " is missing.");
-
-    QDomElement positionElement;
-    ThrowIfFalse(GetFirstChildElement(sensorElement, TAG::position, positionElement),
-                 sensorElement, "Tag " + std::string(TAG::position) + " is missing.");
-    ThrowIfFalse(ParseAttributeString(positionElement, ATTRIBUTE::name, sensor.position.name),
-                 positionElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
-    ThrowIfFalse(ParseAttributeDouble(positionElement, ATTRIBUTE::longitudinal, sensor.position.longitudinal),
-                 positionElement, "Attribute " + std::string(ATTRIBUTE::longitudinal) + " is missing.");
-    ThrowIfFalse(ParseAttributeDouble(positionElement, ATTRIBUTE::lateral, sensor.position.lateral),
-                 positionElement, "Attribute " + std::string(ATTRIBUTE::lateral) + " is missing.");
-    ThrowIfFalse(ParseAttributeDouble(positionElement, ATTRIBUTE::height, sensor.position.height),
-                 positionElement, "Attribute " + std::string(ATTRIBUTE::height) + " is missing.");
-    ThrowIfFalse(ParseAttributeDouble(positionElement, ATTRIBUTE::pitch, sensor.position.pitch),
-                 positionElement, "Attribute " + std::string(ATTRIBUTE::pitch) + " is missing.");
-    ThrowIfFalse(ParseAttributeDouble(positionElement, ATTRIBUTE::yaw, sensor.position.yaw),
-                 positionElement, "Attribute " + std::string(ATTRIBUTE::yaw) + " is missing.");
-    ThrowIfFalse(ParseAttributeDouble(positionElement, ATTRIBUTE::roll, sensor.position.roll),
-                 positionElement, "Attribute " + std::string(ATTRIBUTE::roll) + " is missing.");
+    ThrowIfFalse(ParseAttributeString(sensorElement, ATTRIBUTE::position, sensor.positionName),
+                 sensorElement, "Attribute " + std::string(ATTRIBUTE::position) + " is missing.");
 
     QDomElement profileElement;
     ThrowIfFalse(GetFirstChildElement(sensorElement, TAG::profile, profileElement),
@@ -220,12 +211,12 @@ void ProfilesImporter::ImportSensorParameters(QDomElement sensorElement, openpas
                  profileElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
 }
 
-void ProfilesImporter::ImportAllSensorsOfVehicleProfile(QDomElement vehicleProfileElement,
-        VehicleProfile& vehicleProfile)
+void ProfilesImporter::ImportAllSensorsOfSystemProfile(QDomElement systemProfileElement,
+        SystemProfile& systemProfile)
 {
     QDomElement sensorsElement;
-    ThrowIfFalse(GetFirstChildElement(vehicleProfileElement, TAG::sensors, sensorsElement),
-                 vehicleProfileElement, "Tag " + std::string(TAG::sensors) + " is missing.");
+    ThrowIfFalse(GetFirstChildElement(systemProfileElement, TAG::sensors, sensorsElement),
+                 systemProfileElement, "Tag " + std::string(TAG::sensors) + " is missing.");
 
     QDomElement sensorElement;
     GetFirstChildElement(sensorsElement, TAG::sensor, sensorElement);
@@ -235,43 +226,37 @@ void ProfilesImporter::ImportAllSensorsOfVehicleProfile(QDomElement vehicleProfi
         openpass::sensors::Parameter sensor;
         ImportSensorParameters(sensorElement, sensor);
 
-        vehicleProfile.sensors.push_back(sensor);
+        systemProfile.sensors.push_back(sensor);
         sensorElement = sensorElement.nextSiblingElement(TAG::sensor);
     }
 }
 
-VehicleProfile ProfilesImporter::ImportVehicleProfile(QDomElement vehicleProfileElement)
+SystemProfile ProfilesImporter::ImportSystemProfile(QDomElement systemProfileElement)
 {
-    VehicleProfile vehicleProfile;
-
-    QDomElement vehicleModelElement;
-    ThrowIfFalse(GetFirstChildElement(vehicleProfileElement, TAG::model, vehicleModelElement),
-                 vehicleProfileElement, "Tag " + std::string(TAG::model) + " is missing.");
-    ThrowIfFalse(ParseAttributeString(vehicleModelElement, ATTRIBUTE::name, vehicleProfile.vehicleModel),
-                 vehicleModelElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
+    SystemProfile systemProfile;
 
-    ImportAllVehicleComponentsOfVehicleProfile(vehicleProfileElement, vehicleProfile);
-    ImportAllSensorsOfVehicleProfile(vehicleProfileElement, vehicleProfile);
+    ImportAllVehicleComponentsOfSystemProfile(systemProfileElement, systemProfile);
+    ImportAllSensorsOfSystemProfile(systemProfileElement, systemProfile);
 
-    return vehicleProfile;
+    return systemProfile;
 }
 
-void ProfilesImporter::ImportVehicleProfiles(QDomElement vehicleProfilesElement,
+void ProfilesImporter::ImportSystemProfiles(QDomElement systemProfilesElement,
         Profiles& profiles)
 {
-    QDomElement vehicleProfileElement;
-    GetFirstChildElement(vehicleProfilesElement, TAG::vehicleProfile, vehicleProfileElement);
+    QDomElement systemProfileElement;
+    GetFirstChildElement(systemProfilesElement, TAG::systemProfile, systemProfileElement);
 
-    while (!vehicleProfileElement.isNull())
+    while (!systemProfileElement.isNull())
     {
         std::string profileName;
-        ThrowIfFalse(ParseAttributeString(vehicleProfileElement, ATTRIBUTE::name, profileName),
-                     vehicleProfileElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
+        ThrowIfFalse(ParseAttributeString(systemProfileElement, ATTRIBUTE::name, profileName),
+                     systemProfileElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
 
-        auto vehicleProfile = ImportVehicleProfile(vehicleProfileElement);
-        profiles.AddVehicleProfile(profileName, vehicleProfile);
+        auto systemProfile = ImportSystemProfile(systemProfileElement);
+        profiles.AddSystemProfile(profileName, systemProfile);
 
-        vehicleProfileElement = vehicleProfileElement.nextSiblingElement(TAG::vehicleProfile);
+        systemProfileElement = systemProfileElement.nextSiblingElement(TAG::systemProfile);
     }
 }
 
@@ -304,10 +289,10 @@ bool ProfilesImporter::Import(const std::string& filename, Profiles& profiles)
                      "AgentProfiles element is missing.");
         ImportAgentProfiles(agentProfilesElement, profiles);
 
-        QDomElement vehicleProfilesElement;
-        if(GetFirstChildElement(documentRoot, TAG::vehicleProfiles, vehicleProfilesElement))
+        QDomElement systemProfilesElement;
+        if(GetFirstChildElement(documentRoot, TAG::systemProfiles, systemProfilesElement))
         {
-            ImportVehicleProfiles(vehicleProfilesElement, profiles);
+            ImportSystemProfiles(systemProfilesElement, profiles);
         }
 
         ImportProfileGroups(profiles, documentRoot);
diff --git a/sim/src/core/opSimulation/importer/profilesImporter.h b/sim/src/core/opSimulation/importer/profilesImporter.h
index 5d27a8c92d4e7f626315528c324db7aec82e3db5..4bee47c937dc59c0782578fb12e4924ca1f6d32a 100644
--- a/sim/src/core/opSimulation/importer/profilesImporter.h
+++ b/sim/src/core/opSimulation/importer/profilesImporter.h
@@ -43,28 +43,28 @@ public:
     * @param[out]    profiles                Class into which the values get saved
     * @return	     true, if successful
     */
-    static void ImportVehicleProfiles(QDomElement vehicleProfilesElement,
+    static void ImportSystemProfiles(QDomElement systemProfilesElement,
                                       Profiles& profiles);
 
     /*!
-     * \brief Imports a single VehicleProfile
-     * \param vehicleProfileElement  Element containing the information
-     * \param vehicleProfile         VehicleProfile to fill
+     * \brief Imports a single SystemProfile
+     * \param systemProfileElement  Element containing the information
+     * \param systemProfile         SystemProfile to fill
      * \return
      */
-    static VehicleProfile ImportVehicleProfile(QDomElement vehicleProfileElement);
+    static SystemProfile ImportSystemProfile(QDomElement systemProfileElement);
 
     /*!
-     * \brief Imports all VehicleComponentes contained in one VehicleProfile
-     * \param vehicleProfileElement  Element containing the information
-     * \param vehicleProfile         VehicleProfile to fill
+     * \brief Imports all VehicleComponentes contained in one SystemProfile
+     * \param systemProfileElement  Element containing the information
+     * \param systemProfile         SystemProfile to fill
      * \return
      */
-    static void ImportAllVehicleComponentsOfVehicleProfile(QDomElement vehicleProfileElement,
-                                                           VehicleProfile &vehicleProfile);
+    static void ImportAllVehicleComponentsOfSystemProfile(QDomElement systemProfileElement,
+                                                           SystemProfile &systemProfile);
 
     /*!
-     * \brief Imports a single VehicleComponentes contained in one VehicleProfile
+     * \brief Imports a single VehicleComponentes contained in one SystemProfile
      * \param vehicleComponentElement  Element containing the information
      * \param vehicleComponent         VehicleComponent to fill
      * \return
@@ -74,7 +74,7 @@ public:
 
 
     /*!
-     * \brief Imports all SensorLinks of a VehicleComponents contained in one VehicleProfile
+     * \brief Imports all SensorLinks of a VehicleComponents contained in one SystemProfile
      * \param sensorLinksElement      Element containing the information
      * \param sensorLinksElement      Map into which SensorLinks are saved
      * \return
@@ -83,16 +83,16 @@ public:
                                              std::vector<SensorLink> &sensorLinks);
 
     /*!
-     * \brief Imports all Sensor contained in one VehicleProfiles
-     * \param vehicleProfileElement  Element containing the information
-     * \param vehicleProfile         VehicleProfile to fill
+     * \brief Imports all Sensor contained in one SystemProfiles
+     * \param systemProfileElement  Element containing the information
+     * \param systemProfile         SystemProfile to fill
      * \return
      */
-    static void ImportAllSensorsOfVehicleProfile(QDomElement vehicleProfileElement,
-                                                 VehicleProfile &vehicleProfile);
+    static void ImportAllSensorsOfSystemProfile(QDomElement systemProfileElement,
+                                                 SystemProfile &systemProfile);
 
     /*!
-     * \brief Imports a single Sensor contained in one VehicleProfile
+     * \brief Imports a single Sensor contained in one SystemProfile
      * \param sensorElement           Element containing the information
      * \param sensorParameter         SensorParameter to fill
      * \return
@@ -114,7 +114,7 @@ public:
 
 private:
     static constexpr auto profilesCatalogFile = "ProfilesCatalog.xml";
-    static constexpr auto supportedConfigVersion = "0.4.8";
+    static constexpr auto supportedConfigVersion = "0.5";
 
 };
 } //namespace Importer
diff --git a/sim/src/core/opSimulation/importer/road.cpp b/sim/src/core/opSimulation/importer/road.cpp
index 5388ca0f0670ef6dce9c0fc3c58941c39dfcba06..772297374a5176df5703c2d1c93090dbb6a25ace 100644
--- a/sim/src/core/opSimulation/importer/road.cpp
+++ b/sim/src/core/opSimulation/importer/road.cpp
@@ -42,7 +42,7 @@ RoadLane::~RoadLane()
     }
 }
 
-bool RoadLane::AddWidth(double sOffset, double a, double b, double c, double d)
+bool RoadLane::AddWidth(units::length::meter_t sOffset, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d)
 {
     RoadLaneWidth *laneWidth = new (std::nothrow) RoadLaneWidth(sOffset, a, b, c, d);
     if (!laneWidth)
@@ -55,7 +55,7 @@ bool RoadLane::AddWidth(double sOffset, double a, double b, double c, double d)
     return true;
 }
 
-bool RoadLane::AddBorder(double sOffset, double a, double b, double c, double d)
+bool RoadLane::AddBorder(units::length::meter_t sOffset, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d)
 {
     RoadLaneWidth *laneWidth = new (std::nothrow) RoadLaneWidth(sOffset, a, b, c, d);
     if (!laneWidth)
@@ -84,7 +84,7 @@ bool RoadLane::AddPredecessor(int id)
     return true;
 }
 
-bool RoadLane::AddRoadMark(double sOffset, RoadLaneRoadDescriptionType type, RoadLaneRoadMarkType roadMark,
+bool RoadLane::AddRoadMark(units::length::meter_t sOffset, RoadLaneRoadDescriptionType type, RoadLaneRoadMarkType roadMark,
                            RoadLaneRoadMarkColor color, RoadLaneRoadMarkLaneChange laneChange,
                            RoadLaneRoadMarkWeight weight)
 {
@@ -125,11 +125,11 @@ RoadLane *RoadLaneSection::AddRoadLane(int id, RoadLaneType type)
     return lane;
 }
 
-Common::Vector2d RoadGeometry::GetCoordLine(double sOffset, double tOffset) const
+Common::Vector2d<units::length::meter_t> RoadGeometry::GetCoordLine(units::length::meter_t sOffset, units::length::meter_t tOffset) const
 {
     if (sOffset > length)
     {
-        if (!CommonHelper::DoubleEquality(sOffset, length))
+        if (!mantle_api::IsEqual(sOffset, length))
         {
             LOG_INTERN(LogLevel::Warning)
                 << "cummulative s-offset exceeds length of line geometry by " << (sOffset - length) << " m. "
@@ -139,7 +139,7 @@ Common::Vector2d RoadGeometry::GetCoordLine(double sOffset, double tOffset) cons
     }
 
     // unrotated road initially pointing to east
-    Common::Vector2d offset(sOffset, tOffset);
+    Common::Vector2d<units::length::meter_t> offset(sOffset, tOffset);
 
     offset.Rotate(hdg);
 
@@ -149,17 +149,17 @@ Common::Vector2d RoadGeometry::GetCoordLine(double sOffset, double tOffset) cons
     return offset;
 }
 
-double RoadGeometry::GetDirLine(double sOffset) const
+units::angle::radian_t RoadGeometry::GetDirLine(units::length::meter_t sOffset) const
 {
     Q_UNUSED(sOffset);
     return hdg;
 }
 
-Common::Vector2d RoadGeometry::GetCoordArc(double sOffset, double tOffset, double curvature) const
+Common::Vector2d<units::length::meter_t> RoadGeometry::GetCoordArc(units::length::meter_t sOffset, units::length::meter_t tOffset, units::curvature::inverse_meter_t curvature) const
 {
     if (sOffset > length)
     {
-        if (!CommonHelper::DoubleEquality(sOffset, length))
+        if (!mantle_api::IsEqual(sOffset, length))
         {
             LOG_INTERN(LogLevel::Warning)
                 << "cummulative s-offset exceeds length of arc geometry by " << (sOffset - length) << " m. "
@@ -169,15 +169,15 @@ Common::Vector2d RoadGeometry::GetCoordArc(double sOffset, double tOffset, doubl
         sOffset = length;
     }
 
-    double radius = 1 / curvature;
-    double circumference = 2 * M_PI / curvature;
+    units::length::meter_t radius{1 / curvature};
+    units::length::meter_t circumference{2 * M_PI / curvature};
 
     // account for sOffset beyond circumference
     // fractionRad = fractionCircumference * 2 * PI / circumference
-    double fractionRad = fmod(sOffset, circumference) * curvature;
+    units::angle::radian_t fractionRad = 1_rad * units::math::fmod(sOffset, circumference) * curvature;
 
     // shift by radius to rotate around center at origin
-    Common::Vector2d offset(0, -radius + tOffset);
+    Common::Vector2d<units::length::meter_t> offset(0_m, -radius + tOffset);
     offset.Rotate(fractionRad);
 
     // shift back
@@ -191,30 +191,30 @@ Common::Vector2d RoadGeometry::GetCoordArc(double sOffset, double tOffset, doubl
     return offset;
 }
 
-double RoadGeometry::GetDirArc(double sOffset, double curvature) const
+units::angle::radian_t RoadGeometry::GetDirArc(units::length::meter_t sOffset, units::curvature::inverse_meter_t curvature) const
 {
-    double circumference = 2 * M_PI / curvature;
+    units::length::meter_t circumference = (2 * M_PI) / curvature;
 
     // account for sOffset beyond circumference
     // fractionRad = fractionCircumference * 2 * PI / circumference
-    double fractionRad = fmod(sOffset, circumference) * curvature;
+    units::angle::radian_t fractionRad{units::unit_cast<double>(units::math::fmod(sOffset, circumference) * curvature)};
 
     return hdg + fractionRad;
 }
 
-Common::Vector2d RoadGeometryLine::GetCoord(double sOffset, double tOffset) const
+Common::Vector2d<units::length::meter_t> RoadGeometryLine::GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const
 {
     return GetCoordLine(sOffset, tOffset);
 }
 
-double RoadGeometryLine::GetDir(double sOffset) const
+units::angle::radian_t RoadGeometryLine::GetDir(units::length::meter_t sOffset) const
 {
     return GetDirLine(sOffset);
 }
 
-Common::Vector2d RoadGeometryArc::GetCoord(double sOffset, double tOffset) const
+Common::Vector2d<units::length::meter_t> RoadGeometryArc::GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const
 {
-    if (0.0 == curvature)
+    if (0.0_i_m == curvature)
     {
         return GetCoordLine(sOffset, tOffset);
     }
@@ -222,9 +222,9 @@ Common::Vector2d RoadGeometryArc::GetCoord(double sOffset, double tOffset) const
     return GetCoordArc(sOffset, tOffset, curvature);
 }
 
-double RoadGeometryArc::GetDir(double sOffset) const
+units::angle::radian_t RoadGeometryArc::GetDir(units::length::meter_t sOffset) const
 {
-    if (0.0 == curvature)
+    if (0.0_i_m == curvature)
     {
         return GetDirLine(sOffset);
     }
@@ -232,114 +232,121 @@ double RoadGeometryArc::GetDir(double sOffset) const
     return GetDirArc(sOffset, curvature);
 }
 
-RoadGeometrySpiral::RoadGeometrySpiral(double s, double x, double y, double hdg, double length, double curvStart, double curvEnd)
+RoadGeometrySpiral::RoadGeometrySpiral(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvStart, units::curvature::inverse_meter_t curvEnd)
     : RoadGeometry{s, x, y, hdg, length}, c_start{curvStart}, c_end{curvEnd}
 {
-    if (length != 0.0)
+    if (length != 0.0_m)
     {
         c_dot = (c_end - c_start) / length;
     }
     else
     {
-        c_dot = 0.0;
+        c_dot = units::unit_t<units::inverse<units::squared<units::length::meter>>>(0.0);
     }
 
-    if (c_dot != 0.0)
+    if (c_dot != units::unit_t<units::inverse<units::squared<units::length::meter>>>(0.0))
     {
         l_start = c_start / c_dot;
     }
     else
     {
-        l_start = 0.0;
+        l_start = 0.0_m;
     }
 
-    double l_end = l_start + length;
-    double rl;   // helper constant R * L
+    const auto l_end = l_start + length;
+    units::area::square_meter_t rl;   // helper constant R * L
 
-    if (c_start != 0.0)
+    if (c_start != 0.0_i_m)
     {
         rl = l_start / c_start;
     }
-    else if (c_end != 0.0)
+    else if (c_end != 0.0_i_m)
     {
         rl = l_end / c_end;
     }
     else
     {
-        t_start = 0.0;
-        a = 0.0;
+        t_start = 0.0_rad;
+        a = 0.0_m;
         sign = 0.0;
         return;
     }
 
-    t_start = 0.5 * l_start * curvStart;
-    a = std::sqrt(std::abs(rl));
-    sign = std::signbit(rl) ? -1.0 : 1.0;
+    t_start = 1_rad * 0.5 * l_start * curvStart;
+    a = units::math::sqrt(units::math::abs(rl));
+    sign = std::signbit(rl.value()) ? -1.0 : 1.0;
 }
 
-Common::Vector2d RoadGeometrySpiral::FullCoord(double sOffset, double tOffset) const
+Common::Vector2d<units::length::meter_t> RoadGeometrySpiral::FullCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const
 {
     // curvature of the spiral at sOffset
-    double curvAtsOffet = c_start + c_dot * sOffset;
+    units::curvature::inverse_meter_t curvAtsOffet = c_start + c_dot * sOffset;
 
     // start and end coordinates of spiral
-    Common::Vector2d start, end;
+    Common::Vector2d<units::length::meter_t> start, end;
+
+    double tmpYValue{};
+    double tmpXValue{};
 
     // calculate x and y of spiral start, assuming sOffset = 0 means start of spiral with curvature curvStart
-    (void)fresnl(l_start / a / SQRT_PI, &start.y, &start.x);
-    start.Scale(a * SQRT_PI);
+    (void)fresnl(l_start.value() / a.value() / SQRT_PI, &tmpYValue, &tmpXValue);
+    start.y = units::length::meter_t(tmpYValue);
+    start.x = units::length::meter_t(tmpXValue);
+    start.Scale(a.value() * SQRT_PI);
     start.y *= sign;
 
     // calculate x and y of spiral end, assuming l_start + sOffset means end of spiral with curvature curvEnd
-    (void)fresnl((l_start + sOffset) / a / SQRT_PI, &end.y, &end.x);
-    end.Scale(a * SQRT_PI);
+    (void)fresnl(units::unit_cast<double>(l_start + sOffset) / a.value() / SQRT_PI, &tmpYValue, &tmpXValue);
+    end.y = units::length::meter_t(tmpYValue);
+    end.x = units::length::meter_t(tmpXValue);
+    end.Scale(a.value() * SQRT_PI);
     end.y *= sign;
 
     // delta x, y from start of spiral to end of spiral
     auto diff = end - start;
 
     // tangent angle at end of spiral
-    double t_end = (l_start + sOffset) * curvAtsOffet / 2.0;
+    units::angle::radian_t t_end{units::unit_cast<double>((l_start + sOffset) * curvAtsOffet / 2.0)};
 
     // heading change of spiral
-    double dHdg = t_end - t_start;
+    const auto dHdg = t_end - t_start;
 
     // rotate delta x, y to match starting direction and origin heading
-    diff.Rotate(-t_start+hdg);
+    diff.Rotate(-t_start + hdg);
 
     // heading at end of spiral
     auto endHdg = hdg + dHdg;
 
     // calculate t-offset to spiral
-    Common::Vector2d unit{1.0,0};
-    unit.Rotate(endHdg + M_PI_2);
-    unit.Scale(tOffset);
+    Common::Vector2d<units::length::meter_t> unit{1.0_m, 0_m};
+    unit.Rotate(endHdg + units::angle::radian_t(M_PI_2));
+    unit.Scale(tOffset.value());
 
-    return diff + unit + Common::Vector2d(x, y);
+    return diff + unit + Common::Vector2d<units::length::meter_t>(x, y);
 }
 
-double RoadGeometrySpiral::FullCurvature(double sOffset) const
+units::curvature::inverse_meter_t RoadGeometrySpiral::FullCurvature(units::length::meter_t sOffset) const
 {
     return c_start + c_dot * sOffset;
 }
 
-double RoadGeometrySpiral::FullDir(double sOffset) const
+units::angle::radian_t RoadGeometrySpiral::FullDir(units::length::meter_t sOffset) const
 {
     // tangent_angle = L / (2 * R) = 0.5 * L * curv
     // direction change in spiral = tangent_end - tangent_start
 
-    double curvEnd = FullCurvature(sOffset);
-    return hdg + 0.5 * (curvEnd * (l_start + sOffset) - c_start * l_start);
+    const auto curvEnd = FullCurvature(sOffset);
+    return hdg + 0.5_rad * (curvEnd * (l_start + sOffset) - c_start * l_start);
 }
 
-Common::Vector2d RoadGeometrySpiral::GetCoord(double sOffset, double tOffset) const
+Common::Vector2d<units::length::meter_t> RoadGeometrySpiral::GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const
 {
-    if (0.0 == c_start && 0.0 == c_end)
+    if (0.0_i_m == c_start && 0.0_i_m == c_end)
     {
         return GetCoordLine(sOffset, tOffset);
     }
 
-    if (std::abs(c_start - c_end) < 1e-6 /* assumed to be equal */)
+    if (mantle_api::IsEqual(c_start, c_end, 1e-6))
     {
         return GetCoordArc(sOffset, tOffset, c_start);
     }
@@ -347,14 +354,14 @@ Common::Vector2d RoadGeometrySpiral::GetCoord(double sOffset, double tOffset) co
     return FullCoord(sOffset, tOffset);
 }
 
-double RoadGeometrySpiral::GetDir(double sOffset) const
+units::angle::radian_t RoadGeometrySpiral::GetDir(units::length::meter_t sOffset) const
 {
-    if (0.0 == c_start && 0.0 == c_end)
+    if (0.0_i_m == c_start && 0.0_i_m == c_end)
     {
         return GetDirLine(sOffset);
     }
 
-    if (std::abs(c_start - c_end) < 1e-6 /* assumed to be equal */)
+    if (mantle_api::IsEqual(c_start, c_end, 1e-6))
     {
         return GetDirArc(sOffset, c_start);
     }
@@ -362,37 +369,37 @@ double RoadGeometrySpiral::GetDir(double sOffset) const
     return FullDir(sOffset);
 }
 
-Common::Vector2d RoadGeometryPoly3::GetCoord(double sOffset, double tOffset) const
+Common::Vector2d<units::length::meter_t> RoadGeometryPoly3::GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const
 {
-    if (0.0 == a && 0.0 == b && 0.0 == c && 0.0 == d)
+    if (0.0_m == a && 0.0 == b && 0.0_i_m == c && units::unit_t<units::inverse<units::squared<units::length::meter>>>(0.0) == d)
     {
         return GetCoordLine(sOffset, tOffset);
     }
 
-    double s = 0.0;
-    Common::Vector2d lastPos;
-    Common::Vector2d delta;
-    Common::Vector2d pos(0.0, a);
+    units::length::meter_t s = 0.0_m;
+    Common::Vector2d<units::length::meter_t> lastPos;
+    Common::Vector2d<units::length::meter_t> delta;
+    Common::Vector2d<units::length::meter_t> pos(0.0_m, a);
 
     while (s < sOffset)
     {
         lastPos = pos;
-        pos.x += 1.0;
+        pos.x += 1.0_m;
         pos.y = a + b * pos.x + c * pos.x * pos.x + d * pos.x * pos.x * pos.x;
 
         delta = pos - lastPos;
-        double deltaLength = delta.Length();
+        units::length::meter_t deltaLength{delta.Length()};
 
-        if (0.0 == deltaLength)
+        if (0.0_m == deltaLength)
         {
             LOG_INTERN(LogLevel::Warning) << "could not calculate road geometry correctly";
-            return Common::Vector2d();
+            return Common::Vector2d<units::length::meter_t>();
         }
 
         if (s + deltaLength > sOffset)
         {
             // rescale last step
-            double scale = (sOffset - s) / deltaLength;
+            units::dimensionless::scalar_t scale = (sOffset - s) / deltaLength;
 
             delta.Scale(scale);
             deltaLength = sOffset - s;
@@ -401,25 +408,35 @@ Common::Vector2d RoadGeometryPoly3::GetCoord(double sOffset, double tOffset) con
         s += deltaLength;
     }
 
-    Common::Vector2d offset(lastPos + delta);
+    Common::Vector2d<units::length::meter_t> offset(lastPos + delta);
 
-    Common::Vector2d norm;
-    if (0 < sOffset)
+    Common::Vector2d<units::length::meter_t> norm;
+    if (0_m < sOffset)
     {
         norm = delta;
     }
     else // account for start point
     {
-        norm.x = 1.0;
+        norm.x = 1.0_m;
     }
 
-    norm.Rotate(-M_PI_2); // pointing to right side
-    if (!norm.Norm())
+    norm.Rotate(units::angle::radian_t(-M_PI_2)); // pointing to right side
+
+    Common::Vector2d<units::dimensionless::scalar_t> normalizedVector;
+
+    try
+    {
+        normalizedVector = norm.Norm();
+    }
+    catch (...)
     {
         LOG_INTERN(LogLevel::Error) << "division by 0";
     }
 
-    offset.Add(norm * -tOffset);
+    norm.x = normalizedVector.x * -tOffset;
+    norm.y = normalizedVector.y * -tOffset;
+
+    offset.Add(norm);
 
     offset.Rotate(hdg);
 
@@ -428,37 +445,37 @@ Common::Vector2d RoadGeometryPoly3::GetCoord(double sOffset, double tOffset) con
     return offset;
 }
 
-double RoadGeometryPoly3::GetDir(double sOffset) const
+units::angle::radian_t RoadGeometryPoly3::GetDir(units::length::meter_t sOffset) const
 {
-    if (0.0 == a && 0.0 == b && 0.0 == c && 0.0 == d)
+    if (0.0_m == a && 0.0 == b && 0.0_i_m == c && units::unit_t<units::inverse<units::squared<units::length::meter>>>(0.0) == d)
     {
         return GetDirLine(sOffset);
     }
 
-    double s = 0.0;
-    Common::Vector2d lastPos;
-    Common::Vector2d delta;
-    Common::Vector2d pos(0.0, a);
+    units::length::meter_t s = 0.0_m;
+    Common::Vector2d<units::length::meter_t> lastPos;
+    Common::Vector2d<units::length::meter_t> delta;
+    Common::Vector2d<units::length::meter_t> pos(0.0_m, a);
 
     while (s < sOffset)
     {
         lastPos = pos;
-        pos.x += 1.0;
+        pos.x += 1.0_m;
         pos.y = a + b * pos.x + c * pos.x * pos.x + d * pos.x * pos.x * pos.x;
 
         delta = pos - lastPos;
-        double deltaLength = delta.Length();
+        units::length::meter_t deltaLength{delta.Length()};
 
-        if (0.0 == deltaLength)
+        if (0.0_m == deltaLength)
         {
             LOG_INTERN(LogLevel::Warning) << "could not calculate road geometry correctly";
-            return 0.0;
+            return 0.0_rad;
         }
 
         if (s + deltaLength > sOffset)
         {
             // rescale last step
-            double scale = (sOffset - s) / deltaLength;
+            units::dimensionless::scalar_t scale = (sOffset - s) / deltaLength;
 
             delta.Scale(scale);
             deltaLength = sOffset - s;
@@ -467,83 +484,91 @@ double RoadGeometryPoly3::GetDir(double sOffset) const
         s += deltaLength;
     }
 
-    Common::Vector2d direction;
-    if (0 < sOffset)
+    Common::Vector2d<units::length::meter_t> direction;
+    if (0_m < sOffset)
     {
         direction = delta;
     }
     else // account for start point
     {
-        direction.x = 1.0;
+        direction.x = 1.0_m;
     }
 
     direction.Rotate(hdg);
-    if (!direction.Norm())
+
+    Common::Vector2d<units::dimensionless::scalar_t> normalizedDirection;
+
+    try
+    {
+        normalizedDirection = direction.Norm();
+    }
+    catch (...)
     {
         LOG_INTERN(LogLevel::Error) << "division by 0";
     }
 
-    if (1.0 < direction.y)
+    if (1.0 < normalizedDirection.y)
     {
-        direction.y = 1.0;
+        normalizedDirection.y = 1.0;
     }
-
-    if (-1.0 > direction.y)
+    else if (-1.0 > normalizedDirection.y)
     {
-        direction.y = -1.0;
+        normalizedDirection.y = -1.0;
     }
 
-    double angle = std::asin(direction.y);
+    direction.y = units::length::meter_t(normalizedDirection.y.value());
 
-    if (0.0 <= direction.x)
+    auto angle = units::math::asin(normalizedDirection.y);
+
+    if (0.0 <= normalizedDirection.x)
     {
         return angle;
     }
     else
     {
-        return M_PI - angle;
+        return 1_rad * M_PI - angle;
     }
 }
 
 //!Maximum distance between two steps for ParamPoly3 calculations
-constexpr double MAXIMUM_DELTALENGTH = 0.1;
+const units::length::meter_t MAXIMUM_DELTALENGTH{0.1};
 
-Common::Vector2d RoadGeometryParamPoly3::GetCoord(double sOffset, double tOffset) const
+Common::Vector2d<units::length::meter_t> RoadGeometryParamPoly3::GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const
 {
-    if (0.0 == parameters.aV && 0.0 == parameters.bV && 0.0 == parameters.cV && 0.0 == parameters.dV)
+    if (0.0_m == parameters.aV && 0.0 == parameters.bV && 0.0_i_m == parameters.cV && units::unit_t<units::inverse<units::squared<units::length::meter>>>(0.0) == parameters.dV)
     {
         return GetCoordLine(sOffset, tOffset);
     }
 
-    double s = 0.0;
-    Common::Vector2d lastPos;
-    Common::Vector2d delta;
-    double p = 0.0;
-    Common::Vector2d pos(parameters.aU, parameters.aV);
+    units::length::meter_t s{0.0};
+    Common::Vector2d<units::length::meter_t> lastPos;
+    Common::Vector2d<units::length::meter_t> delta;
+    units::length::meter_t p{0.0};
+    Common::Vector2d<units::length::meter_t> pos(parameters.aU, parameters.aV);
 
     while (s < sOffset)
     {
         lastPos = pos;
-        double stepSize = 1.0;
-        double deltaLength = std::numeric_limits<double>::max();
+        units::length::meter_t stepSize{1.0};
+        units::length::meter_t deltaLength{std::numeric_limits<double>::max()};
 
         while(deltaLength > MAXIMUM_DELTALENGTH)
         {
-            double p_new = p + stepSize;
+            auto p_new = p + stepSize;
             pos.x = parameters.aU + parameters.bU * p_new + parameters.cU * p_new * p_new + parameters.dU * p_new * p_new * p_new;
             pos.y = parameters.aV + parameters.bV * p_new + parameters.cV * p_new * p_new + parameters.dV * p_new * p_new * p_new;
 
             delta = pos - lastPos;
-            deltaLength = delta.Length();
+            deltaLength = units::length::meter_t(delta.Length());
 
             stepSize *= 0.5;
         }
         p += stepSize;
 
-        if (0.0 == deltaLength)
+        if (0.0_m == deltaLength)
         {
             LOG_INTERN(LogLevel::Warning) << "could not calculate road geometry correctly";
-            return Common::Vector2d();
+            return Common::Vector2d<units::length::meter_t>();
         }
 
         if (s + deltaLength > sOffset)
@@ -558,25 +583,35 @@ Common::Vector2d RoadGeometryParamPoly3::GetCoord(double sOffset, double tOffset
         s += deltaLength;
     }
 
-    Common::Vector2d offset(lastPos + delta);
+    Common::Vector2d<units::length::meter_t> offset(lastPos + delta);
 
-    Common::Vector2d norm;
-    if (0 < sOffset)
+    Common::Vector2d<units::length::meter_t> norm;
+    if (0_m < sOffset)
     {
         norm = delta;
     }
     else // account for start point
     {
-        norm.x = 1.0;
+        norm.x = 1.0_m;
     }
 
-    norm.Rotate(-M_PI_2); // pointing to right side
-    if (!norm.Norm())
+    norm.Rotate(units::angle::radian_t(-M_PI_2)); // pointing to right side
+
+    Common::Vector2d<units::dimensionless::scalar_t> normalizedVector;
+
+    try
+    {
+        normalizedVector = norm.Norm();
+    }
+    catch (...)
     {
         LOG_INTERN(LogLevel::Error) << "division by 0";
     }
 
-    offset.Add(norm * -tOffset);
+    norm.x = normalizedVector.x * -tOffset;
+    norm.y = normalizedVector.y * -tOffset;
+
+    offset.Add(norm);
 
     offset.Rotate(hdg);
 
@@ -585,43 +620,43 @@ Common::Vector2d RoadGeometryParamPoly3::GetCoord(double sOffset, double tOffset
     return offset;
 }
 
-double RoadGeometryParamPoly3::GetDir(double sOffset) const
+units::angle::radian_t RoadGeometryParamPoly3::GetDir(units::length::meter_t sOffset) const
 {
-    double s = 0.0;
-    Common::Vector2d lastPos;
-    Common::Vector2d delta;
-    double p = 0.0;
-    Common::Vector2d pos(parameters.aU, parameters.aV);
+    units::length::meter_t s{0.0};
+    Common::Vector2d<units::length::meter_t> lastPos;
+    Common::Vector2d<units::length::meter_t> delta;
+    units::length::meter_t p{0.0};
+    Common::Vector2d<units::length::meter_t> pos(parameters.aU, parameters.aV);
 
     while (s < sOffset)
     {
         lastPos = pos;
-        double stepSize = 1.0;
-        double deltaLength = std::numeric_limits<double>::max();
+        units::length::meter_t stepSize{1.0};
+        units::length::meter_t deltaLength{std::numeric_limits<double>::max()};
 
         while(deltaLength > MAXIMUM_DELTALENGTH)
         {
-            double p_new = p + stepSize;
+            auto p_new = p + stepSize;
             pos.x = parameters.aU + parameters.bU * p_new + parameters.cU * p_new * p_new + parameters.dU * p_new * p_new * p_new;
             pos.y = parameters.aV + parameters.bV * p_new + parameters.cV * p_new * p_new + parameters.dV * p_new * p_new * p_new;
 
             delta = pos - lastPos;
-            deltaLength = delta.Length();
+            deltaLength = units::length::meter_t(delta.Length());
 
             stepSize *= 0.5;
         }
         p += stepSize;
 
-        if (0.0 == deltaLength)
+        if (0.0_m == deltaLength)
         {
             LOG_INTERN(LogLevel::Warning) << "could not calculate road geometry correctly";
-            return 0.;
+            return 0.0_rad;
         }
 
         if (s + deltaLength > sOffset)
         {
             // rescale last step
-            double scale = (sOffset - s) / deltaLength;
+            units::dimensionless::scalar_t scale = (sOffset - s) / deltaLength;
 
             delta.Scale(scale);
             deltaLength = sOffset - s;
@@ -630,10 +665,10 @@ double RoadGeometryParamPoly3::GetDir(double sOffset) const
         s += deltaLength;
     }
 
-    double dU = parameters.bU + 2 * parameters.cU * p + 3 * parameters.dU * p * p;
-    double dV = parameters.bV + 2 * parameters.cV * p + 3 * parameters.dV * p * p;
+    units::dimensionless::scalar_t dU = parameters.bU + 2 * parameters.cU * p + 3 * parameters.dU * p * p;
+    units::dimensionless::scalar_t dV = parameters.bV + 2 * parameters.cV * p + 3 * parameters.dV * p * p;
 
-    return GetHdg() + atan2(dV, dU);
+    return GetHdg() + units::math::atan2(dV, dU);
 }
 
 Road::~Road()
@@ -674,7 +709,7 @@ Road::~Road()
     }
 }
 
-bool Road::AddGeometryLine(double s, double x, double y, double hdg, double length)
+bool Road::AddGeometryLine(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length)
 {
     RoadGeometry *roadGeometry = new (std::nothrow) RoadGeometryLine(s, x, y, hdg, length);
     if (!roadGeometry)
@@ -687,7 +722,7 @@ bool Road::AddGeometryLine(double s, double x, double y, double hdg, double leng
     return true;
 }
 
-bool Road::AddGeometryArc(double s, double x, double y, double hdg, double length, double curvature)
+bool Road::AddGeometryArc(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvature)
 {
     RoadGeometry *roadGeometry = new (std::nothrow) RoadGeometryArc(s, x, y, hdg, length, curvature);
     if (!roadGeometry)
@@ -700,7 +735,7 @@ bool Road::AddGeometryArc(double s, double x, double y, double hdg, double lengt
     return true;
 }
 
-bool Road::AddGeometrySpiral(double s, double x, double y, double hdg, double length, double curvStart, double curvEnd)
+bool Road::AddGeometrySpiral(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvStart, units::curvature::inverse_meter_t curvEnd)
 {
     RoadGeometry *roadGeometry = new (std::nothrow) RoadGeometrySpiral(s, x, y, hdg, length, curvStart, curvEnd);
     if (!roadGeometry)
@@ -713,8 +748,8 @@ bool Road::AddGeometrySpiral(double s, double x, double y, double hdg, double le
     return true;
 }
 
-bool Road::AddGeometryPoly3(double s, double x, double y, double hdg, double length, double a, double b, double c,
-                            double d)
+bool Road::AddGeometryPoly3(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c,
+                            units::unit_t<units::inverse<units::squared<units::length::meter>>> d)
 {
     RoadGeometry *roadGeometry = new (std::nothrow) RoadGeometryPoly3(s, x, y, hdg, length, a, b, c, d);
     if (!roadGeometry)
@@ -727,7 +762,7 @@ bool Road::AddGeometryPoly3(double s, double x, double y, double hdg, double len
     return true;
 }
 
-bool Road::AddGeometryParamPoly3(double s, double x, double y, double hdg, double length,
+bool Road::AddGeometryParamPoly3(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length,
                                  ParamPoly3Parameters parameters)
 {
     RoadGeometry *roadGeometry = new (std::nothrow) RoadGeometryParamPoly3(s, x, y, hdg, length, parameters);
@@ -741,7 +776,7 @@ bool Road::AddGeometryParamPoly3(double s, double x, double y, double hdg, doubl
     return true;
 }
 
-bool Road::AddElevation(double s, double a, double b, double c, double d)
+bool Road::AddElevation(units::length::meter_t s, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d)
 {
     RoadElevation *roadElevation = new (std::nothrow) RoadElevation(s, a, b, c, d);
     if (!roadElevation)
@@ -754,7 +789,7 @@ bool Road::AddElevation(double s, double a, double b, double c, double d)
     return true;
 }
 
-bool Road::AddLaneOffset(double s, double a, double b, double c, double d)
+bool Road::AddLaneOffset(units::length::meter_t s, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d)
 {
     RoadLaneOffset *roadLaneOffset = new (std::nothrow) RoadLaneOffset(s, a, b, c, d);
     if (!roadLaneOffset)
@@ -781,7 +816,7 @@ bool Road::AddLink(RoadLinkType type, RoadLinkElementType elementType, const std
     return true;
 }
 
-RoadLaneSection *Road::AddRoadLaneSection(double start)
+RoadLaneSection *Road::AddRoadLaneSection(units::length::meter_t start)
 {
     RoadLaneSection *laneSection = new (std::nothrow) RoadLaneSection(this, start);
     laneSections.push_back(laneSection);
@@ -806,11 +841,11 @@ void Road::AddRoadType(const RoadTypeSpecification &info)
     roadTypes.push_back(info);
 }
 
-RoadTypeInformation Road::GetRoadType(double start) const
+RoadTypeInformation Road::GetRoadType(units::length::meter_t start) const
 {
     for (RoadTypeSpecification roadTypeSpec : roadTypes)
     {
-        if (std::abs(roadTypeSpec.s - start) < 1e-6 /* assumed to be equal*/)
+        if (mantle_api::IsEqual(roadTypeSpec.s, start, 1e-6))
         {
             return roadTypeSpec.roadType;
         }
diff --git a/sim/src/core/opSimulation/importer/road.h b/sim/src/core/opSimulation/importer/road.h
index 484aa8c9e23796bc6aba3cd5e40f73dafb8219e9..7e6d23bbad32efb43d631e2f7818b384291acbf7 100644
--- a/sim/src/core/opSimulation/importer/road.h
+++ b/sim/src/core/opSimulation/importer/road.h
@@ -121,7 +121,7 @@ class RoadLane : public RoadLaneInterface
     //!
     //! @return                         False if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddWidth(double sOffset, double a, double b, double c, double d) override;
+    bool AddWidth(units::length::meter_t sOffset, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d) override;
 
     //-----------------------------------------------------------------------------
     //! Adds a new polynomial calculating the border of a lane to a road lane.
@@ -134,7 +134,7 @@ class RoadLane : public RoadLaneInterface
     //!
     //! @return                         False if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddBorder(double sOffset, double a, double b, double c, double d) override;
+    bool AddBorder(units::length::meter_t sOffset, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d) override;
 
     //-----------------------------------------------------------------------------
     //! Adds the ID of a successor lane to a road lane.
@@ -258,7 +258,7 @@ class RoadLane : public RoadLaneInterface
     //!
     //! @return                         False if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddRoadMark(double sOffset, RoadLaneRoadDescriptionType type, RoadLaneRoadMarkType roadMark,
+    bool AddRoadMark(units::length::meter_t sOffset, RoadLaneRoadDescriptionType type, RoadLaneRoadMarkType roadMark,
                      RoadLaneRoadMarkColor color, RoadLaneRoadMarkLaneChange laneChange,
                      RoadLaneRoadMarkWeight weight) override;
 
@@ -284,7 +284,7 @@ class RoadLane : public RoadLaneInterface
     bool inDirection = true;
 
     RoadLaneRoadMarkType roadMarkType = RoadLaneRoadMarkType::Undefined;
-    double roadMarkTypeSOffset;
+    units::length::meter_t roadMarkTypeSOffset;
 
     std::vector<RoadLaneRoadMark *> roadMarks;
 };
@@ -295,7 +295,7 @@ class RoadLane : public RoadLaneInterface
 class RoadLaneSection : public RoadLaneSectionInterface
 {
   public:
-    RoadLaneSection(RoadInterface *road, double start) : road(road), start(start)
+    RoadLaneSection(RoadInterface *road, units::length::meter_t start) : road(road), start(start)
     {
     }
     virtual ~RoadLaneSection() override;
@@ -326,7 +326,7 @@ class RoadLaneSection : public RoadLaneSectionInterface
     //!
     //! @return                         Starting offset of the road lane section
     //-----------------------------------------------------------------------------
-    double GetStart() const override
+    units::length::meter_t GetStart() const override
     {
         return start;
     }
@@ -405,7 +405,7 @@ class RoadLaneSection : public RoadLaneSectionInterface
 
   private:
     RoadInterface *road;
-    const double start;
+    const units::length::meter_t start;
     std::map<int, RoadLaneInterface *> lanes; // use map for sorted ids
     bool inDirection = true;
     int laneIndexOffset = 0;
@@ -419,7 +419,7 @@ class RoadLaneSection : public RoadLaneSectionInterface
 class RoadGeometry : public RoadGeometryInterface
 {
   public:
-    RoadGeometry(double s, double x, double y, double hdg, double length) : s{s}, x{x}, y{y}, hdg{hdg}, length{length}
+    RoadGeometry(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length) : s{s}, x{x}, y{y}, hdg{hdg}, length{length}
     {
     }
     virtual ~RoadGeometry() override = default;
@@ -431,7 +431,7 @@ class RoadGeometry : public RoadGeometryInterface
     //! @param[in]  tOffset    offset to the left
     //! @return                coordinates with the x/y coordinates
     //-----------------------------------------------------------------------------
-    virtual Common::Vector2d GetCoord(double sOffset, double tOffset) const override = 0;
+    virtual Common::Vector2d<units::length::meter_t> GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const override = 0;
 
     //-----------------------------------------------------------------------------
     //! Calculates the heading.
@@ -439,14 +439,14 @@ class RoadGeometry : public RoadGeometryInterface
     //! @param[in]  sOffset    s offset within geometry section
     //! @return                heading
     //-----------------------------------------------------------------------------
-    virtual double GetDir(double sOffset) const override = 0;
+    virtual units::angle::radian_t GetDir(units::length::meter_t sOffset) const override = 0;
 
     //-----------------------------------------------------------------------------
     //! Retrieves the s offset within the OpenDrive road.
     //!
     //! @return s offset
     //-----------------------------------------------------------------------------
-    double GetS() const override
+    units::length::meter_t GetS() const override
     {
         return s;
     }
@@ -456,7 +456,7 @@ class RoadGeometry : public RoadGeometryInterface
     //!
     //! @return initial heading of geometry
     //-----------------------------------------------------------------------------
-    double GetHdg() const override
+    units::angle::radian_t GetHdg() const override
     {
         return hdg;
     }
@@ -466,7 +466,7 @@ class RoadGeometry : public RoadGeometryInterface
     //!
     //! @return length of geometry section
     //-----------------------------------------------------------------------------
-    double GetLength() const override
+    units::length::meter_t GetLength() const override
     {
         return length;
     }
@@ -479,7 +479,7 @@ class RoadGeometry : public RoadGeometryInterface
     //! @param[in]  tOffset    offset to the left
     //! @return                coordinates with the x/y coordinates
     //-----------------------------------------------------------------------------
-    Common::Vector2d GetCoordLine(double sOffset, double tOffset) const;
+    Common::Vector2d<units::length::meter_t> GetCoordLine(units::length::meter_t sOffset, units::length::meter_t tOffset) const;
 
     //-----------------------------------------------------------------------------
     //! Returns the direction of the line, i.e. the start orientation.
@@ -487,7 +487,7 @@ class RoadGeometry : public RoadGeometryInterface
     //! @param[in]  sOffset      offset within geometry section; unused
     //! @return                         direction
     //-----------------------------------------------------------------------------
-    double GetDirLine(double sOffset) const;
+    units::angle::radian_t GetDirLine(units::length::meter_t sOffset) const;
 
     //-----------------------------------------------------------------------------
     //! Gets the coordinate at the s and t offest if the road is an arc.
@@ -497,7 +497,7 @@ class RoadGeometry : public RoadGeometryInterface
     //! @param[in]  curvature  curvature of the arc
     //! @return                coordinates with the x/y coordinates
     //-----------------------------------------------------------------------------
-    Common::Vector2d GetCoordArc(double sOffset, double tOffset, double curvature) const;
+    Common::Vector2d<units::length::meter_t> GetCoordArc(units::length::meter_t sOffset, units::length::meter_t tOffset, units::curvature::inverse_meter_t curvature) const;
 
     //-----------------------------------------------------------------------------
     //! Returns the heading of an arc, i.e. the initial heading plus the fraction
@@ -507,13 +507,13 @@ class RoadGeometry : public RoadGeometryInterface
     //! @param[in]  curvature  curvature of the arc
     //! @return                heading of the arc
     //-----------------------------------------------------------------------------
-    double GetDirArc(double sOffset, double curvature) const;
+    units::angle::radian_t GetDirArc(units::length::meter_t sOffset, units::curvature::inverse_meter_t curvature) const;
 
-    double s;
-    double x;
-    double y;
-    double hdg;
-    double length;
+    units::length::meter_t s;
+    units::length::meter_t x;
+    units::length::meter_t y;
+    units::angle::radian_t hdg;
+    units::length::meter_t length;
 };
 
 //-----------------------------------------------------------------------------
@@ -522,12 +522,12 @@ class RoadGeometry : public RoadGeometryInterface
 class RoadGeometryLine : public RoadGeometry
 {
   public:
-    RoadGeometryLine(double s, double x, double y, double hdg, double length) : RoadGeometry(s, x, y, hdg, length)
+    RoadGeometryLine(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length) : RoadGeometry(s, x, y, hdg, length)
     {
     }
     virtual ~RoadGeometryLine() override = default;
-    virtual Common::Vector2d GetCoord(double sOffset, double tOffset) const override;
-    virtual double GetDir(double sOffset) const override;
+    virtual Common::Vector2d<units::length::meter_t> GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const override;
+    virtual units::angle::radian_t GetDir(units::length::meter_t sOffset) const override;
 };
 
 //-----------------------------------------------------------------------------
@@ -536,26 +536,26 @@ class RoadGeometryLine : public RoadGeometry
 class RoadGeometryArc : public RoadGeometry
 {
   public:
-    RoadGeometryArc(double s, double x, double y, double hdg, double length, double curvature)
+    RoadGeometryArc(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvature)
         : RoadGeometry{s, x, y, hdg, length}, curvature{curvature}
     {
     }
     virtual ~RoadGeometryArc() override = default;
-    virtual Common::Vector2d GetCoord(double sOffset, double tOffset) const override;
-    virtual double GetDir(double sOffset) const override;
+    virtual Common::Vector2d<units::length::meter_t> GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const override;
+    virtual units::angle::radian_t GetDir(units::length::meter_t sOffset) const override;
 
     //-----------------------------------------------------------------------------
     //! Returns the stored curvature.
     //!
     //! @return                         curvature
     //-----------------------------------------------------------------------------
-    double GetCurvature() const
+    units::curvature::inverse_meter_t GetCurvature() const
     {
         return curvature;
     }
 
   private:
-    double curvature;
+    units::curvature::inverse_meter_t curvature;
 };
 
 //-----------------------------------------------------------------------------
@@ -564,10 +564,10 @@ class RoadGeometryArc : public RoadGeometry
 class RoadGeometrySpiral : public RoadGeometry
 {
 public:
-    RoadGeometrySpiral(double s, double x, double y, double hdg, double length, double curvStart, double curvEnd);
+    RoadGeometrySpiral(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvStart, units::curvature::inverse_meter_t curvEnd);
     virtual ~RoadGeometrySpiral() override = default;
-    virtual Common::Vector2d GetCoord(double sOffset, double tOffset) const override;
-    virtual double GetDir(double sOffset) const override;
+    virtual Common::Vector2d<units::length::meter_t> GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const override;
+    virtual units::angle::radian_t GetDir(units::length::meter_t sOffset) const override;
 
 private:
     //-----------------------------------------------------------------------------
@@ -577,7 +577,7 @@ private:
     //! @param[in]  tOffset    offset to the left
     //! @return     vector with the x/y coordinates
     //-----------------------------------------------------------------------------
-    Common::Vector2d FullCoord(double sOffset, double tOffset) const;
+    Common::Vector2d<units::length::meter_t> FullCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const;
 
     //-----------------------------------------------------------------------------
     //! Calculates the curvature.
@@ -585,7 +585,7 @@ private:
     //! @param[in]  sOffset    s offset within geometry section
     //! @return                curvature
     //-----------------------------------------------------------------------------
-    double FullCurvature(double sOffset) const;
+    units::curvature::inverse_meter_t FullCurvature(units::length::meter_t sOffset) const;
 
     //-----------------------------------------------------------------------------
     //! Calculates the direction.
@@ -593,16 +593,16 @@ private:
     //! @param[in]  sOffset    s offset within geometry section
     //! @return                direction
     //-----------------------------------------------------------------------------
-    double FullDir(double sOffset) const;
+    units::angle::radian_t FullDir(units::length::meter_t sOffset) const;
 
 
-    double c_start;  //!< spiral starting curvature
-    double c_end;    //!< spiral end curvature
-    double a;        //!< clothoid parameter of spiral
+    units::curvature::inverse_meter_t c_start;  //!< spiral starting curvature
+    units::curvature::inverse_meter_t c_end;    //!< spiral end curvature
+    units::length::meter_t a;        //!< clothoid parameter of spiral
     double sign;     //!< direction of curvature change (needes to correct Fresnel integral results)
-    double c_dot;    //!< change of curvature per unit
-    double l_start;  //!< offset of starting point along spiral
-    double t_start;  //!< tangent angle at start point
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> c_dot;    //!< change of curvature per unit
+    units::length::meter_t l_start;  //!< offset of starting point along spiral
+    units::angle::radian_t t_start;  //!< tangent angle at start point
 };
 
 //-----------------------------------------------------------------------------
@@ -611,20 +611,20 @@ private:
 class RoadGeometryPoly3 : public RoadGeometry
 {
   public:
-    RoadGeometryPoly3(double s, double x, double y, double hdg, double length, double a, double b, double c, double d)
+    RoadGeometryPoly3(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d)
         : RoadGeometry(s, x, y, hdg, length), a(a), b(b), c(c), d(d)
     {
     }
     virtual ~RoadGeometryPoly3() override = default;
-    virtual Common::Vector2d GetCoord(double sOffset, double tOffset) const override;
-    virtual double GetDir(double sOffset) const override;
+    virtual Common::Vector2d<units::length::meter_t> GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const override;
+    virtual units::angle::radian_t GetDir(units::length::meter_t sOffset) const override;
 
     //-----------------------------------------------------------------------------
     //! Returns the constant factor of the polynomial.
     //!
     //! @return                         constant factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetA() const
+    units::length::meter_t GetA() const
     {
         return a;
     }
@@ -644,7 +644,7 @@ class RoadGeometryPoly3 : public RoadGeometry
     //!
     //! @return                         quadratic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetC() const
+    units::unit_t<units::inverse<units::length::meter>> GetC() const
     {
         return c;
     }
@@ -654,16 +654,16 @@ class RoadGeometryPoly3 : public RoadGeometry
     //!
     //! @return                         cubic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetD() const
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> GetD() const
     {
         return d;
     }
 
   private:
-    double a;
+    units::length::meter_t a;
     double b;
-    double c;
-    double d;
+    units::unit_t<units::inverse<units::length::meter>> c;
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> d;
 };
 
 //-----------------------------------------------------------------------------
@@ -672,20 +672,20 @@ class RoadGeometryPoly3 : public RoadGeometry
 class RoadGeometryParamPoly3 : public RoadGeometry
 {
   public:
-    RoadGeometryParamPoly3(double s, double x, double y, double hdg, double length, ParamPoly3Parameters parameters)
+    RoadGeometryParamPoly3(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, ParamPoly3Parameters parameters)
         : RoadGeometry(s, x, y, hdg, length), parameters(parameters)
     {
     }
     virtual ~RoadGeometryParamPoly3() override = default;
-    virtual Common::Vector2d GetCoord(double sOffset, double tOffset) const override;
-    virtual double GetDir(double sOffset) const override;
+    virtual Common::Vector2d<units::length::meter_t> GetCoord(units::length::meter_t sOffset, units::length::meter_t tOffset) const override;
+    virtual units::angle::radian_t GetDir(units::length::meter_t sOffset) const override;
 
     //-----------------------------------------------------------------------------
     //! Returns the constant factor of the polynomial for the u coordinate.
     //!
     //! @return                         constant factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetAU() const
+    units::length::meter_t GetAU() const
     {
         return parameters.aU;
     }
@@ -695,7 +695,7 @@ class RoadGeometryParamPoly3 : public RoadGeometry
     //!
     //! @return                         linear factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetBU() const
+    units::dimensionless::scalar_t GetBU() const
     {
         return parameters.bU;
     }
@@ -705,7 +705,7 @@ class RoadGeometryParamPoly3 : public RoadGeometry
     //!
     //! @return                         quadratic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetCU() const
+    units::curvature::inverse_meter_t GetCU() const
     {
         return parameters.cU;
     }
@@ -715,7 +715,7 @@ class RoadGeometryParamPoly3 : public RoadGeometry
     //!
     //! @return                         cubic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetD() const
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> GetD() const
     {
         return parameters.dU;
     }
@@ -725,7 +725,7 @@ class RoadGeometryParamPoly3 : public RoadGeometry
     //!
     //! @return                         constant factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetAV() const
+    units::length::meter_t GetAV() const
     {
         return parameters.aV;
     }
@@ -735,7 +735,7 @@ class RoadGeometryParamPoly3 : public RoadGeometry
     //!
     //! @return                         linear factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetBV() const
+    units::dimensionless::scalar_t GetBV() const
     {
         return parameters.bV;
     }
@@ -745,7 +745,7 @@ class RoadGeometryParamPoly3 : public RoadGeometry
     //!
     //! @return                         quadratic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetCV() const
+    units::curvature::inverse_meter_t GetCV() const
     {
         return parameters.cV;
     }
@@ -755,7 +755,7 @@ class RoadGeometryParamPoly3 : public RoadGeometry
     //!
     //! @return                         cubic factor of the polynomial
     //-----------------------------------------------------------------------------
-    double GetDV() const
+    units::unit_t<units::inverse<units::squared<units::length::meter>>> GetDV() const
     {
         return parameters.dV;
     }
@@ -786,7 +786,7 @@ class Road : public RoadInterface
     //! @param[in]  length              length of the element's reference line
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddGeometryLine(double s, double x, double y, double hdg, double length) override;
+    bool AddGeometryLine(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length) override;
 
     //-----------------------------------------------------------------------------
     //! Adds an arc geometry to a road by creating a new RoadGeometryArc object and
@@ -800,7 +800,7 @@ class Road : public RoadInterface
     //! @param[in]  curvature           constant curvature throughout the element
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddGeometryArc(double s, double x, double y, double hdg, double length, double curvature) override;
+    bool AddGeometryArc(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvature) override;
 
     //-----------------------------------------------------------------------------
     //! Adds a spiral geometry to a road by creating a new RoadGeometrySpiral object and
@@ -815,8 +815,8 @@ class Road : public RoadInterface
     //! @param[in]  curvEnd             curvature at the end of the element
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddGeometrySpiral(double s, double x, double y, double hdg, double length, double curvStart,
-                           double curvEnd) override;
+    bool AddGeometrySpiral(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvStart,
+                           units::curvature::inverse_meter_t curvEnd) override;
 
     //-----------------------------------------------------------------------------
     //! Adds a cubic polynomial geometry to a road by creating a new RoadGeometryPoly3
@@ -833,8 +833,8 @@ class Road : public RoadInterface
     //! @param[in]  d                   cubic factor of the polynomial
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddGeometryPoly3(double s, double x, double y, double hdg, double length, double a, double b, double c,
-                          double d) override;
+    bool AddGeometryPoly3(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c,
+                          units::unit_t<units::inverse<units::squared<units::length::meter>>> d) override;
 
     //-----------------------------------------------------------------------------
     //! Adds a parametric cubic polynomial geometry to a road by creating a new
@@ -849,7 +849,7 @@ class Road : public RoadInterface
     //! @param[in]  parameters          Factors of the two polynomials describing the road
     //! @return                          false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddGeometryParamPoly3(double s, double x, double y, double hdg, double length,
+    bool AddGeometryParamPoly3(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length,
                                ParamPoly3Parameters parameters) override;
 
     //-----------------------------------------------------------------------------
@@ -863,7 +863,7 @@ class Road : public RoadInterface
     //! @param[in]  d                   cubic factor of the polynomial
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddElevation(double s, double a, double b, double c, double d) override;
+    bool AddElevation(units::length::meter_t s, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d) override;
 
     //-----------------------------------------------------------------------------
     //! Adds a lane offset defined via a cubic polynomial to a road by creating a new
@@ -876,7 +876,7 @@ class Road : public RoadInterface
     //! @param[in]  d                   cubic factor of the polynomial
     //! @return                         false if an error has occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool AddLaneOffset(double s, double a, double b, double c, double d) override;
+    bool AddLaneOffset(units::length::meter_t s, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d) override;
 
     //-----------------------------------------------------------------------------
     //! Adds a new link to a road by creating a new RoadLink object and adding it
@@ -902,7 +902,7 @@ class Road : public RoadInterface
     //! @param[in]  start               start position s-coordinate
     //! @return                         created road lane section
     //-----------------------------------------------------------------------------
-    RoadLaneSection *AddRoadLaneSection(double start) override;
+    RoadLaneSection *AddRoadLaneSection(units::length::meter_t start) override;
 
     //-----------------------------------------------------------------------------
     //! Adds a new signal a road by creating a new RoadSignal object
@@ -916,7 +916,7 @@ class Road : public RoadInterface
 
     void AddRoadObject(const RoadObjectSpecification &object) override;
 
-    RoadTypeInformation GetRoadType(double start) const override;
+    RoadTypeInformation GetRoadType(units::length::meter_t start) const override;
 
     //-----------------------------------------------------------------------------
     //! Returns the ID of the road.
diff --git a/sim/src/core/opSimulation/importer/road/roadObject.cpp b/sim/src/core/opSimulation/importer/road/roadObject.cpp
index e4c51db05c8d2cb265b6411f1b9825c34c0997e8..ac3913c88fb1b16b2e59d4c7503dcf2658eee011 100644
--- a/sim/src/core/opSimulation/importer/road/roadObject.cpp
+++ b/sim/src/core/opSimulation/importer/road/roadObject.cpp
@@ -15,12 +15,12 @@ RoadObjectType RoadObject::GetType() const
     return object.type;
 }
 
-double RoadObject::GetLength() const
+units::length::meter_t RoadObject::GetLength() const
 {
     return object.length;
 }
 
-double RoadObject::GetWidth() const
+units::length::meter_t RoadObject::GetWidth() const
 {
     return object.width;
 }
@@ -30,22 +30,22 @@ bool RoadObject::IsContinuous() const
     return object.continuous;
 }
 
-double RoadObject::GetHdg() const
+units::angle::radian_t RoadObject::GetHdg() const
 {
     return object.hdg;
 }
 
-double RoadObject::GetHeight() const
+units::length::meter_t RoadObject::GetHeight() const
 {
     return object.height;
 }
 
-double RoadObject::GetPitch() const
+units::angle::radian_t RoadObject::GetPitch() const
 {
     return object.pitch;
 }
 
-double RoadObject::GetRoll() const
+units::angle::radian_t RoadObject::GetRoll() const
 {
     return object.roll;
 }
@@ -55,17 +55,17 @@ std::string RoadObject::GetId() const
     return object.id;
 }
 
-double RoadObject::GetS() const
+units::length::meter_t RoadObject::GetS() const
 {
     return object.s;
 }
 
-double RoadObject::GetT() const
+units::length::meter_t RoadObject::GetT() const
 {
     return object.t;
 }
 
-double RoadObject::GetZOffset() const
+units::length::meter_t RoadObject::GetZOffset() const
 {
     return object.zOffset;
 }
diff --git a/sim/src/core/opSimulation/importer/road/roadObject.h b/sim/src/core/opSimulation/importer/road/roadObject.h
index d04151a207e53a9dd84abbd124f48f07f05bb428..28f5862794ea0efa1f31eaa3650e8109814c0be1 100644
--- a/sim/src/core/opSimulation/importer/road/roadObject.h
+++ b/sim/src/core/opSimulation/importer/road/roadObject.h
@@ -32,29 +32,29 @@ public:
     //! @brief Returns the s coordinate of the road object
     //! @return                     s coordinate [m]
     //-----------------------------------------------------------------------------
-    double GetS() const;
+    units::length::meter_t GetS() const;
 
     //-----------------------------------------------------------------------------
     //! @brief Returns the t coordinate of the road object
     //! @return                     t coordinate [m]
     //-----------------------------------------------------------------------------
-    double GetT() const;
+    units::length::meter_t GetT() const;
 
     //-----------------------------------------------------------------------------
     //! @brief Returns the zOffset of the road object
     //! @return                     zOffset [m]
     //-----------------------------------------------------------------------------
-    double GetZOffset() const;
+    units::length::meter_t GetZOffset() const;
 
     //-----------------------------------------------------------------------------
     //! @brief Returns the heading of the road object (relative to road direction)
     //! @return                     heading [rad]
     //-----------------------------------------------------------------------------
-    double GetHdg() const;
+    units::angle::radian_t GetHdg() const;
 
-    virtual double GetHeight() const;
-    virtual double GetPitch() const;
-    virtual double GetRoll() const;
+    virtual units::length::meter_t GetHeight() const;
+    virtual units::angle::radian_t GetPitch() const;
+    virtual units::angle::radian_t GetRoll() const;
 
     //-----------------------------------------------------------------------------
     //! @brief Check, if road object is valid for provided lane id
@@ -75,13 +75,13 @@ public:
     //! @brief Returns the length of the road object
     //! @return                     length [m]
     //-----------------------------------------------------------------------------
-    double GetLength() const;
+    units::length::meter_t GetLength() const;
 
     //-----------------------------------------------------------------------------
     //! @brief Returns the width of the road object
     //! @return                     width [m]
     //-----------------------------------------------------------------------------
-    double GetWidth() const;
+    units::length::meter_t GetWidth() const;
 
     bool IsContinuous() const override;
 
diff --git a/sim/src/core/opSimulation/importer/road/roadSignal.cpp b/sim/src/core/opSimulation/importer/road/roadSignal.cpp
index 16249039b8a05e3f34e7f94a6abc088c1dffdd8a..0b5632e187bd5af9e20d11518e343dc03ce2b442 100644
--- a/sim/src/core/opSimulation/importer/road/roadSignal.cpp
+++ b/sim/src/core/opSimulation/importer/road/roadSignal.cpp
@@ -45,12 +45,12 @@ std::string RoadSignal::GetText() const
     return signal.text;
 }
 
-double RoadSignal::GetS() const
+units::length::meter_t RoadSignal::GetS() const
 {
     return signal.s;
 }
 
-double RoadSignal::GetT() const
+units::length::meter_t RoadSignal::GetT() const
 {
     return signal.t;
 }
@@ -61,22 +61,22 @@ bool RoadSignal::IsValidForLane(int laneId) const
       ( std::find( signal.validity.lanes.begin(), signal.validity.lanes.end(), laneId) != signal.validity.lanes.end() );
 }
 
-double RoadSignal::GetHeight() const
+units::length::meter_t RoadSignal::GetHeight() const
 {
     return signal.height;
 }
 
-double RoadSignal::GetWidth() const
+units::length::meter_t RoadSignal::GetWidth() const
 {
     return signal.width;
 }
 
-double RoadSignal::GetPitch() const
+units::angle::radian_t RoadSignal::GetPitch() const
 {
    return signal.pitch;
 }
 
-double RoadSignal::GetRoll() const
+units::angle::radian_t RoadSignal::GetRoll() const
 {
     return signal.roll;
 }
@@ -91,7 +91,7 @@ std::vector<std::string> RoadSignal::GetDependencies() const
     return signal.dependencyIds;
 }
 
-double RoadSignal::GetZOffset() const
+units::length::meter_t RoadSignal::GetZOffset() const
 {
     return signal.zOffset;
 }
@@ -101,7 +101,7 @@ bool RoadSignal::GetOrientation() const
     return signal.orientation == "+";
 }
 
-double RoadSignal::GetHOffset() const
+units::angle::radian_t RoadSignal::GetHOffset() const
 {
     return signal.hOffset;
 }
diff --git a/sim/src/core/opSimulation/importer/road/roadSignal.h b/sim/src/core/opSimulation/importer/road/roadSignal.h
index 103e2a473b650dea5f0c40a35777b364f470ebf0..492b5cde41b57471493f34dee61e514ec1eac90a 100644
--- a/sim/src/core/opSimulation/importer/road/roadSignal.h
+++ b/sim/src/core/opSimulation/importer/road/roadSignal.h
@@ -30,8 +30,8 @@ public:
     double GetValue() const override;
     RoadSignalUnit GetUnit() const override;
     std::string GetText() const override;
-    double GetS() const override;
-    double GetT() const override;
+    units::length::meter_t GetS() const override;
+    units::length::meter_t GetT() const override;
 
     //-----------------------------------------------------------------------------
     //! Returns the road from which this section is a part of.
@@ -44,19 +44,19 @@ public:
     }
 
     bool IsValidForLane(int laneId) const override;
-    virtual double GetHeight() const override;
-    virtual double GetWidth() const override;
-    virtual double GetPitch() const;
-    virtual double GetRoll() const;
+    virtual units::length::meter_t GetHeight() const override;
+    virtual units::length::meter_t GetWidth() const override;
+    virtual units::angle::radian_t GetPitch() const;
+    virtual units::angle::radian_t GetRoll() const;
     virtual bool GetIsDynamic() const override;
 
     virtual std::vector<std::string> GetDependencies() const override;
 
-    virtual double GetZOffset() const override;
+    virtual units::length::meter_t GetZOffset() const override;
 
     virtual bool GetOrientation() const override;
 
-    virtual double GetHOffset() const override;
+    virtual units::angle::radian_t GetHOffset() const override;
 
 private:
     RoadInterface* road;
diff --git a/sim/src/core/opSimulation/importer/scenario.cpp b/sim/src/core/opSimulation/importer/scenario.cpp
deleted file mode 100644
index 147a15e5f3eb56e779b841fbc2d7725b5ced19cd..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/scenario.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-#include "scenario.h"
-#include <algorithm>
-#include <qglobal.h>
-
-namespace Configuration {
-
-const std::string& Scenario::GetVehicleCatalogPath() const
-{
-    return vehicleCatalogPath;
-}
-
-void Scenario::SetVehicleCatalogPath(const std::string& catalogPath)
-{
-    this->vehicleCatalogPath = catalogPath;
-}
-
-const std::string& Scenario::GetPedestrianCatalogPath() const
-{
-    return pedestrianCatalogPath;
-}
-
-void Scenario::SetPedestrianCatalogPath(const std::string& catalogPath)
-{
-    this->pedestrianCatalogPath = catalogPath;
-}
-
-const std::string& Scenario::GetTrajectoryCatalogPath() const
-{
-    return trajectoryCatalogPath;
-}
-
-void Scenario::SetTrajectoryCatalogPath(const std::string& catalogPath)
-{
-    trajectoryCatalogPath = catalogPath;
-}
-
-const std::string& Scenario::GetSceneryPath() const
-{
-    return sceneryPath;
-}
-
-void Scenario::SetSceneryPath(const std::string& sceneryPath)
-{
-    this->sceneryPath = sceneryPath;
-}
-
-const SceneryDynamicsInterface &Scenario::GetSceneryDynamics() const
-{
-    return sceneryDynamics;
-}
-
-void Scenario::AddTrafficSignalController(const openScenario::TrafficSignalController &controller)
-{
-    sceneryDynamics.AddTrafficSignalController(controller);
-}
-
-void Scenario::AddScenarioEntity(const ScenarioEntity& entity)
-{
-    entities.push_back(entity);
-}
-
-void Scenario::AddScenarioGroupsByEntityNames(const std::map<std::string, std::vector<std::string>> &groupDefinitions)
-{
-    std::vector<ScenarioEntity*> groupEntities;
-    for (auto groupDefinition : groupDefinitions)
-    {
-        for (const auto &memberName : groupDefinition.second)
-        {
-            const auto groupEntityIterator = std::find_if(entities.begin(),
-                                                          entities.end(),
-                                                          [&memberName](const auto entity)
-                                                          {
-                                                            return entity.name == memberName;
-                                                          });
-            groupEntities.push_back(&(*groupEntityIterator));
-        }
-
-        scenarioGroups.insert({groupDefinition.first, groupEntities});
-    }
-}
-
-const std::vector<ScenarioEntity> &Scenario::GetEntities() const
-{
-    return entities;
-}
-
-const std::vector<ScenarioEntity*> &Scenario::GetScenarioEntities() const
-{
-    try
-    {
-        return scenarioGroups.at("ScenarioAgents");
-    }
-    catch (const std::out_of_range& err)
-    {
-        Q_UNUSED(err);
-        throw std::runtime_error("ScenarioAgents group not found.");
-    }
-}
-
-const std::map<std::string, std::vector<ScenarioEntity*>> &Scenario::GetScenarioGroups() const
-{
-    return scenarioGroups;
-}
-
-void Scenario::AddConditionalEventDetector(const openScenario::ConditionalEventDetectorInformation &eventDetectorInformation)
-{
-    eventDetectorInformations.emplace_back(eventDetectorInformation);
-}
-
-void Scenario::AddAction(const openScenario::Action action, const std::string eventName)
-{
-    actions.emplace_back(action, eventName);
-}
-
-const std::vector<openScenario::ConditionalEventDetectorInformation>& Scenario::GetEventDetectorInformations() const
-{
-    return eventDetectorInformations;
-}
-
-std::vector<openScenario::ManipulatorInformation> Scenario::GetActions() const
-{
-    return actions;
-}
-
-int Scenario::GetEndTime() const
-{
-    // we add plus one here to align with the "greater_than" rule
-    // Time is parsed in seconds, but we use ms internally (* 1000)
-    return static_cast<int>((std::rint(endTimeInSeconds * 1000))) + 1;
-}
-
-void Scenario::SetEndTime(const double endTime)
-{
-    this->endTimeInSeconds = endTime;
-}
-
-void Scenario::SetEnvironment(const openScenario::EnvironmentAction& environment)
-{
-    sceneryDynamics.SetEnvironment(environment);
-}
-
-} // namespace core
diff --git a/sim/src/core/opSimulation/importer/scenario.h b/sim/src/core/opSimulation/importer/scenario.h
deleted file mode 100644
index ffdfba00721f9b221b4a0e1ae2524749db0efc39..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/scenario.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-//-----------------------------------------------------------------------------
-//! @file  Scenario.h
-//! @brief This file contains all information for the choosen scenario
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <string>
-#include "common/globalDefinitions.h"
-#include "common/eventDetectorDefinitions.h"
-#include "common/opExport.h"
-#include "include/scenarioInterface.h"
-#include "sceneryDynamics.h"
-
-namespace Configuration {
-
-class SIMULATIONCOREEXPORT Scenario : public ScenarioInterface
-{
-public:
-    Scenario() = default;
-    Scenario(const Scenario&) = delete;
-    Scenario(Scenario&&) = delete;
-    Scenario& operator=(const Scenario&) = delete;
-    Scenario& operator=(Scenario&&) = delete;
-    virtual ~Scenario() override = default;
-
-    /*!
-     * \brief Getter for vehicle catalog path
-     *
-     * \return The relative file path to the OpenSCENARIO vehicle catalog in use
-     */
-    const std::string& GetVehicleCatalogPath() const override;
-
-    /*!
-     * \brief Setter for vehicle catalog path
-     *
-     * \param[in]   catalogPath     Relative file path to the OpenSCENARIO vehicle catalog to use
-     */
-    void SetVehicleCatalogPath(const std::string& catalogPath) override;
-
-    /*!
-     * \brief Getter for pedestrian catalog path
-     *
-     * \return The relative file path to the OpenSCENARIO pedestrian catalog in use
-     */
-    const std::string& GetPedestrianCatalogPath() const override;
-
-    /*!
-     * \brief Setter for pedestrian catalog path
-     *
-     * \param[in]   catalogPath     Relative file path to the OpenSCENARIO pedestrian catalog to use
-     */
-    void SetPedestrianCatalogPath(const std::string& catalogPath) override;
-
-    //-----------------------------------------------------------------------------
-    //! \brief Retreives the path to the trajectory catalog file
-    //!
-    //! \return     Relative path to the trajectory catalog
-    //-----------------------------------------------------------------------------
-    const std::string& GetTrajectoryCatalogPath() const override;
-
-    //-----------------------------------------------------------------------------
-    //! Sets the path to the trajectory catalog file
-    //!
-    //! \param[in]      catalogPath     Relative path to the trajectory catalog file
-    //-----------------------------------------------------------------------------
-    void SetTrajectoryCatalogPath(const std::string& catalogPath) override;
-
-    /*!
-     * \brief Getter for scenery path
-     *
-     * \return The relative file path to the OpenDRIVE scenery in use
-     */
-    const std::string& GetSceneryPath() const override;
-
-    /*!
-     * \brief Setter for scenery path
-     *
-     * \param[in]   sceneryPath     Relative file path to the OpenDRIVE scenery to use
-     */
-    void SetSceneryPath(const std::string& sceneryPath) override;
-
-    const SceneryDynamicsInterface& GetSceneryDynamics() const override;
-
-    void AddTrafficSignalController (const openScenario::TrafficSignalController& controller) override;
-
-    void AddScenarioEntity(const ScenarioEntity& entity) override;
-    void AddScenarioGroupsByEntityNames(const std::map<std::string, std::vector<std::string>> &groupDefinitions) override;
-
-    const std::vector<ScenarioEntity> &GetEntities() const override;
-    const std::vector<ScenarioEntity*> &GetScenarioEntities() const override;
-    const std::map<std::string, std::vector<ScenarioEntity*>> &GetScenarioGroups() const override;
-
-    void AddConditionalEventDetector(const openScenario::ConditionalEventDetectorInformation &eventDetectorInformation) override;
-    void AddAction(const openScenario::Action action, const std::string eventName) override;
-
-    std::string GetEventDetectorLibraryName();
-    const std::vector<openScenario::ConditionalEventDetectorInformation>& GetEventDetectorInformations() const override;
-
-    std::string GetManipulatorLibraryName();
-    std::vector<openScenario::ManipulatorInformation> GetActions() const override;
-
-    int GetEndTime() const override;
-    void SetEndTime(const double endTime) override;
-
-    void SetEnvironment(const openScenario::EnvironmentAction &environment) override;
-
-private:
-    ScenarioEntity egoEntity;
-    std::vector<ScenarioEntity> entities;
-    std::map<std::string, std::vector<ScenarioEntity*>> scenarioGroups;
-
-    std::vector<openScenario::ConditionalEventDetectorInformation> eventDetectorInformations;
-    std::vector<openScenario::ManipulatorInformation> actions;
-    SceneryDynamics sceneryDynamics;
-
-    std::string vehicleCatalogPath;     //!< The path of the vehicle catalog (relative to Scenario.xosc)
-    std::string pedestrianCatalogPath;  //!< The path of the pedestrian catalog (relative to Scenario.xosc)
-    std::string trajectoryCatalogPath;  //!< The path of the trajectory catalog (relative to Scenario.xosc)
-    std::string sceneryPath;            //!< The path of the scenery file (relative to Scenario.xosc)
-
-    double endTimeInSeconds; //!< The simulationTime at which the simulation should end
-};
-
-
-} // namespace core
-
-
diff --git a/sim/src/core/opSimulation/importer/scenarioImporter.cpp b/sim/src/core/opSimulation/importer/scenarioImporter.cpp
deleted file mode 100644
index c14889268665ef0fbe9aa27eb4cef8bf122e25c2..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/scenarioImporter.cpp
+++ /dev/null
@@ -1,704 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2018 ITK Engineering GmbH
- *               2017-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include <memory>
-#include <iostream>
-#include <queue>
-#include <QDomDocument>
-#include <QDir>
-#include <QFile>
-#include <QFileInfo>
-
-#include "eventDetectorImporter.h"
-#include "scenario.h"
-#include "scenarioImporter.h"
-#include "importer/importerCommon.h"
-#include "directories.h"
-#include "common/openPassUtils.h"
-#include "scenarioImporterHelper.h"
-
-namespace TAG = openpass::importer::xml::scenarioImporter::tag;
-namespace ATTRIBUTE = openpass::importer::xml::scenarioImporter::attribute;
-namespace RULE = openpass::importer::xml::openScenario::rule;
-namespace DYNAMICSSHAPE = openpass::importer::xml::openScenario::dynamicsShape;
-namespace DYNAMICSDIMENSION = openpass::importer::xml::openScenario::dynamicsDimension;
-
-using Directories = openpass::core::Directories;
-
-using namespace openScenario;
-
-namespace Importer {
-
-bool ScenarioImporter::Import(const std::string& filename, ScenarioInterface* scenario)
-{
-    try
-    {
-        std::locale::global(std::locale("C"));
-
-        QFile xmlFile(filename.c_str()); // automatic object will be closed on destruction
-        ThrowIfFalse(xmlFile.open(QIODevice::ReadOnly), "Could not open scenario (" + filename + ")");
-
-        QByteArray xmlData(xmlFile.readAll());
-        QDomDocument document;
-        QString errorMsg{};
-        int errorLine{};
-        ThrowIfFalse(document.setContent(xmlData, &errorMsg, &errorLine), "Invalid xml format (" + filename + ") in line " + std::to_string(errorLine) + ": " + errorMsg.toStdString());
-
-        QDomElement documentRoot = document.documentElement();
-        ThrowIfFalse(!documentRoot.isNull(), "Scenario xml has no document root");
-
-        openScenario::Parameters parameters;
-
-        QDomElement parameterDeclarationElement;
-
-        if (SimulationCommon::GetFirstChildElement(documentRoot, TAG::parameterDeclarations, parameterDeclarationElement))
-        {
-            ImportParameterDeclarationElement(parameterDeclarationElement, parameters);
-        }
-
-        ImportAndValidateVersion(parameters);
-
-        ImportRoadNetwork(documentRoot, scenario, parameters);
-
-        auto path = Directories::StripFile(filename);
-        ImportCatalogs(documentRoot, scenario, path, parameters);
-
-        std::vector<ScenarioEntity> entities;
-        std::map<std::string, std::vector<std::string>> groups;
-        ImportEntities(documentRoot, entities, groups, parameters);
-
-        ImportStoryboard(documentRoot, entities, scenario, parameters);
-        CategorizeEntities(entities, groups, scenario);
-
-        return true;
-    }
-    catch(std::runtime_error& e)
-    {
-        LOG_INTERN(LogLevel::Error) << "Scenario import failed: " + std::string(e.what());
-        return false;
-    }
-}
-
-void ScenarioImporter::ImportAndValidateVersion(openScenario::Parameters& parameters)
-{
-    const std::string VERSION_ATTRIBUTE{"OP_OSC_SchemaVersion"};
-    ThrowIfFalse(parameters.count(VERSION_ATTRIBUTE), "Cannot determine scenario version");
-    const auto version = std::get<std::string>(parameters.at(VERSION_ATTRIBUTE));
-    ThrowIfFalse(version == supportedScenarioVersion,
-                 "Scenario version not supported (" + version + "). Supported version is " + supportedScenarioVersion);
-}
-
-void ScenarioImporter::ImportCatalogs(QDomElement& documentRoot, ScenarioInterface* scenario, const std::string& path, openScenario::Parameters& parameters)
-{
-    QDomElement catalogsElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(documentRoot, TAG::catalogLocations, catalogsElement),
-                 documentRoot, "Tag " + std::string(TAG::catalogLocations) + " is missing.");
-
-    const auto vehicleCatalogPath = ImportCatalog(TAG::vehicleCatalog, catalogsElement, parameters);
-    scenario->SetVehicleCatalogPath(vehicleCatalogPath);
-
-    const auto pedestrianCatalogPath = ImportCatalog(TAG::pedestrianCatalog, catalogsElement, parameters);
-    scenario->SetPedestrianCatalogPath(pedestrianCatalogPath);
-
-    auto trajectoryCatalogPath = ImportCatalog(TAG::trajectoryCatalog, catalogsElement, parameters);
-
-    if (Directories::IsRelative(trajectoryCatalogPath))
-    {
-        trajectoryCatalogPath = Directories::Concat(path, trajectoryCatalogPath);
-    }
-
-    scenario->SetTrajectoryCatalogPath(trajectoryCatalogPath);
-}
-
-void ScenarioImporter::ImportRoadNetwork(QDomElement& documentRoot, ScenarioInterface *scenario, openScenario::Parameters& parameters)
-{
-    QDomElement roadNetworkElement;
-    QDomElement logicsElement;
-    QDomElement trafficSignalsElement;
-    QDomElement trafficSignalControllerElement;
-
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(documentRoot, TAG::roadNetwork, roadNetworkElement),
-                 documentRoot, "Tag " + std::string(TAG::roadNetwork) + " is missing.");
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(roadNetworkElement, TAG::logicFile, logicsElement),
-                 roadNetworkElement, "Tag " + std::string(TAG::logicFile) + " is missing.");
-    scenario->SetSceneryPath(ParseAttribute<std::string>(logicsElement, ATTRIBUTE::filepath, parameters));
-
-    if(SimulationCommon::GetFirstChildElement(roadNetworkElement, TAG::trafficSignals, trafficSignalsElement));
-    {
-        SimulationCommon::GetFirstChildElement(trafficSignalsElement, TAG::trafficSignalController, trafficSignalControllerElement);
-        while (!trafficSignalControllerElement.isNull())
-        {
-            openScenario::TrafficSignalController controller;
-            ImportTrafficSignalsElement(trafficSignalControllerElement, controller, parameters);
-            scenario->AddTrafficSignalController(controller);
-
-            trafficSignalControllerElement = trafficSignalControllerElement.nextSiblingElement(TAG::trafficSignalController);
-        }
-    }
-}
-
-void ScenarioImporter::ImportTrafficSignalsElement(QDomElement &trafficSignalControllerElement, openScenario::TrafficSignalController &controller, Parameters &parameters)
-{
-    controller.name = ParseAttribute<std::string>(trafficSignalControllerElement, ATTRIBUTE::name, parameters);
-    controller.delay = ParseOptionalAttribute<double>(trafficSignalControllerElement, ATTRIBUTE::delay, parameters).value_or(0.0);
-
-    QDomElement phaseElement;
-
-    SimulationCommon::GetFirstChildElement(trafficSignalControllerElement, TAG::phase, phaseElement);
-    while (!phaseElement.isNull())
-    {
-        TrafficSignalControllerPhase phase;
-        phase.name = ParseAttribute<std::string>(phaseElement, ATTRIBUTE::name, parameters);
-        phase.duration = ParseAttribute<double>(phaseElement, ATTRIBUTE::duration, parameters);
-
-        QDomElement trafficSignalStateElement;
-        SimulationCommon::GetFirstChildElement(phaseElement, TAG::trafficSignalState, trafficSignalStateElement);
-
-        while (!trafficSignalStateElement.isNull())
-        {
-            auto trafficSignalId = ParseAttribute<std::string>(trafficSignalStateElement, ATTRIBUTE::trafficSignalId, parameters);
-            auto state = ParseAttribute<std::string>(trafficSignalStateElement, ATTRIBUTE::state, parameters);
-
-            phase.states[trafficSignalId] = state;
-
-            trafficSignalStateElement = trafficSignalStateElement.nextSiblingElement(TAG::trafficSignalState);
-        }
-
-        controller.phases.push_back(phase);
-
-        phaseElement = phaseElement.nextSiblingElement(TAG::phase);
-    }
-}
-
-void ScenarioImporter::ImportStoryboard(QDomElement& documentRoot, std::vector<ScenarioEntity>& entities,
-                                        ScenarioInterface* scenario, openScenario::Parameters& parameters)
-{
-    QDomElement storyboardElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(documentRoot, TAG::storyboard, storyboardElement),
-                 documentRoot, "Tag " + std::string(TAG::storyboard) + " is missing.");
-
-    //Import Init
-    QDomElement initElement;
-    // for initial entity parameters we just use first child "Init" --> others will be ignore
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(storyboardElement, TAG::init, initElement),
-                 storyboardElement, "Tag " + std::string(TAG::init) + " is missing.");
-    ImportInitElement(initElement, entities, scenario, parameters);
-
-    // Import Story
-    QDomElement storyElement;
-
-    SimulationCommon::GetFirstChildElement(storyboardElement, TAG::story, storyElement);
-
-    while (!storyElement.isNull())
-    {
-        ImportStoryElement(storyElement, entities, scenario, parameters);
-        storyElement = storyElement.nextSiblingElement(TAG::story);
-    }
-
-    // Import EndCondition
-    ImportEndConditionsFromStoryboard(storyboardElement, scenario, parameters);
-}
-
-void ScenarioImporter::ImportStoryElement(QDomElement &storyElement,
-                                          const std::vector<ScenarioEntity> &entities,
-                                          ScenarioInterface* scenario,
-                                          openScenario::Parameters& parameters)
-{
-    QDomElement actElement;
-    if(!SimulationCommon::GetFirstChildElement(storyElement, TAG::act, actElement))
-    {
-        return;
-    }
-
-    // Story name is mandatory unless story is empty tag
-    std::string storyName{};
-    ThrowIfFalse(SimulationCommon::ParseAttribute(storyElement, ATTRIBUTE::name, storyName),
-                     storyElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
-
-    while (!actElement.isNull())
-    {
-         // Act name is mandatory
-        std::string actName;
-        ThrowIfFalse(SimulationCommon::ParseAttribute(actElement, ATTRIBUTE::name, actName),
-                     actElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
-
-        QDomElement maneuverGroupElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(actElement, TAG::maneuverGroup, maneuverGroupElement),
-                     actElement, std::string(TAG::act) + " requries " + TAG::maneuverGroup);
-
-        while (!maneuverGroupElement.isNull())
-        {
-                std::string maneuverGroupName;
-                ThrowIfFalse(SimulationCommon::ParseAttribute(maneuverGroupElement, ATTRIBUTE::name, maneuverGroupName),
-                             maneuverGroupElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
-                int numberOfExecutions;
-                numberOfExecutions = ParseAttribute<int>(maneuverGroupElement, ATTRIBUTE::maximumExecutionCount, parameters);
-        
-                    QDomElement actorsElement;
-                    openScenario::ActorInformation actorInformation;
-                    if (SimulationCommon::GetFirstChildElement(maneuverGroupElement, TAG::actors, actorsElement)) // just one actors per sequence
-                    {
-                        actorInformation = ImportActors(actorsElement, entities, parameters);
-                    }
-
-                    QDomElement maneuverElement;
-                    if (SimulationCommon::GetFirstChildElement(maneuverGroupElement, TAG::maneuver, maneuverElement)) // just one maneuver per sequence
-                    {
-                        ImportManeuverElement(maneuverElement, entities, scenario, actorInformation,
-                                              {storyName, actName, maneuverGroupName},
-                                              numberOfExecutions, parameters);
-                    }
-
-                maneuverGroupElement = maneuverGroupElement.nextSiblingElement(TAG::maneuverGroup);
-        }
-
-        actElement = actElement.nextSiblingElement(TAG::act);
-    }
-}
-
-openScenario::ActorInformation ScenarioImporter::ImportActors(QDomElement &actorsElement,
-                                                              const std::vector<ScenarioEntity>& entities,
-                                                              openScenario::Parameters& parameters)
-{
-    openScenario::ActorInformation actorInformation;
-
-    QDomElement entityElement;
-    SimulationCommon::GetFirstChildElement(actorsElement, TAG::entityRef, entityElement);
-
-    while (!entityElement.isNull())
-    {
-        std::string entityRef = ParseAttribute<std::string>(entityElement, ATTRIBUTE::entityRef, parameters);
-        ThrowIfFalse(ContainsEntity(entities, entityRef),
-                     entityElement, "Element references entity '" + entityRef + "' which isn't declared in 'Entities'");
-
-        if (actorInformation.actors.has_value())
-        {
-            actorInformation.actors.value().push_back(entityRef);
-        }
-        else
-        {
-            actorInformation.actors.emplace({entityRef});
-        }
-
-        entityElement = entityElement.nextSiblingElement(TAG::entityRef);
-    }
-
-    ThrowIfFalse(SimulationCommon::ParseAttributeBool(actorsElement, ATTRIBUTE::selectTriggeringEntities, actorInformation.actorIsTriggeringEntity),
-                 actorsElement, "Attribute " + std::string(ATTRIBUTE::selectTriggeringEntities) + " is missing.");
-    return actorInformation;
-}
-
-
-Action ScenarioImporter::ImportAction(QDomElement eventElement, openScenario::Parameters& parameters, const std::string catalogPath)
-{
-    Action action;
-
-    QDomElement actionElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(eventElement, TAG::action, actionElement),
-                  eventElement, "Tag " + std::string(TAG::action) + " is missing.");
-
-    QDomElement actionTypeElement;
-    if (SimulationCommon::GetFirstChildElement(actionElement, TAG::userDefinedAction, actionTypeElement))
-    {
-        action = ScenarioImporterHelper::ImportUserDefinedAction(actionTypeElement);
-    }
-
-    else if (SimulationCommon::GetFirstChildElement(actionElement, TAG::privateAction, actionTypeElement))
-    {
-        action = ScenarioImporterHelper::ImportPrivateAction(actionTypeElement,
-                                                             parameters,
-                                                             catalogPath);
-    }
-
-    else if (SimulationCommon::GetFirstChildElement(actionElement, TAG::globalAction, actionTypeElement))
-    {
-        action = ScenarioImporterHelper::ImportGlobalAction(actionTypeElement,
-                                                            parameters);
-    }
-    else
-    {
-        LogErrorAndThrow("Invalid Action Type in OpenSCENARIO file");
-    }
-
-    return action;
-}
-
-void ScenarioImporter::ImportManeuverElement(QDomElement &maneuverElement,
-                                             const std::vector<ScenarioEntity> &entities,
-                                             ScenarioInterface *scenario,
-                                             const openScenario::ActorInformation &actorInformation,
-                                             const std::vector<std::string> &nameStack,
-                                             const int numberOfExecutions,
-                                             openScenario::Parameters& parameters)
-{
-    std::string maneuverName;
-    ThrowIfFalse(SimulationCommon::ParseAttribute(maneuverElement, ATTRIBUTE::name, maneuverName),
-                 maneuverElement, "Attribute " + std::string(ATTRIBUTE::name) + " is missing.");
-
-    // handle event element
-    QDomElement eventElement;
-    SimulationCommon::GetFirstChildElement(maneuverElement, TAG::event, eventElement);
-
-    while (!eventElement.isNull())
-    {
-        std::string eventName = ParseAttribute<std::string>(eventElement, ATTRIBUTE::name, parameters);
-
-        std::vector<std::string> eventNameStack{nameStack};
-        eventNameStack.emplace_back(maneuverName);
-        eventNameStack.emplace_back(eventName);
-
-        const auto stackedEventName = openpass::utils::vector::to_string(eventNameStack, "/");
-
-        auto metaInfo = EventDetectorImporter::ImportEventDetector(eventElement, stackedEventName, numberOfExecutions, actorInformation, entities, parameters);
-        scenario->AddConditionalEventDetector(metaInfo);
-
-        const auto action = ImportAction(eventElement,
-                                         parameters,
-                                         scenario->GetTrajectoryCatalogPath());
-
-        // Adjust action to hold eventname + action
-        scenario->AddAction(action, stackedEventName);
-
-        eventElement = eventElement.nextSiblingElement(TAG::event);
-    }
-}
-
-void ScenarioImporter::ImportInitElement(QDomElement& initElement, std::vector<ScenarioEntity>& entities, ScenarioInterface *scenario, openScenario::Parameters& parameters)
-{
-    // for initial entity parameters we just use first child "Actions" --> others will be ignore
-    QDomElement actionsElement;
-    SimulationCommon::GetFirstChildElement(initElement, TAG::actions, actionsElement);
-
-    QDomElement privateElement;
-    SimulationCommon::GetFirstChildElement(actionsElement, TAG::Private, privateElement);
-
-    while (!privateElement.isNull())
-    {
-        std::string entityRef = ParseAttribute<std::string>(privateElement, ATTRIBUTE::entityRef, parameters);
-
-        ScenarioEntity* scenarioEntity = GetEntityByName(entities, entityRef);
-
-        ThrowIfFalse(scenarioEntity, privateElement,
-                     (std::string("Action object '") + entityRef + "' not declared in 'Entities'"));
-
-        QDomElement privateActionElement;
-        SimulationCommon::GetFirstChildElement(privateElement, TAG::privateAction, privateActionElement);
-        while (!privateActionElement.isNull())
-        {
-            const auto &action = ScenarioImporterHelper::ImportPrivateAction(privateActionElement, parameters);
-            if (std::holds_alternative<LongitudinalAction>(action))
-            {
-                const auto &longitudinalAction = std::get<LongitudinalAction>(action);
-                if (std::holds_alternative<SpeedAction>(longitudinalAction))
-                {
-                    const auto &speedAction = std::get<SpeedAction>(longitudinalAction);
-                    scenarioEntity->spawnInfo.acceleration = speedAction.transitionDynamics.value;
-
-                    if (std::holds_alternative<AbsoluteTargetSpeed>(speedAction.target))
-                    {
-                        scenarioEntity->spawnInfo.velocity = std::get<AbsoluteTargetSpeed>(speedAction.target).value;
-                    }
-                    else
-                    {
-                        LogErrorAndThrow("Simulator only supports AbsoluteTargetSpeed for Init SpeedAction.");
-                    }
-
-                    scenarioEntity->spawnInfo.stochasticVelocity = speedAction.stochasticValue;
-                    scenarioEntity->spawnInfo.stochasticAcceleration = speedAction.stochasticDynamics;
-                }
-                else
-                {
-                    LogErrorAndThrow("Simulator only supports SpeedAction for Init LongitudinalAction.");
-                }
-            }
-            else if (std::holds_alternative<TeleportAction>(action))
-            {
-                scenarioEntity->spawnInfo.position = std::get<TeleportAction>(action);
-            }
-            else if (std::holds_alternative<RoutingAction>(action))
-            {
-                const auto &routingAction = std::get<RoutingAction>(action);
-                if (std::holds_alternative<AssignRouteAction>(routingAction))
-                {
-                    std::vector<RouteElement> route;
-
-                    for (const auto& roadPosition : std::get<AssignRouteAction>(routingAction))
-                    {
-                        bool inRoadDirection = roadPosition.t <= 0;
-                        route.push_back({roadPosition.roadId, inRoadDirection});
-                    }
-
-                    scenarioEntity->spawnInfo.route = route;
-                }
-                else
-                {
-                    LogErrorAndThrow("Simulator only supports AssignRouteAction for Init RoutingAction.");
-                }
-            }
-            else if (std::holds_alternative<VisibilityAction>(action))
-            {
-                const auto &visibilityAction = std::get<VisibilityAction>(action);
-                scenarioEntity->spawnInfo.spawning = visibilityAction.traffic;
-            }
-            else
-            {
-                LOG_INTERN(LogLevel::Error) << "Unsupported PrivateAction in openScenario Init.";
-            }
-
-            privateActionElement = privateActionElement.nextSiblingElement(TAG::privateAction);
-        }
-
-        privateElement = privateElement.nextSiblingElement(TAG::Private);
-    }
-
-    QDomElement globalActionElement;
-    SimulationCommon::GetFirstChildElement(actionsElement, TAG::globalAction, globalActionElement);
-    while (!globalActionElement.isNull())
-    {
-        const auto action = ScenarioImporterHelper::ImportGlobalAction(globalActionElement, parameters);
-        if (std::holds_alternative<EnvironmentAction>(action))
-        {
-            scenario->SetEnvironment(std::get<EnvironmentAction>(action));
-        }
-
-        globalActionElement = globalActionElement.nextSiblingElement(TAG::globalAction);
-    }
-}
-
-void ScenarioImporter::ImportEndConditionsFromStoryboard(const QDomElement& storyboardElement, ScenarioInterface* scenario, openScenario::Parameters& parameters)
-{
-    bool endConditionProvided = false;
-
-    QDomElement stopTriggerElement;
-    if (SimulationCommon::GetFirstChildElement(storyboardElement, TAG::stopTrigger, stopTriggerElement))
-    {
-        QDomElement conditionGroupElement;
-        if (SimulationCommon::GetFirstChildElement(stopTriggerElement, TAG::conditionGroup, conditionGroupElement))
-        {
-            QDomElement conditionElement;
-            if (SimulationCommon::GetFirstChildElement(conditionGroupElement, TAG::condition, conditionElement))
-            {
-                // these attributes are required by OpenSCENARIO standard, but have no impact on behaviour
-                std::string conditionName;
-                double conditionDelay;
-                std::string conditionEdge;
-
-                ParseConditionAttributes(conditionElement, conditionName, conditionDelay, conditionEdge, parameters);
-                ThrowIfFalse(conditionDelay == 0.0, conditionElement,
-                             "Stop Trigger specifies unsupported delay value. Condition delay attribute not equal to zero not currently supported.");
-
-                ThrowIfFalse(conditionEdge == "rising", conditionElement,
-                             "Stop Trigger specifies unsupported edge value. Condition edge attribute not equal to 'rising' not currently supported.");
-
-                QDomElement byValueElement;
-                if (SimulationCommon::GetFirstChildElement(conditionElement, TAG::byValueCondition, byValueElement))
-                {
-                    double endTime;
-                    std::string rule;
-
-                    ParseSimulationTime(byValueElement, endTime, rule, parameters);
-                    ThrowIfFalse(rule == RULE::greaterThan, byValueElement,
-                                 "End Condition specifies unsupported rule. SimulationTime rule attribute value '" + rule + "' not supported; defaulting to 'greater_than'.");
-
-                    scenario->SetEndTime(endTime);
-                    endConditionProvided = true;
-                }
-            }
-        }
-    }
-
-    ThrowIfFalse(endConditionProvided, "Scenario provides no StopTrigger for the simulation");
-}
-
-void ScenarioImporter::ParseConditionAttributes(const QDomElement& conditionElement, std::string& name, double& delay, std::string& edge, openScenario::Parameters& parameters)
-{
-    name = ParseAttribute<std::string>(conditionElement, ATTRIBUTE::name, parameters);
-    delay = ParseAttribute<double>(conditionElement, ATTRIBUTE::delay, parameters);
-    ThrowIfFalse(delay >= 0.0,
-                 conditionElement, "Invalid delay value specified for condition");
-    edge = ParseAttribute<std::string>(conditionElement, ATTRIBUTE::conditionEdge, parameters);
-}
-
-void ScenarioImporter::ParseSimulationTime(const QDomElement& byValueElement, double& value, std::string& rule, openScenario::Parameters& parameters)
-{
-    QDomElement simulationTimeElement;
-    if(SimulationCommon::GetFirstChildElement(byValueElement, "SimulationTimeCondition", simulationTimeElement))
-    {
-        value = ParseAttribute<double>(simulationTimeElement, ATTRIBUTE::value, parameters);
-
-        rule = ParseAttribute<std::string>(simulationTimeElement, ATTRIBUTE::rule, parameters);
-        {
-            ThrowIfFalse((rule == RULE::greaterThan
-                            || rule == RULE::lessThan
-                            || rule == RULE::equalTo),
-                         simulationTimeElement, "Simulation rule attribute value '" + rule + "' not valid");
-        }
-    }
-}
-
-std::string ScenarioImporter::ImportCatalog(const std::string& catalogName,
-                                            QDomElement& catalogsElement,
-                                            openScenario::Parameters& parameters)
-{
-    QDomElement catalogElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(catalogsElement, catalogName, catalogElement),
-                catalogsElement, "Tag " + catalogName + " is missing.");
-
-    QDomElement directoryElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(catalogElement, TAG::directory, directoryElement),
-                 catalogElement, "Tag " + std::string(TAG::directory) + " is missing.");
-
-    std::string catalogPath = ParseAttribute<std::string>(directoryElement, ATTRIBUTE::path, parameters);
-
-    return catalogPath;
-}
-
-void ScenarioImporter::ImportEntities(QDomElement& documentRoot, std::vector<ScenarioEntity>& entities, std::map<std::string, std::vector<std::string>> &groups, openScenario::Parameters& parameters)
-{
-    QDomElement entitiesElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(documentRoot, TAG::entities, entitiesElement),
-                 documentRoot, "Tag " + std::string(TAG::entities) + " is missing.");
-
-    QDomElement entityElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(entitiesElement, TAG::scenarioObject, entityElement),
-                 entitiesElement, "Tag " + std::string(TAG::scenarioObject) + " is missing.");
-
-    while (!entityElement.isNull())
-    {
-        ScenarioEntity entity;
-
-        ImportEntity(entityElement, entity, parameters);
-
-        entities.push_back(entity);
-        entityElement = entityElement.nextSiblingElement(TAG::scenarioObject);
-    }
-
-    // Parse selection elements (there can be as few as zero and as many as one wants)
-    ImportSelectionElements(entitiesElement, groups, parameters);
-}
-
-void ScenarioImporter::ImportSelectionElements(QDomElement &entitiesElement, std::map<std::string, std::vector<std::string>> &groups, openScenario::Parameters& parameters)
-{
-    QDomElement selectionElement;
-    if(SimulationCommon::GetFirstChildElement(entitiesElement, TAG::entitySelection, selectionElement))
-    {
-        QDomElement membersElement;
-        std::vector<std::string> members;
-        while (!selectionElement.isNull())
-        {
-            std::string selectionName = ParseAttribute<std::string>(selectionElement, ATTRIBUTE::name, parameters);
-            ThrowIfFalse(SimulationCommon::GetFirstChildElement(selectionElement, TAG::members, membersElement),
-                         selectionElement, "Tag " + std::string(TAG::members) + " is missing.");
-
-            ImportMembers(membersElement, members, parameters);
-            groups.insert({selectionName, members});
-
-            selectionElement = selectionElement.nextSiblingElement(TAG::entitySelection);
-        }
-    }
-
-    if (groups.find("ScenarioAgents") == groups.cend())
-    {
-        LOG_INTERN(LogLevel::Info) << "ScenarioAgents selection is not defined. Adding empty one.";
-        groups.insert({"ScenarioAgents", {}});
-    }
-}
-
-void ScenarioImporter::ImportEntity(QDomElement& entityElement, ScenarioEntity& entity, openScenario::Parameters& parameters)
-{
-    entity.name = ParseAttribute<std::string>(entityElement, ATTRIBUTE::name, parameters);
-    ThrowIfFalse(entity.name.size() > 0,
-                 entityElement, "Length of entity object name has to be greater than 0");
-
-    QDomElement catalogReferenceElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(entityElement, TAG::catalogReference, catalogReferenceElement),
-                 entityElement, "Tag " + std::string(TAG::catalogReference) + " is missing.");
-    ImportEntityCatalogReference(catalogReferenceElement, entity, parameters);
-}
-
-void ScenarioImporter::ImportMembers(const QDomElement &membersElement, std::vector<std::string> &members, openScenario::Parameters& parameters)
-{
-    QDomElement byEntityElement;
-    if(SimulationCommon::GetFirstChildElement(membersElement, TAG::entityRef, byEntityElement))
-    {
-        while(!byEntityElement.isNull())
-        {
-            std::string memberName = ParseAttribute<std::string>(byEntityElement, ATTRIBUTE::entityRef, parameters);
-            members.push_back(memberName);
-
-            byEntityElement = byEntityElement.nextSiblingElement(TAG::entityRef);
-        }
-    }
-}
-
-void ScenarioImporter::ImportEntityCatalogReference(QDomElement& catalogReferenceElement, ScenarioEntity& entity, openScenario::Parameters& parameters)
-{
-    entity.catalogReference.catalogName = ParseAttribute<std::string>(catalogReferenceElement, ATTRIBUTE::catalogName, parameters);
-    ThrowIfFalse(entity.catalogReference.catalogName.size() > 0,
-                 catalogReferenceElement, "Length of 'catalogName' has to be greater than 0");
-    entity.catalogReference.entryName = ParseAttribute<std::string>(catalogReferenceElement, ATTRIBUTE::entryName, parameters);
-    ThrowIfFalse(entity.catalogReference.entryName.size() > 0,
-                 catalogReferenceElement, "Length of 'entryName' has to be greater than 0");
-    QDomElement parameterAssignmentsElement;
-    if(SimulationCommon::GetFirstChildElement(catalogReferenceElement, TAG::parameterAssignments, parameterAssignmentsElement))
-    {
-        QDomElement parameterAssignmentElement;
-        SimulationCommon::GetFirstChildElement(parameterAssignmentsElement, TAG::parameterAssignment, parameterAssignmentElement);
-        while (!parameterAssignmentElement.isNull())
-        {
-            auto name = ParseAttribute<std::string>(parameterAssignmentElement, ATTRIBUTE::parameterRef, parameters);
-            auto value = ParseAttribute<std::string>(parameterAssignmentElement, ATTRIBUTE::value, parameters);
-            entity.assignedParameters.insert({name, value});
-            parameterAssignmentElement = parameterAssignmentElement.nextSiblingElement(TAG::parameterAssignment);
-        }
-    }
-}
-
-ScenarioEntity* ScenarioImporter::GetEntityByName(std::vector<ScenarioEntity>& entities, const std::string& entityName)
-{
-    auto entitiesFound = std::find_if(entities.begin(),
-                                      entities.end(),
-                                      [entityName](ScenarioEntity & elem)
-    {
-        return elem.name == entityName;
-    });
-
-    if (entitiesFound != entities.end())
-    {
-        return &(*entitiesFound);
-    }
-
-    return nullptr;
-}
-
-void ScenarioImporter::CategorizeEntities(const std::vector<ScenarioEntity>& entities, const std::map<std::string, std::vector<std::string>> &groups, ScenarioInterface* scenario)
-{
-    for (const auto& entity : entities)
-    {
-        scenario->AddScenarioEntity(entity);
-    }
-
-    scenario->AddScenarioGroupsByEntityNames(groups);
-}
-
-bool ScenarioImporter::ContainsEntity(const std::vector<ScenarioEntity>& entities,
-                                      const std::string& entityName)
-{
-    auto entitiesFound = std::find_if(entities.cbegin(),
-                                      entities.cend(),
-                                      [entityName](const ScenarioEntity &elem) {
-                                          return elem.name == entityName;
-                                      });
-
-    return entitiesFound != entities.cend();
-}
-
-} //namespace Importer
diff --git a/sim/src/core/opSimulation/importer/scenarioImporter.h b/sim/src/core/opSimulation/importer/scenarioImporter.h
deleted file mode 100644
index 233c816a97e0f485865d6c98900fc6e4006d4460..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/scenarioImporter.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2018 ITK Engineering GmbH
- *               2017-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-//! @file  ScenarioImporter.h
-//! @brief This file contains the importer of the scenario.
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <string>
-#include <QDomDocument>
-#include "include/scenarioInterface.h"
-#include "modelElements/parameters.h"
-#include "common/openScenarioDefinitions.h"
-#include "oscImporterCommon.h"
-
-namespace Importer
-{
-
-class ScenarioImporter
-{
-public:    
-    ScenarioImporter() = default;
-    ScenarioImporter(const ScenarioImporter&) = delete;
-    ScenarioImporter(ScenarioImporter&&) = delete;
-    ScenarioImporter& operator=(const ScenarioImporter&) = delete;
-    ScenarioImporter& operator=(ScenarioImporter&&) = delete;
-    virtual ~ScenarioImporter() = default;
-
-    static bool Import(const std::string &filename, ScenarioInterface *scenario);
-
-    //Public for testing only
-    /*!
-     * \brief Imports an entity of a OpenSCENARIO Entities DOM
-     *
-     * \param[in]   entityElement   The DOM root of the entity element
-     * \param[out]  entity          Entity element data is imported into this container
-     * \param[in]   parameters      declared parameters
-     */
-    static void ImportEntity(QDomElement& entityElement, ScenarioEntity& entity, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports the storyboard from OpenSCENARIO DOM
-     *
-     * \param[in]   documentRoot    The DOM root of the scenario file
-     * \param[in]   entities        Objects from 'Entities' tag
-     * \param[out]  scenario        The storyboard is imported into this scenario
-     * \param[in]   parameters      declared parameters
-     */
-    static void ImportStoryboard(QDomElement& documentRoot, std::vector<ScenarioEntity>& entities, ScenarioInterface* scenario, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a catalog tag
-     *
-     * \param[in]   catalogName         Name of the catalog to import
-     * \param[in]   catatalogsElement   DOM element holding all available catalogs
-     * \param[in]   parameters          declared parameters
-     *
-     * \return      True on successful parsing, false otherwise.
-     */
-    static std::string ImportCatalog(const std::string& catalogName, QDomElement& catalogsElement, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports the roadnetwork information from OpenSCENARIO DOM
-     *
-     * Currently, the path to the OpenDRIVE scenery file is extracted.
-     *
-     * \param[in]   roadNetworkElement  DOM element of the roadnetwork tag
-     * \param[out]  scenario            roadnetwork information are imported into this scenario
-     * \param[in]   parameters          declared parameters
-     */
-    static void ImportRoadNetwork(QDomElement& roadNetworkElement, ScenarioInterface* scenario, openScenario::Parameters& parameters);
-
-private:
-    /*!
-     * \brief Imports and validates the internally used OpenSCENARIO schema version
-     *
-     * \param[in]   parameters      declared parameters
-     *
-     * \return  true if import succeeds and version matches, falso otherwise
-     */
-    static void ImportAndValidateVersion(openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports catalogs from OpenSCENARIO DOM
-     *
-     * Currently, vehicle and pedestrian catalogs are imported.
-     *
-     * \param[in]   documentRoot    The DOM root of the scenario file
-     * \param[out]  scenario        Catalogs are imported into this scenario
-     * \param[in]   parameters      declared parameters
-     */
-    static void ImportCatalogs(QDomElement& documentRoot, ScenarioInterface* scenario, const std::string& filePath, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a TrafficSignalController element from OpenSCENARIO
-     *
-     * \param[in]   trafficSignalControllerElement   The element to import
-     * \param[out]  controller                       result is parsed into this
-     * \param[in]   parameters                       declared parameters
-     */
-    static void ImportTrafficSignalsElement(QDomElement& trafficSignalControllerElement, openScenario::TrafficSignalController &controller, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports the init element of a OpenSCENARIO storyboard DOM
-     *
-     * \param[in]   initElement     The DOM of the storyboard init element
-     * \param[in]   entities        Objects from 'Entities' tag
-     * \param[in]   parameters      declared parameters
-     */
-    static void ImportInitElement(QDomElement& initElement, std::vector<ScenarioEntity>& entities, ScenarioInterface *scenario, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports the simulation end conditions
-     * \param[in]   storyboardElement   The storyboard DOM element
-     * \param[out]  scenario            End conditions data is imported into this scenario
-     * \param[in]   parameters          declared parameters
-     */
-    static void ImportEndConditionsFromStoryboard(const QDomElement &storyboardElement, ScenarioInterface *scenario, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief ParseConditionAttributes parses the attributes for a condition
-     * 		  element
-     *
-     * \param[in] conditionElement
-     * \param[out] name the value of the name attribute is parsed into this
-     * 			   std::string
-     * \param[out] delay the value of the delay attribute is parsed into this
-     * 			   double
-     * \param[out] edge the value of the edge attribute is parsed into this
-     * 			   std::string
-     * \param[in]   parameters      declared parameters
-     *
-     * \throw std::runtime_exception If name, delay, or edge is not specified,
-     * 								 or if a negative delay is provided
-     */
-    static void ParseConditionAttributes(const QDomElement& conditionElement, std::string& name, double& delay, std::string& edge, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief ParseSimulationTime parses the simulation time tag according to
-     * 		  the OpenSCENARIO standard
-     *
-     * \param[in] byValueElement the byValueElement containing the
-     * 			  SimulationTime element
-     * \param[out] value the value of the value attribute of the SimulationTime
-     * 			   element
-     * \param[out] rule the value of the rule attribute of the SimulationTime
-     * 			   element
-     * \param[in]   parameters      declared parameters
-     *
-     * \throw std::runtime_exception If value or rule is not specified, or an
-     * 								 invalid rule is provided
-     */
-    static void ParseSimulationTime(const QDomElement &byValueElement, double& value, std::string& rule, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports the entities element of a OpenSCENARIO DOM
-     *
-     * \param[in]   documentRoot    The DOM root of the scenario file
-     * \param[out]  entities        Entity element data is imported into this container
-     * \param[in]   parameters      declared parameters
-     */
-    static void ImportEntities(QDomElement& documentRoot, std::vector<ScenarioEntity>& entities, std::map<std::string, std::vector<std::string> > &groups, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a group definition of a OpenSCENARIO Selection DOM
-     *
-     * \param[in]   selectionElement	The DOM node of the selection element
-     * \param[out]  groups 				Groups element data is imported into this container
-     * \param[in]   parameters      declared parameters
-     */
-    static void ImportSelectionElements(QDomElement &entitiesElement, std::map<std::string, std::vector<std::string> > &groups, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a list of members of a OpenSCENARIO Members DOM
-     *
-     * \param[in]   membersElement  The DOM root of the members element
-     * \param[out]  members			Members element data is imported into this container
-     */
-    static void ImportMembers(const QDomElement &membersElement, std::vector<std::string> &members, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a catalog reference of an entity of a OpenSCENARIO Entities DOM
-     *
-     * \param[in]   catalogReferenceElement   The DOM root of the catalog reference element
-     * \param[out]  entity                    Catalog refrence data is imported into this container
-     * \param[in]   parameters      declared parameters
-     */
-    static void ImportEntityCatalogReference(QDomElement& catalogReferenceElement, ScenarioEntity& entity, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a story element of a OpenSCENARIO storyboard DOM
-     *
-     * \param[in]   storyElement   The DOM root of the catalog reference element
-     * \param[in]   entities       Objects from 'Entities' tag
-     * \param[out]  scenario       The story data is imported into this scenario
-     * \param[in]   parameters      declared parameters
-     */
-    static void ImportStoryElement(QDomElement& storyElement, const std::vector<ScenarioEntity>& entities, ScenarioInterface *scenario, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports actors from of a OpenSCENARIO story DOM
-     *
-     * \param[in]   actorsElement   The DOM root of the actors element
-     * \param[in]   entities        Objects from 'Entities' tag
-     * \param[in]   parameters      declared parameters
-     *
-     * \return  Actor names referenced in the DOM
-     */
-    static openScenario::ActorInformation ImportActors(QDomElement& actorsElement,
-                                                       const std::vector<ScenarioEntity>& entities,
-                                                       openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a maneuvre element of a OpenSCENARIO storyboard DOM
-     *
-     * \param[in]   maneuverElement   The DOM root of the maneuver element
-     * \param[in]   entities          Objects from 'Entities' tag
-     * \param[out]  scenario          The maneuver data is imported into this scenario
-     * \param[out]  actors            Actors from the maneuver are imported into this container
-     * \param[in]   parameters        declared parameters
-     */
-
-    /*!
-     * \brief ImportManeuverElement
-     * \param maneuverElement    The DOM root of the maneuver element
-     * \param entities           Objects from 'Entities' tag
-     * \param scenario           The maneuver data is imported into this scenario
-     * \param actorInformation   Information of actors from the maneuver
-     * \param nameStack          List of names from tree structure e.g. {"myStory", "myAct", "myManeuver"}
-     * \param numberOfExecutions Number of executions
-     */
-    static void ImportManeuverElement(QDomElement& maneuverElement,
-                                      const std::vector<ScenarioEntity>& entities,
-                                      ScenarioInterface *scenario,
-                                      const openScenario::ActorInformation &actorInformation,
-                                      const std::vector<std::string> &nameStack,
-                                      const int numberOfExecutions,
-                                      openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a orientation element of a OpenSCENARIO entity
-     *
-     * \param[in]   orientationElement  The DOM root of the orientation element
-     * \param[in]   parameters          declared parameters
-     * \return  orientation
-     */
-    static openScenario::Orientation ImportOrientation(QDomElement& orientationElement, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports a private element of a OpenSCENARIO Storyboard/Init/Actions DOM
-     *
-     * \param[in]      privateElement    The DOM root of the storyboard/init/action element
-     * \param[inout]   entities          Objects from 'Entities' tag. Containing spawn information will be set by this method call.
-     * \param[in]      parameters      declared parameters
-     */
-    static void ImportPrivateElement(QDomElement& privateElement, std::vector<ScenarioEntity>& entities, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports all private elements of a OpenSCENARIO actions DOM
-     *
-     * \param[in]      privateElement    The DOM root of the actions element
-     * \param[inout]   entities          Objects from 'Entities' tag. Containing spawn information will be set by this method call.
-     * \param[in]      parameters        declared parameters
-     */
-    static void ImportPrivateElements(QDomElement& actionsElement, std::vector<ScenarioEntity>& entities, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Tests, if a entity with a given name is included in the provided vector of scenario entities
-     *
-     * \param[in] entities Vector of entities to test against
-     * \param entityName Name of the entity to check for existence
-     *
-     * \return true, if entityName is included in entities, false otherwise
-     */
-    static bool ContainsEntity(const std::vector<ScenarioEntity>& entities,
-                               const std::string& entityName);
-    /*!
-     * \brief Returns the entity object contained in a vector of entities, selected by its name
-     *
-     * \param[in]   entities        Vector of entities to search
-     * \param[in]   entityName      Name of entity to look up
-     *
-     * \return      Pointer to found entity if name exists, nullptr otherwise
-     */
-    static ScenarioEntity* GetEntityByName(std::vector<ScenarioEntity>& entities, const std::string& entityName);
-
-    /*!
-     * \brief Categorizes the provided entities and adds them to the scenario either as scanario entity or ego entity.
-     *
-     * \param[in]   entities    Entities to check for being Ego or of other type
-     * \param[out]  scenario    Ego and Scenario entities are added to this scenario
-     */
-    static void CategorizeEntities(const std::vector<ScenarioEntity>& entities, const std::map<std::string, std::vector<std::string> > &groups, ScenarioInterface* scenario);
-
-    /*!
-     * \brief Imports an openScenario Lane-Position element
-     *
-     * \param[in]   positionElement    XML-Element containing position
-     * \param[in]   parameters      declared parameters
-     * \return      lanePosition
-     */
-    static openScenario::LanePosition ImportLanePosition(QDomElement positionElement, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports an openScenario World-Position element
-     *
-     * \param[in]   positionElement    XML-Element containing position
-     * \param[in]   parameters      declared parameters
-     * \return  worldPosition
-     */
-    static openScenario::WorldPosition ImportWorldPosition(QDomElement positionElement, openScenario::Parameters& parameters);
-
-    /*!
-     * \brief Imports an openScenario Action element
-     *
-     * \param[in]   eventElement        XML-Element containing Event
-     * \param[in]   parameters          declared parameters
-     * \param[in]   catalogPath         catalog path
-     * \return  action
-     */
-    static openScenario::Action ImportAction(QDomElement eventElement, openScenario::Parameters& parameters, const std::string catalogPath);
-
-    //! Currently supported "internal" OpenSCENARIO version
-    static constexpr auto supportedScenarioVersion = "0.4.0";
-};
-
-} // namespace Importer
diff --git a/sim/src/core/opSimulation/importer/scenarioImporterHelper.cpp b/sim/src/core/opSimulation/importer/scenarioImporterHelper.cpp
deleted file mode 100644
index 69be0c47fc4f17924c0dcc718c9f32512f1a8d6c..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/scenarioImporterHelper.cpp
+++ /dev/null
@@ -1,765 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "scenarioImporterHelper.h"
-
-#include "importerLoggingHelper.h"
-#include "oscImporterCommon.h"
-
-namespace TAG = openpass::importer::xml::scenarioImporter::tag;
-namespace ATTRIBUTE = openpass::importer::xml::scenarioImporter::attribute;
-namespace RULE = openpass::importer::xml::openScenario::rule;
-
-namespace DYNAMICSSHAPE = openpass::importer::xml::openScenario::dynamicsShape;
-namespace DYNAMICSDIMENSION = openpass::importer::xml::openScenario::dynamicsDimension;
-namespace SPEEDTARGETVALUETYPE = openpass::importer::xml::openScenario::speedTargetValueType;
-
-using namespace Importer;
-
-template <typename T>
-T ParseAttributeHelper(const QDomElement& element, const char attributeName[], openScenario::Parameters& parameters, T&)
-{
-    return Importer::ParseAttribute<T>(element, attributeName, parameters);
-}
-
-namespace openScenario
-{
-
-const std::map<std::string, Shape> shapeConversionMap = {{DYNAMICSSHAPE::linear, Shape::Linear},
-                                                         {DYNAMICSSHAPE::step, Shape::Step}};
-
-const std::map<std::string, SpeedTargetValueType> speedTargetValueTypeConversionMap = {{SPEEDTARGETVALUETYPE::delta, SpeedTargetValueType::Delta},
-                                                                                       {SPEEDTARGETVALUETYPE::factor, SpeedTargetValueType::Factor}};
-
-Position ScenarioImporterHelper::ImportPosition(QDomElement root, Parameters& parameters)
-{
-    QDomElement positionElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(root, TAG::position, positionElement),
-                 root, std::string("Tag ") + TAG::position + " is missing.");
-    QDomElement childOfPositionElement;
-    if(SimulationCommon::GetFirstChildElement(positionElement, TAG::lanePosition, childOfPositionElement))
-    {
-        return ImportLanePosition(childOfPositionElement, parameters);
-    }
-    else if (SimulationCommon::GetFirstChildElement(positionElement, TAG::relativeLanePosition, childOfPositionElement))
-    {
-        return ImportRelativeLanePosition(childOfPositionElement, parameters);
-    }
-    else if (SimulationCommon::GetFirstChildElement(positionElement, TAG::roadPosition, childOfPositionElement))
-    {
-        return ImportRoadPosition(childOfPositionElement, parameters);
-    }
-    else if (SimulationCommon::GetFirstChildElement(positionElement, TAG::worldPosition, childOfPositionElement))
-    {
-        return ImportWorldPosition(childOfPositionElement, parameters);
-    }
-    else if (SimulationCommon::GetFirstChildElement(positionElement, TAG::relativeObjectPosition, childOfPositionElement))
-    {
-        return ImportRelativeObjectPosition(childOfPositionElement, parameters);
-    }
-    else if (SimulationCommon::GetFirstChildElement(positionElement, TAG::relativeWorldPosition, childOfPositionElement))
-    {
-        return ImportRelativeWorldPosition(childOfPositionElement, parameters);
-    }
-    else
-    {
-        LogErrorAndThrow(std::string("Position type not supported. Currently supported are: ") + TAG::lanePosition + ", " + TAG::roadPosition + ", " + TAG::worldPosition + ".");
-    }
-}
-
-GlobalAction ScenarioImporterHelper::ImportGlobalAction(QDomElement globalActionElement, Parameters& parameters)
-{
-    QDomElement childOfGlobalActionElement;
-    if (SimulationCommon::GetFirstChildElement(globalActionElement, TAG::entityAction, childOfGlobalActionElement))
-    {
-        return ImportEntityAction(childOfGlobalActionElement, parameters);
-    }
-    else if (SimulationCommon::GetFirstChildElement(globalActionElement, TAG::environmentAction, childOfGlobalActionElement))
-    {
-        return ImportEnvironmentAction(childOfGlobalActionElement, parameters);
-    }
-    else
-    {
-        LogErrorAndThrow("Invalid GlobalAction type.");
-    }
-}
-
-PrivateAction ScenarioImporterHelper::ImportPrivateAction(QDomElement privateActionElement, Parameters& parameters, const std::string catalogPath)
-{
-    QDomElement childOfPrivateActionElement;
-    if  (SimulationCommon::GetFirstChildElement(privateActionElement, TAG::lateralAction, childOfPrivateActionElement))
-    {
-        return ImportLateralAction(childOfPrivateActionElement, parameters);
-    }
-    else if  (SimulationCommon::GetFirstChildElement(privateActionElement, TAG::longitudinalAction, childOfPrivateActionElement))
-    {
-        return ImportLongitudinalAction(childOfPrivateActionElement, parameters);
-    }
-    else if (SimulationCommon::GetFirstChildElement(privateActionElement, TAG::teleportAction, childOfPrivateActionElement))
-    {
-        return ImportTeleportAction(childOfPrivateActionElement, parameters);
-    }
-    else if (SimulationCommon::GetFirstChildElement(privateActionElement, TAG::routingAction, childOfPrivateActionElement))
-    {
-        return ImportRoutingAction(childOfPrivateActionElement, parameters, catalogPath);
-    }
-    else if (SimulationCommon::GetFirstChildElement(privateActionElement, TAG::visibilityAction, childOfPrivateActionElement))
-    {
-        return ImportVisibilityAction(childOfPrivateActionElement, parameters);
-    }
-    else
-    {
-        LogErrorAndThrow(std::string("PrivateAction type invalid."));
-    }
-}
-
-UserDefinedAction ScenarioImporterHelper::ImportUserDefinedAction(QDomElement userDefinedActionElement)
-{
-    QDomElement userDefinedChildElement;
-       ThrowIfFalse(SimulationCommon::GetFirstChildElement(userDefinedActionElement, TAG::customCommandAction, userDefinedChildElement),
-                    userDefinedActionElement, "Tag " + std::string(TAG::customCommandAction) + " is missing.");
-
-    std::string command = userDefinedChildElement.text().toStdString();
-    boost::algorithm::trim(command);
-
-    return CustomCommandAction {command};
-}
-
-LanePosition ScenarioImporterHelper::ImportLanePosition(QDomElement positionElement, Parameters& parameters)
-{
-    LanePosition lanePosition;
-    lanePosition.s = ParseAttribute<double>(positionElement, ATTRIBUTE::s, parameters);
-    const auto laneIdString = ParseAttribute<std::string>(positionElement, ATTRIBUTE::laneId, parameters);
-    try
-    {
-        lanePosition.laneId = std::stoi(laneIdString);
-    }
-    catch(std::invalid_argument)
-    {
-        ThrowIfFalse(false, positionElement, "LaneId must be integer");
-    }
-    catch(std::out_of_range)
-    {
-        ThrowIfFalse(false, positionElement, "LaneId is out of range");
-    }
-    lanePosition.roadId = ParseAttribute<std::string>(positionElement, ATTRIBUTE::roadId, parameters);
-
-    lanePosition.offset = ParseOptionalAttribute<double>(positionElement, ATTRIBUTE::offset, parameters);
-
-    //Parse optional stochastics
-    QDomElement stochasticElement;
-    SimulationCommon::GetFirstChildElement(positionElement, TAG::stochastics, stochasticElement);
-    while (!stochasticElement.isNull())
-    {
-        const auto& stochasticInformation = ImportStochastics(stochasticElement, parameters);
-
-        if (stochasticInformation.first == "offset")
-        {
-            ThrowIfFalse(lanePosition.offset.has_value(), stochasticElement, "The offset attribute is required in order to use stochastic offsets.");
-
-            lanePosition.stochasticOffset = stochasticInformation.second;
-            lanePosition.stochasticOffset->mean = lanePosition.offset.value();
-        }
-        else if (stochasticInformation.first == "s")
-        {
-            lanePosition.stochasticS = stochasticInformation.second;
-            lanePosition.stochasticS->mean = lanePosition.s;
-        }
-        stochasticElement = stochasticElement.nextSiblingElement(TAG::stochastics);
-    }
-
-    QDomElement orientationElement;
-    if(SimulationCommon::GetFirstChildElement(positionElement, TAG::orientation, orientationElement))
-    {
-        lanePosition.orientation = ImportOrientation(orientationElement, parameters);
-    }
-
-    return lanePosition;
-}
-
-RelativeLanePosition ScenarioImporterHelper::ImportRelativeLanePosition(QDomElement positionElement, Parameters& parameters)
-{
-    RelativeLanePosition relativeLanePosition;
-    relativeLanePosition.entityRef = ParseAttribute<std::string>(positionElement, ATTRIBUTE::entityRef, parameters);
-    relativeLanePosition.dLane = ParseAttribute<int>(positionElement, ATTRIBUTE::dLane, parameters);
-    relativeLanePosition.ds = ParseAttribute<double>(positionElement, ATTRIBUTE::ds, parameters);
-    relativeLanePosition.offset = ParseOptionalAttribute<double>(positionElement, ATTRIBUTE::offset, parameters);
-
-    QDomElement orientationElement;
-    if(SimulationCommon::GetFirstChildElement(positionElement, TAG::orientation, orientationElement))
-    {
-        relativeLanePosition.orientation = ImportOrientation(orientationElement, parameters);
-    }
-
-    return relativeLanePosition;
-}
-
-RoadPosition ScenarioImporterHelper::ImportRoadPosition(QDomElement positionElement, Parameters& parameters)
-{
-    RoadPosition roadPosition;
-    roadPosition.s = ParseAttribute<double>(positionElement, ATTRIBUTE::s, parameters);
-    roadPosition.t = ParseAttribute<double>(positionElement, ATTRIBUTE::t, parameters);
-    roadPosition.roadId = ParseAttribute<std::string>(positionElement, ATTRIBUTE::roadId, parameters);
-
-    QDomElement orientationElement;
-    if(SimulationCommon::GetFirstChildElement(positionElement, TAG::orientation, orientationElement))
-    {
-        roadPosition.orientation = ImportOrientation(orientationElement, parameters);
-    }
-
-    return roadPosition;
-}
-
-WorldPosition ScenarioImporterHelper::ImportWorldPosition(QDomElement positionElement, Parameters& parameters)
-{
-    WorldPosition worldPosition;
-    worldPosition.x = ParseAttribute<double>(positionElement, ATTRIBUTE::x, parameters);
-    worldPosition.y= ParseAttribute<double>(positionElement, ATTRIBUTE::y, parameters);
-
-    worldPosition.z = ParseOptionalAttribute<double>(positionElement, ATTRIBUTE::z, parameters);
-    worldPosition.h = ParseOptionalAttribute<double>(positionElement, ATTRIBUTE::h, parameters);
-    worldPosition.p = ParseOptionalAttribute<double>(positionElement, ATTRIBUTE::p, parameters);
-    worldPosition.r = ParseOptionalAttribute<double>(positionElement, ATTRIBUTE::r, parameters);
-
-    return worldPosition;
-}
-
-Orientation ScenarioImporterHelper::ImportOrientation(QDomElement& orientationElement, Parameters& parameters)
-{
-    Orientation orientation;
-
-    std::string type = ParseAttribute<std::string>(orientationElement, ATTRIBUTE::type, parameters);
-    ThrowIfFalse(type == "relative", orientationElement, "Scenario Importer: only relative orientation is allowed.");
-    orientation.type = OrientationType::Relative;
-
-    double heading = ParseAttribute<double>(orientationElement, ATTRIBUTE::h, parameters);
-    orientation.h = heading;
-
-    return orientation;
-}
-
-std::pair<std::string, StochasticAttribute> ScenarioImporterHelper::ImportStochastics(QDomElement& stochasticsElement, Parameters& parameters)
-{
-    std::string attributeName = ParseAttribute<std::string>(stochasticsElement, ATTRIBUTE::value, parameters);
-
-    StochasticAttribute stochasticAttribute;
-    stochasticAttribute.stdDeviation = ParseAttribute<double>(stochasticsElement, ATTRIBUTE::stdDeviation, parameters);
-    stochasticAttribute.lowerBoundary = ParseAttribute<double>(stochasticsElement, ATTRIBUTE::lowerBound, parameters);
-    stochasticAttribute.upperBoundary = ParseAttribute<double>(stochasticsElement, ATTRIBUTE::upperBound, parameters);
-
-    return {attributeName, stochasticAttribute};
-}
-
-EntityAction ScenarioImporterHelper::ImportEntityAction(QDomElement entityActionElement, Parameters& parameters)
-{
-    const auto entityRef = ParseAttribute<std::string>(entityActionElement, ATTRIBUTE::entityRef, parameters);
-
-    EntityActionType type;
-    QDomElement childOfEntityAction;
-    if (SimulationCommon::GetFirstChildElement(entityActionElement, TAG::addEntityAction, childOfEntityAction))
-    {
-        type = EntityActionType::Add;
-    }
-    else if (SimulationCommon::GetFirstChildElement(entityActionElement, TAG::deleteEntityAction, childOfEntityAction))
-    {
-       type = EntityActionType::Delete;
-    }
-    else
-    {
-        LogErrorAndThrow(std::string("Invalid ") + TAG::entityAction + " type.");
-    }
-
-    return {entityRef, type};
-}
-
-EnvironmentAction ScenarioImporterHelper::ImportEnvironmentAction(QDomElement environmentActionElement, Parameters& parameters)
-{
-    EnvironmentAction environmentAction;
-
-    QDomElement environmentElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(environmentActionElement, TAG::environment, environmentElement),
-                 environmentActionElement, "Tag " + std::string(TAG::environment) + " is missing.");
-
-    QDomElement weatherElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(environmentElement, TAG::weather, weatherElement),
-                 environmentElement, "Tag " + std::string(TAG::weather) + " is missing.");
-
-    auto cloudState = ParseAttribute<std::string>(weatherElement, ATTRIBUTE::cloudState, parameters);
-    if (cloudState == "skyOff")
-    {
-        environmentAction.weather.cloudState = Weather::CloudState::skyOff;
-    }
-    else if (cloudState == "free")
-    {
-        environmentAction.weather.cloudState = Weather::CloudState::free;
-    }
-    else if (cloudState == "cloudy")
-    {
-        environmentAction.weather.cloudState = Weather::CloudState::cloudy;
-    }
-    else if (cloudState == "overcast")
-    {
-        environmentAction.weather.cloudState = Weather::CloudState::overcast;
-    }
-    else
-    {
-        ThrowIfFalse(cloudState == "rainy", environmentElement, "Unknown cloudState " + cloudState);
-        environmentAction.weather.cloudState = Weather::CloudState::rainy;
-    }
-
-    QDomElement fogElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(weatherElement, TAG::fog, fogElement),
-                 weatherElement, "Tag " + std::string(TAG::fog) + " is missing.");
-    environmentAction.weather.fog.visualRange = ParseAttribute<double>(fogElement, ATTRIBUTE::visualRange, parameters);
-
-    QDomElement sunElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(weatherElement, TAG::sun, sunElement),
-                 weatherElement, "Tag " + std::string(TAG::sun) + " is missing.");
-    environmentAction.weather.sun.azimuth = ParseAttribute<double>(sunElement, ATTRIBUTE::azimuth, parameters);
-    environmentAction.weather.sun.elevation = ParseAttribute<double>(sunElement, ATTRIBUTE::elevation, parameters);
-    environmentAction.weather.sun.intensity = ParseAttribute<double>(sunElement, ATTRIBUTE::intensity, parameters);
-
-    QDomElement precipitationElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(weatherElement, TAG::precipitation, precipitationElement),
-                 weatherElement, "Tag " + std::string(TAG::precipitation) + " is missing.");
-    environmentAction.weather.precipitation.intensity = ParseAttribute<double>(precipitationElement, ATTRIBUTE::intensity, parameters);
-    auto precipitationType = ParseAttribute<std::string>(precipitationElement, ATTRIBUTE::precipitationType, parameters);
-    if (precipitationType == "dry")
-    {
-        environmentAction.weather.precipitation.type = Precipitation::Type::dry;
-    }
-    else if (precipitationType == "rain")
-    {
-        environmentAction.weather.precipitation.type = Precipitation::Type::rain;
-    }
-    else
-    {
-        ThrowIfFalse(precipitationType == "snow", precipitationElement, "Unknown precipitation type " + precipitationType);
-        environmentAction.weather.precipitation.type = Precipitation::Type::snow;
-    }
-
-    return  environmentAction;
-}
-
-LateralAction ScenarioImporterHelper::ImportLateralAction(QDomElement lateralActionElement, Parameters& parameters)
-{
-
-    QDomElement lateralChildElement;
-    if (SimulationCommon::GetFirstChildElement(lateralActionElement, TAG::laneChangeAction, lateralChildElement))
-    {
-        QDomElement dynamicsElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(lateralChildElement, TAG::laneChangeActionDynamics, dynamicsElement),
-                    lateralChildElement, "Tag " + std::string(TAG::laneChangeActionDynamics) + " is missing.");
-
-
-        double transitionDynamicsValue = ParseAttribute<double>(dynamicsElement, ATTRIBUTE::value, parameters);
-        std::string dynamicsDimension = ParseAttribute<std::string>(dynamicsElement, ATTRIBUTE::dynamicsDimension, parameters);
-
-        openScenario::LaneChangeParameter::DynamicsType dynamicsType;
-
-        if (dynamicsDimension == "time")
-        {
-            dynamicsType = openScenario::LaneChangeParameter::DynamicsType::Time;
-        }
-        else if (dynamicsDimension == "distance")
-        {
-            dynamicsType = openScenario::LaneChangeParameter::DynamicsType::Distance;
-        }
-        else
-        {
-            LogErrorAndThrow("Invalid " + std::string(ATTRIBUTE::dynamicsDimension) + " in " + std::string(TAG::laneChangeActionDynamics) + " .");
-        }
-
-        std::string shape = ParseAttribute<std::string>(dynamicsElement, ATTRIBUTE::dynamicsShape, parameters);
-        ThrowIfFalse(shape == "sinusoidal", dynamicsElement, "Currently only shape sinusoidal supported for LaneChangeAction");
-
-        QDomElement targetElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(lateralChildElement, TAG::laneChangeTarget, targetElement),
-                    lateralChildElement, "Tag " + std::string(TAG::laneChangeTarget) + " is missing.");
-
-        QDomElement typeElement;
-        if (SimulationCommon::GetFirstChildElement(targetElement, TAG::relativeTargetLane, typeElement))
-        {
-            std::string entityRef = ParseAttribute<std::string>(typeElement, ATTRIBUTE::entityRef, parameters);
-            int value = ParseAttribute<int>(typeElement, ATTRIBUTE::value, parameters);
-
-            LaneChangeParameter laneChangeParameter {openScenario::LaneChangeParameter::Type::Relative,
-                                                     value,
-                                                     entityRef,
-                                                     transitionDynamicsValue,
-                                                     dynamicsType};
-
-            return LaneChangeAction{laneChangeParameter};
-        }
-        else
-        {
-            ThrowIfFalse(SimulationCommon::GetFirstChildElement(targetElement, TAG::absoluteTargetLane, typeElement),
-                         targetElement, "Tag " + std::string(TAG::absoluteTargetLane) + " is missing.");
-
-            const auto value = ParseAttribute<int>(typeElement, ATTRIBUTE::value, parameters);
-
-            LaneChangeParameter laneChangeParameter {openScenario::LaneChangeParameter::Type::Absolute,
-                                                     value,
-                                                     "",
-                                                     transitionDynamicsValue,
-                                                     dynamicsType};
-
-            return LaneChangeAction {laneChangeParameter};
-        }
-    }
-    else
-    {
-        LogErrorAndThrow("Invalid LateralAction Type.");
-    }
-}
-
-LongitudinalAction ScenarioImporterHelper::ImportLongitudinalAction(QDomElement longitudinalActionElement, Parameters& parameters)
-{
-    QDomElement childOfLongitudinalActionElement;
-    if (SimulationCommon::GetFirstChildElement(longitudinalActionElement, TAG::speedAction, childOfLongitudinalActionElement))
-    {
-        SpeedAction speedAction;
-
-        QDomElement dynamicsElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(childOfLongitudinalActionElement, TAG::speedActionDynamics, dynamicsElement),
-                     childOfLongitudinalActionElement, std::string("Error while importing ") + TAG::speedAction + ". Tag" + TAG::speedActionDynamics + " is missing.");
-
-        speedAction.transitionDynamics.value = ParseAttribute<double>(dynamicsElement, ATTRIBUTE::value, parameters);
-        ThrowIfFalse(speedAction.transitionDynamics.value >= 0.0,
-                     dynamicsElement, "TransitionDynamics value must greater or equal to 0.");
-
-        // DynamicsShape
-        const auto shape = ParseAttribute<std::string>(dynamicsElement, ATTRIBUTE::dynamicsShape, parameters);
-
-        if (shapeConversionMap.find(shape) == shapeConversionMap.cend())
-        {
-            LogErrorAndThrow(std::string("Error while importing ") + TAG::speedActionDynamics + ". " + ATTRIBUTE::dynamicsShape + ": " + shape + " not supported.");
-        }
-
-        speedAction.transitionDynamics.shape = shapeConversionMap.at(shape);
-
-        // DynamicsDimensions
-        speedAction.transitionDynamics.dimension = ParseAttribute<std::string>(dynamicsElement, ATTRIBUTE::dynamicsDimension, parameters);
-
-        if(speedAction.transitionDynamics.dimension != DYNAMICSDIMENSION::rate)
-        {
-            LogErrorAndThrow(std::string("Error while importing ") + TAG::speedActionDynamics + ". " + ATTRIBUTE::dynamicsDimension + ": " + speedAction.transitionDynamics.dimension + " not supported.");
-        }
-
-        // Handle <Target> attributes
-        QDomElement targetElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(childOfLongitudinalActionElement, TAG::speedActionTarget, targetElement),
-                     childOfLongitudinalActionElement, std::string("Error while importing ") + TAG::speedAction + ". Tag" + TAG::speedActionTarget + " is missing.");
-
-        // Handle <Target> internal tags - currently ignoring <Relative> tags
-        QDomElement targetSpeedElement;
-        if (SimulationCommon::GetFirstChildElement(targetElement, TAG::absoluteTargetSpeed, targetSpeedElement))
-        {
-            if (SimulationCommon::HasAttribute(targetSpeedElement, ATTRIBUTE::value))
-            {
-                AbsoluteTargetSpeed absoluteTargetSpeed {ParseAttribute<double>(targetSpeedElement, ATTRIBUTE::value, parameters)};
-                speedAction.target = absoluteTargetSpeed;
-            }
-        }
-        else if (SimulationCommon::GetFirstChildElement(targetElement, TAG::relativeTargetSpeed, targetSpeedElement))
-        {
-            RelativeTargetSpeed relativeTargetSpeed;
-            relativeTargetSpeed.entityRef = ParseAttribute<std::string>(targetSpeedElement, ATTRIBUTE::entityRef, parameters);
-            relativeTargetSpeed.value = ParseAttribute<double>(targetSpeedElement, ATTRIBUTE::value, parameters);
-
-            const auto speedTargetValueType = ParseAttribute<std::string>(targetSpeedElement, ATTRIBUTE::speedTargetValueType, parameters);
-
-            ThrowIfFalse(speedTargetValueTypeConversionMap.find(speedTargetValueType) != speedTargetValueTypeConversionMap.cend(),
-                         targetSpeedElement, std::string("Error while importing ") + ATTRIBUTE::speedTargetValueType + ". Invalid choice.");
-
-            relativeTargetSpeed.speedTargetValueType = speedTargetValueTypeConversionMap.at(speedTargetValueType);
-
-            relativeTargetSpeed.continuous = ParseAttribute<bool>(targetSpeedElement, ATTRIBUTE::continuous, parameters);
-
-            speedAction.target = relativeTargetSpeed;
-        }
-        else
-        {
-            LogErrorAndThrow(std::string("Error while importing ") + TAG::speedActionTarget + ". Invalid choice.");
-        }
-
-        // Parse stochastics if available
-        QDomElement stochasticElement;
-        SimulationCommon::GetFirstChildElement(childOfLongitudinalActionElement, TAG::stochastics, stochasticElement);
-        while (!stochasticElement.isNull())
-        {
-            const auto& [attributeName, stochasticInformation] = ImportStochastics(stochasticElement, parameters);
-            if (attributeName == "velocity")
-            {
-                speedAction.stochasticValue = stochasticInformation;
-                speedAction.stochasticValue.value().mean = std::get<AbsoluteTargetSpeed>(speedAction.target).value;
-            }
-            else if (attributeName == "rate")
-            {
-                speedAction.stochasticDynamics = stochasticInformation;
-                speedAction.stochasticDynamics.value().mean = speedAction.transitionDynamics.value;
-            }
-
-           stochasticElement = stochasticElement.nextSiblingElement(TAG::stochastics);
-        }
-
-        return speedAction;
-    }
-    else
-    {
-        LogErrorAndThrow("Invalid LongitudinalAction Type.");
-    }
-}
-
-TeleportAction ScenarioImporterHelper::ImportTeleportAction(QDomElement teleportActionElement, Parameters& parameters)
-{
-    return ImportPosition(teleportActionElement, parameters);
-}
-
-RoutingAction ScenarioImporterHelper::ImportRoutingAction(QDomElement routingActionElement, Parameters& parameters, const std::string catalogPath)
-{
-
-    QDomElement childOfRoutingActionElement;
-    if(SimulationCommon::GetFirstChildElement(routingActionElement, TAG::assignRouteAction, childOfRoutingActionElement))
-    {
-        AssignRouteAction assignRouteAction;
-
-        QDomElement routeElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(childOfRoutingActionElement, TAG::route, routeElement),
-                     childOfRoutingActionElement, "Tag " + std::string(TAG::route) + " is missing.");
-
-        QDomElement waypointElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(routeElement, TAG::waypoint, waypointElement),
-                     routeElement, "Tag " + std::string(TAG::waypoint) + " is missing.");
-
-        while (!waypointElement.isNull())
-        {
-            const auto position = ScenarioImporterHelper::ImportPosition(waypointElement, parameters);
-
-            if (std::holds_alternative<RoadPosition>(position))
-            {
-                assignRouteAction.push_back(std::get<RoadPosition>(position));
-            }
-            else
-            {
-                LogErrorAndThrow(std::string(TAG::assignRouteAction) + " currently only supports " + TAG::roadPosition + ".");
-            }
-
-            waypointElement = waypointElement.nextSiblingElement(TAG::waypoint);
-        }
-
-        return assignRouteAction;
-    }
-    else if (SimulationCommon::GetFirstChildElement(routingActionElement, TAG::followTrajectoryAction, childOfRoutingActionElement))
-    {
-        Trajectory trajectory;
-
-        Parameters defaultParameters;
-        Parameters assignedParameters;
-
-        QDomElement trajectoryElement;
-        if(!SimulationCommon::GetFirstChildElement(childOfRoutingActionElement, TAG::trajectory, trajectoryElement))
-        {
-            QDomElement catalogReferenceElement;
-            ThrowIfFalse(SimulationCommon::GetFirstChildElement(childOfRoutingActionElement, TAG::catalogReference, catalogReferenceElement),
-                         childOfRoutingActionElement, "Tag " + std::string(TAG::trajectory) + " or " + std::string(TAG::catalogReference) + " is missing.");
-            std::string catalogName = ParseAttribute<std::string>(catalogReferenceElement, ATTRIBUTE::catalogName, parameters);
-            std::string entryName = ParseAttribute<std::string>(catalogReferenceElement, ATTRIBUTE::entryName, parameters);
-            trajectoryElement = GetTrajectoryElementFromCatalog(catalogName, catalogPath, entryName, parameters);
-
-            QDomElement parameterDeclarationElement;
-            SimulationCommon::GetFirstChildElement(trajectoryElement, TAG::parameterDeclarations, parameterDeclarationElement);
-            if (!parameterDeclarationElement.isNull())
-            {
-                ImportParameterDeclarationElement(parameterDeclarationElement, defaultParameters);
-            }
-            QDomElement parameterAssignmentsElement;
-            SimulationCommon::GetFirstChildElement(catalogReferenceElement, TAG::parameterAssignments, parameterAssignmentsElement);
-
-            QDomElement parameterAssignmentElement;
-            SimulationCommon::GetFirstChildElement(parameterAssignmentsElement, TAG::parameterAssignment, parameterAssignmentElement);
-            while (!parameterAssignmentElement.isNull())
-            {
-                auto parameterName = ParseAttribute<std::string>(parameterAssignmentElement, ATTRIBUTE::parameterRef, parameters);
-                auto foundParameter = defaultParameters.find(parameterName);
-                ThrowIfFalse(foundParameter != defaultParameters.cend(), parameterAssignmentElement, "Can not assign parameter \"" + parameterName + "\". No parameter with this name declared.");
-                std::visit([&](auto& value){
-                    assignedParameters.insert({parameterName, ParseAttributeHelper(parameterAssignmentElement, ATTRIBUTE::value, parameters, value)});
-                    },
-                    foundParameter->second);
-                parameterAssignmentElement = parameterAssignmentElement.nextSiblingElement(TAG::parameterAssignment);
-            }
-        }
-        else
-        {
-            defaultParameters = parameters;
-        }
-        trajectory.name = ParseAttribute<std::string>(trajectoryElement, ATTRIBUTE::name, defaultParameters, assignedParameters);
-
-        QDomElement timeReferenceElement;
-        if(SimulationCommon::GetFirstChildElement(childOfRoutingActionElement, TAG::timeReference, timeReferenceElement))
-        {
-            QDomElement timingElement;
-            if(SimulationCommon::GetFirstChildElement(timeReferenceElement, TAG::timing, timingElement)) {
-                TrajectoryTimeReference timeReference;
-
-                ThrowIfFalse(SimulationCommon::HasAttribute(timingElement, ATTRIBUTE::domainAbsoluteRelative),
-                             timingElement,"Attribute " + std::string(ATTRIBUTE::domainAbsoluteRelative) + " is missing.");
-                ThrowIfFalse(SimulationCommon::HasAttribute(timingElement, ATTRIBUTE::scale),
-                             timingElement,"Attribute " + std::string(ATTRIBUTE::scale) + " is missing.");
-                ThrowIfFalse(SimulationCommon::HasAttribute(timingElement, ATTRIBUTE::offset),
-                             timingElement,"Attribute " + std::string(ATTRIBUTE::offset) + " is missing.");
-
-                timeReference.domainAbsoluteRelative = ParseAttribute<std::string>(timingElement, ATTRIBUTE::domainAbsoluteRelative, parameters);
-                timeReference.scale = ParseAttribute<double>(timingElement, ATTRIBUTE::scale, parameters);
-                timeReference.offset = ParseAttribute<double>(timingElement, ATTRIBUTE::offset, parameters);
-
-                trajectory.timeReference = timeReference;
-            }
-        }
-
-        QDomElement shapeElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(trajectoryElement, TAG::shape, shapeElement),
-                             trajectoryElement, "Tag " + std::string(TAG::shape) + " is missing.");
-
-        QDomElement polylineElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(shapeElement, TAG::polyline, polylineElement),
-                             shapeElement, "Tag " + std::string(TAG::polyline) + " is missing.");
-
-        QDomElement vertexElement;
-        ThrowIfFalse(SimulationCommon::GetFirstChildElement(polylineElement, TAG::vertex, vertexElement),
-                     trajectoryElement, "Tag " + std::string(TAG::vertex) + " is missing.");
-        while (!vertexElement.isNull())
-        {
-            const auto position = openScenario::ScenarioImporterHelper::ImportPosition(vertexElement, parameters);
-
-            if(std::holds_alternative<openScenario::WorldPosition>(position))
-            {
-                const auto worldPosition = std::get<openScenario::WorldPosition>(position);
-
-                openScenario::TrajectoryPoint trajectoryPoint;
-                trajectoryPoint.time = ParseAttribute<double>(vertexElement, ATTRIBUTE::time, defaultParameters, assignedParameters);
-                trajectoryPoint.x = worldPosition.x;
-                trajectoryPoint.y = worldPosition.y;
-
-                if (worldPosition.h.has_value())
-                {
-                    trajectoryPoint.yaw = worldPosition.h.value();
-                }
-                else
-                {
-                    LogErrorAndThrow("TrajectoryPoint requires WorldPosition to contain heading.");
-                }
-                trajectory.points.push_back(trajectoryPoint);
-
-                vertexElement = vertexElement.nextSiblingElement(TAG::vertex);
-            }
-            else
-            {
-                LogErrorAndThrow("FollowTrajectoryAction only supports WorldPositions in Vertexes.");
-            }
-        }
-
-        return FollowTrajectoryAction{trajectory};
-    }
-    else if (SimulationCommon::GetFirstChildElement(routingActionElement, TAG::acquirePositionAction, childOfRoutingActionElement))
-    {
-        AcquirePositionAction acquirePositionAction{ScenarioImporterHelper::ImportPosition(childOfRoutingActionElement, parameters)};
-        return acquirePositionAction;
-    }
-    else
-    {
-        LogErrorAndThrow("Invalid RoutingAction type.");
-    }
-}
-
-VisibilityAction ScenarioImporterHelper::ImportVisibilityAction(QDomElement visibilityActionElement, Parameters& parameters)
-{
-    VisibilityAction visibilityAction;
-    visibilityAction.graphics = ParseAttribute<bool>(visibilityActionElement, ATTRIBUTE::graphics, parameters);
-    visibilityAction.traffic = ParseAttribute<bool>(visibilityActionElement, ATTRIBUTE::traffic, parameters);
-    visibilityAction.sensors = ParseAttribute<bool>(visibilityActionElement, ATTRIBUTE::sensors, parameters);
-
-    return visibilityAction;
-}
-
-QDomElement ScenarioImporterHelper::GetTrajectoryElementFromCatalog(const std::string& catalogName, const std::string& catalogPath, const std::string& entryName, openScenario::Parameters& parameters)
-{
-    std::locale::global(std::locale("C"));
-
-    QFile xmlFile(QString::fromStdString(catalogPath)); // automatic object will be closed on destruction
-    ThrowIfFalse(xmlFile.open(QIODevice::ReadOnly), "Could not open TrajectoryCatalog (" + catalogName + ")");
-
-    QByteArray xmlData(xmlFile.readAll());
-    QDomDocument document;
-    QString errorMsg;
-    int errorLine;
-    ThrowIfFalse(document.setContent(xmlData, &errorMsg, &errorLine), "Invalid xml format (" + catalogName + ") in line " + std::to_string(errorLine) + ": " + errorMsg.toStdString());
-
-    QDomElement documentRoot = document.documentElement();
-    ThrowIfFalse(!documentRoot.isNull(), "TrajectoryCatalog has no document root");
-
-    QDomElement catalogElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(documentRoot, TAG::catalog, catalogElement),
-                 documentRoot, "Tag " + std::string(TAG::catalog) + " is missing.");
-
-    QDomElement trajectoryElement;
-    ThrowIfFalse(SimulationCommon::GetFirstChildElement(catalogElement, TAG::trajectory, trajectoryElement),
-                 catalogElement, "Tag " + std::string(TAG::trajectory) + " is missing.");
-    while (!trajectoryElement.isNull())
-    {
-        std::string name = ParseAttribute<std::string>(trajectoryElement, ATTRIBUTE::name, parameters);
-        if (name == entryName)
-        {
-            return trajectoryElement;
-        }
-        trajectoryElement = trajectoryElement.nextSiblingElement(TAG::trajectory);
-    }
-
-    LogErrorAndThrow("Entry " + entryName + " not found in TrajectoryCatalog " + catalogName);
-}
-
-RelativeWorldPosition ScenarioImporterHelper::ImportRelativeWorldPosition(const QDomElement &positionElement, Parameters &parameters)
-{
-    RelativeWorldPosition relativeWorldPosition;
-
-    relativeWorldPosition.entityRef = ParseAttribute<std::string>(positionElement, ATTRIBUTE::entityRef, parameters);
-    relativeWorldPosition.dx = ParseAttribute<double>(positionElement, ATTRIBUTE::dx, parameters);
-    relativeWorldPosition.dy = ParseAttribute<double>(positionElement, ATTRIBUTE::dy, parameters);
-    relativeWorldPosition.dz = ParseOptionalAttribute<double>(positionElement, ATTRIBUTE::dz, parameters);
-
-    QDomElement orientationElement;
-    if (SimulationCommon::GetFirstChildElement(positionElement, TAG::orientation, orientationElement))
-    {
-        relativeWorldPosition.orientation = ImportOrientation(orientationElement, parameters);
-    }
-
-    return relativeWorldPosition;
-}
-
-RelativeObjectPosition ScenarioImporterHelper::ImportRelativeObjectPosition(const QDomElement &positionElement, Parameters &parameters)
-{
-    RelativeObjectPosition relativeObjectPosition;
-
-    relativeObjectPosition.entityRef = ParseAttribute<std::string>(positionElement, ATTRIBUTE::entityRef, parameters);
-    relativeObjectPosition.dx = ParseAttribute<double>(positionElement, ATTRIBUTE::dx, parameters);
-    relativeObjectPosition.dy = ParseAttribute<double>(positionElement, ATTRIBUTE::dy, parameters);
-    relativeObjectPosition.dz = ParseOptionalAttribute<double>(positionElement, ATTRIBUTE::dz, parameters);
-
-    QDomElement orientationElement;
-    if (SimulationCommon::GetFirstChildElement(positionElement, TAG::orientation, orientationElement))
-    {
-        relativeObjectPosition.orientation = ImportOrientation(orientationElement, parameters);
-    }
-
-    return relativeObjectPosition;
-}
-
-} // namespace openScenario
diff --git a/sim/src/core/opSimulation/importer/scenarioImporterHelper.h b/sim/src/core/opSimulation/importer/scenarioImporterHelper.h
deleted file mode 100644
index 2549c0bddd6c10f922377da4d0297692f547c9a6..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/scenarioImporterHelper.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-//! @file  ScenarioImporterHelper.h
-//! @brief This file contains the helper class of the scenario importer.
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <string>
-#include <QDomDocument>
-#include "include/scenarioInterface.h"
-#include "modelElements/parameters.h"
-#include "common/openScenarioDefinitions.h"
-#include "oscImporterCommon.h"
-
-namespace openScenario
-{
-
-class ScenarioImporterHelper
-{
-public:
-    /*!
-    * \brief Import an openscenario Position Element
-    *
-    * @param[in]     root                   Root of the xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    Position
-    */
-    static Position ImportPosition(QDomElement root, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario GlobalAction Element
-    *
-    * @param[in]     globalActionElement                   GlobalAction xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    GlobalAction
-    */
-    static GlobalAction ImportGlobalAction(QDomElement globalActionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario PrivateAction Element
-    *
-    * @param[in]     privateActionElement                   PrivatAction xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    * @param[in]     catalogPath        Catalogpath used by some sub functions
-    *
-    * return    PrivateAction
-    */
-    static PrivateAction ImportPrivateAction(QDomElement privateActionElement, Parameters& parameters, const std::string catalogPath = "");
-
-    /*!
-    * \brief Import an openscenario UserDefinedAction Element
-    *
-    * @param[in]     userDefinedActionElement                   Root of the xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    UserDefinedAction
-    */
-    static UserDefinedAction ImportUserDefinedAction(QDomElement userDefinedActionElement);
-
-private:
-    /*!
-    * \brief Import an openscenario Orientation Element
-    *
-    * @param[in]     orientationElement                   Orientation xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    Orientation
-    */
-    static Orientation ImportOrientation(QDomElement& orientationElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario LanePosition Element
-    *
-    * @param[in]     positionElement                   Position xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    LanePosition
-    */
-    static LanePosition ImportLanePosition(QDomElement positionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario RelativeLanePosition Element
-    *
-    * @param[in]     positionElement                   Position xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    RelativeLanePosition
-    */
-    static RelativeLanePosition ImportRelativeLanePosition(QDomElement positionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario RoadPosition Element
-    *
-    * @param[in]     positionElement                   Position xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    RoadPosition
-    */
-    static RoadPosition ImportRoadPosition(QDomElement positionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario WorldPosition Element
-    *
-    * @param[in]     positionElement                   Position xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    WorldPosition
-    */
-    static WorldPosition ImportWorldPosition(QDomElement positionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario RelativeWorldPosition Element
-    *
-    * @param[in]     positionElement                   Position xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    RelativeWorldPosition
-    */
-    static RelativeWorldPosition ImportRelativeWorldPosition(const QDomElement& positionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario RelativeObjectPosition Element
-    *
-    * @param[in]     positionElement                   Position xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    RelativeObjectPosition
-    */
-    static RelativeObjectPosition ImportRelativeObjectPosition(const QDomElement& positionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openPASS custom Stochastic Element
-    *
-    * @param[in]     stochasticsElement                   Stochastics xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    attributeName, Stochastic
-    */
-    static std::pair<std::string, StochasticAttribute> ImportStochastics(QDomElement& stochasticsElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario EntityAction Element
-    *
-    * @param[in]     entityActionElement               EntityAction xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    EntityAction
-    */
-    static EntityAction ImportEntityAction(QDomElement entityActionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario EnvironmentAction Element
-    *
-    * @param[in]     environmentActionElement               EnvironmentAction xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    EnvironmentAction
-    */
-    static EnvironmentAction ImportEnvironmentAction(QDomElement environmentActionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario LateralAction Element
-    *
-    * @param[in]     lateralActionElement         LateralAction xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    LateralAction
-    */
-    static LateralAction ImportLateralAction(QDomElement lateralActionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario LongitudinalAction Element
-    *
-    * @param[in]     longitudinalActionElement     LongitudinalAction xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    *
-    * return    LongitudinalAction
-    */
-    static LongitudinalAction ImportLongitudinalAction(QDomElement longitudinalActionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario TeleportAction Element
-    *
-    * @param[in]     teleportActionElement      TeleportAction xml Element
-    * @param[in]     parameters                 Parametersset for openScenario parameter references
-    *
-    * return    TeleportAction
-    */
-    static TeleportAction ImportTeleportAction(QDomElement teleportActionElement, Parameters& parameters);
-
-    /*!
-    * \brief Import an openscenario RoutingAction Element
-    *
-    * @param[in]     routingActionElement     RoutingAction xml Element
-    * @param[in]     parameters       Parametersset for openScenario parameter references
-    * @param[in]     catalogPath        CatalogPath
-    *
-    * return    RoutingAction
-    */
-    static RoutingAction ImportRoutingAction(QDomElement routingActionElement, Parameters& parameters, const std::string catalogPath);
-
-    /*!
-    * \brief Import an openscenario VisibilityAction Element
-    *
-    * @param[in]     visbilityActionElement     VisibilityAction xml Element
-    * @param[in]     parameters                 Parametersset for openScenario parameter references
-    *
-    * return    VisibilityAction
-    */
-    static VisibilityAction ImportVisibilityAction(QDomElement visibilityActionElement, Parameters& parameters);
-
-    /*!
-    * \brief Gets the Trajectory xml Element from a specified catalog
-    *
-    * @param[in]     catalogName            Name of the catalog
-    * @param[in]     catalogPath              Path of the catalog
-    * @param[in]     entryName               Name of the catalog entry
-    * @param[in]     parameters              Parametersset for openScenario parameter references
-    *
-    * return    TrajectoryElement
-    */
-    static QDomElement GetTrajectoryElementFromCatalog(const std::string& catalogName,
-                                                       const std::string& catalogPath,
-                                                       const std::string& entryName,
-                                                       openScenario::Parameters& parameters);
-};
-} // namespace openScenario
diff --git a/sim/src/core/opSimulation/importer/sceneryDynamics.cpp b/sim/src/core/opSimulation/importer/sceneryDynamics.cpp
deleted file mode 100644
index a5daffc091f568cf36fa665cf463753bd41961bf..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/sceneryDynamics.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-#include "sceneryDynamics.h"
-
-SceneryDynamics::SceneryDynamics()
-{
-}
-
-openScenario::EnvironmentAction SceneryDynamics::GetEnvironment() const
-{
-    return environment;
-}
-
-void SceneryDynamics::SetEnvironment(const openScenario::EnvironmentAction &environment)
-{
-    this->environment = environment;
-}
-
-std::vector<openScenario::TrafficSignalController> SceneryDynamics::GetTrafficSignalControllers() const
-{
-    return trafficSignalControllers;
-}
-
-void SceneryDynamics::AddTrafficSignalController(const openScenario::TrafficSignalController &controller)
-{
-    trafficSignalControllers.push_back(controller);
-}
diff --git a/sim/src/core/opSimulation/importer/sceneryDynamics.h b/sim/src/core/opSimulation/importer/sceneryDynamics.h
deleted file mode 100644
index ecac15270bc9f132f5fb486843b061b5a7e27ca8..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/importer/sceneryDynamics.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "include/sceneryDynamicsInterface.h"
-#include "common/opExport.h"
-
-class SIMULATIONCOREEXPORT SceneryDynamics : public SceneryDynamicsInterface
-{
-public:
-    SceneryDynamics();
-    virtual ~SceneryDynamics() = default;
-
-    openScenario::EnvironmentAction GetEnvironment() const override;
-
-    //! Sets the environment from the scenario
-    void SetEnvironment(const openScenario::EnvironmentAction& environment);
-
-    std::vector<openScenario::TrafficSignalController> GetTrafficSignalControllers() const override;
-
-    //! Adds a new controller to the list of traffic signal controllers
-    //!
-    //! \param controller   controller to add
-    void AddTrafficSignalController(const openScenario::TrafficSignalController &controller);
-
-private:
-    openScenario::EnvironmentAction environment;
-    std::vector<openScenario::TrafficSignalController> trafficSignalControllers;
-};
diff --git a/sim/src/core/opSimulation/importer/sceneryImporter.cpp b/sim/src/core/opSimulation/importer/sceneryImporter.cpp
index be7eb27c6fcedb6cb718ba4b0d15a0e77d603457..c6bca03d2cb82cf642cfc4fdf05c660b6df255d5 100644
--- a/sim/src/core/opSimulation/importer/sceneryImporter.cpp
+++ b/sim/src/core/opSimulation/importer/sceneryImporter.cpp
@@ -144,7 +144,12 @@ void SceneryImporter::ParseLanes(QDomElement& rootElement,
             {
                 while (!widthOrBorderElement.isNull())
                 {
-                    double sOffset, a, b, c, d;
+                    units::length::meter_t sOffset;
+                    units::length::meter_t a;
+                    double b;
+                    units::unit_t<units::inverse<units::length::meter>> c;
+                    units::unit_t<units::inverse<units::squared<units::length::meter>>> d;
+
                     ThrowIfFalse(SimulationCommon::ParseAttributeDouble(widthOrBorderElement, ATTRIBUTE::sOffset, sOffset),
                                  widthOrBorderElement, "Attribute " + std::string(ATTRIBUTE::sOffset) + " is missing.");
                     ThrowIfFalse(SimulationCommon::ParseAttributeDouble(widthOrBorderElement, ATTRIBUTE::a, a),
@@ -169,7 +174,12 @@ void SceneryImporter::ParseLanes(QDomElement& rootElement,
             {
                 while (!widthOrBorderElement.isNull())
                 {
-                    double sOffset, a, b, c, d;
+                    units::length::meter_t sOffset;
+                    units::length::meter_t a;
+                    double b;
+                    units::unit_t<units::inverse<units::length::meter>> c;
+                    units::unit_t<units::inverse<units::squared<units::length::meter>>> d;
+
                     ThrowIfFalse(SimulationCommon::ParseAttributeDouble(widthOrBorderElement, ATTRIBUTE::sOffset, sOffset),
                                  widthOrBorderElement, "Attribute " + std::string(ATTRIBUTE::sOffset) + " is missing.");
                     ThrowIfFalse(SimulationCommon::ParseAttributeDouble(widthOrBorderElement, ATTRIBUTE::a, a),
@@ -238,8 +248,9 @@ void SceneryImporter::ParseLaneRoadMark(std::string leftCenterRight, QDomElement
 
     while (!roadLaneRoadMarkElement.isNull())
     {
-        double roadLaneSOffset;
-        ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadLaneRoadMarkElement, ATTRIBUTE::sOffset, roadLaneSOffset, 0.0),
+        units::length::meter_t roadLaneSOffset;
+
+        ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadLaneRoadMarkElement, ATTRIBUTE::sOffset, roadLaneSOffset, {0.0_m}),
                      roadLaneRoadMarkElement, "Attribute " + std::string(ATTRIBUTE::sOffset) + " is missing.");
 
         std::string roadMarkTypeStr;
@@ -350,27 +361,27 @@ void SceneryImporter::ParseGeometries(QDomElement& roadElement,
                  roadPlanView, "Tag " + std::string(TAG::geometry) + " is missing.");
     while (!roadGeometryHeaderElement.isNull())
     {
-        double roadGeometryS;
+        units::length::meter_t roadGeometryS;
         ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryHeaderElement, ATTRIBUTE::s, roadGeometryS),
                      roadGeometryHeaderElement, "Attribute " + std::string(ATTRIBUTE::s) + " is missing.");
         roadGeometryS = CommonHelper::roundDoubleWithDecimals(roadGeometryS, 3);
 
-        double roadGeometryX;
+        units::length::meter_t roadGeometryX;
         ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryHeaderElement, ATTRIBUTE::x, roadGeometryX),
                      roadGeometryHeaderElement, "Attribute " + std::string(ATTRIBUTE::x) + " is missing.");
         roadGeometryX = CommonHelper::roundDoubleWithDecimals(roadGeometryX, 3);
 
-        double roadGeometryY;
+        units::length::meter_t roadGeometryY;
         ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryHeaderElement, ATTRIBUTE::y, roadGeometryY),
                      roadGeometryHeaderElement, "Attribute " + std::string(ATTRIBUTE::y) + " is missing.");
         roadGeometryY = CommonHelper::roundDoubleWithDecimals(roadGeometryY, 3);
 
-        double roadGeometryHdg;
+        units::angle::radian_t roadGeometryHdg;
         ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryHeaderElement, ATTRIBUTE::hdg, roadGeometryHdg),
                      roadGeometryHeaderElement, "Attribute " + std::string(ATTRIBUTE::hdg) + " is missing.");
         roadGeometryHdg = CommonHelper::roundDoubleWithDecimals(roadGeometryHdg, 6);
 
-        double roadGeometryLength;
+        units::length::meter_t roadGeometryLength;
         ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryHeaderElement, ATTRIBUTE::length, roadGeometryLength),
                      roadGeometryHeaderElement, "Attribute " + std::string(ATTRIBUTE::length) + " is missing.");
         roadGeometryLength = CommonHelper::roundDoubleWithDecimals(roadGeometryLength, 3);
@@ -388,7 +399,7 @@ void SceneryImporter::ParseGeometries(QDomElement& roadElement,
         }
         else if (SimulationCommon::GetFirstChildElement(roadGeometryHeaderElement, TAG::arc, roadGeometryElement))
         {
-            double roadGeometryCurvature;
+            units::curvature::inverse_meter_t roadGeometryCurvature;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::curvature, roadGeometryCurvature),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::curvature) + " is missing.");
             ThrowIfFalse(road->AddGeometryArc(roadGeometryS,
@@ -402,22 +413,22 @@ void SceneryImporter::ParseGeometries(QDomElement& roadElement,
         }
         else if (SimulationCommon::GetFirstChildElement(roadGeometryHeaderElement, TAG::spiral, roadGeometryElement))
         {
-            double roadGeometryCurvStart;
+            units::curvature::inverse_meter_t roadGeometryCurvStart;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::curvStart, roadGeometryCurvStart),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::curvStart) + " is missing.");
 
-            double roadGeometryCurvEnd;
+            units::curvature::inverse_meter_t roadGeometryCurvEnd;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::curvEnd, roadGeometryCurvEnd),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::curvEnd) + " is missing.");
 
-            if (roadGeometryCurvStart < 1e-7 && roadGeometryCurvStart > -1e-7)
+            if (roadGeometryCurvStart < 1e-7_i_m && roadGeometryCurvStart > -1e-7_i_m)
             {
-                roadGeometryCurvStart = 0;
+                roadGeometryCurvStart = 0_i_m;
             }
 
-            if (roadGeometryCurvEnd < 1e-7 && roadGeometryCurvEnd > -1e-7)
+            if (roadGeometryCurvEnd < 1e-7_i_m && roadGeometryCurvEnd > -1e-7_i_m)
             {
-                roadGeometryCurvEnd = 0;
+                roadGeometryCurvEnd = 0_i_m;
             }
             ThrowIfFalse(road->AddGeometrySpiral(roadGeometryS,
                                                roadGeometryX,
@@ -431,7 +442,7 @@ void SceneryImporter::ParseGeometries(QDomElement& roadElement,
         }
         else if (SimulationCommon::GetFirstChildElement(roadGeometryHeaderElement, TAG::poly3, roadGeometryElement))
         {
-            double roadGeometryA;
+            units::length::meter_t roadGeometryA;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::a, roadGeometryA),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::a) + " is missing.");
 
@@ -439,11 +450,11 @@ void SceneryImporter::ParseGeometries(QDomElement& roadElement,
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::b, roadGeometryB),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::b) + " is missing.");
 
-            double roadGeometryC;
+            units::unit_t<units::inverse<units::length::meter>> roadGeometryC;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::c, roadGeometryC),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::c) + " is missing.");
 
-            double roadGeometryD;
+            units::unit_t<units::inverse<units::squared<units::length::meter>>> roadGeometryD;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::d, roadGeometryD),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::d) + " is missing.");
             ThrowIfFalse(road->AddGeometryPoly3(roadGeometryS,
@@ -460,35 +471,35 @@ void SceneryImporter::ParseGeometries(QDomElement& roadElement,
         }
         else if (SimulationCommon::GetFirstChildElement(roadGeometryHeaderElement, TAG::paramPoly3, roadGeometryElement))
         {
-            double roadGeometryaU;
+            units::length::meter_t roadGeometryaU;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::aU, roadGeometryaU),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::aU) + " is missing.");
 
-            double roadGeometrybU;
+            units::dimensionless::scalar_t roadGeometrybU;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::bU, roadGeometrybU),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::bU) + " is missing.");
 
-            double roadGeometrycU;
+            units::curvature::inverse_meter_t roadGeometrycU;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::cU, roadGeometrycU),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::cU) + " is missing.");
 
-            double roadGeometrydU;
+            units::unit_t<units::inverse<units::squared<units::length::meter>>> roadGeometrydU;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::dU, roadGeometrydU),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::dU) + " is missing.");
 
-            double roadGeometryaV;
+            units::length::meter_t roadGeometryaV;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::aV, roadGeometryaV),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::aV) + " is missing.");
 
-            double roadGeometrybV;
+            units::dimensionless::scalar_t roadGeometrybV;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::bV, roadGeometrybV),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::bV) + " is missing.");
 
-            double roadGeometrycV;
+            units::curvature::inverse_meter_t roadGeometrycV;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::cV, roadGeometrycV),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::cV) + " is missing.");
 
-            double roadGeometrydV;
+            units::unit_t<units::inverse<units::squared<units::length::meter>>> roadGeometrydV;
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadGeometryElement, ATTRIBUTE::dV, roadGeometrydV),
                          roadGeometryElement, "Attribute " + std::string(ATTRIBUTE::dV) + " is missing.");
 
@@ -529,7 +540,11 @@ void SceneryImporter::ParseElevationProfile(QDomElement& roadElement,
         {
             while (!elevationElement.isNull())
             {
-                double elevationS, elevationA, elevationB, elevationC, elevationD;
+                units::length::meter_t elevationS;
+                units::length::meter_t elevationA;
+                double elevationB;
+                units::unit_t<units::inverse<units::length::meter>> elevationC;
+                units::unit_t<units::inverse<units::squared<units::length::meter>>> elevationD;
                 ThrowIfFalse(SimulationCommon::ParseAttributeDouble(elevationElement, ATTRIBUTE::s, elevationS),
                              elevationElement, "Attribute " + std::string(ATTRIBUTE::s) + " is missing.");
 
@@ -644,11 +659,11 @@ void SceneryImporter::ParseRoadLinks(QDomElement& roadElement,
 
 void SceneryImporter::checkRoadSignalBoundaries(RoadSignalSpecification signal)
 {
-    ThrowIfFalse((signal.s >= 0 &&
+    ThrowIfFalse((signal.s >= 0_m &&
                  (signal.dynamic == "yes" || signal.dynamic == "no") &&
                  (signal.orientation == "+" || signal.orientation == "-" || signal.orientation == "none") &&
-                 signal.height >= 0 &&
-                 signal.width >= 0),
+                 signal.height >= 0_m &&
+                 signal.width >= 0_m),
             "Invalid road signal boundaries.");
 }
 
@@ -776,7 +791,7 @@ void SceneryImporter::ParseObject(QDomElement& objectElement, RoadInterface* roa
     ThrowIfFalse(object.checkStandardCompliance(), objectElement,
                  "limits of object are not valid for openDrive standard");
 
-    if (object.radius > 0)
+    if (object.radius > 0_m)
     {
         ConvertRadius(object);
     }
@@ -797,7 +812,7 @@ void SceneryImporter::ConvertRadius(RoadObjectSpecification& object)
 {
     object.width = 2.0 * object.radius;
     object.length = 2.0 * object.radius;
-    object.radius = 0.0;
+    object.radius = 0.0_m;
 }
 
 void SceneryImporter::AddParsedObjectsToRoad(std::vector<RoadObjectSpecification> parsedObjects, RoadInterface* road)
@@ -872,7 +887,7 @@ void SceneryImporter::ParseRepeat(QDomElement& repeatElement, RoadObjectSpecific
 void SceneryImporter::ApplyRepeat(ObjectRepeat repeat, RoadObjectSpecification object,
                                   std::vector<RoadObjectSpecification>& objectRepitions)
 {
-    const auto isRepeating = (repeat.distance == 0);
+    const auto isRepeating = (repeat.distance == 0_m);
 
     if (isRepeating)
     {
@@ -880,7 +895,7 @@ void SceneryImporter::ApplyRepeat(ObjectRepeat repeat, RoadObjectSpecification o
     }
     size_t objectCount = isRepeating ? 1 : size_t(repeat.length / repeat.distance);
 
-    std::vector<double> interpolatedT, interpolatedHeight, interpolatedWidth, interpolatedZOffset;
+    std::vector<units::length::meter_t> interpolatedT, interpolatedHeight, interpolatedWidth, interpolatedZOffset;
 
     if (repeat.t.isSet) { interpolatedT = CommonHelper::InterpolateLinear(repeat.t.start,  repeat.t.end, objectCount); }
     if (repeat.height.isSet) { interpolatedHeight = CommonHelper::InterpolateLinear(repeat.height.start, repeat.height.end, objectCount); }
@@ -896,7 +911,7 @@ void SceneryImporter::ApplyRepeat(ObjectRepeat repeat, RoadObjectSpecification o
         if (repeat.height.isSet) { repeatingObject.height = interpolatedHeight.at(i); }
         if (repeat.width.isSet) { repeatingObject.width = interpolatedWidth.at(i); }
         if (repeat.zOffset.isSet) { repeatingObject.zOffset = interpolatedZOffset.at(i); }
-        repeatingObject.continuous = (repeat.distance == 0);
+        repeatingObject.continuous = (repeat.distance == 0_m);
 
         ThrowIfFalse(repeatingObject.checkStandardCompliance(), "Standard compliance invalid.");
 
@@ -990,20 +1005,24 @@ void SceneryImporter::ParseRoadLanes(QDomElement& roadElement,
     {
         while (!laneOffsetElement.isNull())
         {
-            double laneOffsetS, laneOffsetA, laneOffsetB, laneOffsetC, laneOffsetD;
-            ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::s, laneOffsetS, 0.0),
+            units::length::meter_t laneOffsetS;
+            units::length::meter_t laneOffsetA;
+            double laneOffsetB;
+            units::unit_t<units::inverse<units::length::meter>> laneOffsetC;
+            units::unit_t<units::inverse<units::squared<units::length::meter>>> laneOffsetD;
+            ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::s, laneOffsetS, {0.0_m}),
                          laneOffsetElement, "Attribute " + std::string(ATTRIBUTE::s) + " is missing.");
 
-            ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::a, laneOffsetA, 0.0),
+            ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::a, laneOffsetA, {0.0_m}),
                          laneOffsetElement, "Attribute " + std::string(ATTRIBUTE::a) + " is missing.");
 
             ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::b, laneOffsetB, 0.0),
                          laneOffsetElement, "Attribute " + std::string(ATTRIBUTE::b) + " is missing.");
 
-            ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::c, laneOffsetC, 0.0),
+            ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::c, laneOffsetC, {units::unit_t<units::inverse<units::length::meter>>(0.0)}),
                          laneOffsetElement, "Attribute " + std::string(ATTRIBUTE::c) + " is missing.");
 
-            ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::d, laneOffsetD, 0.0),
+            ThrowIfFalse(SimulationCommon::ParseAttributeDouble(laneOffsetElement, ATTRIBUTE::d, laneOffsetD, {units::unit_t<units::inverse<units::squared<units::length::meter>>>(0.0)}),
                          laneOffsetElement, "Attribute " + std::string(ATTRIBUTE::d) + " is missing.");
 
             road->AddLaneOffset(laneOffsetS,
@@ -1022,7 +1041,7 @@ void SceneryImporter::ParseRoadLanes(QDomElement& roadElement,
                  roadLanesElement, "Tag " + std::string(TAG::laneSection) + " is missing.");
     while (!roadLaneSectionElement.isNull())
     {
-        double roadLaneSectionStart;
+        units::length::meter_t roadLaneSectionStart;
         ThrowIfFalse(SimulationCommon::ParseAttributeDouble(roadLaneSectionElement, ATTRIBUTE::s, roadLaneSectionStart),
                      roadLaneSectionElement, "Attribute " + std::string(ATTRIBUTE::s) + " is missing.");
 
diff --git a/sim/src/core/opSimulation/importer/sceneryImporter.h b/sim/src/core/opSimulation/importer/sceneryImporter.h
index 1ef2dafcf271afc4090210f416b208fac3fb6ddc..c22f8610f0a65306943c27ac095661ad02dbcd96 100644
--- a/sim/src/core/opSimulation/importer/sceneryImporter.h
+++ b/sim/src/core/opSimulation/importer/sceneryImporter.h
@@ -18,7 +18,7 @@
 
 #include <map>
 #include <list>
-#include <QDomDocument>
+#include <QtXml/QDomDocument>
 #include "scenery.h"
 #include "include/roadInterface/junctionInterface.h"
 #include "include/roadInterface/connectionInterface.h"
diff --git a/sim/src/core/opSimulation/importer/simulationConfigImporter.cpp b/sim/src/core/opSimulation/importer/simulationConfigImporter.cpp
index ba10a8d39fcd1872e8054cdfd2eff42bcc3e1c13..57ce2b1c4a20697f43c8c3b68398b1c03efe0aba 100644
--- a/sim/src/core/opSimulation/importer/simulationConfigImporter.cpp
+++ b/sim/src/core/opSimulation/importer/simulationConfigImporter.cpp
@@ -138,8 +138,7 @@ void SimulationConfigImporter::ImportSpawners(const QDomElement &spawnersElement
                                                   Configuration::SimulationConfig& simulationConfig)
 {
     QDomElement spawnPointElement;
-    ThrowIfFalse(GetFirstChildElement(spawnersElement, TAG::spawner, spawnPointElement),
-                 spawnersElement, "Tag " + std::string(TAG::spawner) + " is missing.");
+    GetFirstChildElement(spawnersElement, TAG::spawner, spawnPointElement);
 
     while (!spawnPointElement.isNull())
     {
diff --git a/sim/src/core/opSimulation/importer/vehicleModels.cpp b/sim/src/core/opSimulation/importer/vehicleModels.cpp
index d9b9b6441992d78265321f2bcd963bf4cb4178bc..75e8565a9a2163bfc0e4b3c5aa3378d25e9b5b95 100644
--- a/sim/src/core/opSimulation/importer/vehicleModels.cpp
+++ b/sim/src/core/opSimulation/importer/vehicleModels.cpp
@@ -21,24 +21,19 @@ VehicleModels::~VehicleModels()
 {
 }
 
-const VehicleModelMap &VehicleModels::GetVehicleModelMap() const
-{
-    return vehicleModelMap;
-}
-
-void VehicleModels::AddVehicleModel(const std::string& name, const ParametrizedVehicleModelParameters& vehicleModel)
+void VehicleModels::AddVehicleModel(const std::string& name, mantle_api::VehicleProperties vehicleModel)
 {
     vehicleModelMap.insert({name, vehicleModel});
 }
 
-VehicleModelParameters VehicleModels::GetVehicleModel(std::string vehicleModelType, const openScenario::Parameters& parameters) const
+mantle_api::VehicleProperties VehicleModels::GetVehicleModel(std::string vehicleModelType) const
 {
     auto find_result = vehicleModelMap.find(vehicleModelType);
     if (find_result == vehicleModelMap.cend())
     {
         throw std::runtime_error("No VehicleModel with name \"" + vehicleModelType + "\" defined in VehicleCatalog and PedestrianCatalog");
     }
-    return find_result->second.Get(parameters);
+    return find_result->second;
 }
 
 } //namespace Configuration
diff --git a/sim/src/core/opSimulation/importer/vehicleModels.h b/sim/src/core/opSimulation/importer/vehicleModels.h
index b8aa7f1094cb9167e4b80b31b1b4c18194fce0ca..75b3d82393bd12c677d2acf2c9585e52c83fab6d 100644
--- a/sim/src/core/opSimulation/importer/vehicleModels.h
+++ b/sim/src/core/opSimulation/importer/vehicleModels.h
@@ -23,9 +23,9 @@ public:
     VehicleModels();
     ~VehicleModels();
 
-    const VehicleModelMap& GetVehicleModelMap() const;
-    void AddVehicleModel(const std::string& name, const ParametrizedVehicleModelParameters& vehicleModel);
-    VehicleModelParameters GetVehicleModel(std::string vehicleModelType, const openScenario::Parameters& parameters = {}) const;
+    void AddVehicleModel(const std::string& name, mantle_api::VehicleProperties vehicleModel);
+
+    mantle_api::VehicleProperties GetVehicleModel(std::string vehicleModelType) const;
 
 private:
     VehicleModelMap vehicleModelMap;
diff --git a/sim/src/core/opSimulation/importer/vehicleModelsImporter.cpp b/sim/src/core/opSimulation/importer/vehicleModelsImporter.cpp
index 345189b139530dbc9fccfc77bac33d17dddcd320..63d13be47591579f7db3ddaee44d622585c187ed 100644
--- a/sim/src/core/opSimulation/importer/vehicleModelsImporter.cpp
+++ b/sim/src/core/opSimulation/importer/vehicleModelsImporter.cpp
@@ -1,6 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2020 HLRS, University of Stuttgart
  *               2017-2020 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -104,9 +105,9 @@ void VehicleModelsImporter::ImportCatalog(const std::string& catalogPath, QDomEl
 
 void VehicleModelsImporter::CheckModelParameters(const ParametrizedVehicleModelParameters& model)
 {
-    ThrowIfFalse(model.boundingBoxDimensions.length.defaultValue > 0, "Length must be positive");
-    ThrowIfFalse(model.boundingBoxDimensions.width.defaultValue > 0, "Width must be positive");
-    ThrowIfFalse(model.boundingBoxDimensions.height.defaultValue > 0, "Height must be positive");
+    ThrowIfFalse(model.bounding_box.dimension.length.defaultValue > 0, "Length must be positive");
+    ThrowIfFalse(model.bounding_box.dimension.width.defaultValue > 0, "Width must be positive");
+    ThrowIfFalse(model.bounding_box.dimension.height.defaultValue > 0, "Height must be positive");
     ThrowIfFalse(model.performance.maxSpeed.defaultValue > 0, "MaxSpeed must be positive");
     ThrowIfFalse(model.vehicleType != AgentVehicleType::Undefined, "Unknown vehicle type");
 }
@@ -134,18 +135,18 @@ void VehicleModelsImporter::ImportVehicleModelAxles(QDomElement& vehicleElement,
 
 void VehicleModelsImporter::ImportVehicleModelAxle(QDomElement& axleElement, ParametrizedVehicleModelParameters::Axle& axleParameters, openScenario::Parameters& parameters)
 {
-    axleParameters.wheelDiameter = ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::wheelDiameter, parameters);
-    axleParameters.positionX = ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::positionX, parameters);
-    axleParameters.positionZ = ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::positionZ, parameters);
-    axleParameters.trackWidth = ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::trackWidth, parameters);
-    axleParameters.maxSteering = ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::maxSteering, parameters);
+    axleParameters.wheelDiameter = units::length::meter_t(ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::wheelDiameter, parameters));
+    axleParameters.positionX = units::length::meter_t(ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::positionX, parameters));
+    axleParameters.positionZ = units::length::meter_t(ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::positionZ, parameters));
+    axleParameters.trackWidth = units::length::meter_t(ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::trackWidth, parameters));
+    axleParameters.maxSteering = units::length::meter_t(ParseParametrizedAttribute<double>(axleElement, ATTRIBUTE::maxSteering, parameters));
 }
 
 void VehicleModelsImporter::ValidateAxles(const ParametrizedVehicleModelParameters::Axle& frontAxle, const ParametrizedVehicleModelParameters::Axle& rearAxle)
 {
-    ThrowIfFalse(rearAxle.positionX.defaultValue == 0.0, "Reference point not on rear axle.");
+    ThrowIfFalse(rear_axle.bb_center_to_axle_center.x.defaultValue == 0.0, "Reference point not on rear axle.");
 
-    if (rearAxle.positionX.defaultValue > frontAxle.positionX.defaultValue)
+    if (rear_axle.bb_center_to_axle_center.x.defaultValue > front_axle.bb_center_to_axle_center.x.defaultValue)
     {
         LOG_INTERN(LogLevel::Warning) << "Front axle is located behind rear axle.";
     }
@@ -175,16 +176,16 @@ void VehicleModelsImporter::ImportModelBoundingBox(QDomElement& modelElement, Pa
     modelParameters.boundingBoxCenter.x = ParseParametrizedAttribute<double>(boundingBoxCenterElement, ATTRIBUTE::x, parameters);
     modelParameters.boundingBoxCenter.y = ParseParametrizedAttribute<double>(boundingBoxCenterElement, ATTRIBUTE::y, parameters);
     modelParameters.boundingBoxCenter.z = ParseParametrizedAttribute<double>(boundingBoxCenterElement, ATTRIBUTE::z, parameters);
-    modelParameters.boundingBoxDimensions.width = ParseParametrizedAttribute<double>(boundingBoxDimensionElement, ATTRIBUTE::width, parameters);
-    modelParameters.boundingBoxDimensions.length = ParseParametrizedAttribute<double>(boundingBoxDimensionElement, ATTRIBUTE::length, parameters);
-    modelParameters.boundingBoxDimensions.height = ParseParametrizedAttribute<double>(boundingBoxDimensionElement, ATTRIBUTE::height, parameters);
+    modelParameters.bounding_box.dimension.width = ParseParametrizedAttribute<double>(boundingBoxDimensionElement, ATTRIBUTE::width, parameters);
+    modelParameters.bounding_box.dimension.length = ParseParametrizedAttribute<double>(boundingBoxDimensionElement, ATTRIBUTE::length, parameters);
+    modelParameters.bounding_box.dimension.height = ParseParametrizedAttribute<double>(boundingBoxDimensionElement, ATTRIBUTE::height, parameters);
 
     if (modelParameters.boundingBoxCenter.y.defaultValue != 0.0)
     {
         LOG_INTERN(LogLevel::Warning) << "Model bounding box center y-coordinate != 0.0";
     }
 
-    if (std::abs(modelParameters.boundingBoxCenter.z.defaultValue - modelParameters.boundingBoxDimensions.height.defaultValue / 2.0) > 1e-6)
+    if (std::abs(modelParameters.boundingBoxCenter.z.defaultValue - modelParameters.bounding_box.dimension.height.defaultValue / 2.0) > 1e-6)
     {
         LOG_INTERN(LogLevel::Warning) << "Model bounding box center z-coordinate is not half height";
     }
@@ -223,12 +224,15 @@ void VehicleModelsImporter::ImportVehicleModel(QDomElement& vehicleElement, Conf
     ThrowIfFalse(vehicleModels.GetVehicleModelMap().find(vehicleModelName.defaultValue) == vehicleModels.GetVehicleModelMap().end(),
                  vehicleElement, "Vehicle model '" + vehicleModelName.defaultValue + "' already exists");
 
-
-    ThrowIfFalse((modelParameters.vehicleType == AgentVehicleType::Car ||
-                  modelParameters.vehicleType == AgentVehicleType::Truck ||
+    ThrowIfFalse((modelParameters.vehicleType == mantle_api::VehicleClass::kMedium_car ||
+                  modelParameters.vehicleType == mantle_api::VehicleClass::kHeavy_truck ||
                   modelParameters.vehicleType == AgentVehicleType::Motorbike ||
                   modelParameters.vehicleType == AgentVehicleType::Bicycle),
-                  vehicleElement, "VehicleModelCatagory '" + vehicleModelCategory.defaultValue + "' currently not supported");
+                 vehicleElement, "VehicleModelCatagory '" + vehicleModelCategory.defaultValue + "' currently not supported");
+
+    ThrowIfFalse(ParseParametrizedAttribute<double>(vehicleElement, ATTRIBUTE::mass, parameters),
+                 vehicleElement, "Attribute " + std::string(ATTRIBUTE::mass) + " is missing.");
+    modelParameters.mass = ParseParametrizedAttribute<double>(vehicleElement, ATTRIBUTE::mass, parameters);
 
     modelParameters.properties = ImportProperties(vehicleElement);
 
@@ -254,16 +258,19 @@ void VehicleModelsImporter::ImportPedestrianModel(QDomElement& pedestrianElement
     ThrowIfFalse(vehicleModels.GetVehicleModelMap().find(pedestrianModelName.defaultValue) == vehicleModels.GetVehicleModelMap().end(),
                  pedestrianElement, "pedestrian model '" + pedestrianModelName.defaultValue + "' already exists");
 
+    ThrowIfFalse(ParseParametrizedAttribute<double>(pedestrianElement, ATTRIBUTE::mass, parameters),
+                 pedestrianElement, "Attribute " + std::string(ATTRIBUTE::mass) + " is missing.");
+    modelParameters.mass = ParseParametrizedAttribute<double>(pedestrianElement, ATTRIBUTE::mass, parameters);
+    
     modelParameters.properties = ImportProperties(pedestrianElement);
     ImportModelBoundingBox(pedestrianElement, modelParameters, parameters);
 
-
-    modelParameters.vehicleType = AgentVehicleType::Pedestrian;
     // Currently, AgentAdapter and Dynamics cannot handle pedestrians properly
     // setting some required defaults here for now for compatibility with cars
+    modelParameters.vehicleType = mantle_api::VehicleClass::kMedium_car;
     modelParameters.rearAxle.wheelDiameter = 1;
-    modelParameters.rearAxle.positionX = 0;
-    modelParameters.frontAxle.positionX = 1;
+    modelParameters.rear_axle.bb_center_to_axle_center.x = 0;
+    modelParameters.front_axle.bb_center_to_axle_center.x = 1;
 
     vehicleModels.AddVehicleModel(pedestrianModelName.defaultValue, modelParameters);
 }
diff --git a/sim/src/core/opSimulation/importer/vehicleModelsImporter.h b/sim/src/core/opSimulation/importer/vehicleModelsImporter.h
index 666b13c6d14ef0a2b76bf7538f1b8be32d91a657..5d799fabbf43dd35accc5b1a63fb851059f3602e 100644
--- a/sim/src/core/opSimulation/importer/vehicleModelsImporter.h
+++ b/sim/src/core/opSimulation/importer/vehicleModelsImporter.h
@@ -23,10 +23,10 @@
 
 namespace Importer {
 
-const std::unordered_map<std::string, AgentVehicleType> vehicleTypeConversionMap = {{"car", AgentVehicleType::Car},
-                                                                                    {"van", AgentVehicleType::Car},
-                                                                                    {"truck", AgentVehicleType::Truck},
-                                                                                    {"bus", AgentVehicleType::Truck},
+const std::unordered_map<std::string, AgentVehicleType> vehicleTypeConversionMap = {{"car", mantle_api::VehicleClass::kMedium_car},
+                                                                                    {"van", mantle_api::VehicleClass::kMedium_car},
+                                                                                    {"truck", mantle_api::VehicleClass::kHeavy_truck},
+                                                                                    {"bus", mantle_api::VehicleClass::kHeavy_truck},
                                                                                     {"motorbike", AgentVehicleType::Motorbike},
                                                                                     {"bicycle", AgentVehicleType::Bicycle}};
 
diff --git a/sim/src/core/opSimulation/modelElements/agent.cpp b/sim/src/core/opSimulation/modelElements/agent.cpp
index 2fc1791c91a3eef588e6075f161c4fffeb522f0e..f4184c5592a49bd0c003bb8460e8294d6c9bf73e 100644
--- a/sim/src/core/opSimulation/modelElements/agent.cpp
+++ b/sim/src/core/opSimulation/modelElements/agent.cpp
@@ -16,23 +16,23 @@
 #include <map>
 #include <vector>
 
-#include "include/agentBlueprintInterface.h"
-#include "common/log.h"
-#include "modelElements/parameters.h"
 #include "agentDataPublisher.h"
 #include "agentType.h"
+#include "bindings/modelBinding.h"
 #include "channel.h"
+#include "common/log.h"
 #include "component.h"
 #include "componentType.h"
-#include "bindings/modelBinding.h"
+#include "include/agentBlueprintInterface.h"
+#include "modelElements/parameters.h"
 #include "spawnPoint.h"
 
 class DataBufferWriteInterface;
 
 namespace core {
 
-Agent::Agent(WorldInterface *world, const AgentBlueprintInterface& agentBlueprint) :
-    agentInterface(world->CreateAgentAdapter(agentBlueprint)),
+Agent::Agent(WorldInterface *world, const AgentBuildInstructions &agentBuildInstructions) :
+    agentInterface(world->CreateAgentAdapter(agentBuildInstructions)),
     id(agentInterface.GetId()),
     world(world)
 {
@@ -63,15 +63,14 @@ Agent::~Agent()
     channels.clear();
 }
 
-bool Agent::Instantiate(const AgentBlueprintInterface& agentBlueprint,
+bool Agent::Instantiate(const AgentBuildInstructions &agentBuildInstructions,
                         ModelBinding *modelBinding,
                         StochasticsInterface *stochastics,
                         ObservationNetworkInterface *observationNetwork,
-                        EventNetworkInterface *eventNetwork,
                         DataBufferWriteInterface *dataBuffer)
 {
     // instantiate channels
-    for (int channelId : agentBlueprint.GetAgentType().GetChannels())
+    for (int channelId : agentBuildInstructions.system.agentType->GetChannels())
     {
         LOG_INTERN(LogLevel::DebugCore) << "- instantiate channel " << channelId;
 
@@ -94,7 +93,7 @@ bool Agent::Instantiate(const AgentBlueprintInterface& agentBlueprint,
 
     // instantiate components
     publisher = std::make_unique<openpass::publisher::AgentDataPublisher>(dataBuffer, id);
-    for (const std::pair<const std::string, std::shared_ptr<ComponentType>> &itemComponentType : agentBlueprint.GetAgentType().GetComponents())
+    for (const std::pair<const std::string, std::shared_ptr<ComponentType>> &itemComponentType : agentBuildInstructions.system.agentType->GetComponents())
     {
         std::string componentName = itemComponentType.first;
         std::shared_ptr<ComponentType> componentType = itemComponentType.second;
@@ -107,7 +106,7 @@ bool Agent::Instantiate(const AgentBlueprintInterface& agentBlueprint,
                                                                   world,
                                                                   observationNetwork,
                                                                   this,
-                                                                  eventNetwork,
+                                                                  agentBuildInstructions.controlStrategies,
                                                                   publisher.get());
         if (!component)
         {
diff --git a/sim/src/core/opSimulation/modelElements/agent.h b/sim/src/core/opSimulation/modelElements/agent.h
index 07cb80f953a3ffb2c17da683de96e992e68553d4..0a1cd6b5ea922cb92604a5e9ea0edead05b8deb8 100644
--- a/sim/src/core/opSimulation/modelElements/agent.h
+++ b/sim/src/core/opSimulation/modelElements/agent.h
@@ -28,7 +28,6 @@
 #include "include/componentInterface.h"
 
 class DataBufferWriteInterface;
-class AgentBlueprintInterface;
 
 namespace core
 {
@@ -43,7 +42,7 @@ class SpawnItemParameter;
 class Agent
 {
 public:
-    Agent(WorldInterface *world, const AgentBlueprintInterface& agentBlueprint);
+    Agent(WorldInterface *world, const AgentBuildInstructions& agentBuildInstructions);
     Agent(const Agent&) = delete;
     Agent(Agent&&) = delete;
     Agent& operator=(const Agent&) = delete;
@@ -61,11 +60,10 @@ public:
         return id;
     }
 
-    bool Instantiate(const AgentBlueprintInterface& agentBlueprint,
+    bool Instantiate(const AgentBuildInstructions &agentBuildInstructions,
                      ModelBinding *modelBinding,
                      StochasticsInterface *stochastics,
                      core::ObservationNetworkInterface *observationNetwork,
-                     EventNetworkInterface *eventNetwork,
                      DataBufferWriteInterface* dataBuffer);
 
     AgentInterface* GetAgentAdapter() const;
diff --git a/sim/src/core/opSimulation/modelElements/agentBlueprint.cpp b/sim/src/core/opSimulation/modelElements/agentBlueprint.cpp
deleted file mode 100644
index bd89f3f6d872ed3c80a8f596e0056eae9a4ca77e..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modelElements/agentBlueprint.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2016 ITK Engineering GmbH
- *               2017-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "agentBlueprint.h"
-#include <assert.h>
-
-AgentBlueprint::AgentBlueprint()
-{
-}
-
-void AgentBlueprint::SetVehicleComponentProfileNames(VehicleComponentProfileNames vehicleComponentProfileNames)
-{
-    this->vehicleComponentProfileNames = vehicleComponentProfileNames;
-}
-
-void AgentBlueprint::SetAgentCategory(AgentCategory agentCategory)
-{
-    this->agentCategory = agentCategory;
-}
-
-void AgentBlueprint::SetAgentProfileName(std::string agentTypeName)
-{
-    this->agentProfileName = agentTypeName;
-}
-
-void AgentBlueprint::SetVehicleProfileName(std::string vehicleProfileName)
-{
-    this->vehicleProfileName = vehicleProfileName;
-}
-
-void AgentBlueprint::SetVehicleModelName(std::string vehicleModelName)
-{
-    this->vehicleModelName = vehicleModelName;
-}
-
-void AgentBlueprint::SetVehicleModelParameters(VehicleModelParameters vehicleModelParameters)
-{
-    this->vehicleModelParameters = vehicleModelParameters;
-}
-
-void AgentBlueprint::SetDriverProfileName(std::string driverProfileName)
-{
-    this->driverProfileName = driverProfileName;
-}
-
-void AgentBlueprint::SetSpawnParameter(SpawnParameter spawnParameter)
-{
-    this->spawnParameter = spawnParameter;
-}
-
-void AgentBlueprint::SetSpeedGoalMin(double speedGoalMin)
-{
-    this->speedGoalMin = speedGoalMin;
-}
-
-void AgentBlueprint::SetObjectName(std::string objectName)
-{
-    this->objectName = objectName;
-}
-
-void AgentBlueprint::AddSensor(openpass::sensors::Parameter parameters)
-{
-    sensorParameters.push_back(parameters);
-}
-
-AgentCategory AgentBlueprint::GetAgentCategory() const
-{
-    return agentCategory;
-}
-
-std::string AgentBlueprint::GetAgentProfileName() const
-{
-    return agentProfileName;
-}
-
-std::string AgentBlueprint::GetVehicleProfileName() const
-{
-    return vehicleProfileName;
-}
-
-std::string AgentBlueprint::GetVehicleModelName() const
-{
-    return vehicleModelName;
-}
-
-std::string AgentBlueprint::GetObjectName() const
-{
-    return objectName;
-}
-
-std::string AgentBlueprint::GetDriverProfileName() const
-{
-    return driverProfileName;
-}
-
-VehicleModelParameters AgentBlueprint::GetVehicleModelParameters() const
-{
-    return vehicleModelParameters;
-}
-
-openpass::sensors::Parameters AgentBlueprint::GetSensorParameters() const
-{
-    return sensorParameters;
-}
-
-VehicleComponentProfileNames AgentBlueprint::GetVehicleComponentProfileNames() const
-{
-    return vehicleComponentProfileNames;
-}
-
-void AgentBlueprint::SetAgentType(std::shared_ptr<core::AgentTypeInterface> agentType)
-{
-    this->agentType = agentType;
-}
-
-
-core::AgentTypeInterface& AgentBlueprint::GetAgentType() const
-{
-    assert(agentType.get());
-    return *agentType.get();
-}
-
-SpawnParameter& AgentBlueprint::GetSpawnParameter()
-{
-    return spawnParameter;
-}
-
-const SpawnParameter& AgentBlueprint::GetSpawnParameter() const
-{
-    return spawnParameter;
-}
-
-double AgentBlueprint::GetSpeedGoalMin() const
-{
-    return speedGoalMin;
-}
diff --git a/sim/src/core/opSimulation/modelElements/agentBlueprint.h b/sim/src/core/opSimulation/modelElements/agentBlueprint.h
deleted file mode 100644
index 0ed21c9d4c39a0f9a468e0bc80a0a862ef1d77bf..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modelElements/agentBlueprint.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2016 ITK Engineering GmbH
- *               2017-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  AgentBlueprint.h
-*   \brief This file stores all information which is necessary to instantiate an agent
-*/
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include "agentType.h"
-#include "include/agentBlueprintInterface.h"
-#include "spawnItemParameter.h"
-
-//-----------------------------------------------------------------------------
-/** \brief This class stores all information which is required to instantiate an agent.
-*   \details The information stored include physical spawn variable as well as components the agent consists out of.
-*
-*/
-//-----------------------------------------------------------------------------
-class AgentBlueprint : public AgentBlueprintInterface
-{
-public:
-    AgentBlueprint();
-    virtual ~AgentBlueprint() override = default;
-
-    /*!
-    * \brief Sets the vehicle component profile names
-    *
-    * @param[in]     vehicleComponentProfileNames
-    */
-    virtual void SetVehicleComponentProfileNames(VehicleComponentProfileNames vehicleComponentProfileNames) override;
-
-    /*!
-    * \brief Sets the agent category
-    *
-    * @param[in]     agentCategory
-    */
-    virtual void SetAgentCategory(AgentCategory agentCategory) override;
-
-    /*!
-    * \brief Sets the agent profile name
-    *
-    * @param[in]     agentProfileName
-    */
-    virtual void SetAgentProfileName(std::string agentProfileName) override;
-
-    /*!
-    * \brief Sets the vehicle profile name
-    *
-    * @param[in]     vehicleProfileName
-    */
-    virtual void SetVehicleProfileName(std::string vehicleProfileName) override;
-
-    /*!
-    * \brief Sets the vehicle model name
-    *
-    * @param[in]     vehicleModelName
-    */
-    virtual void SetVehicleModelName(std::string vehicleModelName) override;
-
-    /*!
-    * \brief Sets the vehicle model parameter
-    *
-    * @param[in]     vehicleModelParameters
-    */
-    virtual void SetVehicleModelParameters(VehicleModelParameters vehicleModelParameters) override;
-
-    /*!
-    * \brief Sets the driver profile name
-    *
-    * @param[in]     driverProfileName
-    */
-    virtual void SetDriverProfileName(std::string driverProfileName) override;
-
-    /*!
-    * \brief Sets the spawn parameter
-    *
-    * @param[in]     spawnParameter
-    */
-    virtual void SetSpawnParameter(SpawnParameter spawnParameter) override;
-
-    /*!
-    * \brief Sets the minimum speed goal
-    *
-    * @param[in]     speedGoalMin
-    */
-    virtual void SetSpeedGoalMin(double speedGoalMin) override;
-
-    /*!
-    * \brief Sets the object name
-    *
-    * @param[in]     objectName
-    */
-    virtual void SetObjectName(std::string objectName) override;
-
-    /*!
-    * \brief Adds a sensor to the vehicle model parameters
-    *
-    * @param[in]     name           Name of the sensor
-    * @param[in]     parameters     Parameters of the sensor
-    */
-    virtual void AddSensor(openpass::sensors::Parameter parameters) override;
-
-    /*!
-    * \brief Returns the agent category
-    *
-    * @return     agentCategory
-    */
-    virtual AgentCategory               GetAgentCategory() const override;
-
-    /*!
-    * \brief Returns the agent profile name
-    *
-    * @return     agentProfileName
-    */
-    virtual std::string                 GetAgentProfileName() const override;
-
-    /*!
-    * \brief Returns the vehicle profile name
-    *
-    * @return     vehicleProfileName
-    */
-    virtual std::string                 GetVehicleProfileName() const override;
-
-    /*!
-    * \brief Returns the vehicle model name
-    *
-    * @return     vehicleModelName
-    */
-    virtual std::string                 GetVehicleModelName() const override;
-
-    /*!
-    * \brief Returns the driver profile name
-    *
-    * @return     driverProfileName
-    */
-    virtual std::string                 GetDriverProfileName() const override;
-
-    /*!
-    * \brief Returns the object name
-    *
-    * @return     objectName
-    */
-    virtual std::string                 GetObjectName() const override;
-
-    /*!
-    * \brief Returns the vehicle model parameter
-    *
-    * @return     vehicleModelParameters
-    */
-    virtual VehicleModelParameters       GetVehicleModelParameters() const override;
-
-    /*!
-    * \brief Returns the sensor parameter
-    *
-    * @return     sensorParameter
-    */
-    virtual openpass::sensors::Parameters GetSensorParameters() const override;
-
-    /*!
-    * \brief Returns the vehicle components profile names
-    *
-    * @return     vehicleComponentProfileNames
-    */
-    virtual VehicleComponentProfileNames            GetVehicleComponentProfileNames() const override;
-
-    virtual void SetAgentType(std::shared_ptr<core::AgentTypeInterface> agentType) override;
-
-    /*!
-    * \brief Returns the agent type as pointer
-    *
-    * @return     agentType
-    */
-    virtual core::AgentTypeInterface& GetAgentType() const override;
-
-    /*!
-    * \brief Returns the spawn parameter as reference
-    *
-    * @return     spawnParameter
-    */
-    virtual SpawnParameter&             GetSpawnParameter() override;
-
-    /*!
-    * \brief Returns the spawn parameter as reference
-    *
-    * @return     spawnParameter
-    */
-    virtual const SpawnParameter&       GetSpawnParameter() const override;
-
-    /*!
-    * \brief Returns the minimum speed goal
-    *
-    * @return     speedGoalMin
-    */
-    virtual double                      GetSpeedGoalMin() const override;
-
-private:
-    AgentCategory agentCategory {AgentCategory::Common};
-    std::string agentProfileName = "";
-    std::string vehicleProfileName = "";
-    std::string vehicleModelName = "";
-    std::string driverProfileName = "";
-    std::string objectName = "";
-    VehicleComponentProfileNames vehicleComponentProfileNames;
-
-    SpawnParameter spawnParameter;
-    VehicleModelParameters vehicleModelParameters;
-    openpass::sensors::Parameters sensorParameters;
-
-    std::shared_ptr<core::AgentTypeInterface> agentType {nullptr};
-    double speedGoalMin = 30.0 / 3.6;
-};
-
-
diff --git a/sim/src/core/opSimulation/modelElements/eventDetectorNetwork.cpp b/sim/src/core/opSimulation/modelElements/eventDetectorNetwork.cpp
index 46f48f3abb47c5825fd37f869e8706644ef09de4..9caf64a834225d009bbc151cb0ce02f2783feb2e 100644
--- a/sim/src/core/opSimulation/modelElements/eventDetectorNetwork.cpp
+++ b/sim/src/core/opSimulation/modelElements/eventDetectorNetwork.cpp
@@ -27,21 +27,15 @@ EventDetectorNetwork::~EventDetectorNetwork()
     Clear();
 }
 
-bool EventDetectorNetwork::Instantiate(const std::string libraryPath,
-                                       const ScenarioInterface* scenario,
+// TODO CK: Remove EventDetectorNetwork and create a specific CollisiondDetector
+bool EventDetectorNetwork::Instantiate(const std::string& libraryPath,
                                        EventNetworkInterface* eventNetwork,
                                        StochasticsInterface* stochastics)
 {
-    if (!scenario)
-    {
-        return false;
-    }
-
     //Instantiate all detectors
     try
     {
         eventDetectors = eventDetectorBinding->Instantiate(libraryPath,
-                         scenario,
                          eventNetwork,
                          world,
                          stochastics);
diff --git a/sim/src/core/opSimulation/modelElements/eventDetectorNetwork.h b/sim/src/core/opSimulation/modelElements/eventDetectorNetwork.h
index 8dab891165257f0b2c316b748baeee721014cf42..1afd3e8939a49fd6a89244fc19b901903d0317c5 100644
--- a/sim/src/core/opSimulation/modelElements/eventDetectorNetwork.h
+++ b/sim/src/core/opSimulation/modelElements/eventDetectorNetwork.h
@@ -37,13 +37,11 @@ public:
     //! Instantiates the eventdetector network.
     //!
     //! @param[in]  libraryPath         Path to the library
-    //! @param[in]  scenario            Scenario
     //! @param[in]  eventNetwork        Interface of the eventNetwork
     //! @param[in]  stochastics         The stochastics object
     //! @return                         true, if successful
     //-----------------------------------------------------------------------------
-    bool Instantiate(const std::string libraryPath,
-                     const ScenarioInterface *scenario,
+    bool Instantiate(const std::string& libraryPath,
                      EventNetworkInterface* eventNetwork,
                      StochasticsInterface *stochastics);
 
diff --git a/sim/src/core/opSimulation/modelElements/manipulatorNetwork.cpp b/sim/src/core/opSimulation/modelElements/manipulatorNetwork.cpp
index defbf42c12d064aa3e150ed35a85cdd207c8b6d1..ee3b73f6ba814053acfe741fc16283683a57e821 100644
--- a/sim/src/core/opSimulation/modelElements/manipulatorNetwork.cpp
+++ b/sim/src/core/opSimulation/modelElements/manipulatorNetwork.cpp
@@ -29,27 +29,23 @@ ManipulatorNetwork::~ManipulatorNetwork()
     Clear();
 }
 
-bool ManipulatorNetwork::Instantiate(const std::string libraryPath,
-                                     const ScenarioInterface* scenario,
+bool ManipulatorNetwork::Instantiate(const std::string& libraryPath,
                                      EventNetworkInterface* eventNetwork)
 {
-    if (scenario != nullptr)
+    //Instantiate all manipulators
+    try
     {
-        //Instantiate all manipulators
-        try
-        {
-            manipulators = manipulatorBinding->Instantiate(libraryPath,
-                           scenario,
-                           eventNetwork,
-                           world,
-                           publisher);
-        }
-        catch (const std::runtime_error& error)
-        {
-            LOG_INTERN(LogLevel::Error) << "Could not instantiate all Manipulators: " << error.what();
-            return false;
-        }
+        manipulators = manipulatorBinding->Instantiate(libraryPath,
+                       eventNetwork,
+                       world,
+                       publisher);
     }
+    catch (const std::runtime_error& error)
+    {
+        LOG_INTERN(LogLevel::Error) << "Could not instantiate all Manipulators: " << error.what();
+        return false;
+    }
+
     return true;
 }
 
diff --git a/sim/src/core/opSimulation/modelElements/manipulatorNetwork.h b/sim/src/core/opSimulation/modelElements/manipulatorNetwork.h
index d4ceae2cdd1766146feb32dffe18370ac8c15191..cfa3d545b3ea8cc781ccb62ff4d0993f3fafc1d7 100644
--- a/sim/src/core/opSimulation/modelElements/manipulatorNetwork.h
+++ b/sim/src/core/opSimulation/modelElements/manipulatorNetwork.h
@@ -16,7 +16,6 @@
 #include "common/opExport.h"
 #include "include/manipulatorNetworkInterface.h"
 
-class ScenarioInterface;
 class WorldInterface;
 class PublisherInterface;
 
@@ -44,12 +43,10 @@ public:
     //! Instantiates the manipulator network.
     //!
     //! @param[in]  libraryPath         Path to the library
-    //! @param[in]  scenario            Scenario
     //! @param[in]  eventNetwork        Interface of the eventNetwork
     //! @return                         true, if successful
     //-----------------------------------------------------------------------------
-    bool Instantiate(const std::string libraryPath,
-                     const ScenarioInterface *scenario,
+    bool Instantiate(const std::string& libraryPath,
                      EventNetworkInterface* eventNetwork);
 
     //-----------------------------------------------------------------------------
diff --git a/sim/src/core/opSimulation/modelElements/spawnItemParameter.h b/sim/src/core/opSimulation/modelElements/spawnItemParameter.h
index 663b163d757e6480d97e6dfb179a239eb1dadab0..4cd3083ceb4b20f79aad8bb2ccf603b3e51f0fb8 100644
--- a/sim/src/core/opSimulation/modelElements/spawnItemParameter.h
+++ b/sim/src/core/opSimulation/modelElements/spawnItemParameter.h
@@ -32,22 +32,22 @@ public:
     SpawnItemParameter& operator=(SpawnItemParameter&&) = delete;
     virtual ~SpawnItemParameter() = default;
 
-    void SetPositionX(double positionX)
+    void SetPositionX(units::length::meter_t positionX)
     {
         this->positionX = positionX;
     }
 
-    void SetPositionY(double positionY)
+    void SetPositionY(units::length::meter_t positionY)
     {
         this->positionY = positionY;
     }
 
-    void SetVelocity(double velocity)
+    void SetVelocity(units::velocity::meters_per_second_t velocity)
     {
         this->velocity = velocity;
     }
 
-    void SetAcceleration(double acceleration)
+    void SetAcceleration(units::acceleration::meters_per_second_squared_t acceleration)
     {
         this->acceleration = acceleration;
     }
@@ -57,7 +57,7 @@ public:
         this->gear = gear;
     }
 
-    void SetYaw(double yawAngle)
+    void SetYaw(units::angle::radian_t yawAngle)
     {
         this->yawAngle = yawAngle;
     }
@@ -77,27 +77,27 @@ public:
         this->vehicleModel = vehicleModel;
     }
 
-    double GetPositionX() const
+    units::length::meter_t GetPositionX() const
     {
         return positionX;
     }
 
-    double GetPositionY() const
+    units::length::meter_t GetPositionY() const
     {
         return positionY;
     }
 
-    double GetVelocity() const
+    units::velocity::meters_per_second_t GetVelocity() const
     {
         return velocity;
     }
 
-    double GetAcceleration() const
+    units::acceleration::meters_per_second_squared_t GetAcceleration() const
     {
         return acceleration;
     }
 
-    double GetYaw() const
+    units::angle::radian_t GetYaw() const
     {
         return yawAngle;
     }
@@ -118,10 +118,10 @@ public:
     }
 
 private:
-    double positionX = 0.0;
-    double positionY = 0.0;
-    double velocity = 0.0;
-    double acceleration = 0.0;
+    units::length::meter_t positionX{0.0};
+    units::length::meter_t positionY{0.0};
+    units::velocity::meters_per_second_t velocity{0.0};
+    units::acceleration::meters_per_second_squared_t acceleration{0.0};
     double gear = 0.0;
     double yawAngle = 0.0;
 
diff --git a/sim/src/core/opSimulation/modelElements/spawnPoint.h b/sim/src/core/opSimulation/modelElements/spawnPoint.h
index 0f325d98369a65bae952685e50f9cc50ef1359c9..32801debb1e06d736882fb760ba3daf65fff4f79 100644
--- a/sim/src/core/opSimulation/modelElements/spawnPoint.h
+++ b/sim/src/core/opSimulation/modelElements/spawnPoint.h
@@ -22,7 +22,6 @@
 #include "include/spawnPointInterface.h"
 #include "bindings/spawnPointLibrary.h"
 #include "include/worldInterface.h"
-#include "agentBlueprint.h"
 #include "common/log.h"
 
 namespace core
diff --git a/sim/src/core/opSimulation/modelElements/spawnPointNetwork.cpp b/sim/src/core/opSimulation/modelElements/spawnPointNetwork.cpp
index f5dfa522af43c71e07c7befd6bb2cd54e1cf2795..53ab1c9eb5e336c1bea3ef3d22e8a846ae361312 100644
--- a/sim/src/core/opSimulation/modelElements/spawnPointNetwork.cpp
+++ b/sim/src/core/opSimulation/modelElements/spawnPointNetwork.cpp
@@ -34,11 +34,14 @@ void SpawnPointNetwork::Clear()
 
 bool SpawnPointNetwork::Instantiate(const SpawnPointLibraryInfoCollection& libraryInfos,
                                     AgentFactoryInterface *agentFactory,
-                                    const AgentBlueprintProviderInterface *agentBlueprintProvider,
                                     StochasticsInterface* stochastics,
-                                    const ScenarioInterface* scenario,
-                                    const std::optional<ProfileGroup>& spawnPointProfiles)
+                                    const std::optional<ProfileGroup>& spawnPointProfiles,
+                                    ConfigurationContainerInterface* configurationContainer,
+                                    std::shared_ptr<mantle_api::IEnvironment> environment,
+                                    std::shared_ptr<Vehicles> vehicles)
 {
+    agentBlueprintProvider.Init(configurationContainer, stochastics);
+
     for (const auto& libraryInfo : libraryInfos)
     {
         const auto bindingIter = spawnPointBindings->find(libraryInfo.libraryName);
@@ -48,7 +51,7 @@ bool SpawnPointNetwork::Instantiate(const SpawnPointLibraryInfoCollection& libra
         }
 
         auto binding = &bindingIter->second;
-        SpawnPointDependencies dependencies(agentFactory, world, agentBlueprintProvider, stochastics);
+        SpawnPointDependencies dependencies(agentFactory, world, &agentBlueprintProvider, stochastics, environment, vehicles);
 
         if (libraryInfo.profileName.has_value())
         {
@@ -70,7 +73,7 @@ bool SpawnPointNetwork::Instantiate(const SpawnPointLibraryInfoCollection& libra
         }
         else
         {
-            dependencies.scenario = scenario;
+            // dependencies.scenario = scenario;
         }
 
         auto spawnPoint = binding->Instantiate(libraryInfo.libraryName, dependencies);
@@ -98,12 +101,11 @@ bool SpawnPointNetwork::TriggerPreRunSpawnZones()
 {
     try {
         std::for_each(preRunSpawnZones.crbegin(), preRunSpawnZones.crend(),
-        [&](auto const& element)
+                      [&](auto const &element)
 
-        {
-            const auto spawnedAgents = element.second->GetImplementation()->Trigger(0);
-            newAgents.insert(newAgents.cend(), spawnedAgents.cbegin(), spawnedAgents.cend());
-        });
+                      {
+                          element.second->GetImplementation()->Trigger(0);
+                      });
     }
     catch (const std::runtime_error& error)
     {
@@ -118,11 +120,9 @@ bool SpawnPointNetwork::TriggerRuntimeSpawnPoints([[maybe_unused]]const int time
 {
     try {
         std::for_each(runtimeSpawnPoints.crbegin(), runtimeSpawnPoints.crend(),
-        [&](auto const& element)
-        {
-            const auto spawnedAgents = element.second->GetImplementation()->Trigger(timestamp);
-            newAgents.insert(newAgents.cend(), spawnedAgents.cbegin(), spawnedAgents.cend());
-        });
+                      [&](auto const &element) {
+                          element.second->GetImplementation()->Trigger(timestamp);
+                      });
     }
     catch (const std::runtime_error& error)
     {
diff --git a/sim/src/core/opSimulation/modelElements/spawnPointNetwork.h b/sim/src/core/opSimulation/modelElements/spawnPointNetwork.h
index 1829244af42ab5ea1a10351ff02c071a095f1666..54050155964e2cb33955e97518288fb239445e4f 100644
--- a/sim/src/core/opSimulation/modelElements/spawnPointNetwork.h
+++ b/sim/src/core/opSimulation/modelElements/spawnPointNetwork.h
@@ -22,12 +22,12 @@
 #include <list>
 
 #include "include/worldInterface.h"
-#include "include/agentBlueprintProviderInterface.h"
 #include "include/stochasticsInterface.h"
 #include "include/spawnPointNetworkInterface.h"
 #include "common/opExport.h"
 #include "common/runtimeInformation.h"
 #include "common/spawnPointLibraryDefinitions.h"
+#include "agentBlueprintProvider.h"
 #include "spawnPoint.h"
 
 namespace core {
@@ -47,22 +47,16 @@ public:
 
     bool Instantiate(const SpawnPointLibraryInfoCollection& libraryInfos,
                      AgentFactoryInterface* agentFactory,
-                     const AgentBlueprintProviderInterface* agentBlueprintProvider,
                      StochasticsInterface * stochastics,
-                     const ScenarioInterface* scenario,
-                     const std::optional<ProfileGroup>& spawnPointProfiles) override;
+                     const std::optional<ProfileGroup>& spawnPointProfiles,
+                     ConfigurationContainerInterface* configurationContainer,
+                     std::shared_ptr<mantle_api::IEnvironment> environment,
+                     std::shared_ptr<Vehicles> vehicles) override;
 
     bool TriggerPreRunSpawnZones() override;
 
     bool TriggerRuntimeSpawnPoints(const int timestamp) override;
 
-    std::vector<Agent*> ConsumeNewAgents() override
-    {
-        std::vector<Agent*> tmpAgents;
-        std::swap(tmpAgents, newAgents);
-        return tmpAgents;
-    }
-
     void Clear() override;
 
 private:
@@ -71,7 +65,8 @@ private:
     const openpass::common::RuntimeInformation& runtimeInformation;
     std::multimap<int, std::unique_ptr<SpawnPoint>> preRunSpawnZones;
     std::multimap<int, std::unique_ptr<SpawnPoint>> runtimeSpawnPoints;
-    std::vector<Agent*> newAgents {};
+
+    AgentBlueprintProvider agentBlueprintProvider;
 };
 
 } // namespace core
diff --git a/sim/src/core/opSimulation/modules/EventDetector/CMakeLists.txt b/sim/src/core/opSimulation/modules/EventDetector/CMakeLists.txt
index 3ad8d3fabe6295ec93ab785bf5deeb7d5d8d1c22..91f07951c6986aa4d8cfeacf8be40b9fa905f435 100644
--- a/sim/src/core/opSimulation/modules/EventDetector/CMakeLists.txt
+++ b/sim/src/core/opSimulation/modules/EventDetector/CMakeLists.txt
@@ -16,7 +16,6 @@ add_openpass_target(
 
   HEADERS
     CollisionDetector.h
-    ConditionalEventDetector.h
     EventDetectorCommonBase.h
     EventDetectorExport.h
     EventDetectorGlobal.h
@@ -26,7 +25,6 @@ add_openpass_target(
 
   SOURCES
     CollisionDetector.cpp
-    ConditionalEventDetector.cpp
     EventDetectorCommonBase.cpp
     EventDetectorExport.cpp
 
diff --git a/sim/src/core/opSimulation/modules/EventDetector/ConditionalEventDetector.cpp b/sim/src/core/opSimulation/modules/EventDetector/ConditionalEventDetector.cpp
deleted file mode 100644
index a5df241bb78779140a489b42bd5677f6e6ed63bd..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/EventDetector/ConditionalEventDetector.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "ConditionalEventDetector.h"
-
-ConditionalEventDetector::ConditionalEventDetector(WorldInterface *world,
-                                                   const openScenario::ConditionalEventDetectorInformation &eventDetectorInformation,
-                                                   core::EventNetworkInterface *eventNetwork,
-                                                   const CallbackInterface *callbacks,
-                                                   StochasticsInterface *stochastics) :
-    EventDetectorCommonBase(world,
-                            eventNetwork,
-                            callbacks,
-                            stochastics),
-    eventDetectorInformation(eventDetectorInformation)
-{
-}
-
-void ConditionalEventDetector::Reset()
-{
-    executionCounter = 0;
-}
-
-void ConditionalEventDetector::Trigger(int time)
-{
-    if (IsBelowMaximumNumberOfExecutions())
-    {
-        if (const auto [allConditionsMet, triggeringAgents] = EvaluateConditions(time); allConditionsMet == true)
-        {
-            TriggerEventInsertion(time, triggeringAgents);
-        }
-    }
-}
-
-void ConditionalEventDetector::TriggerEventInsertion(int time, const std::vector<const AgentInterface *> triggeringAgents)
-{
-    openpass::type::TriggeringEntities triggering{};
-    for (const auto triggeringAgent : triggeringAgents)
-    {
-        triggering.entities.push_back(triggeringAgent->GetId());
-    }
-
-    const auto actors = GetActors(triggeringAgents);
-
-    openpass::type::AffectedEntities acting{};
-    for (const auto actingAgent : actors)
-    {
-        acting.entities.push_back(actingAgent->GetId());
-    }
-
-    eventNetwork->InsertEvent(std::make_shared<openpass::events::OpenScenarioEvent>(time, eventDetectorInformation.eventName, COMPONENTNAME, triggering, acting));
-    executionCounter++;
-}
-
-bool ConditionalEventDetector::IsBelowMaximumNumberOfExecutions()
-{
-    return eventDetectorInformation.numberOfExecutions == -1 || executionCounter < eventDetectorInformation.numberOfExecutions;
-}
-
-std::vector<const AgentInterface *> ConditionalEventDetector::GetActors(const std::vector<const AgentInterface *> triggeringAgents)
-{
-    std::vector<const AgentInterface *> actors{};
-    if (eventDetectorInformation.actorInformation.actorIsTriggeringEntity)
-    {
-        actors = triggeringAgents;
-    }
-
-    if (eventDetectorInformation.actorInformation.actors)
-    {
-        for (const auto &agentName : *eventDetectorInformation.actorInformation.actors)
-        {
-            AgentInterface *agent = world->GetAgentByName(agentName);
-            if (agent && std::find(actors.begin(), actors.end(), agent) == actors.end())
-            {
-                actors.push_back(agent);
-            }
-        }
-    }
-
-    return actors;
-}
-
-std::pair<bool, std::vector<const AgentInterface *>> ConditionalEventDetector::EvaluateConditions(const int time)
-{
-    std::vector<const AgentInterface *> triggeringAgents;
-
-    // this flag is used to ensure the first set of triggeringAgents found is correctly
-    //  added to the triggeringAgents array (an intersection with an empty set is always empty)
-    bool isFirstByEntityConditionEvaluated = false;
-
-    // Create the lambda function for evaluating condition variants
-    auto evaluateCondition = CheckCondition({world, time});
-    // Evaluate if each condition is met. For some conditions, an array of Agents
-    // is returned containing those entities described in the openScenario file
-    // as "TriggeringEntities" that meet the prescribed condition.
-    for (const auto &condition : eventDetectorInformation.conditions)
-    {
-        auto conditionEvaluation = evaluateCondition(condition);
-
-        // if a vector of AgentInterfaces is returned, it contains those TriggeringEntities who meet the condition
-        std::vector<const AgentInterface *> *triggeringEntitiesWhoMeetCondition = std::get_if<std::vector<const AgentInterface *>>(&conditionEvaluation);
-        // get_if resolves to nullptr if the type specified is not found
-        if (triggeringEntitiesWhoMeetCondition)
-        {
-            // if there are TriggeringEntities who meet the condition, add or intersect the set of
-            //  entities for this condition into the triggeringAgents collection
-            if (!triggeringEntitiesWhoMeetCondition->empty())
-            {
-                std::sort(triggeringEntitiesWhoMeetCondition->begin(),
-                          triggeringEntitiesWhoMeetCondition->end(),
-                          [](const AgentInterface *agentA, const AgentInterface *agentB) -> bool {
-                              return agentA->GetId() < agentB->GetId();
-                          });
-                if (!isFirstByEntityConditionEvaluated)
-                {
-                    triggeringAgents = *triggeringEntitiesWhoMeetCondition;
-                    isFirstByEntityConditionEvaluated = true;
-                }
-                else
-                {
-                    std::vector<const AgentInterface *> intersection{};
-                    std::set_intersection(triggeringAgents.begin(), triggeringAgents.end(),
-                                          triggeringEntitiesWhoMeetCondition->begin(), triggeringEntitiesWhoMeetCondition->end(),
-                                          std::back_inserter(intersection));
-                    // if the intersection is empty, no TriggeringEntities have all conditions met.
-                    if (intersection.empty())
-                    {
-                        // this condition was not met; no further condition checking needs to be done
-                        return {false, {}};
-                    }
-                    triggeringAgents = intersection;
-                }
-            }
-            // if no TriggeringEntities meet this condition, the condition was not met.
-            else
-            {
-                // this condition was not met; no further condition checking needs to be done
-                return {false, {}};
-            }
-        }
-        else
-        {
-            bool *conditionIsMet = std::get_if<bool>(&conditionEvaluation);
-            if (!(conditionIsMet == nullptr))
-            {
-                if (!(*conditionIsMet))
-                {
-                    // this condition was not met; no further condition checking needs to be done
-                    return {false, {}};
-                }
-            }
-            else
-            {
-                // we shouldn't get here - conditionEvaluation should have been handled by the above if statements
-                LOGERROR("Unexpected condition evaluation return value");
-                throw std::runtime_error("Unexpected condition evaluation return value");
-            }
-        }
-    }
-
-    return {true, triggeringAgents};
-}
diff --git a/sim/src/core/opSimulation/modules/EventDetector/ConditionalEventDetector.h b/sim/src/core/opSimulation/modules/EventDetector/ConditionalEventDetector.h
deleted file mode 100644
index aa569013b30afe6f36a99cdb7f1f6bccb3f7db25..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/EventDetector/ConditionalEventDetector.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "EventDetectorCommonBase.h"
-
-// template for overload pattern used in CheckCondition()
-template <class... Ts>
-struct overload : Ts...
-{
-    using Ts::operator()...;
-};
-template <class... Ts>
-overload(Ts...)->overload<Ts...>;
-
-struct ConditionMetaInformation
-{
-    WorldInterface *const world{};
-    int currentTime{};
-};
-using ConditionVisitorVariant = std::variant<std::vector<const AgentInterface *>, bool>;
-
-class ConditionalEventDetector : public EventDetectorCommonBase
-{
-public:
-    ConditionalEventDetector(WorldInterface *world,
-                             const openScenario::ConditionalEventDetectorInformation &eventDetectorInformation,
-                             core::EventNetworkInterface *eventNetwork,
-                             const CallbackInterface *callbacks,
-                             StochasticsInterface *stochastics);
-
-    ConditionalEventDetector() = delete;
-    ConditionalEventDetector(const ConditionalEventDetector &) = delete;
-    ConditionalEventDetector(ConditionalEventDetector &&) = delete;
-    ConditionalEventDetector &operator=(const ConditionalEventDetector &) = delete;
-    ConditionalEventDetector &operator=(ConditionalEventDetector &&) = delete;
-
-    virtual void Trigger(int time) override;
-
-private:
-    const openScenario::ConditionalEventDetectorInformation eventDetectorInformation;
-    int executionCounter{0};
-    int maximumNumberOfExecutions{1};
-
-    void Reset() override;
-
-    /*!
-     * ------------------------------------------------------------------------
-     * \brief TriggerEventInsertion inserts an event into the EventNetwork
-     *        at the specified time.
-     *
-     * \param[in] time The time at which to insert the event into the
-     *            EventNetwork.
-     * ------------------------------------------------------------------------
-     */
-    void TriggerEventInsertion(int time, const std::vector<const AgentInterface *> triggeringAgents);
-
-    /*!
-     * ------------------------------------------------------------------------
-     * \brief IsBelowMaximumNumberOfExecutions determines if the EventDetector
-     *        should still be allowed to execute.
-     *
-     * \return true if the number of times the EventDetector is less than the
-     *         maximum number of executions specified for it; otherwise false
-     * ------------------------------------------------------------------------
-     */
-    bool IsBelowMaximumNumberOfExecutions();
-
-    /*!
-     * ------------------------------------------------------------------------
-     * \brief GetActors gets the actors to be targeted by the Events emitted by
-     *        the EventDetector; this can either be those targeted as Actors in
-     *        the openScenario file, or those specified as TriggeringEntities
-     *        if TriggeringAgentsAsActors is set
-     *
-     * \param[in] triggeringAgents the collection of triggeringAgents as was
-     *            specified in the TriggeringEntities section of the
-     *            openScenario file
-     *
-     * \return the collection of AgentInterfaces for the Actors to be targeted
-     *         by the Events emitted by the EventDetector
-     * ------------------------------------------------------------------------
-     */
-    std::vector<const AgentInterface *> GetActors(const std::vector<const AgentInterface *> triggeringAgents = {});
-
-    /*!
-     * ------------------------------------------------------------------------
-     * \brief EvaluateConditionsAtTime evaluates all conditions for the
-     *        specified time and returns triggering agents who meet all conditions.
-     *
-     * \param[in] time the time at which the conditions are being evaluated
-     *
-     * \return <0> true if all conditions are met; false otherwise
-     *         <1> triggeringAgents who meet all conditions
-     * ------------------------------------------------------------------------
-     */
-
-    std::pair<bool, std::vector<const AgentInterface *>> EvaluateConditions(const int time);
-
-    /*!
-     * ------------------------------------------------------------------------
-     * \brief CheckCondition utilizes the overload pattern to build a variant
-     *        visitor on the fly to appropriately evaluate whether a Condition
-     *        is met.
-     *
-     * \param[in] cmi meta-information related to evaluating a Condition
-     *                variant
-     *
-     * \return lambda function for evaluating a Condition variant
-     * ------------------------------------------------------------------------
-     */
-    auto CheckCondition(const ConditionMetaInformation &cmi)
-    {
-        return [cmi](auto&& condition)
-        {
-            return std::visit(overload{
-                                  [&](const openScenario::ReachPositionCondition &reachPositionCondition) { return ConditionVisitorVariant{reachPositionCondition.IsMet(cmi.world)}; },
-                                  [&](const openScenario::RelativeSpeedCondition &relativeSpeedCondition) { return ConditionVisitorVariant{relativeSpeedCondition.IsMet(cmi.world)}; },
-                                  [&](const openScenario::TimeToCollisionCondition &timeToCollisionCondition) { return ConditionVisitorVariant{timeToCollisionCondition.IsMet(cmi.world)}; },
-                                  [&](const openScenario::TimeHeadwayCondition& timeHeadwayCondition) { return ConditionVisitorVariant{timeHeadwayCondition.IsMet(cmi.world)}; },
-                                  [&](const openScenario::SimulationTimeCondition &simulationTimeCondition) { return ConditionVisitorVariant{simulationTimeCondition.IsMet(cmi.currentTime)}; }},
-                              condition);
-        };
-    }
-};
diff --git a/sim/src/core/opSimulation/modules/EventDetector/EventDetector.pro b/sim/src/core/opSimulation/modules/EventDetector/EventDetector.pro
new file mode 100644
index 0000000000000000000000000000000000000000..af26f24cc1e41e71f78086ccb04d05aecbd2db13
--- /dev/null
+++ b/sim/src/core/opSimulation/modules/EventDetector/EventDetector.pro
@@ -0,0 +1,35 @@
+################################################################################
+# Copyright (c) 2017-2021 in-tech GmbH
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# SPDX-License-Identifier: EPL-2.0
+################################################################################
+
+#-----------------------------------------------------------------------------
+# \file  EventDetector.pro
+# \brief This file contains the information for the QtCreator-project of the
+# module EventDetector
+#-----------------------------------------------------------------------------/
+
+DEFINES += EVENT_DETECTOR_LIBRARY
+CONFIG += OPENPASS_LIBRARY
+
+include(../../../../../global.pri)
+
+INCLUDEPATH += \
+    ../../.. \
+    ../../../.. \
+    ../../../../..
+
+SOURCES += \
+    CollisionDetector.cpp \
+    EventDetectorCommonBase.cpp \
+    EventDetectorExport.cpp \
+
+HEADERS += \
+    CollisionDetector.h \
+    EventDetectorCommonBase.h \
+    EventDetectorExport.h \
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/modules/EventDetector/EventDetectorCommonBase.h b/sim/src/core/opSimulation/modules/EventDetector/EventDetectorCommonBase.h
index d4032a7bf6b498df914ab544fb9d6defb925f84e..0561ace67d221bf75dce57dd09789c617c128fcc 100644
--- a/sim/src/core/opSimulation/modules/EventDetector/EventDetectorCommonBase.h
+++ b/sim/src/core/opSimulation/modules/EventDetector/EventDetectorCommonBase.h
@@ -37,8 +37,6 @@
 #include "include/worldInterface.h"
 
 #include "common/events/basicEvent.h"
-#include "common/openScenarioDefinitions.h"
-#include "common/eventDetectorDefinitions.h"
 
 const std::unordered_map<std::string, AgentCategory> agentCategoryMap = {{"Ego", AgentCategory::Ego},
                                                                          {"Scenario", AgentCategory::Scenario},
diff --git a/sim/src/core/opSimulation/modules/EventDetector/EventDetectorExport.cpp b/sim/src/core/opSimulation/modules/EventDetector/EventDetectorExport.cpp
index 4ae4d7de794ecf0eb8e3de735e13982f1f4bf0c2..401bf19a34ba2a39520f52aaf21861974b5fdd66 100644
--- a/sim/src/core/opSimulation/modules/EventDetector/EventDetectorExport.cpp
+++ b/sim/src/core/opSimulation/modules/EventDetector/EventDetectorExport.cpp
@@ -16,30 +16,29 @@
 
 //Different detectors
 #include "CollisionDetector.h"
-#include "ConditionalEventDetector.h"
 
 const std::string version = "0.0.1";
-static const CallbackInterface* Callbacks = nullptr;
+static const CallbackInterface *Callbacks = nullptr;
 
-extern "C" EVENT_DETECTOR_SHARED_EXPORT const std::string& OpenPASS_GetVersion()
+extern "C" EVENT_DETECTOR_SHARED_EXPORT const std::string &OpenPASS_GetVersion()
 {
     return version;
 }
 
-extern "C" EVENT_DETECTOR_SHARED_EXPORT EventDetectorInterface* OpenPASS_CreateCollisionDetectorInstance(
-    WorldInterface* world,
-    core::EventNetworkInterface* eventNetwork,
-    const CallbackInterface* callbacks,
-    StochasticsInterface* stochastics)
+extern "C" EVENT_DETECTOR_SHARED_EXPORT EventDetectorInterface *OpenPASS_CreateCollisionDetectorInstance(
+    WorldInterface *world,
+    core::EventNetworkInterface *eventNetwork,
+    const CallbackInterface *callbacks,
+    StochasticsInterface *stochastics)
 {
     Callbacks = callbacks;
 
     try
     {
-        return static_cast<EventDetectorInterface*>(new CollisionDetector(world,
-                                                                          eventNetwork,
-                                                                          callbacks,
-                                                                          stochastics));
+        return static_cast<EventDetectorInterface *>(new CollisionDetector(world,
+                                                                           eventNetwork,
+                                                                           callbacks,
+                                                                           stochastics));
     }
     catch (...)
     {
@@ -51,36 +50,8 @@ extern "C" EVENT_DETECTOR_SHARED_EXPORT EventDetectorInterface* OpenPASS_CreateC
         return nullptr;
     }
 }
-extern "C" EVENT_DETECTOR_SHARED_EXPORT EventDetectorInterface* OpenPASS_CreateConditionalDetectorInstance(
-    WorldInterface* world,
-    const openScenario::ConditionalEventDetectorInformation& eventDetectorInformation,
-    core::EventNetworkInterface* eventNetwork,
-    const CallbackInterface* callbacks,
-    StochasticsInterface* stochastics)
-{
-    Callbacks = callbacks;
 
-    try
-    {
-        return static_cast<EventDetectorInterface*>(new ConditionalEventDetector(world,
-                                                                                 eventDetectorInformation,
-                                                                                 eventNetwork,
-                                                                                 callbacks,
-                                                                                 stochastics));
-    }
-    catch (...)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-        }
-
-        return nullptr;
-    }
-}
-
-extern "C" EVENT_DETECTOR_SHARED_EXPORT void OpenPASS_DestroyInstance(EventDetectorInterface* implementation)
+extern "C" EVENT_DETECTOR_SHARED_EXPORT void OpenPASS_DestroyInstance(EventDetectorInterface *implementation)
 {
     delete implementation;
 }
-
diff --git a/sim/src/core/opSimulation/modules/Manipulator/AcquirePositionManipulator.cpp b/sim/src/core/opSimulation/modules/Manipulator/AcquirePositionManipulator.cpp
deleted file mode 100644
index 217d7dc0ef5bf55260acf161a8f0ed9c94ac8a03..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/AcquirePositionManipulator.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "AcquirePositionManipulator.h"
-
-#include <src/common/events/acquirePositionEvent.h>
-#include <src/common/events/basicEvent.h>
-#include <src/common/openScenarioDefinitions.h>
-#include <utility>
-
-AcquirePositionManipulator::AcquirePositionManipulator(WorldInterface *world,
-                                                       core::EventNetworkInterface *eventNetwork,
-                                                       const CallbackInterface *callbacks,
-                                                       const std::string &eventName,
-                                                       openScenario::AcquirePositionAction acquirePositionAction) :
-    ManipulatorCommonBase(world, eventNetwork, callbacks, eventName), acquirePositionAction(std::move(acquirePositionAction))
-{
-    cycleTime = 100;
-}
-
-void AcquirePositionManipulator::Trigger(int time)
-{
-    for (const auto &eventInterface : GetEvents())
-    {
-        auto triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface);
-
-        for (const auto actorId : triggeringEvent->actingAgents.entities)
-        {
-            auto trigger = std::make_unique<openpass::events::AcquirePositionEvent>(time, eventName, COMPONENTNAME, actorId, acquirePositionAction.position);
-            eventNetwork->InsertTrigger(openpass::events::AcquirePositionEvent::TOPIC, std::move(trigger));
-        }
-    }
-}
-
-EventContainer AcquirePositionManipulator::GetEvents()
-{
-    EventContainer manipulatorSpecificEvents{};
-
-    const auto &conditionalEvents = eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO);
-
-    for (const auto &event : conditionalEvents)
-    {
-        const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event);
-
-        if (oscEvent && oscEvent->GetName() == eventName)
-        {
-            manipulatorSpecificEvents.emplace_back(event);
-        }
-    }
-
-    return manipulatorSpecificEvents;
-}
diff --git a/sim/src/core/opSimulation/modules/Manipulator/AcquirePositionManipulator.h b/sim/src/core/opSimulation/modules/Manipulator/AcquirePositionManipulator.h
deleted file mode 100644
index 81054d21f7f040bf58bd978fbb397285bc106883..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/AcquirePositionManipulator.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-
-#pragma once
-
-#include <src/common/openScenarioDefinitions.h>
-
-#include "ManipulatorCommonBase.h"
-
-class AcquirePositionManipulator : public ManipulatorCommonBase
-{
-public:
-    AcquirePositionManipulator(WorldInterface *world,
-                               core::EventNetworkInterface *eventNetwork,
-                               const CallbackInterface *callbacks,
-                               const std::string &eventName,
-                               openScenario::AcquirePositionAction);
-
-    /*!
-    * \brief Triggers the functionality of this class
-    *
-    * \details Trigger gets called each cycle timestep.
-    * This function is repsonsible for creating events
-    *
-    * @param[in]     time    Current time.
-    */
-    void Trigger(int time) override;
-
-private:
-    openScenario::AcquirePositionAction acquirePositionAction;
-    EventContainer GetEvents() override;
-};
-
diff --git a/sim/src/core/opSimulation/modules/Manipulator/CMakeLists.txt b/sim/src/core/opSimulation/modules/Manipulator/CMakeLists.txt
index ee632e3ac69c27025621a5428b8fad368c3da008..450106a24f4e0aecbaa8238458e54b5fb379e022 100644
--- a/sim/src/core/opSimulation/modules/Manipulator/CMakeLists.txt
+++ b/sim/src/core/opSimulation/modules/Manipulator/CMakeLists.txt
@@ -16,17 +16,9 @@ add_openpass_target(
 
   HEADERS
     CollisionManipulator.h
-    DefaultCustomCommandAction.h
-    ComponentStateChangeManipulator.h
-    LaneChangeManipulator.h
     ManipulatorCommonBase.h
     ManipulatorExport.h
     ManipulatorGlobal.h
-    NoOperationManipulator.h
-    RemoveAgentsManipulator.h
-    SpeedActionManipulator.h
-    TrajectoryManipulator.h
-    AcquirePositionManipulator.h
     ../../../../common/vector2d.h
     srcCollisionPostCrash/polygon.h
     srcCollisionPostCrash/collisionDetection_Impact_implementation.h
@@ -34,16 +26,8 @@ add_openpass_target(
 
   SOURCES
     CollisionManipulator.cpp
-    DefaultCustomCommandAction.cpp
-    ComponentStateChangeManipulator.cpp
-    LaneChangeManipulator.cpp
     ManipulatorCommonBase.cpp
     ManipulatorExport.cpp
-    NoOperationManipulator.cpp
-    RemoveAgentsManipulator.cpp
-    SpeedActionManipulator.cpp
-    TrajectoryManipulator.cpp
-    AcquirePositionManipulator.cpp
     srcCollisionPostCrash/polygon.cpp
     srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp
 
diff --git a/sim/src/core/opSimulation/modules/Manipulator/CollisionManipulator.cpp b/sim/src/core/opSimulation/modules/Manipulator/CollisionManipulator.cpp
index aa99de7447b529e1e8386a39d02bbaf556076fa5..ed5d8af1d9312858b7dc822d8face009c098fafd 100644
--- a/sim/src/core/opSimulation/modules/Manipulator/CollisionManipulator.cpp
+++ b/sim/src/core/opSimulation/modules/Manipulator/CollisionManipulator.cpp
@@ -100,27 +100,27 @@ void CollisionManipulator::PublishCrash(const std::shared_ptr<openpass::events::
 {
     auto logEntry = openpass::publisher::LogEntry::FromEvent(event);
     logEntry.name = "ExtendedCollisionInformation";
-    logEntry.parameter.insert({{"Velocity", crashInfo.postCrashDynamic1.GetVelocity()},
-                               {"VelocityChange", crashInfo.postCrashDynamic1.GetVelocityChange()},
-                               {"VelocityDirection", crashInfo.postCrashDynamic1.GetVelocityDirection()},
-                               {"YawVelocity", crashInfo.postCrashDynamic1.GetYawVelocity()},
-                               {"PointOfContactLocalX", crashInfo.postCrashDynamic1.GetPointOfContactLocal().x},
-                               {"PointOfContactLocalY", crashInfo.postCrashDynamic1.GetPointOfContactLocal().y},
-                               {"CollisionVelocity", crashInfo.postCrashDynamic1.GetCollisionVelocity()},
+    logEntry.parameter.insert({{"Velocity", crashInfo.postCrashDynamic1.GetVelocity().value()},
+                               {"VelocityChange", crashInfo.postCrashDynamic1.GetVelocityChange().value()},
+                               {"VelocityDirection", crashInfo.postCrashDynamic1.GetVelocityDirection().value()},
+                               {"YawVelocity", crashInfo.postCrashDynamic1.GetYawVelocity().value()},
+                               {"PointOfContactLocalX", crashInfo.postCrashDynamic1.GetPointOfContactLocal().x.value()},
+                               {"PointOfContactLocalY", crashInfo.postCrashDynamic1.GetPointOfContactLocal().y.value()},
+                               {"CollisionVelocity", crashInfo.postCrashDynamic1.GetCollisionVelocity().value()},
                                {"Sliding", crashInfo.postCrashDynamic1.GetSliding()},
-                               {"OpponentVelocity", crashInfo.postCrashDynamic2.GetVelocity()},
-                               {"OpponentVelocityChange", crashInfo.postCrashDynamic2.GetVelocityChange()},
-                               {"OpponentVelocityDirection", crashInfo.postCrashDynamic2.GetVelocityDirection()},
-                               {"OpponentYawVelocity", crashInfo.postCrashDynamic2.GetYawVelocity()},
-                               {"OpponentPointOfContactLocalX", crashInfo.postCrashDynamic2.GetPointOfContactLocal().x},
-                               {"OpponentPointOfContactLocalY", crashInfo.postCrashDynamic2.GetPointOfContactLocal().y},
-                               {"OpponentCollisionVelocity", crashInfo.postCrashDynamic2.GetCollisionVelocity()},
+                               {"OpponentVelocity", crashInfo.postCrashDynamic2.GetVelocity().value()},
+                               {"OpponentVelocityChange", crashInfo.postCrashDynamic2.GetVelocityChange().value()},
+                               {"OpponentVelocityDirection", crashInfo.postCrashDynamic2.GetVelocityDirection().value()},
+                               {"OpponentYawVelocity", crashInfo.postCrashDynamic2.GetYawVelocity().value()},
+                               {"OpponentPointOfContactLocalX", crashInfo.postCrashDynamic2.GetPointOfContactLocal().x.value()},
+                               {"OpponentPointOfContactLocalY", crashInfo.postCrashDynamic2.GetPointOfContactLocal().y.value()},
+                               {"OpponentCollisionVelocity", crashInfo.postCrashDynamic2.GetCollisionVelocity().value()},
                                {"OpponentSliding", crashInfo.postCrashDynamic2.GetSliding()},
-                               {"OYA", crashInfo.angles.OYA},
-                               {"HCPAo", crashInfo.angles.HCPAo},
-                               {"OCPAo", crashInfo.angles.OCPAo},
-                               {"HCPA", crashInfo.angles.HCPA},
-                               {"OCPA", crashInfo.angles.OCPA}});
+                               {"OYA", crashInfo.angles.OYA.value()},
+                               {"HCPAo", crashInfo.angles.HCPAo.value()},
+                               {"OCPAo", crashInfo.angles.OCPAo.value()},
+                               {"HCPA", crashInfo.angles.HCPA.value()},
+                               {"OCPA", crashInfo.angles.OCPA.value()}});
     publisher->Publish(EventDefinitions::utils::GetAsString(event->GetCategory()), logEntry);
 }
 
diff --git a/sim/src/core/opSimulation/modules/Manipulator/ComponentStateChangeManipulator.cpp b/sim/src/core/opSimulation/modules/Manipulator/ComponentStateChangeManipulator.cpp
deleted file mode 100644
index 0f44e6e94b21a613f97caf1f7a8da11ac5404358..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/ComponentStateChangeManipulator.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *               2017-2019 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  ComponentStateChangeManipulator.cpp */
-//-----------------------------------------------------------------------------
-
-#include "ComponentStateChangeManipulator.h"
-
-#include "common/events/componentStateChangeEvent.h"
-#include "common/commonTools.h"
-
-ComponentStateChangeManipulator::ComponentStateChangeManipulator(WorldInterface *world,
-                                                                 core::EventNetworkInterface *eventNetwork,
-                                                                 const CallbackInterface *callbacks,
-                                                                 const openScenario::CustomCommandAction action,
-                                                                 const std::string &eventName) :
-    ManipulatorCommonBase(world,
-                          eventNetwork,
-                          callbacks,
-                          eventName)
-{
-    auto commandTokens = CommonHelper::TokenizeString(action.command, ' ');
-    auto commandTokensSize = commandTokens.size();
-
-    if (commandTokensSize < 3)
-    {
-        const std::string msg = COMPONENTNAME + ": ComponentStateChangeManipulator provided invalid number of commands";
-        LOG(CbkLogLevel::Error, msg);
-        throw std::runtime_error(msg);
-    }
-
-    if (commandTokens.at(0) != "SetComponentState")
-    {
-        const std::string msg = COMPONENTNAME + ": ComponentStateChangeManipulator provided invalid command for initialization";
-        LOG(CbkLogLevel::Error, msg);
-        throw std::runtime_error(msg);
-    }
-
-    componentName = commandTokens.at(1);
-    componentStateName = commandTokens.at(2);
-
-    if (!AssignComponentState(componentStateName))
-    {
-        const std::string msg = COMPONENTNAME + ": Invalid ComponentStateName " + componentStateName;
-        LOG(CbkLogLevel::Error, msg);
-        throw std::runtime_error(msg);
-    }
-
-    cycleTime = 100;
-}
-
-bool ComponentStateChangeManipulator::AssignComponentState(const std::string &componentStateName)
-{
-    for (const auto &[stateName, state] : ComponentStateMapping)
-    {
-        if (componentStateName == stateName)
-        {
-            componentState = state;
-            return true;
-        }
-    }
-    return false;
-}
-
-void ComponentStateChangeManipulator::Trigger(int time)
-{
-    for (const auto &eventInterface : GetEvents())
-    {
-        const auto &triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface);
-
-        auto trigger = std::make_unique<openpass::events::ComponentStateChangeEvent>(time, eventName, COMPONENTNAME,
-                                                                   triggeringEvent->triggeringAgents,
-                                                                   triggeringEvent->actingAgents,
-                                                                   componentName, componentState);
-
-        eventNetwork->InsertTrigger(openpass::events::ComponentStateChangeEvent::TOPIC, std::move(trigger));
-    }
-}
-
-EventContainer ComponentStateChangeManipulator::GetEvents()
-{
-    EventContainer manipulatorSpecificEvents{};
-
-    const auto &conditionalEvents = eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO);
-
-    for (const auto &event : conditionalEvents)
-    {
-        const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event);
-
-        if (oscEvent && oscEvent.get()->GetName() == eventName)
-        {
-            manipulatorSpecificEvents.emplace_back(event);
-        }
-    }
-
-    return manipulatorSpecificEvents;
-}
diff --git a/sim/src/core/opSimulation/modules/Manipulator/ComponentStateChangeManipulator.h b/sim/src/core/opSimulation/modules/Manipulator/ComponentStateChangeManipulator.h
deleted file mode 100644
index 13b1f042596a873c3d9adefe9489dba6973394c6..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/ComponentStateChangeManipulator.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  ComponentStateChangeManipulator.h
-*	\brief This manipulator toggles the max state of a component
-*
-*   \details    This manipulator toggles the max state of a component
-*               Therefore it needs the name of the component and the state in which
-*               it should be put.
-*/
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include "common/openScenarioDefinitions.h"
-
-#include "CustomCommandFactory.h"
-#include "ManipulatorCommonBase.h"
-
-//-----------------------------------------------------------------------------
-/** \brief This class toggles an assistance system.
-* 	\details    This manipulator toggles the max state of a component
-*               Therefore it needs the name of the component and the state in which
-*               it should be put.
-*
-* 	\ingroup Manipulator
-*/
-//-----------------------------------------------------------------------------
-class ComponentStateChangeManipulator : public ManipulatorCommonBase
-{
-public:
-    ComponentStateChangeManipulator(WorldInterface *world,
-                                    core::EventNetworkInterface *eventNetwork,
-                                    const CallbackInterface *callbacks,
-                                    const openScenario::CustomCommandAction action,
-                                    const std::string &eventName);
-
-    virtual ~ComponentStateChangeManipulator() = default;
-
-    /*!
-    * \brief Triggers the functionality of this class
-    *
-    * \details Trigger gets called each cycle timestep.
-    * This function is repsonsible for creating events
-    *
-    * @param[in]     time    Current time.
-    */
-    virtual void Trigger(int time) override;
-
-private:
-    bool AssignComponentState(const std::string& componentState);
-    EventContainer GetEvents() override;
-
-    std::string componentName {""};
-    std::string componentStateName {""};
-    ComponentState componentState;
-
-    static inline bool registered  = CustomCommandFactory::Register<ComponentStateChangeManipulator>("SetComponentState");
-};
diff --git a/sim/src/core/opSimulation/modules/Manipulator/CustomCommandFactory.h b/sim/src/core/opSimulation/modules/Manipulator/CustomCommandFactory.h
deleted file mode 100644
index 4b309e59437af9a1412eb9151fe18e59a81771e9..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/CustomCommandFactory.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include <map>
-#include <memory>
-
-#include "include/callbackInterface.h"
-#include "include/eventDetectorNetworkInterface.h"
-#include "include/manipulatorInterface.h"
-#include "include/worldInterface.h"
-#include "common/openScenarioDefinitions.h"
-
-/// @brief Use this class as static auto registering factory for custom commands
-///
-/// Note that registration happens automatically without additional construction code,
-/// when the register method is used in a static assignment. This means that registering
-/// will be done if the translation unit holds an according statement (!)
-///
-/// Example:
-/// SomeClass.h -> static inline bool registered = CustomCommandFactory::Register("myKeyword");
-/// SomeClass.cpp is part of the translation unit
-///
-/// Effect:
-/// SomeOtherFile.cpp -> CustomCommandFactory::Create("myKeyword", ...); // Args must be delivered
-///
-/// @ingroup Manipulator
-class CustomCommandFactory final
-{
-    using CreateSignature = ManipulatorInterface *(*)(WorldInterface *,
-                                                      core::EventNetworkInterface *,
-                                                      const CallbackInterface *,
-                                                      const openScenario::CustomCommandAction,
-                                                      const std::string &);
-
-public:
-    /// \brief  Create registered class from keyword
-    /// \param  keyword   The keyword used during Register
-    /// \param  args      Arguments of the underlying class
-    /// \return The created instance
-    ///
-    template <typename... Args>
-    static ManipulatorInterface *Create(const std::string &keyword, Args... args)
-    {
-        if (auto it = repository().find(keyword); it != repository().end())
-        {
-            return it->second(std::forward<Args>(args)...);
-        }
-        else
-        {
-            return nullptr;
-        }
-    }
-
-    /// \brief Register a type T for a given keyword
-    /// \return True if keyword could been registered
-    template <typename T>
-    static bool Register(const std::string keyword)
-    {
-        if (auto it = repository().find(keyword); it == repository().end())
-        {
-            repository()[keyword] = [](
-                                        WorldInterface *world,
-                                        core::EventNetworkInterface *eventNetwork,
-                                        const CallbackInterface *callback,
-                                        const openScenario::CustomCommandAction action,
-                                        const std::string &eventName) -> ManipulatorInterface * {
-                return new T(world, eventNetwork, callback, action, eventName);
-            };
-            return true;
-        }
-        return false;
-    }
-
-private:
-    /// \brief Gets the static repository of registered classes
-    ///
-    /// As the method register is also static, it's not sure, that repository would
-    /// be initialized before (issue with static initialization order). The is solved
-    /// by wrapping the static repository in a static method, as it is guaranteed,
-    /// that static variables in static methods are initialized first.
-    ///
-    /// \return  The repository
-    static std::map<std::string, CreateSignature> &repository()
-    {
-        static std::map<std::string, CreateSignature> repository;
-        return repository;
-    }
-};
diff --git a/sim/src/core/opSimulation/modules/Manipulator/DefaultCustomCommandAction.cpp b/sim/src/core/opSimulation/modules/Manipulator/DefaultCustomCommandAction.cpp
deleted file mode 100644
index 6d17e0aa368a1ddad578f7eb3f90b1a7dddef967..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/DefaultCustomCommandAction.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-/// @file  DefaultCustomCommandAction.cpp
-
-#include "DefaultCustomCommandAction.h"
-
-#include "common/commonTools.h"
-#include "common/events/defaultCustomCommandActionEvent.h"
-
-DefaultCustomCommandAction::DefaultCustomCommandAction(WorldInterface *world,
-                                           core::EventNetworkInterface *eventNetwork,
-                                           const CallbackInterface *callbacks,
-                                           const openScenario::CustomCommandAction action,
-                                           const std::string &eventName) :
-    ManipulatorCommonBase(world,
-                          eventNetwork,
-                          callbacks,
-                          eventName),
-    command{std::move(action.command)}
-{
-}
-
-void DefaultCustomCommandAction::Trigger(int time)
-{
-    for (const auto &eventInterface : GetEvents())
-    {
-        auto triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface);
-
-        for (const auto actorId : triggeringEvent->actingAgents.entities)
-        {
-            auto trigger = std::make_unique<openpass::events::DefaultCustomCommandActionEvent>(time, eventName, COMPONENTNAME, actorId, command);
-            eventNetwork->InsertTrigger(openpass::events::DefaultCustomCommandActionEvent::TOPIC, std::move(trigger));
-        }
-    }
-}
-
-EventContainer DefaultCustomCommandAction::GetEvents()
-{
-    EventContainer manipulatorSpecificEvents{};
-
-    const auto &conditionalEvents = eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO);
-
-    for (const auto &event : conditionalEvents)
-    {
-        const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event);
-
-        if (oscEvent && oscEvent.get()->GetName() == eventName)
-        {
-            manipulatorSpecificEvents.emplace_back(event);
-        }
-    }
-
-    return manipulatorSpecificEvents;
-}
diff --git a/sim/src/core/opSimulation/modules/Manipulator/DefaultCustomCommandAction.h b/sim/src/core/opSimulation/modules/Manipulator/DefaultCustomCommandAction.h
deleted file mode 100644
index 378f59a320171a84cdf9c96b738e34dfaab25fa5..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/DefaultCustomCommandAction.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-/// @file  DefaultCustomCommandAction.h
-
-#pragma once
-
-#include "ManipulatorCommonBase.h"
-#include "common/openScenarioDefinitions.h"
-#include "include/agentInterface.h"
-
-/**
- * @brief   Triggers a CustomCommandActionEvent holding the whole command as payload
- * 
- * <CustomCommandAction>arbitrary string to send</CustomCommandAction>
- * 
- * @ingroup Manipulator
-*/
-class DefaultCustomCommandAction : public ManipulatorCommonBase
-{
-public:
-    DefaultCustomCommandAction(WorldInterface *world,
-                               core::EventNetworkInterface *eventNetwork,
-                               const CallbackInterface *callbacks,
-                               const openScenario::CustomCommandAction action,
-                               const std::string &eventName);
-
-    virtual void Trigger(int time) override;
-
-private:
-    EventContainer GetEvents() override;
-    std::string command;
-};
diff --git a/sim/src/core/opSimulation/modules/Manipulator/LaneChangeManipulator.cpp b/sim/src/core/opSimulation/modules/Manipulator/LaneChangeManipulator.cpp
deleted file mode 100644
index 000696b722a57b96f693b2b3a2a5f3fbe6273be2..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/LaneChangeManipulator.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  RemoveAgentsManipulator.cpp */
-//-----------------------------------------------------------------------------
-
-#include "LaneChangeManipulator.h"
-
-#include "common/events/laneChangeEvent.h"
-
-LaneChangeManipulator::LaneChangeManipulator(WorldInterface *world,
-                                             core::EventNetworkInterface *eventNetwork,
-                                             const CallbackInterface *callbacks,
-                                             const openScenario::LaneChangeAction action,
-                                             const std::string &eventName) :
-    ManipulatorCommonBase(world,
-                          eventNetwork,
-                          callbacks,
-                          eventName),
-    action(action)
-{
-    cycleTime = 100;
-}
-
-void LaneChangeManipulator::Trigger(int time)
-{
-    for (const auto &eventInterface : GetEvents())
-    {
-        auto triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface);
-
-        for (const auto actorId : triggeringEvent->actingAgents.entities)
-        {
-            auto trigger = std::make_unique<openpass::events::LaneChangeEvent>(time, eventName, COMPONENTNAME, actorId, action.laneChangeParameter);
-            eventNetwork->InsertTrigger(openpass::events::LaneChangeEvent::TOPIC, std::move(trigger));
-        }
-    }
-}
-
-EventContainer LaneChangeManipulator::GetEvents()
-{
-    EventContainer manipulatorSpecificEvents{};
-
-    const auto &conditionalEvents = eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO);
-
-    for (const auto &event : conditionalEvents)
-    {
-        const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event);
-
-        if (oscEvent && oscEvent.get()->GetName() == eventName)
-        {
-            manipulatorSpecificEvents.emplace_back(event);
-        }
-    }
-
-    return manipulatorSpecificEvents;
-}
diff --git a/sim/src/core/opSimulation/modules/Manipulator/LaneChangeManipulator.h b/sim/src/core/opSimulation/modules/Manipulator/LaneChangeManipulator.h
deleted file mode 100644
index 8a43f88247f99c184819084f592c8a5156aafc19..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/LaneChangeManipulator.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2019 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-/** \file  LaneChangeManipulator.h
-*	\brief This file removes the agent.
-*
-*   \details    This file removes an agent.
-*/
-
-#pragma once
-
-#include "ManipulatorCommonBase.h"
-#include "include/agentInterface.h"
-#include "common/openScenarioDefinitions.h"
-
-//-----------------------------------------------------------------------------
-/** \brief This class removes an agent.
-*   \details    This class removes the agent.
-*
-* 	\ingroup Manipulator
-*/
-//-----------------------------------------------------------------------------
-class LaneChangeManipulator : public ManipulatorCommonBase
-{
-public:
-    LaneChangeManipulator(WorldInterface *world,
-                          core::EventNetworkInterface *eventNetwork,
-                          const CallbackInterface *callbacks,
-                          const openScenario::LaneChangeAction action,
-                          const std::string &eventName);
-
-    /*!
-    * \brief Triggers the functionality of this class
-    *
-    * \details Trigger gets called each cycle timestep.
-    * This function is repsonsible for creating events
-    *
-    * @param[in]     time    Current time.
-    */
-    virtual void Trigger(int time) override;
-
-private:
-    const openScenario::LaneChangeAction action;
-
-    EventContainer GetEvents() override;
-};
diff --git a/sim/src/core/opSimulation/modules/Manipulator/Manipulator.pro b/sim/src/core/opSimulation/modules/Manipulator/Manipulator.pro
new file mode 100644
index 0000000000000000000000000000000000000000..ddf621a0936a9df60d2753abffea2d8e8b069eb9
--- /dev/null
+++ b/sim/src/core/opSimulation/modules/Manipulator/Manipulator.pro
@@ -0,0 +1,48 @@
+################################################################################
+# Copyright (c) 2017-2020 in-tech GmbH
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# SPDX-License-Identifier: EPL-2.0
+################################################################################
+
+#-----------------------------------------------------------------------------
+# \file  Manipulator.pro
+# \brief This file contains the information for the QtCreator-project of the
+# module GenericManipulator
+#-----------------------------------------------------------------------------/
+
+DEFINES += MANIPULATOR_LIBRARY
+CONFIG   += OPENPASS_LIBRARY
+include (../../../../../global.pri)
+
+INCLUDEPATH += \
+    . \
+    .. \
+    ../../.. \
+    ../../../.. \
+    ../../../../.. \
+    srcCollisionPostCrash
+
+SOURCES += \
+    CollisionManipulator.cpp \
+    ManipulatorCommonBase.cpp \
+    ManipulatorExport.cpp \
+    srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp \
+    srcCollisionPostCrash/polygon.cpp \
+    ../../../../core/common/coreDataPublisher.cpp
+
+EVENT_HEADERS += \
+    ../../../../common/events/collisionEvent.h \
+
+HEADERS += \
+    $$EVENT_HEADERS \
+    CollisionManipulator.h \
+    ManipulatorCommonBase.h \
+    ManipulatorExport.h \
+    ManipulatorGlobal.h \
+    srcCollisionPostCrash/collisionDetection_Impact_implementation.h \
+    srcCollisionPostCrash/polygon.h \
+    ../../../../core/common/coreDataPublisher.h
diff --git a/sim/src/core/opSimulation/modules/Manipulator/ManipulatorExport.cpp b/sim/src/core/opSimulation/modules/Manipulator/ManipulatorExport.cpp
index 57763be8687c0a36af937b4808432d02d5b9150c..f1e1b3247305f2fb9218886bff5be191946d9a13 100644
--- a/sim/src/core/opSimulation/modules/Manipulator/ManipulatorExport.cpp
+++ b/sim/src/core/opSimulation/modules/Manipulator/ManipulatorExport.cpp
@@ -15,15 +15,7 @@
 
 #include "ManipulatorExport.h"
 
-#include "AcquirePositionManipulator.h"
 #include "CollisionManipulator.h"
-#include "CustomCommandFactory.h"
-#include "DefaultCustomCommandAction.h"
-#include "LaneChangeManipulator.h"
-#include "RemoveAgentsManipulator.h"
-#include "SpeedActionManipulator.h"
-#include "TrajectoryManipulator.h"
-#include "common/openScenarioDefinitions.h"
 #include "include/callbackInterface.h"
 #include "include/eventNetworkInterface.h"
 
@@ -33,183 +25,18 @@ class CoreDataPublisher;
 }
 
 const std::string version = "0.0.1";
-static const CallbackInterface* Callbacks = nullptr;
+static const CallbackInterface *Callbacks = nullptr;
 
-extern "C" MANIPULATOR_SHARED_EXPORT const std::string& OpenPASS_GetVersion()
+extern "C" MANIPULATOR_SHARED_EXPORT const std::string &OpenPASS_GetVersion()
 {
     return version;
 }
 
-extern "C" MANIPULATOR_SHARED_EXPORT ManipulatorInterface* OpenPASS_CreateInstance(
-    WorldInterface* world,
-    openScenario::ManipulatorInformation manipulatorInformation,
-    core::EventNetworkInterface* eventNetwork,
-    const CallbackInterface* callbacks)
-{
-    Callbacks = callbacks;
-
-    try
-    {
-        const auto &action = manipulatorInformation.action;
-
-        if (std::holds_alternative<openScenario::UserDefinedAction>(action))
-        {
-            const auto userDefinedAction = std::get<openScenario::UserDefinedAction>(action);
-
-            if (std::holds_alternative<openScenario::CustomCommandAction>(userDefinedAction))
-            {
-                const auto action = std::get<openScenario::CustomCommandAction>(userDefinedAction);
-                const auto command = action.command;
-                
-                // the keyword is the first word in the command
-                const auto keyword = command.substr(0, command.find(' '));
-                const auto eventName = manipulatorInformation.eventName;
-                
-                // get the manipulator for the given keyword from the factory
-                if (auto instance = CustomCommandFactory::Create(keyword,
-                                                                 world,
-                                                                 eventNetwork,
-                                                                 callbacks,
-                                                                 action,
-                                                                 eventName))
-                {
-                    return instance;
-                }
-                // fallback: relay command without interpretation
-                else
-                {
-                    return new DefaultCustomCommandAction(world,
-                                                          eventNetwork,
-                                                          callbacks,
-                                                          action,
-                                                          eventName);
-                }
-            }
-            else
-            {
-                Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "Invalid UserDefinedAction as manipulator.");
-                return nullptr;
-            }
-        }
-        else if (std::holds_alternative<openScenario::GlobalAction>(action))
-        {
-            const auto &globalAction = std::get<openScenario::GlobalAction>(action);
-
-            if (std::holds_alternative<openScenario::EntityAction>(globalAction))
-            {
-               const auto entityAction = std::get<openScenario::EntityAction>(globalAction);
-               const auto actionType = entityAction.type;
-               if (actionType == openScenario::EntityActionType::Delete)
-               {
-                   return static_cast<ManipulatorInterface*>(new (std::nothrow) RemoveAgentsManipulator(
-                                                                 world,
-                                                                 eventNetwork,
-                                                                 callbacks,
-                                                                 entityAction,
-                                                                 manipulatorInformation.eventName));
-               }
-               else
-               {
-                   Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "Invalid EntityAction as manipulator.");
-                   return nullptr;
-               }
-            }
-            else
-            {
-                Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "Invalid GlobalAction as manipulator.");
-                return nullptr;
-            }
-        }
-        else if (std::holds_alternative<openScenario::PrivateAction>(action))
-        {
-            const auto &privateAction = std::get<openScenario::PrivateAction>(action);
-            if (std::holds_alternative<openScenario::LateralAction>(privateAction))
-            {
-                const auto &lateralAction = std::get<openScenario::LateralAction>(privateAction);
-                if (std::holds_alternative<openScenario::LaneChangeAction>(lateralAction))
-                {
-                    const auto &laneChangeAction = std::get<openScenario::LaneChangeAction>(lateralAction);
-                    return static_cast<ManipulatorInterface*>(new (std::nothrow) LaneChangeManipulator(
-                                                                  world,
-                                                                  eventNetwork,
-                                                                  callbacks,
-                                                                  laneChangeAction,
-                                                                  manipulatorInformation.eventName));
-                }
-                else
-                {
-                    Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "Invalid LateralAction as manipulator.");
-                    return nullptr;
-                }
-            }
-            else if (std::holds_alternative<openScenario::LongitudinalAction>(privateAction))
-            {
-                const auto &longitudinalAction = std::get<openScenario::LongitudinalAction>(privateAction);
-                if (std::holds_alternative<openScenario::SpeedAction>(longitudinalAction))
-                {
-                        const auto &speedAction = std::get<openScenario::SpeedAction>(longitudinalAction);
-                        return static_cast<ManipulatorInterface*>(new (std::nothrow) SpeedActionManipulator(
-                                                                      world,
-                                                                      eventNetwork,
-                                                                      callbacks,
-                                                                      speedAction,
-                                                                      manipulatorInformation.eventName));
-                }
-            }
-            else if (std::holds_alternative<openScenario::RoutingAction>(privateAction))
-            {
-                const auto &routingAction = std::get<openScenario::RoutingAction>(privateAction);
-                if (std::holds_alternative<openScenario::FollowTrajectoryAction>(routingAction))
-                {
-                    const auto &followTrajectoryAction = std::get<openScenario::FollowTrajectoryAction>(routingAction);
-                    return static_cast<ManipulatorInterface*>(new (std::nothrow) TrajectoryManipulator(
-                                                                  world,
-                                                                  eventNetwork,
-                                                                  callbacks,
-                                                                  followTrajectoryAction,
-                                                                  manipulatorInformation.eventName));
-                }
-                else if (std::holds_alternative<openScenario::AcquirePositionAction>(routingAction))
-                {
-                    const auto &acquirePositionAction = std::get<openScenario::AcquirePositionAction>(routingAction);
-                    return static_cast<ManipulatorInterface *>(new (std::nothrow) AcquirePositionManipulator(
-                        world,
-                        eventNetwork,
-                        callbacks,
-                        manipulatorInformation.eventName,
-                        acquirePositionAction));
-                }
-                else
-                {
-                    Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "Invalid RoutingAction as manipulator.");
-                    return nullptr;
-                }
-            }
-            else
-            {
-                Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "Invalid PrivateAction as manipulator.");
-                return nullptr;
-            }
-        }
-    }
-    catch (...)
-    {
-        if (Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-        }
-
-        return nullptr;
-    }
-
-    throw std::runtime_error("Unable to instantiate unknown manipulator");
-}
-
-extern "C" MANIPULATOR_SHARED_EXPORT ManipulatorInterface* OpenPASS_CreateDefaultInstance(
-    WorldInterface* world,
+extern "C" MANIPULATOR_SHARED_EXPORT ManipulatorInterface *OpenPASS_CreateDefaultInstance(
+    WorldInterface *world,
     std::string manipulatorType,
-    core::EventNetworkInterface* eventNetwork,
-    const CallbackInterface* callbacks,
+    core::EventNetworkInterface *eventNetwork,
+    const CallbackInterface *callbacks,
     PublisherInterface *publisher)
 {
     Callbacks = callbacks;
@@ -218,17 +45,17 @@ extern "C" MANIPULATOR_SHARED_EXPORT ManipulatorInterface* OpenPASS_CreateDefaul
     {
         if (manipulatorType == "CollisionManipulator")
         {
-            auto coreDataPublisher = dynamic_cast<openpass::publisher::CoreDataPublisher*>(publisher);
-            if(!coreDataPublisher)
+            auto coreDataPublisher = dynamic_cast<openpass::publisher::CoreDataPublisher *>(publisher);
+            if (!coreDataPublisher)
             {
                 throw std::runtime_error("Publisher must a CoreDataPublisher");
             }
 
-            return static_cast<ManipulatorInterface*>(new (std::nothrow) CollisionManipulator(
-                                                          world,
-                                                          eventNetwork,
-                                                          callbacks,
-                                                          coreDataPublisher));
+            return static_cast<ManipulatorInterface *>(new (std::nothrow) CollisionManipulator(
+                world,
+                eventNetwork,
+                callbacks,
+                coreDataPublisher));
         }
     }
     catch (...)
@@ -244,7 +71,7 @@ extern "C" MANIPULATOR_SHARED_EXPORT ManipulatorInterface* OpenPASS_CreateDefaul
     throw std::runtime_error("Unable to instantiate unknown manipulator type '" + manipulatorType + "'");
 }
 
-extern "C" MANIPULATOR_SHARED_EXPORT void OpenPASS_DestroyInstance(ManipulatorInterface* implementation)
+extern "C" MANIPULATOR_SHARED_EXPORT void OpenPASS_DestroyInstance(ManipulatorInterface *implementation)
 {
     delete implementation;
 }
diff --git a/sim/src/core/opSimulation/modules/Manipulator/NoOperationManipulator.cpp b/sim/src/core/opSimulation/modules/Manipulator/NoOperationManipulator.cpp
deleted file mode 100644
index 431f4753ee571cc198f57a25c957eff32fff318e..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/NoOperationManipulator.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2019 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  CollisionManipulator.cpp */
-//-----------------------------------------------------------------------------
-
-#include "NoOperationManipulator.h"
-
-NoOperationManipulator::NoOperationManipulator(WorldInterface *world,
-                                               core::EventNetworkInterface *eventNetwork,
-                                               const CallbackInterface *callbacks,
-                                               [[maybe_unused]] const openScenario::CustomCommandAction action,
-                                               [[maybe_unused]] const std::string &eventName) :
-    ManipulatorCommonBase(world,
-                          eventNetwork,
-                          callbacks)
-{
-    cycleTime = 100;
-}
-
-void NoOperationManipulator::Trigger([[maybe_unused]] int time)
-{
-}
-
-EventContainer NoOperationManipulator::GetEvents()
-{
-    return {};
-}
diff --git a/sim/src/core/opSimulation/modules/Manipulator/NoOperationManipulator.h b/sim/src/core/opSimulation/modules/Manipulator/NoOperationManipulator.h
deleted file mode 100644
index 10932900678d08380695669289b00ea52ded4374..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/NoOperationManipulator.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "CustomCommandFactory.h"
-#include "ManipulatorCommonBase.h"
-
-//-----------------------------------------------------------------------------
-/** \brief This class is a manipulator, that doesn't trigger any action and solely
-* returns the event. It existes to met the OpenSCENARIO conventions.
-*
-* 	\ingroup Manipulator
-*/
-//-----------------------------------------------------------------------------
-class NoOperationManipulator : public ManipulatorCommonBase
-{
-public:
-    NoOperationManipulator(WorldInterface *world,
-                           core::EventNetworkInterface *eventNetwork,
-                           const CallbackInterface *callbacks,
-                           const openScenario::CustomCommandAction action,
-                           const std::string &eventName);
-
-    virtual ~NoOperationManipulator() = default;
-    virtual void Trigger(int time) override;
-
-private:
-    EventContainer GetEvents() override;
-
-    static inline bool registered  = CustomCommandFactory::Register<NoOperationManipulator>("NoOperation");
-};
diff --git a/sim/src/core/opSimulation/modules/Manipulator/RemoveAgentsManipulator.cpp b/sim/src/core/opSimulation/modules/Manipulator/RemoveAgentsManipulator.cpp
deleted file mode 100644
index a6eb8389091a8f3e54f827032304d89577cdbb28..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/RemoveAgentsManipulator.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  RemoveAgentsManipulator.cpp */
-//-----------------------------------------------------------------------------
-
-#include "RemoveAgentsManipulator.h"
-
-#include "common/events/basicEvent.h"
-
-RemoveAgentsManipulator::RemoveAgentsManipulator(WorldInterface *world,
-                                                 core::EventNetworkInterface *eventNetwork,
-                                                 const CallbackInterface *callbacks,
-                                                 [[maybe_unused]] const openScenario::EntityAction action,
-                                                 const std::string &eventName) :
-    ManipulatorCommonBase(world,
-                          eventNetwork,
-                          callbacks,
-                          eventName)
-{
-    cycleTime = 100;
-}
-
-void RemoveAgentsManipulator::Trigger([[maybe_unused]] int time)
-{
-    for (const auto &eventInterface : GetEvents())
-    {
-        auto triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface);
-
-        for (const auto actorId : triggeringEvent->actingAgents.entities)
-        {
-            world->QueueAgentRemove(world->GetAgent(actorId));
-        }
-    }
-}
-
-EventContainer RemoveAgentsManipulator::GetEvents()
-{
-    EventContainer manipulatorSpecificEvents{};
-
-    for (const auto &event : eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO))
-    {
-        const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event);
-
-        if (oscEvent && oscEvent.get()->GetName() == eventName)
-        {
-            manipulatorSpecificEvents.emplace_back(event);
-        }
-    }
-
-    return manipulatorSpecificEvents;
-}
diff --git a/sim/src/core/opSimulation/modules/Manipulator/RemoveAgentsManipulator.h b/sim/src/core/opSimulation/modules/Manipulator/RemoveAgentsManipulator.h
deleted file mode 100644
index 27e30381d6a6de9b85c5349fd31f0f86a5f86ee5..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/RemoveAgentsManipulator.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2019 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-/** \file  RemoveAgentsManipulator.h
-*	\brief This file removes the agent.
-*
-*   \details    This file removes an agent.
-*/
-
-#pragma once
-
-#include "ManipulatorCommonBase.h"
-#include "include/agentInterface.h"
-#include "common/openScenarioDefinitions.h"
-
-//-----------------------------------------------------------------------------
-/** \brief This class removes an agent.
-*   \details    This class removes the agent.
-*
-* 	\ingroup Manipulator
-*/
-//-----------------------------------------------------------------------------
-class RemoveAgentsManipulator : public ManipulatorCommonBase
-{
-public:
-    RemoveAgentsManipulator(WorldInterface *world,
-                            core::EventNetworkInterface *eventNetwork,
-                            const CallbackInterface *callbacks,
-                            const openScenario::EntityAction action,
-                            const std::string &eventName);
-
-    /*!
-    * \brief Triggers the functionality of this class
-    *
-    * \details Trigger gets called each cycle timestep.
-    * This function is repsonsible for creating events
-    *
-    * @param[in]     time    Current time.
-    */
-    virtual void Trigger(int time) override;
-
-private:
-    EventContainer GetEvents() override;
-};
diff --git a/sim/src/core/opSimulation/modules/Manipulator/SpeedActionManipulator.cpp b/sim/src/core/opSimulation/modules/Manipulator/SpeedActionManipulator.cpp
deleted file mode 100644
index 987b038ad41e7bddd09f710b0931cd19ddec5786..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/SpeedActionManipulator.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  SpeedActionManipulator.cpp */
-//-----------------------------------------------------------------------------
-
-#include "SpeedActionManipulator.h"
-
-#include "common/events/speedActionEvent.h"
-
-SpeedActionManipulator::SpeedActionManipulator(WorldInterface *world,
-                                               core::EventNetworkInterface *eventNetwork,
-                                               const CallbackInterface *callbacks,
-                                               const openScenario::SpeedAction action,
-                                               const std::string &eventName) :
-    ManipulatorCommonBase(world,
-                          eventNetwork,
-                          callbacks,
-                          eventName),
-    action(action)
-{
-    cycleTime = 100;
-}
-
-void SpeedActionManipulator::Trigger([[maybe_unused]] int time)
-{
-    for (const auto &eventInterface : GetEvents())
-    {
-        const auto &triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface);
-
-        for (const auto actorId : triggeringEvent->actingAgents.entities)
-        {
-            auto trigger = std::make_unique<openpass::events::SpeedActionEvent>(time, eventName, COMPONENTNAME, actorId, action);
-            eventNetwork->InsertTrigger(openpass::events::SpeedActionEvent::TOPIC, std::move(trigger));
-        }
-    }
-}
-
-EventContainer SpeedActionManipulator::GetEvents()
-{
-    EventContainer manipulatorSpecificEvents{};
-
-    const auto &conditionalEvents = eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO);
-
-    for (const auto &event : conditionalEvents)
-    {
-        const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event);
-
-        if (oscEvent && oscEvent.get()->GetName() == eventName)
-        {
-            manipulatorSpecificEvents.emplace_back(event);
-        }
-    }
-
-    return manipulatorSpecificEvents;
-}
diff --git a/sim/src/core/opSimulation/modules/Manipulator/SpeedActionManipulator.h b/sim/src/core/opSimulation/modules/Manipulator/SpeedActionManipulator.h
deleted file mode 100644
index 10916003c6a521943167f8854eaa17c8421e290f..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/SpeedActionManipulator.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  SpeedActionManipulator.h
-*   \brief This manipulator adjusts the acceleration of an actor based on different variables
-*/
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include "ManipulatorCommonBase.h"
-#include "common/openScenarioDefinitions.h"
-
-//-----------------------------------------------------------------------------
-/** \brief This class emits the SpeedActionEvent.
-* 	\details    This class emits the SpeedActionEvent which allows for an acceleration manipulation of actors.
-*
-* 	\ingroup Manipulator
-*/
-//-----------------------------------------------------------------------------
-class SpeedActionManipulator : public ManipulatorCommonBase
-{
-public:
-    SpeedActionManipulator(WorldInterface *world,
-                                                 core::EventNetworkInterface *eventNetwork,
-                                                 const CallbackInterface *callbacks,
-                                                 const openScenario::SpeedAction action,
-                                                 const std::string &eventName);
-
-    virtual ~SpeedActionManipulator() = default;
-
-    /*!
-    * \brief Triggers the functionality of this class
-    *
-    * \details Trigger gets called each cycle timestep.
-    * This function is repsonsible for creating events
-    *
-    * @param[in]     time    Current time.
-    */
-    virtual void Trigger(int time);
-
-private:
-    EventContainer GetEvents() override;
-
-    const openScenario::SpeedAction action;
-};
diff --git a/sim/src/core/opSimulation/modules/Manipulator/TrajectoryManipulator.cpp b/sim/src/core/opSimulation/modules/Manipulator/TrajectoryManipulator.cpp
deleted file mode 100644
index cea5bf676e03d04c8d8525fdbe135de32098f422..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/TrajectoryManipulator.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** \file  TrajectoryManipulator.cpp */
-//-----------------------------------------------------------------------------
-
-#include "TrajectoryManipulator.h"
-
-#include "common/events/trajectoryEvent.h"
-
-TrajectoryManipulator::TrajectoryManipulator(WorldInterface *world,
-                                             core::EventNetworkInterface *eventNetwork,
-                                             const CallbackInterface *callbacks,
-                                             const openScenario::FollowTrajectoryAction action,
-                                             const std::string &eventName) :
-    ManipulatorCommonBase(world,
-                          eventNetwork,
-                          callbacks,
-                          eventName),
-    action(action)
-{
-    cycleTime = 100;
-}
-
-void TrajectoryManipulator::Trigger(int time)
-{
-    for (const auto &eventInterface : GetEvents())
-    {
-        auto triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface);
-
-        for (const auto actorId : triggeringEvent->actingAgents.entities)
-        {
-            auto trigger = std::make_unique<openpass::events::TrajectoryEvent>(time, eventName, COMPONENTNAME, actorId, action.trajectory);
-            eventNetwork->InsertTrigger(openpass::events::TrajectoryEvent::TOPIC, std::move(trigger));
-        }
-    }
-}
-
-EventContainer TrajectoryManipulator::GetEvents()
-{
-    EventContainer manipulatorSpecificEvents{};
-
-    const auto &conditionalEvents = eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO);
-
-    for (const auto &event : conditionalEvents)
-    {
-        const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event);
-
-        if (oscEvent && oscEvent.get()->GetName() == eventName)
-        {
-            manipulatorSpecificEvents.emplace_back(event);
-        }
-    }
-
-    return manipulatorSpecificEvents;
-}
diff --git a/sim/src/core/opSimulation/modules/Manipulator/TrajectoryManipulator.h b/sim/src/core/opSimulation/modules/Manipulator/TrajectoryManipulator.h
deleted file mode 100644
index 5a312761da28b32a469c3cf37c7360602e6c5d80..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Manipulator/TrajectoryManipulator.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-/** \file  TrajectoryManipulator.h
-*	\brief This manipulator sets a trajectory for an agent.
-*
-*   \details    This manipulator sets a trajectory for an agent.
-*/
-
-#pragma once
-
-#include "ManipulatorCommonBase.h"
-#include "include/agentInterface.h"
-#include "common/openScenarioDefinitions.h"
-
-//-----------------------------------------------------------------------------
-/** \brief This manipulator sets a trajectory for an agent.
-*   \details    This manipulator sets a trajectory for an agent.
-*
-* 	\ingroup Manipulator
-*/
-//-----------------------------------------------------------------------------
-class TrajectoryManipulator : public ManipulatorCommonBase
-{
-public:
-    TrajectoryManipulator(WorldInterface *world,
-                          core::EventNetworkInterface *eventNetwork,
-                          const CallbackInterface *callbacks,
-                          const openScenario::FollowTrajectoryAction action,
-                          const std::string &eventName);
-
-    /*!
-    * \brief Triggers the functionality of this class
-    *
-    * \details Trigger gets called each cycle timestep.
-    * This function is repsonsible for creating events
-    *
-    * @param[in]     time    Current time.
-    */
-    virtual void Trigger(int time) override;
-
-private:
-    openScenario::FollowTrajectoryAction action;
-
-    EventContainer GetEvents() override;
-};
diff --git a/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp b/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp
index 087bd3f09064c685306d529b6ea80642ab41038b..8b85ba6bb71bc7a400beb5cbe4bd8a583179d6ec 100644
--- a/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp
+++ b/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2017-2020 ITK Engineering GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -32,22 +33,23 @@ CollisionDetectionPostCrash::~CollisionDetectionPostCrash()
 {
 }
 
-std::vector<Common::Vector2d> CollisionDetectionPostCrash::GetAgentCorners(
+std::vector<Common::Vector2d<units::length::meter_t>> CollisionDetectionPostCrash::GetAgentCorners(
     const AgentInterface *agent)
 {
-    Common::Vector2d agentPosition(agent->GetPositionX(), agent->GetPositionY()); // reference point (rear axle) in glabal CS
-    double agentAngle = agent->GetYaw();
-    const double wheelbase = agent->GetVehicleModelParameters().frontAxle.positionX - agent->GetVehicleModelParameters().rearAxle.positionX;
-    agentPosition.x = agentPosition.x + std::cos(agentAngle) * wheelbase / 2.0; // geometrical center of vehicle in global CS
-    agentPosition.y = agentPosition.y + std::sin(agentAngle) * wheelbase / 2.0; // geometrical center of vehicle in global CS
+    Common::Vector2d<units::length::meter_t> agentPosition(agent->GetPositionX(), agent->GetPositionY()); // reference point (rear axle) in glabal CS
+    const auto agentAngle = agent->GetYaw();
 
-    double agentLength = agent->GetLength();
-    double agentWidthHalf = agent->GetWidth() / 2;
-    double agentDistanceCenter = agent->GetDistanceReferencePointToLeadingEdge();
+    const auto offSetGeometricCenter = agent->GetVehicleModelParameters()->bounding_box.geometric_center.x;
+    agentPosition.x += units::math::cos(agentAngle) * offSetGeometricCenter; // geometrical center of vehicle in global CS
+    agentPosition.y += units::math::sin(agentAngle) * offSetGeometricCenter; // geometrical center of vehicle in global CS
 
-    std::vector<Common::Vector2d> resultCorners;
+    const auto agentLength = agent->GetLength();
+    const auto agentWidthHalf = agent->GetWidth() / 2;
+    const auto agentDistanceCenter = agent->GetDistanceReferencePointToLeadingEdge();
+
+    std::vector<Common::Vector2d<units::length::meter_t>> resultCorners;
     for (int i = 0; i < NumberCorners; ++i) {
-        resultCorners.push_back(Common::Vector2d(0, 0));
+        resultCorners.push_back(Common::Vector2d<units::length::meter_t>(0_m, 0_m));
     }
 
     // upper left corner for angle == 0
@@ -75,25 +77,29 @@ std::vector<Common::Vector2d> CollisionDetectionPostCrash::GetAgentCorners(
     return resultCorners;
 }
 
-std::vector<Common::Vector2d>
+std::vector<Common::Vector2d<units::length::meter_t>>
 CollisionDetectionPostCrash::CalculateAllIntersectionPoints(
-    std::vector<Common::Vector2d> corners1,
-    std::vector<Common::Vector2d> corners2)
+    std::vector<Common::Vector2d<units::length::meter_t>> corners1,
+    std::vector<Common::Vector2d<units::length::meter_t>> corners2)
 {
     // Sutherland-Hodgman-Algorith for polygon clipping
     for (unsigned int i1 = 0; i1 < corners1.size(); i1++) { // loop over 1st polygon, must be convex
 
         // resulting polygon
-        std::vector<Common::Vector2d> cornersIntersection;
+        std::vector<Common::Vector2d<units::length::meter_t>> cornersIntersection;
         // indices of neighboring corners of polygon1
         int i1_1 = i1;                                 // 1st polygon, 1st corner
         int i1_2 = ( i1 + 1 ) % corners1.size();       // 1st polygon, 2nd corner
 
         // calculate normalized normal on polygon edge and distance for Hesse normal form
-        Common::Vector2d n1;
+        Common::Vector2d<units::length::meter_t> n1;
         n1.x = corners1[i1_2].y - corners1[i1_1].y;
         n1.y = - ( corners1[i1_2].x - corners1[i1_1].x );
-        n1.Norm();
+
+        auto tmpNormalizedVector = n1.Norm();
+        n1.x = units::length::meter_t(tmpNormalizedVector.x.value());
+        n1.y = units::length::meter_t(tmpNormalizedVector.y.value());
+
         double d1 = n1.Dot( corners1[i1_1] );
 
         for (unsigned int i2 = 0; i2 < corners2.size(); i2++) { // loop over 2nd polygon
@@ -101,17 +107,15 @@ CollisionDetectionPostCrash::CalculateAllIntersectionPoints(
             int i2_2 = ( i2 + 1 ) % corners2.size();  // 2nd polygon, 2nd corner
 
             // calculate normalized normal on polygon edge and distance for Hesse normal form
-            Common::Vector2d n2;
+            Common::Vector2d<units::length::meter_t> n2;
             n2.x = corners2[i2_2].y - corners2[i2_1].y;
             n2.y = - ( corners2[i2_2].x - corners2[i2_1].x );
             n2.Norm();
             double d2 = n2.Dot( corners2[i2_1] );
 
             // check if edges are parallel
-            bool areParallel     = fabs( n1.x - n2.x ) < std::numeric_limits<double>::epsilon()
-                                   && fabs( n1.y - n2.y ) < std::numeric_limits<double>::epsilon();
-            bool areAntiParallel = fabs( n1.x + n2.x ) < std::numeric_limits<double>::epsilon()
-                                   && fabs( n1.y + n2.y ) < std::numeric_limits<double>::epsilon();
+            bool areParallel = units::math::fabs(n1.x - n2.x) < units::length::meter_t(std::numeric_limits<double>::epsilon()) && units::math::fabs(n1.y - n2.y) < units::length::meter_t(std::numeric_limits<double>::epsilon());
+            bool areAntiParallel = units::math::fabs(n1.x + n2.x) < units::length::meter_t(std::numeric_limits<double>::epsilon()) && units::math::fabs(n1.y + n2.y) < units::length::meter_t(std::numeric_limits<double>::epsilon());
             if ( areParallel ||  areAntiParallel) {
                 if ( n1.Dot( corners2[i2_1]) <= d1 ) {
                     // first point of the edge of polygon2 is inside the edge of polygon1
@@ -121,8 +125,8 @@ CollisionDetectionPostCrash::CalculateAllIntersectionPoints(
                 }
             }
 
-            Common::Vector2d intersectionPoint;
-            GetIntersectionPoint(n1, n2, d1, d2, intersectionPoint);
+            Common::Vector2d<units::length::meter_t> intersectionPoint;
+            GetIntersectionPoint(n1, n2, units::area::square_meter_t(d1), units::area::square_meter_t(d2), intersectionPoint);
 
             double dist1, dist2;
             dist1 = n1.Dot( corners2[i2_1] ) - d1;
@@ -149,7 +153,7 @@ CollisionDetectionPostCrash::CalculateAllIntersectionPoints(
 }
 
 bool CollisionDetectionPostCrash::CalculatePlaneOfContact(Polygon intersection,
-                                                                       std::vector<int> vertexTypes, Common::Vector2d &pointOfImpact, double &phi)
+                                                          std::vector<int> vertexTypes, Common::Vector2d<units::length::meter_t> &pointOfImpact, units::angle::radian_t &phi)
 {
     if (!intersection.CalculateCentroid(pointOfImpact)) {
         return false;
@@ -170,8 +174,8 @@ bool CollisionDetectionPostCrash::CalculatePlaneOfContact(Polygon intersection,
         }
     }
 
-    std::vector<Common::Vector2d> vertices = intersection.GetVertices();
-    Common::Vector2d vecPlane;
+    std::vector<Common::Vector2d<units::length::meter_t>> vertices = intersection.GetVertices();
+    Common::Vector2d<units::length::meter_t> vecPlane;
     if ( i2.size() == 2 ) {
         vecPlane = vertices[ i2[0] ] - ( vertices[ i2[1] ]);
     } else if ( i3.size() > 1 ) {
@@ -180,106 +184,112 @@ bool CollisionDetectionPostCrash::CalculatePlaneOfContact(Polygon intersection,
         return false;
     }
 
-    if ( vecPlane.x >= 0 ) {
-        phi = atan( vecPlane.y / vecPlane.x );
-    } else if ( vecPlane.x < 0 && vecPlane.y >= 0 ) {
-        phi = atan( vecPlane.y / vecPlane.x ) + M_PI;
-    } else if ( vecPlane.x < 0 && vecPlane.y < 0 ) {
-        phi = atan( vecPlane.y / vecPlane.x ) - M_PI;
+    if (vecPlane.x >= 0_m)
+    {
+        phi = units::math::atan(vecPlane.y / vecPlane.x);
+    }
+    else if (vecPlane.x < 0_m && vecPlane.y >= 0_m)
+    {
+        phi = units::math::atan(vecPlane.y / vecPlane.x) + units::angle::radian_t(M_PI);
     }
-    if ( phi < 0 ) {
-        phi = phi + M_PI;
+    else if (vecPlane.x < 0_m && vecPlane.y < 0_m)
+    {
+        phi = units::math::atan(vecPlane.y / vecPlane.x) - units::angle::radian_t(M_PI);
+    }
+    if (phi < 0_rad)
+    {
+        phi = phi + units::angle::radian_t(M_PI);
     }
 
     return true;
 }
 
-bool CollisionDetectionPostCrash::CalculatePostCrashDynamic(Common::Vector2d cog1,
-                                                                         const AgentInterface *agent1,
-                                                                         Common::Vector2d cog2, const AgentInterface *agent2,
-                                                                         Common::Vector2d poi, double phi,
-                                                                         PostCrashDynamic* postCrashDynamic1,
-                                                                         PostCrashDynamic* postCrashDynamic2)
+bool CollisionDetectionPostCrash::CalculatePostCrashDynamic(Common::Vector2d<units::length::meter_t> cog1,
+                                                            const AgentInterface *agent1,
+                                                            Common::Vector2d<units::length::meter_t> cog2, const AgentInterface *agent2,
+                                                            Common::Vector2d<units::length::meter_t> poi, units::angle::radian_t phi,
+                                                            PostCrashDynamic *postCrashDynamic1,
+                                                            PostCrashDynamic *postCrashDynamic2)
 {
     // input parameters of agent 1
-    double yaw1 = agent1->GetYaw();                                             // yaw angle [rad]
-    double yawVel1 = 0;                                                         // pre crash yaw velocity [rad/s]
-    double vel1  = agent1->GetVelocity().Length();                              // absolute velocity of first vehicle [m/s]
-    double velDir1 = yaw1;                                                      // velocity direction of first vehicle [rad]
-    const auto mass1 = helper::map::query(agent1->GetVehicleModelParameters().properties, vehicle::properties::Mass); // mass of first vehicle [kg]
-    THROWIFFALSE(mass1.has_value(), "Mass was not defined in VehicleCatalog");
+    auto yaw1 = agent1->GetYaw();                                             // yaw angle
+    units::angular_velocity::radians_per_second_t yawVel1{0};                 // pre crash yaw velocity [rad/s]
+    const auto vel1  = agent1->GetVelocity().Length();                        // absolute velocity of first vehicle [m/s]
+    auto velDir1 = yaw1;                                                      // velocity direction of first vehicle
+    const auto mass1 = agent1->GetVehicleModelParameters()->mass;             // mass of first vehicle [kg]
 
-    double length1 = agent1->GetLength();
-    double width1 = agent1->GetWidth();
-    double momentIntertiaYaw1 = CommonHelper::CalculateMomentInertiaYaw(mass1.value(), length1, width1);     // moment of inertia 1st vehicle [kg*m^2]
+    auto length1 = agent1->GetLength();
+    auto width1 = agent1->GetWidth();
+    const auto momentIntertiaYaw1 = CommonHelper::CalculateMomentInertiaYaw(mass1, length1, width1);     // moment of inertia 1st vehicle [kg*m^2]
 
     // input parameters of agent 2
-    double yaw2 = agent2->GetYaw();                                             // yaw angle [rad]
-    double yawVel2 = 0;                                                         // pre crash yaw velocity [rad/s]
-    double vel2  = agent2->GetVelocity().Length();                              // absolute velocity of 2nd vehicle [m/s]
-    double velDir2 = yaw2;                                                      // velocity direction of 2nd vehicle [rad]
-    const auto mass2 = helper::map::query(agent2->GetVehicleModelParameters().properties, vehicle::properties::Mass); // mass of 2nd vehicle [kg]
-    THROWIFFALSE(mass2.has_value(), "Mass was not defined in VehicleCatalog");
-    double length2 = agent2->GetLength();
-    double width2 = agent2->GetWidth();
-    double momentIntertiaYaw2 = CommonHelper::CalculateMomentInertiaYaw(mass2.value(), length2, width2); // moment of inertia 2nd vehicle [kg*m^2]
+    auto yaw2 = agent2->GetYaw();                                             // yaw angle [rad]
+    units::angular_velocity::radians_per_second_t yawVel2{0};                 // pre crash yaw velocity [rad/s]
+    const auto vel2  = agent2->GetVelocity().Length();                        // absolute velocity of 2nd vehicle [m/s]
+    auto velDir2 = yaw2;                                                      // velocity direction of 2nd vehicle [rad]
+    const auto mass2 = agent2->GetVehicleModelParameters()->mass;             // mass of 2nd vehicle [kg]
+    auto length2 = agent2->GetLength();
+    auto width2 = agent2->GetWidth();
+    const auto momentIntertiaYaw2 = CommonHelper::CalculateMomentInertiaYaw(mass2, length2, width2); // moment of inertia 2nd vehicle [kg*m^2]
 
     // new coordinate system axis: tangent and normal to contact plane
-    Common::Vector2d tang = Common::Vector2d( cos(phi), sin(phi) );
-    Common::Vector2d normal = Common::Vector2d( -sin(phi), cos(phi) );
+    Common::Vector2d<units::dimensionless::scalar_t> tang = Common::Vector2d<units::dimensionless::scalar_t>(units::math::cos(phi), units::math::sin(phi));
+    Common::Vector2d<units::dimensionless::scalar_t> normal = Common::Vector2d<units::dimensionless::scalar_t>(-units::math::sin(phi), units::math::cos(phi));
     // distance of centers of gravity from point of impact in normal and
     // tangential direction: coordinates in new coordinate system
-    double n1 = normal.x * cog1.x + normal.y * cog1.y - normal.x * poi.x - normal.y * poi.y;
-    double n2 = normal.x * cog2.x + normal.y * cog2.y - normal.x * poi.x - normal.y * poi.y;
-    double t1 = tang.x * cog1.x + tang.y * cog1.y - tang.x * poi.x - tang.y * poi.y;
-    double t2 = tang.x * cog2.x + tang.y * cog2.y - tang.x * poi.x - tang.y * poi.y;
+    units::length::meter_t n1 = normal.x * cog1.x + normal.y * cog1.y - normal.x * poi.x - normal.y * poi.y;
+    units::length::meter_t n2 = normal.x * cog2.x + normal.y * cog2.y - normal.x * poi.x - normal.y * poi.y;
+    units::length::meter_t t1 = tang.x * cog1.x + tang.y * cog1.y - tang.x * poi.x - tang.y * poi.y;
+    units::length::meter_t t2 = tang.x * cog2.x + tang.y * cog2.y - tang.x * poi.x - tang.y * poi.y;
     // pre crash velocity vector, global coordinate system
-    Common::Vector2d v1 = Common::Vector2d( vel1 * cos(velDir1) , vel1 * sin(velDir1) );
-    Common::Vector2d v2 = Common::Vector2d( vel2 * cos(velDir2) , vel2 * sin(velDir2) );
+    Common::Vector2d<units::velocity::meters_per_second_t> v1 = Common::Vector2d<units::velocity::meters_per_second_t>(vel1 * units::math::cos(velDir1), vel1 * units::math::sin(velDir1));
+    Common::Vector2d<units::velocity::meters_per_second_t> v2 = Common::Vector2d<units::velocity::meters_per_second_t>(vel2 * units::math::cos(velDir2), vel2 * units::math::sin(velDir2));
 
     // COG-velocity in normal direction
-    double v1norm_cog = normal.x * v1.x + normal.y * v1.y;
-    double v2norm_cog = normal.x * v2.x + normal.y * v2.y;
+    units::velocity::meters_per_second_t v1norm_cog = normal.x * v1.x + normal.y * v1.y;
+    units::velocity::meters_per_second_t v2norm_cog = normal.x * v2.x + normal.y * v2.y;
     // velocity of point of impact in normal direction
-    double v1norm = v1norm_cog - yawVel1 * t1;
-    double v2norm = v2norm_cog - yawVel2 * t2;
+    units::velocity::meters_per_second_t v1norm = v1norm_cog - yawVel1 * t1 * units::inverse_radian(1);
+    units::velocity::meters_per_second_t v2norm = v2norm_cog - yawVel2 * t2 * units::inverse_radian(1);
     // relative velocity pre crash in normal direction
-    double vrel_pre_norm = v1norm - v2norm;
+    auto vrel_pre_norm = v1norm - v2norm;
 
     // COG-velocity in tangential direction
-    double v1tang_cog = tang.x * v1.x + tang.y * v1.y;
-    double v2tang_cog = tang.x * v2.x + tang.y * v2.y;
+    units::velocity::meters_per_second_t v1tang_cog = tang.x * v1.x + tang.y * v1.y;
+    units::velocity::meters_per_second_t v2tang_cog = tang.x * v2.x + tang.y * v2.y;
     // velocity of point of impact in tangential direction
-    double v1tang = v1tang_cog + yawVel1 * n1;
-    double v2tang = v2tang_cog + yawVel2 * n2;
+    units::velocity::meters_per_second_t v1tang = v1tang_cog + yawVel1 * n1 * units::inverse_radian(1);
+    units::velocity::meters_per_second_t v2tang = v2tang_cog + yawVel2 * n2 * units::inverse_radian(1);
     // relative velocity pre crash in tangential direction
-    double vrel_pre_tang = v1tang - v2tang;
+    auto vrel_pre_tang = v1tang - v2tang;
 
     // auxiliary parameters
-    double c1 = 1 / mass1.value() + 1 / mass2.value() + n1 * n1 / momentIntertiaYaw1 + n2 * n2 / momentIntertiaYaw2;
-    double c2 = 1 / mass1.value() + 1 / mass2.value() + t1 * t1 / momentIntertiaYaw1 + t2 * t2 / momentIntertiaYaw2;
-    double c3 = t1 * n1 / momentIntertiaYaw1 + t2 * n2 / momentIntertiaYaw2;
+    units::unit_t<units::inverse<units::mass::kilogram>> c1 = 1 / mass1 + 1 / mass2 + n1 * n1 / momentIntertiaYaw1 + n2 * n2 / momentIntertiaYaw2;
+    units::unit_t<units::inverse<units::mass::kilogram>> c2 = 1 / mass1 + 1 / mass2 + t1 * t1 / momentIntertiaYaw1 + t2 * t2 / momentIntertiaYaw2;
+    units::unit_t<units::inverse<units::mass::kilogram>> c3 = t1 * n1 / momentIntertiaYaw1 + t2 * n2 / momentIntertiaYaw2;
     // compute pulse vector in compression phase
-    double Tc = ( c3 * vrel_pre_norm + c2 * vrel_pre_tang ) / ( c3 * c3 - c1 * c2 );
-    double Nc = ( c1 * vrel_pre_norm + c3 * vrel_pre_tang ) / ( c3 * c3 - c1 * c2 );
+    units::impulse Tc = (c3 * vrel_pre_norm + c2 * vrel_pre_tang) / (c3 * c3 - c1 * c2);
+    units::impulse Nc = (c1 * vrel_pre_norm + c3 * vrel_pre_tang) / (c3 * c3 - c1 * c2);
 
     bool out1_sliding = false;
     bool out2_sliding = false;
-    if ( fabs(Tc) > fabs( interFriction * Nc ) ) {
+    if (units::math::fabs(Tc) > units::math::fabs(interFriction * Nc))
+    {
         out1_sliding = true;
         out2_sliding = true;
 //        LOG(CbkLogLevel::Warning,
 //            "Sliding collision detected. Calculation of post-crash dynamics not valid for sliding collisions.");
     }
     // vector total pulse
-    double T = Tc * ( 1 + coeffRest );
-    double N = Nc * ( 1 + coeffRest );
+    units::impulse T = Tc * (1 + coeffRest);
+    units::impulse N = Nc * (1 + coeffRest);
 
     // relative post crash velocities: should be (very close to) ZERO! Just a check
-    double vrel_post_tang = vrel_pre_tang + c1 * Tc - c3 * Nc;
-    double vrel_post_norm = vrel_pre_norm - c3 * Tc + c2 * Nc;
+    units::velocity::meters_per_second_t vrel_post_tang = vrel_pre_tang + c1 * Tc - c3 * Nc;
+    units::velocity::meters_per_second_t vrel_post_norm = vrel_pre_norm - c3 * Tc + c2 * Nc;
 
-    if ((fabs(vrel_post_norm) > 1E-3) || (fabs(vrel_post_tang) > 1E-3)) {
+    if ((units::math::fabs(vrel_post_norm) > 1E-3_mps) || (units::math::fabs(vrel_post_tang) > 1E-3_mps))
+    {
         std::stringstream msg;
         msg << "PostCrasDynamic Check: "
             << "Relative post crash velocities are too high: "
@@ -291,70 +301,75 @@ bool CollisionDetectionPostCrash::CalculatePostCrashDynamic(Common::Vector2d cog
     }
 
     // compute post crash velocities in COG with momentum balance equations
-    double v1tang_post_cog =  T / mass1.value() + v1tang_cog;
-    double v1norm_post_cog =  N / mass1.value() + v1norm_cog;
-    double v2tang_post_cog = -T / mass2.value() + v2tang_cog;
-    double v2norm_post_cog = -N / mass2.value() + v2norm_cog;
+    units::velocity::meters_per_second_t v1tang_post_cog = T / mass1 + v1tang_cog;
+    units::velocity::meters_per_second_t v1norm_post_cog = N / mass1 + v1norm_cog;
+    units::velocity::meters_per_second_t v2tang_post_cog = -T / mass2 + v2tang_cog;
+    units::velocity::meters_per_second_t v2norm_post_cog = -N / mass2 + v2norm_cog;
 
     // matrix for coordinate transformation between global and local
     // POI-coordinates
     // pulse vector in global system
-    Common::Vector2d pulse = Common::Vector2d(T, N);
+    Common::Vector2d<units::impulse> pulse{T, N};
     pulse.Rotate(phi);
     // Pulse direction
-    double out1_PulseDir = 0.0;
-    if ( pulse.x >= 0 ) {
-        out1_PulseDir = atan( pulse.y / pulse.x );
-    } else if ( pulse.x < 0 && pulse.y >= 0 ) {
-        out1_PulseDir = atan( pulse.y / pulse.x ) + M_PI;
-    } else if ( pulse.x < 0 && pulse.y < 0 ) {
-        out1_PulseDir = atan( pulse.y / pulse.x ) - M_PI;
+    units::angle::radian_t out1_PulseDir{0.0};
+    if (pulse.x >= units::impulse(0))
+    {
+        out1_PulseDir = units::angle::radian_t(units::math::atan(pulse.y / pulse.x));
+    }
+    else if (pulse.x < units::impulse(0) && pulse.y >= units::impulse(0))
+    {
+        out1_PulseDir = units::angle::radian_t(units::math::atan(pulse.y / pulse.x) + units::angle::radian_t(M_PI));
     }
-    double out2_PulseDir = out1_PulseDir;
+    else if (pulse.x < units::impulse(0) && pulse.y < units::impulse(0))
+    {
+        out1_PulseDir = units::angle::radian_t(units::math::atan(pulse.y / pulse.x) - units::angle::radian_t(M_PI));
+    }
+    auto out2_PulseDir = out1_PulseDir;
 
-    double pulseLength = pulse.Length();
+    auto pulseLength = pulse.Length();
 
-    Common::Vector2d out1_PulseLocal = Common::Vector2d(  pulseLength * cos( out1_PulseDir - yaw1 ),
-                                                          pulseLength * sin( out1_PulseDir - yaw1 ) );
-    Common::Vector2d out2_PulseLocal = Common::Vector2d( -pulseLength * cos( out2_PulseDir - yaw2 ),
-                                                         -pulseLength * sin( out2_PulseDir - yaw2 ) );
+    Common::Vector2d<units::impulse> out1_PulseLocal = Common::Vector2d<units::impulse>(pulseLength * units::math::cos(out1_PulseDir - yaw1),
+                                                                                        pulseLength * units::math::sin(out1_PulseDir - yaw1));
+    Common::Vector2d<units::impulse> out2_PulseLocal = Common::Vector2d<units::impulse>(-pulseLength * units::math::cos(out2_PulseDir - yaw2),
+                                                                                        -pulseLength * units::math::sin(out2_PulseDir - yaw2));
 
     // --- compute output for vehicle 1
     // post crash velocity vector
-    Common::Vector2d v1_post = Common::Vector2d( v1tang_post_cog, v1norm_post_cog );
+    Common::Vector2d<units::velocity::meters_per_second_t> v1_post = Common::Vector2d<units::velocity::meters_per_second_t>(v1tang_post_cog, v1norm_post_cog);
     v1_post.Rotate( phi );
     // absolute velocity
-    double out1_Vel = v1_post.Length();
+    units::velocity::meters_per_second_t out1_Vel{v1_post.Length()};
     // velocity change delta-v
-    double out1_dV = (v1 - v1_post).Length();
+    units::velocity::meters_per_second_t out1_dV{(v1 - v1_post).Length()};
     // velocity direction
-    double out1_VelDir = v1_post.Angle( );
+    units::angle::radian_t out1_VelDir{v1_post.Angle()};
     // yaw velocity from angular momentum conservation equation
-    double out1_YawVel = ( T * n1 - N * t1 ) / momentIntertiaYaw1 + yawVel1;
+    units::angular_velocity::radians_per_second_t out1_YawVel = 1_rad * (T * n1 - N * t1) / momentIntertiaYaw1 + yawVel1;
     Common::Vector2d  out1_Pulse = pulse;
     // rotation of poi from global to local
     Common::Vector2d out1_poiLocal = poi - cog1;
-    out1_poiLocal.Rotate( -yaw1 );
-    double out1_CollVel = vel1;
+    out1_poiLocal.Rotate(-yaw1);
+    auto out1_CollVel = vel1;
 
 
     // --- compute output for vehicle 2
     // post crash velocity vector
-    Common::Vector2d v2_post = Common::Vector2d(v2tang_post_cog, v2norm_post_cog);
+    Common::Vector2d<units::velocity::meters_per_second_t> v2_post = Common::Vector2d<units::velocity::meters_per_second_t>(v2tang_post_cog, v2norm_post_cog);
     v2_post.Rotate( phi );
     // absolute velocity
-    double out2_Vel = v2_post.Length();
+    units::velocity::meters_per_second_t out2_Vel{v2_post.Length()};
     // velocity change delta-v
-    double out2_dV = (v2 - v2_post).Length();
+    units::velocity::meters_per_second_t out2_dV{(v2 - v2_post).Length()};
     // velocity direction
-    double out2_VelDir = v2_post.Angle();
+    units::angle::radian_t out2_VelDir{v2_post.Angle()};
     // yaw velocity from angular momentum conservation equation
-    double out2_YawVel = ( -T * n2 + N * t2 ) / momentIntertiaYaw2 + yawVel2;
+    units::angular_velocity::radians_per_second_t out2_YawVel = 1_rad * (-T * n2 + N * t2) / momentIntertiaYaw2 + yawVel2;
     Common::Vector2d out2_Pulse = pulse;
     // rotation of poi from global to local
     Common::Vector2d out2_poiLocal = poi - cog2;
-    out2_poiLocal.Rotate( -yaw2 );
-    double out2_CollVel = vel2;
+    out2_poiLocal.Rotate(-yaw2);
+    const auto out2_CollVel = vel2;
 
     *postCrashDynamic1 = PostCrashDynamic(out1_Vel, out1_dV, out1_VelDir, out1_YawVel,
                                              out1_Pulse, out1_PulseDir, out1_PulseLocal,
@@ -371,12 +386,13 @@ bool CollisionDetectionPostCrash::CalculatePostCrashDynamic(Common::Vector2d cog
     return true; // Calculation successful
 }
 
-bool CollisionDetectionPostCrash::GetIntersectionPoint(Common::Vector2d n1,
-                                                                    Common::Vector2d n2, double d1, double d2, Common::Vector2d &intersectionPoint)
+bool CollisionDetectionPostCrash::GetIntersectionPoint(Common::Vector2d<units::length::meter_t> n1,
+                                                       Common::Vector2d<units::length::meter_t> n2, units::area::square_meter_t d1, units::area::square_meter_t d2, Common::Vector2d<units::length::meter_t> &intersectionPoint)
 {
-    double det = (n1.x * n2.y - n1.y * n2.x);
+    units::area::square_meter_t det = (n1.x * n2.y - n1.y * n2.x);
 
-    if (fabs(det) < std::numeric_limits<double>::epsilon()) {
+    if (fabs(det.value()) < std::numeric_limits<double>::epsilon())
+    {
         return false;
     }
 
@@ -391,15 +407,15 @@ bool CollisionDetectionPostCrash::GetFirstContact(const AgentInterface *agent1,
                                                          const AgentInterface *agent2,
                                                          int &timeFirstContact)
 {
-    std::vector<Common::Vector2d> agent1Corners = GetAgentCorners(agent1);
-    std::vector<Common::Vector2d> agent2Corners = GetAgentCorners(agent2);
+    std::vector<Common::Vector2d<units::length::meter_t>> agent1Corners = GetAgentCorners(agent1);
+    std::vector<Common::Vector2d<units::length::meter_t>> agent2Corners = GetAgentCorners(agent2);
 
     Polygon agent1Polygon(agent1Corners);
 
     Polygon agent2Polygon(agent2Corners);
 
-    Common::Vector2d agent1VelocityVector = GetAgentVelocityVector(agent1);
-    Common::Vector2d agent2VelocityVector = GetAgentVelocityVector(agent2);
+    Common::Vector2d<units::velocity::meters_per_second_t> agent1VelocityVector = GetAgentVelocityVector(agent1);
+    Common::Vector2d<units::velocity::meters_per_second_t> agent2VelocityVector = GetAgentVelocityVector(agent2);
 
     int cycleTime = 100;       // assumption
 
@@ -408,7 +424,8 @@ bool CollisionDetectionPostCrash::GetFirstContact(const AgentInterface *agent1,
 
     // Check if velocities are nearly same. If true, time of first contact will be very high
     // (infinity if velocities are exactly the same)
-    if ((agent1VelocityVector - agent2VelocityVector).Length() < 1E-5) {
+    if ((agent1VelocityVector - agent2VelocityVector).Length() < units::velocity::meters_per_second_t(1E-5))
+    {
         return false;
     }
 
@@ -417,9 +434,14 @@ bool CollisionDetectionPostCrash::GetFirstContact(const AgentInterface *agent1,
     while (intersected) {
         timeFirstContact = lastTimeNoContact;
         lastTimeNoContact -= cycleTime; // one cycleTime to the past --> negative
+
+        units::time::millisecond_t time{lastTimeNoContact};
+        Common::Vector2d<units::length::meter_t> shiftVector1{agent1VelocityVector.x * time, agent1VelocityVector.y * time};
+        Common::Vector2d<units::length::meter_t> shiftVector2{agent2VelocityVector.x * time, agent2VelocityVector.y * time};
+
         intersected = ShiftPolygonsAndCheckIntersection(agent1Polygon, agent2Polygon,
-                                                        agent1VelocityVector * (static_cast<double>(lastTimeNoContact) / 1000),
-                                                        agent2VelocityVector * (static_cast<double>(lastTimeNoContact) / 1000));
+                                                        shiftVector1,
+                                                        shiftVector2);
     }
 
     bool everIntersected = false;
@@ -427,9 +449,14 @@ bool CollisionDetectionPostCrash::GetFirstContact(const AgentInterface *agent1,
     while (std::abs(timeFirstContact - lastTimeNoContact) > 1) {
         int nextTime = lastTimeNoContact - (lastTimeNoContact - timeFirstContact) / 2;
 
+        units::time::millisecond_t time{nextTime};
+
+        Common::Vector2d<units::length::meter_t> shiftVector1{agent1VelocityVector.x * time, agent1VelocityVector.y * time};
+        Common::Vector2d<units::length::meter_t> shiftVector2{agent2VelocityVector.x * time, agent2VelocityVector.y * time};
+
         intersected = ShiftPolygonsAndCheckIntersection(agent1Polygon, agent2Polygon,
-                                                        agent1VelocityVector * (static_cast<double>(nextTime) / 1000),
-                                                        agent2VelocityVector * (static_cast<double>(nextTime) / 1000));
+                                                        shiftVector1,
+                                                        shiftVector2);
 
         if (intersected) {
             timeFirstContact = nextTime;
@@ -446,8 +473,8 @@ bool CollisionDetectionPostCrash::GetFirstContact(const AgentInterface *agent1,
 }
 
 std::vector<int> CollisionDetectionPostCrash::GetVertexTypes(
-    std::vector<Common::Vector2d> vertices1, std::vector<Common::Vector2d> vertices2,
-    std::vector<Common::Vector2d> verticesIntersection)
+    std::vector<Common::Vector2d<units::length::meter_t>> vertices1, std::vector<Common::Vector2d<units::length::meter_t>> vertices2,
+    std::vector<Common::Vector2d<units::length::meter_t>> verticesIntersection)
 {
     std::vector<int> vertexTypes;
 
@@ -460,14 +487,16 @@ std::vector<int> CollisionDetectionPostCrash::GetVertexTypes(
         vertexTypes.push_back(2);
 
         for (unsigned int iPoly1 = 0; iPoly1 < vertices1.size(); ++iPoly1) {
-            if ( (verticesIntersection[iIntersection] - vertices1[iPoly1]).Length() < 1E-12) {
+            if ((verticesIntersection[iIntersection] - vertices1[iPoly1]).Length() < 1E-12_m)
+            {
                 vertexTypes[iIntersection] = 1;
                 numberOfType2--;
                 continue;
             }
         }
         for (unsigned int iPoly2 = 0; iPoly2 < vertices1.size(); ++iPoly2) {
-            if ( (verticesIntersection[iIntersection] - vertices2[iPoly2]).Length() < 1E-12) {
+            if ((verticesIntersection[iIntersection] - vertices2[iPoly2]).Length() < 1E-12_m)
+            {
                 vertexTypes[iIntersection] = 1;
                 numberOfType2--;
                 continue;
@@ -478,7 +507,8 @@ std::vector<int> CollisionDetectionPostCrash::GetVertexTypes(
         // special case: perfectly straight impact
         for (unsigned int iIntersection = 0; iIntersection < verticesIntersection.size(); ++iIntersection) {
             for (unsigned int iPoly1 = 0; iPoly1 < vertices1.size(); ++iPoly1) {
-                if ( (verticesIntersection[iIntersection] - vertices1[iPoly1]).Length() < 1E-12) {
+                if ((verticesIntersection[iIntersection] - vertices1[iPoly1]).Length() < 1E-12_m)
+                {
                     vertexTypes[iIntersection] = 3;
                 }
             }
@@ -487,7 +517,7 @@ std::vector<int> CollisionDetectionPostCrash::GetVertexTypes(
     return vertexTypes;
 }
 
-Common::Vector2d CollisionDetectionPostCrash::GetAgentVelocityVector(
+Common::Vector2d<units::velocity::meters_per_second_t> CollisionDetectionPostCrash::GetAgentVelocityVector(
     const AgentInterface *agent)
 {
     return agent->GetVelocity();
@@ -495,13 +525,13 @@ Common::Vector2d CollisionDetectionPostCrash::GetAgentVelocityVector(
 
 bool CollisionDetectionPostCrash::ShiftPolygonsAndCheckIntersection(Polygon polygon1,
                                                                     Polygon polygon2,
-                                                                    Common::Vector2d shiftVector1,
-                                                                    Common::Vector2d shiftVector2)
+                                                                    Common::Vector2d<units::length::meter_t> shiftVector1,
+                                                                    Common::Vector2d<units::length::meter_t> shiftVector2)
 {
     polygon1.Translate(shiftVector1);
     polygon2.Translate(shiftVector2);
 
-    std::vector<Common::Vector2d> intersectionPoints = CalculateAllIntersectionPoints(
+    std::vector<Common::Vector2d<units::length::meter_t>> intersectionPoints = CalculateAllIntersectionPoints(
                                                            polygon1.GetVertices(), polygon2.GetVertices());
 
     if (intersectionPoints.size() > 0) {
@@ -515,62 +545,73 @@ void CollisionDetectionPostCrash::CalculateCollisionAngles(const AgentInterface
                                                            const AgentInterface *agent2,
                                                            int timeShift)
 {
-    std::vector<Common::Vector2d> agentCorners1 = GetAgentCorners(agent1);
-    std::vector<Common::Vector2d> agentCorners2 = GetAgentCorners(agent2);
+    std::vector<Common::Vector2d<units::length::meter_t>> agentCorners1 = GetAgentCorners(agent1);
+    std::vector<Common::Vector2d<units::length::meter_t>> agentCorners2 = GetAgentCorners(agent2);
     Polygon polygon1(agentCorners1);
     Polygon polygon2(agentCorners2);
-    polygon1.Translate(GetAgentVelocityVector(agent1) * (static_cast<double>(timeShift) / 1000));
-    polygon2.Translate(GetAgentVelocityVector(agent2) * (static_cast<double>(timeShift) / 1000));
 
-    Common::Vector2d centroid1;
-    Common::Vector2d centroid2;
+    units::time::millisecond_t time{timeShift};
+
+    Common::Vector2d<units::length::meter_t> translationVector1{GetAgentVelocityVector(agent1).x * time, GetAgentVelocityVector(agent1).y * time};
+    Common::Vector2d<units::length::meter_t> translationVector2{GetAgentVelocityVector(agent2).x * time, GetAgentVelocityVector(agent2).y * time};
+
+    polygon1.Translate(translationVector1);
+    polygon2.Translate(translationVector2);
+
+    Common::Vector2d<units::length::meter_t> centroid1;
+    Common::Vector2d<units::length::meter_t> centroid2;
 
     polygon1.CalculateCentroid(centroid1);
     polygon2.CalculateCentroid(centroid2);
 
-    std::vector<Common::Vector2d> intersectionPoints = CalculateAllIntersectionPoints(polygon1.GetVertices(), polygon2.GetVertices());
+    std::vector<Common::Vector2d<units::length::meter_t>> intersectionPoints = CalculateAllIntersectionPoints(polygon1.GetVertices(), polygon2.GetVertices());
     Polygon intersectionPolygon(intersectionPoints);
 
-    Common::Vector2d FPOC; // first point of contact
+    Common::Vector2d<units::length::meter_t> FPOC; // first point of contact
     intersectionPolygon.CalculateCentroid(FPOC);
 
-    double hostYaw = agent1->GetYaw();
-    double oppYaw = agent2->GetYaw();
-    double oya = (oppYaw - hostYaw) * 180 / M_PI;
+    const auto hostYaw = agent1->GetYaw();
+    const auto oppYaw = agent2->GetYaw();
+    units::angle::radian_t oya = (oppYaw - hostYaw) * 180 / M_PI;
 
-    Common::Vector2d OCC = FPOC - centroid2; // opponent center to first point of contact
+    Common::Vector2d<units::length::meter_t> OCC = FPOC - centroid2; // opponent center to first point of contact
     OCC.Rotate(-oppYaw);
-    double ocpa_orig = OCC.Angle() * 180 / M_PI;
-    double ocpa_trans = std::atan2(OCC.y / agent2->GetWidth(), OCC.x / agent2->GetLength()) * 180 / M_PI;
+    units::angle::radian_t ocpa_orig = OCC.Angle() * 180 / M_PI;
+    units::angle::radian_t ocpa_trans = units::math::atan2(OCC.y / agent2->GetWidth(), OCC.x / agent2->GetLength()) * 180 / M_PI;
 
-    Common::Vector2d HCC = FPOC - centroid1; // host center to first point of contact
+    Common::Vector2d<units::length::meter_t> HCC = FPOC - centroid1; // host center to first point of contact
     HCC.Rotate(-hostYaw);
-    double hcpa_orig = HCC.Angle() * 180 / M_PI;
-    double hcpa_trans = std::atan2(HCC.y / agent1->GetWidth(), HCC.x / agent1->GetLength()) * 180 / M_PI;
+    units::angle::radian_t hcpa_orig = HCC.Angle() * 180 / M_PI;
+    units::angle::radian_t hcpa_trans = units::math::atan2(HCC.y / agent1->GetWidth(), HCC.x / agent1->GetLength()) * 180 / M_PI;
 
     SetCollisionAngles(oya, hcpa_orig, ocpa_orig, hcpa_trans, ocpa_trans);
 }
 
 bool CollisionDetectionPostCrash::GetCollisionPosition(const AgentInterface *agent1,
                                                        const AgentInterface *agent2,
-                                                       Common::Vector2d &cog1,
-                                                       Common::Vector2d &cog2,
-                                                       Common::Vector2d &pointOfImpact,
-                                                       double &phi,
+                                                       Common::Vector2d<units::length::meter_t> &cog1,
+                                                       Common::Vector2d<units::length::meter_t> &cog2,
+                                                       Common::Vector2d<units::length::meter_t> &pointOfImpact,
+                                                       units::angle::radian_t &phi,
                                                        int timeShift)
 {
-    std::vector<Common::Vector2d> agentCorners1 = GetAgentCorners(agent1);
-    std::vector<Common::Vector2d> agentCorners2 = GetAgentCorners(agent2);
+    std::vector<Common::Vector2d<units::length::meter_t>> agentCorners1 = GetAgentCorners(agent1);
+    std::vector<Common::Vector2d<units::length::meter_t>> agentCorners2 = GetAgentCorners(agent2);
     Polygon agent1Polygon(agentCorners1);
     Polygon agent2Polygon(agentCorners2);
-    agent1Polygon.Translate(GetAgentVelocityVector(agent1) * (static_cast<double>(timeShift) / 1000));
-    agent2Polygon.Translate(GetAgentVelocityVector(agent2) * (static_cast<double>(timeShift) / 1000));
 
+    units::time::millisecond_t time{timeShift};
+
+    Common::Vector2d<units::length::meter_t> translationVector1{GetAgentVelocityVector(agent1).x * time, GetAgentVelocityVector(agent1).y * time};
+    Common::Vector2d<units::length::meter_t> translationVector2{GetAgentVelocityVector(agent2).x * time, GetAgentVelocityVector(agent2).y * time};
+
+    agent1Polygon.Translate(translationVector1);
+    agent2Polygon.Translate(translationVector2);
 
     agent1Polygon.CalculateCentroid(cog1);
     agent2Polygon.CalculateCentroid(cog2);
 
-    std::vector<Common::Vector2d> intersectionPoints = CalculateAllIntersectionPoints(agent1Polygon.GetVertices(), agent2Polygon.GetVertices());
+    std::vector<Common::Vector2d<units::length::meter_t>> intersectionPoints = CalculateAllIntersectionPoints(agent1Polygon.GetVertices(), agent2Polygon.GetVertices());
     Polygon intersectionPolygon(intersectionPoints);
 
     std::vector<int> vertexTypes = GetVertexTypes(agent1Polygon.GetVertices(),
@@ -595,10 +636,10 @@ bool CollisionDetectionPostCrash::CreatePostCrashDynamics(const AgentInterface *
     //
     CalculateCollisionAngles(agent1, agent2, timeOfFirstContact);
 
-    Common::Vector2d resultAgent1COG = Common::Vector2d(-1, -1);
-    Common::Vector2d resultAgent2COG = Common::Vector2d(-1, -1);
-    Common::Vector2d pointOfImpact;
-    double phi;
+    Common::Vector2d<units::length::meter_t> resultAgent1COG = Common::Vector2d<units::length::meter_t>(-1_m, -1_m);
+    Common::Vector2d<units::length::meter_t> resultAgent2COG = Common::Vector2d<units::length::meter_t>(-1_m, -1_m);
+    Common::Vector2d<units::length::meter_t> pointOfImpact;
+    units::angle::radian_t phi;
 
     // position of agents after penetrationTime given by algorithm
     if (!GetCollisionPosition(agent1, agent2, resultAgent1COG, resultAgent2COG, pointOfImpact, phi, timeOfFirstContact + penetrationTime)) {
@@ -621,7 +662,7 @@ CollisionAngles CollisionDetectionPostCrash::GetCollisionAngles()
     return collAngles;
 }
 
-void CollisionDetectionPostCrash::SetCollisionAngles(double OYA, double HCPAo, double OCPAo, double HCPA, double OCPA)
+void CollisionDetectionPostCrash::SetCollisionAngles(units::angle::radian_t OYA, units::angle::radian_t HCPAo, units::angle::radian_t OCPAo, units::angle::radian_t HCPA, units::angle::radian_t OCPA)
 {
     this->collAngles.OYA = OYA;
     this->collAngles.HCPAo = HCPAo;
diff --git a/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/collisionDetection_Impact_implementation.h b/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/collisionDetection_Impact_implementation.h
index 6cda412c6017ea3c4f5f58f489e8a5be9e90a0b7..a05fe403d87bd47dc06745d6b7d92435b1fab28f 100644
--- a/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/collisionDetection_Impact_implementation.h
+++ b/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/collisionDetection_Impact_implementation.h
@@ -111,7 +111,7 @@ public:
      * \param[in]  HCPA                 transformed host collision point angle
      * \param[in]  OCPA                 transformed opponent collision point angle
      */
-    void SetCollisionAngles(double OYA, double HCPAo, double OCPAo, double HCPA, double OCPA);
+    void SetCollisionAngles(units::angle::radian_t OYA, units::angle::radian_t HCPAo, units::angle::radian_t OCPAo, units::angle::radian_t HCPA, units::angle::radian_t OCPA);
 
 protected:
     /*!
@@ -147,7 +147,7 @@ private:
      * \param[in] agent                 agent reference
      * \return                          agent corners
      */
-    std::vector<Common::Vector2d> GetAgentCorners(const AgentInterface *agent);
+    std::vector<Common::Vector2d<units::length::meter_t>> GetAgentCorners(const AgentInterface *agent);
 
     /*!
      * \brief Calculates points of intersection of two rectangles
@@ -164,8 +164,8 @@ private:
      * \param agentCorner2[in]      corners second agent
      * \return                      vector of of intersection points
      */
-    std::vector<Common::Vector2d> CalculateAllIntersectionPoints(std::vector<Common::Vector2d> corners1,
-                                                                 std::vector<Common::Vector2d> corners2);
+    std::vector<Common::Vector2d<units::length::meter_t>> CalculateAllIntersectionPoints(std::vector<Common::Vector2d<units::length::meter_t>> corners1,
+                                                                 std::vector<Common::Vector2d<units::length::meter_t>> corners2);
     /*!
      * \brief Calculates intersection point of two vectors
      * The calculation is based on describing the vectors using the Hesse normal form.
@@ -176,8 +176,8 @@ private:
      * \param intersectionPoint[out]    vector intersection point
      * \return                          flag indicating if calculation could be done correctly
      */
-    bool GetIntersectionPoint(Common::Vector2d n1, Common::Vector2d n2, double d1, double d2,
-                              Common::Vector2d &intersectionPoint);
+    bool GetIntersectionPoint(Common::Vector2d<units::length::meter_t> n1, Common::Vector2d<units::length::meter_t> n2, units::area::square_meter_t d1, units::area::square_meter_t d2,
+                              Common::Vector2d<units::length::meter_t> &intersectionPoint);
 
     /*!
      * \brief calculates time of first constact
@@ -232,8 +232,8 @@ private:
      */
     bool CalculatePlaneOfContact(Polygon intersection,
                                  std::vector<int> vertexTypes,
-                                 Common::Vector2d &pointOfImpact,
-                                 double &phi);
+                                 Common::Vector2d<units::length::meter_t> &pointOfImpact,
+                                 units::angle::radian_t &phi);
     /*!
      * \brief Calculate post-crash dynamics
      * The post-crash dynamics is calculated based on conservation of momentum
@@ -251,10 +251,10 @@ private:
      * \param[out] postCrashDynamic2        PostCrashDynamic of second agent
      * \return                              true if calculation was successful
      */
-    bool CalculatePostCrashDynamic(Common::Vector2d cog1, const AgentInterface *agent1,
-                                   Common::Vector2d cog2, const AgentInterface *agent2,
-                                   Common::Vector2d poi,
-                                   double phi,
+    bool CalculatePostCrashDynamic(Common::Vector2d<units::length::meter_t> cog1, const AgentInterface *agent1,
+                                   Common::Vector2d<units::length::meter_t> cog2, const AgentInterface *agent2,
+                                   Common::Vector2d<units::length::meter_t> poi,
+                                   units::angle::radian_t phi,
                                    PostCrashDynamic *postCrashDynamic1,
                                    PostCrashDynamic *postCrashDynamic2);
 
@@ -278,9 +278,9 @@ private:
      * \param[in] verticesIntersection   vertices of intersection polygon
      * \return                           vertex types of vertices of intersection polygon
      */
-    std::vector<int> GetVertexTypes(std::vector<Common::Vector2d> vertices1,
-                                    std::vector<Common::Vector2d> vertices2,
-                                    std::vector<Common::Vector2d> verticesIntersection);
+    std::vector<int> GetVertexTypes(std::vector<Common::Vector2d<units::length::meter_t>> vertices1,
+                                    std::vector<Common::Vector2d<units::length::meter_t>> vertices2,
+                                    std::vector<Common::Vector2d<units::length::meter_t>> verticesIntersection);
 
     /*!
      * \brief Get vector of the agent velocity
@@ -288,7 +288,7 @@ private:
      * \param[in] agent                 agent
      * \return                          vector (x,y) of the velocity of the agent
      */
-    Common::Vector2d GetAgentVelocityVector(const AgentInterface *agent);
+    Common::Vector2d<units::velocity::meters_per_second_t> GetAgentVelocityVector(const AgentInterface *agent);
 
     /*!
      * \brief shifts 2 polygons and checks if the shifted polygons are intersecting
@@ -301,7 +301,7 @@ private:
      * \return                              true if they are intersecting each other after shifting, false otherwise
      */
     bool ShiftPolygonsAndCheckIntersection(Polygon polygon1, Polygon polygon2,
-                                           Common::Vector2d shiftVector1, Common::Vector2d shiftVector2);
+                                           Common::Vector2d<units::length::meter_t> shiftVector1, Common::Vector2d<units::length::meter_t> shiftVector2);
 
     /*!
      * \brief Get geometry data at collision time
@@ -321,10 +321,10 @@ private:
      */
     bool GetCollisionPosition(const AgentInterface *agent1,
                               const AgentInterface *agent2,
-                              Common::Vector2d &cog1,
-                              Common::Vector2d &cog2,
-                              Common::Vector2d &pointOfImpact,
-                              double &phi,
+                              Common::Vector2d<units::length::meter_t> &cog1,
+                              Common::Vector2d<units::length::meter_t> &cog2,
+                              Common::Vector2d<units::length::meter_t> &pointOfImpact,
+                              units::angle::radian_t &phi,
                               int timeFirstContact);
 
     const CallbackInterface *callbacks;
diff --git a/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/polygon.cpp b/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/polygon.cpp
index e002200455e35b5ab78e99d8fdef9f27993903b4..05a0c7a81cef2ceb6e15ebf44ef11085a83ead47 100644
--- a/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/polygon.cpp
+++ b/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/polygon.cpp
@@ -10,7 +10,9 @@
 
 #include "polygon.h"
 
-bool Polygon::CalculateCentroid( Common::Vector2d &cog)
+using namespace units::literals;
+
+bool Polygon::CalculateCentroid( Common::Vector2d<units::length::meter_t> &cog)
 {
     // if empty, return empty vector
     if (vertices.size() == 0) {
@@ -18,23 +20,24 @@ bool Polygon::CalculateCentroid( Common::Vector2d &cog)
     }
 
     // close polygon by adding the first vertex at the end
-    std::vector<Common::Vector2d> v;
+    std::vector<Common::Vector2d<units::length::meter_t>> v;
     v = vertices;
     v.push_back(v[0]);
 
-    double area = 0;
-    cog.x = 0;
-    cog.y = 0;
+    units::area::square_meter_t area = 0_sq_m;
+
+    Common::Vector2d<units::unit_t<units::cubed<units::length::meter>>> tmpVector(units::unit_t<units::cubed<units::length::meter>>(0), units::unit_t<units::cubed<units::length::meter>>(0));
 
     for (unsigned int iV = 0; iV < vertices.size() ; iV++ ) {
-        double det;
+        units::area::square_meter_t det;
         det = ( v[iV].x * v[iV + 1].y - v[iV + 1].x * v[iV].y );
         area = area + det;
-        cog.x = cog.x + ( v[iV].x + v[iV + 1].x ) * det;
-        cog.y = cog.y + ( v[iV].y + v[iV + 1].y ) * det;
+        tmpVector.x = tmpVector.x + (v[iV].x + v[iV + 1].x) * det;
+        tmpVector.y = tmpVector.y + (v[iV].y + v[iV + 1].y) * det;
     }
 
-    cog.Scale( 1 / (3 * area) );
+    cog.x = tmpVector.x * (1 / (3 * area));
+    cog.y = tmpVector.y * (1 / (3 * area));
 
     return true;
 }
@@ -44,17 +47,17 @@ double Polygon::GetNumberOfVertices()
     return vertices.size();
 }
 
-std::vector<Common::Vector2d> Polygon::GetVertices() const
+std::vector<Common::Vector2d<units::length::meter_t>> Polygon::GetVertices() const
 {
     return vertices;
 }
 
-void Polygon::SetVertices(const std::vector<Common::Vector2d> &value)
+void Polygon::SetVertices(const std::vector<Common::Vector2d<units::length::meter_t>> &value)
 {
     vertices = value;
 }
 
-void Polygon::Translate(Common::Vector2d translationVector)
+void Polygon::Translate(Common::Vector2d<units::length::meter_t> translationVector)
 {
     for (unsigned int i = 0; i < vertices.size(); i++ ) {
         vertices.at(i).Translate(translationVector);
diff --git a/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/polygon.h b/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/polygon.h
index b7422afa940db2e46372c271c0cc4e3114ca9780..41c221add940394707cf8a2e91daa261baed6b22 100644
--- a/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/polygon.h
+++ b/sim/src/core/opSimulation/modules/Manipulator/srcCollisionPostCrash/polygon.h
@@ -23,7 +23,7 @@
 class Polygon
 {
 public:
-    Polygon(std::vector<Common::Vector2d> vertices)
+    Polygon(std::vector<Common::Vector2d<units::length::meter_t>> vertices)
         : vertices(vertices)
     {}
     virtual ~Polygon() = default;
@@ -42,7 +42,7 @@ public:
      * \param[out] cog   centroid of the polygon
      * \return           true if calculation was successful
      */
-    bool CalculateCentroid( Common::Vector2d &cog);
+    bool CalculateCentroid( Common::Vector2d<units::length::meter_t> &cog);
 
     /*!
      * \brief get number of vertices of the polygon
@@ -54,13 +54,13 @@ public:
      * \brief get vertices of the polygon
      * \return vertices of polygon
      */
-    std::vector<Common::Vector2d> GetVertices() const;
+    std::vector<Common::Vector2d<units::length::meter_t>> GetVertices() const;
 
     /*!
      * \brief set vertices of the polygon
      * \param vertices of the polygon
      */
-    void SetVertices(const std::vector<Common::Vector2d> &value);
+    void SetVertices(const std::vector<Common::Vector2d<units::length::meter_t>> &value);
 
     /*!
      * \brief translate the polygon
@@ -68,8 +68,8 @@ public:
      *
      * \param translationVector         vector for translation
      */
-    void Translate(Common::Vector2d translationVector);
+    void Translate(Common::Vector2d<units::length::meter_t> translationVector);
 
 private:
-    std::vector<Common::Vector2d> vertices;
+    std::vector<Common::Vector2d<units::length::meter_t>> vertices;
 };
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.cpp b/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.cpp
index 3a72f3218ab931d60582509ef11364b991c8faad..3dcca4e8e14cdb3f1d9093c4129ce476508ac421 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.cpp
@@ -198,7 +198,7 @@ void ObservationFileHandler::AddAgent(const std::string& agentId)
     xmlFileStream->writeAttribute(outputAttributes.AGENTTYPENAME, QString::fromStdString(std::get<std::string>(dataBuffer.GetStatic(keyPrefix + "AgentTypeName").at(0))));
     xmlFileStream->writeAttribute(outputAttributes.VEHICLEMODELTYPE, QString::fromStdString(std::get<std::string>(dataBuffer.GetStatic(keyPrefix + "VehicleModelType").at(0))));
     xmlFileStream->writeAttribute(outputAttributes.DRIVERPROFILENAME, QString::fromStdString(std::get<std::string>(dataBuffer.GetStatic(keyPrefix + "DriverProfileName").at(0))));
-    xmlFileStream->writeAttribute(outputAttributes.AGENTTYPE, QString::fromStdString(std::get<std::string>(dataBuffer.GetStatic(keyPrefix + "AgentType").at(0))));
+    xmlFileStream->writeAttribute(outputAttributes.AGENTTYPE, QString::fromStdString(std::get<std::string>(dataBuffer.GetStatic(keyPrefix + "EntityType").at(0))));
 
     AddVehicleAttributes(agentId);
     AddSensors(agentId);
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.cpp b/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.cpp
index 2f6063bd9add996027570c0aab72afae96fe1d53..fae58c75adc0559f673c7e2f844e96c47b6db069 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.cpp
@@ -37,7 +37,7 @@ void RunStatistic::WriteStatistics(QXmlStreamWriter* fileStream)
     fileStream->writeEndElement();
 
     fileStream->writeStartElement("VisibilityDistance");
-    fileStream->writeCharacters(QString::number(VisibilityDistance));
+    fileStream->writeCharacters(QString::number(VisibilityDistance.value()));
     fileStream->writeEndElement();
 
     fileStream->writeStartElement("StopReason");
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.h b/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.h
index da50e66ac864f150bc199ca63ecb91bec294a479..d39933fe8e5058ed0bb0c7c5f4302690590187ee 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.h
+++ b/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.h
@@ -11,8 +11,9 @@
 
 #pragma once
 
-#include <string>
 #include <list>
+#include <string>
+
 #include <QXmlStreamWriter>
 
 #include "include/observationInterface.h"
@@ -28,13 +29,13 @@ public:
     RunStatistic(std::uint32_t randomSeed);
 
     void AddStopReason(int time, StopReason reason);
-    void WriteStatistics(QXmlStreamWriter* fileStream);
+    void WriteStatistics(QXmlStreamWriter *fileStream);
 
     // general
     int StopTime = -1; //!<this stays on UNDEFINED_NUMBER, if due time out -> replace in c#
     bool EgoCollision = false;
-    std::map<std::string, double> distanceTraveled{}; //!< travel distance per agent
-    double VisibilityDistance = -999.0; //!< Visibility distance of world in current run (defined in simulationConfig.xml)
+    std::map<std::string, double> distanceTraveled{};  //!< travel distance per agent
+    units::length::meter_t VisibilityDistance{-999.0}; //!< Visibility distance of world in current run (defined in simulationConfig.xml)
 
     static QString BoolToString(bool b);
 
@@ -47,5 +48,3 @@ private:
     static const QString StopReasonsStrings[];
     int _stopReasonIdx = static_cast<int>(StopReason::DueToTimeOut);
 }; // class RunStatistic
-
-
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.cpp b/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.cpp
index ca898159dc2aefb73a933ac9a8ed9f01c9e1cf82..9ea8f88bf6db40293bbe12b2134210b9704c8dc9 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.cpp
@@ -37,7 +37,7 @@ void RunStatistic::WriteStatistics(QXmlStreamWriter* fileStream)
     fileStream->writeEndElement();
 
     fileStream->writeStartElement("VisibilityDistance");
-    fileStream->writeCharacters(QString::number(VisibilityDistance));
+    fileStream->writeCharacters(QString::number(VisibilityDistance.value()));
     fileStream->writeEndElement();
 
     fileStream->writeStartElement("StopReason");
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.h
index 78cbc293788a618b7ea0620d4e261e40cc54236a..d968c70cd3de24d4bc85dd3785d8158a7593a0d9 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.h
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.h
@@ -11,8 +11,9 @@
 
 #pragma once
 
-#include <string>
 #include <list>
+#include <string>
+
 #include <QXmlStreamWriter>
 
 #include "include/observationInterface.h"
@@ -28,13 +29,13 @@ public:
     RunStatistic(std::uint32_t randomSeed);
 
     void AddStopReason(int time, StopReason reason);
-    void WriteStatistics(QXmlStreamWriter* fileStream);
+    void WriteStatistics(QXmlStreamWriter *fileStream);
 
     // general
     int StopTime = -1; //!<this stays on UNDEFINED_NUMBER, if due time out -> replace in c#
     bool EgoCollision = false;
-    std::map<std::string, double> distanceTraveled{}; //!< travel distance per agent
-    double VisibilityDistance = -999.0; //!< Visibility distance of world in current run (defined in simulationConfig.xml)
+    std::map<std::string, double> distanceTraveled{};  //!< travel distance per agent
+    units::length::meter_t VisibilityDistance{-999.0}; //!< Visibility distance of world in current run (defined in simulationConfig.xml)
 
     static QString BoolToString(bool b);
 
@@ -47,5 +48,3 @@ private:
     static const QString StopReasonsStrings[];
     int _stopReasonIdx = static_cast<int>(StopReason::DueToTimeOut);
 }; // class RunStatistic
-
-
diff --git a/sim/src/core/opSimulation/modules/Observation_State/observation_state_implementation.cpp b/sim/src/core/opSimulation/modules/Observation_State/observation_state_implementation.cpp
index b0631bf4ffbc28c32a1b92d3d8e83e6962a16c1b..e3e0604a2028468ff1b8c54deacb54029edbd229 100644
--- a/sim/src/core/opSimulation/modules/Observation_State/observation_state_implementation.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_State/observation_state_implementation.cpp
@@ -303,7 +303,7 @@ void Observation_State_Implementation::Insert(int time, int agentId, Observation
     channel.push_back(value);
 }
 
-void Observation_State_Implementation::AddPositionXForCSV(int agentId, int time, double positionX)
+void Observation_State_Implementation::AddPositionXForCSV(int agentId, int time, units::length::meter_t positionX)
 {
     std::map<int, std::map<int, double>>::iterator agentIterator = agentsPositionX.find(agentId);
     if(agentIterator != agentsPositionX.end()){
diff --git a/sim/src/core/opSimulation/modules/Observation_State/observation_state_implementation.h b/sim/src/core/opSimulation/modules/Observation_State/observation_state_implementation.h
index 0e210923805986062e94c3de215ed234b93f24e6..12cf487f13280ba284b9cd3bc72378942f21f80a 100644
--- a/sim/src/core/opSimulation/modules/Observation_State/observation_state_implementation.h
+++ b/sim/src/core/opSimulation/modules/Observation_State/observation_state_implementation.h
@@ -146,7 +146,7 @@ private:
                 int agentId,
                 Observation_State_Periodic_Type valueType,
                 const std::string &value);
-    void AddPositionXForCSV(int agentId, int time, double positionX);
+    void AddPositionXForCSV(int agentId, int time, units::length::meter_t positionX);
     void WriteAgentPositionsToCSV();
 
     static const std::string PeriodicTypeStrings[];
diff --git a/sim/src/core/opSimulation/modules/Observation_Ttc/observation_ttc_implementation.cpp b/sim/src/core/opSimulation/modules/Observation_Ttc/observation_ttc_implementation.cpp
index 2dae924cd3fcb7b33b60094ebe0e4f46f8768872..119504b7e6a3020ae0526edfc8cd03be904f2dbd 100644
--- a/sim/src/core/opSimulation/modules/Observation_Ttc/observation_ttc_implementation.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_Ttc/observation_ttc_implementation.cpp
@@ -88,10 +88,10 @@ void Observation_Ttc_Implementation::OpSimulationUpdateHook(int time, RunResultI
         const AgentInterface *agent = GetWorld()->GetAgent(id);
         const AgentInterface *frontAgent = GetWorld()->GetAgent(frontID);
 
-        double deltaX = frontAgent->GetPositionX() - agent->GetPositionX();
-        double deltaV = frontAgent->GetVelocityX() - agent->GetVelocityX();
+        auto deltaX = frontAgent->GetPositionX() - agent->GetPositionX();
+        auto deltaV = frontAgent->GetVelocityX() - agent->GetVelocityX();
 
-        double ttc = - deltaX / deltaV;
+        units::times::second:t ttc = - deltaX / deltaV;
 
         if(ttc < 0){// a negative ttc means that there will never be a collision
             ttc = INFINITY;
@@ -177,7 +177,7 @@ int Observation_Ttc_Implementation::findFrontAgentID(int ownID)
 {
     const AgentInterface *agent = GetWorld()->GetAgent(ownID);
     double posX = agent->GetPositionX();
-    double minDistance = INFINITY;
+    units::length::meter_t minDistance = INFINITY;
     int frontID = -1;
 
     for (const auto &it: GetWorld()->GetAgents()){
@@ -185,7 +185,7 @@ int Observation_Ttc_Implementation::findFrontAgentID(int ownID)
         double posXother = otherAgent->GetPositionX();
         if ((otherAgent->GetAgentId() != ownID) && (posX < posXother))
         {
-            double distance = posXother - posX;
+            auto distance = posXother - posX;
             if(minDistance > distance){
                 minDistance = distance;
                 frontID = otherAgent->GetAgentId();
diff --git a/sim/src/core/opSimulation/modules/Spawners/CMakeLists.txt b/sim/src/core/opSimulation/modules/Spawners/CMakeLists.txt
index 45d7b872834141255e9016ecb21cae49825877da..283c5eb10c51b3a840a66cb1a402fd5fce1a6197 100644
--- a/sim/src/core/opSimulation/modules/Spawners/CMakeLists.txt
+++ b/sim/src/core/opSimulation/modules/Spawners/CMakeLists.txt
@@ -11,5 +11,4 @@
 #add_subdirectory(SpawnPoint_Start)
 add_subdirectory(PreRunCommon)
 add_subdirectory(RuntimeCommon)
-add_subdirectory(Scenario)
 
diff --git a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/CMakeLists.txt b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/CMakeLists.txt
index 1816a9ee921ebe39800005605c912c3c789d9d94..f4b6f5eca143fc7d5edfeed4be7da443d1b6104b 100644
--- a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/CMakeLists.txt
+++ b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/CMakeLists.txt
@@ -16,9 +16,8 @@ add_openpass_target(
   NAME ${COMPONENT_NAME} TYPE library LINKAGE shared COMPONENT core
 
   HEADERS
-    ../../../framework/sampler.h
-    ../../../modelElements/agentBlueprint.h
-        ../common/SpawnerDefinitions.h
+  ../../../framework/sampler.h
+  ../common/SpawnerDefinitions.h
     ../common/WorldAnalyzer.h
         SpawnerPreRunCommon.h
         SpawnerPreRunCommonExport.h
@@ -26,9 +25,8 @@ add_openpass_target(
         SpawnerPreRunCommonParameterExtractor.h
 
   SOURCES
-    ../../../framework/sampler.cpp
-    ../../../modelElements/agentBlueprint.cpp
-    ../common/WorldAnalyzer.cpp
+  ../../../framework/sampler.cpp
+  ../common/WorldAnalyzer.cpp
         SpawnerPreRunCommon.cpp
         SpawnerPreRunCommonExport.cpp
 
diff --git a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommon.cpp b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommon.cpp
index e483ad4c7e50c0eebe379c8706dc7c510065f27b..e45f06c5f53a31d7a28501101e6983bbd0d60fb2 100644
--- a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommon.cpp
+++ b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommon.cpp
@@ -10,24 +10,26 @@
 
 #include "SpawnerPreRunCommon.h"
 
+#include "MantleAPI/Traffic/entity_helper.h"
+#include "MantleAPI/Execution/i_environment.h"
 #include "SpawnerPreRunCommonParameterExtractor.h"
 #include "framework/agentFactory.h"
 #include "framework/sampler.h"
 #include "include/agentInterface.h"
+#include "include/entityRepositoryInterface.h"
 #include "include/worldInterface.h"
 
-SpawnerPreRunCommon::SpawnerPreRunCommon(const SpawnPointDependencies* dependencies,
-                       const CallbackInterface* callbacks):
+SpawnerPreRunCommon::SpawnerPreRunCommon(const SpawnPointDependencies *dependencies,
+                                         const CallbackInterface *callbacks) :
     SpawnPointInterface(dependencies->world, callbacks),
     dependencies(*dependencies),
     parameters(ExtractSpawnZonesParameters(*(dependencies->parameters.value()), *dependencies->world, callbacks)),
     worldAnalyzer(dependencies->world)
-{}
-
-SpawnPointInterface::Agents SpawnerPreRunCommon::Trigger([[maybe_unused]]int time)
 {
-    SpawnPointInterface::Agents newAgents;
+}
 
+void SpawnerPreRunCommon::Trigger([[maybe_unused]] int time)
+{
     for (const auto &spawnArea : parameters.spawnAreas)
     {
         const auto validLaneSpawningRanges = worldAnalyzer.GetValidLaneSpawningRanges(spawnArea.laneStream,
@@ -35,17 +37,11 @@ SpawnPointInterface::Agents SpawnerPreRunCommon::Trigger([[maybe_unused]]int tim
                                                                                       spawnArea.sEnd,
                                                                                       supportedLaneTypes);
 
-        for (const auto& validSpawningRange : validLaneSpawningRanges)
+        for (const auto &validSpawningRange : validLaneSpawningRanges)
         {
-            const auto generatedAgents = GenerateAgentsForRange(spawnArea.laneStream,
-                                                                validSpawningRange);
-            newAgents.insert(std::cend(newAgents),
-                             std::cbegin(generatedAgents),
-                             std::cend(generatedAgents));
+            GenerateAgentsForRange(spawnArea.laneStream, validSpawningRange);
         }
     }
-
-    return newAgents;
 }
 
 SpawningAgentProfile SpawnerPreRunCommon::SampleAgentProfile(bool rightLane)
@@ -53,11 +49,9 @@ SpawningAgentProfile SpawnerPreRunCommon::SampleAgentProfile(bool rightLane)
     return Sampler::Sample(rightLane ? parameters.agentProfileLaneMaps.rightLanes : parameters.agentProfileLaneMaps.leftLanes, dependencies.stochastics);
 }
 
-SpawnPointInterface::Agents SpawnerPreRunCommon::GenerateAgentsForRange(const std::unique_ptr<LaneStreamInterface>& laneStream,
-                                                                           const Range& range)
+void SpawnerPreRunCommon::GenerateAgentsForRange(const std::unique_ptr<LaneStreamInterface> &laneStream,
+                                                 const Range &range)
 {
-    SpawnPointInterface::Agents agents;
-
     bool generating = true;
 
     size_t rightLaneCount = worldAnalyzer.GetRightLaneCount(laneStream, range.second);
@@ -68,15 +62,19 @@ SpawnPointInterface::Agents SpawnerPreRunCommon::GenerateAgentsForRange(const st
 
         try
         {
-            auto agentBlueprint = dependencies.agentBlueprintProvider->SampleAgent(agentProfile.name, {});
-            agentBlueprint.SetAgentProfileName(agentProfile.name);
-            agentBlueprint.SetAgentCategory(AgentCategory::Common);
+            // TODO CK: Setting the category to Common is still missing. In Vehicle.cpp it's either set to ego or scenario. Maybe the create call needs to be extended by this
+            //agentBuildInstructions.agentCategory = AgentCategory::Common;
+
+            const auto vehicleModelName = dependencies.agentBlueprintProvider->SampleVehicleModelName(agentProfile.name);
 
-            const auto agentLength = agentBlueprint.GetVehicleModelParameters().boundingBoxDimensions.length;
-            const auto agentFrontLength = agentLength * 0.5 + agentBlueprint.GetVehicleModelParameters().boundingBoxCenter.x;
+            const auto vehicleProperties = helper::map::query(*dependencies.vehicles, vehicleModelName);
+            THROWIFFALSE(vehicleProperties, "Unkown VehicleModel \"" + vehicleModelName + "\" in AgentProfile \"" + agentProfile.name + "\"");
+
+            const auto agentLength = vehicleProperties.value()->bounding_box.dimension.length;
+            const auto agentFrontLength = agentLength * 0.5 + vehicleProperties.value()->bounding_box.geometric_center.x;
             const auto agentRearLength = agentLength - agentFrontLength;
 
-            auto velocity = Sampler::RollForStochasticAttribute(agentProfile.velocity, dependencies.stochastics);
+            units::velocity::meters_per_second_t velocity{Sampler::RollForStochasticAttribute(agentProfile.velocity, dependencies.stochastics)};
 
             for (size_t iterator = 0; iterator < rightLaneCount; ++iterator)
             {
@@ -84,7 +82,7 @@ SpawnPointInterface::Agents SpawnerPreRunCommon::GenerateAgentsForRange(const st
                 velocity *= 2.0 - homogeneity;
             }
 
-            const auto tGap = Sampler::RollForStochasticAttribute(agentProfile.tGap, dependencies.stochastics);
+            const units::time::second_t tGap{Sampler::RollForStochasticAttribute(agentProfile.tGap, dependencies.stochastics)};
 
             const auto spawnInfo = GetNextSpawnCarInfo(laneStream, range, tGap, velocity, agentFrontLength, agentRearLength);
             if (!spawnInfo.has_value())
@@ -95,50 +93,46 @@ SpawnPointInterface::Agents SpawnerPreRunCommon::GenerateAgentsForRange(const st
             if (!worldAnalyzer.AreSpawningCoordinatesValid(spawnInfo->roadId,
                                                            spawnInfo->laneId,
                                                            spawnInfo->s,
-                                                           0,
-                                                           GetStochasticOrPredefinedValue(parameters.minimumSeparationBuffer, dependencies.stochastics),
+                                                           0_m,
+                                                           units::length::meter_t(GetStochasticOrPredefinedValue(parameters.minimumSeparationBuffer, dependencies.stochastics)),
                                                            spawnInfo->spawnParameter.route,
-                                                           agentBlueprint.GetVehicleModelParameters())
-                || worldAnalyzer.SpawnWillCauseCrash(laneStream,
-                                                     spawnInfo->streamPosition,
-                                                     agentFrontLength,
-                                                     agentRearLength,
-                                                     velocity,
-                                                     Direction::BACKWARD))
+                                                           vehicleProperties.value()) ||
+                worldAnalyzer.SpawnWillCauseCrash(laneStream,
+                                                  spawnInfo->streamPosition,
+                                                  agentFrontLength,
+                                                  agentRearLength,
+                                                  velocity,
+                                                  Direction::BACKWARD))
             {
                 generating = false;
                 break;
             }
 
-            agentBlueprint.SetSpawnParameter(spawnInfo->spawnParameter);
+            SpawnPointDefinitions::CreateSpawnReadyEntity({agentProfile.name, "A", vehicleProperties.value(), spawnInfo->spawnParameter}, dependencies.environment);
 
-            core::Agent* newAgent = dependencies.agentFactory->AddAgent(&agentBlueprint);
+            auto &entityRepository{dynamic_cast<core::EntityRepositoryInterface &>(dependencies.environment->GetEntityRepository())};
 
-            if(newAgent != nullptr)
-            {
-                agents.emplace_back(newAgent);
-            }
-            else
+            if (!entityRepository.SpawnReadyAgents())
             {
                 generating = false;
                 break;
             }
+
             rightLaneCount = worldAnalyzer.GetRightLaneCount(laneStream, spawnInfo->streamPosition);
         }
-        catch (const std::runtime_error& error)
+        catch (const std::runtime_error &error)
         {
             LogError(error.what());
         }
     }
-    return agents;
 }
 
-std::optional<SpawnInfo> SpawnerPreRunCommon::GetNextSpawnCarInfo(const std::unique_ptr<LaneStreamInterface>& laneStream,
-                                                                     const Range& range,
-                                                                     const double gapInSeconds,
-                                                                     const double velocity,
-                                                                     const double agentFrontLength,
-                                                                     const double agentRearLength) const
+std::optional<SpawnInfo> SpawnerPreRunCommon::GetNextSpawnCarInfo(const std::unique_ptr<LaneStreamInterface> &laneStream,
+                                                                  const Range &range,
+                                                                  const units::time::second_t gapInSeconds,
+                                                                  const units::velocity::meters_per_second_t velocity,
+                                                                  const units::length::meter_t agentFrontLength,
+                                                                  const units::length::meter_t agentRearLength) const
 {
     auto spawnDistance = worldAnalyzer.GetNextSpawnPosition(laneStream,
                                                             range,
@@ -146,14 +140,14 @@ std::optional<SpawnInfo> SpawnerPreRunCommon::GetNextSpawnCarInfo(const std::uni
                                                             agentRearLength,
                                                             velocity,
                                                             gapInSeconds,
-                                                            GetStochasticOrPredefinedValue(parameters.minimumSeparationBuffer, dependencies.stochastics));
+                                                            units::length::meter_t(GetStochasticOrPredefinedValue(parameters.minimumSeparationBuffer, dependencies.stochastics)));
 
     if (!spawnDistance.has_value())
     {
         return {};
     }
 
-    auto roadPosition = laneStream->GetRoadPosition({spawnDistance.value(), 0});
+    auto roadPosition = laneStream->GetRoadPosition({spawnDistance.value(), 0_m});
 
     if (roadPosition.roadId.empty())
     {
@@ -170,7 +164,7 @@ std::optional<SpawnInfo> SpawnerPreRunCommon::GetNextSpawnCarInfo(const std::uni
     {
         return {};
     }
-    roadPosition = laneStream->GetRoadPosition({spawnDistance.value(), 0});
+    roadPosition = laneStream->GetRoadPosition({spawnDistance.value(), 0_m});
 
     const auto adjustedVelocity = worldAnalyzer.CalculateSpawnVelocityToPreventCrashing(laneStream,
                                                                                         *spawnDistance,
@@ -181,15 +175,15 @@ std::optional<SpawnInfo> SpawnerPreRunCommon::GetNextSpawnCarInfo(const std::uni
     auto worldPosition = GetWorld()->LaneCoord2WorldCoord(roadPosition.roadPosition.s, roadPosition.roadPosition.t, roadPosition.roadId, roadPosition.laneId);
 
     //considers adjusted velocity in curvatures
-    double spawnV = adjustedVelocity;
-    double kappa = worldPosition.curvature;
+    auto spawnV = adjustedVelocity;
+    double kappa = units::unit_cast<double>(worldPosition.curvature);
     if (kappa != 0.0)
     {
         double curvatureVelocity;
 
         curvatureVelocity = 160 * (1 / (std::sqrt((std::abs(kappa)) / 1000)));
 
-        spawnV = std::min(spawnV, curvatureVelocity);
+        spawnV = units::math::min(spawnV, units::velocity::meters_per_second_t(curvatureVelocity));
     }
 
     SpawnInfo spawnInfo;
@@ -198,18 +192,16 @@ std::optional<SpawnInfo> SpawnerPreRunCommon::GetNextSpawnCarInfo(const std::uni
     spawnInfo.laneId = roadPosition.laneId;
     spawnInfo.s = roadPosition.roadPosition.s;
     spawnInfo.streamPosition = spawnDistance.value();
-    spawnInfo.spawnParameter.positionX = worldPosition.xPos;
-    spawnInfo.spawnParameter.positionY = worldPosition.yPos;
-    spawnInfo.spawnParameter.yawAngle  = CommonHelper::SetAngleToValidRange(worldPosition.yawAngle + (roadPosition.laneId < 0 ? 0 : M_PI));
+    spawnInfo.spawnParameter.position = {worldPosition.xPos, worldPosition.yPos, 0_m};
+    spawnInfo.spawnParameter.orientation = {CommonHelper::SetAngleToValidRange(worldPosition.yawAngle + (roadPosition.laneId < 0 ? 0_rad : units::angle::radian_t(M_PI))), 0_rad, 0_rad};
     spawnInfo.spawnParameter.velocity = spawnV;
-    spawnInfo.spawnParameter.acceleration = 0.0;
+    spawnInfo.spawnParameter.acceleration = 0.0_mps_sq;
     spawnInfo.spawnParameter.route = route;
 
     return spawnInfo;
 }
 
-
-void SpawnerPreRunCommon::LogError(const std::string& message)
+void SpawnerPreRunCommon::LogError(const std::string &message)
 {
     std::stringstream log;
     log.str(std::string());
diff --git a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommon.h b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommon.h
index 8cae31a475d4ea85fa5fc031784bf976ddae649d..c06250e253eb68b6546ed20b4951bf08f4ab349e 100644
--- a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommon.h
+++ b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommon.h
@@ -20,7 +20,6 @@
 #pragma once
 
 #include "SpawnerPreRunCommonDefinitions.h"
-#include "agentBlueprint.h"
 #include "common/WorldAnalyzer.h"
 #include "common/spawnPointLibraryDefinitions.h"
 #include "include/agentBlueprintProviderInterface.h"
@@ -55,7 +54,7 @@ public:
      * \brief Trigger creates the agents for the spawn points
      * \return the created agents
      */
-    Agents Trigger(int time) override;
+    void Trigger(int time) override;
 
 private:
     /**
@@ -65,8 +64,8 @@ private:
      * @param[in]  validLaneSpawningRange   range to spawn
      * @return generated agent
      */
-    Agents GenerateAgentsForRange(const std::unique_ptr<LaneStreamInterface>& laneStream,
-                                  const Range& range);
+    void GenerateAgentsForRange(const std::unique_ptr<LaneStreamInterface> &laneStream,
+                                const Range &range);
 
     /**
      * @brief Get SpawnInfo for the next agent that should be spawned.
@@ -79,11 +78,11 @@ private:
      * @return      SpawnInfo for new agent.
      */
     std::optional<SpawnInfo> GetNextSpawnCarInfo(const std::unique_ptr<LaneStreamInterface> &laneStream,
-                                                      const Range& range,
-                                                      const double gapInSeconds,
-                                                      const double velocity,
-                                                      const double agentFrontLength,
-                                                      const double agentRearLength) const;
+                                                 const Range &range,
+                                                 const units::time::second_t gapInSeconds,
+                                                 const units::velocity::meters_per_second_t velocity,
+                                                 const units::length::meter_t agentFrontLength,
+                                                 const units::length::meter_t agentRearLength) const;
 
     /**
      * \brief Logs a message for error mode.
diff --git a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonDefinitions.h b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonDefinitions.h
index 57f99dafe30b5a81e67555ec41671e843e6e6dde..49e1e045b615455e142ad85117bbf892caca8fc5 100644
--- a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonDefinitions.h
+++ b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonDefinitions.h
@@ -52,7 +52,7 @@ namespace SpawnerPreRunCommonDefinitions {
         SpawnParameter spawnParameter;
         std::string roadId;
         int laneId;
-        double s;
-        double streamPosition;
+        units::length::meter_t s;
+        units::length::meter_t streamPosition;
     };
 } // SpawnPointPreRunDefinitions
diff --git a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonExport.cpp b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonExport.cpp
index 671d9263e9c51daa45a4368dd67b21e51f17a09e..52919a8bd280335cfbecd0dda8c7f71ea87015ab 100644
--- a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonExport.cpp
+++ b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonExport.cpp
@@ -50,11 +50,11 @@ extern "C" SPAWNPOINT_SHARED_EXPORT std::unique_ptr<SpawnPointInterface> OpenPAS
     }
 }
 
-extern "C" SPAWNPOINT_SHARED_EXPORT SpawnPointInterface::Agents OpenPASS_Trigger(SpawnPointInterface *implementation, int time)
+extern "C" SPAWNPOINT_SHARED_EXPORT void OpenPASS_Trigger(SpawnPointInterface *implementation, int time)
 {
     try
     {
-        return implementation->Trigger(time);
+        implementation->Trigger(time);
     }
     catch(const std::runtime_error &ex)
     {
@@ -62,8 +62,6 @@ extern "C" SPAWNPOINT_SHARED_EXPORT SpawnPointInterface::Agents OpenPASS_Trigger
         {
             Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
         }
-
-        return {};
     }
     catch(...)
     {
@@ -71,6 +69,5 @@ extern "C" SPAWNPOINT_SHARED_EXPORT SpawnPointInterface::Agents OpenPASS_Trigger
         {
             Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
         }
-        return {};
     }
 }
diff --git a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonParameterExtractor.h b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonParameterExtractor.h
index 50f001b30263f96d2949fcaec372879f544e0af6..0b66fe6909fdb45f48fd3ece63bf991436217d09 100644
--- a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonParameterExtractor.h
+++ b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonParameterExtractor.h
@@ -173,23 +173,23 @@ static std::vector<SpawnArea> ExtractSpawnAreas(const ParameterInterface &parame
         for (const auto& route : routes)
         {
             const auto roadStream = world.GetRoadStream(route);
-            auto sStartOnStream = 0.;
+            auto sStartOnStream = 0._m;
             auto sEndOnStream = roadStream->GetLength();
             if (firstRoute)
             {
                 if (sStartElement.has_value())
                 {
-                    double sStart = std::clamp(sStartElement.value(), 0.0, world.GetRoadLength(route.front().roadId));
-                    sStartOnStream = roadStream->GetStreamPosition(GlobalRoadPosition{route.front().roadId, 0, sStart, 0, 0}).s;
+                    auto sStart = std::clamp(units::length::meter_t(sStartElement.value()), 0.0_m, world.GetRoadLength(route.front().roadId));
+                    sStartOnStream = roadStream->GetStreamPosition(GlobalRoadPosition{route.front().roadId, 0, sStart, 0_m, 0_rad}).s;
                 }
                 if (sEndElement.has_value())
                 {
-                    double sEnd = std::clamp(sEndElement.value(), 0.0, world.GetRoadLength(route.back().roadId));
-                    sEndOnStream = roadStream->GetStreamPosition(GlobalRoadPosition{route.back().roadId, 0, sEnd, 0, 0}).s;
+                    auto sEnd = std::clamp(units::length::meter_t(sEndElement.value()), 0.0_m, world.GetRoadLength(route.back().roadId));
+                    sEndOnStream = roadStream->GetStreamPosition(GlobalRoadPosition{route.back().roadId, 0, sEnd, 0_m, 0_rad}).s;
                 }
                 else if (sLengthElement.has_value())
                 {
-                    double sLength = std::clamp(sLengthElement.value(), 0.0, roadStream->GetLength() - sStartOnStream);
+                    auto sLength = std::clamp(units::length::meter_t(sLengthElement.value()), 0.0_m, roadStream->GetLength() - sStartOnStream);
                     sEndOnStream = sStartOnStream + sLength;
                 }
             }
@@ -197,17 +197,17 @@ static std::vector<SpawnArea> ExtractSpawnAreas(const ParameterInterface &parame
             {
                 if (sStartElement.has_value())
                 {
-                    double sStart = std::clamp(sStartElement.value(), 0.0, world.GetRoadLength(route.back().roadId));
-                    sEndOnStream = roadStream->GetStreamPosition(GlobalRoadPosition{route.back().roadId, 0, sStart, 0, 0}).s;
+                    auto sStart = std::clamp(units::length::meter_t(sStartElement.value()), 0.0_m, world.GetRoadLength(route.back().roadId));
+                    sEndOnStream = roadStream->GetStreamPosition(GlobalRoadPosition{route.back().roadId, 0, sStart, 0_m, 0_rad}).s;
                 }
                 if (sEndElement.has_value())
                 {
-                    double sEnd = std::clamp(sEndElement.value(), 0.0, world.GetRoadLength(route.front().roadId));
-                    sStartOnStream = roadStream->GetStreamPosition(GlobalRoadPosition{route.front().roadId, 0, sEnd, 0, 0}).s;
+                    auto sEnd = std::clamp(units::length::meter_t(sEndElement.value()), 0.0_m, world.GetRoadLength(route.front().roadId));
+                    sStartOnStream = roadStream->GetStreamPosition(GlobalRoadPosition{route.front().roadId, 0, sEnd, 0_m, 0_rad}).s;
                 }
                 else if (sLengthElement.has_value())
                 {
-                    double sLength = std::clamp(sLengthElement.value(), 0.0, sEndOnStream);
+                    auto sLength = std::clamp(units::length::meter_t(sLengthElement.value()), 0.0_m, sEndOnStream);
                     sStartOnStream = sEndOnStream - sLength;
                 }
             }
@@ -221,7 +221,7 @@ static std::vector<SpawnArea> ExtractSpawnAreas(const ParameterInterface &parame
                     {
                         continue;
                     }
-                    spawnAreas.emplace_back(roadStream->GetLaneStream({sStartOnStream, 0.}, laneId),
+                    spawnAreas.emplace_back(roadStream->GetLaneStream({sStartOnStream, 0._m}, laneId),
                                             sStartOnStream,
                                             sEndOnStream);
                 }
diff --git a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/CMakeLists.txt b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/CMakeLists.txt
index 2663ffcde0e21ed1dfb6d636e1eaae9ead4909b9..a38352cf194ee3b5668f5487f5cf5cbdb068a448 100644
--- a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/CMakeLists.txt
+++ b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/CMakeLists.txt
@@ -17,8 +17,7 @@ add_openpass_target(
 
   HEADERS
     ../../../framework/sampler.h
-    ../../../modelElements/agentBlueprint.h
-        ../common/SpawnerDefinitions.h
+    ../common/SpawnerDefinitions.h
     ../common/WorldAnalyzer.h
         SpawnerRuntimeCommon.h
         SpawnerRuntimeCommonExport.h
@@ -27,7 +26,6 @@ add_openpass_target(
 
   SOURCES
     ../../../framework/sampler.cpp
-    ../../../modelElements/agentBlueprint.cpp
     ../common/WorldAnalyzer.cpp
         SpawnerRuntimeCommon.cpp
         SpawnerRuntimeCommonExport.cpp
diff --git a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommon.cpp b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommon.cpp
index 89b95dc131570393ebc911c43c163517278f51aa..de8e70698cba884f94df30fb94131021cf119784 100644
--- a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommon.cpp
+++ b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommon.cpp
@@ -14,52 +14,54 @@
 #include "framework/agentBlueprintProvider.h"
 #include "framework/agentFactory.h"
 #include "framework/sampler.h"
+#include "include/entityRepositoryInterface.h"
 
-SpawnerRuntimeCommon::SpawnerRuntimeCommon(const SpawnPointDependencies* dependencies,
-                                                 const CallbackInterface * const callbacks):
+SpawnerRuntimeCommon::SpawnerRuntimeCommon(const SpawnPointDependencies *dependencies,
+                                           const CallbackInterface *const callbacks) :
     SpawnPointInterface(dependencies->world, callbacks),
     dependencies(*dependencies),
     worldAnalyzer(dependencies->world),
     parameters(SpawnPointRuntimeCommonParameterExtractor::ExtractSpawnPointParameters(*(dependencies->parameters.value()), worldAnalyzer, supportedLaneTypes, callbacks))
 {
-    for (const auto& spawnPosition : parameters.spawnPositions)
+    for (const auto &spawnPosition : parameters.spawnPositions)
     {
         queuedSpawnDetails.push_back(GenerateSpawnDetailsForLane(spawnPosition, 0));
     }
 }
 
-SpawnPointInterface::Agents SpawnerRuntimeCommon::Trigger(int time)
+void SpawnerRuntimeCommon::Trigger(int time)
 {
-    SpawnPointInterface::Agents agents;
-
     for (size_t i = 0; i < parameters.spawnPositions.size(); ++i)
     {
         if (time >= queuedSpawnDetails[i].spawnTime && AreSpawningCoordinatesValid(queuedSpawnDetails[i], parameters.spawnPositions[i]))
         {
             AdjustVelocityForCrash(queuedSpawnDetails[i], parameters.spawnPositions[i]);
-            core::Agent* newAgent = dependencies.agentFactory->AddAgent(&(queuedSpawnDetails[i].agentBlueprint));
 
-            if (newAgent != nullptr)
-            {
-                agents.emplace_back(newAgent);
-            }
+            SpawnPointDefinitions::CreateSpawnReadyEntity(queuedSpawnDetails[i].entityInformation, dependencies.environment);
+
+            auto &entityRepository{dynamic_cast<core::EntityRepositoryInterface &>(dependencies.environment->GetEntityRepository())};
+            entityRepository.SpawnReadyAgents();
 
             queuedSpawnDetails[i] = GenerateSpawnDetailsForLane(parameters.spawnPositions[i], time);
         }
     }
-
-    return agents;
 }
 
 SpawnDetails SpawnerRuntimeCommon::GenerateSpawnDetailsForLane(const SpawnPosition sceneryInformation, int time)
 {
     auto rightLaneCount = worldAnalyzer.GetRightLaneCount(sceneryInformation.roadId, sceneryInformation.laneId, sceneryInformation.sPosition);
     const auto agentProfile = SampleAgentProfile(rightLaneCount == 0);
+
     try
     {
-        auto agentBlueprint = dependencies.agentBlueprintProvider->SampleAgent(agentProfile.name, {});
-        agentBlueprint.SetAgentProfileName(agentProfile.name);
-        agentBlueprint.SetAgentCategory(AgentCategory::Common);
+        const auto vehicleModelName = dependencies.agentBlueprintProvider->SampleVehicleModelName(agentProfile.name);
+        const auto vehicleProperties = helper::map::query(*dependencies.vehicles, vehicleModelName);
+        THROWIFFALSE(vehicleProperties, "Unkown VehicleModel \"" + vehicleModelName + "\" in AgentProfile \"" + agentProfile.name + "\"");
+
+        EntityInformation entityInformation(agentProfile.name, "", vehicleProperties.value(), {});
+
+        // TODO CK: Setting the category to Common is still missing. In Vehicle.cpp it's either set to ego or scenario. Maybe the create call needs to be extended by this
+        //agentBuildInstructions.agentCategory = AgentCategory::Common;
 
         const auto tGap = Sampler::RollForStochasticAttribute(agentProfile.tGap, dependencies.stochastics);
 
@@ -71,62 +73,61 @@ SpawnDetails SpawnerRuntimeCommon::GenerateSpawnDetailsForLane(const SpawnPositi
             velocity *= 2.0 - homogeneity;
         }
 
-        CalculateSpawnParameter(&agentBlueprint,
+        CalculateSpawnParameter(entityInformation.spawnParameter,
                                 sceneryInformation.roadId,
                                 sceneryInformation.laneId,
                                 sceneryInformation.sPosition,
-                                velocity);
+                                units::velocity::meters_per_second_t(velocity));
 
-        return SpawnDetails{static_cast<int>(tGap * 1000) + time, agentBlueprint};
+        return SpawnDetails{static_cast<int>(tGap * 1000) + time, entityInformation};
     }
-    catch (const std::runtime_error& error)
+    catch (const std::runtime_error &error)
     {
         LogError("Encountered an Error while generating Spawn Details: " + std::string(error.what()));
     }
 }
 
-void SpawnerRuntimeCommon::AdjustVelocityForCrash(SpawnDetails& spawnDetails,
-                                                     const SpawnPosition& sceneryInformation) const
+void SpawnerRuntimeCommon::AdjustVelocityForCrash(SpawnDetails &spawnDetails,
+                                                  const SpawnPosition &sceneryInformation) const
 {
-    const double agentFrontLength = spawnDetails.agentBlueprint.GetVehicleModelParameters().boundingBoxDimensions.length * 0.5 + spawnDetails.agentBlueprint.GetVehicleModelParameters().boundingBoxCenter.x;
-    const double agentRearLength = spawnDetails.agentBlueprint.GetVehicleModelParameters().boundingBoxDimensions.length * 0.5 - spawnDetails.agentBlueprint.GetVehicleModelParameters().boundingBoxCenter.x;
-    const auto intendedVelocity = spawnDetails.agentBlueprint.GetSpawnParameter().velocity;
-
-    spawnDetails.agentBlueprint.GetSpawnParameter().velocity = worldAnalyzer.CalculateSpawnVelocityToPreventCrashing(sceneryInformation.laneId,
-                                                                                                                     sceneryInformation.sPosition,
-                                                                                                                     agentFrontLength,
-                                                                                                                     agentRearLength,
-                                                                                                                     intendedVelocity,
-                                                                                                                     spawnDetails.agentBlueprint.GetSpawnParameter().route);
+    const units::length::meter_t agentFrontLength = spawnDetails.entityInformation.vehicleProperties->bounding_box.dimension.length * 0.5 + spawnDetails.entityInformation.vehicleProperties->bounding_box.geometric_center.x;
+    const units::length::meter_t agentRearLength = spawnDetails.entityInformation.vehicleProperties->bounding_box.dimension.length * 0.5 - spawnDetails.entityInformation.vehicleProperties->bounding_box.geometric_center.x;
+    const auto intendedVelocity = spawnDetails.entityInformation.spawnParameter.velocity;
+
+    spawnDetails.entityInformation.spawnParameter.velocity = worldAnalyzer.CalculateSpawnVelocityToPreventCrashing(sceneryInformation.laneId,
+                                                                                                                   sceneryInformation.sPosition,
+                                                                                                                   agentFrontLength,
+                                                                                                                   agentRearLength,
+                                                                                                                   intendedVelocity,
+                                                                                                                   spawnDetails.entityInformation.spawnParameter.route);
 }
 
-bool SpawnerRuntimeCommon::AreSpawningCoordinatesValid(const SpawnDetails& spawnDetails,
-                                                   const SpawnPosition& sceneryInformation) const
+bool SpawnerRuntimeCommon::AreSpawningCoordinatesValid(const SpawnDetails &spawnDetails,
+                                                       const SpawnPosition &sceneryInformation) const
 {
-    const auto vehicleModelParameters = spawnDetails.agentBlueprint.GetVehicleModelParameters();
+    const auto vehicleModelParameters = spawnDetails.entityInformation.vehicleProperties;
 
     return worldAnalyzer.AreSpawningCoordinatesValid(sceneryInformation.roadId,
                                                      sceneryInformation.laneId,
                                                      sceneryInformation.sPosition,
-                                                     0 /* offset */,
-                                                     GetStochasticOrPredefinedValue(parameters.minimumSeparationBuffer, dependencies.stochastics),
-                                                     spawnDetails.agentBlueprint.GetSpawnParameter().route,
+                                                     0_m /* offset */,
+                                                     units::length::meter_t(GetStochasticOrPredefinedValue(parameters.minimumSeparationBuffer, dependencies.stochastics)),
+                                                     spawnDetails.entityInformation.spawnParameter.route,
                                                      vehicleModelParameters);
-
 }
 
-void SpawnerRuntimeCommon::CalculateSpawnParameter(AgentBlueprintInterface* agentBlueprint,
-                                                      const RoadId& roadId,
-                                                      const LaneId laneId,
-                                                      const SPosition sPosition,
-                                                      const double velocity) const
+void SpawnerRuntimeCommon::CalculateSpawnParameter(SpawnParameter &spawnParameter,
+                                                   const RoadId &roadId,
+                                                   const LaneId laneId,
+                                                   const SPosition sPosition,
+                                                   const units::velocity::meters_per_second_t velocity) const
 {
-    Position pos = GetWorld()->LaneCoord2WorldCoord(sPosition, 0 /* offset */, roadId, laneId);
+    Position pos = GetWorld()->LaneCoord2WorldCoord(sPosition, 0_m /* offset */, roadId, laneId);
 
-    double spawnV = velocity;
+    auto spawnV = velocity;
 
     //considers adjusted velocity in curvatures
-    double kappa = pos.curvature;
+    double kappa = units::unit_cast<double>(pos.curvature);
 
     // Note: This could falsify ego and scenario agents
     if (kappa != 0.0)
@@ -135,15 +136,13 @@ void SpawnerRuntimeCommon::CalculateSpawnParameter(AgentBlueprintInterface* agen
 
         curvatureVelocity = 160 * (1 / (std::sqrt((std::abs(kappa)) / 1000)));
 
-        spawnV = std::min(spawnV, curvatureVelocity);
+        spawnV = units::math::min(spawnV, units::velocity::meters_per_second_t(curvatureVelocity));
     }
 
-    SpawnParameter& spawnParameter = agentBlueprint->GetSpawnParameter();
-    spawnParameter.positionX = pos.xPos;
-    spawnParameter.positionY = pos.yPos;
-    spawnParameter.yawAngle  = pos.yawAngle + (laneId < 0 ? 0.0 : M_PI);
-    spawnParameter.velocity = spawnV;
-    spawnParameter.acceleration = 0;
+    spawnParameter.position = {pos.xPos, pos.yPos, 0_m};
+    spawnParameter.orientation = {pos.yawAngle + (laneId < 0 ? 0.0_rad : units::angle::radian_t(M_PI)), 0_rad, 0_rad};
+    spawnParameter.velocity = units::velocity::meters_per_second_t(spawnV);
+    spawnParameter.acceleration = 0_mps_sq;
     spawnParameter.route = worldAnalyzer.SampleRoute(roadId,
                                                      laneId,
                                                      dependencies.stochastics);
@@ -154,7 +153,7 @@ SpawningAgentProfile SpawnerRuntimeCommon::SampleAgentProfile(bool rightLane)
     return Sampler::Sample(rightLane ? parameters.agentProfileLaneMaps.rightLanes : parameters.agentProfileLaneMaps.leftLanes, dependencies.stochastics);
 }
 
-void SpawnerRuntimeCommon::LogError(const std::string& message) const
+void SpawnerRuntimeCommon::LogError(const std::string &message) const
 {
     std::stringstream log;
     log.str(std::string());
diff --git a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommon.h b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommon.h
index b1520f7d7c11f0b0bae903abe96e9814c4511e04..b361c02f8c949391532b66d2ad69bca7c36377a8 100644
--- a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommon.h
+++ b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommon.h
@@ -25,7 +25,6 @@
 #pragma once
 
 #include "SpawnerRuntimeCommonDefinitions.h"
-#include "agentBlueprint.h"
 #include "common/SpawnerDefinitions.h"
 #include "common/WorldAnalyzer.h"
 #include "common/spawnPointLibraryDefinitions.h"
@@ -51,7 +50,7 @@ public:
      * \brief Trigger creates the agents for the spawn points
      * \return the created agents
      */
-    Agents Trigger(int time) override;
+    void Trigger(int time) override;
 
 private:
 
@@ -74,15 +73,15 @@ private:
     bool AreSpawningCoordinatesValid(const SpawnDetails& spawnDetails, const SpawnPosition& sceneryInformation) const;
     /**
      * @brief CalculateSpawnParameter
-     * @param[in]   agentBlueprint      AgentBlueprint for new agent.
+     * @param[out]  spawnParameter      SpawnParameter for new agent.
      * @param[in]   laneId              Id of lane in which new agent should be spawned.
      * @param[in]   spawnInfo           SpawnInfo of new agent.
      */
-    void CalculateSpawnParameter(AgentBlueprintInterface* agentBlueprint,
-                                 const RoadId& roadId,
+    void CalculateSpawnParameter(SpawnParameter &spawnParameter,
+                                 const RoadId &roadId,
                                  const LaneId laneId,
                                  const SPosition sPosition,
-                                 const double velocity) const;
+                                 const units::velocity::meters_per_second_t velocity) const;
 
     SpawningAgentProfile SampleAgentProfile(bool rightLane);
 
diff --git a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonDefinitions.h b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonDefinitions.h
index 336db2059d8e03fbe735085bec2805f0a80fa6f5..2f301e771b44bc37049d327ce169578fcafce857 100644
--- a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonDefinitions.h
+++ b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonDefinitions.h
@@ -14,7 +14,6 @@
 #include <unordered_map>
 #include <vector>
 
-#include "agentBlueprint.h"
 #include "common/SpawnerDefinitions.h"
 #include "include/parameterInterface.h"
 
@@ -23,12 +22,12 @@ namespace SpawnPointRuntimeCommonDefinitions
     using RoadId = std::string;
     using LaneId = int;
     using LaneIds = std::vector<LaneId>;
-    using SPosition = double;
+    using SPosition = units::length::meter_t;
 
     struct SpawnDetails
     {
         int spawnTime;
-        AgentBlueprint agentBlueprint;
+        SpawnPointDefinitions::EntityInformation entityInformation;
     };
 
     struct SpawnPosition
diff --git a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.cpp b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.cpp
index f571ad7bfea33da5acb641227a9eef3d8af7f3d9..9229deb5f345da1366cf568b206e23d703d220f6 100644
--- a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.cpp
+++ b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.cpp
@@ -54,7 +54,7 @@ extern "C" SPAWNPOINT_SHARED_EXPORT std::unique_ptr<SpawnPointInterface> OpenPAS
     }
 }
 
-extern "C" SPAWNPOINT_SHARED_EXPORT SpawnPointInterface::Agents OpenPASS_Trigger(SpawnPointInterface* implementation, int time)
+extern "C" SPAWNPOINT_SHARED_EXPORT void OpenPASS_Trigger(SpawnPointInterface *implementation, int time)
 {
-    return implementation->Trigger(time);
+    implementation->Trigger(time);
 }
diff --git a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.h b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.h
index c29d8a3b789ffaff89ad1788d83b33900c397982..b98e76f511aaf966d4a2d47f3f62387d706d7f66 100644
--- a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.h
+++ b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.h
@@ -18,5 +18,4 @@
 #pragma once
 
 #include "SpawnerRuntimeCommonGlobal.h"
-#include "include/scenarioInterface.h"
 #include "include/spawnPointInterface.h"
diff --git a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonParameterExtractor.h b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonParameterExtractor.h
index b9647a8a4aa8d0e033018d699924c6557427e5ea..f747895dd5ab7a0e4249cfecf8ce09ab17a66da2 100644
--- a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonParameterExtractor.h
+++ b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonParameterExtractor.h
@@ -58,9 +58,9 @@ namespace SpawnPointRuntimeCommonParameterExtractor
             {
                 for (const auto& laneId : sortedLaneIds)
                 {
-                    if(worldAnalyzer.ValidateRoadIdInDirection(roadId, laneId, sCoordinateElement.value(), supportedLaneTypes))
+                    if(worldAnalyzer.ValidateRoadIdInDirection(roadId, laneId, units::length::meter_t(sCoordinateElement.value()), supportedLaneTypes))
                     {
-                        spawnpoints.emplace_back(SpawnPosition{roadId, laneId, sCoordinateElement.value()});
+                        spawnpoints.emplace_back(SpawnPosition{roadId, laneId, units::length::meter_t(sCoordinateElement.value())});
                     }
                 }
             }
diff --git a/sim/src/core/opSimulation/modules/Spawners/Scenario/CMakeLists.txt b/sim/src/core/opSimulation/modules/Spawners/Scenario/CMakeLists.txt
deleted file mode 100644
index 81bda0705a300695905b411996c44c7aa0c1bb75..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Spawners/Scenario/CMakeLists.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-################################################################################
-# Copyright (c) 2020 HLRS, University of Stuttgart
-#               2020 in-tech GmbH
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# http://www.eclipse.org/legal/epl-2.0.
-#
-# SPDX-License-Identifier: EPL-2.0
-################################################################################
-
-set(COMPONENT_NAME SpawnerScenario)
-
-add_compile_definitions(SPAWNER_SCENARIO_LIBRARY)
-
-add_openpass_target(
-  NAME ${COMPONENT_NAME} TYPE library LINKAGE shared COMPONENT core
-
-  HEADERS
-    ../../../framework/sampler.h
-    ../../../modelElements/agentBlueprint.h
-        SpawnerScenario.h
-        SpawnerScenarioExport.h
-        SpawnerScenarioGlobal.h
-
-  SOURCES
-    ../../../framework/sampler.cpp
-    ../../../modelElements/agentBlueprint.cpp
-        SpawnerScenario.cpp
-        SpawnerScenarioExport.cpp
-
-  INCDIRS
-    ..
-    ../../../
-    ../../../modelElements/
-    ../../../../common
-    
-  LIBRARIES
-    Qt5::Core
-    CoreCommon
-)
-
diff --git a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenario.cpp b/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenario.cpp
deleted file mode 100644
index c09b09cf72040672ccef6ed03740185c990e709f..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenario.cpp
+++ /dev/null
@@ -1,332 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "SpawnerScenario.h"
-
-#include "agentBlueprint.h"
-#include "common/RoutePlanning/RouteCalculation.h"
-#include "framework/agentFactory.h"
-#include "framework/sampler.h"
-#include "include/agentInterface.h"
-#include "include/worldInterface.h"
-
-constexpr size_t MAX_DEPTH = 10; //! Limits search depths in case of cyclic network
-
-SpawnerScenario::SpawnerScenario(const SpawnPointDependencies* dependencies,
-                       const CallbackInterface* callbacks):
-    SpawnPointInterface(dependencies->world, callbacks),
-    dependencies(*dependencies)
-{
-    if (!dependencies->scenario)
-    {
-        LogError(std::string(COMPONENTNAME) + " received no scenario (required)");
-    }
-}
-
-SpawnPointInterface::Agents SpawnerScenario::Trigger([[maybe_unused]]int time)
-{
-    Agents agents;
-
-    for (const auto& entity : dependencies.scenario.value()->GetEntities())
-    {
-        if (entity.spawnInfo.spawning)
-        {
-            try
-            {
-                auto agentBlueprint = dependencies.agentBlueprintProvider->SampleAgent(entity.catalogReference.entryName, entity.assignedParameters);
-                agentBlueprint.SetAgentProfileName(entity.catalogReference.entryName);
-                agentBlueprint.SetAgentCategory(entity.name == "Ego"
-                                                    ? AgentCategory::Ego
-                                                    : AgentCategory::Scenario);
-                agentBlueprint.SetObjectName(entity.name);
-                agentBlueprint.SetSpawnParameter(CalculateSpawnParameter(entity,
-                                                                         agentBlueprint.GetVehicleModelParameters()));
-
-                core::Agent* newAgent = dependencies.agentFactory->AddAgent(&agentBlueprint);
-
-                if(newAgent != nullptr)
-                {
-                    agents.emplace_back(newAgent);
-                }
-                else
-                {
-                    LogError(" failed to add agent successfully for entity "
-                           + entity.name);
-                }
-
-            }
-            catch(const std::runtime_error& error)
-            {
-                LogError("SpawnerScenario encountered an Error: " + std::string(error.what()));
-            }
-        }
-    }
-
-    return agents;
-}
-
-bool SpawnerScenario::ValidateOverlappingAgents(const STCoordinates &stCoordinates,
-                                                             const openScenario::LanePosition& lanePosition,
-                                                             const VehicleModelParameters& vehicleModelParameters)
-{
-    const Position position = GetWorld()->LaneCoord2WorldCoord(stCoordinates.s,
-                                                         stCoordinates.t,
-                                                         lanePosition.roadId,
-                                                         lanePosition.laneId);
-
-    if (GetWorld()->IntersectsWithAgent(position.xPos,
-                                        position.yPos,
-                                        position.yawAngle,
-                                        vehicleModelParameters.boundingBoxDimensions.length,
-                                        vehicleModelParameters.boundingBoxDimensions.width,
-                                        vehicleModelParameters.boundingBoxDimensions.length * 0.5 + vehicleModelParameters.boundingBoxCenter.x))
-    {
-        return false;
-    }
-
-    return true;
-}
-
-bool SpawnerScenario::ValidateSTCoordinatesOnLane(const STCoordinates &stCoordinate,
-                                                  const openScenario::LanePosition &lanePosition,
-                                                  const double vehicleWidth)
-{
-    if (!GetWorld()->IsSValidOnLane(lanePosition.roadId,
-                                    lanePosition.laneId,
-                                    stCoordinate.s))
-    {
-        return false;
-    }
-
-    //Check if lane width > vehicle width
-    double laneWidth = GetWorld()->GetLaneWidth(lanePosition.roadId,
-                                                lanePosition.laneId,
-                                                stCoordinate.s);
-    if (vehicleWidth > laneWidth + std::abs(stCoordinate.t))
-    {
-        return false;
-    }
-
-    //Is vehicle completely inside the lane
-    bool isVehicleCompletelyInLane = (laneWidth - vehicleWidth) * 0.5 >= std::abs(stCoordinate.t);
-    if (isVehicleCompletelyInLane)
-    {
-        return true;
-    }
-
-    //Is vehicle more than 50 % on the lane
-    double allowedRange = laneWidth * 0.5;
-    bool outsideAllowedRange =  std::abs(stCoordinate.t) > allowedRange;
-    if (outsideAllowedRange)
-    {
-        return false;
-    }
-
-    //Is vehicle partly on invalid lane
-    bool isOffsetToLeftLane = (stCoordinate.t >= 0);
-    int otherLaneId = isOffsetToLeftLane ? (lanePosition.laneId + 1) : (lanePosition.laneId - 1);
-
-    if (!GetWorld()->IsSValidOnLane(lanePosition.roadId,
-                                    otherLaneId,
-                                    stCoordinate.s)) //other lane is invalid
-    {
-        return false;
-    }
-
-    return true;
-}
-
-STCoordinates SpawnerScenario::GetSTCoordinates(const openScenario::LanePosition &lanePosition,
-                                                            const VehicleModelParameters &vehicleModelParameters)
-{
-    if(!lanePosition.stochasticS.has_value() && !lanePosition.stochasticOffset.has_value())
-    {
-        return {lanePosition.s, lanePosition.offset.value_or(0.0)};
-    }
-    else
-    {
-        for (int trial = 0; trial < NUMBER_OF_TRIALS_STOCHASTIC; trial++)
-        {
-            STCoordinates stCoordinates;
-
-            if(lanePosition.stochasticS.has_value())
-            {
-                stCoordinates.s = CalculateAttributeValue(lanePosition.stochasticS.value());
-            }
-            else
-            {
-                stCoordinates.s = lanePosition.s;
-            }
-
-            if(lanePosition.stochasticOffset.has_value())
-            {
-                stCoordinates.t = CalculateAttributeValue(lanePosition.stochasticOffset.value());
-            }
-            else
-            {
-                stCoordinates.t = lanePosition.offset.value_or(0.0);
-            }
-
-
-            if (ValidateOverlappingAgents(stCoordinates,
-                                                             lanePosition,
-                                                             vehicleModelParameters)
-                    && ValidateSTCoordinatesOnLane(stCoordinates,
-                                                             lanePosition,
-                                                             vehicleModelParameters.boundingBoxDimensions.width))
-            {
-                return stCoordinates;
-            }
-        }
-
-        LogError("Sampling valid stochastic spawn distance failed.");
-    }
-}
-
-SpawnParameter SpawnerScenario::CalculateSpawnParameter(const ScenarioEntity &entity,
-                                                           const VehicleModelParameters &vehicleModelParameters)
-{
-    const auto& spawnInfo = entity.spawnInfo;
-    SpawnParameter spawnParameter;
-
-    // Define position and orientation
-    // Lane Spawning
-    if(std::holds_alternative<openScenario::LanePosition>(spawnInfo.position))
-    {
-        const auto &lanePosition = std::get<openScenario::LanePosition>(spawnInfo.position);
-
-        const auto &stCoordinate = GetSTCoordinates(lanePosition, vehicleModelParameters);
-        const auto &pos = GetWorld()->LaneCoord2WorldCoord(stCoordinate.s,
-                                                           stCoordinate.t,
-                                                           lanePosition.roadId,
-                                                           lanePosition.laneId);
-
-        spawnParameter.positionX = pos.xPos;
-        spawnParameter.positionY = pos.yPos;
-        spawnParameter.yawAngle = pos.yawAngle;
-
-        if(lanePosition.orientation.has_value())
-        {
-            spawnParameter.yawAngle += lanePosition.orientation.value().h.value_or(0.0);
-        }
-    }
-    // World Spawning
-    else if (std::holds_alternative<openScenario::WorldPosition>(spawnInfo.position))
-    {
-        const auto &worldPosition = std::get<openScenario::WorldPosition>(spawnInfo.position);
-        spawnParameter.positionX = worldPosition.x;
-        spawnParameter.positionY = worldPosition.y;
-        spawnParameter.yawAngle = worldPosition.h.value_or(0.0);
-    }
-    else {
-        LogError("This Spawner only supports Lane- & WorldPositions.");
-    }
-
-    if(!IsInsideWorld(spawnParameter))
-    {
-        LogError("Agent \"" + entity.name + "\" is outside world");
-    }
-
-    // Define velocity
-    if(spawnInfo.stochasticVelocity.has_value())
-    {
-        spawnParameter.velocity = CalculateAttributeValue(spawnInfo.stochasticVelocity.value());
-    }
-    else
-    {
-        spawnParameter.velocity = spawnInfo.velocity;
-    }
-
-    // Define acceleration
-    if(spawnInfo.stochasticAcceleration.has_value())
-    {
-        spawnParameter.acceleration = CalculateAttributeValue(spawnInfo.stochasticAcceleration.value());
-    }
-    else
-    {
-        spawnParameter.acceleration = spawnInfo.acceleration.value_or(0.0);
-    }
-
-    if (spawnInfo.route.has_value())
-    {
-        spawnParameter.route = GetPredefinedRoute(spawnInfo.route.value());
-    }
-    else
-    {
-        spawnParameter.route = GetRandomRoute(spawnParameter);
-    }
-
-    return spawnParameter;
-}
-
-double SpawnerScenario::CalculateAttributeValue(const openScenario::StochasticAttribute &attribute)
-{
-    openpass::parameter::NormalDistribution distribution{attribute.mean, attribute.stdDeviation, attribute.lowerBoundary, attribute.upperBoundary};
-    return Sampler::RollForStochasticAttribute(distribution,
-                                               dependencies.stochastics);
-}
-
-Route SpawnerScenario::GetPredefinedRoute(const std::vector<RouteElement>& roads)
-{
-    if (roads.empty())
-    {
-        LogError("Route is empty");
-    }
-
-    auto [roadGraph , root] = GetWorld()->GetRoadGraph(roads.front(), std::max(MAX_DEPTH, roads.size()));
-
-    RoadGraphVertex target = root;
-    for (auto road = roads.begin() + 1; road != roads.end(); ++road)
-    {
-        bool foundSuccessor = false;
-        for (auto [successor, successorsEnd] = adjacent_vertices(target, roadGraph); successor != successorsEnd; ++successor)
-        {
-            if (get(RouteElement(), roadGraph, *successor) == *road)
-            {
-                foundSuccessor = true;
-                target = *successor;
-                break;
-            }
-        }
-        if (!foundSuccessor)
-        {
-            LogError("Invalid route defined in Scenario. Node " + road->roadId + " not reachable");
-        }
-    }
-
-    return Route{roadGraph, root, target};
-}
-
-Route SpawnerScenario::GetRandomRoute(const SpawnParameter& spawnParameter)
-{
-    const auto& roadPositions = GetWorld()->WorldCoord2LaneCoord(spawnParameter.positionX, spawnParameter.positionY, spawnParameter.yawAngle);
-    auto [roadGraph, root] = GetWorld()->GetRoadGraph(CommonHelper::GetRoadWithLowestHeading(roadPositions, *GetWorld()), MAX_DEPTH);
-    std::map<RoadGraph::edge_descriptor, double> weights = GetWorld()->GetEdgeWeights(roadGraph);
-    auto target = RouteCalculation::SampleRoute(roadGraph, root, weights, *dependencies
-            .stochastics);
-
-    return Route{roadGraph, root, target};
-}
-
-bool SpawnerScenario::IsInsideWorld(const SpawnParameter &spawnParameter)
-{
-    const auto& roadPositions = GetWorld()->WorldCoord2LaneCoord(spawnParameter.positionX, spawnParameter.positionY, spawnParameter.yawAngle);
-    return !roadPositions.empty();
-}
-
-
-[[noreturn]] void SpawnerScenario::LogError(const std::string& message)
-{
-    std::stringstream log;
-    log.str(std::string());
-    log << COMPONENTNAME << " " << message;
-    LOG(CbkLogLevel::Error, log.str());
-    throw std::runtime_error(log.str());
-}
diff --git a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenario.h b/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenario.h
deleted file mode 100644
index 2849f215f295b91f4bc30dd754309e03887fa6e1..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenario.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "common/SpawnerDefinitions.h"
-#include "common/spawnPointLibraryDefinitions.h"
-#include "include/agentBlueprintProviderInterface.h"
-#include "include/scenarioInterface.h"
-#include "include/spawnPointInterface.h"
-#include "include/worldInterface.h"
-
-struct STCoordinates
-{
-    double s;
-    double t;
-};
-
-/**
-* \brief spawns agents for all scenarios
-* \details This class implements a SpawnPointInterface which is used by the framework to fill out
-* AgentBlueprints. The spawnpoint calls the agentsampler to fill out all probability related
-* parameters of the blueprint. The spawnpoint then adds the spawning depended parameters to the
-* agentblueprint. The agentblueprint is then returned to the framework.
-* \ingroup SpawnerScenario
-*/
-class SpawnerScenario : public SpawnPointInterface
-{
-private:
-    static constexpr int NUMBER_OF_TRIALS_STOCHASTIC = 5;
-    static constexpr std::string_view COMPONENTNAME = "SpawnerScenario";
-
-public:
-    SpawnerScenario(const SpawnPointDependencies* dependencies,
-                       const CallbackInterface* callbacks);
-    SpawnerScenario(const SpawnerScenario &) = delete;
-    SpawnerScenario(SpawnerScenario &&) = delete;
-    SpawnerScenario & operator=(const SpawnerScenario &) = delete;
-    SpawnerScenario & operator=(SpawnerScenario &&) = delete;
-    ~SpawnerScenario() override = default;
-
-    /*!
-     * \brief Trigger creates the agents for the spawn points
-     * \return the created agents
-     */
-    Agents Trigger(int time) override;
-
-private:
-    /*!
-    * \brief Validates if there are already existing agents at a LanePosition
-    *
-    * @param[in]        stCoordinates           stCoordinates of position being validates
-    * @param[in]        lanePosition            lanePosition containing road and lane id
-    * @param[in]        vehicleModelParameters  vehicleModelParameters of the new agent
-    * @return           true, if new LanePosition does not overlap with existing agents
-    */
-    bool ValidateOverlappingAgents(const STCoordinates& stCoordinates,
-                                   const openScenario::LanePosition& lanePosition,
-                                   const VehicleModelParameters& vehicleModelParameters);
-
-    /*!
-    * \brief Checks if the offset is valid for a specific lane.
-    *
-    * \details  Checks if the vehicle is more than 50% inside the lane and is not placed on an invalid lane
-    *
-    * @param[in]        stCoordinates   stCoordinates of position being validates
-    * @param[in]        lanePosition    lanePosition containing road and lane id
-    * @param[in]        vehicleWidth    width of the new agent
-    * @return        true if valid. false if not valid.
-    */
-    bool ValidateSTCoordinatesOnLane(const STCoordinates& stCoordinate,
-                                     const openScenario::LanePosition& lanePosition,
-                                     const double vehicleWidth);
-
-    /*!
-     * \brief This method defines the S and T coordinate for a new agent, which is spawned based on a LanePosition
-     *
-     * \details If the LanePosition is based on stochastics the SpawnPoint will try to place up to 5 different samples.
-     *  If no valid S and T coordinates can be found, an error is thrown.
-     *
-     * \param[in]       lanePosition            Id of the referenced openDrive road
-     * \param[in]       vehicleModelParameters  Parameter of the vehicle
-     * \return       valid S and T coordinates of a new agent
-     */
-    STCoordinates GetSTCoordinates(const openScenario::LanePosition& lanePosition,
-                                   const VehicleModelParameters& vehicleModelParameters);
-
-    /*!
-    * \brief Creates new SpawnParameter for the AgentBlueprint.
-    *
-    * \param[in]     spawnInfo              Containing spawn information of the scenario file
-     * \param[in]    vehicleModelParameters Parameter of the vehicle
-    * \return       Valid SpawnParameter
-    */
-    SpawnParameter CalculateSpawnParameter(const ScenarioEntity& entity,
-                                           const VehicleModelParameters& vehicleModelParameters);
-
-    /*!
-     * \brief Samples a value based on stochastics
-     * \param[in]   attribute
-     * \return value
-     */
-    double CalculateAttributeValue(const openScenario::StochasticAttribute &attribute);
-
-    /*!
-     * \brief Converts the imported route from OpenScenario into a graph
-     *
-     * \param[in]   roads   route from OpenScenario
-     *
-     * \return  graph of road network from agent's perspective with target node as given by OpenScenario, nullopt if no road in OpenScenario defined
-     */
-    Route GetPredefinedRoute(const std::vector<RouteElement>& roads);
-
-    /*!
-     * \brief Samples a random route for the agent starting at the given position
-     *
-     * \param spawnParameter parameters containing spawn position
-     *
-     * \return sampled route
-     */
-    Route GetRandomRoute(const SpawnParameter& spawnParameter);
-
-    /*!
-     * \brief Checks wether the agent is inside the world
-     *
-     * \param spawnParameter parameters containing spawn position
-     */
-    bool IsInsideWorld(const SpawnParameter& spawnParameter);
-
-    /*!
-    * \brief Logs a error message.
-    *
-    * \details Logs a error message.
-    *
-    * @param[in]     message    Logged message.
-    */
-    [[noreturn]] void LogError(const std::string& message);
-
-    const SpawnPointDependencies dependencies;
-};
diff --git a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioExport.cpp b/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioExport.cpp
deleted file mode 100644
index 06f6cd3a822ed56b96e97bc1c1a246196c777e0f..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioExport.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2019 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "SpawnerScenarioExport.h"
-
-#include "SpawnerScenario.h"
-
-const std::string Version = "0.0.1";
-static const CallbackInterface *Callbacks = nullptr;
-
-extern "C" SPAWNPOINT_SHARED_EXPORT const std::string &OpenPASS_GetVersion()
-{
-    return Version;
-}
-
-extern "C" SPAWNPOINT_SHARED_EXPORT std::unique_ptr<SpawnPointInterface> OpenPASS_CreateInstance(const SpawnPointDependencies* dependencies,
-                                                                                                 const CallbackInterface* callbacks)
-{
-    Callbacks = callbacks;
-
-    try
-    {
-        return std::make_unique<SpawnerScenario>(dependencies,
-                                                    callbacks);
-    }
-    catch(const std::runtime_error &ex)
-    {
-        if(Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
-        }
-
-        return nullptr;
-    }
-    catch(...)
-    {
-        if(Callbacks != nullptr)
-        {
-            Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-        }
-
-        return nullptr;
-    }
-}
-
-extern "C" SPAWNPOINT_SHARED_EXPORT SpawnPointInterface::Agents OpenPASS_Trigger(SpawnPointInterface *implementation, int time)
-{
-    return implementation->Trigger(time);
-}
diff --git a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioExport.h b/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioExport.h
deleted file mode 100644
index 1ee69a4c0cd80f67a066dd516e26d27a5a66c167..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Spawners/Scenario/SpawnerScenarioExport.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2019 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-//-----------------------------------------------------------------------------
-/** @file  SpawnPointExport.h
-*	@brief This file provides the exported methods.
-*
-*   This file provides the exported methods which are available outside of the library. */
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include "SpawnerScenarioGlobal.h"
-#include "include/scenarioInterface.h"
-#include "include/spawnPointInterface.h"
diff --git a/sim/src/core/opSimulation/modules/Spawners/SpawnPoint_Start/spawner_start_implementation.cpp b/sim/src/core/opSimulation/modules/Spawners/SpawnPoint_Start/spawner_start_implementation.cpp
index e1f00b40a3de67702ccc022d5c1b73d707640939..ce6ecb861ae9ac7f4b02dab64f3c37c8d7d10746 100644
--- a/sim/src/core/opSimulation/modules/Spawners/SpawnPoint_Start/spawner_start_implementation.cpp
+++ b/sim/src/core/opSimulation/modules/Spawners/SpawnPoint_Start/spawner_start_implementation.cpp
@@ -63,7 +63,7 @@ void SpawnPoint_Start_Implementation::SetSpawnItem(SpawnItemParameterInterface &
     spawnItem.SetPositionY(0);
 
     // set velocity X
-    double velocity = std::max(Par_vMin, GetStochastics()->GetNormalDistributed(Par_vMean, Par_vSd)); //in m/s
+    units::velocity::meters_per_second_t velocity = std::max(Par_vMin, GetStochastics()->GetNormalDistributed(Par_vMean, Par_vSd)); //in m/s
     spawnItem.SetVelocityX(velocity);
 
     // set velocity Y
diff --git a/sim/src/core/opSimulation/modules/Spawners/common/SpawnerDefinitions.h b/sim/src/core/opSimulation/modules/Spawners/common/SpawnerDefinitions.h
index 3d4efb996126ebd227ee39c352c42b8fdc73d4b8..00137495a20ea1c87a01a77704b426bbc25139f8 100644
--- a/sim/src/core/opSimulation/modules/Spawners/common/SpawnerDefinitions.h
+++ b/sim/src/core/opSimulation/modules/Spawners/common/SpawnerDefinitions.h
@@ -12,10 +12,13 @@
 
 #include <string>
 #include <vector>
+
+#include "MantleAPI/Traffic/entity_helper.h"
 #include "common/commonTools.h"
-#include "include/parameterInterface.h"
-#include "include/callbackInterface.h"
 #include "framework/sampler.h"
+#include "framework/vehicle.h"
+#include "include/callbackInterface.h"
+#include "include/parameterInterface.h"
 
 namespace SpawnPointDefinitions
 {
@@ -29,7 +32,7 @@ using RoadId = std::string;
 using RoadIds = std::vector<RoadId>;
 using LaneId = int;
 using LaneIds = std::vector<LaneId>;
-using SPosition = double;
+using SPosition = units::length::meter_t;
 using Range = std::pair<SPosition, SPosition>;
 using Ranges = std::vector<Range>;
 using VehicleRearAndFrontCoordinates = std::pair<SPosition, SPosition>;
@@ -135,4 +138,38 @@ static double GetStochasticOrPredefinedValue (std::variant<double, openpass::par
     }
 }
 
+struct EntityInformation
+{
+    EntityInformation(std::string agentProfileName,
+                      std::string entityName,
+                      std::shared_ptr<const mantle_api::VehicleProperties> vehicleProperties,
+                      SpawnParameter spawnParameter = {}) :
+        agentProfileName(agentProfileName),
+        entityName(entityName),
+        vehicleProperties(vehicleProperties),
+        spawnParameter(spawnParameter)
+    {
+    }
+
+    std::string agentProfileName;
+    std::string entityName;
+    std::shared_ptr<const mantle_api::VehicleProperties> vehicleProperties;
+    SpawnParameter spawnParameter{};
+};
+
+static void CreateSpawnReadyEntity(const EntityInformation &entityInformation, std::shared_ptr<mantle_api::IEnvironment> environment)
+{
+    auto controllerConfig = std::make_unique<mantle_api::ExternalControllerConfig>();
+    controllerConfig->parameters.insert({"AgentProfile", entityInformation.agentProfileName});
+
+    // TODO CK name is still missing. Empty for now. Therefore the Get can't work either
+    auto& entity = environment->GetEntityRepository().Create(entityInformation.entityName, *(entityInformation.vehicleProperties));
+    auto& controller = environment->GetControllerRepository().Create(std::move(controllerConfig));
+
+    environment->AddEntityToController(entity, controller.GetUniqueId());
+    entity.SetPosition(entityInformation.spawnParameter.position);
+    mantle_api::SetSpeed(&entity, entityInformation.spawnParameter.velocity);
+    entity.SetOrientation(entityInformation.spawnParameter.orientation);
+}
+
 } // namespace SpawnPointDefinitions
diff --git a/sim/src/core/opSimulation/modules/Spawners/common/WorldAnalyzer.cpp b/sim/src/core/opSimulation/modules/Spawners/common/WorldAnalyzer.cpp
index ead3be35245a06f73eb9ea2e4c2f954aa04c51cc..d6792d2141b5e58df2db5cef95246e162a2a7f8b 100644
--- a/sim/src/core/opSimulation/modules/Spawners/common/WorldAnalyzer.cpp
+++ b/sim/src/core/opSimulation/modules/Spawners/common/WorldAnalyzer.cpp
@@ -15,28 +15,28 @@
 
 namespace
 {
-    static constexpr double EPSILON = 0.001;
-    static constexpr double TTC_THRESHHOLD = 2.0;
-    static constexpr double TTC_ENDOFLANE = 4.0;
-    static constexpr double ASSUMED_TTB = 1.0;
-    static constexpr double ASSUMED_BRAKING_ACCELERATION = -6.0;
-    static constexpr double ASSUMED_FRONT_AGENT_ACCELERATION = -10;
+    const units::length::meter_t EPSILON{0.001};
+    const units::time::second_t TTC_THRESHHOLD{2.0};
+    const units::time::second_t TTC_ENDOFLANE{4.0};
+    const units::time::second_t ASSUMED_TTB{1.0};
+    const units::acceleration::meters_per_second_squared_t ASSUMED_BRAKING_ACCELERATION{-6.0};
+    const units::acceleration::meters_per_second_squared_t ASSUMED_FRONT_AGENT_ACCELERATION{-10};
     static constexpr size_t MAX_ROADGRAPH_DEPTH = 10; //! Limits search depths in case of cyclic network
 
-    static inline double GetSeparation(const double gapInSeconds,
-                                       const double velocity,
-                                       const double consideredCarLengths,
-                                       const double minimumSeparationBuffer)
+    static inline units::length::meter_t GetSeparation(const units::time::second_t gapInSeconds,
+                                       const units::velocity::meters_per_second_t velocity,
+                                       const units::length::meter_t consideredCarLengths,
+                                       const units::length::meter_t minimumSeparationBuffer)
     {
         const auto minimumBuffer = minimumSeparationBuffer + consideredCarLengths;
 
-        return std::max((gapInSeconds * velocity) + consideredCarLengths, minimumBuffer);
+        return units::math::max((gapInSeconds * velocity) + consideredCarLengths, minimumBuffer);
     }
 }
 
 bool WorldAnalyzer::ValidateRoadIdInDirection(const RoadId& roadId,
                                               const LaneId laneId,
-                                              const double distanceOnLane,
+                                              const units::length::meter_t distanceOnLane,
                                               const LaneTypes& validLaneTypes) const
 {
     if (!world->IsDirectionalRoadExisting(roadId, laneId < 0))
@@ -77,7 +77,7 @@ Ranges GetRangesWithSupportedLaneType(const std::unique_ptr<LaneStreamInterface>
 {
     Ranges ranges;
     bool lastSupported = false; // last lanetype was supported
-    double currentS = sStart; // start of current range
+    auto currentS = sStart; // start of current range
     const auto laneTypes = laneStream->GetLaneTypes();
     for (const auto [s, laneType] : laneTypes)
     {
@@ -129,7 +129,7 @@ Ranges WorldAnalyzer::GetValidLaneSpawningRanges(const std::unique_ptr<LaneStrea
 
     for (const auto& range : rangesWithSupportedLaneType)
     {
-        const auto agentsInLane = laneStream->GetAgentsInRange({range.first, 0}, {range.second, 0});
+        const auto agentsInLane = laneStream->GetAgentsInRange({range.first, 0_m}, {range.second, 0_m});
 
         AgentInterfaces scenarioAgents {};
         for (auto agent : agentsInLane)
@@ -165,20 +165,20 @@ Ranges WorldAnalyzer::GetValidLaneSpawningRanges(const std::unique_ptr<LaneStrea
     return validLaneSpawningRanges;
 }
 
-std::optional<double> WorldAnalyzer::GetNextSpawnPosition(const std::unique_ptr<LaneStreamInterface> &laneStream,
+std::optional<units::length::meter_t> WorldAnalyzer::GetNextSpawnPosition(const std::unique_ptr<LaneStreamInterface> &laneStream,
                                                           const Range& bounds,
-                                                          const double agentFrontLength,
-                                                          const double agentRearLength,
-                                                          const double intendedVelocity,
-                                                          const double gapInSeconds,
-                                                          const double minimumSeparationBuffer) const
+                                                          const units::length::meter_t agentFrontLength,
+                                                          const units::length::meter_t agentRearLength,
+                                                          const units::velocity::meters_per_second_t intendedVelocity,
+                                                          const units::time::second_t gapInSeconds,
+                                                          const units::length::meter_t minimumSeparationBuffer) const
 {
-    double spawnDistance;
+    units::length::meter_t spawnDistance;
 
     const auto maxSearchPosition = bounds.second + intendedVelocity * gapInSeconds;
 
-    const auto downstreamObjects = laneStream->GetAgentsInRange({bounds.first, 0},
-                                                                {maxSearchPosition, 0});
+    const auto downstreamObjects = laneStream->GetAgentsInRange({bounds.first, 0_m},
+                                                                {maxSearchPosition, 0_m});
     const AgentInterface* firstDownstreamObject = nullptr;
     if (!downstreamObjects.empty())
     {
@@ -210,13 +210,13 @@ std::optional<double> WorldAnalyzer::GetNextSpawnPosition(const std::unique_ptr<
     return spawnDistance;
 }
 
-double WorldAnalyzer::CalculateAdjustedSpawnDistanceToEndOfLane(const LaneId laneId, const double sCoordinate, const double intendedSpawnPosition, const double intendedVelocity, const Route &route, const LaneTypes &supportedLaneTypes) const
+units::length::meter_t WorldAnalyzer::CalculateAdjustedSpawnDistanceToEndOfLane(const LaneId laneId, const units::length::meter_t sCoordinate, const units::length::meter_t intendedSpawnPosition, const units::velocity::meters_per_second_t intendedVelocity, const Route &route, const LaneTypes &supportedLaneTypes) const
 {
     const auto distanceToEndOfDrivingLane = world->GetDistanceToEndOfLane(route.roadGraph,
                                                                           route.root,
                                                                           laneId,
                                                                           sCoordinate,
-                                                                          std::numeric_limits<double>::max(),
+                                                                          units::length::meter_t(std::numeric_limits<double>::max()),
                                                                           supportedLaneTypes).at(route.target);
 
     const auto minDistanceToEndOfLane = intendedVelocity * TTC_ENDOFLANE;
@@ -230,7 +230,7 @@ double WorldAnalyzer::CalculateAdjustedSpawnDistanceToEndOfLane(const LaneId lan
     return intendedSpawnPosition;
 }
 
-double WorldAnalyzer::CalculateSpawnVelocityToPreventCrashing(const LaneId laneId, const double intendedSpawnPosition, const double agentFrontLength, const double agentRearLength, const double intendedVelocity, const Route &route) const
+units::velocity::meters_per_second_t WorldAnalyzer::CalculateSpawnVelocityToPreventCrashing(const LaneId laneId, const units::length::meter_t intendedSpawnPosition, const units::length::meter_t agentFrontLength, const units::length::meter_t agentRearLength, const units::velocity::meters_per_second_t intendedVelocity, const Route &route) const
 {
     const auto& inOdDirection = get(RouteElement(), route.roadGraph, route.root).inOdDirection;
     const auto maxSearchDistance = agentFrontLength + (intendedVelocity * TTC_THRESHHOLD);
@@ -239,7 +239,7 @@ double WorldAnalyzer::CalculateSpawnVelocityToPreventCrashing(const LaneId laneI
                                                             route.root,
                                                             laneId,
                                                             intendedSpawnPosition - agentRearLength,
-                                                            0,
+                                                            0_m,
                                                             maxSearchDistance).at(route.target);
     const AgentInterface* opponent = nullptr;
     if (!nextObjectsInLane.empty())
@@ -247,7 +247,7 @@ double WorldAnalyzer::CalculateSpawnVelocityToPreventCrashing(const LaneId laneI
         opponent = nextObjectsInLane.front();
 
         const auto &relativeVelocity = intendedVelocity - opponent->GetVelocity().Length();
-        if (relativeVelocity <= 0.0)
+        if (relativeVelocity <= 0.0_mps)
         {
             return intendedVelocity;
         }
@@ -264,23 +264,23 @@ double WorldAnalyzer::CalculateSpawnVelocityToPreventCrashing(const LaneId laneI
     return intendedVelocity;
 }
 
-double WorldAnalyzer::CalculateSpawnVelocityToPreventCrashing(const std::unique_ptr<LaneStreamInterface> &laneStream,
-                                                              const double intendedSpawnPosition,
-                                                              const double agentFrontLength,
-                                                              const double agentRearLength,
-                                                              const double intendedVelocity) const
+units::velocity::meters_per_second_t WorldAnalyzer::CalculateSpawnVelocityToPreventCrashing(const std::unique_ptr<LaneStreamInterface> &laneStream,
+                                                              const units::length::meter_t intendedSpawnPosition,
+                                                              const units::length::meter_t agentFrontLength,
+                                                              const units::length::meter_t agentRearLength,
+                                                              const units::velocity::meters_per_second_t intendedVelocity) const
 {
     const auto maxSearchDistance = agentFrontLength + (intendedVelocity * TTC_THRESHHOLD);
 
-    const auto nextObjectsInLane = laneStream->GetObjectsInRange({intendedSpawnPosition - agentRearLength, 0},
-                                                                {maxSearchDistance, 0});
+    const auto nextObjectsInLane = laneStream->GetObjectsInRange({intendedSpawnPosition - agentRearLength, 0_m},
+                                                                {maxSearchDistance, 0_m});
     const WorldObjectInterface* opponent = nullptr;
     if (!nextObjectsInLane.empty())
     {
         opponent = nextObjectsInLane.front();
 
         const auto relativeVelocity = intendedVelocity - opponent->GetVelocity().Length();
-        if (relativeVelocity <= 0.0)
+        if (relativeVelocity <= 0.0_mps)
         {
             return intendedVelocity;
         }
@@ -299,11 +299,11 @@ double WorldAnalyzer::CalculateSpawnVelocityToPreventCrashing(const std::unique_
 bool WorldAnalyzer::ValidMinimumSpawningDistanceToObjectInFront(const LaneId laneId,
                                                                 const SPosition sPosition,
                                                                 const Route &route,
-                                                                const VehicleModelParameters& vehicleModelParameters,
-                                                                const double minimumSeparationBuffer) const
+                                                                std::shared_ptr<const mantle_api::VehicleProperties> vehicleModelParameters,
+                                                                const units::length::meter_t minimumSeparationBuffer) const
 {
-    const double distanceReferencePointToFrontAxle = vehicleModelParameters.boundingBoxDimensions.length * 0.5 + vehicleModelParameters.boundingBoxCenter.x;
-    const double rearLength = vehicleModelParameters.boundingBoxDimensions.length * 0.5 - vehicleModelParameters.boundingBoxCenter.x;
+    const units::length::meter_t distanceReferencePointToFrontAxle = vehicleModelParameters->bounding_box.dimension.length * 0.5 + vehicleModelParameters->bounding_box.geometric_center.x;
+    const units::length::meter_t rearLength = vehicleModelParameters->bounding_box.dimension.length * 0.5 - vehicleModelParameters->bounding_box.geometric_center.x;
 
     const auto agentsInRangeResult = world->GetObjectsInRange(route.roadGraph,
                                                               route.root,
@@ -321,24 +321,24 @@ bool WorldAnalyzer::ValidMinimumSpawningDistanceToObjectInFront(const LaneId lan
     return true;
 }
 
-bool WorldAnalyzer::AreSpawningCoordinatesValid(const RoadId& roadId,
+bool WorldAnalyzer::AreSpawningCoordinatesValid(const RoadId &roadId,
                                                 const LaneId laneId,
                                                 const SPosition sPosition,
-                                                const double offset,
-                                                const double minimumSeparationBuffer,
-                                                const Route& route,
-                                                const VehicleModelParameters& vehicleModelParameters) const
+                                                const units::length::meter_t offset,
+                                                const units::length::meter_t minimumSeparationBuffer,
+                                                const Route &route,
+                                                std::shared_ptr<const mantle_api::VehicleProperties> vehicleModelParameters) const
 {
     if (!world->IsSValidOnLane(roadId, laneId, sPosition))
     {
-        loggingCallback("S is not valid for vehicle on lane: " + std::to_string(laneId) + ". Invalid s: " + std::to_string(
+        loggingCallback("S is not valid for vehicle on lane: " + std::to_string(laneId) + ". Invalid s: " + units::length::to_string(
                        sPosition));
         return false;
     }
 
-    if (!IsOffsetValidForLane(roadId, laneId, sPosition, offset, vehicleModelParameters.boundingBoxDimensions.width))
+    if (!IsOffsetValidForLane(roadId, laneId, sPosition, offset, vehicleModelParameters->bounding_box.dimension.width))
     {
-        loggingCallback("Offset is not valid for vehicle on lane: " + std::to_string(laneId) + ". Invalid offset: " + std::to_string(
+        loggingCallback("Offset is not valid for vehicle on lane: " + std::to_string(laneId) + ". Invalid offset: " + units::length::to_string(
                      offset));
 
         return false;
@@ -353,10 +353,10 @@ bool WorldAnalyzer::AreSpawningCoordinatesValid(const RoadId& roadId,
     return true;
 }
 
-Ranges WorldAnalyzer::GetValidSpawningInformationForRange(const double sStart,
-                                                          const double sEnd,
-                                                          const double firstScenarioAgentSPosition,
-                                                          const double lastScenarioAgentSPosition)
+Ranges WorldAnalyzer::GetValidSpawningInformationForRange(const units::length::meter_t sStart,
+                                                          const units::length::meter_t sEnd,
+                                                          const units::length::meter_t firstScenarioAgentSPosition,
+                                                          const units::length::meter_t lastScenarioAgentSPosition)
 {
     // if the stream segment this SpawnPoint is responsible for is surrounded by scenario agents,
     // no valid spawn locations exist here
@@ -394,50 +394,49 @@ Ranges WorldAnalyzer::GetValidSpawningInformationForRange(const double sStart,
 bool WorldAnalyzer::IsOffsetValidForLane(const RoadId& roadId,
                                          const LaneId laneId,
                                          const SPosition distanceFromStart,
-                                         const double offset,
-                                         const double vehicleWidth) const
+                                         const units::length::meter_t offset,
+                                         const units::length::meter_t vehicleWidth) const
 {
     if (!world->IsSValidOnLane(roadId, laneId, distanceFromStart))
     {
         loggingCallback("Invalid offset. Lane is not available: " + std::to_string(laneId) + ". Distance from start: " +
-                 std::to_string(distanceFromStart));
+                 units::length::to_string(distanceFromStart));
         return false;
     }
 
     //Check if lane width > vehicle width
-    double laneWidth = world->GetLaneWidth(roadId, laneId, distanceFromStart);
-    if (vehicleWidth > laneWidth + std::abs(offset))
+    const auto laneWidth = world->GetLaneWidth(roadId, laneId, distanceFromStart);
+    if (vehicleWidth > laneWidth + units::math::abs(offset))
     {
         loggingCallback("Invalid offset. Lane width < vehicle width: " + std::to_string(laneId) + ". Distance from start: " +
-                 std::to_string(distanceFromStart) + ". Lane width: " + std::to_string(laneWidth) + ". Vehicle width: " + std::to_string(
-                     vehicleWidth));
+                        units::length::to_string(distanceFromStart) + ". Lane width: " + units::length::to_string(laneWidth) + ". Vehicle width: " + units::length::to_string(vehicleWidth));
         return false;
     }
 
     //Is vehicle completely inside the lane
-    bool isVehicleCompletelyInLane = (laneWidth - vehicleWidth) * 0.5 >= std::abs(offset);
+    bool isVehicleCompletelyInLane = (laneWidth - vehicleWidth) * 0.5 >= units::math::abs(offset);
     if (isVehicleCompletelyInLane)
     {
         return true;
     }
 
     //Is vehicle more than 50 % on the lane
-    double allowedRange = laneWidth * 0.5;
-    bool outsideAllowedRange =  std::abs(offset) > allowedRange;
+    units::length::meter_t allowedRange = laneWidth * 0.5;
+    bool outsideAllowedRange =  units::math::abs(offset) > allowedRange;
     if (outsideAllowedRange)
     {
         loggingCallback("Invalid offset. Vehicle not inside allowed range: " + std::to_string(laneId) + ". Invalid offset: " +
-                 std::to_string(offset));
+                 units::length::to_string(offset));
         return false;
     }
 
     //Is vehicle partly on invalid lane
-    bool isOffsetToLeftLane = (offset >= 0);
+    bool isOffsetToLeftLane = (offset >= 0_m);
     int otherLaneId = isOffsetToLeftLane ? (laneId + 1) : (laneId - 1);
 
     if (!world->IsSValidOnLane(roadId, otherLaneId, distanceFromStart)) //other lane is invalid
     {
-        loggingCallback("Invalid offset. Other lane is invalid: " + std::to_string(laneId) + ". Invalid offset: " + std::to_string(
+        loggingCallback("Invalid offset. Other lane is invalid: " + std::to_string(laneId) + ". Invalid offset: " + units::length::to_string(
                      offset));
         return false;
     }
@@ -445,33 +444,16 @@ bool WorldAnalyzer::IsOffsetValidForLane(const RoadId& roadId,
     return true;
 }
 
-bool WorldAnalyzer::NewAgentIntersectsWithExistingAgent(const RoadId& roadId,
-                                                        const LaneId laneId,
-                                                        const SPosition sPosition,
-                                                        const double offset,
-                                                        const VehicleModelParameters& vehicleModelParameters) const
-{
-    Position pos = world->LaneCoord2WorldCoord(sPosition, offset, roadId, laneId);
-
-    const double distanceReferencePointToLeadingEdge = vehicleModelParameters.boundingBoxDimensions.length * 0.5 + vehicleModelParameters.boundingBoxCenter.x;
-    return world->IntersectsWithAgent(pos.xPos,
-                                      pos.yPos,
-                                      pos.yawAngle,
-                                      vehicleModelParameters.boundingBoxDimensions.length,
-                                      vehicleModelParameters.boundingBoxDimensions.width,
-                                      distanceReferencePointToLeadingEdge);
-}
-
 bool WorldAnalyzer::SpawnWillCauseCrash(const std::unique_ptr<LaneStreamInterface>& laneStream,
                                         const SPosition sPosition,
-                                        const double agentFrontLength,
-                                        const double agentRearLength,
-                                        const double velocity,
+                                        const units::length::meter_t agentFrontLength,
+                                        const units::length::meter_t agentRearLength,
+                                        const units::velocity::meters_per_second_t velocity,
                                         const Direction direction) const
 {
     const auto searchForward = (direction == Direction::FORWARD);
-    const auto nextObjectsInLane = laneStream->GetObjectsInRange({sPosition - (searchForward ? 0 : std::numeric_limits<double>::infinity()), 0},
-                                                                 {sPosition + (searchForward ? std::numeric_limits<double>::infinity() : 0), 0});
+    const auto nextObjectsInLane = laneStream->GetObjectsInRange({sPosition - (searchForward ? 0_m : units::length::meter_t(std::numeric_limits<double>::infinity())), 0_m},
+                                                                 {sPosition + (searchForward ? units::length::meter_t(std::numeric_limits<double>::infinity()) : 0_m), 0_m});
 
     const WorldObjectInterface* opponent = nullptr;
     if (!nextObjectsInLane.empty())
@@ -484,13 +466,13 @@ bool WorldAnalyzer::SpawnWillCauseCrash(const std::unique_ptr<LaneStreamInterfac
         return false;
     }
 
-    double velocityOfRearObject;
-    double accelerationOfRearObject;
+    units::velocity::meters_per_second_t velocityOfRearObject;
+    units::acceleration::meters_per_second_squared_t accelerationOfRearObject;
 
-    double velocityOfFrontObject;
-    double accelerationOfFrontObject;
+    units::velocity::meters_per_second_t velocityOfFrontObject;
+    units::acceleration::meters_per_second_squared_t accelerationOfFrontObject;
 
-    double spaceBetweenObjects;
+    units::length::meter_t spaceBetweenObjects;
 
     if (searchForward)
     {
@@ -517,12 +499,12 @@ bool WorldAnalyzer::SpawnWillCauseCrash(const std::unique_ptr<LaneStreamInterfac
                                              ASSUMED_TTB);
 }
 
-size_t WorldAnalyzer::GetRightLaneCount(const RoadId& roadId, const LaneId& laneId, const double sPosition) const
+size_t WorldAnalyzer::GetRightLaneCount(const RoadId& roadId, const LaneId& laneId, const units::length::meter_t sPosition) const
 {
     size_t rightLaneCount{0};
     RoadGraph roadGraph;
     const auto start = add_vertex(RouteElement{roadId, laneId < 0}, roadGraph);
-    const auto relativeLanes = world->GetRelativeLanes(roadGraph, start, laneId, sPosition, 0).at(start);
+    const auto relativeLanes = world->GetRelativeLanes(roadGraph, start, laneId, sPosition, 0_m).at(start);
     for (const auto& lane : relativeLanes.front().lanes)
     {
         if (lane.relativeId < 0 && lane.type == LaneType::Driving)
@@ -533,9 +515,9 @@ size_t WorldAnalyzer::GetRightLaneCount(const RoadId& roadId, const LaneId& lane
     return rightLaneCount;
 }
 
-size_t WorldAnalyzer::GetRightLaneCount(const std::unique_ptr<LaneStreamInterface> &laneStream, const double sPosition) const
+size_t WorldAnalyzer::GetRightLaneCount(const std::unique_ptr<LaneStreamInterface> &laneStream, const units::length::meter_t sPosition) const
 {
-    auto roadPosition = laneStream->GetRoadPosition({sPosition, 0});
+    auto roadPosition = laneStream->GetRoadPosition({sPosition, 0_m});
 
     if (roadPosition.roadId.empty())
     {
diff --git a/sim/src/core/opSimulation/modules/Spawners/common/WorldAnalyzer.h b/sim/src/core/opSimulation/modules/Spawners/common/WorldAnalyzer.h
index 27f8790d0ad53d87229fa3a4503ff7864f6cca16..1c30355efef8ee448618accf6c0466ce4e55a0c5 100644
--- a/sim/src/core/opSimulation/modules/Spawners/common/WorldAnalyzer.h
+++ b/sim/src/core/opSimulation/modules/Spawners/common/WorldAnalyzer.h
@@ -67,13 +67,13 @@ public:
     //! \param gapInSeconds             desired TGap between spawned agent and next agent
     //! \param minimumSeparationBuffer  minimum distance between agents
     //! \return s position or nullopt if this would be outside the range
-    std::optional<double> GetNextSpawnPosition(const std::unique_ptr<LaneStreamInterface> &laneStream,
+    std::optional<units::length::meter_t> GetNextSpawnPosition(const std::unique_ptr<LaneStreamInterface> &laneStream,
                                                const Range& bounds,
-                                               const double agentFrontLength,
-                                               const double agentRearLength,
-                                               const double intendedVelocity,
-                                               const double gapInSeconds,
-                                               const double minimumSeparationBuffer) const;
+                                               const units::length::meter_t agentFrontLength,
+                                               const units::length::meter_t agentRearLength,
+                                               const units::velocity::meters_per_second_t intendedVelocity,
+                                               const units::time::second_t gapInSeconds,
+                                               const units::length::meter_t minimumSeparationBuffer) const;
 
     //! Calculates the adjusted spawn distance such that the minimum ttc to the end of lane is not violated
     //!
@@ -84,10 +84,10 @@ public:
     //! \param route                    route of the agent
     //! \param supportedLaneTypes   Container of all valid lanetypes
     //! \return adjusted spawn distance
-    double CalculateAdjustedSpawnDistanceToEndOfLane(const LaneId laneId,
-                                                     const double sCoordinate,
-                                                     const double intendedSpawnPosition,
-                                                     const double intendedVelocity,
+    units::length::meter_t CalculateAdjustedSpawnDistanceToEndOfLane(const LaneId laneId,
+                                                     const units::length::meter_t sCoordinate,
+                                                     const units::length::meter_t intendedSpawnPosition,
+                                                     const units::velocity::meters_per_second_t intendedVelocity,
                                                      const Route& route,
                                                      const LaneTypes& supportedLaneTypes) const;
 
@@ -101,12 +101,12 @@ public:
     //! \param intendedVelocity         spawning velocity
     //! \param route                    initial route of the agent
     //! \return possibly adjusted velocity
-    double CalculateSpawnVelocityToPreventCrashing(const LaneId laneId,
-                                                   const double intendedSpawnPosition,
-                                                   const double agentFrontLength,
-                                                   const double agentRearLength,
-                                                   const double intendedVelocity,
-                                                   const Route& route) const;
+    units::velocity::meters_per_second_t CalculateSpawnVelocityToPreventCrashing(const LaneId laneId,
+                                                                                const units::length::meter_t intendedSpawnPosition,
+                                                                                const units::length::meter_t agentFrontLength,
+                                                                                const units::length::meter_t agentRearLength,
+                                                                                const units::velocity::meters_per_second_t intendedVelocity,
+                                                                                const Route& route) const;
 
     //! Adjust spawning velocity so that the spawned agent won't immediately crash.
     //!
@@ -116,11 +116,11 @@ public:
     //! \param agentRearLength          distance from reference point to rear of agent
     //! \param intendedVelocity         spawning velocity
     //! \return possibly adjusted velocity
-    double CalculateSpawnVelocityToPreventCrashing(const std::unique_ptr<LaneStreamInterface> &laneStream,
-                                                   const double intendedSpawnPosition,
-                                                   const double agentFrontLength,
-                                                   const double agentRearLength,
-                                                   const double intendedVelocity) const;
+    units::velocity::meters_per_second_t CalculateSpawnVelocityToPreventCrashing(const std::unique_ptr<LaneStreamInterface> &laneStream,
+                                                                                const units::length::meter_t intendedSpawnPosition,
+                                                                                const units::length::meter_t agentFrontLength,
+                                                                                const units::length::meter_t agentRearLength,
+                                                                                const units::velocity::meters_per_second_t intendedVelocity) const;
 
     //! Check wether the minimum distance the next object is satisfied
     //!
@@ -132,9 +132,9 @@ public:
     //! \return true if minimum distance is met
     bool ValidMinimumSpawningDistanceToObjectInFront(const LaneId laneId,
                                                      const SPosition sPosition,
-                                                     const Route& route,
-                                                     const VehicleModelParameters& vehicleModelParameters,
-                                                     const double minimumSeparationBuffer) const;
+                                                     const Route &route,
+                                                     std::shared_ptr<const mantle_api::VehicleProperties> vehicleModelParameters,
+                                                     const units::length::meter_t minimumSeparationBuffer) const;
 
     //! Check if it is allowed the spawn an agent at the given coordinate
     //!
@@ -149,10 +149,10 @@ public:
     bool AreSpawningCoordinatesValid(const RoadId& roadId,
                                      const LaneId laneId,
                                      const SPosition sPosition,
-                                     const double offset,
-                                     const double minimumSeparationBuffer,
+                                     const units::length::meter_t offset,
+                                     const units::length::meter_t minimumSeparationBuffer,
                                      const Route &route,
-                                     const VehicleModelParameters& vehicleModelParameters) const;
+                                     std::shared_ptr<const mantle_api::VehicleProperties> vehicleModelParameters) const;
 
     //! Check wether spawning an agent with given parameters will result in a crash
     //!
@@ -164,9 +164,9 @@ public:
     //! \return true if spawning would cause a crash
     bool SpawnWillCauseCrash(const std::unique_ptr<LaneStreamInterface> &laneStream,
                              const SPosition sPosition,
-                             const double agentFrontLength,
-                             const double agentRearLength,
-                             const double velocity,
+                             const units::length::meter_t agentFrontLength,
+                             const units::length::meter_t agentRearLength,
+                             const units::velocity::meters_per_second_t velocity,
                              const Direction direction) const;
 
     //! Returns the number of lanes to the right of the given lane at the given s coordinate
@@ -175,14 +175,14 @@ public:
     //! \param laneId       Id of the lane
     //! \param sPosition    s coordinate
     //! \return number of lanes to the right
-    size_t GetRightLaneCount(const RoadId& roadId, const LaneId& laneId, const double sPosition) const;
+    size_t GetRightLaneCount(const RoadId& roadId, const LaneId& laneId, const units::length::meter_t sPosition) const;
 
     //! Returns the number of lanes to the right the given lane at the given s coordinate
     //!
     //! \param laneStream   LaneStream to spawn in
     //! \param sPosition    s coordinate
     //! \return number of lanes to the right
-    size_t GetRightLaneCount(const std::unique_ptr<LaneStreamInterface> &laneStream, const double sPosition) const;
+    size_t GetRightLaneCount(const std::unique_ptr<LaneStreamInterface> &laneStream, const units::length::meter_t sPosition) const;
 
     //! Checks if a roadId exists in direction of a laneId
     //!
@@ -194,7 +194,7 @@ public:
     //! \return true, if roadId exists in laneId direction
     bool ValidateRoadIdInDirection(const RoadId& roadId,
                                    const LaneId laneId,
-                                   const double distanceOnLane,
+                                   const units::length::meter_t distanceOnLane,
                                    const LaneTypes& validLaneTypes) const;
 
     //! Randomly generates a route based on a starting roadId
@@ -208,23 +208,17 @@ public:
                       StochasticsInterface* stochastics) const;
 
 private:
-    static Ranges GetValidSpawningInformationForRange(const double sStart,
-                                                      const double sEnd,
-                                                      const double firstScenarioAgentSPosition,
-                                                      const double lastScenarioAgentSPosition);
+    static Ranges GetValidSpawningInformationForRange(const units::length::meter_t sStart,
+                                                      const units::length::meter_t sEnd,
+                                                      const units::length::meter_t firstScenarioAgentSPosition,
+                                                      const units::length::meter_t lastScenarioAgentSPosition);
 
     bool IsOffsetValidForLane(const RoadId& roadId,
                               const LaneId laneId,
                               const SPosition distanceFromStart,
-                              const double offset,
-                              const double vehicleWidth) const;
-
-    bool NewAgentIntersectsWithExistingAgent(const RoadId& roadId,
-                                             const LaneId laneId,
-                                             const SPosition sPosition,
-                                             const double offset,
-                                             const VehicleModelParameters& vehicleModelParameters) const;
+                              const units::length::meter_t offset,
+                              const units::length::meter_t vehicleWidth) const;
 
-    WorldInterface * const world;
+    WorldInterface* const world;
     const std::function<void(const std::string&)> loggingCallback;
 };
diff --git a/sim/src/core/opSimulation/modules/World_Basic/agentAdapter.cpp b/sim/src/core/opSimulation/modules/World_Basic/agentAdapter.cpp
index 1a3ebf1455bd2cc704a85839268718033a22e931..efa6d1e0865d45affec162a8bafeba61036bd00a 100644
--- a/sim/src/core/opSimulation/modules/World_Basic/agentAdapter.cpp
+++ b/sim/src/core/opSimulation/modules/World_Basic/agentAdapter.cpp
@@ -67,7 +67,7 @@ double AgentAdapter::GetDistanceToFrontAgent(int laneId)
 {
     Q_UNUSED(laneId);
     double posX = GetPositionX();
-    double distance = INFINITY;
+    units::length::meter_t distance = INFINITY;
 
     for (const auto &it: world->GetAgents()){
         const AgentInterface *otherAgent = it.second;
diff --git a/sim/src/core/opSimulation/modules/World_Basic/agentAdapter.h b/sim/src/core/opSimulation/modules/World_Basic/agentAdapter.h
index 230a7a6573a7cf1fb13432488794dab1fed303a5..ac6a2eb82427197f94425933a59060a72cef10ba 100644
--- a/sim/src/core/opSimulation/modules/World_Basic/agentAdapter.h
+++ b/sim/src/core/opSimulation/modules/World_Basic/agentAdapter.h
@@ -55,57 +55,57 @@ public:
         return;
     }
 
-    double GetPositionX() const
+    units::length::meter_t GetPositionX() const
     {
         return positionX;
     }
 
-    double GetPositionY() const
+    units::length::meter_t GetPositionY() const
     {
         return positionY;
     }
 
-    double GetWidth() const
+    units::length::meter_t GetWidth() const
     {
         return width;
     }
 
-    double GetLength() const
+    units::length::meter_t GetLength() const
     {
         return length;
     }
 
-    double GetHeight() const
+    units::length::meter_t GetHeight() const
     {
         return height;
     }
 
-    double GetVelocityX() const
+    units::acceleration::meters_per_second_t GetVelocityX() const
     {
         return velocityX;
     }
 
-    double GetVelocityY() const
+    units::velocity::meters_per_second_t GetVelocityY() const
     {
         return velocityY;
     }
 
-    double GetDistanceCOGtoFrontAxle() const
+    units::acceleration::meters_per_second_t GetDistanceCOGtoFrontAxle() const
     {
         return distanceCOGtoFrontAxle;
     }
 
-    double GetWeight() const
+    units::mass::kilogram_t GetWeight() const
     {
         return weight;
     }
 
-    double GetHeightCOG() const
+    units::length::meter_t GetHeightCOG() const
     {
         return heightCOG;
     }
 
-    double GetWheelbase() const
+    units::length::meter_t GetWheelbase() const override
     {
         return wheelbase;
     }
@@ -130,22 +130,22 @@ public:
         return frictionCoeff;
     }
 
-    double GetTrackWidth() const
+    units::length::meter_t GetTrackWidth() const
     {
         return trackWidth;
     }
 
-    double GetDistanceCOGtoLeadingEdge() const
+    units::length::meter_t GetDistanceCOGtoLeadingEdge() const
     {
         return distanceCOGtoLeadingEdge;
     }
 
-    double GetAccelerationX() const
+    units::acceleration::meters_per_second_squared_t GetAccelerationX() const
     {
         return accelerationX;
     }
 
-    double GetAccelerationY() const
+    units::acceleration::meters_per_second_squared_t GetAccelerationY() const
     {
         return accelerationY;
     }
@@ -190,12 +190,12 @@ public:
         return {};
     } //dummy
 
-    AgentVehicleType GetVehicleType() const
+    mantle_api::EntityType GetType() const
     {
-        return vehicleType;
+        return type;
     }
 
-    void SetPositionX(double positionX)
+    void SetPositionX(units::length::meter_t positionX)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -204,7 +204,7 @@ public:
         positionX);
     }
 
-    void SetPositionY(double positionY)
+    void SetPositionY(units::length::meter_t positionY)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -213,7 +213,7 @@ public:
         positionY);
     }
 
-    void SetWidth(double width)
+    void SetWidth(units::length::meter_t width)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -222,7 +222,7 @@ public:
         width);
     }
 
-    void SetLength(double length)
+    void SetLength(units::length::meter_t length)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -231,7 +231,7 @@ public:
         length);
     }
 
-    void SetHeight(double height)
+    void SetHeight(units::length::meter_t height)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -240,7 +240,7 @@ public:
         height);
     }
 
-    void SetVelocityX(double velocityX)
+    void SetVelocityX(units::velocity::meters_per_second_t velocityX)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -249,7 +249,7 @@ public:
         velocityX);
     }
 
-    void SetVelocityY(double velocityY)
+    void SetVelocityY(units::velocity::meters_per_second_t velocityY)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -258,7 +258,7 @@ public:
         velocityY);
     }
 
-    void SetDistanceCOGtoFrontAxle(double distanceCOGtoFrontAxle)
+    void SetDistanceCOGtoFrontAxle(units::length::meter_t distanceCOGtoFrontAxle)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -267,7 +267,7 @@ public:
         distanceCOGtoFrontAxle);
     }
 
-    void SetWeight(double weight)
+    void SetWeight(units::mass::kilogram_t weight)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -276,7 +276,7 @@ public:
         weight);
     }
 
-    void SetHeightCOG(double heightCOG)
+    void SetHeightCOG(units::length::meter_t heightCOG)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -285,7 +285,7 @@ public:
         heightCOG);
     }
 
-    void SetWheelbase(double wheelbase)
+    void SetWheelbase(units::length::meter_t wheelbase)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -330,7 +330,7 @@ public:
         frictionCoeff);
     }
 
-    void SetTrackWidth(double trackWidth)
+    void SetTrackWidth(units::length::meter_t trackWidth)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -339,7 +339,7 @@ public:
         trackWidth);
     }
 
-    void SetDistanceCOGtoLeadingEdge(double distanceCOGtoLeadingEdge)
+    void SetDistanceCOGtoLeadingEdge(units::length::meter_t distanceCOGtoLeadingEdge)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -348,7 +348,7 @@ public:
         distanceCOGtoLeadingEdge);
     }
 
-    void SetAccelerationX(double accelerationX)
+    void SetAccelerationX(units::acceleration::meters_per_second_squared_t accelerationX)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -357,7 +357,7 @@ public:
         accelerationX);
     }
 
-    void SetAccelerationY(double accelerationY)
+    void SetAccelerationY(units::acceleration::meters_per_second_squared_t accelerationY)
     {
         world->QueueAgentUpdate([this](double arg)
         {
@@ -375,22 +375,22 @@ public:
         yawAngle);
     }
 
-    void UpdateWidth(double width)
+    void UpdateWidth(units::length::meter_t width)
     {
         this->width = width;
     }
 
-    void UpdateLength(double length)
+    void UpdateLength(units::length::meter_t length)
     {
         this->length = length;
     }
 
-    void UpdateHeight(double height)
+    void UpdateHeight(units::length::meter_t height)
     {
         this->height = height;
     }
 
-    void UpdatePositionX(double positionX)
+    void UpdatePositionX(units::length::meter_t positionX)
     {
         this->positionX = positionX;
     }
@@ -405,7 +405,7 @@ public:
         this->accelerationX = accelerationX;
     }
 
-    void UpdatePositionY(double positionY)
+    void UpdatePositionY(units::length::meter_t positionY)
     {
         this->positionY = positionY;
     }
@@ -425,22 +425,22 @@ public:
         this->yawAngle = yawAngle;
     }
 
-    void UpdateDistanceCOGtoFrontAxle(double distanceCOGtoFrontAxle)
+    void UpdateDistanceCOGtoFrontAxle(units::length::meter_t distanceCOGtoFrontAxle)
     {
         this->distanceCOGtoFrontAxle = distanceCOGtoFrontAxle;
     }
 
-    void UpdateWeight(double weight)
+    void UpdateWeight(units::mass::kilogram_t weight)
     {
         this->weight = weight;
     }
 
-    void UpdateHeightCOG(double heightCOG)
+    void UpdateHeightCOG(units::length::meter_t heightCOG)
     {
         this->heightCOG = heightCOG;
     }
 
-    void UpdateWheelbase(double wheelbase)
+    void UpdateWheelbase(units::length::meter_t wheelbase)
     {
         this->wheelbase = wheelbase;
     }
@@ -465,12 +465,12 @@ public:
         this->frictionCoeff = frictionCoeff;
     }
 
-    void UpdateTrackWidth(double trackWidth)
+    void UpdateTrackWidth(units::length::meter_t trackWidth)
     {
         this->trackWidth = trackWidth;
     }
 
-    void UpdateDistanceCOGtoLeadingEdge(double distanceCOGtoLeadingEdge)
+    void UpdateDistanceCOGtoLeadingEdge(units::length::meter_t distanceCOGtoLeadingEdge)
     {
         this->distanceCOGtoLeadingEdge = distanceCOGtoLeadingEdge;
     }
@@ -552,16 +552,16 @@ public:
     {
         Q_UNUSED(pos);   //dummy
     }
-    double GetDistanceToStartOfRoad() const
+    units::length::meter_t GetDistanceToStartOfRoad() const
     {
         return 0;   //dummy
     }
-    Position GetPositionByDistance(double distance) const
+    Position GetPositionByDistance(units::length::meter_t distance) const
     {
         Q_UNUSED(distance);    //dummy
         return Position();
     }
-    double GetLaneWidth()
+    units::length::meter_t GetLaneWidth()
     {
         return 0;   //dummy
     }
@@ -573,11 +573,11 @@ public:
     {
         return 0;   //dummy
     }
-    double GetCurvature()
+    units::curvature::inverse_meter_t GetCurvature()
     {
         return 0;   //dummy
     }
-    double GetCurvatureInDistance(double distance)
+    double GetCurvatureInDistance(units::length::meter_t distance)
     {
         Q_UNUSED(distance);    //dummy
         return 0;
@@ -587,8 +587,8 @@ public:
         return false;   //dummy
     }
 
-    double GetDistanceToFrontAgent(int laneId);
-    double GetDistanceToRearAgent(int laneId)
+    units::length::meter_t GetDistanceToFrontAgent(int laneId);
+    units::length::meter_t GetDistanceToRearAgent(int laneId)
     {
         Q_UNUSED(laneId);    //dummy
         return 0;
@@ -633,7 +633,7 @@ public:
         Q_UNUSED(agentFrontLeft);
         Q_UNUSED(agentFrontRight);
     } //dummy
-    double GetDistanceToSpecialAgent()
+    units::length::meter_t GetDistanceToSpecialAgent()
     {
         return 0;   //dummy
     }
@@ -641,7 +641,7 @@ public:
     {
         return false;   //dummy
     }
-    double GetDistanceToEndOfLane(double sightDistance) const
+    units::length::meter_t GetDistanceToEndOfLane(double sightDistance) const
     {
         Q_UNUSED(sightDistance);    //dummy
         return 0;
@@ -701,7 +701,7 @@ public:
         Q_UNUSED(laneId);    //dummy
         return 0;
     }
-    double GetPositionLateral() const
+    units::length::meter_t GetPositionLateral() const
     {
         return 0;   //dummy
     }
@@ -722,7 +722,7 @@ public:
     {
         return nullptr;   //dummy
     }
-    double GetDistanceFrontAgentToEgo()
+    units::length::meter_t GetDistanceFrontAgentToEgo()
     {
         return 0;   //dummy
     }
@@ -740,8 +740,8 @@ public:
         return LaneChangeState::NoLaneChange;
     }
     std::list<AgentInterface *> GetAllAgentsInLane(int laneID,
-                                                   double minDistance,
-                                                   double maxDistance,
+                                                   units::length::meter_t minDistance,
+                                                   units::length::meter_t maxDistance,
                                                    double AccSensDist)
     {
         Q_UNUSED(laneID);
@@ -755,7 +755,7 @@ public:
     {
         return false;   //dummy
     }
-    double GetLaneDirection() const
+    units::angle::radian_t GetLaneDirection() const
     {
         return 0;   //dummy
     }
@@ -772,12 +772,12 @@ public:
     {
         return "";
     }//dummy
-    virtual double GetDistanceToNearestMark(MarkType markType) const
+    virtual units::length::meter_t GetDistanceToNearestMark(MarkType markType) const
     {
         Q_UNUSED(markType);
         return INFINITY;
     }//dummy
-    double GetOrientationOfNearestMark(MarkType markType) const
+    units::angle::radian_t GetOrientationOfNearestMark(MarkType markType) const
     {
         Q_UNUSED(markType);
         return INFINITY;
@@ -792,28 +792,28 @@ public:
         Q_UNUSED(markType);
         return AgentViewDirection::none;
     }//dummy
-    virtual double GetDistanceToNearestMarkInViewDirection(MarkType markType,
+    virtual units::length::meter_t GetDistanceToNearestMarkInViewDirection(MarkType markType,
                                                            AgentViewDirection agentViewDirection) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(agentViewDirection);
         return INFINITY;
     }//dummy
-    virtual double GetDistanceToNearestMarkInViewDirection(MarkType markType,
+    virtual units::length::meter_t GetDistanceToNearestMarkInViewDirection(MarkType markType,
                                                            double mainViewDirection) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(mainViewDirection);
         return INFINITY;
     }//dummy
-    virtual double GetOrientationOfNearestMarkInViewDirection(MarkType markType,
+    virtual units::angle::radian_t GetOrientationOfNearestMarkInViewDirection(MarkType markType,
                                                               AgentViewDirection agentViewDirection) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(agentViewDirection);
         return INFINITY;
     }//dummy
-    virtual double GetOrientationOfNearestMarkInViewDirection(MarkType markType,
+    virtual units::angle::radian_t GetOrientationOfNearestMarkInViewDirection(MarkType markType,
                                                               double mainViewDirection) const
     {
         Q_UNUSED(markType);
@@ -821,8 +821,8 @@ public:
         return INFINITY;
     }//dummy
 
-    double GetDistanceToNearestMarkInViewRange(MarkType markType, AgentViewDirection agentViewDirection,
-                                               double range) const
+    units::length::meter_t GetDistanceToNearestMarkInViewRange(MarkType markType, AgentViewDirection agentViewDirection,
+                                               units::length::meter_t range) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(agentViewDirection);
@@ -830,8 +830,8 @@ public:
         return INFINITY;
     }//dummy
 
-    double GetDistanceToNearestMarkInViewRange(MarkType markType, double mainViewDirection,
-                                               double range) const
+    units::length::meter_t GetDistanceToNearestMarkInViewRange(MarkType markType, double mainViewDirection,
+                                               units::length::meter_t range) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(mainViewDirection);
@@ -839,8 +839,8 @@ public:
         return INFINITY;
     }//dummy
 
-    double GetOrientationOfNearestMarkInViewRange(MarkType markType,
-                                                  AgentViewDirection agentViewDirection, double range) const
+    units::angle::radian_t GetOrientationOfNearestMarkInViewRange(MarkType markType,
+                                                  AgentViewDirection agentViewDirection, units::length::meter_t range) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(agentViewDirection);
@@ -848,8 +848,8 @@ public:
         return INFINITY;
     }//dummy
 
-    double GetOrientationOfNearestMarkInViewRange(MarkType markType, double mainViewDirection,
-                                                  double range) const
+    units::angle::radian_t GetOrientationOfNearestMarkInViewRange(MarkType markType, double mainViewDirection,
+                                                  units::length::meter_t range) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(mainViewDirection);
@@ -858,7 +858,7 @@ public:
     }//dummy
 
     double GetViewDirectionToNearestMarkInViewRange(MarkType markType,
-                                                    AgentViewDirection agentViewDirection, double range) const
+                                                    AgentViewDirection agentViewDirection, units::length::meter_t range) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(agentViewDirection);
@@ -867,7 +867,7 @@ public:
     }//dummy
 
     double GetViewDirectionToNearestMarkInViewRange(MarkType markType, double mainViewDirection,
-                                                    double range) const
+                                                    units::length::meter_t range) const
     {
         Q_UNUSED(markType);
         Q_UNUSED(mainViewDirection);
@@ -875,7 +875,7 @@ public:
         return INFINITY;
     }//dummy
     std::string GetTypeOfNearestObject(AgentViewDirection agentViewDirection,
-                                       double range) const
+                                       units::length::meter_t range) const
     {
         Q_UNUSED(agentViewDirection);
         Q_UNUSED(range);
@@ -883,16 +883,16 @@ public:
         return "";
     }//dummy
     std::string GetTypeOfNearestObject(double mainViewDirection,
-                                       double range) const
+                                       units::length::meter_t range) const
     {
         Q_UNUSED(mainViewDirection);
         Q_UNUSED(range);
 
         return "";
     }//dummy
-    double GetDistanceToNearestObjectInViewRange(ObjectType objectType,
+    units::length::meter_t GetDistanceToNearestObjectInViewRange(ObjectType objectType,
                                                  AgentViewDirection agentViewDirection,
-                                                 double range) const
+                                                 units::length::meter_t range) const
     {
         Q_UNUSED(objectType);
         Q_UNUSED(agentViewDirection);
@@ -900,9 +900,9 @@ public:
 
         return INFINITY;
     }//dummy
-    double GetDistanceToNearestObjectInViewRange(ObjectType objectType,
+    units::length::meter_t GetDistanceToNearestObjectInViewRange(ObjectType objectType,
                                                  double mainViewDirection,
-                                                 double range) const
+                                                 units::length::meter_t range) const
     {
         Q_UNUSED(objectType);
         Q_UNUSED(mainViewDirection);
@@ -912,7 +912,7 @@ public:
     }//dummy
     double GetViewDirectionToNearestObjectInViewRange(ObjectType objectType,
                                                       AgentViewDirection agentViewDirection,
-                                                      double range) const
+                                                      units::length::meter_t range) const
     {
         Q_UNUSED(objectType);
         Q_UNUSED(agentViewDirection);
@@ -922,7 +922,7 @@ public:
     }//dummy
     double GetViewDirectionToNearestObjectInViewRange(ObjectType objectType,
                                                       double mainViewDirection,
-                                                      double range) const
+                                                      units::length::meter_t range) const
     {
         Q_UNUSED(objectType);
         Q_UNUSED(mainViewDirection);
@@ -931,7 +931,7 @@ public:
         return INFINITY;
     }//dummy
     int GetIdOfNearestAgent(AgentViewDirection agentViewDirection,
-                            double range) const
+                            units::length::meter_t range) const
     {
         Q_UNUSED(agentViewDirection);
         Q_UNUSED(range);
@@ -939,23 +939,23 @@ public:
         return -1;
     }//dummy
     int GetIdOfNearestAgent(double mainViewDirection,
-                            double range) const
+                            units::length::meter_t range) const
     {
         Q_UNUSED(mainViewDirection);
         Q_UNUSED(range);
 
         return -1;
     }//dummy
-    double GetDistanceToNearestAgentInViewRange(AgentViewDirection agentViewDirection,
-                                                double range) const
+    units::length::meter_t GetDistanceToNearestAgentInViewRange(AgentViewDirection agentViewDirection,
+                                                units::length::meter_t range) const
     {
         Q_UNUSED(agentViewDirection);
         Q_UNUSED(range);
 
         return INFINITY;
     }//dummy
-    double GetDistanceToNearestAgentInViewRange(double mainViewDirection,
-                                                double range) const
+    units::length::meter_t GetDistanceToNearestAgentInViewRange(double mainViewDirection,
+                                                units::length::meter_t range) const
     {
         Q_UNUSED(mainViewDirection);
         Q_UNUSED(range);
@@ -963,7 +963,7 @@ public:
         return INFINITY;
     }//dummy
     double GetViewDirectionToNearestAgentInViewRange(AgentViewDirection agentViewDirection,
-                                                     double range) const
+                                                     units::length::meter_t range) const
     {
         Q_UNUSED(agentViewDirection);
         Q_UNUSED(range);
@@ -971,7 +971,7 @@ public:
         return INFINITY;
     }//dummy
     double GetViewDirectionToNearestAgentInViewRange(double mainViewDirection,
-                                                     double range) const
+                                                     units::length::meter_t range) const
     {
         Q_UNUSED(mainViewDirection);
         Q_UNUSED(range);
@@ -986,11 +986,11 @@ public:
     {
         Q_UNUSED(yawVelocity);   //dummy
     }
-    double GetYawAcceleration()
+    units::angular_acceleration::radians_per_second_squared_t GetYawAcceleration()
     {
         return 0;   //dummy
     }
-    void SetYawAcceleration(double yawAcceleration)
+    void SetYawAcceleration(units::angular_acceleration::radians_per_second_squared_t yawAcceleration)
     {
         Q_UNUSED(yawAcceleration);   //dummy
     }
@@ -998,43 +998,43 @@ public:
     {
         return nullptr;    //dummy
     }
-    const std::vector<double> *GetTrajectoryXPos() const
+    const std::vector<units::length::meter_t> *GetTrajectoryXPos() const
     {
         return nullptr;    //dummy
     }
-    const std::vector<double> *GetTrajectoryYPos() const
+    const std::vector<units::length::meter_t> *GetTrajectoryYPos() const
     {
         return nullptr;    //dummy
     }
-    const std::vector<double> *GetTrajectoryVelocity() const
+    const std::vector<units::velocity::meters_per_second_t> *GetTrajectoryVelocity() const
     {
         return nullptr;    //dummy
     }
-    const std::vector<double> *GetTrajectoryAngle() const
+    const std::vector<units::angle::radian_t> *GetTrajectoryAngle() const
     {
         return nullptr;    //dummy
     }
-    void SetAccelerationIntention(double accelerationIntention)
+    void SetAccelerationIntention(units::acceleration::meters_per_second_squared_t accelerationIntention)
     {
         Q_UNUSED(accelerationIntention);   //dummy
     }
-    double GetAccelerationIntention() const
+    units::acceleration::meters_per_second_squared_t GetAccelerationIntention() const
     {
         return 0;   //dummy
     }
-    void SetDecelerationIntention(double decelerationIntention)
+    void SetDecelerationIntention(units::acceleration::meters_per_second_squared_t decelerationIntention)
     {
         Q_UNUSED(decelerationIntention);   //dummy
     }
-    double GetDecelerationIntention() const
+    units::acceleration::meters_per_second_squared_t GetDecelerationIntention() const
     {
         return 0;   //dummy
     }
-    void SetAngleIntention(double angleIntention)
+    void SetAngleIntention(units::angle::radian_t angleIntention)
     {
         Q_UNUSED(angleIntention);   //dummy
     }
-    double GetAngleIntention() const
+    units::angle::radian_t GetAngleIntention() const
     {
         return 0;   //dummy
     }
@@ -1046,7 +1046,7 @@ public:
     {
         return false;   //dummy
     }
-    double GetAccelerationAbsolute() const{
+    units::acceleration::meters_per_second_squared_t GetAccelerationAbsolute() const{
         return 0;//dummy
     }
 
@@ -1075,27 +1075,27 @@ protected:
 
 private:
 
-    double positionX = 0;
-    double positionY = 0;
-    double width = 0;
-    double length = 0;
-    double height = 0;
+    units::length::meter_t positionX = 0;
+    units::length::meter_t positionY = 0;
+    units::length::meter_t width = 0;
+    units::length::meter_t length = 0;
+    units::length::meter_t height = 0;
     double velocityX = 0.0;
     double velocityY = 0.0;
-    double distanceCOGtoFrontAxle = 0.0;
-    double weight = 0.0;
-    double heightCOG = 0.0;
-    double wheelbase = 0.0;
+    units::length::meter_t distanceCOGtoFrontAxle = 0.0;
+    units::mass::kilogram_t weight = 0.0;
+    units::length::meter_t heightCOG = 0.0;
+    units::length::meter_t wheelbase = 0.0;
     double momentInertiaRoll = 0.0;
     double momentInertiaPitch = 0.0;
     double momentInertiaYaw = 0.0;
     double frictionCoeff = 0.0;
-    double trackWidth = 0.0;
-    double distanceCOGtoLeadingEdge = 0.0;
+    units::length::meter_t trackWidth = 0.0;
+    units::length::meter_t distanceCOGtoLeadingEdge = 0.0;
     double accelerationX = 0.0;
     double accelerationY = 0.0;
     double yawAngle = 0.0;
-    AgentVehicleType vehicleType = AgentVehicleType::Undefined;
+    mantle_api::EntityType type = mantle:api::EntityType::kOther;
 
     std::vector<int> idsCollisionPartners;
     bool isValid = true;
diff --git a/sim/src/core/opSimulation/modules/World_Basic/world_basic_implementation.h b/sim/src/core/opSimulation/modules/World_Basic/world_basic_implementation.h
index 943369135884f6c833bc50506ad73651508ce08f..0ee1c23aeb261166b9c12418a6bd64590a0b32a7 100644
--- a/sim/src/core/opSimulation/modules/World_Basic/world_basic_implementation.h
+++ b/sim/src/core/opSimulation/modules/World_Basic/world_basic_implementation.h
@@ -120,7 +120,7 @@ public:
         return nullptr;   //dummy
     }
 
-    Position GetPositionByDistanceAndLane(double distance,
+    Position GetPositionByDistanceAndLane(units::length::meter_t distance,
                                           int laneNumber) const
     {
         Q_UNUSED(distance);
diff --git a/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.cpp b/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.cpp
index a74f4a9d98ed0ff3b2a750bac715bfb83cac2460..876cd54d80d1334beab9bc3c0a57e1b5d38b02ae 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.cpp
@@ -11,17 +11,19 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-#include <cassert>
-#include <algorithm>
 #include "AgentAdapter.h"
+
+#include <algorithm>
+#include <cassert>
+
 #include "common/globalDefinitions.h"
 
 namespace loc = World::Localization;
 
-AgentAdapter::AgentAdapter(OWL::Interfaces::MovingObject& mo,
-                           WorldInterface* world,
-                           const CallbackInterface* callbacks,
-                           const World::Localization::Localizer& localizer) :
+AgentAdapter::AgentAdapter(OWL::Interfaces::MovingObject &mo,
+                           WorldInterface *world,
+                           const CallbackInterface *callbacks,
+                           const World::Localization::Localizer &localizer) :
     WorldObjectAdapter{mo},
     world{world},
     callbacks{callbacks},
@@ -34,51 +36,40 @@ AgentAdapter::~AgentAdapter()
 {
 }
 
-void AgentAdapter::InitParameter(const AgentBlueprintInterface& agentBlueprint)
+void AgentAdapter::InitParameter(const AgentBuildInstructions &agentBuildInstructions)
 {
-    UpdateVehicleModelParameter(agentBlueprint.GetVehicleModelParameters());
-
-    const auto & vehicleType = this->vehicleModelParameters.vehicleType;
-    if (vehicleType != AgentVehicleType::Car &&
-            vehicleType != AgentVehicleType::Truck &&
-            vehicleType != AgentVehicleType::Motorbike &&
-            vehicleType != AgentVehicleType::Bicycle &&
-            vehicleType != AgentVehicleType::Pedestrian)
-    {
-        LOG(CbkLogLevel::Error, "undefined traffic object type");
-        throw std::runtime_error("undefined traffic object type");
-    }
+    UpdateEntityModelParameter(agentBuildInstructions.entityProperties);
 
-    this->vehicleModelType = agentBlueprint.GetVehicleModelName();
-    this->driverProfileName = agentBlueprint.GetDriverProfileName();
-    this->agentCategory = agentBlueprint.GetAgentCategory();
-    this->agentTypeName = agentBlueprint.GetAgentProfileName();
-    this->objectName = agentBlueprint.GetObjectName();
-    this->speedGoalMin = agentBlueprint.GetSpeedGoalMin();
+    //TODO: Do we really need to save these in the AgentAdapter?
+    this->vehicleModelType = agentBuildInstructions.entityProperties->model;
+    this->driverProfileName = agentBuildInstructions.system.driverProfileName;
+    this->agentCategory = agentBuildInstructions.agentCategory;
+    this->agentTypeName = agentBuildInstructions.system.agentProfileName;
+    this->objectName = agentBuildInstructions.name;
+    //    this->speedGoalMin = agentBlueprint.GetSpeedGoalMin();
 
     // set default values
-    GetBaseTrafficObject().SetZ(0.0);
-    GetBaseTrafficObject().SetPitch(0.0);
-    GetBaseTrafficObject().SetRoll(0.0);
-    GetBaseTrafficObject().SetAbsOrientationRate({0,0,0});
-    GetBaseTrafficObject().SetAbsOrientationAcceleration({0,0,0});
-
-    const auto& spawnParameter = agentBlueprint.GetSpawnParameter();
-    UpdateYaw(spawnParameter.yawAngle);
-    GetBaseTrafficObject().SetX(spawnParameter.positionX);
-    GetBaseTrafficObject().SetY(spawnParameter.positionY);
-    GetBaseTrafficObject().SetAbsVelocity(spawnParameter.velocity);
-    GetBaseTrafficObject().SetAbsAcceleration(spawnParameter.acceleration);
-    this->currentGear = static_cast<int>(spawnParameter.gear);
-
-    SetSensorParameters(agentBlueprint.GetSensorParameters());
+    GetBaseTrafficObject().SetZ(0.0_m);
+    GetBaseTrafficObject().SetPitch(0.0_rad);
+    GetBaseTrafficObject().SetRoll(0.0_rad);
+    GetBaseTrafficObject().SetAbsOrientationRate({0.0_rad_per_s,0.0_rad_per_s,0.0_rad_per_s});
+    GetBaseTrafficObject().SetAbsOrientationAcceleration({0.0_rad_per_s_sq,0.0_rad_per_s_sq,0.0_rad_per_s_sq});
+
+    UpdateYaw(agentBuildInstructions.spawnParameter.orientation.yaw);
+    GetBaseTrafficObject().SetX(agentBuildInstructions.spawnParameter.position.x);
+    GetBaseTrafficObject().SetY(agentBuildInstructions.spawnParameter.position.y);
+    GetBaseTrafficObject().SetAbsVelocity(agentBuildInstructions.spawnParameter.velocity);
+    GetBaseTrafficObject().SetAbsAcceleration(agentBuildInstructions.spawnParameter.acceleration);
+    this->currentGear = static_cast<int>(agentBuildInstructions.spawnParameter.gear);
+
+    SetSensorParameters(agentBuildInstructions.system.sensorParameters);
 
     // spawn tasks are executed before any other task types within current scheduling time
     // other task types will have a consistent view of the world
     // calculate initial position
     Locate();
 
-    auto& route = spawnParameter.route;
+    auto &route = agentBuildInstructions.spawnParameter.route;
     egoAgent.SetRoadGraph(std::move(route.roadGraph), route.root, route.target);
 }
 
@@ -88,7 +79,7 @@ bool AgentAdapter::Update()
     // and objects with an incomplete set of dynamic parameters (i. e. changing x/y with velocity = 0)
     //boundingBoxNeedsUpdate = std::abs(GetVelocity()) >= zeroBaseline;
     boundingBoxNeedsUpdate = true;
-    if(!Locate())
+    if (!Locate())
     {
         return false;
     }
@@ -156,28 +147,28 @@ void AgentAdapter::SetPosition(Position pos)
     SetYaw(pos.yawAngle);
 }
 
-Common::Vector2d AgentAdapter::GetVelocity(ObjectPoint point) const
+Common::Vector2d<units::velocity::meters_per_second_t> AgentAdapter::GetVelocity(ObjectPoint point) const
 {
-    double longitudinal = GetLongitudinal(point);
-    double lateral = GetLateral(point);
-    Common::Vector2d rotation{0.0, 0.0}; //! velocity from rotation of vehicle around reference point
-    if (longitudinal != 0. || lateral != 0.)
+    auto longitudinal = GetLongitudinal(point);
+    auto lateral = GetLateral(point);
+    Common::Vector2d<units::velocity::meters_per_second_t> rotation{0.0_mps, 0.0_mps}; //! velocity from rotation of vehicle around reference point
+    if (longitudinal != 0_m || lateral != 0_m)
     {
-        rotation.x = -lateral * GetYawRate();
-        rotation.y = longitudinal * GetYawRate();
+        rotation.x = -lateral * GetYawRate() / 1_rad;
+        rotation.y = longitudinal * GetYawRate() / 1_rad;
         rotation.Rotate(-GetYaw());
     }
-    return {GetBaseTrafficObject().GetAbsVelocity().vx + rotation.x, GetBaseTrafficObject().GetAbsVelocity().vy + rotation.y};
+    return {GetBaseTrafficObject().GetAbsVelocity().x + rotation.x, GetBaseTrafficObject().GetAbsVelocity().y + rotation.y};
 }
-Common::Vector2d AgentAdapter::GetAcceleration(ObjectPoint point) const
+Common::Vector2d<units::acceleration::meters_per_second_squared_t> AgentAdapter::GetAcceleration(ObjectPoint point) const
 {
-    double longitudinal = GetLongitudinal(point);
-    double lateral = GetLateral(point);
-    Common::Vector2d rotationAcceleration{0.0, 0.0}; //! acceleration from rotation of vehicle around reference point
-    if (longitudinal != 0. || lateral != 0.)
+    auto longitudinal = GetLongitudinal(point);
+    auto lateral = GetLateral(point);
+    Common::Vector2d<units::acceleration::meters_per_second_squared_t> rotationAcceleration{0.0_mps_sq, 0.0_mps_sq}; //! acceleration from rotation of vehicle around reference point
+    if (longitudinal != 0_m || lateral != 0_m)
     {
-        rotationAcceleration.x = -lateral * GetYawAcceleration();
-        rotationAcceleration.y = longitudinal * GetYawAcceleration();
+        rotationAcceleration.x = -lateral * GetYawAcceleration() / 1_rad;
+        rotationAcceleration.y = longitudinal * GetYawAcceleration() / 1_rad;
         rotationAcceleration.Rotate(-GetYaw());
     }
     return {GetBaseTrafficObject().GetAbsAcceleration().ax + rotationAcceleration.x, GetBaseTrafficObject().GetAbsAcceleration().ay + rotationAcceleration.y};
@@ -191,10 +182,9 @@ bool AgentAdapter::IsEgoAgent() const
 void AgentAdapter::UpdateCollision(std::pair<ObjectTypeOSI, int> collisionPartner)
 {
     auto findIter = std::find_if(collisionPartners.begin(), collisionPartners.end(),
-                                 [collisionPartner](const std::pair<ObjectTypeOSI, int>& storedCollisionPartner)
-    {
-        return collisionPartner == storedCollisionPartner;
-    });
+                                 [collisionPartner](const std::pair<ObjectTypeOSI, int> &storedCollisionPartner) {
+                                     return collisionPartner == storedCollisionPartner;
+                                 });
     if (findIter == collisionPartners.end())
     {
         collisionPartners.push_back(collisionPartner);
@@ -223,19 +213,18 @@ std::vector<std::string> AgentAdapter::GetRoads(ObjectPoint point) const
     return roadIds;
 }
 
-double AgentAdapter::GetDistanceToConnectorEntrance(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
+units::length::meter_t AgentAdapter::GetDistanceToConnectorEntrance(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
 {
     return world->GetDistanceToConnectorEntrance(/*locateResult.position,*/ intersectingConnectorId, intersectingLaneId, ownConnectorId);
 }
 
-double AgentAdapter::GetDistanceToConnectorDeparture(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
+units::length::meter_t AgentAdapter::GetDistanceToConnectorDeparture(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
 {
     return world->GetDistanceToConnectorDeparture(/*locateResult.position,*/ intersectingConnectorId, intersectingLaneId, ownConnectorId);
 }
 
 LightState AgentAdapter::GetLightState() const
 {
-
     if (GetFlasher())
     {
         return LightState::Flash;
@@ -265,7 +254,7 @@ const GlobalRoadPositions& AgentAdapter::GetRoadPosition(const ObjectPoint& poin
     return newElement->second;
 }
 
-double AgentAdapter::GetLongitudinal(const ObjectPoint &objectPoint) const
+units::length::meter_t AgentAdapter::GetLongitudinal(const ObjectPoint &objectPoint) const
 {
     if (std::holds_alternative<ObjectPointCustom>(objectPoint))
     {
@@ -276,7 +265,7 @@ double AgentAdapter::GetLongitudinal(const ObjectPoint &objectPoint) const
         switch (std::get<ObjectPointPredefined>(objectPoint))
         {
         case ObjectPointPredefined::Reference:
-            return 0;
+            return 0_m;
         case ObjectPointPredefined::Center:
             return GetDistanceReferencePointToLeadingEdge() - 0.5 * GetLength();
         case ObjectPointPredefined::FrontCenter:
@@ -300,7 +289,7 @@ double AgentAdapter::GetLongitudinal(const ObjectPoint &objectPoint) const
     }
 }
 
-double AgentAdapter::GetLateral(const ObjectPoint &objectPoint) const
+units::length::meter_t AgentAdapter::GetLateral(const ObjectPoint &objectPoint) const
 {
     if (std::holds_alternative<ObjectPointCustom>(objectPoint))
     {
@@ -314,7 +303,7 @@ double AgentAdapter::GetLateral(const ObjectPoint &objectPoint) const
         case ObjectPointPredefined::Center:
         case ObjectPointPredefined::FrontCenter:
         case ObjectPointPredefined::RearCenter:
-            return 0;
+            return 0_m;
         case ObjectPointPredefined::FrontLeft:
         case ObjectPointPredefined::RearLeft:
             return 0.5 * GetWidth();
@@ -334,13 +323,13 @@ double AgentAdapter::GetLateral(const ObjectPoint &objectPoint) const
     }
 }
 
-Common::Vector2d AgentAdapter::GetAbsolutePosition(const ObjectPoint &objectPoint) const
+Common::Vector2d<units::length::meter_t> AgentAdapter::GetAbsolutePosition(const ObjectPoint &objectPoint) const
 {
-    double longitudinal = GetLongitudinal(objectPoint);
-    double lateral = GetLateral(objectPoint);
+    auto longitudinal = GetLongitudinal(objectPoint);
+    auto lateral = GetLateral(objectPoint);
     const auto& referencePoint = baseTrafficObject.GetReferencePointPosition();
     const auto& yaw = baseTrafficObject.GetAbsOrientation().yaw;
-    double x = referencePoint.x + std::cos(yaw) * longitudinal - std::sin(yaw) * lateral;
-    double y = referencePoint.y + std::sin(yaw) * longitudinal + std::cos(yaw) * lateral;
+    auto x = referencePoint.x + units::math::cos(yaw) * longitudinal - units::math::sin(yaw) * lateral;
+    auto y = referencePoint.y + units::math::sin(yaw) * longitudinal + units::math::cos(yaw) * lateral;
     return {x,y};
 }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.h b/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.h
index cfd72d2fe5294e40831c740c0ce93459cd10e578..1d7f7bfcb1553b95b9febd02554a7b8a3689afc7 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.h
@@ -20,19 +20,20 @@
 
 #pragma once
 
-#include <QtGlobal>
 #include <functional>
 
-#include "include/agentInterface.h"
-#include "include/callbackInterface.h"
-#include "include/trafficObjectInterface.h"
-#include "include/worldInterface.h"
-#include "include/stochasticsInterface.h"
-#include "egoAgent.h"
+#include <QtGlobal>
+
 #include "Localization.h"
 #include "WorldData.h"
 #include "WorldDataQuery.h"
 #include "WorldObjectAdapter.h"
+#include "egoAgent.h"
+#include "include/agentInterface.h"
+#include "include/callbackInterface.h"
+#include "include/stochasticsInterface.h"
+#include "include/trafficObjectInterface.h"
+#include "include/worldInterface.h"
 
 constexpr double zeroBaseline = 1e-9;
 
@@ -45,14 +46,14 @@ class AgentAdapter final : public WorldObjectAdapter, public AgentInterface
 public:
     const std::string MODULENAME = "AGENTADAPTER";
 
-    AgentAdapter(OWL::Interfaces::MovingObject& mo,
-                 WorldInterface* world,
-                 const CallbackInterface* callbacks,
-                 const World::Localization::Localizer& localizer);
+    AgentAdapter(OWL::Interfaces::MovingObject &mo,
+                 WorldInterface *world,
+                 const CallbackInterface *callbacks,
+                 const World::Localization::Localizer &localizer);
 
     ~AgentAdapter() override;
 
-    void InitParameter(const AgentBlueprintInterface& agentBlueprint) override;
+    void InitParameter(const AgentBuildInstructions &agentBuildInstructions) override;
 
     ObjectTypeOSI GetType() const override
     {
@@ -61,10 +62,11 @@ public:
 
     int GetId() const override
     {
-        return static_cast<int>(GetBaseTrafficObject().GetId());;
+        return static_cast<int>(GetBaseTrafficObject().GetId());
+        ;
     }
 
-    EgoAgentInterface& GetEgoAgent() override
+    EgoAgentInterface &GetEgoAgent() override
     {
         return egoAgent;
     }
@@ -84,17 +86,17 @@ public:
         return driverProfileName;
     }
 
-    double GetSpeedGoalMin() const override
+    units::velocity::meters_per_second_t GetSpeedGoalMin() const override
     {
         return speedGoalMin;
     }
 
-    double GetEngineSpeed() const override
+    units::angular_velocity::revolutions_per_minute_t GetEngineSpeed() const override
     {
         return engineSpeed;
     }
 
-    double GetDistanceReferencePointToLeadingEdge() const override
+    units::length::meter_t GetDistanceReferencePointToLeadingEdge() const override
     {
         return GetBaseTrafficObject().GetDistanceReferencePointToLeadingEdge();
     }
@@ -114,17 +116,17 @@ public:
         return brakePedal;
     }
 
-    double GetSteeringWheelAngle() const override
+    units::angle::radian_t GetSteeringWheelAngle() const override
     {
         return steeringWheelAngle;
     }
 
-    double GetMaxAcceleration() const override
+    units::acceleration::meters_per_second_squared_t GetMaxAcceleration() const override
     {
         return maxAcceleration;
     }
 
-    double GetMaxDeceleration() const override
+    units::acceleration::meters_per_second_squared_t GetMaxDeceleration() const override
     {
         return maxDeceleration;
     }
@@ -152,7 +154,7 @@ public:
         return locateResult.touchedRoads;
     }
 
-    Common::Vector2d GetAbsolutePosition(const ObjectPoint& objectPoint) const override;
+    Common::Vector2d<units::length::meter_t> GetAbsolutePosition(const ObjectPoint& objectPoint) const override;
 
     const GlobalRoadPositions& GetRoadPosition(const ObjectPoint& point) const override;
 
@@ -168,95 +170,98 @@ public:
         return postCrashVelocity;
     }
 
-    VehicleModelParameters GetVehicleModelParameters() const override
+    std::shared_ptr<const mantle_api::EntityProperties> GetVehicleModelParameters() const override
     {
         return vehicleModelParameters;
     }
 
+    units::length::meter_t GetWheelbase() const override
+    {
+        if (std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(vehicleModelParameters) != nullptr)
+        {
+            auto vehicleProperties = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(vehicleModelParameters);
+            return vehicleProperties->front_axle.bb_center_to_axle_center.x - vehicleProperties->rear_axle.bb_center_to_axle_center.x;
+        }
+        else
+        {
+            // TODO CK Clarify what to do in case of pedestrians or static objects
+            return vehicleModelParameters->bounding_box.dimension.length;
+        }
+    }
+
     void SetPostCrashVelocity(PostCrashVelocity postCrashVelocity) override
     {
         this->postCrashVelocity = postCrashVelocity;
     }
 
-    void SetPositionX(double value) override
+    void SetPositionX(units::length::meter_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             GetBaseTrafficObject().SetX(value);
         });
     }
 
-    void SetPositionY(double value) override
+    void SetPositionY(units::length::meter_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             GetBaseTrafficObject().SetY(value);
         });
     }
 
-
-    void SetVelocity(double velocity) override
+    void SetVelocity(units::velocity::meters_per_second_t velocity) override
     {
-        world->QueueAgentUpdate([this, velocity]()
-        {
+        world->QueueAgentUpdate([this, velocity]() {
             GetBaseTrafficObject().SetAbsVelocity(velocity);
         });
     }
 
-    void SetVelocityVector(double vx, double vy, double vz) override
+    void SetVelocityVector(const mantle_api::Vec3<units::velocity::meters_per_second_t> &velocity) override
     {
-        world->QueueAgentUpdate([this, vx, vy, vz]()
-        {
-            OWL::Primitive::AbsVelocity velocity{vx, vy, vz};
+        world->QueueAgentUpdate([this, velocity]() {
             GetBaseTrafficObject().SetAbsVelocity(velocity);
         });
     }
 
-    void SetAcceleration(double value) override
+    void SetAcceleration(units::acceleration::meters_per_second_squared_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             GetBaseTrafficObject().SetAbsAcceleration(value);
         });
     }
 
-    void SetYaw(double value) override
+    void SetYaw(units::angle::radian_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             UpdateYaw(value);
         });
     }
 
-    void SetRoll(double value) override
+    void SetRoll(units::angle::radian_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             UpdateRoll(value);
         });
     }
 
-    void SetYawRate(double value) override
+    void SetYawRate(units::angular_velocity::radians_per_second_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
-            OWL::Primitive::AbsOrientationRate orientationRate = GetBaseTrafficObject().GetAbsOrientationRate();
-            orientationRate.yawRate = value;
+        world->QueueAgentUpdate([this, value]() {
+            auto orientationRate = GetBaseTrafficObject().GetAbsOrientationRate();
+            orientationRate.yaw = value;
             GetBaseTrafficObject().SetAbsOrientationRate(orientationRate);
         });
     }
 
-    void SetYawAcceleration(double value) override
+    void SetYawAcceleration(units::angular_acceleration::radians_per_second_squared_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             OWL::Primitive::AbsOrientationAcceleration orientationAcceleration = GetBaseTrafficObject().GetAbsOrientationAcceleration();
             orientationAcceleration.yawAcceleration = value;
             GetBaseTrafficObject().SetAbsOrientationAcceleration(orientationAcceleration);
         });
     }
 
-    void SetCentripetalAcceleration(double value) override
+    void SetCentripetalAcceleration(units::acceleration::meters_per_second_squared_t value) override
     {
         world->QueueAgentUpdate([this, value]() {
             centripetalAcceleration = value;
@@ -265,7 +270,7 @@ public:
             // OWL::Primitive::AbsAcceleration absAcceleration = GetBaseTrafficObject().GetAbsAcceleration();
             // OWL::Primitive::AbsOrientation absOrientation = GetBaseTrafficObject().GetAbsOrientation();
 
-            // Common::Vector2d vec(absAcceleration.ax, absAcceleration.ay);
+            // Common::Vector2d<units::velocity::meters_per_second_t vec(absAcceleration.ax, absAcceleration.ay);
 
             // // Rotate reference frame from groundTruth to car and back
             // vec.Rotate(-absOrientation.yaw);
@@ -279,7 +284,7 @@ public:
         });
     }
 
-    void SetTangentialAcceleration(double value) override
+    void SetTangentialAcceleration(units::acceleration::meters_per_second_squared_t value) override
     {
         world->QueueAgentUpdate([this, value]() {
             tangentialAcceleration = value;
@@ -288,7 +293,7 @@ public:
             // OWL::Primitive::AbsAcceleration absAcceleration = GetBaseTrafficObject().GetAbsAcceleration();
             // OWL::Primitive::AbsOrientation absOrientation = GetBaseTrafficObject().GetAbsOrientation();
 
-            // Common::Vector2d vec(absAcceleration.ax, absAcceleration.ay);
+            // Common::Vector2d<units::velocity::meters_per_second_t vec(absAcceleration.ax, absAcceleration.ay);
 
             // // Rotate reference frame from groundTruth to car and back
             // vec.Rotate(-absOrientation.yaw);
@@ -302,93 +307,85 @@ public:
         });
     }
 
-    void SetWheelsRotationRateAndOrientation(double _steeringWheelAngle, double velocity, double acceleration) override
+    void SetWheelsRotationRateAndOrientation(units::angle::radian_t steeringWheelAngle, units::velocity::meters_per_second_t velocity, units::acceleration::meters_per_second_squared_t acceleration) override
     {
-        if(vehicleModelParameters.vehicleType == AgentVehicleType::Pedestrian)
+        //TODO Move this to Dynamics Modules
+        if(vehicleModelParameters->type == mantle_api::EntityType::kPedestrian)
             return;
 
         auto dTime = (velocity - previousVelocity) / acceleration;
         previousVelocity = velocity;
-        auto wheelRadiusFront = vehicleModelParameters.frontAxle.wheelDiameter / 2.0;
-        auto wheelRadiusRear = vehicleModelParameters.rearAxle.wheelDiameter / 2.0;
+        auto wheelRadiusFront = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(vehicleModelParameters)->front_axle.wheel_diameter / 2.0;
+        auto wheelRadiusRear = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(vehicleModelParameters)->rear_axle.wheel_diameter / 2.0;
         try {
-            auto steeringToWheelYawRatio = vehicleModelParameters.properties.at("SteeringRatio");
+            auto steeringToWheelYawRatio = std::stod(std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(vehicleModelParameters)->properties.at("SteeringRatio"));
             GetBaseTrafficObject().SetWheelsRotationRateAndOrientation(velocity, wheelRadiusFront, wheelRadiusRear, dTime);
-            GetBaseTrafficObject().SetFrontAxleSteeringYaw(_steeringWheelAngle * steeringToWheelYawRatio);
+            GetBaseTrafficObject().SetFrontAxleSteeringYaw(steeringWheelAngle * steeringToWheelYawRatio);
         } catch (const std::out_of_range& e)
         {
             Log(CbkLogLevel::Error, __FILE__, __LINE__, "Agent does not have SteeringRatio");
         }
     }
 
-    void SetDistanceTraveled(double value) override
+    void SetDistanceTraveled(units::length::meter_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             distanceTraveled = value;
         });
     }
 
-    void SetVehicleModelParameter(const VehicleModelParameters& parameter) override
+    void SetVehicleModelParameter(const std::shared_ptr<const mantle_api::EntityProperties> parameter) override
     {
-        world->QueueAgentUpdate([this, parameter]()
-        {
-            UpdateVehicleModelParameter(parameter);
+        world->QueueAgentUpdate([this, parameter]() {
+            UpdateEntityModelParameter(parameter);
         });
     }
 
-    void SetMaxAcceleration(double value) override
+    void SetMaxAcceleration(units::acceleration::meters_per_second_squared_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             maxAcceleration = value;
         });
     }
 
-    void SetEngineSpeed(double value) override
+    void SetEngineSpeed(units::angular_velocity::revolutions_per_minute_t value) override
     {
-        world->QueueAgentUpdate([this, value]()
-        {
+        world->QueueAgentUpdate([this, value]() {
             engineSpeed = value;
         });
     }
 
-    void SetMaxDeceleration(double maxDeceleration) override
+    void SetMaxDeceleration(units::acceleration::meters_per_second_squared_t maxDeceleration) override
     {
-        world->QueueAgentUpdate([this, maxDeceleration]()
-        {
+        world->QueueAgentUpdate([this, maxDeceleration]() {
             this->maxDeceleration = maxDeceleration;
         });
     }
 
     void SetGear(int gear) override
     {
-        world->QueueAgentUpdate([this, gear]()
-        {
+        world->QueueAgentUpdate([this, gear]() {
             currentGear = gear;
         });
     }
 
     void SetEffAccelPedal(double percent) override
     {
-        world->QueueAgentUpdate([this, percent]()
-        {
+        world->QueueAgentUpdate([this, percent]() {
             accelPedal = percent;
         });
     }
 
     void SetEffBrakePedal(double percent) override
     {
-        world->QueueAgentUpdate([this, percent]()
-        {
+        world->QueueAgentUpdate([this, percent]() {
             brakePedal = percent;
         });
     }
 
-    void SetSteeringWheelAngle(double steeringWheelAngle) override
+    void SetSteeringWheelAngle(units::angle::radian_t steeringWheelAngle) override
     {
-        world->QueueAgentUpdate([this, steeringWheelAngle]()
-        {
+        world->QueueAgentUpdate([this, steeringWheelAngle]() {
             this->steeringWheelAngle = steeringWheelAngle;
             GetBaseTrafficObject().SetSteeringWheelAngle(steeringWheelAngle);
         });
@@ -396,47 +393,43 @@ public:
 
     void SetHeadLight(bool headLight) override
     {
-        world->QueueAgentUpdate([this, headLight]()
-        {
+        world->QueueAgentUpdate([this, headLight]() {
             GetBaseTrafficObject().SetHeadLight(headLight);
         });
     }
 
     void SetHighBeamLight(bool highBeam) override
     {
-        world->QueueAgentUpdate([this, highBeam]()
-        {
+        world->QueueAgentUpdate([this, highBeam]() {
             GetBaseTrafficObject().SetHighBeamLight(highBeam);
         });
     }
 
     void SetHorn(bool horn) override
     {
-        world->QueueAgentUpdate([this, horn]()
-        {
+        world->QueueAgentUpdate([this, horn]() {
             hornSwitch = horn;
         });
     }
 
     void SetFlasher(bool flasher) override
     {
-        world->QueueAgentUpdate([this, flasher]()
-        {
+        world->QueueAgentUpdate([this, flasher]() {
             flasherSwitch = flasher;
         });
     }
 
-    double GetYawRate() const override
+    units::angular_velocity::radians_per_second_t GetYawRate() const override
     {
-        return GetBaseTrafficObject().GetAbsOrientationRate().yawRate;
+        return GetBaseTrafficObject().GetAbsOrientationRate().yaw;
     }
 
-    double GetYawAcceleration() const override
+    units::angular_acceleration::radians_per_second_squared_t GetYawAcceleration() const override
     {
         return GetBaseTrafficObject().GetAbsOrientationAcceleration().yawAcceleration;
     }
 
-    double GetCentripetalAcceleration() const override
+    units::acceleration::meters_per_second_squared_t GetCentripetalAcceleration() const override
     {
         return centripetalAcceleration;
 
@@ -444,7 +437,7 @@ public:
         // OWL::Primitive::AbsAcceleration absAcceleration = GetBaseTrafficObject().GetAbsAcceleration();
         // OWL::Primitive::AbsOrientation absOrientation = GetBaseTrafficObject().GetAbsOrientation();
 
-        // Common::Vector2d vec(absAcceleration.ax, absAcceleration.ay);
+        // Common::Vector2d<units::velocity::meters_per_second_t vec(absAcceleration.ax, absAcceleration.ay);
 
         // // Rotate reference frame from groundTruth to car
         // vec.Rotate(-absOrientation.yaw);
@@ -452,7 +445,7 @@ public:
         // return vec.y;
     }
 
-    double GetTangentialAcceleration() const override
+    units::acceleration::meters_per_second_squared_t GetTangentialAcceleration() const override
     {
         return tangentialAcceleration;
 
@@ -460,7 +453,7 @@ public:
         // OWL::Primitive::AbsAcceleration absAcceleration = GetBaseTrafficObject().GetAbsAcceleration();
         // OWL::Primitive::AbsOrientation absOrientation = GetBaseTrafficObject().GetAbsOrientation();
 
-        // Common::Vector2d vec(absAcceleration.ax, absAcceleration.ay);
+        // Common::Vector2d<units::velocity::meters_per_second_t vec(absAcceleration.ax, absAcceleration.ay);
 
         // // Rotate reference frame from groundTruth to car
         // vec.Rotate(-absOrientation.yaw);
@@ -492,21 +485,21 @@ public:
 
     void SetPosition(Position pos) override;
 
-    double  GetDistanceTraveled() const override
+    units::length::meter_t GetDistanceTraveled() const override
     {
         return distanceTraveled;
     }
 
     bool IsEgoAgent() const override;
 
-    bool OnRoad(const OWL::Interfaces::Road& road) const;
-    bool OnLane(const OWL::Interfaces::Lane& lane) const;
+    bool OnRoad(const OWL::Interfaces::Road &road) const;
+    bool OnLane(const OWL::Interfaces::Lane &lane) const;
 
-    Common::Vector2d GetVelocity(ObjectPoint point = ObjectPointPredefined::Reference) const override;
+    Common::Vector2d<units::velocity::meters_per_second_t> GetVelocity(ObjectPoint point = ObjectPointPredefined::Reference) const override;
 
-    Common::Vector2d GetAcceleration(ObjectPoint point = ObjectPointPredefined::Reference) const override;
+    Common::Vector2d<units::acceleration::meters_per_second_squared_t> GetAcceleration(ObjectPoint point = ObjectPointPredefined::Reference) const override;
 
-    virtual const openpass::sensors::Parameters& GetSensorParameters() const override
+    virtual const openpass::sensors::Parameters &GetSensorParameters() const override
 
     {
         return sensorParameters;
@@ -517,9 +510,9 @@ public:
         this->sensorParameters = sensorParameters;
     }
 
-    virtual double GetDistanceToConnectorEntrance(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override;
+    virtual units::length::meter_t GetDistanceToConnectorEntrance(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override;
 
-    virtual double GetDistanceToConnectorDeparture(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override;
+    virtual units::length::meter_t GetDistanceToConnectorDeparture(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override;
 
 protected:
     //-----------------------------------------------------------------------------
@@ -531,9 +524,9 @@ protected:
     //! @param[in]     message     Message to log
     //-----------------------------------------------------------------------------
     void Log(CbkLogLevel logLevel,
-             const char* file,
+             const char *file,
              int line,
-             const std::string& message) const
+             const std::string &message) const
     {
         if (callbacks)
         {
@@ -545,94 +538,110 @@ protected:
     }
 
 private:
-    WorldInterface* world;
-    const CallbackInterface* callbacks;
-    const World::Localization::Localizer& localizer;
+    WorldInterface *world;
+    const CallbackInterface *callbacks;
+    const World::Localization::Localizer &localizer;
     EgoAgent egoAgent;
 
-    OWL::Interfaces::MovingObject& GetBaseTrafficObject()
+    OWL::Interfaces::MovingObject &GetBaseTrafficObject()
     {
-        return *(static_cast<OWL::Interfaces::MovingObject*>(&baseTrafficObject));
+        return *(static_cast<OWL::Interfaces::MovingObject *>(&baseTrafficObject));
     }
 
-    OWL::Interfaces::MovingObject& GetBaseTrafficObject() const
+    OWL::Interfaces::MovingObject &GetBaseTrafficObject() const
     {
-        return *(static_cast<OWL::Interfaces::MovingObject*>(&baseTrafficObject));
+        return *(static_cast<OWL::Interfaces::MovingObject *>(&baseTrafficObject));
     }
 
-    void UpdateVehicleModelParameter(const VehicleModelParameters& parameters)
+    void UpdateEntityModelParameter(const std::shared_ptr<const mantle_api::EntityProperties> properties)
     {
-        OWL::Primitive::Dimension dimension;
-        dimension.width = parameters.boundingBoxDimensions.width;
-        dimension.length = parameters.boundingBoxDimensions.length;
-        dimension.height = parameters.boundingBoxDimensions.height;
+        mantle_api::Dimension3 dimension;
+        dimension.width = properties->bounding_box.dimension.width;
+        dimension.length = properties->bounding_box.dimension.length;
+        dimension.height = properties->bounding_box.dimension.height;
 
         GetBaseTrafficObject().SetDimension(dimension);
-        GetBaseTrafficObject().SetBoundingBoxCenterToRear(parameters.rearAxle.positionX - parameters.boundingBoxCenter.x, 0.0f, parameters.rearAxle.positionZ - parameters.boundingBoxCenter.z);
-        GetBaseTrafficObject().SetBoundingBoxCenterToFront(parameters.frontAxle.positionX - parameters.boundingBoxCenter.x, 0.0f, parameters.frontAxle.positionZ - parameters.boundingBoxCenter.z);
-        GetBaseTrafficObject().SetType(parameters.vehicleType);
+        GetBaseTrafficObject().SetType(properties->type);
 
-        vehicleModelParameters = parameters;
+        if (properties->type == mantle_api::EntityType::kVehicle)
+        {
+            auto vehicleProperties = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(properties);
+            GetBaseTrafficObject().SetBoundingBoxCenterToRear(vehicleProperties->rear_axle.bb_center_to_axle_center.x - properties->bounding_box.geometric_center.x,
+                                                                0.0_m,
+                                                                vehicleProperties->rear_axle.bb_center_to_axle_center.z - properties->bounding_box.geometric_center.z);
+            GetBaseTrafficObject().SetBoundingBoxCenterToFront(vehicleProperties->front_axle.bb_center_to_axle_center.x - properties->bounding_box.geometric_center.x,
+                                                                0.0_m,
+                                                                vehicleProperties->front_axle.bb_center_to_axle_center.z - properties->bounding_box.geometric_center.z);
+            GetBaseTrafficObject().SetVehicleClassification(vehicleProperties->classification);
+        }
+        else
+        {
+            GetBaseTrafficObject().SetBoundingBoxCenterToRear(-properties->bounding_box.geometric_center.x,
+                                                                0.0_m,
+                                                                -properties->bounding_box.geometric_center.z);
 
-        GenerateWheels(parameters);
+        }
+        GenerateWheels(properties);
+        vehicleModelParameters = properties;
     }
 
-    void GenerateWheels(const VehicleModelParameters& parameters)
+    void GenerateWheels(const std::shared_ptr<const mantle_api::EntityProperties> properties)
     {
-        if(parameters.vehicleType == AgentVehicleType::Pedestrian)
+        if (properties->type == mantle_api::EntityType::kPedestrian)
         {
             return;
         }
 
-
-        std::vector<VehicleModelParameters::Axle> axles {parameters.frontAxle, parameters.rearAxle};
-        for(int axle = 0; axle < 2; axle++)
+        auto vehicleProperties = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(properties);
+        std::vector<mantle_api::Axle> axles{vehicleProperties->front_axle, vehicleProperties->rear_axle};
+        for (int axle = 0; axle < 2; axle++)
         {
             OWL::WheelData newWheel;
             newWheel.axle = axle;
-            newWheel.wheelRadius = axles[axle].wheelDiameter / 2.0;
-            newWheel.rim_radius = std::numeric_limits<double>::signaling_NaN();
-            newWheel.width = std::numeric_limits<double>::signaling_NaN();
-            newWheel.rotation_rate = std::numeric_limits<double>::signaling_NaN();
+            newWheel.wheelRadius = axles[axle].wheel_diameter / 2.0;
+            newWheel.rim_radius = units::length::meter_t(std::numeric_limits<double>::signaling_NaN());
+            newWheel.width = units::length::meter_t(std::numeric_limits<double>::signaling_NaN());
+            newWheel.rotation_rate = units::angular_velocity::revolutions_per_minute_t(std::numeric_limits<double>::signaling_NaN());
 
             //Assuming that the center of the wheels are located at the axles
-            newWheel.position.x = axle == 0 ?
-                                  (parameters.frontAxle.positionX - parameters.boundingBoxCenter.x) :
-                                  (parameters.rearAxle.positionX - parameters.boundingBoxCenter.x);
+            newWheel.position.x = axle == 0 ? (vehicleProperties->front_axle.bb_center_to_axle_center.x - properties->bounding_box.geometric_center.x) : (vehicleProperties->rear_axle.bb_center_to_axle_center.x - properties->bounding_box.geometric_center.x);
 
-            newWheel.position.z = axle == 0 ?
-                                  (parameters.frontAxle.positionZ - parameters.boundingBoxCenter.z) :
-                                  (parameters.rearAxle.positionZ - parameters.boundingBoxCenter.z);
+            newWheel.position.z = axle == 0 ? (vehicleProperties->front_axle.bb_center_to_axle_center.z - properties->bounding_box.geometric_center.z) : (vehicleProperties->rear_axle.bb_center_to_axle_center.z - properties->bounding_box.geometric_center.z);
 
-            if(parameters.vehicleType == AgentVehicleType::Car || parameters.vehicleType == AgentVehicleType::Truck)
+            if (properties->type == mantle_api::EntityType::kVehicle)
             {
-                newWheel.position.y = - parameters.frontAxle.trackWidth / 2.0f - parameters.boundingBoxCenter.y; //assume that the wheels are at the end of the axle
-                newWheel.index = 0;
-                GetBaseTrafficObject().AddWheel(newWheel);
-                newWheel.position.y = parameters.frontAxle.trackWidth / 2.0f - parameters.boundingBoxCenter.y; //assume that the wheels are at the end of the axle
-                newWheel.index = 1;
-                GetBaseTrafficObject().AddWheel(newWheel);
-            }
-            else if (parameters.vehicleType == AgentVehicleType::Bicycle || parameters.vehicleType == AgentVehicleType::Motorbike)
-            {
-                //assuming that the positionY is in the middle of the two wheel vehicle
-                newWheel.position.y = 0.0;
-                newWheel.index = 0;
-                GetBaseTrafficObject().AddWheel(newWheel);
+                if (vehicleProperties->classification == mantle_api::VehicleClass::kMedium_car)
+                {
+                    newWheel.position.y = -vehicleProperties->front_axle.track_width / 2.0f - properties->bounding_box.geometric_center.y; //assume that the wheels are at the end of the axle
+                    newWheel.index = 0;
+                    GetBaseTrafficObject().AddWheel(newWheel);
+                    newWheel.position.y = vehicleProperties->front_axle.track_width / 2.0f - properties->bounding_box.geometric_center.y; //assume that the wheels are at the end of the axle
+                    newWheel.index = 1;
+                    GetBaseTrafficObject().AddWheel(newWheel);
+                }
+                else if (vehicleProperties->classification == mantle_api::VehicleClass::kBicycle || vehicleProperties->classification == mantle_api::VehicleClass::kMotorbike)
+                {
+                    //assuming that the positionY is in the middle of the two wheel vehicle
+                    newWheel.position.y = 0.0_m;
+                    newWheel.index = 0;
+                    GetBaseTrafficObject().AddWheel(newWheel);
+                }
             }
         }
+
+        vehicleModelParameters = properties;
     }
 
-    void UpdateYaw(double yawAngle)
+    void UpdateYaw(units::angle::radian_t yawAngle)
     {
-        OWL::Primitive::AbsOrientation orientation = baseTrafficObject.GetAbsOrientation();
+        auto orientation = baseTrafficObject.GetAbsOrientation();
         orientation.yaw = yawAngle;
         GetBaseTrafficObject().SetAbsOrientation(orientation);
     }
 
-    void UpdateRoll(double rollAngle)
+    void UpdateRoll(units::angle::radian_t rollAngle)
     {
-        OWL::Primitive::AbsOrientation orientation = baseTrafficObject.GetAbsOrientation();
+        auto orientation = baseTrafficObject.GetAbsOrientation();
         orientation.roll = rollAngle;
         GetBaseTrafficObject().SetAbsOrientation(orientation);
     }
@@ -648,41 +657,42 @@ private:
     void UpdateEgoVehicle();
 
     //! Returns the longitudinal position of the ObjectPoint (must not be of type ObjectPointRelative)
-    double GetLongitudinal(const ObjectPoint &objectPoint) const;
+    units::length::meter_t GetLongitudinal(const ObjectPoint &objectPoint) const;
 
     //! Returns the lateral position of the ObjectPoint (must not be of type ObjectPointRelative)
-    double GetLateral(const ObjectPoint &objectPoint) const;
+    units::length::meter_t GetLateral(const ObjectPoint &objectPoint) const;
 
     struct LaneObjParameters
     {
-        double distance;
-        double relAngle;
-        double latPosition;
-        Common::Vector2d upperLeftCoord;
-        Common::Vector2d upperRightCoord;
-        Common::Vector2d lowerLeftCoord;
-        Common::Vector2d lowerRightCoord;
+        units::length::meter_t distance;
+        units::angle::radian_t relAngle;
+        units::length::meter_t latPosition;
+        Common::Vector2d<units::length::meter_t> upperLeftCoord;
+        Common::Vector2d<units::length::meter_t> upperRightCoord;
+        Common::Vector2d<units::length::meter_t> lowerLeftCoord;
+        Common::Vector2d<units::length::meter_t> lowerRightCoord;
     };
 
     bool hornSwitch = false;
     bool flasherSwitch = false;
     int currentGear = 0;
-    double maxAcceleration = 0.0;
-    double maxDeceleration = 0.0;
+    units::acceleration::meters_per_second_squared_t maxAcceleration{0.0};
+    units::acceleration::meters_per_second_squared_t maxDeceleration{0.0};
     double accelPedal = 0.;
     double brakePedal = 0.;
-    double steeringWheelAngle = 0.0;
-    double centripetalAcceleration = 0.0;
-    double tangentialAcceleration = 0.0;
-    double engineSpeed = 0.;
-    double distanceTraveled = 0.0;
-    double previousVelocity = 0.0;
+    units::angle::radian_t steeringWheelAngle{0.0};
+    units::acceleration::meters_per_second_squared_t centripetalAcceleration{0.0};
+    units::acceleration::meters_per_second_squared_t tangentialAcceleration{0.0};
+    units::angular_acceleration::radians_per_second_squared_t yawAcceleration{0.0};
+    units::angular_velocity::revolutions_per_minute_t engineSpeed{0.0};
+    units::length::meter_t distanceTraveled{0.0};
+    units::velocity::meters_per_second_t previousVelocity{0.0};
 
     mutable World::Localization::Result locateResult;
     mutable std::vector<GlobalRoadPosition> boundaryPoints;
 
     std::vector<std::pair<ObjectTypeOSI, int>> collisionPartners;
-    PostCrashVelocity postCrashVelocity {};
+    PostCrashVelocity postCrashVelocity{};
     bool isValid = true;
 
     AgentCategory agentCategory;
@@ -690,9 +700,9 @@ private:
     std::string vehicleModelType;
     std::string driverProfileName;
     std::string objectName;
-    VehicleModelParameters vehicleModelParameters;
+    std::shared_ptr<const mantle_api::EntityProperties> vehicleModelParameters;
 
-    double speedGoalMin;
+    units::velocity::meters_per_second_t speedGoalMin;
 
     bool completlyInWorld = false;
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/AgentNetwork.cpp b/sim/src/core/opSimulation/modules/World_OSI/AgentNetwork.cpp
index b7df1a186f4f04254b25da7899089c39ed534f00..e815ce5a5d225679a2525e03254c9f6ad056a845 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/AgentNetwork.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/AgentNetwork.cpp
@@ -97,21 +97,21 @@ void AgentNetwork::PublishGlobalData(Publisher publish)
     {
         const openpass::type::EntityId agentId = agent.GetId();
 
-        publish(agentId, "XPosition", agent.GetPositionX());
-        publish(agentId, "YPosition", agent.GetPositionY());
-        publish(agentId, "VelocityEgo", agent.GetVelocity().Length());
-        publish(agentId, "AccelerationEgo", agent.GetAcceleration().Projection(agent.GetYaw()));
-        publish(agentId, "YawAngle", agent.GetYaw());
-        publish(agentId, "RollAngle", agent.GetRoll());
-        publish(agentId, "YawRate", agent.GetYawRate());
-        publish(agentId, "SteeringAngle", agent.GetSteeringWheelAngle());
-        publish(agentId, "TotalDistanceTraveled", agent.GetDistanceTraveled());
+        publish(agentId, "XPosition", agent.GetPositionX().value());
+        publish(agentId, "YPosition", agent.GetPositionY().value());
+        publish(agentId, "VelocityEgo", agent.GetVelocity().Length().value());
+        publish(agentId, "AccelerationEgo", agent.GetAcceleration().Projection(agent.GetYaw()).value());
+        publish(agentId, "YawAngle", agent.GetYaw().value());
+        publish(agentId, "RollAngle", agent.GetRoll().value());
+        publish(agentId, "YawRate", agent.GetYawRate().value());
+        publish(agentId, "SteeringAngle", agent.GetSteeringWheelAngle().value());
+        publish(agentId, "TotalDistanceTraveled", agent.GetDistanceTraveled().value());
 
         const auto &egoAgent = agent.GetEgoAgent();
         if (egoAgent.HasValidRoute())
         {
-            publish(agentId, "PositionRoute", egoAgent.GetMainLocatePosition().value().roadPosition.s);
-            publish(agentId, "TCoordinate", egoAgent.GetPositionLateral());
+            publish(agentId, "PositionRoute", egoAgent.GetMainLocatePosition().value().roadPosition.s.value());
+            publish(agentId, "TCoordinate", egoAgent.GetPositionLateral().value());
             publish(agentId, "Lane", egoAgent.GetMainLocatePosition().value().laneId);
             publish(agentId, "Road", egoAgent.GetRoadId());
             publish(agentId, "SecondaryLanes", agent.GetTouchedRoads().at(egoAgent.GetRoadId()).lanes);
diff --git a/sim/src/core/opSimulation/modules/World_OSI/GeometryConverter.cpp b/sim/src/core/opSimulation/modules/World_OSI/GeometryConverter.cpp
index 61d69f97ba6b84d491ac2ad00fde9ad6a87f06a9..8792204ec429443f6598ec140155f19919aa8396 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/GeometryConverter.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/GeometryConverter.cpp
@@ -11,41 +11,43 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-#include "common/opMath.h"
+#include "GeometryConverter.h"
+
 #include <algorithm>
-#include <utility>
-#include <limits>
 #include <cassert>
+#include <deque>
 #include <iostream>
-#include <string>
+#include <limits>
 #include <memory>
+#include <string>
+#include <utility>
+
 #include <QFile>
-#include <deque>
 
-#include "GeometryConverter.h"
 #include "RamerDouglasPeucker.h"
+#include "WorldData.h"
 #include "WorldToRoadCoordinateConverter.h"
+#include "common/opMath.h"
 #include "common/vector2d.h"
-#include "WorldData.h"
 
-void GeometryConverter::CalculateRoads(const SceneryInterface& scenery,
-                                       OWL::Interfaces::WorldData& worldData)
+void GeometryConverter::CalculateRoads(const SceneryInterface &scenery,
+                                       OWL::Interfaces::WorldData &worldData)
 {
-    for(auto [roadId, road] : scenery.GetRoads())
+    for (auto [roadId, road] : scenery.GetRoads())
     {
-        std::vector<RoadLaneSectionInterface*> roadLaneSections = road->GetLaneSections();
+        std::vector<RoadLaneSectionInterface *> roadLaneSections = road->GetLaneSections();
 
         for (auto roadLaneSectionIt = roadLaneSections.begin();
              roadLaneSectionIt != roadLaneSections.end();
              roadLaneSectionIt++)
         {
-            RoadLaneSectionInterface* roadSection = *roadLaneSectionIt;
-            auto& roadLanes = roadSection->GetLanes();
+            RoadLaneSectionInterface *roadSection = *roadLaneSectionIt;
+            auto &roadLanes = roadSection->GetLanes();
 
-            if(!roadLanes.empty())
+            if (!roadLanes.empty())
             {
-                double roadSectionStart = roadSection->GetStart();
-                double roadSectionEnd = std::numeric_limits<double>::max();
+                units::length::meter_t roadSectionStart = roadSection->GetStart();
+                units::length::meter_t roadSectionEnd{std::numeric_limits<double>::max()};
 
                 if (std::next(roadLaneSectionIt) != roadLaneSections.end()) // if not a single element in the list
                 {
@@ -63,72 +65,72 @@ void GeometryConverter::CalculateRoads(const SceneryInterface& scenery,
     }
 }
 
-void GeometryConverter::CalculateSection(OWL::Interfaces::WorldData& worldData,
-                                         double roadSectionStart,
-                                         double roadSectionEnd,
-                                         const RoadInterface* road,
+void GeometryConverter::CalculateSection(OWL::Interfaces::WorldData &worldData,
+                                         units::length::meter_t roadSectionStart,
+                                         units::length::meter_t roadSectionEnd,
+                                         const RoadInterface *road,
                                          const RoadLaneSectionInterface *roadSection)
- {
-     double roadMarkStart = 0;
-     SampledGeometry sampledGeometries;
-     bool firstRoadMark{true};
-
-     while (roadMarkStart + roadSectionStart < roadSectionEnd)
-     {
-         double roadMarkEnd = std::numeric_limits<double>::max();
-         for (const auto& roadLane : roadSection->GetLanes())
-         {
-             for (const auto& roadMark : roadLane.second->GetRoadMarks())
-             {
-                 double sOffset = roadMark->GetSOffset();
-                 if (sOffset > roadMarkStart && sOffset < roadMarkEnd)
-                 {
-                     roadMarkEnd = sOffset;
-                 }
-             }
-         }
-
-         auto sampledGeometry = CalculateSectionBetweenRoadMarkChanges(roadSectionStart + roadMarkStart,
-                                                                       std::min(roadSectionStart + roadMarkEnd, roadSectionEnd),
-                                                                       road,
-                                                                       roadSection);
-         if (firstRoadMark)
-         {
-             sampledGeometries = sampledGeometry;
-             firstRoadMark = false;
-         }
-         else
-         {
-             sampledGeometries.Combine(sampledGeometry);
-         }
-
-         roadMarkStart = roadMarkEnd;
-     }
-
-     JointsBuilder jointsBuilder{sampledGeometries};
-
-     jointsBuilder.CalculatePoints()
-                  .CalculateHeadings()
-                  .CalculateCurvatures();
-
-     AddPointsToWorld(worldData, jointsBuilder.GetJoints());
- }
-
-SampledGeometry GeometryConverter::CalculateSectionBetweenRoadMarkChanges(double roadSectionStart,
-                                                                                    double roadSectionEnd,
-                                                                                    const RoadInterface* road,
-                                                                                    const RoadLaneSectionInterface* roadSection)
+{
+    units::length::meter_t roadMarkStart{0};
+    SampledGeometry sampledGeometries;
+    bool firstRoadMark{true};
+
+    while (roadMarkStart + roadSectionStart < roadSectionEnd)
+    {
+        units::length::meter_t roadMarkEnd{std::numeric_limits<double>::max()};
+        for (const auto &roadLane : roadSection->GetLanes())
+        {
+            for (const auto &roadMark : roadLane.second->GetRoadMarks())
+            {
+                const auto sOffset = roadMark->GetSOffset();
+                if (sOffset > roadMarkStart && sOffset < roadMarkEnd)
+                {
+                    roadMarkEnd = sOffset;
+                }
+            }
+        }
+
+        auto sampledGeometry = CalculateSectionBetweenRoadMarkChanges(roadSectionStart + roadMarkStart,
+                                                                      units::math::min(roadSectionStart + roadMarkEnd, roadSectionEnd),
+                                                                      road,
+                                                                      roadSection);
+        if (firstRoadMark)
+        {
+            sampledGeometries = sampledGeometry;
+            firstRoadMark = false;
+        }
+        else
+        {
+            sampledGeometries.Combine(sampledGeometry);
+        }
+
+        roadMarkStart = roadMarkEnd;
+    }
+
+    JointsBuilder jointsBuilder{sampledGeometries};
+
+    jointsBuilder.CalculatePoints()
+        .CalculateHeadings()
+        .CalculateCurvatures();
+
+    AddPointsToWorld(worldData, jointsBuilder.GetJoints());
+}
+
+SampledGeometry GeometryConverter::CalculateSectionBetweenRoadMarkChanges(units::length::meter_t roadSectionStart,
+                                                                          units::length::meter_t roadSectionEnd,
+                                                                          const RoadInterface *road,
+                                                                          const RoadLaneSectionInterface *roadSection)
 {
     SampledGeometry sampledGeometries;
     auto roadGeometries = road->GetGeometries();
     bool firstGeometry{true};
 
-    for(auto roadGeometry = roadGeometries.cbegin(); roadGeometry != roadGeometries.cend(); ++roadGeometry)
+    for (auto roadGeometry = roadGeometries.cbegin(); roadGeometry != roadGeometries.cend(); ++roadGeometry)
     {
         auto next = std::next(roadGeometry);
         //To prevent rounding issues, the length is calculated as difference between the start s of the geometries
-        double roadGeometryLength = (next == roadGeometries.end()) ? (*roadGeometry)->GetLength()
-                                                                : (*next)->GetS() - (*roadGeometry)->GetS();
+        auto roadGeometryLength = (next == roadGeometries.end()) ? (*roadGeometry)->GetLength()
+                                                                 : (*next)->GetS() - (*roadGeometry)->GetS();
         auto sampledGeometry = CalculateGeometry(roadSectionStart,
                                                  roadSectionEnd,
                                                  road,
@@ -152,30 +154,30 @@ SampledGeometry GeometryConverter::CalculateSectionBetweenRoadMarkChanges(double
     return sampledGeometries;
 }
 
-SampledGeometry GeometryConverter::CalculateGeometry(double roadSectionStart,
-                                                     double roadSectionEnd,
-                                                     const RoadInterface* road,
+SampledGeometry GeometryConverter::CalculateGeometry(units::length::meter_t roadSectionStart,
+                                                     units::length::meter_t roadSectionEnd,
+                                                     const RoadInterface *road,
                                                      const RoadLaneSectionInterface *roadSection,
-                                                     const RoadGeometryInterface* roadGeometry,
-                                                     double roadGeometryLength)
+                                                     const RoadGeometryInterface *roadGeometry,
+                                                     units::length::meter_t roadGeometryLength)
 {
     auto roadGeometryStart = roadGeometry->GetS();
     auto roadGeometryEnd = roadGeometryStart + roadGeometryLength;
 
     // if section is not affected by geometry
-    if(roadSectionStart >= roadGeometryEnd ||
-            roadSectionEnd <= roadGeometryStart)
+    if (roadSectionStart >= roadGeometryEnd ||
+        roadSectionEnd <= roadGeometryStart)
     {
         return {};
     }
 
-    double geometryOffsetStart = CalculateGeometryOffsetStart(roadSectionStart,
-                                                              roadGeometryStart);
+    units::length::meter_t geometryOffsetStart = CalculateGeometryOffsetStart(roadSectionStart,
+                                                                              roadGeometryStart);
 
-    double geometryOffsetEnd = CalculateGeometryOffsetEnd(roadSectionEnd,
-                                                          roadGeometryStart,
-                                                          roadGeometryEnd,
-                                                          roadGeometryLength);
+    units::length::meter_t geometryOffsetEnd = CalculateGeometryOffsetEnd(roadSectionEnd,
+                                                                          roadGeometryStart,
+                                                                          roadGeometryEnd,
+                                                                          roadGeometryLength);
     auto borderPoints = CalculateJoints(geometryOffsetStart,
                                         geometryOffsetEnd,
                                         roadSection,
@@ -189,13 +191,13 @@ SampledGeometry GeometryConverter::CalculateGeometry(double roadSectionStart,
     return {borderPoints, roadGeometry->GetDir(geometryOffsetStart), roadGeometry->GetDir(geometryOffsetEnd)};
 }
 
-double GeometryConverter::CalculateGeometryOffsetStart(double roadSectionStart,
-                                                     double roadGeometryStart)
+units::length::meter_t GeometryConverter::CalculateGeometryOffsetStart(units::length::meter_t roadSectionStart,
+                                                                       units::length::meter_t roadGeometryStart)
 {
     // geometry begins within section
-    if(roadSectionStart <= roadGeometryStart)
+    if (roadSectionStart <= roadGeometryStart)
     {
-        return 0.0;
+        return 0.0_m;
     }
     // geometry begins before section
     else
@@ -204,13 +206,13 @@ double GeometryConverter::CalculateGeometryOffsetStart(double roadSectionStart,
     }
 }
 
-double GeometryConverter::CalculateGeometryOffsetEnd(double roadSectionEnd,
-                                                   double roadGeometryStart,
-                                                   double roadGeometryEnd,
-                                                   double roadGeometryLength)
+units::length::meter_t GeometryConverter::CalculateGeometryOffsetEnd(units::length::meter_t roadSectionEnd,
+                                                                     units::length::meter_t roadGeometryStart,
+                                                                     units::length::meter_t roadGeometryEnd,
+                                                                     units::length::meter_t roadGeometryLength)
 {
     // geometry ends within section
-    if(roadSectionEnd >= roadGeometryEnd)
+    if (roadSectionEnd >= roadGeometryEnd)
     {
         return roadGeometryLength;
     }
@@ -221,66 +223,65 @@ double GeometryConverter::CalculateGeometryOffsetEnd(double roadSectionEnd,
     }
 }
 
-std::vector<BorderPoints> GeometryConverter::CalculateJoints(double geometryOffsetStart,
-                                                             double geometryOffsetEnd,
+std::vector<BorderPoints> GeometryConverter::CalculateJoints(units::length::meter_t geometryOffsetStart,
+                                                             units::length::meter_t geometryOffsetEnd,
                                                              const RoadLaneSectionInterface *roadSection,
                                                              const RoadInterface *road,
                                                              const RoadGeometryInterface *roadGeometry,
-                                                             double roadGeometryStart,
-                                                             double roadSectionStart)
+                                                             units::length::meter_t roadGeometryStart,
+                                                             units::length::meter_t roadSectionStart)
 {
     std::vector<BorderPoints> borderPoints;
-    double geometryOffset = geometryOffsetStart;
+    auto geometryOffset = geometryOffsetStart;
     while (geometryOffset < geometryOffsetEnd + SAMPLING_RATE)
     {
         // account for last sample
-        if(geometryOffset > geometryOffsetEnd)
+        if (geometryOffset > geometryOffsetEnd)
         {
             geometryOffset = geometryOffsetEnd;
         }
 
         borderPoints.push_back(CalculateBorderPoints(roadSection,
-                                                  road,
-                                                  roadGeometry,
-                                                  geometryOffset,
-                                                  roadGeometryStart + geometryOffset,
-                                                  roadSectionStart));
+                                                     road,
+                                                     roadGeometry,
+                                                     geometryOffset,
+                                                     roadGeometryStart + geometryOffset,
+                                                     roadSectionStart));
 
         geometryOffset += SAMPLING_RATE;
     }
     return borderPoints;
 }
 
-BorderPoints GeometryConverter::CalculateBorderPoints(const RoadLaneSectionInterface* roadSection,
-                                                      const RoadInterface* road,
-                                                      const RoadGeometryInterface* roadGeometry,
-                                                      double geometryOffset,
-                                                      double sCoordinate,
-                                                      double roadSectionStart)
+BorderPoints GeometryConverter::CalculateBorderPoints(const RoadLaneSectionInterface *roadSection,
+                                                      const RoadInterface *road,
+                                                      const RoadGeometryInterface *roadGeometry,
+                                                      units::length::meter_t geometryOffset,
+                                                      units::length::meter_t sCoordinate,
+                                                      units::length::meter_t roadSectionStart)
 {
-
-    const auto& roadLanes = roadSection->GetLanes();
+    const auto &roadLanes = roadSection->GetLanes();
     const auto maxLaneId = roadLanes.crbegin()->first;
     const auto minLaneId = roadLanes.cbegin()->first;
 
-    const double sectionOffset = std::max(sCoordinate - roadSection->GetStart(), 0.0); //Take only positive value to prevent rounding imprecision
-    const double laneOffset = CalculateLaneOffset(road, sCoordinate);
+    const auto sectionOffset = units::math::max(sCoordinate - roadSection->GetStart(), 0.0_m); //Take only positive value to prevent rounding imprecision
+    const auto laneOffset = CalculateLaneOffset(road, sCoordinate);
     const auto centerPoint = roadGeometry->GetCoord(geometryOffset, laneOffset);
-    const double heading = roadGeometry->GetDir(geometryOffset);
-    const double sin_hdg = std::sin(heading);
-    const double cos_hdg = std::cos(heading);
+    const auto heading = roadGeometry->GetDir(geometryOffset);
+    const auto sin_hdg = units::math::sin(heading);
+    const auto cos_hdg = units::math::cos(heading);
 
     std::deque<BorderPoint> points;
 
     // start with positive lanes
     // 1, 2, 3... -> order necessary to accumulate right starting from center
-    double borderOffset = 0.0;
+    units::length::meter_t borderOffset{0.0};
     for (int laneId = 1; laneId <= maxLaneId; laneId++)
     {
         const auto laneIter = roadLanes.find(laneId);
         if (laneIter == roadLanes.end())
         {
-            throw std::runtime_error("Missing lane with id "+ std::to_string(laneId));
+            throw std::runtime_error("Missing lane with id " + std::to_string(laneId));
         }
 
         auto lane = laneIter->second;
@@ -297,20 +298,20 @@ BorderPoints GeometryConverter::CalculateBorderPoints(const RoadLaneSectionInter
             throw std::runtime_error("RoadLane requires either Width or Border definition.");
         }
 
-        const double x = centerPoint.x - borderOffset * sin_hdg;
-        const double y = centerPoint.y + borderOffset * cos_hdg;
-        points.emplace_front(Common::Vector2d{x,y}, roadLanes.at(laneId));
+        const units::length::meter_t x = units::length::meter_t(centerPoint.x) - borderOffset * sin_hdg;
+        const units::length::meter_t y = units::length::meter_t(centerPoint.y) + borderOffset * cos_hdg;
+        points.emplace_front(Common::Vector2d<units::length::meter_t>{x, y}, roadLanes.at(laneId));
     }
 
     points.emplace_back(centerPoint, roadLanes.at(0));
 
-    borderOffset = 0.0;
+    borderOffset = 0.0_m;
     for (int laneId = -1; laneId >= minLaneId; laneId--)
     {
         const auto laneIter = roadLanes.find(laneId);
         if (laneIter == roadLanes.end())
         {
-            throw std::runtime_error("Missing lane with id "+ std::to_string(laneId));
+            throw std::runtime_error("Missing lane with id " + std::to_string(laneId));
         }
 
         auto lane = laneIter->second;
@@ -327,19 +328,19 @@ BorderPoints GeometryConverter::CalculateBorderPoints(const RoadLaneSectionInter
             throw std::runtime_error("RoadLane requires either Width or Border definition.");
         }
 
-        const double x = centerPoint.x + borderOffset * sin_hdg;
-        const double y = centerPoint.y - borderOffset * cos_hdg;
-        points.emplace_back(Common::Vector2d{x,y}, roadLanes.at(laneId));
+        const units::length::meter_t x = units::length::meter_t(centerPoint.x) + borderOffset * sin_hdg;
+        const units::length::meter_t y = units::length::meter_t(centerPoint.y) - borderOffset * cos_hdg;
+        points.emplace_back(Common::Vector2d<units::length::meter_t>{x, y}, roadLanes.at(laneId));
     }
 
     return BorderPoints{sCoordinate, {points.begin(), points.end()}};
 }
 
-void GeometryConverter::AddPointsToWorld(OWL::Interfaces::WorldData& worldData, const Joints& joints)
+void GeometryConverter::AddPointsToWorld(OWL::Interfaces::WorldData &worldData, const Joints &joints)
 {
-    for (const auto& joint : joints)
+    for (const auto &joint : joints)
     {
-        for (const auto& [laneId, laneJoint] : joint.laneJoints)
+        for (const auto &[laneId, laneJoint] : joint.laneJoints)
         {
             if (laneId == 0)
             {
@@ -353,14 +354,14 @@ void GeometryConverter::AddPointsToWorld(OWL::Interfaces::WorldData& worldData,
     }
 }
 
-double GeometryConverter::CalculateCoordZ(RoadInterface *road, double offset)
+units::length::meter_t GeometryConverter::CalculateCoordZ(RoadInterface *road, units::length::meter_t offset)
 {
-    double coordZ = 0.0;
-    const RoadElevation* roadElevation = GetRelevantRoadElevation(offset, road);
+    units::length::meter_t coordZ{0.0};
+    const RoadElevation *roadElevation = GetRelevantRoadElevation(offset, road);
 
-    if(roadElevation)
+    if (roadElevation)
     {
-        double ds = offset - roadElevation->GetS();
+        const auto ds = offset - roadElevation->GetS();
 
         coordZ = roadElevation->GetA() +
                  roadElevation->GetB() * ds +
@@ -371,12 +372,12 @@ double GeometryConverter::CalculateCoordZ(RoadInterface *road, double offset)
     return coordZ;
 }
 
-double GeometryConverter::CalculateSlope(RoadInterface *road, double offset)
+double GeometryConverter::CalculateSlope(RoadInterface *road, units::length::meter_t offset)
 {
     double slope = 0.0;
-    const RoadElevation* roadElevation = GetRelevantRoadElevation(offset, road);
+    const RoadElevation *roadElevation = GetRelevantRoadElevation(offset, road);
 
-    if(roadElevation)
+    if (roadElevation)
     {
         slope = CalculateSlopeAtRoadPosition(roadElevation, offset);
     }
@@ -384,16 +385,16 @@ double GeometryConverter::CalculateSlope(RoadInterface *road, double offset)
     return slope;
 }
 
-const RoadElevation* GeometryConverter::GetRelevantRoadElevation(double roadOffset, RoadInterface* road)
+const RoadElevation *GeometryConverter::GetRelevantRoadElevation(units::length::meter_t roadOffset, RoadInterface *road)
 {
     auto roadLaneIt = road->GetElevations().begin();
-    while(road->GetElevations().end() != roadLaneIt)
+    while (road->GetElevations().end() != roadLaneIt)
     {
-        if((*roadLaneIt)->GetS() <= roadOffset)
+        if ((*roadLaneIt)->GetS() <= roadOffset)
         {
             auto roadLaneNextIt = std::next(roadLaneIt);
-            if(road->GetElevations().end() == roadLaneNextIt ||
-                    (*roadLaneNextIt)->GetS() > roadOffset)
+            if (road->GetElevations().end() == roadLaneNextIt ||
+                (*roadLaneNextIt)->GetS() > roadOffset)
             {
                 break;
             }
@@ -402,26 +403,26 @@ const RoadElevation* GeometryConverter::GetRelevantRoadElevation(double roadOffs
         ++roadLaneIt;
     }
 
-    if(roadLaneIt == road->GetElevations().end())
+    if (roadLaneIt == road->GetElevations().end())
     {
         return nullptr;
     }
     else
     {
-      return *roadLaneIt;
+        return *roadLaneIt;
     }
 }
 
-const RoadLaneWidth* GeometryConverter::GetRelevantRoadLaneWidth(double sectionOffset, const RoadLaneWidths widthsOrBorders)
+const RoadLaneWidth *GeometryConverter::GetRelevantRoadLaneWidth(units::length::meter_t sectionOffset, const RoadLaneWidths widthsOrBorders)
 {
     auto roadLaneIt = widthsOrBorders.begin();
-    while(widthsOrBorders.end() != roadLaneIt)
+    while (widthsOrBorders.end() != roadLaneIt)
     {
-        if((*roadLaneIt)->GetSOffset() <= sectionOffset)
+        if ((*roadLaneIt)->GetSOffset() <= sectionOffset)
         {
             auto roadLaneNextIt = std::next(roadLaneIt);
-            if(widthsOrBorders.end() == roadLaneNextIt ||
-                    (*roadLaneNextIt)->GetSOffset() > sectionOffset)
+            if (widthsOrBorders.end() == roadLaneNextIt ||
+                (*roadLaneNextIt)->GetSOffset() > sectionOffset)
             {
                 break;
             }
@@ -430,25 +431,25 @@ const RoadLaneWidth* GeometryConverter::GetRelevantRoadLaneWidth(double sectionO
         ++roadLaneIt;
     }
 
-    if(roadLaneIt == widthsOrBorders.end())
+    if (roadLaneIt == widthsOrBorders.end())
     {
         return nullptr;
     }
     else
     {
-      return *roadLaneIt;
+        return *roadLaneIt;
     }
 }
 
-const RoadLaneOffset* GeometryConverter::GetRelevantRoadLaneOffset(double roadOffset, const RoadInterface* road)
+const RoadLaneOffset *GeometryConverter::GetRelevantRoadLaneOffset(units::length::meter_t roadOffset, const RoadInterface *road)
 {
     auto laneOffsetIt = road->GetLaneOffsets().begin();
-    while(laneOffsetIt != road->GetLaneOffsets().end())
+    while (laneOffsetIt != road->GetLaneOffsets().end())
     {
         auto laneOffsetNextIt = std::next(laneOffsetIt);
 
-        if(road->GetLaneOffsets().end() == laneOffsetNextIt ||
-                (*laneOffsetNextIt)->GetS() > roadOffset)
+        if (road->GetLaneOffsets().end() == laneOffsetNextIt ||
+            (*laneOffsetNextIt)->GetS() > roadOffset)
         {
         }
 
@@ -456,13 +457,13 @@ const RoadLaneOffset* GeometryConverter::GetRelevantRoadLaneOffset(double roadOf
     }
 
     auto roadLaneIt = road->GetLaneOffsets().begin();
-    while(road->GetLaneOffsets().end() != roadLaneIt)
+    while (road->GetLaneOffsets().end() != roadLaneIt)
     {
-        if((*roadLaneIt)->GetS() <= roadOffset)
+        if ((*roadLaneIt)->GetS() <= roadOffset)
         {
             auto roadLaneNextIt = std::next(roadLaneIt);
-            if(road->GetLaneOffsets().end() == roadLaneNextIt ||
-                    (*roadLaneNextIt)->GetS() > roadOffset)
+            if (road->GetLaneOffsets().end() == roadLaneNextIt ||
+                (*roadLaneNextIt)->GetS() > roadOffset)
             {
                 break;
             }
@@ -471,27 +472,27 @@ const RoadLaneOffset* GeometryConverter::GetRelevantRoadLaneOffset(double roadOf
         ++roadLaneIt;
     }
 
-    if(roadLaneIt == road->GetLaneOffsets().end())
+    if (roadLaneIt == road->GetLaneOffsets().end())
     {
         return nullptr;
     }
     else
     {
-      return *roadLaneIt;
+        return *roadLaneIt;
     }
 }
 
-const RoadLaneRoadMark* GeometryConverter::GetRelevantRoadLaneRoadMark(double sectionOffset, const RoadLaneInterface* roadLane)
+const RoadLaneRoadMark *GeometryConverter::GetRelevantRoadLaneRoadMark(units::length::meter_t sectionOffset, const RoadLaneInterface *roadLane)
 {
     auto roadMarkIt = roadLane->GetRoadMarks().begin();
 
-    while(roadMarkIt != roadLane->GetRoadMarks().end())
+    while (roadMarkIt != roadLane->GetRoadMarks().end())
     {
-        if((*roadMarkIt)->GetSOffset() <= sectionOffset)
+        if ((*roadMarkIt)->GetSOffset() <= sectionOffset)
         {
             auto roadMarkNextIt = std::next(roadMarkIt);
-            if(roadMarkNextIt == roadLane->GetRoadMarks().end() ||
-               (*roadMarkNextIt)->GetSOffset() > sectionOffset)
+            if (roadMarkNextIt == roadLane->GetRoadMarks().end() ||
+                (*roadMarkNextIt)->GetSOffset() > sectionOffset)
             {
                 break;
             }
@@ -500,21 +501,21 @@ const RoadLaneRoadMark* GeometryConverter::GetRelevantRoadLaneRoadMark(double se
         ++roadMarkIt;
     }
 
-    if(roadMarkIt == roadLane->GetRoadMarks().end())
+    if (roadMarkIt == roadLane->GetRoadMarks().end())
     {
         return nullptr;
     }
     else
     {
-      return *roadMarkIt;
+        return *roadMarkIt;
     }
 }
 
-double GeometryConverter::CalculateLaneWidth(const RoadLaneInterface *roadLane, double sectionOffset)
+units::length::meter_t GeometryConverter::CalculateLaneWidth(const RoadLaneInterface *roadLane, units::length::meter_t sectionOffset)
 {
-    const RoadLaneWidth* roadLaneWidth = GetRelevantRoadLaneWidth(sectionOffset, roadLane->GetWidths());
+    const RoadLaneWidth *roadLaneWidth = GetRelevantRoadLaneWidth(sectionOffset, roadLane->GetWidths());
 
-    if(!roadLaneWidth)
+    if (!roadLaneWidth)
     {
         throw std::runtime_error("No lane width given");
     }
@@ -522,11 +523,11 @@ double GeometryConverter::CalculateLaneWidth(const RoadLaneInterface *roadLane,
     return CalculateWidthAtSectionPosition(roadLaneWidth, sectionOffset);
 }
 
-double GeometryConverter::CalculateLaneBorder(const RoadLaneInterface *roadLane, double sectionOffset)
+units::length::meter_t GeometryConverter::CalculateLaneBorder(const RoadLaneInterface *roadLane, units::length::meter_t sectionOffset)
 {
-    const RoadLaneWidth* roadLaneBorder = GetRelevantRoadLaneWidth(sectionOffset, roadLane->GetBorders());
+    const RoadLaneWidth *roadLaneBorder = GetRelevantRoadLaneWidth(sectionOffset, roadLane->GetBorders());
 
-    if(!roadLaneBorder)
+    if (!roadLaneBorder)
     {
         throw std::runtime_error("No lane border given");
     }
@@ -534,21 +535,21 @@ double GeometryConverter::CalculateLaneBorder(const RoadLaneInterface *roadLane,
     return CalculateWidthAtSectionPosition(roadLaneBorder, sectionOffset);
 }
 
-double GeometryConverter::CalculateLaneOffset(const RoadInterface* road, double roadPosition)
+units::length::meter_t GeometryConverter::CalculateLaneOffset(const RoadInterface *road, units::length::meter_t roadPosition)
 {
-    const RoadLaneOffset* roadLaneOffset = GetRelevantRoadLaneOffset(roadPosition, road);
+    const RoadLaneOffset *roadLaneOffset = GetRelevantRoadLaneOffset(roadPosition, road);
 
     if (!roadLaneOffset)
     {
-        return 0.0;
+        return 0.0_m;
     }
 
     return CalculateOffsetAtRoadPosition(roadLaneOffset, roadPosition);
 }
 
-double GeometryConverter::CalculateWidthAtSectionPosition(const RoadLaneWidth* width, double position)
+units::length::meter_t GeometryConverter::CalculateWidthAtSectionPosition(const RoadLaneWidth *width, units::length::meter_t position)
 {
-    double ds = position - width->GetSOffset();
+    const auto ds = position - width->GetSOffset();
 
     return width->GetA() +
            width->GetB() * ds +
@@ -556,43 +557,38 @@ double GeometryConverter::CalculateWidthAtSectionPosition(const RoadLaneWidth* w
            width->GetD() * ds * ds * ds;
 }
 
-double GeometryConverter::CalculateSlopeAtRoadPosition(const RoadElevation* roadElevation, double position)
+double GeometryConverter::CalculateSlopeAtRoadPosition(const RoadElevation *roadElevation, units::length::meter_t position)
 {
-    double ds = position - roadElevation->GetS();
+    const auto ds = position - roadElevation->GetS();
 
-    double deltaZ =     roadElevation->GetB() +
-                    2 * roadElevation->GetC() * ds +
-                    3 * roadElevation->GetD() * ds * ds;
+    double deltaZ = roadElevation->GetB() +
+                    2.0 * roadElevation->GetC() * ds +
+                    3.0 * roadElevation->GetD() * ds * ds;
 
     return std::atan(deltaZ);
 }
 
-double GeometryConverter::CalculateOffsetAtRoadPosition(const RoadLaneOffset* roadOffset, double position)
+units::length::meter_t GeometryConverter::CalculateOffsetAtRoadPosition(const RoadLaneOffset *roadOffset, units::length::meter_t position)
 {
-    double ds = position - roadOffset->GetS();
+    const auto ds = position - roadOffset->GetS();
 
-    double deltaT = roadOffset->GetA() +
-                    roadOffset->GetB() * ds +
-                    roadOffset->GetC() * ds * ds +
-                    roadOffset->GetD() * ds * ds *ds;
+    units::length::meter_t deltaT = roadOffset->GetA() +
+                                    roadOffset->GetB() * ds +
+                                    roadOffset->GetC() * ds * ds +
+                                    roadOffset->GetD() * ds * ds * ds;
 
     return deltaT;
 }
 
-void GeometryConverter::Convert(const SceneryInterface& scenery, OWL::Interfaces::WorldData& worldData)
+void GeometryConverter::Convert(const SceneryInterface &scenery, OWL::Interfaces::WorldData &worldData)
 {
     CalculateRoads(scenery, worldData);
     CalculateIntersections(worldData);
 }
 
-bool GeometryConverter::IsEqual(const double valueA, const double valueB)
+void GeometryConverter::CalculateIntersections(OWL::Interfaces::WorldData &worldData)
 {
-    return std::abs(valueA - valueB) < EPS;
-}
-
-void GeometryConverter::CalculateIntersections(OWL::Interfaces::WorldData& worldData)
-{
-    for (const auto& [id, junction]: worldData.GetJunctions())
+    for (const auto &[id, junction] : worldData.GetJunctions())
     {
         JunctionPolygons junctionPolygons;
         std::transform(junction->GetConnectingRoads().begin(),
@@ -604,10 +600,10 @@ void GeometryConverter::CalculateIntersections(OWL::Interfaces::WorldData& world
     }
 }
 
-RoadPolygons GeometryConverter::BuildRoadPolygons(const OWL::Road* const road)
+RoadPolygons GeometryConverter::BuildRoadPolygons(const OWL::Road *const road)
 {
     std::vector<LaneGeometryPolygon> polygons;
-    auto& roadId = road->GetId();
+    auto &roadId = road->GetId();
 
     for (const auto section : road->GetSections())
     {
@@ -626,15 +622,14 @@ RoadPolygons GeometryConverter::BuildRoadPolygons(const OWL::Road* const road)
     return std::make_pair(roadId, polygons);
 }
 
-std::function<LaneGeometryPolygon (const OWL::Primitive::LaneGeometryElement* const)> GeometryConverter::CreateBuildPolygonFromLaneGeometryFunction(const std::string& roadId,
-                                                                                                                                                    const OWL::Id laneId)
+std::function<LaneGeometryPolygon(const OWL::Primitive::LaneGeometryElement *const)> GeometryConverter::CreateBuildPolygonFromLaneGeometryFunction(const std::string &roadId,
+                                                                                                                                                   const OWL::Id laneId)
 {
-    return [roadId, laneId](const auto elem) -> LaneGeometryPolygon
-    {
-        point_t currentLeftPoint{elem->joints.current.points.left.x, elem->joints.current.points.left.y};
-        point_t currentRightPoint{elem->joints.current.points.right.x, elem->joints.current.points.right.y};
-        point_t nextRightPoint{elem->joints.next.points.right.x, elem->joints.next.points.right.y};
-        point_t nextLeftPoint{elem->joints.next.points.left.x, elem->joints.next.points.left.y};
+    return [roadId, laneId](const auto elem) -> LaneGeometryPolygon {
+        point_t currentLeftPoint{elem->joints.current.points.left.x.value(), elem->joints.current.points.left.y.value()};
+        point_t currentRightPoint{elem->joints.current.points.right.x.value(), elem->joints.current.points.right.y.value()};
+        point_t nextRightPoint{elem->joints.next.points.right.x.value(), elem->joints.next.points.right.y.value()};
+        point_t nextLeftPoint{elem->joints.next.points.left.x.value(), elem->joints.next.points.left.y.value()};
         polygon_t polygon;
 
         bg::append(polygon, currentLeftPoint);
@@ -651,8 +646,8 @@ std::function<LaneGeometryPolygon (const OWL::Primitive::LaneGeometryElement* co
     };
 }
 
-void GeometryConverter::CalculateJunctionIntersectionsFromRoadPolygons(const JunctionPolygons& junctionPolygons,
-                                                                       OWL::Junction* const junction)
+void GeometryConverter::CalculateJunctionIntersectionsFromRoadPolygons(const JunctionPolygons &junctionPolygons,
+                                                                       OWL::Junction *const junction)
 {
     auto roadPolygonsIter = junctionPolygons.begin();
     while (roadPolygonsIter != junctionPolygons.end())
@@ -678,17 +673,17 @@ void GeometryConverter::CalculateJunctionIntersectionsFromRoadPolygons(const Jun
     }
 }
 
-std::optional<OWL::IntersectionInfo> GeometryConverter::CalculateIntersectionInfoForRoadPolygons(const RoadPolygons& roadPolygons,
-                                                                                                 const RoadPolygons& roadPolygonsToCompare,
-                                                                                                 const OWL::Junction * const junction)
+std::optional<OWL::IntersectionInfo> GeometryConverter::CalculateIntersectionInfoForRoadPolygons(const RoadPolygons &roadPolygons,
+                                                                                                 const RoadPolygons &roadPolygonsToCompare,
+                                                                                                 const OWL::Junction *const junction)
 {
     OWL::IntersectionInfo info;
     info.intersectingRoad = roadPolygonsToCompare.first;
     info.relativeRank = GetRelativeRank(roadPolygons.first, roadPolygonsToCompare.first, junction);
 
-    for (const auto& laneGeometryPolygon : roadPolygons.second)
+    for (const auto &laneGeometryPolygon : roadPolygons.second)
     {
-        for (const auto& polygonToCompare : roadPolygonsToCompare.second)
+        for (const auto &polygonToCompare : roadPolygonsToCompare.second)
         {
             const auto intersection = CommonHelper::IntersectionCalculation::GetIntersectionPoints(laneGeometryPolygon.polygon, polygonToCompare.polygon, false, false);
 
@@ -700,14 +695,14 @@ std::optional<OWL::IntersectionInfo> GeometryConverter::CalculateIntersectionInf
             World::Localization::LocalizationElement localizationElement{*laneGeometryPolygon.laneGeometryElement};
             World::Localization::WorldToRoadCoordinateConverter processor{localizationElement};
 
-            double minS = std::numeric_limits<double>::max();
-            double maxS = 0;
+            units::length::meter_t minS{std::numeric_limits<double>::max()};
+            units::length::meter_t maxS{0};
 
-            for (const auto& point : intersection)
+            for (const auto &point : intersection)
             {
-                double s = processor.GetS(point);
-                minS = std::min(minS, s);
-                maxS = std::max(maxS, s);
+                const auto s = processor.GetS(point);
+                minS = units::math::min(minS, s);
+                maxS = units::math::max(maxS, s);
             }
 
             std::pair<OWL::Id, OWL::Id> intersectingLanesPair{laneGeometryPolygon.laneId, polygonToCompare.laneId};
@@ -716,10 +711,10 @@ std::optional<OWL::IntersectionInfo> GeometryConverter::CalculateIntersectionInf
             // if these lane ids are already marked as intersecting, update the startSOffset and endSOffset to reflect new intersection information
             if (intersectingLanesPairIter != info.sOffsets.end())
             {
-                double recordedStartS = (*intersectingLanesPairIter).second.first;
-                double recordedEndS = (*intersectingLanesPairIter).second.second;
-                (*intersectingLanesPairIter).second.first = std::min(recordedStartS, minS);
-                (*intersectingLanesPairIter).second.second = std::max(recordedEndS, maxS);
+                const auto recordedStartS = (*intersectingLanesPairIter).second.first;
+                const auto recordedEndS = (*intersectingLanesPairIter).second.second;
+                (*intersectingLanesPairIter).second.first = units::math::min(recordedStartS, minS);
+                (*intersectingLanesPairIter).second.second = units::math::max(recordedEndS, maxS);
             }
             else
             {
@@ -729,21 +724,21 @@ std::optional<OWL::IntersectionInfo> GeometryConverter::CalculateIntersectionInf
     }
 
     return info.sOffsets.size() > 0
-            ? std::make_optional(info)
-            : std::nullopt;
+               ? std::make_optional(info)
+               : std::nullopt;
 }
 
-IntersectingConnectionRank GeometryConverter::GetRelativeRank(const std::string& roadId, const std::string& intersectingRoadId, const OWL::Junction * const junction)
+IntersectingConnectionRank GeometryConverter::GetRelativeRank(const std::string &roadId, const std::string &intersectingRoadId, const OWL::Junction *const junction)
 {
     if (std::find_if(junction->GetPriorities().begin(),
                      junction->GetPriorities().end(),
-                     [&](const auto& priority){return priority.first == roadId && priority.second == intersectingRoadId;}) != junction->GetPriorities().end())
+                     [&](const auto &priority) { return priority.first == roadId && priority.second == intersectingRoadId; }) != junction->GetPriorities().end())
     {
         return IntersectingConnectionRank::Lower;
     }
     else if (std::find_if(junction->GetPriorities().begin(),
                           junction->GetPriorities().end(),
-                          [&](const auto& priority){return priority.first == intersectingRoadId && priority.second == roadId;}) != junction->GetPriorities().end())
+                          [&](const auto &priority) { return priority.first == intersectingRoadId && priority.second == roadId; }) != junction->GetPriorities().end())
     {
         return IntersectingConnectionRank::Higher;
     }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/GeometryConverter.h b/sim/src/core/opSimulation/modules/World_OSI/GeometryConverter.h
index e433c469734fb3873ce87b06e055857533697177..c28e9b9e3e50542c969435528d2fc9f411be8df1 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/GeometryConverter.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/GeometryConverter.h
@@ -67,8 +67,8 @@ void CalculateRoads(const SceneryInterface& scenery, OWL::Interfaces::WorldData&
 //! \param road             road the section is part of
 //! \param roadSection      section to convert
 void CalculateSection(OWL::Interfaces::WorldData& worldData,
-                      double roadSectionStart,
-                      double roadSectionEnd,
+                      units::length::meter_t roadSectionStart,
+                      units::length::meter_t roadSectionEnd,
                       const RoadInterface* road,
                       const RoadLaneSectionInterface* roadSection);
 
@@ -80,8 +80,8 @@ void CalculateSection(OWL::Interfaces::WorldData& worldData,
 //! \param road             road the section is part of
 //! \param roadSection      section to convert
 //! \return                 sampled boundary points
-SampledGeometry CalculateSectionBetweenRoadMarkChanges(double roadSectionStart,
-                                                       double roadSectionEnd,
+SampledGeometry CalculateSectionBetweenRoadMarkChanges(units::length::meter_t roadSectionStart,
+                                                       units::length::meter_t roadSectionEnd,
                                                        const RoadInterface *road,
                                                        const RoadLaneSectionInterface *roadSection);
 
@@ -94,20 +94,20 @@ SampledGeometry CalculateSectionBetweenRoadMarkChanges(double roadSectionStart,
 //! \param roadGeometry         geometry to sample
 //! \param roadGeometryLength   length of the geometry
 //! \return                 sampled boundary points
-SampledGeometry CalculateGeometry(double roadSectionStart,
-                                  double roadSectionEnd,
+SampledGeometry CalculateGeometry(units::length::meter_t roadSectionStart,
+                                  units::length::meter_t roadSectionEnd,
                                   const RoadInterface *road,
                                   const RoadLaneSectionInterface *roadSection,
                                   const RoadGeometryInterface *roadGeometry,
-                                  double roadGeometryLength);
+                                  units::length::meter_t roadGeometryLength);
 
 //! Calculates the start s offset of a geometry inside a section
 //!
 //! \param roadSectionStart     start s coordinate of the section
 //! \param roadGeometryStart    start s coordinate of the geometry
 //! \return                     start s offset of the geometry in the section
-double CalculateGeometryOffsetStart(double roadSectionStart,
-                                    double roadGeometryStart);
+units::length::meter_t CalculateGeometryOffsetStart(units::length::meter_t roadSectionStart,
+                                    units::length::meter_t roadGeometryStart);
 
 //! Calculates the end s offset of a geometry inside a section
 //!
@@ -116,10 +116,10 @@ double CalculateGeometryOffsetStart(double roadSectionStart,
 //! \param roadGeometryEnd      end s coordinate of the section
 //! \param roadGeometryLength   length of the geometry
 //! \return                     end s offset of the geometry in the section
-double CalculateGeometryOffsetEnd(double roadSectionEnd,
-                                  double roadGeometryStart,
-                                  double roadGeometryEnd,
-                                  double roadGeometryLength);
+units::length::meter_t CalculateGeometryOffsetEnd(units::length::meter_t roadSectionEnd,
+                                  units::length::meter_t roadGeometryStart,
+                                  units::length::meter_t roadGeometryEnd,
+                                  units::length::meter_t roadGeometryLength);
 
 //! Calculates the lane boundary points with a high sampling rate
 //!
@@ -131,13 +131,13 @@ double CalculateGeometryOffsetEnd(double roadSectionEnd,
 //! \param roadGeometryStart    start s coordinate of the geometry
 //! \param roadSectionStart     start s coordinate of the section
 //! \return                     sampled lane boundary points
-std::vector<BorderPoints> CalculateJoints(double geometryOffsetStart,
-                                          double geometryOffsetEnd,
+std::vector<BorderPoints> CalculateJoints(units::length::meter_t geometryOffsetStart,
+                                          units::length::meter_t geometryOffsetEnd,
                                           const RoadLaneSectionInterface *roadSection,
                                           const RoadInterface *road,
                                           const RoadGeometryInterface *roadGeometry,
-                                          double roadGeometryStart,
-                                          double roadSectionStart);
+                                          units::length::meter_t roadGeometryStart,
+                                          units::length::meter_t roadSectionStart);
 
 //! Calculates the lane boundary points of a single joint (i.e. at one s coordinate)
 //!
@@ -151,9 +151,9 @@ std::vector<BorderPoints> CalculateJoints(double geometryOffsetStart,
 BorderPoints CalculateBorderPoints(const RoadLaneSectionInterface* roadSection,
                                    const RoadInterface *road,
                                    const RoadGeometryInterface *roadGeometry,
-                                   double geometryOffset,
-                                   double roadOffset,
-                                   double roadSectionStart);
+                                   units::length::meter_t geometryOffset,
+                                   units::length::meter_t roadOffset,
+                                   units::length::meter_t roadSectionStart);
 
 //! Adds the sampled joints to the world
 //!
@@ -168,7 +168,7 @@ void AddPointsToWorld(OWL::Interfaces::WorldData& worldData, const Joints& joint
 //! @param[in]  offset         Absolute offset on reference line within road
 //! @return                    height coordinate
 //-----------------------------------------------------------------------------
-double CalculateCoordZ(RoadInterface *road, double offset);
+units::length::meter_t  CalculateCoordZ(RoadInterface *road, units::length::meter_t offset);
 
 //-----------------------------------------------------------------------------
 //! Calculates slope according to OpenDrive elevation profiles.
@@ -177,7 +177,7 @@ double CalculateCoordZ(RoadInterface *road, double offset);
 //! @param[in]  offset         Absolute offset on reference line within road
 //! @return                    slope
 //-----------------------------------------------------------------------------
-double CalculateSlope(RoadInterface *road, double offset);
+double CalculateSlope(RoadInterface *road, units::length::meter_t offset);
 
 //-----------------------------------------------------------------------------
 //! Calculates the width of the provided lane.
@@ -186,7 +186,7 @@ double CalculateSlope(RoadInterface *road, double offset);
 //! @param[in]  sectionOffset       Offset within the OpenDrive section
 //! @return                         Lane width, 0.0 if no width was specified
 //-----------------------------------------------------------------------------
-double CalculateLaneWidth(const RoadLaneInterface* roadLane, double sectionOffset);
+units::length::meter_t CalculateLaneWidth(const RoadLaneInterface* roadLane, units::length::meter_t sectionOffset);
 
 //-----------------------------------------------------------------------------
 //! Calculates the border of the provided lane.
@@ -195,9 +195,9 @@ double CalculateLaneWidth(const RoadLaneInterface* roadLane, double sectionOffse
 //! @param[in]  sectionOffset       Offset within the OpenDrive section
 //! @return                         Lane border, 0.0 if no width was specified
 //-----------------------------------------------------------------------------
-double CalculateLaneBorder(const RoadLaneInterface* roadLane, double sectionOffset);
+units::length::meter_t CalculateLaneBorder(const RoadLaneInterface* roadLane, units::length::meter_t sectionOffset);
 
-double CalculateLaneOffset(const RoadInterface* road, double roadPosition);
+units::length::meter_t CalculateLaneOffset(const RoadInterface* road, units::length::meter_t roadPosition);
 
 //-----------------------------------------------------------------------------
 //! Calculates the slope of a lane at a given position
@@ -206,9 +206,9 @@ double CalculateLaneOffset(const RoadInterface* road, double roadPosition);
 //! @param[in] position         position w.r.t. start of section
 //! @return                     width at given position
 //-----------------------------------------------------------------------------
-double CalculateSlopeAtRoadPosition(const RoadElevation* elevation, double position);
+double CalculateSlopeAtRoadPosition(const RoadElevation* elevation, units::length::meter_t position);
 
-double CalculateOffsetAtRoadPosition(const RoadLaneOffset* roadOffset, double position);
+units::length::meter_t CalculateOffsetAtRoadPosition(const RoadLaneOffset* roadOffset, units::length::meter_t position);
 
 //-----------------------------------------------------------------------------
 //! Calculates the width of a lane at a given position
@@ -217,7 +217,7 @@ double CalculateOffsetAtRoadPosition(const RoadLaneOffset* roadOffset, double po
 //! @param[in] position         position w.r.t. start of section
 //! @return                     width at given position
 //-----------------------------------------------------------------------------
-double CalculateWidthAtSectionPosition(const RoadLaneWidth* width, double position);
+units::length::meter_t CalculateWidthAtSectionPosition(const RoadLaneWidth* width, units::length::meter_t position);
 
 //-----------------------------------------------------------------------------
 //! Get the RoadElevation which is relevant for the given position
@@ -226,7 +226,7 @@ double CalculateWidthAtSectionPosition(const RoadLaneWidth* width, double positi
 //! @param[in] roadLane         the RoadLaneInterface input data
 //! @return                     relevant RoadElevation
 //-----------------------------------------------------------------------------
-const RoadElevation* GetRelevantRoadElevation(double sectionOffset, RoadInterface *road);
+const RoadElevation* GetRelevantRoadElevation(units::length::meter_t sectionOffset, RoadInterface *road);
 
 //-----------------------------------------------------------------------------
 //! Get the RoadLaneWidth which is relevant for the given position
@@ -235,20 +235,11 @@ const RoadElevation* GetRelevantRoadElevation(double sectionOffset, RoadInterfac
 //! @param[in] widthsOrBorders        container with all potential RoadLaneWidth pointers
 //! @return                     relevant RoadLaneWidth
 //-----------------------------------------------------------------------------
-const RoadLaneWidth* GetRelevantRoadLaneWidth(double sectionOffset, const std::vector<RoadLaneWidth *> widthsOrBorders);
+const RoadLaneWidth* GetRelevantRoadLaneWidth(units::length::meter_t sectionOffset, const std::vector<RoadLaneWidth*> widthsOrBorders);
 
-const RoadLaneOffset* GetRelevantRoadLaneOffset(double roadOffset, const RoadInterface* road);
+const RoadLaneOffset* GetRelevantRoadLaneOffset(units::length::meter_t roadOffset, const RoadInterface* road);
 
-const RoadLaneRoadMark* GetRelevantRoadLaneRoadMark(double sectionOffset, const RoadLaneInterface* roadLane);
-
-//-----------------------------------------------------------------------------
-//! Tests if the provided values' difference is smaller than EPS
-//!
-//! @param[in] valueA           input value A
-//! @param[in] valueB           input value B
-//! @return                     true, if valueA and valueB are (approximately) the same, false otherwise
-//-----------------------------------------------------------------------------
-bool IsEqual(const double valueA, const double valueB);
+const RoadLaneRoadMark* GetRelevantRoadLaneRoadMark(units::length::meter_t sectionOffset, const RoadLaneInterface* roadLane);
 
 //-----------------------------------------------------------------------------
 //! \brief CalculateIntersections calculates any intersections on the
@@ -320,7 +311,7 @@ std::optional<OWL::IntersectionInfo> CalculateIntersectionInfoForRoadPolygons(co
 //-----------------------------------------------------------------------------
 IntersectingConnectionRank GetRelativeRank(const std::string& roadId, const std::string& intersectingRoadId, const OWL::Junction * const junction);
 
-constexpr static const double SAMPLING_RATE = 0.1; // 1m sampling rate of reference line
+const units::length::meter_t SAMPLING_RATE{0.1}; // 1m sampling rate of reference line
 constexpr static const double EPS = 1e-3;   // epsilon value for geometric comparisons
 };
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/JointsBuilder.cpp b/sim/src/core/opSimulation/modules/World_OSI/JointsBuilder.cpp
index d6ccce1f8468cce7ab2319741d7d57e744fc0c78..9c2ed22e1eaedc94d1de935f45b7d20a031f043d 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/JointsBuilder.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/JointsBuilder.cpp
@@ -11,8 +11,6 @@
 #include "JointsBuilder.h"
 #include "common/commonTools.h"
 
-constexpr double EPSILON = 0.001;
-
 double BorderPoints::GetSquaredError(const BorderPoints& begin, const BorderPoints& end) const
 {
     assert(points.size() == begin.points.size());
@@ -84,13 +82,13 @@ JointsBuilder& JointsBuilder::CalculateHeadings()
             auto& currentCenter = laneJoint.center;
             auto& nextCenter = (joint + 1)->laneJoints.at(laneId).center;
             auto vector = nextCenter - currentCenter;
-            if (vector.y > 0)
+            if (vector.y > 0_m)
             {
-                laneJoint.heading = M_PI_2 - std::atan(vector.x / vector.y);
+                laneJoint.heading = units::angle::radian_t(M_PI_2) - units::math::atan(vector.x / vector.y);
             }
-            if (vector.y < 0)
+            if (vector.y < 0_m)
             {
-                laneJoint.heading = -M_PI_2 - std::atan(vector.x / vector.y);
+                laneJoint.heading = units::angle::radian_t(-M_PI_2) - units::math::atan(vector.x / vector.y);
             }
         }
     }
@@ -105,7 +103,7 @@ JointsBuilder& JointsBuilder::CalculateCurvatures()
     {
         for (auto& [laneId, laneJoint] : joint->laneJoints)
         {
-            double previousHeading;
+            units::angle::radian_t previousHeading;
             if (joint == joints.begin())
             {
                 previousHeading = sampledGeometry.startHeading;
@@ -114,7 +112,7 @@ JointsBuilder& JointsBuilder::CalculateCurvatures()
             {
                 previousHeading = (joint - 1)->laneJoints.at(laneId).heading;
             }
-            double nextHeading;
+            units::angle::radian_t nextHeading;
             if (joint == joints.end() - 1)
             {
                 nextHeading = sampledGeometry.endHeading;
@@ -124,26 +122,26 @@ JointsBuilder& JointsBuilder::CalculateCurvatures()
                 nextHeading = laneJoint.heading;
             }
             auto deltaHeading = CommonHelper::SetAngleToValidRange(nextHeading - previousHeading);
-            double deltaS;
+            units::length::meter_t deltaS;
             if (joint == joints.begin())
             {
                 auto currentCenter = laneJoint.center;
                 auto nextElementCenter = ((joint + 1)->laneJoints.at(laneId).center + laneJoint.center) * 0.5;
-                deltaS = (nextElementCenter - currentCenter).Length();
+                deltaS = units::length::meter_t((nextElementCenter - currentCenter).Length());
             }
             else if (joint == joints.end() - 1)
             {
                 auto previousElementCenter = ((joint - 1)->laneJoints.at(laneId).center + laneJoint.center) * 0.5;
                 auto currentCenter = laneJoint.center;
-                deltaS = (currentCenter - previousElementCenter).Length();
+                deltaS = units::length::meter_t((currentCenter - previousElementCenter).Length());
             }
             else
             {
                 auto previousElementCenter = ((joint - 1)->laneJoints.at(laneId).center + laneJoint.center) * 0.5;
                 auto nextElementCenter = ((joint + 1)->laneJoints.at(laneId).center + laneJoint.center) * 0.5;
-                deltaS = (nextElementCenter - previousElementCenter).Length();
+                deltaS = units::length::meter_t((nextElementCenter - previousElementCenter).Length());
             }
-            laneJoint.curvature = deltaHeading / deltaS;
+            laneJoint.curvature = units::unit_cast<double>(deltaHeading) / deltaS;
         }
     }
 
@@ -161,7 +159,8 @@ void SampledGeometry::Combine(SampledGeometry& other)
     {
         return;
     }
-    assert(std::abs(borderPoints.back().s - other.borderPoints.front().s) < EPSILON);
+
+    assert(mantle_api::IsEqual(borderPoints.back().s, other.borderPoints.front().s));
     borderPoints.insert(borderPoints.end(), other.borderPoints.begin() + 1, other.borderPoints.end());
     endHeading = other.endHeading;
 }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/JointsBuilder.h b/sim/src/core/opSimulation/modules/World_OSI/JointsBuilder.h
index db30163c585a18d9eeb4a11577e16965ff8ab410..8ec4c0c76889af5a49ebf5cd1ceb4155629cd934 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/JointsBuilder.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/JointsBuilder.h
@@ -16,7 +16,7 @@
 //! This lane represents the outer boundary points of a lane at one s coordinate
 struct BorderPoint
 {
-    explicit BorderPoint(Common::Vector2d point, RoadLaneInterface* lane) noexcept :
+    explicit BorderPoint(Common::Vector2d<units::length::meter_t> point, RoadLaneInterface* lane) noexcept :
         point{point}, lane{lane} {}
 
     BorderPoint() = default;
@@ -27,14 +27,14 @@ struct BorderPoint
     BorderPoint& operator=(const BorderPoint&) = default;
     BorderPoint& operator=(BorderPoint&&) = default;
 
-    Common::Vector2d point;
+    Common::Vector2d<units::length::meter_t> point;
     RoadLaneInterface *lane; //!This is needed for later adding the point to this lane
 };
 
 //! This struct represents the boundary points of all lanes (including lane 0) at one s coordinate (i.e. one joint)
 struct BorderPoints
 {
-    double s;
+    units::length::meter_t s;
     std::vector<BorderPoint> points;
 
     //! Returns the highest squared lateral error of this joint to the line(s) defined by two other joints
@@ -45,8 +45,8 @@ struct BorderPoints
 struct SampledGeometry
 {
     std::vector<BorderPoints> borderPoints;
-    double startHeading; //!This is needed for calculating the curvature of the first joint
-    double endHeading; //!This is needed for calculating the curvature of the last joint
+    units::angle::radian_t startHeading; //!This is needed for calculating the curvature of the first joint
+    units::angle::radian_t endHeading; //!This is needed for calculating the curvature of the last joint
 
     //! Combine this SampledGeometry with another, that starts where this ends.
     //!
@@ -58,17 +58,17 @@ struct SampledGeometry
 struct LaneJoint
 {
     RoadLaneInterface* lane;
-    Common::Vector2d left{};
-    Common::Vector2d center{};
-    Common::Vector2d right{};
-    double heading{0.0};
-    double curvature{0.0};
+    Common::Vector2d<units::length::meter_t> left{};
+    Common::Vector2d<units::length::meter_t> center{};
+    Common::Vector2d<units::length::meter_t> right{};
+    units::angle::radian_t heading{0.0};
+    units::curvature::inverse_meter_t curvature{0.0};
 };
 
 //! This struct contains all information calculated by the JointBuilder for one joint
 struct Joint
 {
-    double s;
+    units::length::meter_t s;
     std::map<int, LaneJoint> laneJoints;
 };
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/LaneStream.cpp b/sim/src/core/opSimulation/modules/World_OSI/LaneStream.cpp
index 61290d0338c0acd7910fcf4da68a26a1c24d93b0..fe14d4c07201b65c9f136b5be3504cf12fbd3f39 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/LaneStream.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/LaneStream.cpp
@@ -18,7 +18,7 @@ LaneStream::LaneStream(std::vector<LaneStreamElement> elements) :
 
 StreamPosition LaneStream::GetStreamPosition(const GlobalRoadPosition &roadPosition) const
 {
-    StreamPosition streamPosition {-1, 0};
+    StreamPosition streamPosition {-1_m, 0_m};
 
     for (const auto& element : elements)
     {
@@ -28,7 +28,8 @@ StreamPosition LaneStream::GetStreamPosition(const GlobalRoadPosition &roadPosit
         {
             streamPosition.s = element.GetStreamPosition(roadPosition.roadPosition.s - element.lane->GetDistance(OWL::MeasurementPoint::RoadStart));
             streamPosition.t = roadPosition.roadPosition.t * (element.inStreamDirection ? 1 : -1);
-            streamPosition.hdg = CommonHelper::SetAngleToValidRange(roadPosition.roadPosition.hdg + (element.inStreamDirection ? 0 : M_PI));
+            auto test = element.inStreamDirection ? units::angle::radian_t(0) : units::angle::radian_t(M_PI);
+            streamPosition.hdg = CommonHelper::SetAngleToValidRange(roadPosition.roadPosition.hdg + (element.inStreamDirection ? 0_rad : units::angle::radian_t(M_PI)));
         }
     }
     return streamPosition;
@@ -46,7 +47,7 @@ GlobalRoadPosition LaneStream::GetRoadPosition(const StreamPosition &streamPosit
             globalRoadPosition.laneId = element.lane->GetOdId();
             globalRoadPosition.roadPosition.s = element.lane->GetDistance(OWL::MeasurementPoint::RoadStart) + element.GetElementPosition(streamPosition.s);
             globalRoadPosition.roadPosition.t = streamPosition.t * (element.inStreamDirection ? 1 : -1);
-            globalRoadPosition.roadPosition.hdg = CommonHelper::SetAngleToValidRange(streamPosition.hdg + (element.inStreamDirection ? 0 : M_PI));
+            globalRoadPosition.roadPosition.hdg = CommonHelper::SetAngleToValidRange(streamPosition.hdg + (element.inStreamDirection ? 0_rad : units::angle::radian_t(M_PI)));
         }
     }
 
@@ -142,22 +143,22 @@ std::optional<StreamPosition> LaneStream::GetStreamPosition(const WorldObjectInt
         {
             const auto s = element.GetStreamPosition(objectPosition.value().roadPosition.s - element.lane->GetDistance(OWL::MeasurementPoint::RoadStart));
             const auto t = objectPosition.value().roadPosition.t * (element.inStreamDirection ? 1 : -1);
-            const auto hdg = CommonHelper::SetAngleToValidRange(objectPosition.value().roadPosition.hdg + (element.inStreamDirection ? 0 : M_PI));
+            const auto hdg = CommonHelper::SetAngleToValidRange(objectPosition.value().roadPosition.hdg + (element.inStreamDirection ? 0_rad : units::angle::radian_t(M_PI)));
             return StreamPosition{s, t, hdg};
         }
     }
     return std::nullopt;
 }
 
-double LaneStream::GetLength() const
+units::length::meter_t LaneStream::GetLength() const
 {
     return elements.back().EndS();
 }
 
-std::vector<std::pair<double, LaneType>> LaneStream::GetLaneTypes() const
+std::vector<std::pair<units::length::meter_t, LaneType>> LaneStream::GetLaneTypes() const
 {
     LaneType lastLaneType{LaneType::Undefined};
-    std::vector<std::pair<double, LaneType>> laneTypes;
+    std::vector<std::pair<units::length::meter_t, LaneType>> laneTypes;
     for (const auto& element : elements)
     {
         if(element.lane->GetLaneType() != lastLaneType)
diff --git a/sim/src/core/opSimulation/modules/World_OSI/LaneStream.h b/sim/src/core/opSimulation/modules/World_OSI/LaneStream.h
index 364d675b2161d6a73ba1ebe89a08c4807c8fd6fe..50ca43fbaaa9169b24f67fb5d13879b0e6af4412 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/LaneStream.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/LaneStream.h
@@ -18,16 +18,18 @@
 #include "include/streamInterface.h"
 #include "OWL/DataTypes.h"
 
+using namespace units::literals;
+
 //! This class represents one element of a LaneStream.
 struct LaneStreamElement
 {
     const OWL::Interfaces::Lane* lane;  //!< lane represented by this object
-    double sOffset;         //!< S Offset of the start point of the element from the beginning of the stream
+    units::length::meter_t sOffset;         //!< S Offset of the start point of the element from the beginning of the stream
     bool inStreamDirection; //!< Specifies whether the direction of the element is the same as the direction of the stream
 
     LaneStreamElement() = default;
 
-    LaneStreamElement(const OWL::Interfaces::Lane* lane, double sOffset, bool inStreamDirection) :
+    LaneStreamElement(const OWL::Interfaces::Lane* lane, units::length::meter_t sOffset, bool inStreamDirection) :
         lane(lane),
         sOffset(sOffset),
         inStreamDirection(inStreamDirection)
@@ -42,7 +44,7 @@ struct LaneStreamElement
     //!
     //! \param elementPosition position relative to the start of the element
     //! \return position relative to the start of the stream
-    double GetStreamPosition(double elementPosition) const
+    units::length::meter_t GetStreamPosition(units::length::meter_t elementPosition) const
     {
         return sOffset + (inStreamDirection ? elementPosition : -elementPosition);
     }
@@ -51,21 +53,21 @@ struct LaneStreamElement
     //!
     //! \param streamPosition position relative to the start of the stream
     //! \return position relative to the start of the element
-    double GetElementPosition(double streamPosition) const
+    units::length::meter_t GetElementPosition(units::length::meter_t streamPosition) const
     {
         return inStreamDirection ? streamPosition - sOffset : sOffset - streamPosition;
     }
 
     //! Returns the stream position of the start of the lane
-    double StartS() const
+    units::length::meter_t StartS() const
     {
-        return sOffset - (inStreamDirection ? 0 : lane->GetLength());
+        return sOffset - (inStreamDirection ? 0_m : lane->GetLength());
     }
 
     //! Returns the stream position of the end of the lane
-    double EndS() const
+    units::length::meter_t EndS() const
     {
-        return sOffset + (inStreamDirection ? lane->GetLength() : 0);
+        return sOffset + (inStreamDirection ? lane->GetLength() : 0_m);
     }
 };
 
@@ -84,9 +86,9 @@ public:
 
     virtual std::optional<StreamPosition> GetStreamPosition(const WorldObjectInterface* object, const ObjectPoint& point) const override;
 
-    virtual double GetLength() const override;
+    virtual units::length::meter_t GetLength() const override;
 
-    virtual std::vector<std::pair<double, LaneType>> GetLaneTypes() const override;
+    virtual std::vector<std::pair<units::length::meter_t, LaneType>> GetLaneTypes() const override;
 
 private:
     const std::vector<LaneStreamElement> elements;
diff --git a/sim/src/core/opSimulation/modules/World_OSI/Localization.cpp b/sim/src/core/opSimulation/modules/World_OSI/Localization.cpp
index 2667b0c1f2bf3a0253e08f57110825113f5f7c8d..230245ce965467212e91ca2c7e2e923ee3c52a0b 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/Localization.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/Localization.cpp
@@ -7,29 +7,27 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
-#include <exception>
-#include <numeric>
-
 #include "Localization.h"
 
 #include <boost/function_output_iterator.hpp>
+#include <exception>
+#include <numeric>
 
 namespace World {
 namespace Localization {
 
-std::function<void (const RTreeElement&)>  LocateOnGeometryElement(const OWL::Interfaces::WorldData& worldData,
-                                                              const std::vector<Common::Vector2d>& objectBoundary,
-                                                              const Common::Vector2d& referencePoint,
-                                                              const double& hdg,
-                                                              LocatedObject& locatedObject)
+std::function<void(const RTreeElement &)> LocateOnGeometryElement(const OWL::Interfaces::WorldData &worldData,
+                                                                  const std::vector<Common::Vector2d<units::length::meter_t>> &objectBoundary,
+                                                                  const Common::Vector2d<units::length::meter_t> &referencePoint,
+                                                                  const units::angle::radian_t &hdg,
+                                                                  LocatedObject &locatedObject)
 {
-    return  [&](auto const& value)
-    {
-        const LocalizationElement& localizationElement = *value.second;
+    return [&](auto const &value) {
+        const LocalizationElement &localizationElement = *value.second;
 
         auto intersection = CommonHelper::IntersectionCalculation::GetIntersectionPoints(localizationElement.polygon, objectBoundary, false);
 
-        if(intersection.size() < 3)
+        if (intersection.size() < 3)
         {
             //Actual polygons do not intersect -> Skip this GeometryElement
             return;
@@ -37,7 +35,7 @@ std::function<void (const RTreeElement&)>  LocateOnGeometryElement(const OWL::In
 
         WorldToRoadCoordinateConverter converter(localizationElement);
 
-        const OWL::Interfaces::Lane* lane = localizationElement.lane;
+        const OWL::Interfaces::Lane *lane = localizationElement.lane;
         const auto laneOdId = lane->GetOdId();
         const auto roadId = lane->GetRoad().GetId();
 
@@ -47,10 +45,10 @@ std::function<void (const RTreeElement&)>  LocateOnGeometryElement(const OWL::In
             locatedObject.referencePoint[roadId] = GlobalRoadPosition(roadId, laneOdId, s, t, yaw);
         }
 
-        for (const auto& point : intersection)
+        for (const auto &point : intersection)
         {
-             auto [s, t, yaw] = converter.GetRoadCoordinate(point, hdg);
-             assert(s >= 0.0);
+            auto [s, t, yaw] = converter.GetRoadCoordinate(point, hdg);
+            assert(s >= 0.0_m);
 
              auto& laneOverlap = locatedObject.laneOverlaps[lane];
              if (s < laneOverlap.sMin.roadPosition.s)
@@ -73,32 +71,31 @@ std::function<void (const RTreeElement&)>  LocateOnGeometryElement(const OWL::In
     };
 }
 
-LocatedObject LocateOnGeometryElements(const bg_rTree& rTree, const OWL::Interfaces::WorldData& worldData, const std::vector<Common::Vector2d>& agentBoundary, CoarseBoundingBox theAgent,
-                        const Common::Vector2d referencePoint, double hdg)
+LocatedObject LocateOnGeometryElements(const bg_rTree &rTree, const OWL::Interfaces::WorldData &worldData, const std::vector<Common::Vector2d<units::length::meter_t>> &agentBoundary, CoarseBoundingBox theAgent,
+                                       const Common::Vector2d<units::length::meter_t> referencePoint, units::angle::radian_t hdg)
 {
- LocatedObject locatedObject;
- rTree.query(bgi::intersects(theAgent),
-                         boost::make_function_output_iterator(LocateOnGeometryElement(worldData, agentBoundary, referencePoint, hdg, locatedObject)));
+    LocatedObject locatedObject;
+    rTree.query(bgi::intersects(theAgent),
+                boost::make_function_output_iterator(LocateOnGeometryElement(worldData, agentBoundary, referencePoint, hdg, locatedObject)));
 
- return locatedObject;
+    return locatedObject;
 }
 
-std::function<void (const RTreeElement&)> LocateOnGeometryElement(const OWL::Interfaces::WorldData& worldData, const Common::Vector2d& point,
-                                                                  const double& hdg, GlobalRoadPositions& result)
+std::function<void(const RTreeElement &)> LocateOnGeometryElement(const OWL::Interfaces::WorldData &worldData, const Common::Vector2d<units::length::meter_t> &point,
+                                                                  const units::angle::radian_t &hdg, GlobalRoadPositions &result)
 {
-    return  [&](auto const& value)
-    {
-        const LocalizationElement& localizationElement = *value.second;
+    return [&](auto const &value) {
+        const LocalizationElement &localizationElement = *value.second;
 
         boost::geometry::de9im::mask mask("*****F***"); // within
-        if (!boost::geometry::relate(point_t{point.x, point.y}, localizationElement.boost_polygon, mask)) //Check wether point is inside polygon
+        if (!boost::geometry::relate(point_t{point.x.value(), point.y.value()}, localizationElement.boost_polygon, mask)) //Check wether point is inside polygon
         {
             return;
         }
 
         WorldToRoadCoordinateConverter converter(localizationElement);
 
-        const OWL::Interfaces::Lane* lane = localizationElement.lane;
+        const OWL::Interfaces::Lane *lane = localizationElement.lane;
         const auto laneOdId = lane->GetOdId();
         const auto roadId = lane->GetRoad().GetId();
 
@@ -110,38 +107,36 @@ std::function<void (const RTreeElement&)> LocateOnGeometryElement(const OWL::Int
     };
 }
 
-GlobalRoadPositions LocateOnGeometryElements(const bg_rTree& rTree, const OWL::Interfaces::WorldData& worldData,
-                           const Common::Vector2d point, double hdg)
+GlobalRoadPositions LocateOnGeometryElements(const bg_rTree &rTree, const OWL::Interfaces::WorldData &worldData,
+                                             const Common::Vector2d<units::length::meter_t> point, units::angle::radian_t hdg)
 {
     GlobalRoadPositions result;
     CoarseBoundingBox box = GetSearchBox({point});
     rTree.query(bgi::intersects(box),
-                            boost::make_function_output_iterator(LocateOnGeometryElement(worldData, point, hdg, result)));
+                boost::make_function_output_iterator(LocateOnGeometryElement(worldData, point, hdg, result)));
 
     return result;
 }
 
-polygon_t GetBoundingBox(double x, double y, double length, double width, double rotation, double center)
+polygon_t GetBoundingBox(units::length::meter_t x, units::length::meter_t y, units::length::meter_t length, units::length::meter_t width, units::angle::radian_t rotation, units::length::meter_t center)
 {
-    double halfWidth = width / 2;
+    double halfWidth = units::unit_cast<double>(width / 2);
 
-    point_t boxPoints[]
-    {
-        point_t{center - length, -halfWidth},
-        point_t{center - length,  halfWidth},
-        point_t{center,           halfWidth},
-        point_t{center,          -halfWidth},
-        point_t{center - length, -halfWidth}
-    };
+    point_t boxPoints[]{
+        point_t{units::unit_cast<double>(center - length), -halfWidth},
+        point_t{units::unit_cast<double>(center - length), halfWidth},
+        point_t{units::unit_cast<double>(center), halfWidth},
+        point_t{units::unit_cast<double>(center), -halfWidth},
+        point_t{units::unit_cast<double>(center - length), -halfWidth}};
 
     polygon_t box;
     polygon_t boxTemp;
     bg::append(box, boxPoints);
 
-    bt::translate_transformer<double, 2, 2> translate(x, y);
+    bt::translate_transformer<double, 2, 2> translate(units::unit_cast<double>(x), units::unit_cast<double>(y));
 
     // rotation in mathematical negativ order (boost) -> invert to match
-    bt::rotate_transformer<bg::radian, double, 2, 2> rotate(-rotation);
+    bt::rotate_transformer<bg::radian, double, 2, 2> rotate(-rotation.value());
 
     bg::transform(box, boxTemp, rotate);
     bg::transform(boxTemp, box, translate);
@@ -149,36 +144,36 @@ polygon_t GetBoundingBox(double x, double y, double length, double width, double
     return box;
 }
 
-void CreateLaneAssignments(OWL::Interfaces::WorldObject& object, const std::map<const OWL::Interfaces::Lane*, OWL::LaneOverlap >& laneOverlaps)
+void CreateLaneAssignments(OWL::Interfaces::WorldObject &object, const std::map<const OWL::Interfaces::Lane *, OWL::LaneOverlap> &laneOverlaps)
 {
     for (auto [lane, laneOverlap] : laneOverlaps)
     {
-        auto movingObject = dynamic_cast<OWL::MovingObject*>(&object);
+        auto movingObject = dynamic_cast<OWL::MovingObject *>(&object);
         if (movingObject)
         {
-            const_cast<OWL::Interfaces::Lane*>(lane)->AddMovingObject(*movingObject, laneOverlap);
+            const_cast<OWL::Interfaces::Lane *>(lane)->AddMovingObject(*movingObject, laneOverlap);
             object.AddLaneAssignment(*lane);
             continue;
         }
 
-        auto stationaryObject = dynamic_cast<OWL::StationaryObject*>(&object);
+        auto stationaryObject = dynamic_cast<OWL::StationaryObject *>(&object);
         if (stationaryObject)
         {
-            const_cast<OWL::Interfaces::Lane*>(lane)->AddStationaryObject(*stationaryObject, laneOverlap);
+            const_cast<OWL::Interfaces::Lane *>(lane)->AddStationaryObject(*stationaryObject, laneOverlap);
             object.AddLaneAssignment(*lane);
             continue;
         }
     }
 }
 
-Result Localizer::BuildResult(const LocatedObject& locatedObject) const
+Result Localizer::BuildResult(const LocatedObject &locatedObject) const
 {
     std::set<int> touchedLaneIds;
     RoadIntervals touchedRoads;
 
     bool isOnRoute = !locatedObject.referencePoint.empty();
 
-    for (const auto& [lane, laneOverlap] : locatedObject.laneOverlaps)
+    for (const auto &[lane, laneOverlap] : locatedObject.laneOverlaps)
     {
         std::string roadId = lane->GetRoad().GetId();
         touchedRoads[roadId].lanes.push_back(lane->GetOdId());
@@ -209,48 +204,48 @@ Result Localizer::BuildResult(const LocatedObject& locatedObject) const
     return result;
 }
 
-Localizer::Localizer(const OWL::Interfaces::WorldData& worldData) :
+Localizer::Localizer(const OWL::Interfaces::WorldData &worldData) :
     worldData(worldData)
 {
 }
 
 void Localizer::Init()
 {
-    for (const auto& [laneId, lane] : worldData.GetLanes())
+    for (const auto &[laneId, lane] : worldData.GetLanes())
     {
-        for (const auto& laneGeometryElement : lane->GetLaneGeometryElements())
+        for (const auto &laneGeometryElement : lane->GetLaneGeometryElements())
         {
             elements.emplace_back(*laneGeometryElement);
         }
     }
-    for (const auto& element : elements)
+    for (const auto &element : elements)
     {
         rTree.insert(std::make_pair(element.search_box, &element));
     }
 }
 
-Result Localizer::Locate(const polygon_t& boundingBox, OWL::Interfaces::WorldObject& object) const
+Result Localizer::Locate(const polygon_t &boundingBox, OWL::Interfaces::WorldObject &object) const
 {
-    const auto& referencePointPosition = object.GetReferencePointPosition();
-    const auto& orientation = object.GetAbsOrientation();
+    const auto &referencePointPosition = object.GetReferencePointPosition();
+    const auto &orientation = object.GetAbsOrientation();
 
-    std::vector<Common::Vector2d> agentBoundary;
+    std::vector<Common::Vector2d<units::length::meter_t>> agentBoundary;
     for (point_t point : boundingBox.outer())
     {
-        agentBoundary.emplace_back(bg::get<0>(point), bg::get<1>(point));
+        agentBoundary.emplace_back(units::length::meter_t(bg::get<0>(point)), units::length::meter_t(bg::get<1>(point)));
     }
     agentBoundary.pop_back();
 
     CoarseBoundingBox searchBox = GetSearchBox(agentBoundary);
 
-    Common::Vector2d referencePoint{referencePointPosition.x, referencePointPosition.y};
+    Common::Vector2d<units::length::meter_t> referencePoint{referencePointPosition.x, referencePointPosition.y};
     if (object.Is<OWL::Interfaces::MovingObject>())
     {
-        const auto& movingObject = object.As<OWL::Interfaces::MovingObject>();
-        double distanceRefToFront = movingObject->GetDistanceReferencePointToLeadingEdge();
+        const auto &movingObject = object.As<OWL::Interfaces::MovingObject>();
+        auto distanceRefToFront = movingObject->GetDistanceReferencePointToLeadingEdge();
     }
 
-    const auto& locatedObject = LocateOnGeometryElements(rTree,
+    const auto &locatedObject = LocateOnGeometryElements(rTree,
                                                          worldData,
                                                          agentBoundary,
                                                          searchBox,
@@ -266,7 +261,7 @@ Result Localizer::Locate(const polygon_t& boundingBox, OWL::Interfaces::WorldObj
     return result;
 }
 
-GlobalRoadPositions Localizer::Locate(const Common::Vector2d& point, const double& hdg) const
+GlobalRoadPositions Localizer::Locate(const Common::Vector2d<units::length::meter_t> &point, const units::angle::radian_t &hdg) const
 {
     return LocateOnGeometryElements(rTree,
                                     worldData,
@@ -274,10 +269,10 @@ GlobalRoadPositions Localizer::Locate(const Common::Vector2d& point, const doubl
                                     hdg);
 }
 
-void Localizer::Unlocate(OWL::Interfaces::WorldObject& object) const
+void Localizer::Unlocate(OWL::Interfaces::WorldObject &object) const
 {
     object.ClearLaneAssignments();
 }
 
-}
-}
+} // namespace Localization
+} // namespace World
diff --git a/sim/src/core/opSimulation/modules/World_OSI/Localization.h b/sim/src/core/opSimulation/modules/World_OSI/Localization.h
index 3e863b3095d2e7072e8dc31e7bf88184361a6a87..e7413efa3c55d23486df3f35bf795285e71f6352 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/Localization.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/Localization.h
@@ -71,9 +71,9 @@ struct LocatedObject
 //! \return         function that the boost r-tree calls for every LaneGeometryElement, that possibly intersects with the object
 //!
 std::function<void (const RTreeElement&)> LocateOnGeometryElement(const OWL::Interfaces::WorldData& worldData,
-                                                             const std::vector<Common::Vector2d>& objectBoundary,
-                                                             const Common::Vector2d& referencePoint,
-                                                             const double& hdg,
+                                                             const std::vector<Common::Vector2d<units::length::meter_t>>& objectBoundary,
+                                                             const Common::Vector2d<units::length::meter_t>& referencePoint,
+                                                             const units::angle::radian_t& hdg,
                                                              LocatedObject& locatedObject);
 
 //! Calculates the coordinates of the point on the GeometryElement and stores the result in the map
@@ -84,11 +84,11 @@ std::function<void (const RTreeElement&)> LocateOnGeometryElement(const OWL::Int
 //! \param result    Output of the function is stored here
 //! \return         function that the boost r-tree calls for every LaneGeometryElement, that possibly intersects with the object
 std::function<void (const RTreeElement&)> LocateOnGeometryElement(const OWL::Interfaces::WorldData& worldData,
-                                                             const Common::Vector2d& point,
-                                                             const double& hdg,
+                                                             const Common::Vector2d<units::length::meter_t>& point,
+                                                             const units::angle::radian_t& hdg,
                                                              GlobalRoadPositions& result);
 
-polygon_t GetBoundingBox(double x, double y, double length, double width, double rotation, double center);
+polygon_t GetBoundingBox(units::length::meter_t x, units::length::meter_t y, units::length::meter_t length, units::length::meter_t width, units::angle::radian_t rotation, units::length::meter_t center);
 
 //! Assigns this object to all lanes it was located on, so that the result of Lane::GetWorldObjects
 //! contains this object
@@ -103,7 +103,7 @@ public:
 
     Result Locate(const polygon_t& boundingBox, OWL::Interfaces::WorldObject& object) const;
 
-    GlobalRoadPositions Locate(const Common::Vector2d& point, const double& hdg) const;
+    GlobalRoadPositions Locate(const Common::Vector2d<units::length::meter_t>& point, const units::angle::radian_t& hdg) const;
 
     void Unlocate(OWL::Interfaces::WorldObject& object) const;
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/LocalizationElement.h b/sim/src/core/opSimulation/modules/World_OSI/LocalizationElement.h
index 9a8946f8da209778ebc556aef9ffff42c6b7eca9..581905efdc4ddfc1c07106c17933cb39274e86a5 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/LocalizationElement.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/LocalizationElement.h
@@ -21,7 +21,7 @@ namespace World {
 namespace Localization {
 
 //! Returns a discrete search box for the rTree query in millimeters
-static CoarseBoundingBox GetSearchBox(std::vector<Common::Vector2d> corners)
+static CoarseBoundingBox GetSearchBox(std::vector<Common::Vector2d<units::length::meter_t>> corners)
 {
     auto x_min = std::numeric_limits<int>::max();
     auto x_max = std::numeric_limits<int>::min();
@@ -31,10 +31,10 @@ static CoarseBoundingBox GetSearchBox(std::vector<Common::Vector2d> corners)
     //searchBox is in millimeters
     for (const auto& point: corners)
     {
-        x_min = std::min(x_min, static_cast<int>(std::round(point.x * 1000)));
-        x_max = std::max(x_max, static_cast<int>(std::round(point.x * 1000)));
-        y_min = std::min(y_min, static_cast<int>(std::round(point.y * 1000)));
-        y_max = std::max(y_max, static_cast<int>(std::round(point.y * 1000)));
+        x_min = std::min(x_min, static_cast<int>(std::round(point.x.value() * 1000)));
+        x_max = std::max(x_max, static_cast<int>(std::round(point.x.value() * 1000)));
+        y_min = std::min(y_min, static_cast<int>(std::round(point.y.value() * 1000)));
+        y_max = std::max(y_max, static_cast<int>(std::round(point.y.value() * 1000)));
     }
     return CoarseBoundingBox{DiscretePoint{x_min, y_min}, DiscretePoint{x_max, y_max}};
 }
@@ -42,16 +42,16 @@ static CoarseBoundingBox GetSearchBox(std::vector<Common::Vector2d> corners)
 //! This struct contains all the information about a LaneGeometryElement that is needed by the Localizer
 struct LocalizationElement
 {
-    LocalizationElement(const OWL::Primitive::LaneGeometryElement& element) :
+    LocalizationElement(const OWL::Primitive::LaneGeometryElement &element) :
         laneGeometryElement{element},
         lane{element.lane},
         polygon{element.joints.current.points.left, element.joints.next.points.left, element.joints.next.points.right, element.joints.current.points.right},
-        boost_polygon{{{element.joints.current.points.left.x, element.joints.current.points.left.y},
-                       {element.joints.next.points.left.x, element.joints.next.points.left.y},
-                       {element.joints.next.points.right.x, element.joints.next.points.right.y},
-                       {element.joints.current.points.right.x, element.joints.current.points.right.y},
-                       {element.joints.current.points.left.x, element.joints.current.points.left.y}}},
-        search_box {GetSearchBox(polygon)},
+        boost_polygon{{{element.joints.current.points.left.x.value(), element.joints.current.points.left.y.value()},
+                       {element.joints.next.points.left.x.value(), element.joints.next.points.left.y.value()},
+                       {element.joints.next.points.right.x.value(), element.joints.next.points.right.y.value()},
+                       {element.joints.current.points.right.x.value(), element.joints.current.points.right.y.value()},
+                       {element.joints.current.points.left.x.value(), element.joints.current.points.left.y.value()}}},
+        search_box{GetSearchBox(polygon)},
         referenceVector{element.joints.next.points.reference - element.joints.current.points.reference},
         referenceScale{(element.joints.next.sOffset - element.joints.current.sOffset) / referenceVector.Length()},
         tAxisCenter{CommonHelper::CalculateIntersection(element.joints.current.points.left, element.joints.current.points.right - element.joints.current.points.left,
@@ -72,12 +72,12 @@ struct LocalizationElement
 
     const OWL::Primitive::LaneGeometryElement& laneGeometryElement;
     const OWL::Interfaces::Lane* lane;
-    std::vector<Common::Vector2d> polygon;
+    std::vector<Common::Vector2d<units::length::meter_t>> polygon;
     polygon_t boost_polygon;
     const CoarseBoundingBox search_box; //!< Box for r-tree in millimeters
-    Common::Vector2d referenceVector; //!< Vector from reference point of current joint to reference point of next joint
+    Common::Vector2d<units::length::meter_t> referenceVector; //!< Vector from reference point of current joint to reference point of next joint
     double referenceScale; //!< Factor between the actual length of the referenceVector and the s coordinate distance
-    std::optional<Common::Vector2d> tAxisCenter; //!< Intersection point of all t-axis or nullopt if t-axis are paralel
+    std::optional<Common::Vector2d<units::length::meter_t>> tAxisCenter; //!< Intersection point of all t-axis or nullopt if t-axis are paralel
 };
 
 } // namespace Localization
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/DataTypes.cpp b/sim/src/core/opSimulation/modules/World_OSI/OWL/DataTypes.cpp
index c21abb8e7b1d7583503757be72cfae5645f12e7f..bfdf8039c20348524d3e7d245f15b3034dcda3f1 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/DataTypes.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/DataTypes.cpp
@@ -15,25 +15,25 @@
 //! @brief This file provides the basic datatypes of the osi world layer (OWL)
 //-----------------------------------------------------------------------------
 
+#include "OWL/DataTypes.h"
+
 #include <exception>
 #include <list>
 #include <memory>
 #include <string>
 #include <tuple>
-#include <qglobal.h>
 
-#include "include/roadInterface/roadInterface.h"
-#include "include/roadInterface/roadLaneInterface.h"
-#include "include/roadInterface/roadLaneSectionInterface.h"
+#include <qglobal.h>
 
-#include "OWL/DataTypes.h"
 #include "OWL/LaneGeometryElement.h"
 #include "OWL/LaneGeometryJoint.h"
 #include "OWL/Primitives.h"
-
-#include "osi3/osi_groundtruth.pb.h"
 #include "WorldObjectAdapter.h"
 #include "OsiDefaultValues.h"
+#include "include/roadInterface/roadInterface.h"
+#include "include/roadInterface/roadLaneInterface.h"
+#include "include/roadInterface/roadLaneSectionInterface.h"
+#include "osi3/osi_groundtruth.pb.h"
 
 #include "common/hypot.h"
 
@@ -98,14 +98,13 @@ namespace OWL {
             return count;
         }
 
-        double Lane::GetLength() const {
-            return length;
-        }
-
+units::length::meter_t Lane::GetLength() const
+{
+    return length;
+}
 
-        std::tuple<const Primitive::LaneGeometryJoint *, const Primitive::LaneGeometryJoint *>
-        Lane::GetNeighbouringJoints(
-                double distance) const {
+std::tuple<const Primitive::LaneGeometryJoint *, const Primitive::LaneGeometryJoint *> Lane::GetNeighbouringJoints(
+    units::length::meter_t distance) const {
             const Primitive::LaneGeometryJoint *nextJoint = nullptr;
             const Primitive::LaneGeometryJoint *prevJoint = nullptr;
 
@@ -115,7 +114,6 @@ namespace OWL {
                                                        return joint.sOffset > distance;
                                                    });
 
-
             if (nextJointIt != laneGeometryJoints.cend()) {
                 nextJoint = &(*nextJointIt);
             }
@@ -128,10 +126,9 @@ namespace OWL {
             return {prevJoint, nextJoint};
         }
 
-        const Primitive::LaneGeometryJoint::Points Lane::GetInterpolatedPointsAtDistance(double distance) const {
-            Primitive::LaneGeometryJoint::Points interpolatedPoints{{0.0, 0.0},
-                                                                    {0.0, 0.0},
-                                                                    {0.0, 0.0}};
+const Primitive::LaneGeometryJoint::Points Lane::GetInterpolatedPointsAtDistance(units::length::meter_t distance) const
+{
+    Primitive::LaneGeometryJoint::Points interpolatedPoints{{0.0_m, 0.0_m}, {0.0_m, 0.0_m}, {0.0_m, 0.0_m}};
             const Primitive::LaneGeometryJoint *prevJoint;
             const Primitive::LaneGeometryJoint *nextJoint;
             std::tie(prevJoint, nextJoint) = GetNeighbouringJoints(distance);
@@ -141,8 +138,8 @@ namespace OWL {
             } else if (prevJoint && !nextJoint) {
                 return prevJoint->points;
             } else if (nextJoint && !prevJoint) {
-                return nextJoint->points;
-            }
+        return nextJoint->points;
+    }
 
             double interpolationFactor = (distance - prevJoint->sOffset) / (nextJoint->sOffset -
                                                                             prevJoint->sOffset);
@@ -158,54 +155,57 @@ namespace OWL {
             return interpolatedPoints;
         }
 
-        double Lane::GetCurvature(double distance) const {
+units::curvature::inverse_meter_t Lane::GetCurvature(units::length::meter_t distance) const
+{
             const Primitive::LaneGeometryJoint *prevJoint;
             const Primitive::LaneGeometryJoint *nextJoint;
             std::tie(prevJoint, nextJoint) = GetNeighbouringJoints(distance);
 
             if (!prevJoint && !nextJoint) {
-                return 0.0;
+        return 0.0_i_m;
             } else if (prevJoint && !nextJoint) {
                 return prevJoint->curvature;
             } else if (nextJoint && !prevJoint) {
-                return 0.0;
-            }
+        return 0.0_i_m;
+    }
 
             double interpolationFactor = (distance - prevJoint->sOffset) / (nextJoint->sOffset -
                                                                             prevJoint->sOffset);
-            double interpolatedCurvature = (1 - interpolationFactor) * prevJoint->curvature + interpolationFactor *
+    units::curvature::inverse_meter_t interpolatedCurvature = (1 - interpolationFactor) * prevJoint->curvature + interpolationFactor *
                                                                                               nextJoint->curvature;
 
             return interpolatedCurvature;
         }
 
-        double Lane::GetWidth(double distance) const {
+units::length::meter_t Lane::GetWidth(units::length::meter_t distance) const
+{
             const Primitive::LaneGeometryJoint *prevJoint;
             const Primitive::LaneGeometryJoint *nextJoint;
             std::tie(prevJoint, nextJoint) = GetNeighbouringJoints(distance);
 
             if (!prevJoint && !nextJoint) {
-                return 0.0;
+        return 0.0_m;
             } else if (prevJoint && !nextJoint) {
                 return (prevJoint->points.left - prevJoint->points.right).Length();
             } else if (nextJoint && !prevJoint) {
-                return 0.0;
-            }
+        return 0.0_m;
+    }
 
-            double interpolationFactor = (distance - prevJoint->sOffset) / (nextJoint->sOffset -
-                                                                            prevJoint->sOffset);
-            double nextWidth = (nextJoint->points.left - nextJoint->points.right).Length();
-            double prevWidth = (prevJoint->points.left - prevJoint->points.right).Length();
-            double interpolatedWidth = (1.0 - interpolationFactor) * prevWidth + interpolationFactor * nextWidth;
+    units::dimensionless::scalar_t interpolationFactor = (distance - prevJoint->sOffset) / (nextJoint->sOffset -
+                                                                                            prevJoint->sOffset);
+    units::length::meter_t nextWidth{(nextJoint->points.left - nextJoint->points.right).Length()};
+    units::length::meter_t prevWidth{(prevJoint->points.left - prevJoint->points.right).Length()};
+    units::length::meter_t interpolatedWidth = (1.0 - interpolationFactor) * prevWidth + interpolationFactor * nextWidth;
 
             return interpolatedWidth;
         }
 
-        double Lane::GetDirection(double distance) const {
-            auto[prevJoint, nextJoint] = GetNeighbouringJoints(distance);
+units::angle::radian_t Lane::GetDirection(units::length::meter_t distance) const
+{
+    auto [prevJoint, nextJoint] = GetNeighbouringJoints(distance);
 
             if (!prevJoint) {
-                return 0.0;
+        return 0.0_rad;
             }
 
             return prevJoint->sHdg;
@@ -235,7 +235,7 @@ namespace OWL {
             return laneBoundaries;
         }
 
-        double Lane::GetDistance(MeasurementPoint measurementPoint) const {
+        units::length::meter_t Lane::GetDistance(MeasurementPoint measurementPoint) const {
             if (laneGeometryElements.empty()) {
                 throw std::runtime_error("Unexpected Lane without LaneGeometryElements");
             }
@@ -255,12 +255,11 @@ namespace OWL {
             return laneType;
         }
 
-        bool Lane::Covers(double distance) const {
+bool Lane::Covers(units::length::meter_t distance) const {
             if (GetDistance(MeasurementPoint::RoadStart) <= distance) {
                 return next.empty() ?
                        GetDistance(MeasurementPoint::RoadEnd) > distance :
                        GetDistance(MeasurementPoint::RoadEnd) >= distance;
-
             }
             return false;
         }
@@ -407,12 +406,12 @@ namespace OWL {
             return laneGeometryElements;
         }
 
-        void Lane::AddLaneGeometryJoint(const Common::Vector2d &pointLeft,
-                                        const Common::Vector2d &pointCenter,
-                                        const Common::Vector2d &pointRight,
-                                        double sOffset,
-                                        double curvature,
-                                        double heading) {
+void Lane::AddLaneGeometryJoint(const Common::Vector2d<units::length::meter_t> &pointLeft,
+                                const Common::Vector2d<units::length::meter_t> &pointCenter,
+                                const Common::Vector2d<units::length::meter_t> &pointRight,
+                                units::length::meter_t sOffset,
+                                units::curvature::inverse_meter_t curvature,
+                                units::angle::radian_t heading) {
             Primitive::LaneGeometryJoint newJoint;
 
             newJoint.points.left = pointLeft;
@@ -425,8 +424,8 @@ namespace OWL {
             if (laneGeometryJoints.empty()) {
                 laneGeometryJoints.push_back(newJoint);
                 auto osiCenterpoint = osiLane->mutable_classification()->add_centerline();
-                osiCenterpoint->set_x(pointCenter.x);
-                osiCenterpoint->set_y(pointCenter.y);
+                osiCenterpoint->set_x(pointCenter.x.value());
+                osiCenterpoint->set_y(pointCenter.y.value());
                 return;
             }
 
@@ -442,11 +441,11 @@ namespace OWL {
             laneGeometryElements.push_back(newElement);
             laneGeometryJoints.push_back(newJoint);
             auto osiCenterpoint = osiLane->mutable_classification()->add_centerline();
-            osiCenterpoint->set_x(pointCenter.x);
-            osiCenterpoint->set_y(pointCenter.y);
+            osiCenterpoint->set_x(pointCenter.x.value());
+            osiCenterpoint->set_y(pointCenter.y.value());
         }
 
-        Section::Section(double sOffset) :
+Section::Section(units::length::meter_t sOffset) :
                 sOffset(sOffset) {}
 
         void Section::AddNext(const Interfaces::Section &section) {
@@ -469,7 +468,7 @@ namespace OWL {
             return *road;
         }
 
-        double Section::GetDistance(MeasurementPoint measurementPoint) const {
+        units::length::meter_t Section::GetDistance(MeasurementPoint measurementPoint) const {
             if (measurementPoint == MeasurementPoint::RoadStart) {
                 return GetSOffset();
             }
@@ -479,10 +478,9 @@ namespace OWL {
             }
 
             throw std::invalid_argument("measurement point not within valid bounds");
-
         }
 
-        bool Section::Covers(double distance) const {
+bool Section::Covers(units::length::meter_t distance) const {
             if (GetDistance(MeasurementPoint::RoadStart) <= distance) {
                 return nextSections.empty() ?
                        GetDistance(MeasurementPoint::RoadEnd) >= distance :
@@ -491,9 +489,9 @@ namespace OWL {
             return false;
         }
 
-        bool Section::CoversInterval(double startDistance, double endDistance) const {
-            double sectionStart = GetDistance(MeasurementPoint::RoadStart);
-            double sectionEnd = GetDistance(MeasurementPoint::RoadEnd);
+bool Section::CoversInterval(units::length::meter_t startDistance, units::length::meter_t endDistance) const {
+    auto sectionStart = GetDistance(MeasurementPoint::RoadStart);
+    auto sectionEnd = GetDistance(MeasurementPoint::RoadEnd);
 
             bool startDistanceSmallerSectionEnd = nextSections.empty() ?
                                                   startDistance <= sectionEnd
@@ -508,9 +506,9 @@ namespace OWL {
             return lanes;
         }
 
-        double Section::GetLength() const {
+        units::length::meter_t Section::GetLength() const {
             //All lanes must have equal length, so we simple take the length of first lane
-            return lanes.empty() ? 0.0 : lanes.front()->GetLength();
+            return lanes.empty() ? 0.0_m : lanes.front()->GetLength();
         }
 
         void Section::SetCenterLaneBoundary(std::vector<Id> laneBoundaryId) {
@@ -521,11 +519,10 @@ namespace OWL {
             return centerLaneBoundary;
         }
 
-        double Section::GetSOffset() const {
+        units::length::meter_t Section::GetSOffset() const {
             return sOffset;
         }
 
-
         Road::Road(bool isInStreamDirection, const std::string &id) :
                 isInStreamDirection(isInStreamDirection),
                 id(id) {
@@ -544,8 +541,8 @@ namespace OWL {
             sections.push_back(&section);
         }
 
-        double Road::GetLength() const {
-            double length = 0;
+        units::length::meter_t Road::GetLength() const {
+            units::length::meter_t length{0};
             for (const auto &section: sections) {
                 length += section->GetLength();
             }
@@ -572,9 +569,9 @@ namespace OWL {
             return isInStreamDirection;
         }
 
-        double Road::GetDistance(MeasurementPoint mp) const {
+        units::length::meter_t Road::GetDistance(MeasurementPoint mp) const {
             if (mp == MeasurementPoint::RoadStart) {
-                return 0;
+                return 0_m;
             } else {
                 return GetLength();
             }
@@ -590,38 +587,32 @@ namespace OWL {
             newStationaryObject->CopyFrom(*osiObject);
         }
 
-        Primitive::Dimension StationaryObject::GetDimension() const {
+        mantle_api::Dimension3 StationaryObject::GetDimension() const {
             return GetDimensionFromOsiObject(osiObject);
         }
 
-        Primitive::AbsOrientation StationaryObject::GetAbsOrientation() const {
+mantle_api::Orientation3<units::angle::radian_t> StationaryObject::GetAbsOrientation() const {
             osi3::Orientation3d osiOrientation = osiObject->base().orientation();
-            Primitive::AbsOrientation orientation;
-
-            orientation.yaw = osiOrientation.yaw();
-            orientation.pitch = osiOrientation.pitch();
-            orientation.roll = osiOrientation.roll();
 
-            return orientation;
+    return {units::angle::radian_t(osiOrientation.yaw()),
+            units::angle::radian_t(osiOrientation.pitch()),
+            units::angle::radian_t(osiOrientation.roll())};
         }
 
-        Primitive::AbsPosition StationaryObject::GetReferencePointPosition() const {
+mantle_api::Vec3<units::length::meter_t> StationaryObject::GetReferencePointPosition() const {
             const osi3::Vector3d osiPosition = osiObject->base().position();
-            Primitive::AbsPosition position;
 
-            position.x = osiPosition.x();
-            position.y = osiPosition.y();
-            position.z = osiPosition.z();
-
-            return position;
+    return {units::length::meter_t(osiPosition.x()),
+            units::length::meter_t(osiPosition.y()),
+            units::length::meter_t(osiPosition.z())};
         }
 
-        double StationaryObject::GetAbsVelocityDouble() const {
-            return 0.0;
+units::velocity::meters_per_second_t StationaryObject::GetAbsVelocityDouble() const {
+    return 0.0_mps;
         }
 
-        double StationaryObject::GetAbsAccelerationDouble() const {
-            return 0.0;
+units::acceleration::meters_per_second_squared_t StationaryObject::GetAbsAccelerationDouble() const {
+    return 0.0_mps_sq;
         }
 
         const RoadIntervals &StationaryObject::GetTouchedRoads() const {
@@ -632,28 +623,28 @@ namespace OWL {
             return osiObject->id().value();
         }
 
-        void StationaryObject::SetReferencePointPosition(const Primitive::AbsPosition &newPosition) {
+void StationaryObject::SetReferencePointPosition(const mantle_api::Vec3<units::length::meter_t> &newPosition) {
             osi3::Vector3d *osiPosition = osiObject->mutable_base()->mutable_position();
 
-            osiPosition->set_x(newPosition.x);
-            osiPosition->set_y(newPosition.y);
-            osiPosition->set_z(newPosition.z);
+    osiPosition->set_x(units::unit_cast<double>(newPosition.x));
+    osiPosition->set_y(units::unit_cast<double>(newPosition.y));
+    osiPosition->set_z(units::unit_cast<double>(newPosition.z));
         }
 
-        void StationaryObject::SetDimension(const Primitive::Dimension &newDimension) {
+        void StationaryObject::SetDimension(const mantle_api::Dimension3 &newDimension) {
             osi3::Dimension3d *osiDimension = osiObject->mutable_base()->mutable_dimension();
 
-            osiDimension->set_length(newDimension.length);
-            osiDimension->set_width(newDimension.width);
-            osiDimension->set_height(newDimension.height);
+    osiDimension->set_length(units::unit_cast<double>(newDimension.length));
+    osiDimension->set_width(units::unit_cast<double>(newDimension.width));
+    osiDimension->set_height(units::unit_cast<double>(newDimension.height));
         }
 
-        void StationaryObject::SetAbsOrientation(const Primitive::AbsOrientation &newOrientation) {
+void StationaryObject::SetAbsOrientation(const mantle_api::Orientation3<units::angle::radian_t> &newOrientation) {
             osi3::Orientation3d *osiOrientation = osiObject->mutable_base()->mutable_orientation();
 
-            osiOrientation->set_yaw(newOrientation.yaw);
-            osiOrientation->set_pitch(newOrientation.pitch);
-            osiOrientation->set_roll(newOrientation.roll);
+    osiOrientation->set_yaw(units::unit_cast<double>(newOrientation.yaw));
+    osiOrientation->set_pitch(units::unit_cast<double>(newOrientation.pitch));
+    osiOrientation->set_roll(units::unit_cast<double>(newOrientation.roll));
         }
 
         void StationaryObject::AddLaneAssignment(const Interfaces::Lane &lane) {
@@ -694,12 +685,12 @@ namespace OWL {
 
             const auto baseStationary = osiSign->mutable_main_sign()->mutable_base();
 
-            baseStationary->mutable_position()->set_x(position.xPos);
-            baseStationary->mutable_position()->set_y(position.yPos);
-            baseStationary->mutable_position()->set_z(signal->GetZOffset() + 0.5 * signal->GetHeight());
-            baseStationary->mutable_dimension()->set_width(signal->GetWidth());
-            baseStationary->mutable_dimension()->set_height(signal->GetHeight());
-            baseStationary->mutable_orientation()->set_yaw(position.yawAngle);
+    baseStationary->mutable_position()->set_x(units::unit_cast<double>(position.xPos));
+    baseStationary->mutable_position()->set_y(units::unit_cast<double>(position.yPos));
+    baseStationary->mutable_position()->set_z(units::unit_cast<double>(signal->GetZOffset() + 0.5 * signal->GetHeight()));
+    baseStationary->mutable_dimension()->set_width(units::unit_cast<double>(signal->GetWidth()));
+    baseStationary->mutable_dimension()->set_height(units::unit_cast<double>(signal->GetHeight()));
+    baseStationary->mutable_orientation()->set_yaw(units::unit_cast<double>(position.yawAngle));
 
             const auto mutableOsiClassification = osiSign->mutable_main_sign()->mutable_classification();
             const std::string odType = signal->GetType();
@@ -764,14 +755,14 @@ namespace OWL {
 
             const auto baseStationary = supplementarySign->mutable_base();
 
-            baseStationary->mutable_position()->set_x(position.xPos);
-            baseStationary->mutable_position()->set_y(position.yPos);
-            baseStationary->mutable_position()->set_z(odSignal->GetZOffset() + 0.5 * odSignal->GetHeight());
-            baseStationary->mutable_dimension()->set_width(odSignal->GetWidth());
-            baseStationary->mutable_dimension()->set_height(odSignal->GetHeight());
-            double yaw = position.yawAngle + odSignal->GetHOffset() + (odSignal->GetOrientation() ? 0 : M_PI);
+    baseStationary->mutable_position()->set_x(units::unit_cast<double>(position.xPos));
+    baseStationary->mutable_position()->set_y(units::unit_cast<double>(position.yPos));
+    baseStationary->mutable_position()->set_z(units::unit_cast<double>(odSignal->GetZOffset() + 0.5 * odSignal->GetHeight()));
+    baseStationary->mutable_dimension()->set_width(units::unit_cast<double>(odSignal->GetWidth()));
+    baseStationary->mutable_dimension()->set_height(units::unit_cast<double>(odSignal->GetHeight()));
+    auto yaw = position.yawAngle + odSignal->GetHOffset() + (odSignal->GetOrientation() ? 0_rad : 1_rad * M_PI);
             yaw = CommonHelper::SetAngleToValidRange(yaw);
-            baseStationary->mutable_orientation()->set_yaw(yaw);
+    baseStationary->mutable_orientation()->set_yaw(units::unit_cast<double>(yaw));
 
             if (odSignal->GetType() == "1004") {
                 supplementarySign->mutable_classification()->set_type(
@@ -816,8 +807,7 @@ namespace OWL {
             }
         }
 
-
-        CommonTrafficSign::Entity TrafficSign::GetSpecification(const double relativeDistance) const {
+CommonTrafficSign::Entity TrafficSign::GetSpecification(const units::length::meter_t relativeDistance) const {
             CommonTrafficSign::Entity specification;
 
             specification.distanceToStartOfRoad = s;
@@ -863,18 +853,15 @@ namespace OWL {
             return specification;
         }
 
-        Primitive::AbsPosition TrafficSign::GetReferencePointPosition() const {
+mantle_api::Vec3<units::length::meter_t> TrafficSign::GetReferencePointPosition() const {
             const osi3::Vector3d osiPosition = osiSign->main_sign().base().position();
-            Primitive::AbsPosition position;
 
-            position.x = osiPosition.x();
-            position.y = osiPosition.y();
-            position.z = osiPosition.z();
-
-            return position;
+    return {units::length::meter_t(osiPosition.x()),
+            units::length::meter_t(osiPosition.y()),
+            units::length::meter_t(osiPosition.z())};
         }
 
-        Primitive::Dimension TrafficSign::GetDimension() const {
+        mantle_api::Dimension3 TrafficSign::GetDimension() const {
             return GetDimensionFromOsiObject(&osiSign->main_sign());
         }
 
@@ -901,12 +888,12 @@ namespace OWL {
 
             const auto baseStationary = osiSign->mutable_base();
 
-            baseStationary->mutable_position()->set_x(position.xPos);
-            baseStationary->mutable_position()->set_y(position.yPos);
+    baseStationary->mutable_position()->set_x(units::unit_cast<double>(position.xPos));
+    baseStationary->mutable_position()->set_y(units::unit_cast<double>(position.yPos));
             baseStationary->mutable_position()->set_z(0.0);
-            baseStationary->mutable_dimension()->set_width(signal->GetWidth());
+    baseStationary->mutable_dimension()->set_width(units::unit_cast<double>(signal->GetWidth()));
             baseStationary->mutable_dimension()->set_length(0.5);
-            baseStationary->mutable_orientation()->set_yaw(position.yawAngle);
+    baseStationary->mutable_orientation()->set_yaw(units::unit_cast<double>(position.yawAngle));
 
             const auto mutableOsiClassification = osiSign->mutable_classification();
             const std::string odType = signal->GetType();
@@ -933,14 +920,14 @@ namespace OWL {
 
             const auto baseStationary = osiSign->mutable_base();
 
-            baseStationary->mutable_position()->set_x(position.xPos);
-            baseStationary->mutable_position()->set_y(position.yPos);
+    baseStationary->mutable_position()->set_x(units::unit_cast<double>(position.xPos));
+    baseStationary->mutable_position()->set_y(units::unit_cast<double>(position.yPos));
             baseStationary->mutable_position()->set_z(0.0);
-            baseStationary->mutable_dimension()->set_width(object->GetWidth());
-            baseStationary->mutable_dimension()->set_length(object->GetLength());
-            double yaw = object->GetHdg();
+    baseStationary->mutable_dimension()->set_width(units::unit_cast<double>(object->GetWidth()));
+    baseStationary->mutable_dimension()->set_length(units::unit_cast<double>(object->GetLength()));
+    units::angle::radian_t yaw = object->GetHdg();
             yaw = CommonHelper::SetAngleToValidRange(yaw);
-            baseStationary->mutable_orientation()->set_yaw(yaw);
+    baseStationary->mutable_orientation()->set_yaw(units::unit_cast<double>(yaw));
 
             const auto mutableOsiClassification = osiSign->mutable_classification();
 
@@ -960,7 +947,7 @@ namespace OWL {
             return mapping_succeeded;
         }
 
-        CommonTrafficSign::Entity RoadMarking::GetSpecification(const double relativeDistance) const {
+CommonTrafficSign::Entity RoadMarking::GetSpecification(const units::length::meter_t relativeDistance) const {
             CommonTrafficSign::Entity specification;
 
             specification.distanceToStartOfRoad = s;
@@ -977,18 +964,15 @@ namespace OWL {
             return specification;
         }
 
-        Primitive::AbsPosition RoadMarking::GetReferencePointPosition() const {
+mantle_api::Vec3<units::length::meter_t> RoadMarking::GetReferencePointPosition() const {
             const osi3::Vector3d osiPosition = osiSign->base().position();
-            Primitive::AbsPosition position;
-
-            position.x = osiPosition.x();
-            position.y = osiPosition.y();
-            position.z = osiPosition.z();
 
-            return position;
+    return {units::length::meter_t(osiPosition.x()),
+            units::length::meter_t(osiPosition.y()),
+            units::length::meter_t(osiPosition.z())};
         }
 
-        Primitive::Dimension RoadMarking::GetDimension() const {
+        mantle_api::Dimension3 RoadMarking::GetDimension() const {
             return GetDimensionFromOsiObject(osiSign);
         }
 
@@ -1007,8 +991,7 @@ namespace OWL {
             newRoadMarking->CopyFrom(*osiSign);
         }
 
-        LaneBoundary::LaneBoundary(osi3::LaneBoundary *osiLaneBoundary, double width, double sStart, double sEnd,
-                                   LaneMarkingSide side) :
+LaneBoundary::LaneBoundary(osi3::LaneBoundary *osiLaneBoundary, units::length::meter_t width, units::length::meter_t sStart, units::length::meter_t sEnd, LaneMarkingSide side) :
                 osiLaneBoundary(osiLaneBoundary),
                 sStart(sStart),
                 sEnd(sEnd),
@@ -1020,15 +1003,15 @@ namespace OWL {
             return osiLaneBoundary->id().value();
         }
 
-        double LaneBoundary::GetWidth() const {
+units::length::meter_t LaneBoundary::GetWidth() const {
             return width;
         }
 
-        double LaneBoundary::GetSStart() const {
+units::length::meter_t LaneBoundary::GetSStart() const {
             return sStart;
         }
 
-        double LaneBoundary::GetSEnd() const {
+units::length::meter_t LaneBoundary::GetSEnd() const {
             return sEnd;
         }
 
@@ -1044,24 +1027,24 @@ namespace OWL {
             return side;
         }
 
-        void LaneBoundary::AddBoundaryPoint(const Common::Vector2d &point, double heading) {
-            constexpr double doubleLineDistance = 0.15;
+void LaneBoundary::AddBoundaryPoint(const Common::Vector2d<units::length::meter_t> &point, units::angle::radian_t heading) {
+    constexpr units::length::meter_t doubleLineDistance{0.15};
             auto boundaryPoint = osiLaneBoundary->add_boundary_line();
             switch (side) {
                 case LaneMarkingSide::Single :
-                    boundaryPoint->mutable_position()->set_x(point.x);
-                    boundaryPoint->mutable_position()->set_y(point.y);
+        boundaryPoint->mutable_position()->set_x(point.x.value());
+        boundaryPoint->mutable_position()->set_y(point.y.value());
                     break;
                 case LaneMarkingSide::Left :
-                    boundaryPoint->mutable_position()->set_x(point.x - doubleLineDistance * std::sin(heading));
-                    boundaryPoint->mutable_position()->set_y(point.y + doubleLineDistance * std::cos(heading));
+        boundaryPoint->mutable_position()->set_x(units::unit_cast<double>(point.x - doubleLineDistance * units::math::sin(heading)));
+        boundaryPoint->mutable_position()->set_y(units::unit_cast<double>(point.y + doubleLineDistance * units::math::cos(heading)));
                     break;
                 case LaneMarkingSide::Right :
-                    boundaryPoint->mutable_position()->set_x(point.x + doubleLineDistance * std::sin(heading));
-                    boundaryPoint->mutable_position()->set_y(point.y - doubleLineDistance * std::cos(heading));
+        boundaryPoint->mutable_position()->set_x(units::unit_cast<double>(point.x + doubleLineDistance * units::math::sin(heading)));
+        boundaryPoint->mutable_position()->set_y(units::unit_cast<double>(point.y - doubleLineDistance * units::math::cos(heading)));
                     break;
             }
-            boundaryPoint->set_width(width);
+    boundaryPoint->set_width(units::unit_cast<double>(width));
         }
 
         void LaneBoundary::CopyToGroundTruth(osi3::GroundTruth &target) const {
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/DataTypes.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/DataTypes.h
index 8512dfd97549042120936313a2b0c1278df73540..964e09fc086110dba49c7aadd15d290ad394d1f6 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/DataTypes.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/DataTypes.h
@@ -41,6 +41,8 @@
 #include "osi3/osi_groundtruth.pb.h"
 #include "osi3/osi_trafficsign.pb.h"
 
+using namespace units::literals;
+
 namespace OWL {
 
     using Id = uint64_t;
@@ -48,7 +50,7 @@ namespace OWL {
 
     using OdId = int64_t;
 
-    using Angle = float;
+    using Angle = units::angle::radian_t;
 
     using Priorities = std::vector<std::pair<std::string, std::string>>;
 
@@ -65,13 +67,13 @@ namespace OWL {
         Single
     };
 
-//! This struct describes the intersection of an object with a lane
-struct LaneOverlap
-{
-    GlobalRoadPosition sMin{"", 0, std::numeric_limits<double>::infinity(), 0, 0};
-    GlobalRoadPosition sMax{"", 0, -std::numeric_limits<double>::infinity(), 0, 0};
-    GlobalRoadPosition tMin{"", 0, 0, std::numeric_limits<double>::infinity(), 0};
-    GlobalRoadPosition tMax{"", 0, 0, -std::numeric_limits<double>::infinity(), 0};
+    //! This struct describes the intersection of an object with a lane
+    struct LaneOverlap
+    {
+    GlobalRoadPosition sMin{"", 0, units::length::meter_t{std::numeric_limits<double>::infinity()}, 0_m, 0_rad};
+    GlobalRoadPosition sMax{"", 0, units::length::meter_t{-std::numeric_limits<double>::infinity()}, 0_m, 0_rad};
+    GlobalRoadPosition tMin{"", 0, 0_m, units::length::meter_t{std::numeric_limits<double>::infinity()}, 0_rad};
+    GlobalRoadPosition tMax{"", 0, 0_m, units::length::meter_t{-std::numeric_limits<double>::infinity()}, 0_rad};
     };
 
     struct IntersectionInfo {
@@ -80,13 +82,13 @@ struct LaneOverlap
 
         //! For each pair of lanes on the own road (first id) and the intersecting road (second id)
         //! this contains the start s and end s of the intersection on the own lane
-        std::map<std::pair<Id, Id>, std::pair<double, double>> sOffsets;
+    std::map<std::pair<Id, Id>, std::pair<units::length::meter_t, units::length::meter_t>> sOffsets;
     };
 
     template<typename OsiObject>
-    Primitive::Dimension GetDimensionFromOsiObject(const OsiObject &osiObject) {
+    mantle_api::Dimension3 GetDimensionFromOsiObject(const OsiObject &osiObject) {
         const auto &d = osiObject->base().dimension();
-        return {d.length(), d.width(), d.height()};
+        return {units::length::meter_t(d.length()), units::length::meter_t(d.width()), units::length::meter_t(d.height())};
     }
 
     template<typename T>
@@ -128,27 +130,27 @@ struct LaneOverlap
     struct WheelData{
         unsigned int axle;
         unsigned int index;
-        double width = std::numeric_limits<double>::signaling_NaN();
-        double wheelRadius = std::numeric_limits<double>::signaling_NaN();
-        double rotation_rate = std::numeric_limits<double>::signaling_NaN();
-        double rim_radius = std::numeric_limits<double>::signaling_NaN();
-        Primitive::Vector3 position {};
-        Primitive::AbsOrientation orientation {};
+        units::length::meter_t width = units::length::meter_t(std::numeric_limits<double>::signaling_NaN());
+        units::length::meter_t wheelRadius = units::length::meter_t(std::numeric_limits<double>::signaling_NaN());
+        units::angular_velocity::revolutions_per_minute_t rotation_rate = units::angular_velocity::revolutions_per_minute_t(std::numeric_limits<double>::signaling_NaN());
+        units::length::meter_t rim_radius = units::length::meter_t(std::numeric_limits<double>::signaling_NaN());
+        mantle_api::Vec3<units::length::meter_t> position {};
+        mantle_api::Orientation3<units::angle::radian_t> orientation {};
 
         void SetFromOsi(const osi3::MovingObject_VehicleAttributes_WheelData* data)
         {
                 axle = data->axle();
                 index = data->index();
-                width = data->width();
-                wheelRadius = data->wheel_radius();
-                rotation_rate = data->rotation_rate();
-                rim_radius = data->rim_radius();
-                position.x = data->position().x();
-                position.y = data->position().y();
-                position.z = data->position().z();
-                orientation.yaw = data->orientation().yaw();
-                orientation.pitch = data->orientation().pitch();
-                orientation.roll = data->orientation().roll();
+                width = units::length::meter_t(data->width());
+                wheelRadius = units::length::meter_t(data->wheel_radius());
+                rotation_rate = units::angular_velocity::revolutions_per_minute_t(data->rotation_rate());
+                rim_radius = units::length::meter_t(data->rim_radius());
+                position.x = units::length::meter_t(data->position().x());
+                position.y = units::length::meter_t(data->position().y());
+                position.z = units::length::meter_t(data->position().z());
+                orientation.yaw = units::angle::radian_t(data->orientation().yaw());
+                orientation.pitch = units::angle::radian_t(data->orientation().pitch());
+                orientation.roll = units::angle::radian_t(data->orientation().roll());
         }
     };
 
@@ -210,7 +212,7 @@ struct LaneOverlap
             virtual const LaneGeometryElements &GetLaneGeometryElements() const = 0;
 
             //!Returns the length of the lane
-            virtual double GetLength() const = 0;
+    virtual units::length::meter_t GetLength() const = 0;
 
             //!Returns the number of lanes to the right of this lane
             virtual int GetRightLaneCount() const = 0;
@@ -221,23 +223,23 @@ struct LaneOverlap
             //!Returns the curvature of the lane at the specified distance
             //!
             //! @param distance s coordinate
-            virtual double GetCurvature(double distance) const = 0;
+    virtual units::curvature::inverse_meter_t GetCurvature(units::length::meter_t distance) const = 0;
 
             //!Returns the width of the lane at the specified distance
             //!
             //! @param distance s coordinate
-            virtual double GetWidth(double distance) const = 0;
+    virtual units::length::meter_t GetWidth(units::length::meter_t distance) const = 0;
 
             //!Returns the direction of the lane at the specified distance
             //!
             //! @param distance s coordinate
-            virtual double GetDirection(double distance) const = 0;
+    virtual units::angle::radian_t GetDirection(units::length::meter_t distance) const = 0;
 
             //!Returns the left, right and reference point at the specified s coordinate interpolated between the geometry joints
             //!
             //! @param distance s coordinate
             virtual const Primitive::LaneGeometryJoint::Points
-            GetInterpolatedPointsAtDistance(double distance) const = 0;
+            GetInterpolatedPointsAtDistance(units::length::meter_t distance) const = 0;
 
             //!Returns the ids of all successors of this lane
             virtual const std::vector<Id> &GetNext() const = 0;
@@ -259,10 +261,10 @@ struct LaneOverlap
 
             //!Returns the s coordinate of the lane start if measure point is road start
             //! or the s coordinate of the lane end if measure point is road end
-            virtual double GetDistance(MeasurementPoint measurementPoint) const = 0;
+    virtual units::length::meter_t GetDistance(MeasurementPoint measurementPoint) const = 0;
 
             //!Returns true if the specified distance is valid on this lane, otherwise returns false
-            virtual bool Covers(double distance) const = 0;
+    virtual bool Covers(units::length::meter_t distance) const = 0;
 
             //!Sets the sucessor of the lane. Throws an error if the lane already has a sucessor
             virtual void AddNext(const Lane *lane) = 0;
@@ -282,12 +284,12 @@ struct LaneOverlap
             //! @param sOffset      s offset of the new joint
             //! @param curvature    curvature of the lane at sOffset
             //! @param heading      heading of the lane at sOffset
-            virtual void AddLaneGeometryJoint(const Common::Vector2d &pointLeft,
-                                              const Common::Vector2d &pointCenter,
-                                              const Common::Vector2d &pointRight,
-                                              double sOffset,
-                                              double curvature,
-                                              double heading) = 0;
+    virtual void AddLaneGeometryJoint(const Common::Vector2d<units::length::meter_t>& pointLeft,
+                                      const Common::Vector2d<units::length::meter_t>& pointCenter,
+                                      const Common::Vector2d<units::length::meter_t>& pointRight,
+                                      units::length::meter_t sOffset,
+                                      units::curvature::inverse_meter_t curvature,
+                                      units::angle::radian_t heading) = 0;
 
             //!Sets type of the lane
             virtual void SetLaneType(LaneType specifiedType) = 0;
@@ -353,13 +355,13 @@ struct LaneOverlap
             virtual Id GetId() const = 0;
 
             //! Returns the width of the boundary
-            virtual double GetWidth() const = 0;
+    virtual units::length::meter_t GetWidth() const = 0;
 
             //! Returns the s coordinate, where this boundary starts
-            virtual double GetSStart() const = 0;
+    virtual units::length::meter_t GetSStart() const = 0;
 
             //! Returns the s coordinate, where this boundary ends
-            virtual double GetSEnd() const = 0;
+    virtual units::length::meter_t GetSEnd() const = 0;
 
             //! Returns the type of the boundary
             virtual LaneMarking::Type GetType() const = 0;
@@ -375,7 +377,7 @@ struct LaneOverlap
             //! \param point    point to add
             //! \param heading  heading of the lane
             //!
-            virtual void AddBoundaryPoint(const Common::Vector2d &point, double heading) = 0;
+    virtual void AddBoundaryPoint(const Common::Vector2d<units::length::meter_t>& point, units::angle::radian_t heading) = 0;
 
             /*!
              * \brief Copies the underlying OSI object to the given GroundTruth
@@ -410,19 +412,19 @@ struct LaneOverlap
 
             //!Returns the s coordinate of the section start if measure point is road start
             //! or the s coordinate of the section end if measure point is road end
-            virtual double GetDistance(MeasurementPoint measurementPoint) const = 0;
+    virtual units::length::meter_t GetDistance(MeasurementPoint measurementPoint) const = 0;
 
             //!Returns true if the specified distance is valid on this sections, otherwise returns false
-            virtual bool Covers(double distance) const = 0;
+    virtual bool Covers(units::length::meter_t distance) const = 0;
 
             //!Returns true at least one s coordinate between startDistance and endDistance is valid on this section
-            virtual bool CoversInterval(double startDistance, double endDistance) const = 0;
+    virtual bool CoversInterval(units::length::meter_t startDistance, units::length::meter_t endDistance) const = 0;
 
             //!Returns the s coordinate of the section start
-            virtual double GetSOffset() const = 0;
+    virtual units::length::meter_t GetSOffset() const = 0;
 
             //!Returns the length of the section
-            virtual double GetLength() const = 0;
+    virtual units::length::meter_t GetLength() const = 0;
 
             //! Sets the ids of the lane boundaries of the center lane
             //! \param laneBoundaryId   ids of center lane boundaries
@@ -448,7 +450,7 @@ struct LaneOverlap
             virtual const Sections &GetSections() const = 0;
 
             //!Returns the length of the road
-            virtual double GetLength() const = 0;
+    virtual units::length::meter_t GetLength() const = 0;
 
             //!Returns the id of the successor of the road (i.e. next road or junction)
             virtual const std::string &GetSuccessor() const = 0;
@@ -470,7 +472,7 @@ struct LaneOverlap
 
             //! Returns the distance to a point on the road, relative to the road itself
             //! \param mp the point on the road to measure
-            virtual double GetDistance(MeasurementPoint mp) const = 0;
+    virtual units::length::meter_t GetDistance(MeasurementPoint mp) const = 0;
         };
 
 //!This class represents a junction in the world
@@ -517,21 +519,21 @@ struct LaneOverlap
             virtual Id GetId() const = 0;
 
             //!Returns the dimension of the object
-            virtual Primitive::Dimension GetDimension() const = 0;
+            virtual mantle_api::Dimension3 GetDimension() const = 0;
 
             //!Returns the position of the reference point of the object in absolute coordinates (i. e. world coordinates)
-            virtual Primitive::AbsPosition GetReferencePointPosition() const = 0;
+            virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const = 0;
 
             //!Returns the orientation of the object in absolute coordinates (i. e. world coordinates)
-            virtual Primitive::AbsOrientation GetAbsOrientation() const = 0;
+            virtual mantle_api::Orientation3<units::angle::radian_t> GetAbsOrientation() const = 0;
 
             //!Returns the absolute value of the velocity if the object is moving in road direction
             //! or the inverse if the object is moving against the road direction
-            virtual double GetAbsVelocityDouble() const = 0;
+            virtual units::velocity::meters_per_second_t GetAbsVelocityDouble() const = 0;
 
             //!Returns the absolute value of the acceleration if the object is moving in road direction
             //! or the inverse if the object is moving against the road direction
-            virtual double GetAbsAccelerationDouble() const = 0;
+            virtual units::acceleration::meters_per_second_squared_t GetAbsAccelerationDouble() const = 0;
 
             //!Returns the road intervals touched by the object
             virtual const RoadIntervals &GetTouchedRoads() const = 0;
@@ -546,13 +548,13 @@ struct LaneOverlap
             virtual void ClearLaneAssignments() = 0;
 
             //!Sets the position of the reference point of the object in absolute coordinates (i. e. world coordinates)
-            virtual void SetReferencePointPosition(const Primitive::AbsPosition &newPosition) = 0;
+            virtual void SetReferencePointPosition(const mantle_api::Vec3<units::length::meter_t>& newPosition) = 0;
 
             //!Sets the dimension of the object
-            virtual void SetDimension(const Primitive::Dimension &newDimension) = 0;
+            virtual void SetDimension(const mantle_api::Dimension3 &newDimension) = 0;
 
             //!Sets the orientation of the object in absolute coordinates (i. e. world coordinates)
-            virtual void SetAbsOrientation(const Primitive::AbsOrientation &newOrientation) = 0;
+            virtual void SetAbsOrientation(const mantle_api::Orientation3<units::angle::radian_t>& newOrientation) = 0;
 
             //!Sets the road intervals touched by the object
             virtual void SetTouchedRoads(const RoadIntervals &touchedRoads) = 0;
@@ -614,11 +616,10 @@ struct LaneOverlap
 
             virtual const RoadIntervals &GetTouchedRoads() const = 0;
 
-            virtual void SetReferencePointPosition(const Primitive::AbsPosition &newPosition) = 0;
-
-            virtual void SetDimension(const Primitive::Dimension &newDimension) = 0;
+            virtual void SetReferencePointPosition(const mantle_api::Vec3<units::length::meter_t>& newPosition) = 0;
 
-            virtual void SetAbsOrientation(const Primitive::AbsOrientation &newOrientation) = 0;
+            virtual void SetDimension(const mantle_api::Dimension3 &newDimension) = 0;
+            virtual void SetAbsOrientation(const mantle_api::Orientation3<units::angle::radian_t>& newOrientation) = 0;
 
             virtual void SetTouchedRoads(const RoadIntervals &touchedRoads) = 0;
         };
@@ -633,55 +634,50 @@ struct LaneOverlap
 
             virtual Primitive::LaneOrientation GetLaneOrientation() const = 0;
 
-            virtual Primitive::AbsVelocity GetAbsVelocity() const = 0;
+            virtual mantle_api::Vec3<units::velocity::meters_per_second_t> GetAbsVelocity() const = 0;
 
             virtual Primitive::AbsAcceleration GetAbsAcceleration() const = 0;
 
-            virtual Primitive::AbsOrientationRate GetAbsOrientationRate() const = 0;
+            virtual mantle_api::Orientation3<units::angular_velocity::radians_per_second_t> GetAbsOrientationRate() const = 0;
 
             virtual Primitive::AbsOrientationAcceleration GetAbsOrientationAcceleration() const = 0;
 
-            virtual void SetDimension(const Primitive::Dimension &newDimension) = 0;
+            virtual void SetDimension(const mantle_api::Dimension3 &newDimension) = 0;
 
-            virtual void SetLength(const double newLength) = 0;
+            virtual void SetLength(const units::length::meter_t newLength) = 0;
 
-            virtual void SetWidth(const double newWidth) = 0;
+            virtual void SetWidth(const units::length::meter_t newWidth) = 0;
 
-            virtual void SetHeight(const double newHeight) = 0;
+            virtual void SetHeight(const units::length::meter_t newHeight) = 0;
 
-            virtual void SetBoundingBoxCenterToRear(double distanceX, double distanceY, double distanceZ) = 0;
+            virtual units::length::meter_t GetDistanceReferencePointToLeadingEdge() const = 0;
 
-            virtual void SetBoundingBoxCenterToFront(double distanceX, double distanceY, double distanceZ) = 0;
+            virtual void SetBoundingBoxCenterToRear(const units::length::meter_t distanceX, const units::length::meter_t distanceY, const units::length::meter_t distanceZ) = 0;
 
-            virtual double GetDistanceReferencePointToLeadingEdge() const = 0;
+            virtual void SetBoundingBoxCenterToFront(const units::length::meter_t distanceX, const units::length::meter_t distanceY, const units::length::meter_t distanceZ) = 0;
 
-            virtual void SetReferencePointPosition(const Primitive::AbsPosition &newPosition) = 0;
 
-            virtual void SetX(const double newX) = 0;
+            virtual void SetReferencePointPosition(const mantle_api::Vec3<units::length::meter_t>& newPosition) = 0;
+            virtual void SetX(const units::length::meter_t newX) = 0;
+            virtual void SetY(const units::length::meter_t newY) = 0;
+            virtual void SetZ(const units::length::meter_t newZ) = 0;
 
-            virtual void SetY(const double newY) = 0;
-
-            virtual void SetZ(const double newZ) = 0;
 
             virtual void SetTouchedRoads(const RoadIntervals &touchedRoads) = 0;
 
-            virtual void SetAbsOrientation(const Primitive::AbsOrientation &newOrientation) = 0;
-
-            virtual void SetYaw(const double newYaw) = 0;
+            virtual void SetAbsOrientation(const mantle_api::Orientation3<units::angle::radian_t>& newOrientation) = 0;
+            virtual void SetYaw(const units::angle::radian_t newYaw) = 0;
+            virtual void SetPitch(const units::angle::radian_t newPitch) = 0;
+            virtual void SetRoll(const units::angle::radian_t newRoll) = 0;
 
-            virtual void SetPitch(const double newPitch) = 0;
 
-            virtual void SetRoll(const double newRoll) = 0;
+            virtual void SetAbsVelocity(const mantle_api::Vec3<units::velocity::meters_per_second_t>& newVelocity) = 0;
+            virtual void SetAbsVelocity(const units::velocity::meters_per_second_t newVelocity) = 0;
 
-            virtual void SetAbsVelocity(const Primitive::AbsVelocity &newVelocity) = 0;
+            virtual void SetAbsAcceleration(const Primitive::AbsAcceleration& newAcceleration) = 0;
+            virtual void SetAbsAcceleration(const units::acceleration::meters_per_second_squared_t newAcceleration) = 0;
 
-            virtual void SetAbsVelocity(const double newVelocity) = 0;
-
-            virtual void SetAbsAcceleration(const Primitive::AbsAcceleration &newAcceleration) = 0;
-
-            virtual void SetAbsAcceleration(const double newAcceleration) = 0;
-
-            virtual void SetAbsOrientationRate(const Primitive::AbsOrientationRate &newOrientationRate) = 0;
+            virtual void SetAbsOrientationRate(const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>& newOrientationRate) = 0;
 
             virtual void SetAbsOrientationAcceleration(const Primitive::AbsOrientationAcceleration &newOrientationAcceleration) = 0;
 
@@ -707,8 +703,8 @@ struct LaneOverlap
 
             virtual bool GetHighBeamLight() const = 0;
 
-            virtual void SetType(AgentVehicleType type) = 0;
-
+            virtual void SetType(mantle_api::EntityType type) = 0;
+            virtual void SetVehicleClassification(mantle_api::VehicleClass vehicleClassification) = 0;
             virtual void SetSourceReference(const ExternalReference& externalReference) = 0;
 
             virtual void AddWheel(const WheelData& wheelData) = 0;
@@ -719,9 +715,10 @@ struct LaneOverlap
 
             virtual void SetSteeringWheelAngle(const Angle newValue) = 0;
 
-            virtual void SetFrontAxleSteeringYaw(const double wheelYaw) = 0;
+            virtual void SetFrontAxleSteeringYaw(const Angle wheelYaw) = 0;
 
-            virtual void SetWheelsRotationRateAndOrientation(const double velocity, const double wheelRadiusFront, const double wheelRadiusRear, const double cycleTime) = 0;
+            virtual void SetWheelsRotationRateAndOrientation(const units::velocity::meters_per_second_t velocity,
+             const units::length::meter_t wheelRadiusFront, const units::length::meter_t wheelRadiusRear, const units::time::second_t cycleTime) = 0;
         };
 
 //! This class represents a static traffic sign
@@ -733,26 +730,26 @@ struct LaneOverlap
             virtual std::string GetId() const = 0;
 
             //! Returns the s coordinate
-            virtual double GetS() const = 0;
+    virtual units::length::meter_t GetS() const = 0;
 
             //! Returns the value of the sign converted in SI Units
             virtual std::pair<double, CommonTrafficSign::Unit>
             GetValueAndUnitInSI(const double osiValue, const osi3::TrafficSignValue_Unit osiUnit) const = 0;
 
             //! Returns the specification of the sign with the set relative distance
-            virtual CommonTrafficSign::Entity GetSpecification(const double relativeDistance) const = 0;
+    virtual CommonTrafficSign::Entity GetSpecification(const units::length::meter_t relativeDistance) const = 0;
 
             //! Returns wether the sign is valid for the specified lane
             virtual bool IsValidForLane(OWL::Id laneId) const = 0;
 
             //!Returns the position of the reference point of the object in absolute coordinates (i. e. world coordinates)
-            virtual Primitive::AbsPosition GetReferencePointPosition() const = 0;
+    virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const = 0;
 
             //!Returns the dimension of the sign
-            virtual Primitive::Dimension GetDimension() const = 0;
+            virtual mantle_api::Dimension3 GetDimension() const = 0;
 
             //! Sets the s coordinate
-            virtual void SetS(double sPos) = 0;
+    virtual void SetS(units::length::meter_t sPos) = 0;
 
             //! Adds the specified lane to the list of valid lanes
             virtual void SetValidForLane(OWL::Id laneId) = 0;
@@ -788,19 +785,19 @@ struct LaneOverlap
             virtual std::string GetId() const = 0;
 
             //! Returns the s coordinate
-            virtual double GetS() const = 0;
+    virtual units::length::meter_t GetS() const = 0;
 
             //! Returns wether the sign is valid for the specified lane
             virtual bool IsValidForLane(OWL::Id laneId) const = 0;
 
             //!Returns the position of the reference point of the object in absolute coordinates (i. e. world coordinates)
-            virtual Primitive::AbsPosition GetReferencePointPosition() const = 0;
+    virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const = 0;
 
             //! Sets the s coordinate
-            virtual void SetS(double sPos) = 0;
+    virtual void SetS(units::length::meter_t sPos) = 0;
 
             //!Returns the dimension of the sign
-            virtual Primitive::Dimension GetDimension() const = 0;
+            virtual mantle_api::Dimension3 GetDimension() const = 0;
 
             //! Converts the specification imported from OpenDrive to OSI.
             //!
@@ -823,7 +820,7 @@ struct LaneOverlap
             virtual void SetState(CommonTrafficLight::State newState) = 0;
 
             //! Returns the specification of the light with the set relative distance
-            virtual CommonTrafficLight::Entity GetSpecification(const double relativeDistance) const = 0;
+    virtual CommonTrafficLight::Entity GetSpecification(const units::length::meter_t relativeDistance) const = 0;
 
             //!Returns the current state
             virtual CommonTrafficLight::State GetState() const = 0;
@@ -838,22 +835,22 @@ struct LaneOverlap
             virtual std::string GetId() const = 0;
 
             //! Returns the s coordinate
-            virtual double GetS() const = 0;
+    virtual units::length::meter_t GetS() const = 0;
 
             //! Returns the specification of the sign with the set relative distance
-            virtual CommonTrafficSign::Entity GetSpecification(const double relativeDistance) const = 0;
+    virtual CommonTrafficSign::Entity GetSpecification(const units::length::meter_t relativeDistance) const = 0;
 
             //! Returns wether the sign is valid for the specified lane
             virtual bool IsValidForLane(OWL::Id laneId) const = 0;
 
             //!Returns the position of the reference point of the object in absolute coordinates (i. e. world coordinates)
-            virtual Primitive::AbsPosition GetReferencePointPosition() const = 0;
+    virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const = 0;
 
             //!Returns the dimension of the marking
-            virtual Primitive::Dimension GetDimension() const = 0;
+            virtual mantle_api::Dimension3 GetDimension() const = 0;
 
             //! Sets the s coordinate
-            virtual void SetS(double sPos) = 0;
+    virtual void SetS(units::length::meter_t sPos) = 0;
 
             //! Adds the specified lane to the list of valid lanes
             virtual void SetValidForLane(OWL::Id laneId) = 0;
@@ -906,15 +903,14 @@ struct LaneOverlap
 
             const Interfaces::Road &GetRoad() const override;
 
-            double GetLength() const override;
+    units::length::meter_t GetLength() const override;
 
             int GetRightLaneCount() const override;
 
-            double GetCurvature(double distance) const override;
-
-            double GetWidth(double distance) const override;
+    units::curvature::inverse_meter_t GetCurvature(units::length::meter_t distance) const override;
+    units::length::meter_t GetWidth(units::length::meter_t distance) const override;
+    units::angle::radian_t GetDirection(units::length::meter_t distance) const override;
 
-            double GetDirection(double distance) const override;
 
             const std::vector<Id> &GetNext() const override {
                 return next;
@@ -932,11 +928,10 @@ struct LaneOverlap
 
             const std::vector<Id> GetRightLaneBoundaries() const override;
 
-            double GetDistance(MeasurementPoint measurementPoint) const override;
+    units::length::meter_t GetDistance(MeasurementPoint measurementPoint) const override;
 
             LaneType GetLaneType() const override;
-
-            bool Covers(double distance) const override;
+    bool Covers(units::length::meter_t distance) const override;
 
             void AddNext(const Interfaces::Lane *lane) override;
 
@@ -945,13 +940,12 @@ struct LaneOverlap
             void SetLanePairings() override;
 
             const Interfaces::LaneGeometryElements &GetLaneGeometryElements() const override;
-
-            void AddLaneGeometryJoint(const Common::Vector2d &pointLeft,
-                                      const Common::Vector2d &pointCenter,
-                                      const Common::Vector2d &pointRight,
-                                      double sOffset,
-                                      double curvature,
-                                      double heading) override;
+    void AddLaneGeometryJoint(const Common::Vector2d<units::length::meter_t>& pointLeft,
+                              const Common::Vector2d<units::length::meter_t>& pointCenter,
+                              const Common::Vector2d<units::length::meter_t>& pointRight,
+                              units::length::meter_t sOffset,
+                              units::curvature::inverse_meter_t curvature,
+                              units::angle::radian_t heading) override;
 
             void SetLeftLane(const Interfaces::Lane &lane, bool transferLaneBoundary) override;
 
@@ -986,11 +980,10 @@ struct LaneOverlap
 
             void ClearMovingObjects() override;
 
-            std::tuple<const Primitive::LaneGeometryJoint *, const Primitive::LaneGeometryJoint *>
-            GetNeighbouringJoints(
-                    double distance) const;
+            std::tuple<const Primitive::LaneGeometryJoint*, const Primitive::LaneGeometryJoint*> GetNeighbouringJoints(
+                    units::length::meter_t distance) const;
 
-            const Primitive::LaneGeometryJoint::Points GetInterpolatedPointsAtDistance(double distance) const override;
+            const Primitive::LaneGeometryJoint::Points GetInterpolatedPointsAtDistance(units::length::meter_t distance) const override;
 
             //! @brief Collects objects assigned to lanes and manages their order w.r.t the querying direction
             //!
@@ -1052,7 +1045,7 @@ struct LaneOverlap
             std::vector<Id> previous;
             const Interfaces::Lane *leftLane;
             const Interfaces::Lane *rightLane;
-            double length{0.0};
+    units::length::meter_t length{0.0};
             bool leftLaneIsDummy{true};
             bool rightLaneIsDummy{true};
         };
@@ -1085,38 +1078,35 @@ struct LaneOverlap
 
         class LaneBoundary : public Interfaces::LaneBoundary {
         public:
-            LaneBoundary(osi3::LaneBoundary *osiLaneBoundary, double width, double sStart, double sEnd,
-                         LaneMarkingSide side);
+        LaneBoundary(osi3::LaneBoundary* osiLaneBoundary, units::length::meter_t width, units::length::meter_t sStart, units::length::meter_t sEnd,
+            LaneMarkingSide side);
 
             virtual Id GetId() const override;
+            virtual units::length::meter_t GetWidth() const override;
+            virtual units::length::meter_t GetSStart() const override;
+            virtual units::length::meter_t GetSEnd() const override;
 
-            virtual double GetWidth() const override;
-
-            virtual double GetSStart() const override;
-
-            virtual double GetSEnd() const override;
 
             virtual LaneMarking::Type GetType() const override;
 
             virtual LaneMarking::Color GetColor() const override;
 
             virtual LaneMarkingSide GetSide() const override;
-
-            virtual void AddBoundaryPoint(const Common::Vector2d &point, double heading) override;
+            virtual void AddBoundaryPoint(const Common::Vector2d<units::length::meter_t>& point, units::angle::radian_t heading) override;
 
             virtual void CopyToGroundTruth(osi3::GroundTruth &target) const override;
 
         private:
             osi3::LaneBoundary *osiLaneBoundary;    //! underlying OSI object
-            double sStart;                          //! s coordinate where this boundary starts
-            double sEnd;                            //! s coordinate where this boundary ends
-            double width;                           //! width of the line
+            units::length::meter_t sStart;          //! s coordinate where this boundary starts
+            units::length::meter_t sEnd;            //! s coordinate where this boundary ends
+            units::length::meter_t width;           //! width of the line
             LaneMarkingSide side;                   //! Side (Left/Right) if this boundary is part of a double line or Single otherwise
         };
 
         class Section : public Interfaces::Section {
         public:
-            Section(double sOffset);
+    Section(units::length::meter_t sOffset);
 
             void AddNext(const Interfaces::Section &section) override;
 
@@ -1130,15 +1120,13 @@ struct LaneOverlap
 
             const Interfaces::Road &GetRoad() const override;
 
-            virtual double GetDistance(MeasurementPoint measurementPoint) const override;
+    virtual units::length::meter_t GetDistance(MeasurementPoint measurementPoint) const override;
+    virtual bool Covers(units::length::meter_t distance) const override;
+    virtual bool CoversInterval(units::length::meter_t startDistance, units::length::meter_t endDistance) const override;
 
-            virtual bool Covers(double distance) const override;
 
-            virtual bool CoversInterval(double startDistance, double endDistance) const override;
-
-            double GetSOffset() const override;
-
-            double GetLength() const override;
+    units::length::meter_t GetSOffset() const override;
+    units::length::meter_t GetLength() const override;
 
             virtual void SetCenterLaneBoundary(std::vector<Id> laneBoundaryIds) override;
 
@@ -1150,7 +1138,7 @@ struct LaneOverlap
             Interfaces::Sections nextSections;
             Interfaces::Sections previousSections;
             std::vector<Id> centerLaneBoundary;
-            double sOffset;
+    units::length::meter_t sOffset;
 
         public:
             Section(const Section &) = delete;
@@ -1166,7 +1154,8 @@ struct LaneOverlap
 
         class InvalidSection : public Section {
         public:
-            InvalidSection() : Section(0) {}
+    InvalidSection() : Section(0_m)
+    {}
 
             InvalidSection(const InvalidSection &) = delete;
 
@@ -1196,8 +1185,8 @@ struct LaneOverlap
             const Interfaces::Sections &GetSections() const override;
 
             void AddSection(Interfaces::Section &section) override;
-
-            double GetLength() const override;
+            
+            units::length::meter_t GetLength() const override;
 
             const std::string &GetSuccessor() const override;
 
@@ -1208,8 +1197,8 @@ struct LaneOverlap
             void SetPredecessor(const std::string &predecessor) override;
 
             bool IsInStreamDirection() const override;
-
-            double GetDistance(MeasurementPoint mp) const override;
+    
+            units::length::meter_t GetDistance(MeasurementPoint mp) const override;
 
         private:
             Interfaces::Sections sections;
@@ -1306,23 +1295,23 @@ struct LaneOverlap
 
             virtual ~StationaryObject() override = default;
 
-            virtual Primitive::Dimension GetDimension() const override;
+            virtual mantle_api::Dimension3 GetDimension() const override;
 
-            virtual Primitive::AbsOrientation GetAbsOrientation() const override;
+            virtual mantle_api::Orientation3<units::angle::radian_t> GetAbsOrientation() const override;
 
-            virtual Primitive::AbsPosition GetReferencePointPosition() const override;
+            virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const override;
 
-            virtual double GetAbsVelocityDouble() const override;
+            virtual units::velocity::meters_per_second_t GetAbsVelocityDouble() const override;
 
-            virtual double GetAbsAccelerationDouble() const override;
+            virtual units::acceleration::meters_per_second_squared_t GetAbsAccelerationDouble() const override;
 
             virtual const RoadIntervals &GetTouchedRoads() const override;
 
-            void SetReferencePointPosition(const Primitive::AbsPosition &newPosition) override;
+            void SetReferencePointPosition(const mantle_api::Vec3<units::length::meter_t> &newPosition) override;
 
-            void SetDimension(const Primitive::Dimension &newDimension) override;
+            void SetDimension(const mantle_api::Dimension3 &newDimension) override;
 
-            void SetAbsOrientation(const Primitive::AbsOrientation &newOrientation) override;
+            void SetAbsOrientation(const mantle_api::Orientation3<units::angle::radian_t> &newOrientation) override;
 
             Id GetId() const override;
 
@@ -1353,20 +1342,20 @@ struct LaneOverlap
                 return id;
             }
 
-            virtual double GetS() const override {
+            virtual units::length::meter_t GetS() const override {
                 return s;
             }
 
             virtual std::pair<double, CommonTrafficSign::Unit>
             GetValueAndUnitInSI(const double osiValue, const osi3::TrafficSignValue_Unit osiUnit) const override;
 
-            virtual CommonTrafficSign::Entity GetSpecification(const double relativeDistance) const override;
+            virtual CommonTrafficSign::Entity GetSpecification(const units::length::meter_t relativeDistance) const override;
 
-            virtual Primitive::AbsPosition GetReferencePointPosition() const override;
+            virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const override;
 
-            virtual Primitive::Dimension GetDimension() const override;
+            virtual mantle_api::Dimension3 GetDimension() const override;
 
-            virtual void SetS(double sPos) override {
+            virtual void SetS(units::length::meter_t sPos) override {
                 s = sPos;
             }
 
@@ -1384,7 +1373,7 @@ struct LaneOverlap
 
         private:
             std::string id{""};
-            double s{0.0};
+    units::length::meter_t s {0.0};
 
             osi3::TrafficSign *osiSign{nullptr};
         };
@@ -1400,17 +1389,17 @@ struct LaneOverlap
                 return id;
             }
 
-            virtual double GetS() const override {
+            virtual units::length::meter_t GetS() const override {
                 return s;
             }
 
-            virtual CommonTrafficSign::Entity GetSpecification(const double relativeDistance) const override;
+            virtual CommonTrafficSign::Entity GetSpecification(const units::length::meter_t relativeDistance) const override;
 
-            virtual Primitive::AbsPosition GetReferencePointPosition() const override;
+            virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const override;
 
-            virtual Primitive::Dimension GetDimension() const override;
+            virtual mantle_api::Dimension3 GetDimension() const override;
 
-            virtual void SetS(double sPos) override {
+            virtual void SetS(units::length::meter_t sPos) override {
                 s = sPos;
             }
 
@@ -1428,7 +1417,7 @@ struct LaneOverlap
 
         private:
             std::string id{""};
-            double s{0.0};
+    units::length::meter_t s {0.0};
 
             osi3::RoadMarking *osiSign{nullptr};
         };
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/LaneGeometryJoint.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/LaneGeometryJoint.h
index 58ac4c99e35ed930459eb4f3e37f11e9cd391676..ea105bfdb824d870ee39beeea2d5342ea82ff1a0 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/LaneGeometryJoint.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/LaneGeometryJoint.h
@@ -21,14 +21,14 @@ struct LaneGeometryJoint
     /// \note Left/Right refers to the direction of the road
     struct Points
     {
-        Common::Vector2d left;
-        Common::Vector2d reference;
-        Common::Vector2d right;
+        Common::Vector2d<units::length::meter_t> left;
+        Common::Vector2d<units::length::meter_t> reference;
+        Common::Vector2d<units::length::meter_t> right;
     } points;
 
-    double curvature;              //!< \brief Curvature of the reference line at this joint
-    double sOffset;     //!< \brief Offset with respect to the start of the road
-    double sHdg;        //!< \brief Heading of the s projection axis
+    units::curvature::inverse_meter_t curvature;              //!< \brief Curvature of the reference line at this joint
+    units::length::meter_t sOffset;     //!< \brief Offset with respect to the start of the road
+    units::angle::radian_t sHdg;        //!< \brief Heading of the s projection axis
 };
 
 } // namespace Primitive
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.cpp b/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.cpp
index 9fca11df2217c563f6c64f1dfd69f0fd84d5901b..57d3318120999ed5f647ec48cc6526c66dfcc812 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.cpp
@@ -34,141 +34,145 @@ OWL::Id OWL::Implementation::MovingObject::GetId() const {
     return osiObject->id().value();
 }
 
-OWL::Primitive::Dimension OWL::Implementation::MovingObject::GetDimension() const {
+mantle_api::Dimension3 OWL::Implementation::MovingObject::GetDimension() const {
     return OWL::GetDimensionFromOsiObject(osiObject);
 }
 
-double OWL::Implementation::MovingObject::GetDistanceReferencePointToLeadingEdge() const {
-    return osiObject->base().dimension().length() * 0.5 -
-           osiObject->vehicle_attributes().bbcenter_to_rear().x();
+units::length::meter_t OWL::Implementation::MovingObject::GetDistanceReferencePointToLeadingEdge() const {
+    return units::length::meter_t(osiObject->base().dimension().length() * 0.5 -
+                                  osiObject->vehicle_attributes().bbcenter_to_rear().x());
 }
 
-void OWL::Implementation::MovingObject::SetDimension(const Primitive::Dimension &newDimension) {
+void OWL::Implementation::MovingObject::SetDimension(const mantle_api::Dimension3 &newDimension) {
     osi3::Dimension3d *osiDimension = osiObject->mutable_base()->mutable_dimension();
 
-    osiDimension->set_length(newDimension.length);
-    osiDimension->set_width(newDimension.width);
-    osiDimension->set_height(newDimension.height);
+    osiDimension->set_length(units::unit_cast<double>(newDimension.length));
+    osiDimension->set_width(units::unit_cast<double>(newDimension.width));
+    osiDimension->set_height(units::unit_cast<double>(newDimension.height));
 }
 
-void OWL::Implementation::MovingObject::SetLength(const double newLength) {
+void OWL::Implementation::MovingObject::SetLength(const units::length::meter_t newLength) {
     osi3::Dimension3d *osiDimension = osiObject->mutable_base()->mutable_dimension();
-    osiDimension->set_length(newLength);
+    osiDimension->set_length(units::unit_cast<double>(newLength));
 }
 
-void OWL::Implementation::MovingObject::SetWidth(const double newWidth) {
+void OWL::Implementation::MovingObject::SetWidth(const units::length::meter_t newWidth) {
     osi3::Dimension3d *osiDimension = osiObject->mutable_base()->mutable_dimension();
-    osiDimension->set_width(newWidth);
+    osiDimension->set_width(units::unit_cast<double>(newWidth));
 }
 
-void OWL::Implementation::MovingObject::SetHeight(const double newHeight) {
+void OWL::Implementation::MovingObject::SetHeight(const units::length::meter_t newHeight) {
     osi3::Dimension3d *osiDimension = osiObject->mutable_base()->mutable_dimension();
-    osiDimension->set_height(newHeight);
+    osiDimension->set_height(units::unit_cast<double>(newHeight));
 }
 
-void OWL::Implementation::MovingObject::SetBoundingBoxCenterToRear(const double distanceX,const double distanceY,const double distanceZ) {
-    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_rear()->set_x(distanceX);
-    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_rear()->set_y(distanceY);
-    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_rear()->set_z(distanceZ);
+void OWL::Implementation::MovingObject::SetBoundingBoxCenterToRear(const units::length::meter_t distanceX,const units::length::meter_t distanceY,const units::length::meter_t distanceZ) {
+    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_rear()->set_x(units::unit_cast<double>(distanceX));
+    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_rear()->set_y(units::unit_cast<double>(distanceY));
+    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_rear()->set_z(units::unit_cast<double>(distanceZ));
 }
 
-void OWL::Implementation::MovingObject::SetBoundingBoxCenterToFront(const double distanceX,const double distanceY,const double distanceZ) {
-    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_front()->set_x(distanceX);
-    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_front()->set_y(distanceY);
-    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_front()->set_z(distanceZ);
+void OWL::Implementation::MovingObject::SetBoundingBoxCenterToFront(const units::length::meter_t distanceX,const units::length::meter_t distanceY,const units::length::meter_t distanceZ) {
+    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_front()->set_x(units::unit_cast<double>(distanceX));
+    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_front()->set_y(units::unit_cast<double>(distanceY));
+    osiObject->mutable_vehicle_attributes()->mutable_bbcenter_to_front()->set_z(units::unit_cast<double>(distanceZ));
 }
 
-OWL::Primitive::AbsPosition OWL::Implementation::MovingObject::GetReferencePointPosition() const {
+mantle_api::Vec3<units::length::meter_t> OWL::Implementation::MovingObject::GetReferencePointPosition() const {
     const osi3::Vector3d &osiPosition = osiObject->base().position();
     const double yaw = osiObject->base().orientation().yaw();
     const osi3::Vector3d &bbCenterToRear = osiObject->vehicle_attributes().bbcenter_to_rear();
 
-    Primitive::AbsPosition position;
+    mantle_api::Vec3<units::length::meter_t> position;
 
-    position.x = osiPosition.x() + std::cos(yaw) * bbCenterToRear.x();
-    position.y = osiPosition.y() + std::sin(yaw) * bbCenterToRear.x();
-    position.z = osiPosition.z();
+    position.x = units::length::meter_t(osiPosition.x() + std::cos(yaw) * bbCenterToRear.x());
+    position.y = units::length::meter_t(osiPosition.y() + std::sin(yaw) * bbCenterToRear.x());
+    position.z = units::length::meter_t(osiPosition.z());
 
     return position;
 }
 
-void OWL::Implementation::MovingObject::SetReferencePointPosition(const Primitive::AbsPosition &newPosition) {
+void OWL::Implementation::MovingObject::SetReferencePointPosition(const mantle_api::Vec3<units::length::meter_t> &newPosition)
+{
     osi3::Vector3d *osiPosition = osiObject->mutable_base()->mutable_position();
-    const double yaw = osiObject->base().orientation().yaw();
+    const auto yaw = osiObject->base().orientation().yaw();
     const osi3::Vector3d &bbCenterToRear = osiObject->vehicle_attributes().bbcenter_to_rear();
 
-    osiPosition->set_x(newPosition.x - std::cos(yaw) * bbCenterToRear.x());
-    osiPosition->set_y(newPosition.y - std::sin(yaw) * bbCenterToRear.x());
-    osiPosition->set_z(newPosition.z);
+    osiPosition->set_x(units::unit_cast<double>(newPosition.x) - std::cos(yaw) * bbCenterToRear.x());
+    osiPosition->set_y(units::unit_cast<double>(newPosition.y) - std::sin(yaw) * bbCenterToRear.x());
+    osiPosition->set_z(units::unit_cast<double>(newPosition.z));
 
     frontDistance.Invalidate();
     rearDistance.Invalidate();
+
 }
 
-void OWL::Implementation::MovingObject::SetX(const double newX) {
+void OWL::Implementation::MovingObject::SetX(const units::length::meter_t newX) {
     osi3::Vector3d *osiPosition = osiObject->mutable_base()->mutable_position();
     const double yaw = osiObject->base().orientation().yaw();
     const osi3::Vector3d &bbCenterToRear = osiObject->vehicle_attributes().bbcenter_to_rear();
 
-    osiPosition->set_x(newX - std::cos(yaw) * bbCenterToRear.x());
+    osiPosition->set_x(units::unit_cast<double>(newX) - std::cos(yaw) * bbCenterToRear.x());
 }
 
-void OWL::Implementation::MovingObject::SetY(const double newY) {
+void OWL::Implementation::MovingObject::SetY(const units::length::meter_t newY) {
     osi3::Vector3d *osiPosition = osiObject->mutable_base()->mutable_position();
     const double yaw = osiObject->base().orientation().yaw();
     const osi3::Vector3d &bbCenterToRear = osiObject->vehicle_attributes().bbcenter_to_rear();
 
-    osiPosition->set_y(newY - std::sin(yaw) * bbCenterToRear.x());
+    osiPosition->set_y(units::unit_cast<double>(newY) - std::sin(yaw) * bbCenterToRear.x());
 }
 
-void OWL::Implementation::MovingObject::SetZ(const double newZ) {
+void OWL::Implementation::MovingObject::SetZ(const units::length::meter_t newZ) {
     osi3::Vector3d *osiPosition = osiObject->mutable_base()->mutable_position();
-    osiPosition->set_z(newZ);
+    osiPosition->set_z(units::unit_cast<double>(newZ));
 }
 
 void OWL::Implementation::MovingObject::SetTouchedRoads(const RoadIntervals &touchedRoads) {
     this->touchedRoads = &touchedRoads;
 }
 
-OWL::Primitive::AbsOrientation OWL::Implementation::MovingObject::GetAbsOrientation() const {
+mantle_api::Orientation3<units::angle::radian_t> OWL::Implementation::MovingObject::GetAbsOrientation() const
+{
     osi3::Orientation3d osiOrientation = osiObject->base().orientation();
-    Primitive::AbsOrientation orientation;
 
-    orientation.yaw = osiOrientation.yaw();
-    orientation.pitch = osiOrientation.pitch();
-    orientation.roll = osiOrientation.roll();
-
-    return orientation;
+    return {units::angle::radian_t(osiOrientation.yaw()),
+            units::angle::radian_t(osiOrientation.pitch()),
+            units::angle::radian_t(osiOrientation.roll())};
 }
 
-void OWL::Implementation::MovingObject::SetAbsOrientation(const Primitive::AbsOrientation &newOrientation) {
+void OWL::Implementation::MovingObject::SetAbsOrientation(const mantle_api::Orientation3<units::angle::radian_t> &newOrientation)
+{
     osi3::Orientation3d *osiOrientation = osiObject->mutable_base()->mutable_orientation();
     const auto referencePosition = GetReferencePointPosition(); //AbsPosition needs to be evaluated with "old" yaw
-    osiOrientation->set_yaw(CommonHelper::SetAngleToValidRange(newOrientation.yaw));
-    osiOrientation->set_pitch(CommonHelper::SetAngleToValidRange(newOrientation.pitch));
-    osiOrientation->set_roll(CommonHelper::SetAngleToValidRange(newOrientation.roll));
+    osiOrientation->set_yaw(units::unit_cast<double>(CommonHelper::SetAngleToValidRange(newOrientation.yaw)));
+    osiOrientation->set_pitch(units::unit_cast<double>(CommonHelper::SetAngleToValidRange(newOrientation.pitch)));
+    osiOrientation->set_roll(units::unit_cast<double>(CommonHelper::SetAngleToValidRange(newOrientation.roll)));
     frontDistance.Invalidate();
     rearDistance.Invalidate();
     SetReferencePointPosition(referencePosition); //Changing yaw also changes position of the boundingBox center
 }
 
-void OWL::Implementation::MovingObject::SetYaw(const double newYaw) {
+void OWL::Implementation::MovingObject::SetYaw(const units::angle::radian_t newYaw)
+{
     const auto referencePosition = GetReferencePointPosition();
     osi3::Orientation3d *osiOrientation = osiObject->mutable_base()->mutable_orientation();
-    osiOrientation->set_yaw(CommonHelper::SetAngleToValidRange(newYaw));
+    osiOrientation->set_yaw(units::unit_cast<double>(CommonHelper::SetAngleToValidRange(newYaw)));
     frontDistance.Invalidate();
     rearDistance.Invalidate();
     SetReferencePointPosition(referencePosition); //Changing yaw also changes position of the boundingBox center
 }
 
-void OWL::Implementation::MovingObject::SetPitch(const double newPitch) {
+void OWL::Implementation::MovingObject::SetPitch(const units::angle::radian_t newPitch)
+{
     osi3::Orientation3d *osiOrientation = osiObject->mutable_base()->mutable_orientation();
-    osiOrientation->set_pitch(CommonHelper::SetAngleToValidRange(newPitch));
+    osiOrientation->set_pitch(units::unit_cast<double>(CommonHelper::SetAngleToValidRange(newPitch)));
 }
 
-void OWL::Implementation::MovingObject::SetRoll(const double newRoll) {
+void OWL::Implementation::MovingObject::SetRoll(const units::angle::radian_t newRoll)
+{
     osi3::Orientation3d *osiOrientation = osiObject->mutable_base()->mutable_orientation();
-    osiOrientation->set_roll(CommonHelper::SetAngleToValidRange(newRoll));
+    osiOrientation->set_roll(units::unit_cast<double>(CommonHelper::SetAngleToValidRange(newRoll)));
 }
 
 void OWL::Implementation::MovingObject::SetIndicatorState(IndicatorState indicatorState) {
@@ -284,182 +288,171 @@ bool OWL::Implementation::MovingObject::GetHighBeamLight() const {
     throw std::logic_error("HighBeamLightState is not supported");
 }
 
-void OWL::Implementation::MovingObject::SetType(AgentVehicleType type) {
-    if (type == AgentVehicleType::Pedestrian) {
-        osiObject->set_type(osi3::MovingObject_Type::MovingObject_Type_TYPE_PEDESTRIAN);
-    } else {
-        osiObject->set_type(osi3::MovingObject_Type::MovingObject_Type_TYPE_VEHICLE);
-
-        switch (type) {
-            case AgentVehicleType::Car:
-                osiObject->mutable_vehicle_classification()->set_type(
-                        osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_MEDIUM_CAR);
-                break;
-
-            case AgentVehicleType::Motorbike:
-                osiObject->mutable_vehicle_classification()->set_type(
-                        osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_MOTORBIKE);
-                break;
-
-            case AgentVehicleType::Bicycle:
-                osiObject->mutable_vehicle_classification()->set_type(
-                        osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_BICYCLE);
-                break;
-
-            case AgentVehicleType::Truck:
-                osiObject->mutable_vehicle_classification()->set_type(
-                        osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_HEAVY_TRUCK);
-                break;
-
-            default:
-                throw (std::runtime_error("AgentVehicleType not supported"));
-        }
+void OWL::Implementation::MovingObject::SetType(mantle_api::EntityType type)
+{
+    osi3::MovingObject_Type osiType{(int)type};
+    osiObject->set_type(osiType);
+}
+
+void OWL::Implementation::MovingObject::SetVehicleClassification(mantle_api::VehicleClass vehicleClassification)
+{
+    if (vehicleClassification == mantle_api::VehicleClass::kInvalid)
+    {
+        throw(std::runtime_error("VehicleClassification \"Invalid\" not supported"));
     }
+
+    osi3::MovingObject_VehicleClassification_Type osiClassification{(int)vehicleClassification};
+    osiObject->mutable_vehicle_classification()->set_type(osiClassification);
 }
 
 OWL::Primitive::LaneOrientation OWL::Implementation::MovingObject::GetLaneOrientation() const {
     throw std::logic_error("MovingObject::GetLaneOrientation not implemented");
 }
 
-OWL::Primitive::AbsVelocity OWL::Implementation::MovingObject::GetAbsVelocity() const {
+mantle_api::Vec3<units::velocity::meters_per_second_t> OWL::Implementation::MovingObject::GetAbsVelocity() const {
     const osi3::Vector3d osiVelocity = osiObject->base().velocity();
-    Primitive::AbsVelocity velocity;
-
-    velocity.vx = osiVelocity.x();
-    velocity.vy = osiVelocity.y();
-    velocity.vz = osiVelocity.z();
 
-    return velocity;
+    return {units::velocity::meters_per_second_t(osiVelocity.x()),
+            units::velocity::meters_per_second_t(osiVelocity.y()),
+            units::velocity::meters_per_second_t(osiVelocity.z())};
 }
 
-double OWL::Implementation::MovingObject::GetAbsVelocityDouble() const {
-    Primitive::AbsVelocity velocity = GetAbsVelocity();
-    Primitive::AbsOrientation orientation = GetAbsOrientation();
+units::velocity::meters_per_second_t OWL::Implementation::MovingObject::GetAbsVelocityDouble() const {
+    const auto velocity = GetAbsVelocity();
+    mantle_api::Orientation3<units::angle::radian_t> orientation = GetAbsOrientation();
     double sign = 1.0;
 
-    double velocityAngle = std::atan2(velocity.vy, velocity.vx);
+    auto velocityAngle = units::math::atan2(velocity.y, velocity.x);
 
-    if (std::abs(velocity.vx) == 0.0 && std::abs(velocity.vy) == 0.0) {
-        velocityAngle = 0.0;
+    if (units::math::abs(velocity.x) == 0.0_mps && units::math::abs(velocity.y) == 0.0_mps)
+    {
+        velocityAngle = 0.0_rad;
     }
 
-    double angleBetween = velocityAngle - orientation.yaw;
+    auto angleBetween = velocityAngle - orientation.yaw;
 
-    if (std::abs(angleBetween) > M_PI_2 && std::abs(angleBetween) < 3 * M_PI_2) {
+    if (units::math::abs(angleBetween) > 1_rad * M_PI_2 && units::math::abs(angleBetween) < 3_rad * M_PI_2)
+    {
         sign = -1.0;
     }
 
-    return openpass::hypot(velocity.vx, velocity.vy) * sign;
+    return openpass::hypot(velocity.x, velocity.y) * sign;
 }
 
-void OWL::Implementation::MovingObject::SetAbsVelocity(const Primitive::AbsVelocity &newVelocity) {
+void OWL::Implementation::MovingObject::SetAbsVelocity(const mantle_api::Vec3<units::velocity::meters_per_second_t> &newVelocity)
+{
     osi3::Vector3d *osiVelocity = osiObject->mutable_base()->mutable_velocity();
 
-    osiVelocity->set_x(newVelocity.vx);
-    osiVelocity->set_y(newVelocity.vy);
-    osiVelocity->set_z(newVelocity.vz);
+    osiVelocity->set_x(units::unit_cast<double>(newVelocity.x));
+    osiVelocity->set_y(units::unit_cast<double>(newVelocity.y));
+    osiVelocity->set_z(units::unit_cast<double>(newVelocity.z));
 }
 
-void OWL::Implementation::MovingObject::SetAbsVelocity(const double newVelocity) {
+void OWL::Implementation::MovingObject::SetAbsVelocity(const units::velocity::meters_per_second_t newVelocity)
+{
     osi3::Vector3d *osiVelocity = osiObject->mutable_base()->mutable_velocity();
 
-    double yaw = GetAbsOrientation().yaw;
-    double cos_val = std::cos(yaw);
-    double sin_val = std::sin(yaw);
+    auto yaw = GetAbsOrientation().yaw;
+    auto cos_val = units::math::cos(yaw);
+    auto sin_val = units::math::sin(yaw);
 
-    osiVelocity->set_x(newVelocity * cos_val);
-    osiVelocity->set_y(newVelocity * sin_val);
+    osiVelocity->set_x(units::unit_cast<double>(newVelocity * cos_val));
+    osiVelocity->set_y(units::unit_cast<double>(newVelocity * sin_val));
     osiVelocity->set_z(0.0);
 }
 
-OWL::Primitive::AbsAcceleration OWL::Implementation::MovingObject::GetAbsAcceleration() const {
+OWL::Primitive::AbsAcceleration OWL::Implementation::MovingObject::GetAbsAcceleration() const
+{
     const osi3::Vector3d osiAcceleration = osiObject->base().acceleration();
-    Primitive::AbsAcceleration acceleration;
+    OWL::Primitive::AbsAcceleration acceleration;
 
-    acceleration.ax = osiAcceleration.x();
-    acceleration.ay = osiAcceleration.y();
-    acceleration.az = osiAcceleration.z();
+    acceleration.ax = units::acceleration::meters_per_second_squared_t(osiAcceleration.x());
+    acceleration.ay = units::acceleration::meters_per_second_squared_t(osiAcceleration.y());
+    acceleration.az = units::acceleration::meters_per_second_squared_t(osiAcceleration.z());
 
     return acceleration;
 }
 
-double OWL::Implementation::MovingObject::GetAbsAccelerationDouble() const {
-    Primitive::AbsAcceleration acceleration = GetAbsAcceleration();
-    Primitive::AbsOrientation orientation = GetAbsOrientation();
+units::acceleration::meters_per_second_squared_t OWL::Implementation::MovingObject::GetAbsAccelerationDouble() const
+{
+    OWL::Primitive::AbsAcceleration acceleration = GetAbsAcceleration();
+    mantle_api::Orientation3<units::angle::radian_t> orientation = GetAbsOrientation();
     double sign = 1.0;
 
-    double accAngle = std::atan2(acceleration.ay, acceleration.ax);
+    units::angle::radian_t accAngle = units::math::atan2(acceleration.ay, acceleration.ax);
 
-    if (std::abs(acceleration.ax) == 0.0 && std::abs(acceleration.ay) == 0.0) {
-        accAngle = 0.0;
+    if (units::math::abs(acceleration.ax) == 0.0_mps_sq && units::math::abs(acceleration.ay) == 0.0_mps_sq)
+    {
+        accAngle = 0.0_rad;
     }
 
-    double angleBetween = accAngle - orientation.yaw;
+    const auto angleBetween = accAngle - orientation.yaw;
 
-    if ((std::abs(angleBetween) - M_PI_2) > 0) {
+    if ((units::math::abs(angleBetween) - 1_rad * M_PI_2) > 0_rad)
+    {
         sign = -1.0;
     }
 
     return openpass::hypot(acceleration.ax, acceleration.ay) * sign;
 }
 
-void OWL::Implementation::MovingObject::SetAbsAcceleration(const Primitive::AbsAcceleration &newAcceleration) {
+void OWL::Implementation::MovingObject::SetAbsAcceleration(const OWL::Primitive::AbsAcceleration &newAcceleration)
+{
     osi3::Vector3d *osiAcceleration = osiObject->mutable_base()->mutable_acceleration();
 
-    osiAcceleration->set_x(newAcceleration.ax);
-    osiAcceleration->set_y(newAcceleration.ay);
-    osiAcceleration->set_z(newAcceleration.az);
+    osiAcceleration->set_x(units::unit_cast<double>(newAcceleration.ax));
+    osiAcceleration->set_y(units::unit_cast<double>(newAcceleration.ay));
+    osiAcceleration->set_z(units::unit_cast<double>(newAcceleration.az));
 }
 
-void OWL::Implementation::MovingObject::SetAbsAcceleration(const double newAcceleration) {
+void OWL::Implementation::MovingObject::SetAbsAcceleration(const units::acceleration::meters_per_second_squared_t newAcceleration)
+{
     osi3::Vector3d *osiAcceleration = osiObject->mutable_base()->mutable_acceleration();
 
-    double yaw = GetAbsOrientation().yaw;
-    double cos_val = std::cos(yaw);
-    double sin_val = std::sin(yaw);
+    auto yaw = GetAbsOrientation().yaw;
+    auto cos_val = units::math::cos(yaw);
+    auto sin_val = units::math::sin(yaw);
 
-    osiAcceleration->set_x(newAcceleration * cos_val);
-    osiAcceleration->set_y(newAcceleration * sin_val);
+    osiAcceleration->set_x(newAcceleration.value() * cos_val);
+    osiAcceleration->set_y(newAcceleration.value() * sin_val);
     osiAcceleration->set_z(0.0);
 }
 
-OWL::Primitive::AbsOrientationRate OWL::Implementation::MovingObject::GetAbsOrientationRate() const {
+mantle_api::Orientation3<units::angular_velocity::radians_per_second_t> OWL::Implementation::MovingObject::GetAbsOrientationRate() const
+{
     const osi3::Orientation3d osiOrientationRate = osiObject->base().orientation_rate();
 
-    return Primitive::AbsOrientationRate
-            {
-                    osiOrientationRate.yaw(),
-                    osiOrientationRate.pitch(),
-                    osiOrientationRate.roll()
-            };
+    return {
+        units::angular_velocity::radians_per_second_t(osiOrientationRate.yaw()),
+        units::angular_velocity::radians_per_second_t(osiOrientationRate.pitch()),
+        units::angular_velocity::radians_per_second_t(osiOrientationRate.roll())};
 }
 
 OWL::Primitive::AbsOrientationAcceleration OWL::Implementation::MovingObject::GetAbsOrientationAcceleration() const {
     const osi3::Orientation3d osiOrientationAcceleration = osiObject->base().orientation_acceleration();
 
-    return Primitive::AbsOrientationAcceleration
+    return OWL::Primitive::AbsOrientationAcceleration
             {
-            osiOrientationAcceleration.yaw(),
-            osiOrientationAcceleration.pitch(),
-            osiOrientationAcceleration.roll()
-            };
+        units::angular_acceleration::radians_per_second_squared_t(osiOrientationAcceleration.yaw()),
+        units::angular_acceleration::radians_per_second_squared_t(osiOrientationAcceleration.pitch()),
+        units::angular_acceleration::radians_per_second_squared_t(osiOrientationAcceleration.roll())};
 }
 
-void OWL::Implementation::MovingObject::SetAbsOrientationRate(const Primitive::AbsOrientationRate &newOrientationRate) {
+void OWL::Implementation::MovingObject::SetAbsOrientationRate(const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>& newOrientationRate) {
     osi3::Orientation3d *osiOrientationRate = osiObject->mutable_base()->mutable_orientation_rate();
 
-    osiOrientationRate->set_yaw(newOrientationRate.yawRate);
-    osiOrientationRate->set_pitch(newOrientationRate.pitchRate);
-    osiOrientationRate->set_roll(newOrientationRate.rollRate);
+    osiOrientationRate->set_yaw(newOrientationRate.yaw.value());
+    osiOrientationRate->set_pitch(newOrientationRate.pitch.value());
+    osiOrientationRate->set_roll(newOrientationRate.roll.value());
 }
 
 void OWL::Implementation::MovingObject::SetAbsOrientationAcceleration(
-        const Primitive::AbsOrientationAcceleration &newOrientationAcceleration) {
+        const OWL::Primitive::AbsOrientationAcceleration &newOrientationAcceleration) {
     osi3::Orientation3d *osiOrientationAcceleration = osiObject->mutable_base()->mutable_orientation_acceleration();
 
-    osiOrientationAcceleration->set_yaw(newOrientationAcceleration.yawAcceleration);
-    osiOrientationAcceleration->set_pitch(newOrientationAcceleration.pitchAcceleration);
-    osiOrientationAcceleration->set_roll(newOrientationAcceleration.rollAcceleration);
+    osiOrientationAcceleration->set_yaw(newOrientationAcceleration.yawAcceleration.value());
+    osiOrientationAcceleration->set_pitch(newOrientationAcceleration.pitchAcceleration.value());
+    osiOrientationAcceleration->set_roll(newOrientationAcceleration.rollAcceleration.value());
 }
 
 void OWL::Implementation::MovingObject::AddLaneAssignment(const Interfaces::Lane &lane) {
@@ -475,18 +468,18 @@ void OWL::Implementation::MovingObject::SetSourceReference(const OWL::ExternalRe
 void OWL::Implementation::MovingObject::AddWheel(const WheelData& wheelData)
 {
     osi3::MovingObject_VehicleAttributes_WheelData newWheel {};
-    newWheel.set_width(wheelData.width);
-    newWheel.set_rim_radius(wheelData.rim_radius);
-    newWheel.set_rotation_rate(wheelData.rotation_rate);
-    newWheel.set_wheel_radius(wheelData.wheelRadius);
+    newWheel.set_width(wheelData.width.value());
+    newWheel.set_rim_radius(wheelData.rim_radius.value());
+    newWheel.set_rotation_rate(wheelData.rotation_rate.value());
+    newWheel.set_wheel_radius(wheelData.wheelRadius.value());
     newWheel.set_axle(wheelData.axle);
     newWheel.set_index(wheelData.index);
-    newWheel.mutable_position()->set_x(wheelData.position.x);
-    newWheel.mutable_position()->set_y(wheelData.position.y);
-    newWheel.mutable_position()->set_z(wheelData.position.z);
-    newWheel.mutable_orientation()->set_pitch(wheelData.orientation.roll);
-    newWheel.mutable_orientation()->set_roll(wheelData.orientation.pitch);
-    newWheel.mutable_orientation()->set_yaw(wheelData.orientation.yaw);
+    newWheel.mutable_position()->set_x(wheelData.position.x.value());
+    newWheel.mutable_position()->set_y(wheelData.position.y.value());
+    newWheel.mutable_position()->set_z(wheelData.position.z.value());
+    newWheel.mutable_orientation()->set_pitch(wheelData.orientation.roll.value());
+    newWheel.mutable_orientation()->set_roll(wheelData.orientation.pitch.value());
+    newWheel.mutable_orientation()->set_yaw(wheelData.orientation.yaw.value());
     osiObject->mutable_vehicle_attributes()->mutable_wheel_data()->Add(std::move(newWheel));
     if(osiObject->mutable_vehicle_attributes()->number_wheels() == std::numeric_limits<uint32_t>::max())
         osiObject->mutable_vehicle_attributes()->set_number_wheels(0);
@@ -504,11 +497,11 @@ void OWL::Implementation::MovingObject::ClearLaneAssignments() {
 }
 
 OWL::Angle OWL::Implementation::MovingObject::GetSteeringWheelAngle() {
-    return osiObject->mutable_vehicle_attributes()->steering_wheel_angle();
+    return units::angle::radian_t(osiObject->mutable_vehicle_attributes()->steering_wheel_angle());
 }
 
 void OWL::Implementation::MovingObject::SetSteeringWheelAngle(const Angle newValue) {
-    osiObject->mutable_vehicle_attributes()->set_steering_wheel_angle(newValue);
+    osiObject->mutable_vehicle_attributes()->set_steering_wheel_angle(newValue.value());
 }
 
 std::optional<const OWL::WheelData> OWL::Implementation::MovingObject::GetWheelData(unsigned int axleIndex, unsigned int rowIndex) {
@@ -527,33 +520,34 @@ std::optional<const OWL::WheelData> OWL::Implementation::MovingObject::GetWheelD
     }
 }
 
-void OWL::Implementation::MovingObject::SetFrontAxleSteeringYaw(const double wheelYaw) {
+void OWL::Implementation::MovingObject::SetFrontAxleSteeringYaw(OWL::Angle wheelYaw) {
     std::for_each(osiObject->mutable_vehicle_attributes()->mutable_wheel_data()->begin(),
                   osiObject->mutable_vehicle_attributes()->mutable_wheel_data()->end(),
                   [wheelYaw](osi3::MovingObject_VehicleAttributes_WheelData& wheel)
                   {
                       if(wheel.axle() == 0) // assuming steering axle is in front
-                      wheel.mutable_orientation()->set_yaw( wheelYaw); });
+                      wheel.mutable_orientation()->set_yaw( wheelYaw.value()); });
 }
 
-void OWL::Implementation::MovingObject::SetWheelsRotationRateAndOrientation(const double velocity, const double wheelRadiusFront, const double wheelRadiusRear, const double cycleTime)
+void OWL::Implementation::MovingObject::SetWheelsRotationRateAndOrientation(const units::velocity::meters_per_second_t velocity,
+             const units::length::meter_t wheelRadiusFront, const units::length::meter_t wheelRadiusRear, const units::time::second_t cycleTime)
 {
-    double rotationRateFront = velocity / wheelRadiusFront;
-    double rotationRateRear = velocity / wheelRadiusRear;
+    auto rotationRateFront = units::angle::radian_t(1) * velocity / wheelRadiusFront;
+    auto rotationRateRear = units::angle::radian_t(1) * velocity / wheelRadiusRear;
     std::for_each(osiObject->mutable_vehicle_attributes()->mutable_wheel_data()->begin(),
                   osiObject->mutable_vehicle_attributes()->mutable_wheel_data()->end(),
                   [rotationRateFront, rotationRateRear, cycleTime](osi3::MovingObject_VehicleAttributes_WheelData& wheel)
                   {
                       if(wheel.axle() == 0)
                       {
-                          wheel.set_rotation_rate(rotationRateFront);
-                          auto newAngle = CommonHelper::SetAngleToValidRange(wheel.mutable_orientation()->pitch() + rotationRateFront * cycleTime);
-                          wheel.mutable_orientation()->set_pitch(newAngle);
+                          wheel.set_rotation_rate(rotationRateFront.value());
+                          auto newAngle = CommonHelper::SetAngleToValidRange(units::angle::radian_t(wheel.mutable_orientation()->pitch()) + rotationRateFront * cycleTime);
+                          wheel.mutable_orientation()->set_pitch(newAngle.value());
                       }
                       else {
-                          wheel.set_rotation_rate(rotationRateRear);
-                          auto newAngle = CommonHelper::SetAngleToValidRange(wheel.mutable_orientation()->pitch() + rotationRateRear * cycleTime);
-                          wheel.mutable_orientation()->set_pitch(newAngle);
+                          wheel.set_rotation_rate(rotationRateRear.value());
+                          auto newAngle = CommonHelper::SetAngleToValidRange(units::angle::radian_t(wheel.mutable_orientation()->pitch()) + rotationRateRear * cycleTime);
+                          wheel.mutable_orientation()->set_pitch(newAngle.value());
                       }
                       wheel.mutable_orientation()->set_roll( 0.0);
                   });
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.h
index 4d9f8a45683ef33498cc3505c03d4c743b55cd0e..c7c27dc3bd94534b8b6d3f60a529a0ea6e02e56e 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.h
@@ -17,118 +17,81 @@ namespace OWL::Implementation {
 
     class MovingObject : public Interfaces::MovingObject {
     public:
-        MovingObject(osi3::MovingObject *osiMovingObject);
-
-        ~MovingObject() override = default;
-
-        Id GetId() const override;
-
-        //Base
-        Primitive::Dimension GetDimension() const override;
-
-        Primitive::AbsPosition GetReferencePointPosition() const override;
-
-        const RoadIntervals &GetTouchedRoads() const override;
-
-        double GetDistanceReferencePointToLeadingEdge() const override;
-
-        Primitive::AbsOrientation GetAbsOrientation() const override;
-
-        Primitive::LaneOrientation GetLaneOrientation() const override;
-
-        Primitive::AbsVelocity GetAbsVelocity() const override;
-
-        double GetAbsVelocityDouble() const override;
-
-        Primitive::AbsAcceleration GetAbsAcceleration() const override;
-
-        double GetAbsAccelerationDouble() const override;
-
-        Primitive::AbsOrientationRate GetAbsOrientationRate() const override;
-
-        Primitive::AbsOrientationAcceleration GetAbsOrientationAcceleration() const override;
-
-        void SetBoundingBoxCenterToRear(double distanceX, double distanceY, double distanceZ) override;
-
-        void SetBoundingBoxCenterToFront(double distanceX, double distanceY, double distanceZ) override;
-
-        void SetReferencePointPosition(const Primitive::AbsPosition &newPosition) override;
-
-        void SetX(const double newX) override;
-
-        void SetY(const double newY) override;
-
-        void SetZ(const double newZ) override;
-
-        void SetTouchedRoads(const RoadIntervals &touchedRoads) override;
-
-        void SetDimension(const Primitive::Dimension &newDimension) override;
-
-        void SetLength(const double newLength) override;
-
-        void SetWidth(const double newWidth) override;
-
-        void SetHeight(const double newHeight) override;
-
-        void SetAbsOrientation(const Primitive::AbsOrientation &newOrientation) override;
-
-        void SetYaw(const double newYaw) override;
-
-        void SetPitch(const double newPitch) override;
-
-        void SetRoll(const double newRoll) override;
-
-        void SetAbsVelocity(const Primitive::AbsVelocity &newVelocity) override;
-
-        void SetAbsVelocity(const double newVelocity) override;
-
-        void SetAbsAcceleration(const Primitive::AbsAcceleration &newAcceleration) override;
-
-        void SetAbsAcceleration(const double newAcceleration) override;
-
-        void SetAbsOrientationRate(const Primitive::AbsOrientationRate &newOrientationRate) override;
-
-        void SetAbsOrientationAcceleration(const Primitive::AbsOrientationAcceleration &newOrientationAcceleration) override;
-
-        void AddLaneAssignment(const Interfaces::Lane &lane) override;
-
-        const Interfaces::Lanes &GetLaneAssignments() const override;
-
-        void ClearLaneAssignments() override;
-
-        void SetIndicatorState(IndicatorState indicatorState) override;
-
-        IndicatorState GetIndicatorState() const override;
-
-        void SetBrakeLightState(bool brakeLightState) override;
-
-        bool GetBrakeLightState() const override;
-
-        void SetHeadLight(bool headLight) override;
-
-        bool GetHeadLight() const override;
-
-        void SetHighBeamLight(bool highbeamLight) override;
-
-        bool GetHighBeamLight() const override;
-
-        void SetType(AgentVehicleType) override;
-
-        void AddWheel(const WheelData &wheelData) override;
-
-        std::optional<const WheelData> GetWheelData(unsigned int axleIndex, unsigned int rowIndex) override;
-
-        Angle GetSteeringWheelAngle() override;
-
-        void SetSteeringWheelAngle(const Angle newValue) override;
-
-        void SetFrontAxleSteeringYaw(const double wheelYaw) override;
-
-        void SetWheelsRotationRateAndOrientation(const double velocity, const double wheelRadiusFront, const double wheelRadiusRear, const double cycleTime) override;
-
-        void SetSourceReference(const ExternalReference &externalReference) override;
-
-        void CopyToGroundTruth(osi3::GroundTruth &target) const override;
+    MovingObject(osi3::MovingObject* osiMovingObject);
+    virtual ~MovingObject() override = default;
+
+    virtual Id GetId() const override;
+
+    virtual mantle_api::Dimension3 GetDimension() const override;
+    virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const override;
+    virtual const RoadIntervals &GetTouchedRoads() const override;
+    virtual units::length::meter_t GetDistanceReferencePointToLeadingEdge() const override;
+
+    virtual mantle_api::Orientation3<units::angle::radian_t> GetAbsOrientation() const override;
+    virtual Primitive::LaneOrientation GetLaneOrientation() const override;
+
+    virtual mantle_api::Vec3<units::velocity::meters_per_second_t> GetAbsVelocity() const override;
+    virtual units::velocity::meters_per_second_t GetAbsVelocityDouble() const override;
+
+    virtual Primitive::AbsAcceleration GetAbsAcceleration() const override;
+    virtual units::acceleration::meters_per_second_squared_t GetAbsAccelerationDouble() const override;
+
+    virtual mantle_api::Orientation3<units::angular_velocity::radians_per_second_t> GetAbsOrientationRate() const override;
+    virtual Primitive::AbsOrientationAcceleration GetAbsOrientationAcceleration() const override;
+
+    virtual void SetDimension(const mantle_api::Dimension3& newDimension) override;
+    virtual void SetLength(const units::length::meter_t newLength) override;
+    virtual void SetWidth(const units::length::meter_t newWidth) override;
+    virtual void SetHeight(const units::length::meter_t newHeight) override;
+    virtual void SetBoundingBoxCenterToRear(const units::length::meter_t distanceX, const units::length::meter_t distanceY, const units::length::meter_t distanceZ) override;
+    virtual void SetBoundingBoxCenterToFront(const units::length::meter_t distanceX, const units::length::meter_t distanceY, const units::length::meter_t distanceZ) override;
+
+    virtual void SetReferencePointPosition(const mantle_api::Vec3<units::length::meter_t>& newPosition) override;
+    virtual void SetX(const units::length::meter_t newX) override;
+    virtual void SetY(const units::length::meter_t newY) override;
+    virtual void SetZ(const units::length::meter_t newZ) override;
+
+    virtual void SetTouchedRoads(const RoadIntervals &touchedRoads) override;
+
+    virtual void SetAbsOrientation(const mantle_api::Orientation3<units::angle::radian_t>& newOrientation) override;
+    virtual void SetYaw(const units::angle::radian_t newYaw) override;
+    virtual void SetPitch(const units::angle::radian_t newPitch) override;
+    virtual void SetRoll(const units::angle::radian_t newRoll) override;
+
+    virtual void SetAbsVelocity(const mantle_api::Vec3<units::velocity::meters_per_second_t>& newVelocity) override;
+    virtual void SetAbsVelocity(const units::velocity::meters_per_second_t newVelocity) override;
+
+    virtual void SetAbsAcceleration(const Primitive::AbsAcceleration& newAcceleration) override;
+    virtual void SetAbsAcceleration(const units::acceleration::meters_per_second_squared_t newAcceleration) override;
+
+    virtual void SetAbsOrientationRate(const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>& newOrientationRate) override;
+    virtual void SetAbsOrientationAcceleration(const Primitive::AbsOrientationAcceleration &newOrientationAcceleration) override;
+
+    void AddLaneAssignment(const Interfaces::Lane& lane) override;
+    const Interfaces::Lanes& GetLaneAssignments() const override;
+    void ClearLaneAssignments() override;
+
+    virtual void SetIndicatorState(IndicatorState indicatorState) override;
+    virtual IndicatorState GetIndicatorState() const override;
+    virtual void SetBrakeLightState(bool brakeLightState) override;
+    virtual bool GetBrakeLightState() const override;
+    virtual void SetHeadLight(bool headLight) override;
+    virtual bool GetHeadLight() const override;
+    virtual void SetHighBeamLight(bool highbeamLight) override;
+    virtual bool GetHighBeamLight() const override;
+
+    virtual void SetType(mantle_api::EntityType type) override;
+    virtual void SetVehicleClassification(mantle_api::VehicleClass vehicleClassification) override;
+
+    virtual void SetSourceReference(const ExternalReference& externalReference) override;
+    virtual void AddWheel(const WheelData& wheelData) override;
+    virtual std::optional<const WheelData> GetWheelData(unsigned int axleIndex, unsigned int rowIndex) override;
+    virtual Angle GetSteeringWheelAngle() override;
+    virtual void SetSteeringWheelAngle(const Angle newValue) override;
+    virtual void SetFrontAxleSteeringYaw(const Angle wheelYaw) override;
+    virtual void SetWheelsRotationRateAndOrientation(const units::velocity::meters_per_second_t velocity,
+             const units::length::meter_t wheelRadiusFront, const units::length::meter_t wheelRadiusRear, const units::time::second_t cycleTime) override;
+    void CopyToGroundTruth(osi3::GroundTruth& target) const override;
 
     private:
         osi3::MovingObject *osiObject;
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/Primitives.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/Primitives.h
index 71db9983d56e8d74c652c2417356328471e2e8ec..aeeaac2f5933d06c4d2b037c4aea79ef1af9e57d 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/Primitives.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/Primitives.h
@@ -15,139 +15,105 @@
 #include "common/hypot.h"
 
 namespace OWL {
-    namespace Primitive {
-
-        struct Vector3 {
-            double x;
-            double y;
-            double z;
-        };
-
-        struct Dimension {
-            double length;
-            double width;
-            double height;
-        };
-
-        struct AbsCoordinate {
-            double x;
-            double y;
-            double hdg;
-        };
-
-        struct AbsPosition {
-            AbsPosition() = default;
-
-            AbsPosition(const AbsPosition &) = default;
-
-            AbsPosition operator+(const AbsPosition &ref) const {
-                return {x + ref.x,
-                        y + ref.y,
-                        z + ref.z
-                };
-            }
-
-            AbsPosition operator-(const AbsPosition &ref) const {
-                return {x - ref.x,
-                        y - ref.y,
-                        z - ref.z
-                };
-            }
-
-            double distance() const {
-                return openpass::hypot(x, openpass::hypot(y, z));
-            }
-
-            void RotateYaw(double angle) {
-                double cosValue = std::cos(angle);
-                double sinValue = std::sin(angle);
-                double newX = x * cosValue - y * sinValue;
-                double newY = x * sinValue + y * cosValue;
-                x = newX;
-                y = newY;
-            }
-
-            double x;
-            double y;
-            double z;
-        };
-
-        struct AbsVelocity {
-            double vx;
-            double vy;
-            double vz;
-        };
-
-        struct AbsAcceleration {
-            double ax;
-            double ay;
-            double az;
-        };
-
-        struct AbsOrientation {
-            double yaw;
-            double pitch;
-            double roll;
-        };
-
-        struct AbsOrientationRate {
-            double yawRate;
-            double pitchRate;
-            double rollRate;
-        };
-
-        struct AbsOrientationAcceleration {
-            double yawAcceleration;
-            double pitchAcceleration;
-            double rollAcceleration;
-        };
-
-        struct RoadCoordinate {
-            double s;
-            double t;
-            double yaw;
-        };
-
-        struct RoadVelocity {
-            double vs;
-            double vt;
-            double vz;
-        };
-
-        struct RoadAcceleration {
-            double as;
-            double at;
-            double az;
-        };
-
-        struct RoadOrientationRate {
-            double hdgRate;
-        };
-
-        struct LanePosition {
-            double v;
-            double w;
-        };
-
-        struct LaneVelocity {
-            double vv;
-            double vw;
-            double vz;
-        };
-
-        struct LaneAcceleration {
-            double av;
-            double aw;
-            double az;
-        };
-
-        struct LaneOrientation {
-            double hdg;
-        };
-
-        struct LaneOrientationRate {
-            double hdgRate;
-        };
-
-    } // namespace Primitive
+namespace Primitive {
+
+struct Vector3
+{
+    double x;
+    double y;
+    double z;
+};
+
+struct AbsCoordinate
+{
+    units::length::meter_t x;
+    units::length::meter_t y;
+    units::angle::radian_t hdg;
+};
+
+struct AbsAcceleration
+{
+    units::acceleration::meters_per_second_squared_t ax;
+    units::acceleration::meters_per_second_squared_t ay;
+    units::acceleration::meters_per_second_squared_t az;
+};
+
+struct AbsOrientation
+{
+    units::angle::radian_t yaw;
+    units::angle::radian_t pitch;
+    units::angle::radian_t roll;
+};
+
+struct AbsOrientationRate
+{
+    units::angular_velocity::radians_per_second_t yawRate;
+    units::angular_velocity::radians_per_second_t pitchRate;
+    units::angular_velocity::radians_per_second_t rollRate;
+};
+
+struct AbsOrientationAcceleration
+{
+    units::angular_acceleration::radians_per_second_squared_t yawAcceleration;
+    units::angular_acceleration::radians_per_second_squared_t pitchAcceleration;
+    units::angular_acceleration::radians_per_second_squared_t rollAcceleration;
+};
+
+struct RoadCoordinate
+{
+    units::length::meter_t s;
+    units::length::meter_t t;
+    units::angle::radian_t yaw;
+};
+
+struct RoadVelocity
+{
+    double vs;
+    double vt;
+    double vz;
+};
+
+struct RoadAcceleration
+{
+    double as;
+    double at;
+    double az;
+};
+
+struct RoadOrientationRate
+{
+    double hdgRate;
+};
+
+struct LanePosition
+{
+    double v;
+    double w;
+};
+
+struct LaneVelocity
+{
+    double vv;
+    double vw;
+    double vz;
+};
+
+struct LaneAcceleration
+{
+    double av;
+    double aw;
+    double az;
+};
+
+struct LaneOrientation
+{
+    units::angle::radian_t hdg;
+};
+
+struct LaneOrientationRate
+{
+    double hdgRate;
+};
+
+} // namespace Primitive
 } // namespace OWL
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/TrafficLight.cpp b/sim/src/core/opSimulation/modules/World_OSI/OWL/TrafficLight.cpp
index f4a65f163a5a7ee1c331ff9d5c636ee715b9d7bd..fd529d78d1ed65fad3e8fa646c5c980b1f28b468 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/TrafficLight.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/TrafficLight.cpp
@@ -122,19 +122,19 @@ osi3::TrafficLight_Classification_Icon TrafficLightBase::fetchIconsFromSignal(Ro
 
 void TrafficLightBase::SetBaseOfOsiObject(const RoadSignalInterface *signal, const Position &position,
                                           osi3::TrafficLight *osiTrafficLightObject, int numberOfSignals) {
-    double yaw = position.yawAngle + signal->GetHOffset() + (signal->GetOrientation() ? 0 : M_PI);
+    auto yaw = position.yawAngle + signal->GetHOffset() + (signal->GetOrientation() ? 0_rad : units::angle::radian_t(M_PI));
     yaw = CommonHelper::SetAngleToValidRange(yaw);
 
     if(numberOfSignals <= 1) numberOfSignals = 1;
 
-    osiTrafficLightObject->mutable_base()->mutable_position()->set_x(position.xPos);
-    osiTrafficLightObject->mutable_base()->mutable_position()->set_y(position.yPos);
-    osiTrafficLightObject->mutable_base()->mutable_position()->set_z(signal->GetZOffset() + 0.5 * signal->GetHeight());
-    osiTrafficLightObject->mutable_base()->mutable_dimension()->set_width(signal->GetWidth());
-    osiTrafficLightObject->mutable_base()->mutable_dimension()->set_height(signal->GetHeight() / static_cast<float>(numberOfSignals));
+    osiTrafficLightObject->mutable_base()->mutable_position()->set_x(position.xPos.value());
+    osiTrafficLightObject->mutable_base()->mutable_position()->set_y(position.yPos.value());
+    osiTrafficLightObject->mutable_base()->mutable_position()->set_z(signal->GetZOffset().value() + 0.5 * signal->GetHeight().value());
+    osiTrafficLightObject->mutable_base()->mutable_dimension()->set_width(signal->GetWidth().value());
+    osiTrafficLightObject->mutable_base()->mutable_dimension()->set_height(signal->GetHeight().value() / static_cast<float>(numberOfSignals));
     osiTrafficLightObject->mutable_base()->mutable_dimension()->set_length(
-        signal->GetWidth()); //OpenDrive 1.6 only supports height und width, so we make a cube here
-    osiTrafficLightObject->mutable_base()->mutable_orientation()->set_yaw(yaw);
+        signal->GetWidth().value()); //OpenDrive 1.6 only supports height und width, so we make a cube here
+    osiTrafficLightObject->mutable_base()->mutable_orientation()->set_yaw(yaw.value());
 
 }
 
@@ -198,15 +198,12 @@ bool ThreeSignalsTrafficLight::SetSpecification(RoadSignalInterface *signal, con
     return success;
 }
 
-OWL::Primitive::AbsPosition ThreeSignalsTrafficLight::GetReferencePointPosition() const {
+mantle_api::Vec3<units::length::meter_t> ThreeSignalsTrafficLight::GetReferencePointPosition() const {
     const osi3::Vector3d osiPosition = osiLightGreen->base().position();
-    Primitive::AbsPosition position;
 
-    position.x = osiPosition.x();
-    position.y = osiPosition.y();
-    position.z = osiPosition.z();
-
-    return position;
+    return {units::length::meter_t(osiPosition.x()),
+            units::length::meter_t(osiPosition.y()),
+            units::length::meter_t(osiPosition.z())};
 }
 
 void ThreeSignalsTrafficLight::CopyToGroundTruth(osi3::GroundTruth &target) const {
@@ -218,7 +215,7 @@ void ThreeSignalsTrafficLight::CopyToGroundTruth(osi3::GroundTruth &target) cons
     newLightGreen->CopyFrom(*osiLightGreen);
 }
 
-OWL::Primitive::Dimension ThreeSignalsTrafficLight::GetDimension() const {
+mantle_api::Dimension3 ThreeSignalsTrafficLight::GetDimension() const {
     return OWL::GetDimensionFromOsiObject(osiLightRed);
 }
 
@@ -263,7 +260,7 @@ void ThreeSignalsTrafficLight::SetState(CommonTrafficLight::State newState) {
     }
 }
 
-CommonTrafficLight::Entity ThreeSignalsTrafficLight::GetSpecification(const double relativeDistance) const {
+CommonTrafficLight::Entity ThreeSignalsTrafficLight::GetSpecification(const units::length::meter_t relativeDistance) const {
     CommonTrafficLight::Entity specification;
 
     specification.relativeDistance = relativeDistance;
@@ -366,15 +363,12 @@ bool TwoSignalsTrafficLight::SetSpecification(RoadSignalInterface *signal, const
   return success;
 }
 
-OWL::Primitive::AbsPosition TwoSignalsTrafficLight::GetReferencePointPosition() const {
+mantle_api::Vec3<units::length::meter_t> TwoSignalsTrafficLight::GetReferencePointPosition() const {
     const osi3::Vector3d osiPosition = osiLightBottom->base().position();
-    Primitive::AbsPosition position{};
-
-    position.x = osiPosition.x();
-    position.y = osiPosition.y();
-    position.z = osiPosition.z();
 
-    return position;
+    return {units::length::meter_t(osiPosition.x()),
+            units::length::meter_t(osiPosition.y()),
+            units::length::meter_t(osiPosition.z())};
 }
 
 void TwoSignalsTrafficLight::CopyToGroundTruth(osi3::GroundTruth &target) const {
@@ -384,7 +378,7 @@ void TwoSignalsTrafficLight::CopyToGroundTruth(osi3::GroundTruth &target) const
     newLightBottom->CopyFrom(*osiLightBottom);
 }
 
-OWL::Primitive::Dimension TwoSignalsTrafficLight::GetDimension() const {
+mantle_api::Dimension3 TwoSignalsTrafficLight::GetDimension() const {
     return OWL::GetDimensionFromOsiObject(osiLightTop);
 }
 
@@ -441,7 +435,7 @@ void TwoSignalsTrafficLight::SetState(CommonTrafficLight::State newState)
     }
 }
 
-CommonTrafficLight::Entity TwoSignalsTrafficLight::GetSpecification(const double relativeDistance) const {
+CommonTrafficLight::Entity TwoSignalsTrafficLight::GetSpecification(const units::length::meter_t relativeDistance) const {
     CommonTrafficLight::Entity specification;
 
     specification.relativeDistance = relativeDistance;
@@ -561,15 +555,12 @@ bool OneSignalsTrafficLight::SetSpecification(RoadSignalInterface *signal, const
             SetSpecificationOnOsiObject(signal, position, osiTrafficLight);
 }
 
-OWL::Primitive::AbsPosition OneSignalsTrafficLight::GetReferencePointPosition() const {
+mantle_api::Vec3<units::length::meter_t> OneSignalsTrafficLight::GetReferencePointPosition() const {
     const osi3::Vector3d osiPosition = osiTrafficLight->base().position();
-    Primitive::AbsPosition position{};
-
-    position.x = osiPosition.x();
-    position.y = osiPosition.y();
-    position.z = osiPosition.z();
 
-    return position;
+    return {units::length::meter_t(osiPosition.x()),
+            units::length::meter_t(osiPosition.y()),
+            units::length::meter_t(osiPosition.z())};
 }
 
 void OneSignalsTrafficLight::CopyToGroundTruth(osi3::GroundTruth &target) const {
@@ -577,7 +568,7 @@ void OneSignalsTrafficLight::CopyToGroundTruth(osi3::GroundTruth &target) const
     newLight->CopyFrom(*osiTrafficLight);
 }
 
-OWL::Primitive::Dimension OneSignalsTrafficLight::GetDimension() const {
+mantle_api::Dimension3 OneSignalsTrafficLight::GetDimension() const {
     return OWL::GetDimensionFromOsiObject(osiTrafficLight);
 }
 
@@ -615,7 +606,7 @@ void OneSignalsTrafficLight::SetState(CommonTrafficLight::State newState) {
     }
 }
 
-CommonTrafficLight::Entity OneSignalsTrafficLight::GetSpecification(const double relativeDistance) const {
+CommonTrafficLight::Entity OneSignalsTrafficLight::GetSpecification(const units::length::meter_t relativeDistance) const {
     CommonTrafficLight::Entity specification;
 
     specification.relativeDistance = relativeDistance;
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/TrafficLight.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/TrafficLight.h
index 016d40a24152c2fd625b95627386fcaa305b60b7..0722b3691b99598aec277341b97f2276caaa4cf4 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/TrafficLight.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/TrafficLight.h
@@ -30,12 +30,12 @@ public:
         return id;
     }
 
-    virtual double GetS() const override
+    virtual units::length::meter_t GetS() const override
     {
         return s;
     }
 
-    virtual void SetS(double sPos) override
+    virtual void SetS(units::length::meter_t sPos) override
     {
         s = sPos;
     }
@@ -62,7 +62,7 @@ public:
 
 protected:
     std::string id{""};
-    double s{0.0};
+    units::length::meter_t s{0.0_m};
 
     const CallbackInterface *callbacks;
 };
@@ -85,9 +85,9 @@ public:
 
     virtual bool SetSpecification(RoadSignalInterface *signal, const Position &position) override;
 
-    virtual Primitive::AbsPosition GetReferencePointPosition() const override;
+    virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const override;
 
-    virtual Primitive::Dimension GetDimension() const override;
+    virtual mantle_api::Dimension3 GetDimension() const override;
 
     void SetValidForLane(OWL::Id laneId) override
     {
@@ -100,7 +100,7 @@ public:
 
     virtual void SetState(CommonTrafficLight::State newState);
 
-    virtual CommonTrafficLight::Entity GetSpecification(const double relativeDistance) const override;
+    virtual CommonTrafficLight::Entity GetSpecification(const units::length::meter_t relativeDistance) const override;
 
     virtual CommonTrafficLight::State GetState() const;
 
@@ -138,9 +138,9 @@ public:
 
     virtual bool SetSpecification(RoadSignalInterface *signal, const Position &position) override;
 
-    virtual Primitive::AbsPosition GetReferencePointPosition() const override;
+    virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const override;
 
-    virtual Primitive::Dimension GetDimension() const override;
+    virtual mantle_api::Dimension3 GetDimension() const override;
 
     virtual void SetValidForLane(OWL::Id laneId) override
     {
@@ -152,7 +152,7 @@ public:
 
     virtual void SetState(CommonTrafficLight::State newState);
 
-    virtual CommonTrafficLight::Entity GetSpecification(const double relativeDistance) const override;
+    virtual CommonTrafficLight::Entity GetSpecification(const units::length::meter_t relativeDistance) const override;
 
     virtual CommonTrafficLight::State GetState() const;
 
@@ -201,9 +201,9 @@ public:
 
     virtual bool SetSpecification(RoadSignalInterface *signal, const Position &position) override;
 
-    virtual Primitive::AbsPosition GetReferencePointPosition() const override;
+    virtual mantle_api::Vec3<units::length::meter_t> GetReferencePointPosition() const override;
 
-    virtual Primitive::Dimension GetDimension() const override;
+    virtual mantle_api::Dimension3 GetDimension() const override;
 
     virtual void SetValidForLane(OWL::Id laneId) override
     {
@@ -214,7 +214,7 @@ public:
 
     virtual void SetState(CommonTrafficLight::State newState);
 
-    virtual CommonTrafficLight::Entity GetSpecification(const double relativeDistance) const override;
+    virtual CommonTrafficLight::Entity GetSpecification(const units::length::meter_t relativeDistance) const override;
 
     virtual CommonTrafficLight::State GetState() const;
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLane.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLane.h
index 678eb370d450da138839972b4b339fcc99b7ca58..e34f2c68cc8584311db1cfc86ec180fa88457fde 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLane.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLane.h
@@ -35,30 +35,30 @@ public:
     MOCK_CONST_METHOD0(GetLaneGeometryElements,
                        const OWL::Interfaces::LaneGeometryElements & ());
     MOCK_CONST_METHOD0(GetLength,
-                       double());
+                       units::length::meter_t());
     MOCK_CONST_METHOD0(GetRightLaneCount,
                        int());
     MOCK_CONST_METHOD1(GetCurvature,
-                       double(double distance));
+                       units::curvature::inverse_meter_t(units::length::meter_t distance));
     MOCK_CONST_METHOD1(GetWidth,
-                       double(double distance));
+                       units::length::meter_t(units::length::meter_t distance));
     MOCK_CONST_METHOD1(GetDirection,
-                       double(double distance));
+                       units::angle::radian_t(units::length::meter_t distance));
     MOCK_CONST_METHOD1(GetInterpolatedPointsAtDistance,
-                       const OWL::Primitive::LaneGeometryJoint::Points(double));
+                       const OWL::Primitive::LaneGeometryJoint::Points(units::length::meter_t));
     MOCK_CONST_METHOD0(GetLeftLane,
                        const OWL::Interfaces::Lane & ());
     MOCK_CONST_METHOD0(GetRightLane,
                        const OWL::Interfaces::Lane & ());
     MOCK_CONST_METHOD1(GetDistance,
-                       double(OWL::MeasurementPoint mp));
+                       units::length::meter_t(OWL::MeasurementPoint mp));
     MOCK_CONST_METHOD1(Covers,
-                       bool(double));
+                       bool(units::length::meter_t));
     MOCK_METHOD6(AddLaneGeometryJoint,
-                 void(const Common::Vector2d& pointLeft,
-                      const Common::Vector2d& pointCenter,
-                      const Common::Vector2d& pointRight,
-                      double sOffset, double curvature, double heading));
+                 void(const Common::Vector2d<units::length::meter_t> &pointLeft,
+                      const Common::Vector2d<units::length::meter_t> &pointCenter,
+                      const Common::Vector2d<units::length::meter_t> &pointRight,
+                      units::length::meter_t sOffset, units::curvature::inverse_meter_t curvature, units::angle::radian_t heading));
     MOCK_METHOD1(SetLaneType,
                  void(LaneType specifiedType));
     MOCK_METHOD2(SetLeftLane,
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLaneBoundary.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLaneBoundary.h
index 1adda8a2911736343c17f621b02cc0561450b3d6..cd5231577d4de0e8745fd29ad2e00786d2645eab 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLaneBoundary.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLaneBoundary.h
@@ -17,13 +17,13 @@ class LaneBoundary : public OWL::Interfaces::LaneBoundary
 {
 public:
     MOCK_CONST_METHOD0(GetId, OWL::Id ());
-    MOCK_CONST_METHOD0(GetWidth, double ());
-    MOCK_CONST_METHOD0(GetSStart, double ());
-    MOCK_CONST_METHOD0(GetSEnd, double ());
+    MOCK_CONST_METHOD0(GetWidth, units::length::meter_t ());
+    MOCK_CONST_METHOD0(GetSStart, units::length::meter_t ());
+    MOCK_CONST_METHOD0(GetSEnd, units::length::meter_t ());
     MOCK_CONST_METHOD0(GetType, LaneMarking::Type ());
     MOCK_CONST_METHOD0(GetColor, LaneMarking::Color ());
     MOCK_CONST_METHOD0(GetSide, OWL::LaneMarkingSide ());
-    MOCK_METHOD2(AddBoundaryPoint, void (const Common::Vector2d& point, double heading));
+    MOCK_METHOD2(AddBoundaryPoint, void(const Common::Vector2d<units::length::meter_t> &point, units::angle::radian_t heading));
     MOCK_CONST_METHOD1(CopyToGroundTruth, void (osi3::GroundTruth& target));
 };
 }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLaneManager.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLaneManager.h
index 33b565a8d47133c17c21ab4d6a250c3f20930e29..d74ac0e4fdaa06514ec7c6038a4ae3ee9ee6b80c 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLaneManager.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeLaneManager.h
@@ -40,7 +40,7 @@ struct FakeLaneManager
 {
     const size_t cols;
     const size_t rows;
-    const std::vector<double> sectionLengths;
+    const std::vector<units::length::meter_t> sectionLengths;
 
     std::unordered_map<std::string, OWL::Interfaces::Road*> roads;
     std::vector<std::vector<OWL::Fakes::Lane*>> lanes;
@@ -53,7 +53,7 @@ struct FakeLaneManager
     std::vector<std::vector<OWL::Id>> laneSuccessors;
     std::string roadId;
 
-    void SetLength(size_t col, size_t row, double length, double startDistance = 0)
+    void SetLength(size_t col, size_t row, units::length::meter_t length, units::length::meter_t startDistance = 0_m)
     {
         ON_CALL(*lanes[col][row], GetLength())
         .WillByDefault(Return(length));
@@ -63,7 +63,7 @@ struct FakeLaneManager
         .WillByDefault(Return(startDistance + length));
     }
 
-    void SetWidth(size_t col, size_t row, double width, double distance)
+    void SetWidth(size_t col, size_t row, units::length::meter_t width, units::length::meter_t distance)
     {
         ON_CALL(*lanes[col][row], GetWidth(distance)).WillByDefault(Return(width));
     }
@@ -98,14 +98,14 @@ struct FakeLaneManager
         }
     }
 
-    void GenerateRoad(double width, std::string roadId = "TestRoadId")
+    void GenerateRoad(units::length::meter_t width, std::string roadId = "TestRoadId")
     {
         OWL::Fakes::Road* road = new OWL::Fakes::Road();
         GenerateLaneMatrix(road);
         ConnectLaneRows();
         ConnectLaneColumns();
         SetDefaultWidth(width);
-        SetDefaultLength(0);
+        SetDefaultLength(0_m);
         SetDefaultMovingObjects();
         GenerateSections();
         ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sectionsList));
@@ -116,8 +116,8 @@ struct FakeLaneManager
 
     void GenerateSections()
     {
-        double startOfSection = 0;
-        double endOfSection = 0;
+        units::length::meter_t startOfSection{0};
+        units::length::meter_t endOfSection{0};
 
         for (size_t col = 0; col < cols; col++)
         {
@@ -212,7 +212,7 @@ struct FakeLaneManager
         }
     }
 
-    void SetDefaultWidth(double width)
+    void SetDefaultWidth(units::length::meter_t width)
     {
         for (size_t col = 0; col < cols; col++)
         {
@@ -223,7 +223,7 @@ struct FakeLaneManager
         }
     }
 
-    void SetDefaultLength(double length)
+    void SetDefaultLength(units::length::meter_t length)
     {
         for (size_t col = 0; col < cols; col++)
         {
@@ -261,8 +261,8 @@ struct FakeLaneManager
         return roads;
     }
 
-    FakeLaneManager(size_t cols, size_t rows, double width, const std::vector<double>& sectionLengths, const std::string& roadId) : cols{cols}, rows{rows},
-        sectionLengths{sectionLengths}
+    FakeLaneManager(size_t cols, size_t rows, units::length::meter_t width, const std::vector<units::length::meter_t> &sectionLengths, const std::string &roadId) :
+        cols{cols}, rows{rows}, sectionLengths{sectionLengths}
     {
         assert(cols > 0);
         assert(rows > 0);
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeMovingObject.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeMovingObject.h
index a7a5d07696a9abbc34819a8b2b966fb9d63e6654..f03ecba2f9de802eae174ff8c40f98828f30873a 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeMovingObject.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeMovingObject.h
@@ -27,23 +27,23 @@ public:
     }
 
     MOCK_CONST_METHOD0(GetId, OWL::Id());
-    MOCK_CONST_METHOD0(GetDimension, OWL::Primitive::Dimension());
+    MOCK_CONST_METHOD0(GetDimension, mantle_api::Dimension3());
 
-    MOCK_CONST_METHOD0(GetReferencePointPosition, OWL::Primitive::AbsPosition());
-    MOCK_CONST_METHOD0(GetAbsOrientation, OWL::Primitive::AbsOrientation());
-    MOCK_CONST_METHOD0(GetAbsVelocityDouble, double());
-    MOCK_CONST_METHOD0(GetAbsAccelerationDouble, double());
+    MOCK_CONST_METHOD0(GetReferencePointPosition, mantle_api::Vec3<units::length::meter_t>());
+    MOCK_CONST_METHOD0(GetAbsOrientation, mantle_api::Orientation3<units::angle::radian_t>());
+    MOCK_CONST_METHOD0(GetAbsVelocityDouble, units::velocity::meters_per_second_t());
+    MOCK_CONST_METHOD0(GetAbsAccelerationDouble, units::acceleration::meters_per_second_squared_t());
 
     MOCK_METHOD1(AddLaneAssignment, void(const OWL::Interfaces::Lane& lane));
     MOCK_CONST_METHOD0(GetLaneAssignments, const OWL::Interfaces::Lanes & ());
     MOCK_METHOD0(ClearLaneAssignments, void());
 
-    MOCK_METHOD1(SetAbsOrientation, void(const OWL::Primitive::AbsOrientation& newOrientation));
-    MOCK_METHOD1(SetDimension, void(const OWL::Primitive::Dimension& newDimension));
+    MOCK_METHOD1(SetAbsOrientation, void(const mantle_api::Orientation3<units::angle::radian_t>& newOrientation));
+    MOCK_METHOD1(SetDimension, void(const mantle_api::Dimension3& newDimension));
     MOCK_CONST_METHOD0(GetTouchedRoads, const RoadIntervals &());
     MOCK_METHOD1(SetTouchedRoads, void(const RoadIntervals &touchedRoads));
-    MOCK_METHOD1(SetReferencePointPosition, void(const OWL::Primitive::AbsPosition& newPosition));
-
+    MOCK_METHOD1(SetReferencePointPosition, void(const mantle_api::Vec3<units::length::meter_t>& newPosition));
+    
     MOCK_CONST_METHOD1(CopyToGroundTruth, void(osi3::GroundTruth&));
 };
 
@@ -57,60 +57,60 @@ public:
     }
 
     MOCK_CONST_METHOD0(GetId, OWL::Id());
-    MOCK_CONST_METHOD0(GetDimension, OWL::Primitive::Dimension());
+    MOCK_CONST_METHOD0(GetDimension, mantle_api::Dimension3());
 
     MOCK_CONST_METHOD0(GetLane, const OWL::Interfaces::Lane & ());
     MOCK_CONST_METHOD0(GetSection, const OWL::Interfaces::Section & ());
     MOCK_CONST_METHOD0(GetRoad, const OWL::Interfaces::Road & ());
 
-    MOCK_CONST_METHOD0(GetReferencePointPosition, OWL::Primitive::AbsPosition());
+    MOCK_CONST_METHOD0(GetReferencePointPosition, mantle_api::Vec3<units::length::meter_t>());
     MOCK_CONST_METHOD0(GetTouchedRoads, const RoadIntervals &());
 
-    MOCK_CONST_METHOD0(GetAbsOrientation, OWL::Primitive::AbsOrientation());
+    MOCK_CONST_METHOD0(GetAbsOrientation, mantle_api::Orientation3<units::angle::radian_t>());
     MOCK_CONST_METHOD0(GetLaneOrientation, OWL::Primitive::LaneOrientation());
 
-    MOCK_CONST_METHOD0(GetAbsVelocity, OWL::Primitive::AbsVelocity());
-    MOCK_CONST_METHOD0(GetAbsVelocityDouble, double());
+    MOCK_CONST_METHOD0(GetAbsVelocity, mantle_api::Vec3<units::velocity::meters_per_second_t>());
+    MOCK_CONST_METHOD0(GetAbsVelocityDouble, units::velocity::meters_per_second_t());
 
     MOCK_CONST_METHOD0(GetAbsAcceleration, OWL::Primitive::AbsAcceleration());
-    MOCK_CONST_METHOD0(GetAbsAccelerationDouble, double());
+    MOCK_CONST_METHOD0(GetAbsAccelerationDouble, units::acceleration::meters_per_second_squared_t());
 
-    MOCK_CONST_METHOD0(GetAbsOrientationRate, OWL::Primitive::AbsOrientationRate());
+    MOCK_CONST_METHOD0(GetAbsOrientationRate, mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>());
     MOCK_CONST_METHOD0(GetAbsOrientationAcceleration, OWL::Primitive::AbsOrientationAcceleration());
 
-    MOCK_METHOD1(SetDimension, void(const OWL::Primitive::Dimension& newDimension));
-    MOCK_METHOD1(SetLength, void(const double newLength));
-    MOCK_METHOD1(SetWidth, void(const double newWidth));
-    MOCK_METHOD1(SetHeight, void(const double newHeight));
-    MOCK_METHOD3(SetBoundingBoxCenterToRear, void(const double distanceX, const double distanceY, const double distanceZ));
-    MOCK_METHOD3(SetBoundingBoxCenterToFront, void(const double distanceX, const double distanceY, const double distanceZ));
+    MOCK_METHOD1(SetDimension, void(const mantle_api::Dimension3& newDimension));
+    MOCK_METHOD1(SetLength, void(const units::length::meter_t newLength));
+    MOCK_METHOD1(SetWidth, void(const units::length::meter_t newWidth));
+    MOCK_METHOD1(SetHeight, void(const units::length::meter_t newHeight));
+    MOCK_METHOD3(SetBoundingBoxCenterToRear, void(const units::length::meter_t distanceX, const units::length::meter_t distanceY, const units::length::meter_t distanceZ));
+    MOCK_METHOD3(SetBoundingBoxCenterToFront, void(const units::length::meter_t distanceX, const units::length::meter_t distanceY, const units::length::meter_t distanceZ));
 
-    MOCK_METHOD1(SetReferencePointPosition, void(const OWL::Primitive::AbsPosition& newPosition));
-    MOCK_METHOD1(SetX, void(const double newX));
-    MOCK_METHOD1(SetY, void(const double newY));
-    MOCK_METHOD1(SetZ, void(const double newZ));
+    MOCK_METHOD1(SetReferencePointPosition, void(const mantle_api::Vec3<units::length::meter_t>& newPosition));
+    MOCK_METHOD1(SetX, void(const units::length::meter_t newX));
+    MOCK_METHOD1(SetY, void(const units::length::meter_t newY));
+    MOCK_METHOD1(SetZ, void(const units::length::meter_t newZ));
 
     MOCK_METHOD1(SetTouchedRoads, void(const RoadIntervals &touchedRoads));
 
-    MOCK_METHOD1(SetAbsOrientation, void(const OWL::Primitive::AbsOrientation& newOrientation));
-    MOCK_METHOD1(SetYaw, void(const double newYaw));
-    MOCK_METHOD1(SetPitch, void(const double newPitch));
-    MOCK_METHOD1(SetRoll, void(const double newRoll));
+    MOCK_METHOD1(SetAbsOrientation, void(const mantle_api::Orientation3<units::angle::radian_t>& newOrientation));
+    MOCK_METHOD1(SetYaw, void(const units::angle::radian_t newYaw));
+    MOCK_METHOD1(SetPitch, void(const units::angle::radian_t newPitch));
+    MOCK_METHOD1(SetRoll, void(const units::angle::radian_t newRoll));
 
-    MOCK_METHOD1(SetAbsVelocity, void(const OWL::Primitive::AbsVelocity& newVelocity));
-    MOCK_METHOD1(SetAbsVelocity, void(const double newVelocity));
+    MOCK_METHOD1(SetAbsVelocity, void(const mantle_api::Vec3<units::velocity::meters_per_second_t>& newVelocity));
+    MOCK_METHOD1(SetAbsVelocity, void(const units::velocity::meters_per_second_t newVelocity));
 
     MOCK_METHOD1(SetAbsAcceleration, void(const OWL::Primitive::AbsAcceleration& newAcceleration));
-    MOCK_METHOD1(SetAbsAcceleration, void(const double newAcceleration));
+    MOCK_METHOD1(SetAbsAcceleration, void(const units::acceleration::meters_per_second_squared_t newAcceleration));
 
-    MOCK_METHOD1(SetAbsOrientationRate, void(const OWL::Primitive::AbsOrientationRate& newOrientationRate));
+    MOCK_METHOD1(SetAbsOrientationRate, void(const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>& newOrientationRate));
     MOCK_METHOD1(SetAbsOrientationAcceleration, void(const OWL::Primitive::AbsOrientationAcceleration& newOrientationAcceleration));
 
     MOCK_METHOD1(AddLaneAssignment, void(const OWL::Interfaces::Lane& lane));
     MOCK_CONST_METHOD0(GetLaneAssignments, const OWL::Interfaces::Lanes & ());
     MOCK_METHOD0(ClearLaneAssignments, void());
 
-    MOCK_CONST_METHOD0(GetDistanceReferencePointToLeadingEdge, double());
+    MOCK_CONST_METHOD0(GetDistanceReferencePointToLeadingEdge, units::length::meter_t());
 
     MOCK_METHOD1(SetIndicatorState, void(IndicatorState indicatorState));
     MOCK_CONST_METHOD0(GetIndicatorState, IndicatorState());
@@ -121,15 +121,16 @@ public:
     MOCK_METHOD1(SetHighBeamLight, void(bool highbeamLight));
     MOCK_CONST_METHOD0(GetHighBeamLight, bool());
 
-    MOCK_METHOD1(SetType, void(AgentVehicleType));
+    MOCK_METHOD1(SetType, void(mantle_api::EntityType));
+    MOCK_METHOD1(SetVehicleClassification, void(mantle_api::VehicleClass));
     MOCK_METHOD1(SetSourceReference, void(const OWL::ExternalReference& externalReference));
     MOCK_METHOD1(AddWheel, void(const WheelData &wheelData));
 
-    MOCK_METHOD0(GetSteeringWheelAngle, float());
+    MOCK_METHOD0(GetSteeringWheelAngle, Angle());
     MOCK_METHOD1(SetSteeringWheelAngle, void(const Angle));
 
-    MOCK_METHOD1(SetFrontAxleSteeringYaw, void(const double));
-    MOCK_METHOD4(SetWheelsRotationRateAndOrientation, void(const double, const double, const double, const double));
+    MOCK_METHOD1(SetFrontAxleSteeringYaw, void(const Angle));
+    MOCK_METHOD4(SetWheelsRotationRateAndOrientation, void(const units::velocity::meters_per_second_t, const units::length::meter_t, const units::length::meter_t, const units::time::second_t));
     MOCK_METHOD2(GetWheelData, std::optional<const OWL::WheelData>(unsigned int, unsigned int));
 
     MOCK_CONST_METHOD1(CopyToGroundTruth, void(osi3::GroundTruth&));
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeRoad.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeRoad.h
index c3cc82e4146ec8add8f19bd943c0edcbd087906a..6055915142b764534c9f5b4e0a22e0b29e46af9b 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeRoad.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeRoad.h
@@ -20,12 +20,12 @@ public:
     MOCK_CONST_METHOD0(GetId, const std::string&());
     MOCK_CONST_METHOD0(GetSections, std::vector<const OWL::Interfaces::Section*>&());
     MOCK_METHOD1(AddSection, void(OWL::Interfaces::Section& ));
-    MOCK_CONST_METHOD0(GetLength, double());
+    MOCK_CONST_METHOD0(GetLength, units::length::meter_t());
     MOCK_CONST_METHOD0(GetSuccessor, const std::string& ());
     MOCK_CONST_METHOD0(GetPredecessor, const std::string& ());
     MOCK_METHOD1(SetSuccessor, void (const std::string&));
     MOCK_METHOD1(SetPredecessor, void (const std::string&));
     MOCK_CONST_METHOD0(IsInStreamDirection, bool ());
-    MOCK_CONST_METHOD1(GetDistance, double (OWL::MeasurementPoint));
+    MOCK_CONST_METHOD1(GetDistance, units::length::meter_t(OWL::MeasurementPoint));
 };
 }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeRoadMarking.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeRoadMarking.h
index f2472f00d17ad11a96ebdcdf27751caaaa36130b..8ce7cbb72770d96bdcac41b904a46ff4981b9f1e 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeRoadMarking.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeRoadMarking.h
@@ -22,17 +22,17 @@ public:
     MOCK_CONST_METHOD0(GetId,
                        std::string());
     MOCK_CONST_METHOD0(GetS,
-                       double());
+                       units::length::meter_t());
     MOCK_CONST_METHOD1(GetSpecification,
-                       CommonTrafficSign::Entity(double));
+                       CommonTrafficSign::Entity(units::length::meter_t));
     MOCK_CONST_METHOD0(GetDimension,
-                       Primitive::Dimension ());
+                       mantle_api::Dimension3 ());
     MOCK_CONST_METHOD0(GetReferencePointPosition,
-                       Primitive::AbsPosition ());
+                       mantle_api::Vec3<units::length::meter_t> ());
     MOCK_CONST_METHOD1(IsValidForLane,
                        bool(OWL::Id laneId));
     MOCK_METHOD1(SetS,
-                 void(double));
+                 void(units::length::meter_t));
     MOCK_METHOD1(SetValidForLane,
                  void(OWL::Id));
     MOCK_METHOD2(SetSpecification,
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeSection.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeSection.h
index 97d25322a0f3f5182324b30f0b862d04e6a8a1da..d60a3a3aa2ffdaff82fd03a97e054882ecc4ae4a 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeSection.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeSection.h
@@ -27,15 +27,15 @@ public:
     MOCK_CONST_METHOD0(GetLanes,
                        const OWL::Interfaces::Lanes & (void));
     MOCK_CONST_METHOD0(GetLength,
-                       double (void));
+                       units::length::meter_t(void));
     MOCK_CONST_METHOD0(GetSOffset,
-                       double());
+                       units::length::meter_t());
     MOCK_CONST_METHOD1(GetDistance,
-                       double(OWL::MeasurementPoint mp));
+                       units::length::meter_t(OWL::MeasurementPoint mp));
     MOCK_CONST_METHOD1(Covers,
-                       bool(double)); 
+                       bool(units::length::meter_t));
     MOCK_CONST_METHOD2(CoversInterval,
-                       bool(double startDistance, double endDistance));
+                       bool(units::length::meter_t startDistance, units::length::meter_t endDistance));
     MOCK_METHOD1(SetRoad,
                  void(OWL::Interfaces::Road*));
     MOCK_CONST_METHOD0(GetRoad,
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeTrafficLight.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeTrafficLight.h
index 8b810587b41449f713845ef8dfb422e433c9332a..9660613e0d013de6cbc673054dc6c2feeca39741 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeTrafficLight.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeTrafficLight.h
@@ -19,16 +19,16 @@ class TrafficLight : public OWL::Interfaces::TrafficLight
 {
 public:
     MOCK_CONST_METHOD0(GetId, std::string ());
-    MOCK_CONST_METHOD0(GetS, double ());
+    MOCK_CONST_METHOD0(GetS, units::length::meter_t ());
     MOCK_CONST_METHOD1(IsValidForLane, bool (OWL::Id laneId));
-    MOCK_CONST_METHOD0(GetReferencePointPosition, Primitive::AbsPosition ());
-    MOCK_METHOD1(SetS, void (double sPos));
+    MOCK_CONST_METHOD0(GetReferencePointPosition, mantle_api::Vec3<units::length::meter_t>());
+    MOCK_METHOD1(SetS, void (units::length::meter_t sPos));
     MOCK_METHOD2(SetSpecification, bool (RoadSignalInterface* signal, const Position& position));
     MOCK_METHOD1(SetValidForLane, void (OWL::Id laneId));
     MOCK_CONST_METHOD1(CopyToGroundTruth, void (osi3::GroundTruth& target));
     MOCK_METHOD1(SetState, void (CommonTrafficLight::State newState));
-    MOCK_CONST_METHOD1(GetSpecification, CommonTrafficLight::Entity (const double relativeDistance));
+    MOCK_CONST_METHOD1(GetSpecification, CommonTrafficLight::Entity (const units::length::meter_t relativeDistance));
     MOCK_CONST_METHOD0(GetState, CommonTrafficLight::State ());
-    MOCK_CONST_METHOD0(GetDimension, Primitive::Dimension ());
+    MOCK_CONST_METHOD0(GetDimension, mantle_api::Dimension3 ());
 };
 }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeTrafficSign.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeTrafficSign.h
index 87f20ff1594825582aa5fddda4bf14aaeb78a2f4..6ab274b0ebced4a42c842e00dd3d97ccf34e4bc5 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeTrafficSign.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeTrafficSign.h
@@ -25,19 +25,19 @@ public:
     MOCK_CONST_METHOD0(GetId,
                        std::string());
     MOCK_CONST_METHOD0(GetS,
-                       double());
+                       units::length::meter_t());
     MOCK_CONST_METHOD2(GetValueAndUnitInSI,
                        std::pair<double, CommonTrafficSign::Unit> (const double osiValue, const osi3::TrafficSignValue_Unit osiUnit));
     MOCK_CONST_METHOD1(GetSpecification,
-                       CommonTrafficSign::Entity(double));
+                       CommonTrafficSign::Entity(units::length::meter_t));
     MOCK_CONST_METHOD0(GetReferencePointPosition,
-                       Primitive::AbsPosition ());
+                       mantle_api::Vec3<units::length::meter_t> ());
     MOCK_CONST_METHOD0(GetDimension,
-                       Primitive::Dimension ());
+                       mantle_api::Dimension3 ());
     MOCK_CONST_METHOD1(IsValidForLane,
                        bool(OWL::Id laneId));
     MOCK_METHOD1(SetS,
-                 void(double));
+                 void(units::length::meter_t));
     MOCK_METHOD1(SetValidForLane,
                  void(OWL::Id));
     MOCK_METHOD2(SetSpecification,
diff --git a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeWorldData.h b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeWorldData.h
index 7987107b26c46627ca53b4c257dc286c554f8c16..2cdb9b2d6df62ff0e482b27cd3b4c1a91f394cfc 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeWorldData.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/fakes/fakeWorldData.h
@@ -36,8 +36,8 @@ public:
     MOCK_METHOD1(AddRoad, void(const RoadInterface &));
     MOCK_METHOD1(AddJunction, void(const JunctionInterface *odJunction));
     MOCK_METHOD2(AddJunctionConnection, void(const JunctionInterface *odJunction, const RoadInterface &odRoad));
-    MOCK_METHOD7(AddLaneGeometryPoint, void(const RoadLaneInterface &, const Common::Vector2d &, const Common::Vector2d &, const Common::Vector2d &, const double, const double, const double));
-    MOCK_METHOD4(AddCenterLinePoint, void(const RoadLaneSectionInterface &odSection, const Common::Vector2d &pointCenter, const double sOffset, double heading));
+    MOCK_METHOD7(AddLaneGeometryPoint, void(const RoadLaneInterface &, const Common::Vector2d<units::length::meter_t> &, const Common::Vector2d<units::length::meter_t> &, const Common::Vector2d<units::length::meter_t> &, const units::length::meter_t, const units::curvature::inverse_meter_t, const units::angle::radian_t));
+    MOCK_METHOD4(AddCenterLinePoint, void(const RoadLaneSectionInterface &odSection, const Common::Vector2d<units::length::meter_t> &pointCenter, const units::length::meter_t sOffset, units::angle::radian_t heading));
     MOCK_METHOD2(AddLaneSuccessor, void(/* const */ RoadLaneInterface &, /* const */ RoadLaneInterface &));
     MOCK_METHOD2(AddLanePredecessor, void(/* const */ RoadLaneInterface &, /* const */ RoadLaneInterface &));
     MOCK_METHOD2(SetRoadSuccessor, void(const RoadInterface &, const RoadInterface &));
@@ -47,7 +47,7 @@ public:
     MOCK_METHOD2(SetSectionSuccessor, void(const RoadLaneSectionInterface &, const RoadLaneSectionInterface &));
     MOCK_METHOD2(SetSectionPredecessor, void(const RoadLaneSectionInterface &, const RoadLaneSectionInterface &));
     MOCK_METHOD4(ConnectLanes, void(/* const */ RoadLaneSectionInterface &, /* const */ RoadLaneSectionInterface &, const std::map<int, int> &, bool));
-    MOCK_METHOD1(SetEnvironment, void (const openScenario::EnvironmentAction& environment));
+    MOCK_METHOD1(SetEnvironment, void(const mantle_api::Weather &weather));
     MOCK_METHOD2(AddTrafficSign, OWL::Interfaces::TrafficSign &(const Id, const std::string odId));
     MOCK_METHOD3(AddTrafficLight, OWL::Interfaces::TrafficLight&(const  std::vector<Id> trafficLightIds, const std::string odId, const std::string &type));
 
@@ -67,9 +67,9 @@ public:
     MOCK_METHOD2(GetSensorView, SensorView_ptr(osi3::SensorViewConfiguration &, int));
     MOCK_METHOD0(ResetTemporaryMemory, void());
     MOCK_CONST_METHOD1(GetLaneBoundary, const OWL::Interfaces::LaneBoundary &(Id id));
-    MOCK_METHOD4(AddLaneBoundary, OWL::Id(const Id, const RoadLaneRoadMark &odLaneRoadMark, double sectionStart, OWL::LaneMarkingSide side));
+    MOCK_METHOD4(AddLaneBoundary, OWL::Id(const Id, const RoadLaneRoadMark &odLaneRoadMark, units::length::meter_t sectionStart, OWL::LaneMarkingSide side));
     MOCK_METHOD2(SetCenterLaneBoundary, void(const RoadLaneSectionInterface &odSection, std::vector<OWL::Id> laneBoundaryIds));
-    MOCK_METHOD3(AddCenterLinePoint, void(const RoadLaneSectionInterface &odSection, const Common::Vector2d &pointCenter, const double sOffset));
+    MOCK_METHOD3(AddCenterLinePoint, void(const RoadLaneSectionInterface &odSection, const Common::Vector2d<units::length::meter_t> &pointCenter, const units::length::meter_t sOffset));
     MOCK_CONST_METHOD0(GetJunctions, const std::map<std::string, OWL::Junction *> &());
     MOCK_METHOD2(AssignTrafficSignToLane, void(OWL::Id laneId, OWL::Interfaces::TrafficSign &trafficSign));
     MOCK_METHOD2(AssignRoadMarkingToLane, void(OWL::Id laneId, OWL::Interfaces::RoadMarking &roadMarking));
diff --git a/sim/src/core/opSimulation/modules/World_OSI/RadioImplementation.cpp b/sim/src/core/opSimulation/modules/World_OSI/RadioImplementation.cpp
index c9ecd94f74dc04f6875115df93a88385b5993f3f..e01c24f791c8e5b9689df8c3b10eda601642dc95 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/RadioImplementation.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/RadioImplementation.cpp
@@ -11,20 +11,20 @@
 #include "RadioImplementation.h"
 #include <math.h>
 
-void RadioImplementation::Send(double positionX, double postionY, double signalStrength, DetectedObject objectInformation)
+void RadioImplementation::Send(units::length::meter_t positionX, units::length::meter_t postionY, units::power::watt_t signalStrength, DetectedObject objectInformation)
 {
     RadioSignal radioSignal{positionX, postionY, signalStrength, objectInformation};
     signalVector.push_back(radioSignal);
 }
 
-std::vector<DetectedObject> RadioImplementation::Receive(double positionX, double positionY, double sensitivity)
+std::vector<DetectedObject> RadioImplementation::Receive(units::length::meter_t positionX, units::length::meter_t positionY, units::sensitivity sensitivity)
 {
     std::vector<DetectedObject> detectedObjects{};
     for (RadioSignal radioSignal : signalVector)
     {
-        double deltaX= radioSignal.positionX - positionX;
-        double deltaY=radioSignal.positionY-positionY;
-        double distance=sqrt(deltaX*deltaX+deltaY*deltaY);
+        auto deltaX = radioSignal.positionX - positionX;
+        auto deltaY = radioSignal.positionY - positionY;
+        auto distance = units::math::sqrt(deltaX * deltaX + deltaY * deltaY);
         if (CanHearSignal(radioSignal.signalStrength,distance,sensitivity))
         {
 
@@ -34,9 +34,9 @@ std::vector<DetectedObject> RadioImplementation::Receive(double positionX, doubl
     return detectedObjects;
 }
 
-bool RadioImplementation::CanHearSignal(double signalStrength, double distance, double sensitivity)
+bool RadioImplementation::CanHearSignal(units::power::watt_t signalStrength, units::length::meter_t distance, units::sensitivity sensitivity)
 {
-    double receivedSignalStrength = signalStrength / ( 4 * M_PI * distance * distance );
+    units::sensitivity receivedSignalStrength = signalStrength / ( 4 * M_PI * distance * distance );
     return receivedSignalStrength >= sensitivity;
 }
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/RadioImplementation.h b/sim/src/core/opSimulation/modules/World_OSI/RadioImplementation.h
index 85988196bde1fb7d891581a9b0e037cc2f6b631f..692001357412bf9ad0b89c2d34bcc6009a4e3f61 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/RadioImplementation.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/RadioImplementation.h
@@ -19,12 +19,11 @@
 #include <vector>
 #include <memory>
 
-//! Single signal sent by a sender
 struct RadioSignal
 {
-    double positionX;
-    double positionY;
-    double signalStrength;
+    units::length::meter_t positionX;
+    units::length::meter_t positionY;
+    units::power::watt_t signalStrength;
     DetectedObject objectInformation;
 };
 
@@ -32,28 +31,12 @@ class RadioImplementation : public RadioInterface
 {
 public:
     RadioImplementation() = default;
+    ~RadioImplementation(){};
 
-    //-----------------------------------------------------------------------------
-    //! Broadcasts object-metadata and sensor informations to cloud.
-    //! @param[in] positionX            x position of sender
-    //! @param[in] postionY             y position of sender
-    //! @param[in] signalStrength       signal strength of sender (transmitting power [W])
-    //! @param[in] objectInformation    sensor data
-    //-----------------------------------------------------------------------------
-    void Send(double positionX, double postionY, double signalStrength, DetectedObject objectInformation) override;
+    void Send(units::length::meter_t positionX, units::length::meter_t postionY, units::power::watt_t signalStrength, DetectedObject objectInformation) override;
 
-    //-----------------------------------------------------------------------------
-    //! Retrieve available information at current postion from cloud.
-    //! @param[in] positionX   x position of receiver
-    //! @param[in] positionY   y position of receiver
-    //! @param[in] sensitivity   sensitivity of receiver (implemented as surface power density [W/m2])
-    //! @return data of senders "visible" at current position
-    //-----------------------------------------------------------------------------
-    std::vector<DetectedObject> Receive(double positionX, double positionY, double sensitivity) override;
+    std::vector<DetectedObject> Receive(units::length::meter_t positionX, units::length::meter_t positionY, units::sensitivity sensitivity) override;
 
-    //-----------------------------------------------------------------------------
-    //! Resets the cloud for next simulation step
-    //-----------------------------------------------------------------------------
     void Reset() override;
 
 private:
@@ -61,11 +44,11 @@ private:
     //! Checks if sender is within proximity of receiver ("is visible").
     //! Physical model: isotropic radiator
     //! @param[in] signalStrength   signal strength of sender [W]
-    //! @param[in] distance         distance between sender and receiver
-    //! @param[in] sensitivity      sensitivity of receiver [W/m2]
+    //! @param[in] distance   distance between sender and receiver
+    //! @param[in] sensitivity   sensitivity of receiver [W/m2]
     //! @return bool is sender within proximity
     //-----------------------------------------------------------------------------
-    bool CanHearSignal(double signalStrength, double distance, double sensitivity);
+    bool CanHearSignal (units::power::watt_t signalStrength, units::length::meter_t distance, units::sensitivity sensitivity);
 
     std::vector<RadioSignal> signalVector;
 };
diff --git a/sim/src/core/opSimulation/modules/World_OSI/RoadStream.cpp b/sim/src/core/opSimulation/modules/World_OSI/RoadStream.cpp
index 5ff83aaf5a472ec84b88f0c47a6584b85efdf642..2c8c3930b5b6c5e29ae55cb7aa52471970c7554f 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/RoadStream.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/RoadStream.cpp
@@ -13,7 +13,7 @@
 #include <algorithm>
 #include <vector>
 
-const OWL::Interfaces::Section& GetSectionAtDistance(const OWL::Interfaces::Road& road, double distance)
+const OWL::Interfaces::Section& GetSectionAtDistance(const OWL::Interfaces::Road& road, units::length::meter_t distance)
 {
     for (const auto section : road.GetSections())
     {
@@ -25,7 +25,7 @@ const OWL::Interfaces::Section& GetSectionAtDistance(const OWL::Interfaces::Road
     throw std::runtime_error("RoadStream distance out of range");
 }
 
-double GetLaneWidth(const OWL::Interfaces::Section& section, double laneId, double distance)
+units::length::meter_t GetLaneWidth(const OWL::Interfaces::Section& section, double laneId, units::length::meter_t distance)
 {
     for (const auto lane : section.GetLanes())
     {
@@ -34,12 +34,12 @@ double GetLaneWidth(const OWL::Interfaces::Section& section, double laneId, doub
             return lane->GetWidth(distance);
         }
     }
-    return 0.0;
+    return 0.0_m;
 }
 
 StreamPosition RoadStream::GetStreamPosition(const GlobalRoadPosition &roadPosition) const
 {
-    StreamPosition streamPosition {-1, 0};
+    StreamPosition streamPosition {-1_m, 0_m};
 
     for (const auto& element : elements)
     {
@@ -66,7 +66,7 @@ StreamPosition RoadStream::GetStreamPosition(const GlobalRoadPosition &roadPosit
                 streamPosition.t += 0.5 * GetLaneWidth(section, roadPosition.laneId, roadPosition.roadPosition.s);
             }
             streamPosition.t *= element.inStreamDirection ? 1 : -1;
-            streamPosition.hdg = CommonHelper::SetAngleToValidRange(roadPosition.roadPosition.hdg + (element.inStreamDirection ? 0 : M_PI));
+            streamPosition.hdg = CommonHelper::SetAngleToValidRange(roadPosition.roadPosition.hdg + (element.inStreamDirection ? 0_rad : units::angle::radian_t(M_PI)));
             return streamPosition;
         }
     }
@@ -84,11 +84,11 @@ GlobalRoadPosition RoadStream::GetRoadPosition(const StreamPosition &streamPosit
             globalRoadPosition.roadId = element.road->GetId();
             globalRoadPosition.roadPosition.s = element.GetElementPosition(streamPosition.s);
             const auto& section = GetSectionAtDistance(*element.road, globalRoadPosition.roadPosition.s);
-            double remainingOffset = streamPosition.t * (element.inStreamDirection ? 1 : -1);
-            if (element.inStreamDirection xor (streamPosition.t > 0))
+            auto remainingOffset = streamPosition.t * (element.inStreamDirection ? 1 : -1);
+            if (element.inStreamDirection xor (streamPosition.t > 0_m))
             {
                 int laneId = -1;
-                double laneWidth = GetLaneWidth(section, laneId, globalRoadPosition.roadPosition.s);
+                auto laneWidth = GetLaneWidth(section, laneId, globalRoadPosition.roadPosition.s);
                 while (-remainingOffset > laneWidth)
                 {
                     remainingOffset += laneWidth;
@@ -101,7 +101,7 @@ GlobalRoadPosition RoadStream::GetRoadPosition(const StreamPosition &streamPosit
             else
             {
                 int laneId = 1;
-                double laneWidth = GetLaneWidth(section, laneId, globalRoadPosition.roadPosition.s);
+                auto laneWidth = GetLaneWidth(section, laneId, globalRoadPosition.roadPosition.s);
                 while (remainingOffset > laneWidth)
                 {
                     remainingOffset -= laneWidth;
@@ -111,7 +111,7 @@ GlobalRoadPosition RoadStream::GetRoadPosition(const StreamPosition &streamPosit
                 globalRoadPosition.laneId = laneId;
                 globalRoadPosition.roadPosition.t = remainingOffset - 0.5 * laneWidth;
             }
-            globalRoadPosition.roadPosition.hdg = CommonHelper::SetAngleToValidRange(streamPosition.hdg + (element.inStreamDirection ? 0 : M_PI));
+            globalRoadPosition.roadPosition.hdg = CommonHelper::SetAngleToValidRange(streamPosition.hdg + (element.inStreamDirection ? 0_rad : units::angle::radian_t(M_PI)));
             return globalRoadPosition;
         }
     }
@@ -161,7 +161,7 @@ std::vector<std::unique_ptr<LaneStreamInterface>> RoadStream::GetAllLaneStreams(
                 {
                     continue;
                 }
-                StreamPosition start{element.GetStreamPosition(lane->GetDistance(OWL::MeasurementPoint::RoadStart)), 0.};
+                StreamPosition start{element.GetStreamPosition(lane->GetDistance(OWL::MeasurementPoint::RoadStart)), 0.0_m};
                 laneStreams.push_back(GetLaneStream(start, lane->GetOdId()));
             }
             lastLanes = &section->GetLanes();
@@ -292,7 +292,7 @@ std::vector<LaneStreamElement> RoadStream::CreateLaneStream(const GlobalRoadPosi
     return laneStreamElements;
 }
 
-double RoadStream::GetLength() const
+units::length::meter_t RoadStream::GetLength() const
 {
     return elements.back().EndS();
 }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/RoadStream.h b/sim/src/core/opSimulation/modules/World_OSI/RoadStream.h
index 2d9820ee8f5f8aeced3b60f0b6a9386c31c350ad..20f7a3e86d8e00ca259e1d574be134c1ebd22975 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/RoadStream.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/RoadStream.h
@@ -22,16 +22,18 @@
 #include "OWL/DataTypes.h"
 #include "LaneStream.h"
 
+using namespace units::literals;
+
 //! This class represents one element of a RoadStream.
 struct RoadStreamElement
 {
     const OWL::Interfaces::Road* road;  //!< road represented by this object
-    double sOffset;         //!< S Offset of the start point of the element from the beginning of the stream
+    units::length::meter_t sOffset;         //!< S Offset of the start point of the element from the beginning of the stream
     bool inStreamDirection; //!< Specifies whether the direction of the element is the same as the direction of the stream
 
     RoadStreamElement() = default;
 
-    RoadStreamElement(const OWL::Interfaces::Road* road, double sOffset, bool inStreamDirection) :
+    RoadStreamElement(const OWL::Interfaces::Road* road, units::length::meter_t sOffset, bool inStreamDirection) :
         road(road),
         sOffset(sOffset),
         inStreamDirection(inStreamDirection)
@@ -46,7 +48,7 @@ struct RoadStreamElement
     //!
     //! \param elementPosition position relative to the start of the element
     //! \return position relative to the start of the stream
-    double GetStreamPosition(double elementPosition) const
+    units::length::meter_t GetStreamPosition(units::length::meter_t elementPosition) const
     {
         return sOffset + (inStreamDirection ? elementPosition : -elementPosition);
     }
@@ -55,21 +57,21 @@ struct RoadStreamElement
     //!
     //! \param streamPosition position relative to the start of the stream
     //! \return position relative to the start of the element
-    double GetElementPosition(double streamPosition) const
+    units::length::meter_t GetElementPosition(units::length::meter_t streamPosition) const
     {
         return inStreamDirection ? streamPosition - sOffset : sOffset - streamPosition;
     }
 
     //! Returns the stream position of the start of the road
-    double StartS() const
+    units::length::meter_t StartS() const
     {
-        return sOffset - (inStreamDirection ? 0 : road->GetLength());
+        return sOffset - (inStreamDirection ? 0_m : road->GetLength());
     }
 
     //! Returns the stream position of the end of the road
-    double EndS() const
+    units::length::meter_t EndS() const
     {
-        return sOffset + (inStreamDirection ? road->GetLength() : 0);
+        return sOffset + (inStreamDirection ? road->GetLength() : 0_m);
     }
 };
 
@@ -95,7 +97,7 @@ public:
 
     std::vector<LaneStreamElement> CreateLaneStream(const GlobalRoadPosition& startPosition) const;
 
-    virtual double GetLength() const override;
+    virtual units::length::meter_t GetLength() const override;
 
 private:
     const std::vector<RoadStreamElement> elements;
diff --git a/sim/src/core/opSimulation/modules/World_OSI/SceneryConverter.cpp b/sim/src/core/opSimulation/modules/World_OSI/SceneryConverter.cpp
index 0db65d7d975218e19221833f70774a665c8383da..80f8533f24c3c525c43a82f42a1e55d11f011219 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/SceneryConverter.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/SceneryConverter.cpp
@@ -102,7 +102,7 @@ ConversionStatus ConnectJunction(const SceneryInterface *scenery, const Junction
 }
 } // namespace Internal
 
-Position SceneryConverter::RoadCoord2WorldCoord(const RoadInterface *road, double s, double t, double yaw)
+Position SceneryConverter::RoadCoord2WorldCoord(const RoadInterface *road, units::length::meter_t s, units::length::meter_t t, units::angle::radian_t yaw)
 {
     auto &geometries = road->GetGeometries();
     auto geometry = std::find_if(geometries.cbegin(), geometries.cend(),
@@ -113,7 +113,7 @@ Position SceneryConverter::RoadCoord2WorldCoord(const RoadInterface *road, doubl
     }
     auto coordinates = (*geometry)->GetCoord(s - (*geometry)->GetS(), t);
     auto absoluteYaw = CommonHelper::SetAngleToValidRange((*geometry)->GetDir(s - (*geometry)->GetS()) + yaw);
-    return {coordinates.x, coordinates.y, absoluteYaw, 0};
+    return {units::length::meter_t(coordinates.x), units::length::meter_t(coordinates.y), absoluteYaw, 0_i_m};
 }
 
 SceneryConverter::SceneryConverter(const SceneryInterface *scenery,
@@ -790,9 +790,9 @@ void SceneryConverter::CreateObjects()
 
 void SceneryConverter::CreateObject(const RoadObjectInterface *object, const Position& position)
 {
-    OWL::Primitive::AbsPosition absPos{position.xPos, position.yPos, 0};
-    OWL::Primitive::Dimension dim{object->GetLength(), object->GetWidth(), object->GetHeight()};
-    OWL::Primitive::AbsOrientation orientation{position.yawAngle, object->GetPitch(), object->GetRoll()};
+    mantle_api::Vec3<units::length::meter_t> absPos{position.xPos, position.yPos, 0_m};
+    mantle_api::Dimension3 dim{object->GetLength(), object->GetWidth(), object->GetHeight()};
+    mantle_api::Orientation3<units::angle::radian_t> orientation{position.yawAngle, object->GetPitch(), object->GetRoll()};
     const auto id = repository.Register(openpass::entity::EntityType::StationaryObject, openpass::utils::GetEntityInfo(*object));
 
     trafficObjects.emplace_back(std::make_unique<TrafficObjectAdapter>(
@@ -801,7 +801,7 @@ void SceneryConverter::CreateObject(const RoadObjectInterface *object, const Pos
                                     localizer,
                                     absPos,
                                     dim,
-                                    object->GetZOffset(),
+                                    units::length::meter_t{object->GetZOffset()},
                                     orientation,
                                     object->GetId()));
 }
@@ -809,27 +809,27 @@ void SceneryConverter::CreateObject(const RoadObjectInterface *object, const Pos
 void SceneryConverter::CreateContinuousObject(const RoadObjectInterface *object, const RoadInterface *road)
 {
     auto section = worldDataQuery.GetSectionByDistance(road->GetId(), object->GetS());
-    const double sStart = object->GetS();
-    const double sEnd = sStart + object->GetLength();
+    const auto sStart = object->GetS();
+    const auto sEnd = sStart + object->GetLength();
     const auto laneElements = section->GetLanes().front()->GetLaneGeometryElements();
     for (const auto& laneElement : laneElements)
     {
-        const double elementStart = laneElement->joints.current.sOffset;
-        const double elementEnd = laneElement->joints.next.sOffset;
-        const double objectStart = std::max(sStart, elementStart);
-        const double objectEnd = std::min(sEnd, elementEnd);
+        const auto elementStart = laneElement->joints.current.sOffset;
+        const auto elementEnd = laneElement->joints.next.sOffset;
+        const auto objectStart = units::math::max(sStart, elementStart);
+        const auto objectEnd = units::math::min(sEnd, elementEnd);
         if (objectStart < objectEnd)
         {
-            const auto startPosition = RoadCoord2WorldCoord(road, objectStart, object->GetT(), 0);
-            const auto endPosition = RoadCoord2WorldCoord(road, objectEnd, object->GetT(), 0);
-            const double deltaX = endPosition.xPos - startPosition.xPos;
-            const double deltaY = endPosition.yPos - startPosition.yPos;
-            const double length = openpass::hypot(deltaX, deltaY);
-            double yaw = std::atan2(deltaY, deltaX);
-
-            OWL::Primitive::AbsPosition pos{(startPosition.xPos + endPosition.xPos) / 2.0, (startPosition.yPos + endPosition.yPos) / 2.0, 0};
-            OWL::Primitive::Dimension dim{length, object->GetWidth(), object->GetHeight()};
-            OWL::Primitive::AbsOrientation orientation{yaw, object->GetPitch(), object->GetRoll()};
+            const auto startPosition = RoadCoord2WorldCoord(road, objectStart, object->GetT(), 0_rad);
+            const auto endPosition = RoadCoord2WorldCoord(road, objectEnd, object->GetT(), 0_rad);
+            const auto deltaX = endPosition.xPos - startPosition.xPos;
+            const auto deltaY = endPosition.yPos - startPosition.yPos;
+            const auto length = openpass::hypot(deltaX, deltaY);
+            const auto yaw = units::math::atan2(deltaY, deltaX);
+
+            mantle_api::Vec3<units::length::meter_t> pos{(startPosition.xPos + endPosition.xPos) / 2.0, (startPosition.yPos + endPosition.yPos) / 2.0, 0_m};
+            mantle_api::Dimension3 dim{length, object->GetWidth(), object->GetHeight()};
+            mantle_api::Orientation3<units::angle::radian_t> orientation{yaw, object->GetPitch(), object->GetRoll()};
             const auto id = repository.Register(openpass::entity::EntityType::StationaryObject, openpass::utils::GetEntityInfo(*object));
 
             trafficObjects.emplace_back(std::make_unique<TrafficObjectAdapter>(
@@ -838,7 +838,7 @@ void SceneryConverter::CreateContinuousObject(const RoadObjectInterface *object,
                                             localizer,
                                             pos,
                                             dim,
-                                            object->GetZOffset(),
+                                            units::length::meter_t{object->GetZOffset()},
                                             orientation,
                                             object->GetId()));
         }
@@ -877,7 +877,7 @@ std::vector<OWL::Id> SceneryConverter::CreateLaneBoundaries(RoadLaneInterface &o
     if (odLane.GetRoadMarks().empty())
     {
         //!If there are no RoadMarks defined in OpenDRIVE, there should still be a LaneBoundary, so we treat it as if there was a RoadMark of type none
-        const RoadLaneRoadMark defaultRoadMark(0,
+        const RoadLaneRoadMark defaultRoadMark(0_m,
                                                RoadLaneRoadDescriptionType::Center,
                                                RoadLaneRoadMarkType::None,
                                                RoadLaneRoadMarkColor::Undefined,
@@ -916,7 +916,7 @@ void SceneryConverter::CreateRoadSignals()
                 continue;
             }
 
-            double yaw = signal->GetHOffset() + (signal->GetOrientation() ? 0 : M_PI);
+            auto yaw = signal->GetHOffset() + (signal->GetOrientation() ? 0_rad : 1_rad * M_PI);
             auto position = RoadCoord2WorldCoord(road, signal->GetS(), signal->GetT(), yaw);
             auto signalsMapping = OpenDriveTypeMapper::GetSignalsMapping(signal->GetCountry());
             if (signalsMapping->roadMarkings.find(signal->GetType()) != signalsMapping->roadMarkings.end())
@@ -954,7 +954,7 @@ void SceneryConverter::CreateRoadSignals()
                 }
                 auto& parentSign = worldData.GetTrafficSign(owlId.value());
 
-                double yaw = supplementarySign->GetHOffset() + (supplementarySign->GetOrientation() ? 0 : M_PI);
+                auto yaw = supplementarySign->GetHOffset() + (supplementarySign->GetOrientation() ? 0_rad : 1_rad * M_PI);
                 auto position = RoadCoord2WorldCoord(road, supplementarySign->GetS(), supplementarySign->GetT(), yaw);
                 if (!parentSign.AddSupplementarySign(supplementarySign, position))
                 {
@@ -1201,10 +1201,11 @@ const std::map<std::string, CommonTrafficLight::State> stateConversionMap
     {"yellow flashing", CommonTrafficLight::State::YellowFlashing}
 };
 
-namespace TrafficLightNetworkBuilder
+//TODO Reactivate after TrafficSignalController is available in MantleAPI
+/*namespace TrafficLightNetworkBuilder
 {
-TrafficLightNetwork Build(const std::vector<openScenario::TrafficSignalController>& controllers,
-                                                      OWL::Interfaces::WorldData& worldData)
+TrafficLightNetwork Build(const std::vector<TrafficSignalController> &controllers,
+                          OWL::Interfaces::WorldData &worldData)
 {
     TrafficLightNetwork network;
     for(auto& controller : controllers)
@@ -1242,4 +1243,4 @@ TrafficLightNetwork Build(const std::vector<openScenario::TrafficSignalControlle
     }
     return network;
 }
-}
+}*/
diff --git a/sim/src/core/opSimulation/modules/World_OSI/SceneryConverter.h b/sim/src/core/opSimulation/modules/World_OSI/SceneryConverter.h
index adb1c6e193dd205f16642feaeacc1da0eba11ee9..81127038777ee335f862578e21db560b172b8505 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/SceneryConverter.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/SceneryConverter.h
@@ -15,36 +15,36 @@
 
 #pragma once
 
-#include <map>
 #include <list>
-#include "include/callbackInterface.h"
-#include "include/sceneryInterface.h"
-#include "include/worldInterface.h"
-#include "common/vector3d.h"
-#include "WorldData.h"
-#include "WorldDataQuery.h"
+#include <map>
+
 #include "Localization.h"
 #include "TrafficLightNetwork.h"
-#include "common/worldDefinitions.h"
 #include "TrafficObjectAdapter.h"
+#include "WorldData.h"
+#include "WorldDataQuery.h"
+#include "common/vector3d.h"
+#include "common/worldDefinitions.h"
+#include "include/callbackInterface.h"
+#include "include/sceneryInterface.h"
+#include "include/worldInterface.h"
 
 namespace openpass::entity {
 class RepositoryInterface;
 }
 
-namespace Internal
-{
+namespace Internal {
 struct ConversionStatus
 {
     bool status;
     std::string error_message{};
 };
 
-using PathInJunctionConnector = std::function<void(const JunctionInterface*, const RoadInterface *, const RoadInterface *, const RoadInterface *, ContactPointType,
+using PathInJunctionConnector = std::function<void(const JunctionInterface *, const RoadInterface *, const RoadInterface *, const RoadInterface *, ContactPointType,
                                                    ContactPointType, ContactPointType, const std::map<int, int>&)>;
 
-ConversionStatus ConnectJunction(const SceneryInterface* scenery, const JunctionInterface* junction,
-                                    PathInJunctionConnector connectPathInJunction);
+ConversionStatus ConnectJunction(const SceneryInterface *scenery, const JunctionInterface *junction,
+                                 PathInJunctionConnector connectPathInJunction);
 
 } // namespace Internal
 
@@ -54,17 +54,16 @@ ConversionStatus ConnectJunction(const SceneryInterface* scenery, const Junction
 //-----------------------------------------------------------------------------
 class SceneryConverter
 {
-
 public:
     SceneryConverter(const SceneryInterface *scenery,
-                     openpass::entity::RepositoryInterface& repository,
-                     OWL::Interfaces::WorldData& worldData,
-                     const World::Localization::Localizer& localizer,
+                     openpass::entity::RepositoryInterface &repository,
+                     OWL::Interfaces::WorldData &worldData,
+                     const World::Localization::Localizer &localizer,
                      const CallbackInterface *callbacks);
-    SceneryConverter(const SceneryConverter&) = delete;
-    SceneryConverter(SceneryConverter&&) = delete;
-    SceneryConverter& operator=(const SceneryConverter&) = delete;
-    SceneryConverter& operator=(SceneryConverter&&) = delete;
+    SceneryConverter(const SceneryConverter &) = delete;
+    SceneryConverter(SceneryConverter &&) = delete;
+    SceneryConverter &operator=(const SceneryConverter &) = delete;
+    SceneryConverter &operator=(SceneryConverter &&) = delete;
     virtual ~SceneryConverter() = default;
 
     //-----------------------------------------------------------------------------
@@ -82,7 +81,8 @@ public:
     //! Places all static traffic objects and all traffic signs in the world
     void ConvertObjects();
 
-    static Position RoadCoord2WorldCoord(const RoadInterface *road, double s, double t, double yaw);
+    static Position RoadCoord2WorldCoord(const RoadInterface *road, units::length::meter_t s, units::length::meter_t t, units::angle::radian_t yaw);
+
 protected:
     //-----------------------------------------------------------------------------
     //! Provides callback to LOG() macro
@@ -97,7 +97,7 @@ protected:
              int line,
              const std::string &message)
     {
-        if(callbacks)
+        if (callbacks)
         {
             callbacks->Log(logLevel,
                            file,
@@ -116,7 +116,7 @@ private:
     //!                                 in the provided lane section, nullptr otherwise
     //-----------------------------------------------------------------------------
     RoadLaneInterface *GetOtherLane(RoadLaneSectionInterface *otherSection,
-                           int otherId);
+                                    int otherId);
 
     //-----------------------------------------------------------------------------
     //! Returns the road from the scenery to which the provided link links to.
@@ -141,7 +141,6 @@ private:
     void MarkDirectionRoad(RoadInterface *road,
                            bool inDirection);
 
-
     //-----------------------------------------------------------------------------
     //! Mark the directions of all roads in the scenery according to global direction
     //! definition.
@@ -228,7 +227,7 @@ private:
     //! @param[in]  otherSection        section on otherRoad to connect to
     //! @return                         False, if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool ConnectExternalRoadSuccessor(const RoadInterface* currentRoad, const RoadInterface* otherRoad, RoadLaneSectionInterface *otherSection);
+    bool ConnectExternalRoadSuccessor(const RoadInterface *currentRoad, const RoadInterface *otherRoad, RoadLaneSectionInterface *otherSection);
 
     //-----------------------------------------------------------------------------
     //! Connects a road with another road by setting predecessor of road, section and lanes
@@ -250,14 +249,13 @@ private:
     //-----------------------------------------------------------------------------
     bool ConnectRoadInternal(RoadInterface *road);
 
-
     //-----------------------------------------------------------------------------
     //!Connects the incoming and connecting roads of the junction
     //!
     //! @param[in]  junction            Junction which should be connected
     //! @return                         False, if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    bool ConnectJunction(const JunctionInterface* junction);
+    bool ConnectJunction(const JunctionInterface *junction);
 
     //-----------------------------------------------------------------------------
     //! Connects a single path of a junction.
@@ -273,7 +271,7 @@ private:
     //! @param[in]  laneIdMapping           mapping of the lane ids between the incoming road and the path
     //! @return                         False, if an error occurred, true otherwise
     //-----------------------------------------------------------------------------
-    void ConnectPathInJunction(const JunctionInterface* junction, const RoadInterface *incomingRoad, const RoadInterface *connectingRoad, const RoadInterface*outgoingRoad,
+    void ConnectPathInJunction(const JunctionInterface *junction, const RoadInterface *incomingRoad, const RoadInterface *connectingRoad, const RoadInterface *outgoingRoad,
                                ContactPointType incomingContactPoint, ContactPointType connectingContactPoint, ContactPointType outgoingContactPoint, const std::map<int, int> &laneIdMapping);
 
     //-----------------------------------------------------------------------------
@@ -294,21 +292,21 @@ private:
     //! \param signal       OpenDrive specification of the sign
     //! \param position     position of the sign in the world
     //! \param lanes        lanes for which this sign is valid
-    void CreateTrafficSign(RoadSignalInterface* signal, Position position, const OWL::Interfaces::Lanes& lanes);
+    void CreateTrafficSign(RoadSignalInterface *signal, Position position, const OWL::Interfaces::Lanes &lanes);
 
     //! Creates a road marking in OWL from an OpenDrive RoadSignal
     //!
     //! \param signal       OpenDrive specification of the road marking
     //! \param position     position of the road marking in the world
     //! \param lanes        lanes for which this road marking is valid
-    void CreateRoadMarking(RoadSignalInterface* signal, Position position, const OWL::Interfaces::Lanes& lanes);
+    void CreateRoadMarking(RoadSignalInterface *signal, Position position, const OWL::Interfaces::Lanes &lanes);
 
     //! Creates a road marking in OWL from an OpenDrive RoadSignal
     //!
     //! \param object       OpenDrive specification of the road marking as object
     //! \param position     position of the road marking in the world
     //! \param lanes        lanes for which this road marking is valid
-    void CreateRoadMarking(RoadObjectInterface* object, Position position, const OWL::Interfaces::Lanes& lanes);
+    void CreateRoadMarking(RoadObjectInterface *object, Position position, const OWL::Interfaces::Lanes &lanes);
 
     //! Creates a traffic light in OWL from an OpenDrive RoadSignal
     //!
@@ -320,32 +318,32 @@ private:
 
     void CreateObjects();
 
-    void CreateObject(const RoadObjectInterface* object, const Position &position);
+    void CreateObject(const RoadObjectInterface *object, const Position &position);
 
-    void CreateContinuousObject(const RoadObjectInterface* object, const RoadInterface* road);
+    void CreateContinuousObject(const RoadObjectInterface *object, const RoadInterface *road);
 
-    bool IsMovingObject(RoadObjectInterface* object);
+    bool IsMovingObject(RoadObjectInterface *object);
 
-    bool IsVehicle(RoadObjectInterface* object);
+    bool IsVehicle(RoadObjectInterface *object);
 
-    osi3::StationaryObject_Classification_Type GetStationaryObjectType(RoadObjectInterface* object);
+    osi3::StationaryObject_Classification_Type GetStationaryObjectType(RoadObjectInterface *object);
 
-    osi3::MovingObject_Type GetMovingObjectType(RoadObjectInterface* object);
+    osi3::MovingObject_Type GetMovingObjectType(RoadObjectInterface *object);
 
-    osi3::MovingObject_VehicleClassification_Type GetVehicleType(RoadObjectInterface* object);
+    osi3::MovingObject_VehicleClassification_Type GetVehicleType(RoadObjectInterface *object);
 
-    void SetOsiPosition(osi3::BaseStationary* baseStationary,osi3::BaseMoving* baseMoving, RoadInterface* road,
-                        double s, double t,
-                        double length, double height, double width,
-                        double yaw, double pitch, double roll);
+    void SetOsiPosition(osi3::BaseStationary *baseStationary, osi3::BaseMoving *baseMoving, RoadInterface *road,
+                        units::length::meter_t s, units::length::meter_t t,
+                        units::length::meter_t length, units::length::meter_t height, units::length::meter_t width,
+                        units::angle::radian_t yaw, units::angle::radian_t pitch, units::angle::radian_t roll);
 
     std::vector<OWL::Id> CreateLaneBoundaries(RoadLaneInterface &odLane, RoadLaneSectionInterface &odSection);
 
     const SceneryInterface *scenery;
-    openpass::entity::RepositoryInterface& repository;
-    OWL::Interfaces::WorldData& worldData;
+    openpass::entity::RepositoryInterface &repository;
+    OWL::Interfaces::WorldData &worldData;
     WorldDataQuery worldDataQuery{worldData};
-    const World::Localization::Localizer& localizer;
+    const World::Localization::Localizer &localizer;
     const CallbackInterface *callbacks;
     std::vector<std::unique_ptr<TrafficObjectAdapter>> trafficObjects;
 };
@@ -355,8 +353,8 @@ inline bool IsWithinLeftClosedInterval(double value, double start, double end)
     return value >= start && value < end;
 }
 
-template<typename T, typename A>
-inline bool HasSucceedingElement(std::vector<T, A> const& vector, size_t currentIndex)
+template <typename T, typename A>
+inline bool HasSucceedingElement(std::vector<T, A> const &vector, size_t currentIndex)
 {
     return vector.size() > currentIndex + 1;
 }
@@ -365,9 +363,10 @@ class RoadNetworkBuilder
 {
     class DataBufferWriteInterface;
 public:
-    RoadNetworkBuilder(const SceneryInterface& scenery) :
+    RoadNetworkBuilder(const SceneryInterface &scenery) :
         scenery(scenery)
-    {}
+    {
+    }
 
     //! Converts the road netwerk of OpenDrive into a graph representation
     //!
@@ -376,12 +375,12 @@ public:
     std::pair<RoadGraph, RoadGraphVertexMapping> Build();
 
 private:
-    const SceneryInterface& scenery;
+    const SceneryInterface &scenery;
 };
 
-namespace TrafficLightNetworkBuilder
-{
-    //! Converts the traffic controller definitions of OpenDrive into the internal TrafficLightNetwork
-    TrafficLightNetwork Build(const std::vector<openScenario::TrafficSignalController>& controllers,
-                              OWL::Interfaces::WorldData& worldData);
-};
+//TODO Reactivate after TrafficSignalController is available in MantleAPI
+/*namespace TrafficLightNetworkBuilder {
+//! Converts the traffic controller definitions of OpenDrive into the internal TrafficLightNetwork
+TrafficLightNetwork Build(const std::vector<TrafficSignalController> &controllers,
+                          OWL::Interfaces::WorldData& worldData);
+}; // namespace TrafficLightNetworkBuilder*/
diff --git a/sim/src/core/opSimulation/modules/World_OSI/TrafficObjectAdapter.cpp b/sim/src/core/opSimulation/modules/World_OSI/TrafficObjectAdapter.cpp
index 29efdd33d23f5565c90bebaae7b4e24416744499..1d9194f1d0bd14922348d0467e86bbcc166ec51f 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/TrafficObjectAdapter.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/TrafficObjectAdapter.cpp
@@ -20,10 +20,10 @@
 TrafficObjectAdapter::TrafficObjectAdapter(const openpass::type::EntityId id,
                                            OWL::Interfaces::WorldData& worldData,
                                            const World::Localization::Localizer& localizer,
-                                           OWL::Primitive::AbsPosition position,
-                                           OWL::Primitive::Dimension dimension,
-                                           const double zOffset,
-                                           OWL::Primitive::AbsOrientation orientation,
+                                           mantle_api::Vec3<units::length::meter_t> position,
+                                           mantle_api::Dimension3 dimension,
+                                           const units::length::meter_t zOffset,
+                                           mantle_api::Orientation3<units::angle::radian_t> orientation,
                                            const OpenDriveId odId) :
     WorldObjectAdapter{worldData.AddStationaryObject(id.value, static_cast<void*>(static_cast<WorldObjectInterface*>(this)))}, // objects passed as void * need to be casted to WorldObjectInterface*, because they are retrieved by casting to that class
     zOffset{zOffset},
@@ -42,39 +42,39 @@ ObjectTypeOSI TrafficObjectAdapter::GetType() const
     return ObjectTypeOSI::Object;
 }
 
-double TrafficObjectAdapter::GetZOffset() const
+units::length::meter_t TrafficObjectAdapter::GetZOffset() const
 {
     return zOffset;
 }
 
 bool TrafficObjectAdapter::GetIsCollidable() const
 {
-    return (GetHeight() > 0 && GetLength() > 0 && GetWidth() > 0);
+    return (GetHeight() > 0_m && GetLength() > 0_m && GetWidth() > 0_m);
 }
 
-void TrafficObjectAdapter::InitLaneDirection(double hdg)
+void TrafficObjectAdapter::InitLaneDirection(units::angle::radian_t hdg)
 {
     laneDirection = GetYaw() - hdg;
 }
 
 
-Common::Vector2d TrafficObjectAdapter:: GetVelocity(ObjectPoint point) const
+Common::Vector2d<units::velocity::meters_per_second_t> TrafficObjectAdapter:: GetVelocity(ObjectPoint point) const
 {
     Q_UNUSED(point);
 
     //TrafficObjects don't move
-    return {0.0, 0.0};
+    return {0.0_mps, 0.0_mps};
 }
 
-Common::Vector2d TrafficObjectAdapter:: GetAcceleration(ObjectPoint point) const
+Common::Vector2d<units::acceleration::meters_per_second_squared_t> TrafficObjectAdapter:: GetAcceleration(ObjectPoint point) const
 {
     Q_UNUSED(point);
 
     //TrafficObjects don't move
-    return {0.0, 0.0};
+    return {0.0_mps_sq, 0.0_mps_sq};
 }
 
-double TrafficObjectAdapter::GetLaneDirection() const
+units::angle::radian_t TrafficObjectAdapter::GetLaneDirection() const
 {
     return laneDirection;
 }
@@ -99,10 +99,10 @@ const RoadIntervals &TrafficObjectAdapter::GetTouchedRoads() const
     return locateResult.touchedRoads;
 }
 
-Common::Vector2d TrafficObjectAdapter::GetAbsolutePosition(const ObjectPoint &objectPoint) const
+Common::Vector2d<units::length::meter_t> TrafficObjectAdapter::GetAbsolutePosition(const ObjectPoint &objectPoint) const
 {
-    double longitudinal;
-    double lateral;
+    units::length::meter_t longitudinal;
+    units::length::meter_t lateral;
     if (std::holds_alternative<ObjectPointCustom>(objectPoint))
     {
         longitudinal = std::get<ObjectPointCustom>(objectPoint).longitudinal;
@@ -114,16 +114,16 @@ Common::Vector2d TrafficObjectAdapter::GetAbsolutePosition(const ObjectPoint &ob
         {
         case ObjectPointPredefined::Reference:
         case ObjectPointPredefined::Center:
-            longitudinal = 0;
-            lateral = 0;
+            longitudinal = 0_m;
+            lateral = 0_m;
             break;
         case ObjectPointPredefined::FrontCenter:
             longitudinal = 0.5 * GetLength();
-            lateral = 0;
+            lateral = 0_m;
             break;
         case ObjectPointPredefined::RearCenter:
             longitudinal = -0.5 * GetLength();
-            lateral = 0;
+            lateral = 0_m;
             break;
         case ObjectPointPredefined::FrontLeft:
             longitudinal = 0.5 * GetLength();
@@ -149,8 +149,8 @@ Common::Vector2d TrafficObjectAdapter::GetAbsolutePosition(const ObjectPoint &ob
     }
     const auto& referencePoint = baseTrafficObject.GetReferencePointPosition();
     const auto& yaw = baseTrafficObject.GetAbsOrientation().yaw;
-    double x = referencePoint.x + std::cos(yaw) * longitudinal - std::sin(yaw) * lateral;
-    double y = referencePoint.y + std::sin(yaw) * longitudinal + std::cos(yaw) * lateral;
+    auto x = referencePoint.x + units::math::cos(yaw) * longitudinal - units::math::sin(yaw) * lateral;
+    auto y = referencePoint.y + units::math::sin(yaw) * longitudinal + units::math::cos(yaw) * lateral;
     return {x,y};
 }
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/TrafficObjectAdapter.h b/sim/src/core/opSimulation/modules/World_OSI/TrafficObjectAdapter.h
index e3a8c3a09ac5b7f7a058d53c8f132f6dfe4c1d1f..ce6a1a4a09322c054c123c13fcca9ac736d6091c 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/TrafficObjectAdapter.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/TrafficObjectAdapter.h
@@ -18,8 +18,8 @@ class TrafficObjectAdapter : public WorldObjectAdapter, public TrafficObjectInte
 {
 private:
     bool isCollidable;
-    const double zOffset;
-    double laneDirection;
+    const units::length::meter_t zOffset;
+    units::angle::radian_t laneDirection;
     const World::Localization::Localizer& localizer;
 
     mutable World::Localization::Result locateResult;
@@ -27,30 +27,30 @@ private:
 
     OpenDriveId openDriveId;
 
-    void InitLaneDirection(double hdg);
+    void InitLaneDirection(units::angle::radian_t hdg);
 
 public:
     TrafficObjectAdapter(const openpass::type::EntityId id,
                          OWL::Interfaces::WorldData& worldData,
                          const World::Localization::Localizer& localizer,
-                         OWL::Primitive::AbsPosition position,
-                         OWL::Primitive::Dimension dimension,
-                         const double zOffset,
-                         OWL::Primitive::AbsOrientation orientation,
+                         mantle_api::Vec3<units::length::meter_t> position,
+                         mantle_api::Dimension3 dimension,
+                         const units::length::meter_t zOffset,
+                         mantle_api::Orientation3<units::angle::radian_t> orientation,
                          const OpenDriveId odId);
 
     ObjectTypeOSI GetType() const override;
-    double GetZOffset() const override;
+    units::length::meter_t GetZOffset() const override;
     bool GetIsCollidable() const override;
-    Common::Vector2d GetVelocity(ObjectPoint point = ObjectPointPredefined::Reference) const override;
-    Common::Vector2d GetAcceleration(ObjectPoint point = ObjectPointPredefined::Reference) const override;
-    double GetLaneDirection() const;
+    Common::Vector2d<units::velocity::meters_per_second_t> GetVelocity(ObjectPoint point = ObjectPointPredefined::Reference) const override;
+    Common::Vector2d<units::acceleration::meters_per_second_squared_t> GetAcceleration(ObjectPoint point = ObjectPointPredefined::Reference) const override;
+    units::angle::radian_t GetLaneDirection() const;
     bool Locate() override;
     void Unlocate() override;
 
     const RoadIntervals &GetTouchedRoads() const override;
 
-    Common::Vector2d GetAbsolutePosition(const ObjectPoint& objectPoint) const override;
+    Common::Vector2d<units::length::meter_t> GetAbsolutePosition(const ObjectPoint& objectPoint) const override;
 
     const GlobalRoadPositions& GetRoadPosition(const ObjectPoint& point) const override;
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldData.cpp b/sim/src/core/opSimulation/modules/World_OSI/WorldData.cpp
index 320d5f28520211691de7c6b0d8640532fbaed869..ed8b22ac6ad26126301ab22b964e8c2f467000db 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldData.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldData.cpp
@@ -16,26 +16,24 @@
 //!        scenery and dynamic objects
 //-----------------------------------------------------------------------------
 
+#include "WorldData.h"
+
 #include <exception>
 #include <string>
-#include <qglobal.h>
 
-#include "common/vector3d.h"
-#include "include/agentInterface.h"
-#include "include/roadInterface/roadInterface.h"
-#include "common/openScenarioDefinitions.h"
+#include <qglobal.h>
 
 #include "OWL/DataTypes.h"
 #include "OWL/TrafficLight.h"
 #include "OWL/MovingObject.h"
 #include "OWL/OpenDriveTypeMapper.h"
 #include "OWL/OsiDefaultValues.h"
-#include "common/osiUtils.h"
-
-#include "WorldData.h"
 #include "WorldDataException.h"
 #include "WorldDataQuery.h"
-
+#include "common/osiUtils.h"
+#include "common/vector3d.h"
+#include "include/agentInterface.h"
+#include "include/roadInterface/roadInterface.h"
 #include "osi3/osi_groundtruth.pb.h"
 #include "osi3/osi_sensorviewconfiguration.pb.h"
 #include "osi3/osi_common.pb.h"
@@ -165,30 +163,32 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
         GroundTruth_ptr filteredGroundTruth = std::make_unique<osi3::GroundTruth>();
 #endif
 
-        Primitive::AbsPosition relativeSensorPos
-                {conf.mounting_position().position().x(),
-                 conf.mounting_position().position().y(),
-                 conf.mounting_position().position().z()};
+    mantle_api::Vec3<units::length::meter_t> relativeSensorPos
+        { units::length::meter_t(conf.mounting_position().position().x()),
+          units::length::meter_t(conf.mounting_position().position().y()),
+          units::length::meter_t(conf.mounting_position().position().z()) };
 
 
         const auto &orientation = reference.GetAbsOrientation();
-        relativeSensorPos.RotateYaw(orientation.yaw);
+
+        relativeSensorPos = CommonHelper::RotateYaw(relativeSensorPos, orientation.yaw);
         auto absoluteSensorPos = reference.GetReferencePointPosition() + relativeSensorPos;
 
-        const double fieldOfView = conf.field_of_view_horizontal();
-        double leftBoundaryAngle;
-        double rightBoundaryAngle;
-        if (fieldOfView >= 2 * M_PI) {
-            leftBoundaryAngle = M_PI;
-            rightBoundaryAngle = -M_PI;
+        const units::angle::radian_t fieldOfView{conf.field_of_view_horizontal()};
+        units::angle::radian_t leftBoundaryAngle;
+        units::angle::radian_t rightBoundaryAngle;
+        if (fieldOfView >= 2_rad * M_PI)
+        {
+            leftBoundaryAngle = 1_rad * M_PI;
+            rightBoundaryAngle = 1_rad * -M_PI;
         } else {
             leftBoundaryAngle = CommonHelper::SetAngleToValidRange(
-                    orientation.yaw + conf.mounting_position().orientation().yaw() + fieldOfView / 2.0);
+                    orientation.yaw + units::angle::radian_t(conf.mounting_position().orientation().yaw()) + fieldOfView / 2.0);
             rightBoundaryAngle = CommonHelper::SetAngleToValidRange(
-                    orientation.yaw + conf.mounting_position().orientation().yaw() - fieldOfView / 2.0);
+                    orientation.yaw + units::angle::radian_t(conf.mounting_position().orientation().yaw()) - fieldOfView / 2.0);
         }
 
-        const double range = conf.range();
+        const units::length::meter_t range{conf.range()};
 
         const auto &filteredMovingObjects = GetMovingObjectsInSector(absoluteSensorPos, range, leftBoundaryAngle,
                                                                      rightBoundaryAngle);
@@ -243,10 +243,10 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
     }
 
     std::vector<const Interfaces::StationaryObject *>
-    WorldData::GetStationaryObjectsInSector(const Primitive::AbsPosition &origin,
-                                            double radius,
-                                            double leftBoundaryAngle,
-                                            double rightBoundaryAngle) {
+    WorldData::GetStationaryObjectsInSector(const mantle_api::Vec3<units::length::meter_t>& origin,
+                                            units::length::meter_t radius,
+                                            units::angle::radian_t leftBoundaryAngle,
+                                            units::angle::radian_t rightBoundaryAngle) {
         std::vector<Interfaces::StationaryObject *> objects;
 
         for (const auto &mapItem: stationaryObjects) {
@@ -257,10 +257,10 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
     }
 
     std::vector<const Interfaces::MovingObject *>
-    WorldData::GetMovingObjectsInSector(const Primitive::AbsPosition &origin,
-                                        double radius,
-                                        double leftBoundaryAngle,
-                                        double rightBoundaryAngle) {
+    WorldData::GetMovingObjectsInSector(const mantle_api::Vec3<units::length::meter_t>& origin,
+                                        units::length::meter_t radius,
+                                        units::angle::radian_t leftBoundaryAngle,
+                                        units::angle::radian_t rightBoundaryAngle) {
         std::vector<Interfaces::MovingObject *> objects;
 
         for (const auto &mapItem: movingObjects) {
@@ -271,10 +271,10 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
     }
 
     std::vector<const Interfaces::TrafficSign *>
-    WorldData::GetTrafficSignsInSector(const Primitive::AbsPosition &origin,
-                                       double radius,
-                                       double leftBoundaryAngle,
-                                       double rightBoundaryAngle) {
+    WorldData::GetTrafficSignsInSector(const mantle_api::Vec3<units::length::meter_t>& origin,
+                                       units::length::meter_t radius,
+                                       units::angle::radian_t leftBoundaryAngle,
+                                       units::angle::radian_t rightBoundaryAngle) {
         std::vector<Interfaces::TrafficSign *> objects;
 
         for (const auto &mapItem: trafficSigns) {
@@ -285,10 +285,10 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
     }
 
     std::vector<const Interfaces::TrafficLight *>
-    WorldData::GetTrafficLightsInSector(const Primitive::AbsPosition &origin,
-                                        double radius,
-                                        double leftBoundaryAngle,
-                                        double rightBoundaryAngle) {
+    WorldData::GetTrafficLightsInSector(const mantle_api::Vec3<units::length::meter_t>& origin,
+                                        units::length::meter_t radius,
+                                        units::angle::radian_t leftBoundaryAngle,
+                                        units::angle::radian_t rightBoundaryAngle) {
         std::vector<Interfaces::TrafficLight *> objects;
 
         for (const auto &mapItem: trafficLights) {
@@ -300,8 +300,10 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
     }
 
     std::vector<const Interfaces::RoadMarking *>
-    WorldData::GetRoadMarkingsInSector(const Primitive::AbsPosition &origin, double radius, double leftBoundaryAngle,
-                                       double rightBoundaryAngle) {
+    WorldData::GetRoadMarkingsInSector(const mantle_api::Vec3<units::length::meter_t> &origin,
+                                       units::length::meter_t radius,
+                                       units::angle::radian_t leftBoundaryAngle,
+                                       units::angle::radian_t rightBoundaryAngle) {
         std::vector<Interfaces::RoadMarking *> objects;
 
         for (const auto &mapItem: roadMarkings) {
@@ -475,10 +477,10 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
         section.AddLane(*lane);
     }
 
-    Id WorldData::AddLaneBoundary(const Id id, const RoadLaneRoadMark &odLaneRoadMark, double sectionStart,
-                                  LaneMarkingSide side) {
-        constexpr double standardWidth = 0.15;
-        constexpr double boldWidth = 0.3;
+Id WorldData::AddLaneBoundary(const Id id, const RoadLaneRoadMark &odLaneRoadMark, units::length::meter_t sectionStart, LaneMarkingSide side)
+{
+        const units::length::meter_t standardWidth{0.15};
+        const units::length::meter_t boldWidth{0.3};
         osi3::LaneBoundary *osiLaneBoundary = osiGroundTruth->add_lane_boundary();
         osiLaneBoundary->mutable_id()->set_value(id);
         osiLaneBoundary->mutable_classification()->set_color(
@@ -486,7 +488,7 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
         osiLaneBoundary->mutable_classification()->set_type(
                 OpenDriveTypeMapper::OdToOsiLaneMarkingType(odLaneRoadMark.GetType(), side));
 
-        double width = 0.0;
+        units::length::meter_t width{0.0};
         if (odLaneRoadMark.GetWeight() == RoadLaneRoadMarkWeight::Standard) {
             width = standardWidth;
         } else if (odLaneRoadMark.GetWeight() == RoadLaneRoadMarkWeight::Bold) {
@@ -736,12 +738,12 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
     }
 
     void WorldData::AddLaneGeometryPoint(const RoadLaneInterface &odLane,
-                                         const Common::Vector2d &pointLeft,
-                                         const Common::Vector2d &pointCenter,
-                                         const Common::Vector2d &pointRight,
-                                         const double sOffset,
-                                         const double curvature,
-                                         const double heading) {
+                                         const Common::Vector2d<units::length::meter_t>& pointLeft,
+                                         const Common::Vector2d<units::length::meter_t>& pointCenter,
+                                         const Common::Vector2d<units::length::meter_t>& pointRight,
+                                         const units::length::meter_t sOffset,
+                                         const units::curvature::inverse_meter_t curvature,
+                                         const units::angle::radian_t heading) {
         osi3::Lane *osiLane = osiLanes.at(&odLane);
 
         auto& lane = lanes.at(osiLane->id().value());
@@ -759,8 +761,8 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
         }
     }
 
-    void WorldData::AddCenterLinePoint(const RoadLaneSectionInterface &odSection, const Common::Vector2d &pointCenter,
-                                       const double sOffset, double heading) {
+void WorldData::AddCenterLinePoint(const RoadLaneSectionInterface &odSection, const Common::Vector2d<units::length::meter_t> &pointCenter,
+                                   const units::length::meter_t sOffset, units::angle::radian_t heading) {
         const auto &section = sections.at(&odSection);
         for (auto &laneBoundaryIndex: section->GetCenterLaneBoundary()) {
             auto &laneBoundary = laneBoundaries.at(laneBoundaryIndex);
@@ -815,56 +817,112 @@ WorldData::GroundTruth_ptr WorldData::GetFilteredGroundTruth(const osi3::SensorV
         return *trafficLights.at(id);
     }
 
-    void WorldData::SetEnvironment(const openScenario::EnvironmentAction &environment) {
-        if (environment.weather.sun.intensity < THRESHOLD_ILLUMINATION_LEVEL1) {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL1);
-        } else if (environment.weather.sun.intensity < THRESHOLD_ILLUMINATION_LEVEL2) {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL2);
-        } else if (environment.weather.sun.intensity < THRESHOLD_ILLUMINATION_LEVEL3) {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL3);
-        } else if (environment.weather.sun.intensity < THRESHOLD_ILLUMINATION_LEVEL4) {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL4);
-        } else if (environment.weather.sun.intensity < THRESHOLD_ILLUMINATION_LEVEL5) {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL5);
-        } else if (environment.weather.sun.intensity < THRESHOLD_ILLUMINATION_LEVEL6) {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL6);
-        } else if (environment.weather.sun.intensity < THRESHOLD_ILLUMINATION_LEVEL7) {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL7);
-        } else if (environment.weather.sun.intensity < THRESHOLD_ILLUMINATION_LEVEL8) {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL8);
-        } else {
-            osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(
-                    osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL9);
-        }
-        if (environment.weather.fog.visualRange < THRESHOLD_FOG_DENSE) {
-            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_DENSE);
-        } else if (environment.weather.fog.visualRange < THRESHOLD_FOG_THICK) {
-            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_THICK);
-        } else if (environment.weather.fog.visualRange < THRESHOLD_FOG_LIGHT) {
-            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_LIGHT);
-        } else if (environment.weather.fog.visualRange < THRESHOLD_FOG_MIST) {
+    void WorldData::SetEnvironment(const mantle_api::Weather &weather) {
+        switch(weather.fog)
+        {
+          case mantle_api::Fog::kUnknown :
+            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_UNKNOWN);
+            break;
+          case mantle_api::Fog::kOther :
+            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_OTHER);
+            break;
+          case mantle_api::Fog::kExcellentVisibility :
+           osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_EXCELLENT_VISIBILITY);
+           break;
+          case mantle_api::Fog::kGoodVisibility :
+            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_GOOD_VISIBILITY);
+            break;
+          case mantle_api::Fog::kModerateVisibility :
+            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_MODERATE_VISIBILITY);
+            break;
+          case mantle_api::Fog::kPoorVisibility :
+            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_POOR_VISIBILITY);
+            break;
+          case mantle_api::Fog::kMist :
             osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_MIST);
-        } else if (environment.weather.fog.visualRange < THRESHOLD_FOG_POOR) {
-            osiGroundTruth->mutable_environmental_conditions()->set_fog(
-                    osi3::EnvironmentalConditions_Fog_FOG_POOR_VISIBILITY);
-        } else if (environment.weather.fog.visualRange < THRESHOLD_FOG_MODERATE) {
-            osiGroundTruth->mutable_environmental_conditions()->set_fog(
-                    osi3::EnvironmentalConditions_Fog_FOG_MODERATE_VISIBILITY);
-        } else if (environment.weather.fog.visualRange < THRESHOLD_FOG_GOOD) {
-            osiGroundTruth->mutable_environmental_conditions()->set_fog(
-                    osi3::EnvironmentalConditions_Fog_FOG_GOOD_VISIBILITY);
-        } else {
-            osiGroundTruth->mutable_environmental_conditions()->set_fog(
-                    osi3::EnvironmentalConditions_Fog_FOG_EXCELLENT_VISIBILITY);
+            break;
+          case mantle_api::Fog::kLight :
+            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_LIGHT);
+            break;
+          case mantle_api::Fog::kThick :
+            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_THICK);
+            break;
+          case mantle_api::Fog::kDense :
+            osiGroundTruth->mutable_environmental_conditions()->set_fog(osi3::EnvironmentalConditions_Fog_FOG_DENSE);
+            break;
         }
+
+        switch(weather.precipitation)
+        {
+            case mantle_api::Precipitation::kUnknown :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_UNKNOWN);
+                break;
+            case mantle_api::Precipitation::kOther :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_OTHER);
+                break;
+            case mantle_api::Precipitation::kNone :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_NONE);
+                break;
+            case mantle_api::Precipitation::kVeryLight :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_VERY_LIGHT);
+                break;
+            case mantle_api::Precipitation::kLight :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_LIGHT);
+                break;
+            case mantle_api::Precipitation::kModerate :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_MODERATE);
+                break;
+            case mantle_api::Precipitation::kHeavy :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_HEAVY);
+                break;
+            case mantle_api::Precipitation::kVeryHeavy :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_VERY_HEAVY);
+                break;
+            case mantle_api::Precipitation::kExtreme :
+                osiGroundTruth->mutable_environmental_conditions()->set_precipitation(osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_EXTREME);
+                break;
+        }
+
+        switch(weather.illumination)
+        {
+            case mantle_api::Illumination::kUnknown :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_UNKNOWN);
+                break;
+            case mantle_api::Illumination::kOther :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_OTHER);
+                break;
+            case mantle_api::Illumination::kLevel1 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL1);
+                break;
+            case mantle_api::Illumination::kLevel2 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL2);
+                break;
+            case mantle_api::Illumination::kLevel3 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL3);
+                break;
+            case mantle_api::Illumination::kLevel4 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL4);
+                break;
+            case mantle_api::Illumination::kLevel5 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL5);
+                break;
+            case mantle_api::Illumination::kLevel6 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL6);
+                break;
+            case mantle_api::Illumination::kLevel7 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL7);
+                break;
+            case mantle_api::Illumination::kLevel8 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL8);
+                break;
+            case mantle_api::Illumination::kLevel9 :
+                osiGroundTruth->mutable_environmental_conditions()->set_ambient_illumination(osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL9);
+                break;
+        }
+
+        osiGroundTruth->mutable_environmental_conditions()->set_relative_humidity(weather.humidity.value());
+        osiGroundTruth->mutable_environmental_conditions()->set_temperature(weather.temperature.value());
+        osiGroundTruth->mutable_environmental_conditions()->set_atmospheric_pressure(weather.atmospheric_pressure.value());
     }
 
     const Interfaces::MovingObject &WorldData::GetMovingObject(Id id) const {
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldData.h b/sim/src/core/opSimulation/modules/World_OSI/WorldData.h
index de935fd1934b7d2796e0d77b769883f2f02f3d83..ed59dbaee35a97f7cd3735f95d0417bfd9f37fd5 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldData.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldData.h
@@ -21,51 +21,53 @@
 #include <unordered_map>
 
 #include "OWL/DataTypes.h"
-#include "OWL/TrafficLight.h"
 #include "OWL/MovingObject.h"
-#include "include/roadInterface/roadInterface.h"
+#include "OWL/TrafficLight.h"
+#include "include/callbackInterface.h"
 #include "include/roadInterface/junctionInterface.h"
+#include "include/roadInterface/roadInterface.h"
 #include "include/worldInterface.h"
-#include "include/callbackInterface.h"
-#include "common/openScenarioDefinitions.h"
 #include "common/hypot.h"
 #include "osi3/osi_groundtruth.pb.h"
 #include "osi3/osi_sensorview.pb.h"
 #include "osi3/osi_sensorviewconfiguration.pb.h"
+#include "MantleAPI/EnvironmentalConditions/weather.h"
 
 #ifdef USE_PROTOBUF_ARENA
 #include <google/protobuf/arena.h>
 #endif
 
+using namespace units::literals;
+
 namespace OWL {
 
-using Lane              = Interfaces::Lane;
-using LaneBoundary      = Interfaces::LaneBoundary;
-using Section           = Interfaces::Section;
-using Road              = Interfaces::Road;
-using Junction          = Interfaces::Junction;
-using StationaryObject  = Implementation::StationaryObject;
-using MovingObject      = Implementation::MovingObject;
-using TrafficSign       = Implementation::TrafficSign;
+using Lane = Interfaces::Lane;
+using LaneBoundary = Interfaces::LaneBoundary;
+using Section = Interfaces::Section;
+using Road = Interfaces::Road;
+using Junction = Interfaces::Junction;
+using StationaryObject = Implementation::StationaryObject;
+using MovingObject = Implementation::MovingObject;
+using TrafficSign = Implementation::TrafficSign;
 using RoadMarking       = Implementation::RoadMarking;
 
-using CLane              = const Interfaces::Lane;
-using CSection           = const Interfaces::Section;
-using CRoad              = const Interfaces::Road;
-using CStationaryObject  = const Implementation::StationaryObject;
-using CMovingObject      = const Implementation::MovingObject;
+using CLane = const Interfaces::Lane;
+using CSection = const Interfaces::Section;
+using CRoad = const Interfaces::Road;
+using CStationaryObject = const Implementation::StationaryObject;
+using CMovingObject = const Implementation::MovingObject;
 
-using Lanes = std::vector<Lane*>;
-using Sections = std::vector<Section*>;
-using Roads = std::vector<Road*>;
-using StationaryObjects = std::vector<StationaryObject*>;
-using MovingObjects = std::vector<MovingObject*>;
+using Lanes = std::vector<Lane *>;
+using Sections = std::vector<Section *>;
+using Roads = std::vector<Road *>;
+using StationaryObjects = std::vector<StationaryObject *>;
+using MovingObjects = std::vector<MovingObject *>;
 
-using CLanes = const std::vector<CLane*>;
-using CSections = const std::vector<CSection*>;
-using CRoads = const std::vector<CRoad*>;
-using CStationaryObjects = const std::vector<CStationaryObject*>;
-using CMovingObjects = const std::vector<CMovingObject*>;
+using CLanes = const std::vector<CLane *>;
+using CSections = const std::vector<CSection *>;
+using CRoads = const std::vector<CRoad *>;
+using CStationaryObjects = const std::vector<CStationaryObject *>;
+using CMovingObjects = const std::vector<CMovingObject *>;
 
 template<typename T>
 using IdMapping = std::map<OWL::Id, std::unique_ptr<T>>;
@@ -81,7 +83,9 @@ enum class SignalType
 //If using protobuf arena the SensorView must not be manually deleted.
 struct DoNothing
 {
-    void operator() (osi3::SensorView*) {}
+    void operator()(osi3::SensorView *)
+    {
+    }
 };
 using SensorView_ptr = std::unique_ptr<osi3::SensorView, DoNothing>;
 #else
@@ -107,7 +111,7 @@ public:
      *
      * \return      A OSI SensorView with filtered GroundTruth
      */
-    virtual SensorView_ptr GetSensorView(osi3::SensorViewConfiguration& conf, int agentId) = 0;
+    virtual SensorView_ptr GetSensorView(osi3::SensorViewConfiguration &conf, int agentId) = 0;
 
     /*!
      * \brief Frees temporary objects
@@ -119,10 +123,10 @@ public:
      */
     virtual void ResetTemporaryMemory() = 0;
 
-    virtual const osi3::GroundTruth& GetOsiGroundTruth() const = 0;
+    virtual const osi3::GroundTruth &GetOsiGroundTruth() const = 0;
 
     //!Returns a map of all Roads with their OSI Id
-    virtual const std::unordered_map<std::string, Road*>& GetRoads() const = 0;
+    virtual const std::unordered_map<std::string, Road *> &GetRoads() const = 0;
 
     //!Creates a new MovingObject linked to an AgentAdapter and returns it
     //!
@@ -133,12 +137,12 @@ public:
     //!
     //! \param Id            Unique ID
     //! \param linkedObject  Object of type TrafficObjectAdapter which will be linked to new StationaryObject
-    virtual Interfaces::StationaryObject& AddStationaryObject(const Id id, void* linkedObject) = 0;
+    virtual Interfaces::StationaryObject &AddStationaryObject(const Id id, void *linkedObject) = 0;
 
     //!Creates a new TrafficSign and returns it
     //! \param Id            Unique ID
     //! \param odId          OpenDRIVE Id
-    virtual Interfaces::TrafficSign& AddTrafficSign(const Id id, const std::string odId) = 0;
+    virtual Interfaces::TrafficSign &AddTrafficSign(const Id id, const std::string odId) = 0;
 
     //!Creates a new TrafficLight and returns it
     //! \param Id            Unique ID
@@ -149,19 +153,19 @@ public:
 
     //!Creates a new RoadMarking and returns it
     //! \param Id            Unique ID
-    virtual Interfaces::RoadMarking& AddRoadMarking(const Id id) = 0;
+    virtual Interfaces::RoadMarking &AddRoadMarking(const Id id) = 0;
 
     //! Adds a traffic sign to the assigned signs of lane
     //!
     //! \param laneId       OSI Id of the lane
     //! \param trafficSign  traffic sign to assign
-    virtual void AssignTrafficSignToLane(OWL::Id laneId, Interfaces::TrafficSign& trafficSign) = 0;
+    virtual void AssignTrafficSignToLane(OWL::Id laneId, Interfaces::TrafficSign &trafficSign) = 0;
 
     //! Adds a road marking to the assigned road markings of lane
     //!
     //! \param laneId       OSI Id of the lane
     //! \param roadMarking  roadMarking to assign
-    virtual void AssignRoadMarkingToLane(OWL::Id laneId, Interfaces::RoadMarking& roadMarking) = 0;
+    virtual void AssignRoadMarkingToLane(OWL::Id laneId, Interfaces::RoadMarking &roadMarking) = 0;
 
     //! Adds a traffic light to the assigned traffic lights of lane
     //!
@@ -173,13 +177,13 @@ public:
     virtual void RemoveMovingObjectById(Id id) = 0; // change Id to MovingObject
 
     //!Returns the mapping of OpenDrive Ids to OSI Ids for trafficSigns
-    virtual const std::unordered_map<std::string, Id>& GetTrafficSignIdMapping() const = 0;
+    virtual const std::unordered_map<std::string, Id> &GetTrafficSignIdMapping() const = 0;
 
     //!Return the OWL type of a signal of OpenDrive or type Unknown if there is no signal with this Id
     virtual SignalType GetSignalType(Id id) const = 0;
 
     //!Returns an invalid lane
-    virtual const Implementation::InvalidLane& GetInvalidLane() const = 0;
+    virtual const Implementation::InvalidLane &GetInvalidLane() const = 0;
 
     //!Returns a map of all lanes with their OSI Id
     virtual const IdMapping<Lane>& GetLanes() const = 0;
@@ -191,7 +195,7 @@ public:
     virtual const LaneBoundary& GetLaneBoundary(Id id) const = 0;
 
     //!Returns a map of all junctions with their OSI Id
-    virtual const std::map<std::string, Junction*>& GetJunctions() const = 0;
+    virtual const std::map<std::string, Junction *> &GetJunctions() const = 0;
 
     //!Returns the traffic sign with given OSI Id
     virtual TrafficSign& GetTrafficSign(Id id) = 0;
@@ -200,24 +204,24 @@ public:
     virtual TrafficLight& GetTrafficLight(Id id) = 0;
     
     //!Returns the stationary object with given Id
-    virtual const StationaryObject& GetStationaryObject(Id id) const = 0;
+    virtual const StationaryObject &GetStationaryObject(Id id) const = 0;
 
     //!Returns the moving object with given Id
-    virtual const MovingObject& GetMovingObject(Id id) const = 0;
+    virtual const MovingObject &GetMovingObject(Id id) const = 0;
 
     //! Sets the road graph as imported from OpenDrive
     //!
     //! \param roadGraph        graph representation of road network
     //! \param vertexMapping    mapping from roads (with direction) to the vertices of the roadGraph
-    virtual void SetRoadGraph (const RoadGraph&& roadGraph, const RoadGraphVertexMapping&& vertexMapping) = 0;
+    virtual void SetRoadGraph(const RoadGraph &&roadGraph, const RoadGraphVertexMapping &&vertexMapping) = 0;
 
     virtual void SetTurningRates(const TurningRates& turningRates) = 0;
 
     //! Returns the graph representation of the road network
-    virtual const RoadGraph& GetRoadGraph() const = 0;
+    virtual const RoadGraph &GetRoadGraph() const = 0;
 
     //! Returns the mapping from roads (with direction) to the vertices of the roadGraph
-    virtual const RoadGraphVertexMapping& GetRoadGraphVertexMapping() const = 0;
+    virtual const RoadGraphVertexMapping &GetRoadGraphVertexMapping() const = 0;
 
     virtual const TurningRates& GetTurningRates() const = 0;
 
@@ -227,7 +231,7 @@ public:
     //! \param odSection       OpenDrive section to add lane to
     //! \param odLane          OpenDrive lane to add
     //! \param laneBoundaries  Osi Ids of the left lane boundaries of the new lane
-    virtual void AddLane(const Id id, RoadLaneSectionInterface& odSection, const RoadLaneInterface& odLane, const std::vector<Id> laneBoundaries) = 0;
+    virtual void AddLane(const Id id, RoadLaneSectionInterface &odSection, const RoadLaneInterface &odLane, const std::vector<Id> laneBoundaries) = 0;
 
     //! Creates a new lane boundary specified by the OpenDrive RoadMark
     //!
@@ -236,35 +240,35 @@ public:
     //! \param sectionStart     Start s coordinate of the section
     //! \param side             Specifies which side of a double line to add (or Single if not a double line)
     //! \return Osi id of the newly created laneBoundary
-    virtual Id AddLaneBoundary(const Id id, const RoadLaneRoadMark &odLaneRoadMark, double sectionStart, LaneMarkingSide side) = 0;
+    virtual Id AddLaneBoundary(const Id id, const RoadLaneRoadMark &odLaneRoadMark, units::length::meter_t sectionStart, LaneMarkingSide side) = 0;
 
     //! Sets the ids of the center lane boundaries for a section
     //!
     //! \param odSection        OpenDrive section for which to set the center line
     //! \param laneBoundaryIds  Osi ids of the center lane boundaries
-    virtual void SetCenterLaneBoundary(const RoadLaneSectionInterface& odSection, std::vector<Id> laneBoundaryIds) = 0;
+    virtual void SetCenterLaneBoundary(const RoadLaneSectionInterface &odSection, std::vector<Id> laneBoundaryIds) = 0;
 
     //!Creates a new section with parameters specified by the OpenDrive section
     //!
     //! \param odRoad    OpenDrive road to add section to
     //! \param odSection OpenDrive section to add
-    virtual void AddSection(const RoadInterface& odRoad, const RoadLaneSectionInterface& odSection) = 0;
+    virtual void AddSection(const RoadInterface &odRoad, const RoadLaneSectionInterface &odSection) = 0;
 
     //!Creates a new road with parameters specified by the OpenDrive road
     //!
     //! \param odRoad    OpenDrive road to add
-    virtual void AddRoad(const RoadInterface& odRoad) = 0;
+    virtual void AddRoad(const RoadInterface &odRoad) = 0;
 
     //!Creates a new junction with parameters specified by the OpenDrive junction
     //!
     //! \param odJunction    OpenDrive junction to add
-    virtual void AddJunction(const JunctionInterface* odJunction) = 0;
+    virtual void AddJunction(const JunctionInterface *odJunction) = 0;
 
     //!Adds a connection road (path) to a junction
-    virtual void AddJunctionConnection(const JunctionInterface* odJunction, const RoadInterface& odRoad) = 0;
+    virtual void AddJunctionConnection(const JunctionInterface *odJunction, const RoadInterface &odRoad) = 0;
 
     //!Adds a priority entry of to connecting roads to a junction
-    virtual void AddJunctionPriority(const JunctionInterface* odJunction, const std::string& high, const std::string& low) = 0;
+    virtual void AddJunctionPriority(const JunctionInterface *odJunction, const std::string &high, const std::string &low) = 0;
 
     //!Adds a new lane geometry joint to the end of the current list of joints of the specified lane
     //! and a new geometry element and the boundary points of all affected right lane boundaries
@@ -275,13 +279,13 @@ public:
     //! @param sOffset      s offset of the new joint
     //! @param curvature    curvature of the lane at sOffset
     //! @param heading      heading of the lane at sOffset
-    virtual void AddLaneGeometryPoint(const RoadLaneInterface& odLane,
-                                      const Common::Vector2d& pointLeft,
-                                      const Common::Vector2d& pointCenter,
-                                      const Common::Vector2d& pointRight,
-                                      const double sOffset,
-                                      const double curvature,
-                                      const double heading) = 0;
+    virtual void AddLaneGeometryPoint(const RoadLaneInterface &odLane,
+                                      const Common::Vector2d<units::length::meter_t> &pointLeft,
+                                      const Common::Vector2d<units::length::meter_t> &pointCenter,
+                                      const Common::Vector2d<units::length::meter_t> &pointRight,
+                                      const units::length::meter_t sOffset,
+                                      const units::curvature::inverse_meter_t curvature,
+                                      const units::angle::radian_t heading) = 0;
 
     //! Adds a new boundary point to the center line of the specified section
     //!
@@ -289,81 +293,46 @@ public:
     //! \param pointCenter  point to add
     //! \param sOffset      s offset of the new point
     //! \param heading      heading of the road at sOffset
-    virtual void AddCenterLinePoint(const RoadLaneSectionInterface& odSection,
-                                    const Common::Vector2d& pointCenter,
-                                    const double sOffset,
-                                    double heading) = 0;
+    virtual void AddCenterLinePoint(const RoadLaneSectionInterface &odSection,
+                                    const Common::Vector2d<units::length::meter_t> &pointCenter,
+                                    const units::length::meter_t sOffset,
+                                    units::angle::radian_t heading) = 0;
 
     //!Sets successorOdLane as successor of odLane
-    virtual void AddLaneSuccessor(/* const */ RoadLaneInterface& odLane,
-            /* const */ RoadLaneInterface& successorOdLane) = 0;
+    virtual void AddLaneSuccessor(/* const */ RoadLaneInterface &odLane,
+                                  /* const */ RoadLaneInterface &successorOdLane) = 0;
 
     //!Sets predecessorOdLane as predecessor of odLane
-    virtual void AddLanePredecessor(/* const */ RoadLaneInterface& odLane,
-            /* const */ RoadLaneInterface& predecessorOdLane) = 0;
+    virtual void AddLanePredecessor(/* const */ RoadLaneInterface &odLane,
+                                    /* const */ RoadLaneInterface &predecessorOdLane) = 0;
 
     //!Sets successorRoad as successor of road in OSI
-    virtual void SetRoadSuccessor(const RoadInterface& road,  const RoadInterface& successorRoad) = 0;
+    virtual void SetRoadSuccessor(const RoadInterface &road, const RoadInterface &successorRoad) = 0;
 
     //!Sets predecessorRoad as predecessor of road in OSI
-    virtual void SetRoadPredecessor(const RoadInterface& road,  const RoadInterface& predecessorRoad) = 0;
+    virtual void SetRoadPredecessor(const RoadInterface &road, const RoadInterface &predecessorRoad) = 0;
 
     //!Sets successorSection as successor of section in OSI
-    virtual void SetSectionSuccessor(const RoadLaneSectionInterface& section,  const RoadLaneSectionInterface& successorSection) = 0;
+    virtual void SetSectionSuccessor(const RoadLaneSectionInterface &section, const RoadLaneSectionInterface &successorSection) = 0;
 
     //!Sets predecessorSection as predecessor of section in OSI
-    virtual void SetSectionPredecessor(const RoadLaneSectionInterface& section,  const RoadLaneSectionInterface& predecessorSection) = 0;
+    virtual void SetSectionPredecessor(const RoadLaneSectionInterface &section, const RoadLaneSectionInterface &predecessorSection) = 0;
 
     //!Sets a junction as the successor of a road
-    virtual void SetRoadSuccessorJunction(const RoadInterface& road,  const JunctionInterface* successorJunction) = 0;
+    virtual void SetRoadSuccessorJunction(const RoadInterface &road, const JunctionInterface *successorJunction) = 0;
 
     //!Sets a junction as the predecessor of a road
-    virtual void SetRoadPredecessorJunction(const RoadInterface& road,  const JunctionInterface* predecessorJunction) = 0;
+    virtual void SetRoadPredecessorJunction(const RoadInterface &road, const JunctionInterface *predecessorJunction) = 0;
 
     //!Currently not implemented
-    virtual void ConnectLanes(/*const*/ RoadLaneSectionInterface& firstOdSection,
-                                        /*const*/ RoadLaneSectionInterface& secondOdSection,
-                                        const std::map<int, int>& lanePairs,
-                                        bool isPrev) = 0;
-
-
-    static constexpr double THRESHOLD_ILLUMINATION_LEVEL1 = 0.01;       //!< Upper threshold for osi3::EnvironmentalConditions::AmbientIllumination::Level1
-    static constexpr double THRESHOLD_ILLUMINATION_LEVEL2 = 1.0;        //!< Upper threshold for osi3::EnvironmentalConditions::AmbientIllumination::Level2
-    static constexpr double THRESHOLD_ILLUMINATION_LEVEL3 = 3.0;        //!< Upper threshold for osi3::EnvironmentalConditions::AmbientIllumination::Level3
-    static constexpr double THRESHOLD_ILLUMINATION_LEVEL4 = 10.0;       //!< Upper threshold for osi3::EnvironmentalConditions::AmbientIllumination::Level4
-    static constexpr double THRESHOLD_ILLUMINATION_LEVEL5 = 20.0;       //!< Upper threshold for osi3::EnvironmentalConditions::AmbientIllumination::Level5
-    static constexpr double THRESHOLD_ILLUMINATION_LEVEL6 = 400.0;      //!< Upper threshold for osi3::EnvironmentalConditions::AmbientIllumination::Level6
-    static constexpr double THRESHOLD_ILLUMINATION_LEVEL7 = 1000.0;     //!< Upper threshold for osi3::EnvironmentalConditions::AmbientIllumination::Level7
-    static constexpr double THRESHOLD_ILLUMINATION_LEVEL8 = 10000.0;    //!< Upper threshold for osi3::EnvironmentalConditions::AmbientIllumination::Level8
-    static constexpr double THRESHOLD_FOG_DENSE = 50.0;         //!< Upper threshold for osi3::EnvironmentalConditions::Fog::Dense
-    static constexpr double THRESHOLD_FOG_THICK = 200.0;        //!< Upper threshold for osi3::EnvironmentalConditions::Fog::Thick
-    static constexpr double THRESHOLD_FOG_LIGHT = 1000.0;       //!< Upper threshold for osi3::EnvironmentalConditions::Fog::Light
-    static constexpr double THRESHOLD_FOG_MIST = 2000.0;        //!< Upper threshold for osi3::EnvironmentalConditions::Fog::Mist
-    static constexpr double THRESHOLD_FOG_POOR = 4000.0;        //!< Upper threshold for osi3::EnvironmentalConditions::Fog::Poor_Visibility
-    static constexpr double THRESHOLD_FOG_MODERATE = 10000.0;   //!< Upper threshold for osi3::EnvironmentalConditions::Fog::Moderate_Visibility
-    static constexpr double THRESHOLD_FOG_GOOD = 40000.0;       //!< Upper threshold for osi3::EnvironmentalConditions::Fog::Good_Visibility
-
-    //! \brief Translates an openScenario environment to OSI3
-    //!
-    //! The following thresholds are used for a mapping of illumination level:
-    //! - \see THRESHOLD_ILLUMINATION_LEVEL1
-    //! - \see THRESHOLD_ILLUMINATION_LEVEL2
-    //! - \see THRESHOLD_ILLUMINATION_LEVEL3
-    //! - \see THRESHOLD_ILLUMINATION_LEVEL4
-    //! - \see THRESHOLD_ILLUMINATION_LEVEL5
-    //! - \see THRESHOLD_ILLUMINATION_LEVEL6
-    //! - \see THRESHOLD_ILLUMINATION_LEVEL7
-    //! - \see THRESHOLD_ILLUMINATION_LEVEL8
-    //!
-    //! The following thresholds are used for a mapping of fog:
-    //! - \see THRESHOLD_FOG_DENSE
-    //! - \see THRESHOLD_FOG_THICK
-    //! - \see THRESHOLD_FOG_LIGHT
-    //! - \see THRESHOLD_FOG_MIST
-    //! - \see THRESHOLD_FOG_POOR
-    //! - \see THRESHOLD_FOG_MODERATE
-    //! - \see THRESHOLD_FOG_GOOD
-    virtual void SetEnvironment(const openScenario::EnvironmentAction& environment) = 0;
+    virtual void ConnectLanes(/*const*/ RoadLaneSectionInterface &firstOdSection,
+                              /*const*/ RoadLaneSectionInterface &secondOdSection,
+                              const std::map<int, int> &lanePairs,
+                              bool isPrev) = 0;
+
+
+    //!Translates an openScenario environment to OSI3
+    virtual void SetEnvironment(const mantle_api::Weather &weather) = 0;
 
     //!Resets the world for new run; deletes all moving objects
     virtual void Reset() = 0;
@@ -387,29 +356,28 @@ public:
     virtual int GetAgentId(const OWL::Id owlId) const = 0;
 };
 
-}
+} // namespace Interfaces
 
 class WorldData : public Interfaces::WorldData
 {
 public:
-
 #ifdef USE_PROTOBUF_ARENA
-    using GroundTruth_ptr = osi3::GroundTruth*;
+    using GroundTruth_ptr = osi3::GroundTruth *;
 #else
     using GroundTruth_ptr = std::unique_ptr<osi3::GroundTruth>;
 #endif
 
-    WorldData(const CallbackInterface* callbacks);
+    WorldData(const CallbackInterface *callbacks);
 
     ~WorldData() override;
 
     void Clear() override;
 
-    SensorView_ptr GetSensorView(osi3::SensorViewConfiguration& conf, int agentId) override;
+    SensorView_ptr GetSensorView(osi3::SensorViewConfiguration &conf, int agentId) override;
 
     void ResetTemporaryMemory() override;
 
-    const osi3::GroundTruth& GetOsiGroundTruth() const override;
+    const osi3::GroundTruth &GetOsiGroundTruth() const override;
 
     /*!
      * \brief Retrieves a filtered OSI GroundTruth
@@ -419,7 +387,7 @@ public:
      *
      * \return      A OSI GroundTruth filtered by the given SensorViewConfiguration
      */
-    GroundTruth_ptr GetFilteredGroundTruth(const osi3::SensorViewConfiguration& conf, const Interfaces::MovingObject& reference);
+    GroundTruth_ptr GetFilteredGroundTruth(const osi3::SensorViewConfiguration &conf, const Interfaces::MovingObject &reference);
 
     /*!
      * \brief Retrieves the TrafficSigns located in the given sector (geometric shape)
@@ -431,10 +399,10 @@ public:
      *
      * \return      Vector of TrafficSing pointers located in the given sector
      */
-    std::vector<const Interfaces::TrafficSign*> GetTrafficSignsInSector(const Primitive::AbsPosition& origin,
-                                                                        double radius,
-                                                                        double leftBoundaryAngle,
-                                                                        double rightBoundaryAngle);
+    std::vector<const Interfaces::TrafficSign *> GetTrafficSignsInSector(const mantle_api::Vec3<units::length::meter_t> &origin,
+                                                                         units::length::meter_t radius,
+                                                                         units::angle::radian_t leftBoundaryAngle,
+                                                                         units::angle::radian_t rightBoundaryAngle);
 
         /*!
          * \brief Retrieves TrafficLights located in the given sector (geometric shape)
@@ -446,10 +414,10 @@ public:
          *
          * \return      Vector of TrafficLight pointers located in the given sector
          */
-        std::vector<const Interfaces::TrafficLight*> GetTrafficLightsInSector(const Primitive::AbsPosition& origin,
-                                                                              double radius,
-                                                                              double leftBoundaryAngle,
-                                                                              double rightBoundaryAngle);
+         std::vector<const Interfaces::TrafficLight*> GetTrafficLightsInSector(const mantle_api::Vec3<units::length::meter_t> &origin,
+                                                                               units::length::meter_t radius,
+                                                                               units::angle::radian_t leftBoundaryAngle,
+                                                                               units::angle::radian_t rightBoundaryAngle);
 
     /*!
      * \brief Retrieves the RoadMarkings located in the given sector (geometric shape)
@@ -461,10 +429,10 @@ public:
      *
      * \return      Vector of RoadMarking pointers located in the given sector
      */
-    std::vector<const Interfaces::RoadMarking*> GetRoadMarkingsInSector(const Primitive::AbsPosition& origin,
-                                                                        double radius,
-                                                                        double leftBoundaryAngle,
-                                                                        double rightBoundaryAngle);
+    std::vector<const Interfaces::RoadMarking *> GetRoadMarkingsInSector(const mantle_api::Vec3<units::length::meter_t> &origin,
+                                                                         units::length::meter_t radius,
+                                                                         units::angle::radian_t leftBoundaryAngle,
+                                                                         units::angle::radian_t rightBoundaryAngle);
 
     /*!
      * \brief Retrieves the StationaryObjects located in the given sector (geometric shape)
@@ -476,10 +444,10 @@ public:
      *
      * \return      Vector of StationaryObject pointers located in the given sector
      */
-    std::vector<const Interfaces::StationaryObject*> GetStationaryObjectsInSector(const Primitive::AbsPosition& origin,
-                                                                                  double radius,
-                                                                                  double leftBoundaryAngle,
-                                                                                  double rightBoundaryAngle);
+    std::vector<const Interfaces::StationaryObject *> GetStationaryObjectsInSector(const mantle_api::Vec3<units::length::meter_t> &origin,
+                                                                                   units::length::meter_t radius,
+                                                                                   units::angle::radian_t leftBoundaryAngle,
+                                                                                   units::angle::radian_t rightBoundaryAngle);
 
     /*!
      * \brief Retrieves the MovingObjects located in the given sector (geometric shape)
@@ -491,10 +459,10 @@ public:
      *
      * \return      Vector of MovingObject pointers located in the given sector
      */
-    std::vector<const Interfaces::MovingObject*> GetMovingObjectsInSector(const Primitive::AbsPosition& origin,
-                                                                          double radius,
-                                                                          double leftBoundaryAngle,
-                                                                          double rightBoundaryAngle);
+    std::vector<const Interfaces::MovingObject *> GetMovingObjectsInSector(const mantle_api::Vec3<units::length::meter_t> &origin,
+                                                                           units::length::meter_t radius,
+                                                                           units::angle::radian_t leftBoundaryAngle,
+                                                                           units::angle::radian_t rightBoundaryAngle);
 
     /*!
      * \brief Add the information about the host vehicle to the given SensorView
@@ -502,105 +470,107 @@ public:
      * \param host_id       id of the host vehicle
      * \param sensorView    SensorView to modify
      */
-    void AddHostVehicleToSensorView(Id host_id, osi3::SensorView& sensorView);
+    void AddHostVehicleToSensorView(Id host_id, osi3::SensorView &sensorView);
 
     OWL::Id GetOwlId(int agentId) const override;
     int GetAgentId(const OWL::Id owlId) const override;
 
-    void SetRoadGraph (const RoadGraph&& roadGraph, const RoadGraphVertexMapping&& vertexMapping) override;
+    void SetRoadGraph(const RoadGraph &&roadGraph, const RoadGraphVertexMapping &&vertexMapping) override;
     void SetTurningRates (const TurningRates& turningRates) override;
-    void AddLane(const Id id, RoadLaneSectionInterface &odSection, const RoadLaneInterface& odLane, const std::vector<Id> laneBoundaries) override;
-    Id AddLaneBoundary(const Id id, const RoadLaneRoadMark &odLaneRoadMark, double sectionStart, LaneMarkingSide side) override;
-    virtual void SetCenterLaneBoundary(const RoadLaneSectionInterface& odSection, std::vector<Id> laneBoundaryIds) override;
-    void AddSection(const RoadInterface& odRoad, const RoadLaneSectionInterface& odSection) override;
-    void AddRoad(const RoadInterface& odRoad) override;
-    void AddJunction(const JunctionInterface* odJunction) override;
-    void AddJunctionConnection(const JunctionInterface* odJunction, const RoadInterface& odRoad) override;
-    void AddJunctionPriority(const JunctionInterface* odJunction,  const std::string& high, const std::string& low) override;
-
-    void AddLaneSuccessor(/* const */ RoadLaneInterface& odLane,
-                                      /* const */ RoadLaneInterface& successorOdLane) override;
-    void AddLanePredecessor(/* const */ RoadLaneInterface& odLane,
-                                        /* const */ RoadLaneInterface& predecessorOdLane) override;
-
-
-    void ConnectLanes(/*const*/ RoadLaneSectionInterface& firstOdSection,
-                                /*const*/ RoadLaneSectionInterface& secondOdSection,
-                                const std::map<int, int>& lanePairs,
-                                bool isPrev) override;
-    void SetRoadSuccessor(const RoadInterface& road,  const RoadInterface& successorRoad) override;
-    void SetRoadPredecessor(const RoadInterface& road,  const RoadInterface& predecessorRoad) override;
-    void SetRoadSuccessorJunction(const RoadInterface& road,  const JunctionInterface* successorJunction) override;
-    void SetRoadPredecessorJunction(const RoadInterface& road,  const JunctionInterface* predecessorJunction) override;
-    void SetSectionSuccessor(const RoadLaneSectionInterface& section,  const RoadLaneSectionInterface& successorSection) override;
-    void SetSectionPredecessor(const RoadLaneSectionInterface& section,  const RoadLaneSectionInterface& predecessorSection) override;
-
-    Interfaces::MovingObject& AddMovingObject(const Id id) override;
-    Interfaces::StationaryObject& AddStationaryObject(const Id id, void* linkedObject) override;
-    Interfaces::TrafficSign& AddTrafficSign(const Id id, const std::string odId) override;
+    void AddLane(const Id id, RoadLaneSectionInterface &odSection, const RoadLaneInterface &odLane, const std::vector<Id> laneBoundaries) override;
+    Id AddLaneBoundary(const Id id, const RoadLaneRoadMark &odLaneRoadMark, units::length::meter_t sectionStart, LaneMarkingSide side) override;
+    virtual void SetCenterLaneBoundary(const RoadLaneSectionInterface &odSection, std::vector<Id> laneBoundaryIds) override;
+    void AddSection(const RoadInterface &odRoad, const RoadLaneSectionInterface &odSection) override;
+    void AddRoad(const RoadInterface &odRoad) override;
+    void AddJunction(const JunctionInterface *odJunction) override;
+    void AddJunctionConnection(const JunctionInterface *odJunction, const RoadInterface &odRoad) override;
+    void AddJunctionPriority(const JunctionInterface *odJunction, const std::string &high, const std::string &low) override;
+
+    void AddLaneSuccessor(/* const */ RoadLaneInterface &odLane,
+                          /* const */ RoadLaneInterface &successorOdLane) override;
+    void AddLanePredecessor(/* const */ RoadLaneInterface &odLane,
+                            /* const */ RoadLaneInterface &predecessorOdLane) override;
+
+    void ConnectLanes(/*const*/ RoadLaneSectionInterface &firstOdSection,
+                      /*const*/ RoadLaneSectionInterface &secondOdSection,
+                      const std::map<int, int> &lanePairs,
+                      bool isPrev) override;
+    void SetRoadSuccessor(const RoadInterface &road, const RoadInterface &successorRoad) override;
+    void SetRoadPredecessor(const RoadInterface &road, const RoadInterface &predecessorRoad) override;
+    void SetRoadSuccessorJunction(const RoadInterface &road, const JunctionInterface *successorJunction) override;
+    void SetRoadPredecessorJunction(const RoadInterface &road, const JunctionInterface *predecessorJunction) override;
+    void SetSectionSuccessor(const RoadLaneSectionInterface &section, const RoadLaneSectionInterface &successorSection) override;
+    void SetSectionPredecessor(const RoadLaneSectionInterface &section, const RoadLaneSectionInterface &predecessorSection) override;
+
+    Interfaces::MovingObject &AddMovingObject(const Id id) override;
+    Interfaces::StationaryObject &AddStationaryObject(const Id id, void *linkedObject) override;
+    Interfaces::TrafficSign &AddTrafficSign(const Id id, const std::string odId) override;
     Interfaces::TrafficLight& AddTrafficLight(const std::vector<Id> ids, const std::string odId,const std::string& type) override;
-    Interfaces::RoadMarking& AddRoadMarking(const Id id) override;
+    Interfaces::RoadMarking &AddRoadMarking(const Id id) override;
 
     void AssignTrafficSignToLane(OWL::Id laneId, Interfaces::TrafficSign &trafficSign) override;
-    void AssignRoadMarkingToLane(OWL::Id laneId, Interfaces::RoadMarking& roadMarking) override;
+    void AssignRoadMarkingToLane(OWL::Id laneId, Interfaces::RoadMarking &roadMarking) override;
     void AssignTrafficLightToLane(OWL::Id laneId, Interfaces::TrafficLight &trafficLight) override;
 
     void RemoveMovingObjectById(Id id) override;
 
-    void AddLaneGeometryPoint(const RoadLaneInterface& odLane,
-                              const Common::Vector2d& pointLeft,
-                              const Common::Vector2d& pointCenter,
-                              const Common::Vector2d& pointRight,
-                              const double sOffset,
-                              const double curvature,
-                              const double heading) override;
+    void AddLaneGeometryPoint(const RoadLaneInterface &odLane,
+                              const Common::Vector2d<units::length::meter_t> &pointLeft,
+                              const Common::Vector2d<units::length::meter_t> &pointCenter,
+                              const Common::Vector2d<units::length::meter_t> &pointRight,
+                              const units::length::meter_t sOffset,
+                              const units::curvature::inverse_meter_t curvature,
+                              const units::angle::radian_t heading) override;
 
-    virtual void AddCenterLinePoint(const RoadLaneSectionInterface& odSection,
-                                    const Common::Vector2d& pointCenter,
-                                    const double sOffset,
-                                    double heading) override;
+    virtual void AddCenterLinePoint(const RoadLaneSectionInterface &odSection,
+                                    const Common::Vector2d<units::length::meter_t> &pointCenter,
+                                    const units::length::meter_t sOffset,
+                                    units::angle::radian_t heading) override;
 
     const IdMapping<StationaryObject>& GetStationaryObjects() const;
 
-    const Interfaces::StationaryObject& GetStationaryObject(Id id) const override;
-    const Interfaces::MovingObject& GetMovingObject(Id id) const override;
+    const Interfaces::StationaryObject &GetStationaryObject(Id id) const override;
+    const Interfaces::MovingObject &GetMovingObject(Id id) const override;
 
-    const RoadGraph& GetRoadGraph() const override;
-    const RoadGraphVertexMapping& GetRoadGraphVertexMapping() const override;
+    const RoadGraph &GetRoadGraph() const override;
+    const RoadGraphVertexMapping &GetRoadGraphVertexMapping() const override;
     const IdMapping<Lane>& GetLanes() const override;
     const Lane& GetLane(Id id) const override;
     const LaneBoundary& GetLaneBoundary(Id id) const override;
     const TurningRates& GetTurningRates() const override;
-    const std::unordered_map<std::string, Road*>& GetRoads() const override;
-    const std::map<std::string, Junction*>& GetJunctions() const override;
+    const std::unordered_map<std::string, Road *> &GetRoads() const override;
+    const std::map<std::string, Junction *> &GetJunctions() const override;
     Interfaces::TrafficSign& GetTrafficSign(Id id) override;
     Interfaces::TrafficLight& GetTrafficLight(Id id) override;
-    const Implementation::InvalidLane& GetInvalidLane() const override {return invalidLane;}
+    const Implementation::InvalidLane &GetInvalidLane() const override
+    {
+        return invalidLane;
+    }
 
-    const std::unordered_map<std::string, Id>& GetTrafficSignIdMapping() const override
+    const std::unordered_map<std::string, Id> &GetTrafficSignIdMapping() const override
     {
         return trafficSignIdMapping;
     }
 
     SignalType GetSignalType(Id id) const override;
 
-    void SetEnvironment(const openScenario::EnvironmentAction& environment) override;
+    void SetEnvironment(const mantle_api::Weather &weather) override;
 
 
-    static bool IsCloseToSectorBoundaries(double distanceToCenter,
-                                          double angle,
-                                          double leftBoundaryAngle,
-                                          double rightBoundaryAngle,
-                                          double maxDistanceToBoundary)
+    static bool IsCloseToSectorBoundaries(units::length::meter_t distanceToCenter,
+                                          units::angle::radian_t angle,
+                                          units::angle::radian_t leftBoundaryAngle,
+                                          units::angle::radian_t rightBoundaryAngle,
+                                          units::length::meter_t maxDistanceToBoundary)
     {
-        const double rightAngleDifference = angle - rightBoundaryAngle;
-        const double leftAngleDifference = angle - leftBoundaryAngle;
+        const auto rightAngleDifference = angle - rightBoundaryAngle;
+        const auto leftAngleDifference = angle - leftBoundaryAngle;
 
         //For angles > 90° the center of the sector is the closest point
-        const double distanceToRightBoundary = std::abs(rightAngleDifference) >= M_2_PI ? distanceToCenter
-                                                                                        : distanceToCenter * std::sin(rightAngleDifference);
-        const double distanceToLeftBoundary = std::abs(leftAngleDifference) >= M_2_PI ? distanceToCenter
-                                                                                      : distanceToCenter * std::sin(leftAngleDifference);
+        const auto distanceToRightBoundary = units::math::abs(rightAngleDifference) >= 1_rad * M_2_PI ? distanceToCenter
+                                                                                                      : distanceToCenter * units::math::sin(rightAngleDifference);
+        const auto distanceToLeftBoundary = units::math::abs(leftAngleDifference) >= 1_rad * M_2_PI ? distanceToCenter
+                                                                                                    : distanceToCenter * units::math::sin(leftAngleDifference);
         return distanceToRightBoundary <= maxDistanceToBoundary || distanceToLeftBoundary <= maxDistanceToBoundary;
     }
 
@@ -615,29 +585,30 @@ public:
      *
      * \return      Vector of objects inside the sector-shape
      */
-    template<typename T>
-    std::vector<const T*> ApplySectorFilter(const std::vector<T*>& objects,
-                                            const Primitive::AbsPosition& origin,
-                                            double radius,
-                                            double leftBoundaryAngle,
-                                            double rightBoundaryAngle)
+    template <typename T>
+    std::vector<const T *> ApplySectorFilter(const std::vector<T *> &objects,
+                                             const mantle_api::Vec3<units::length::meter_t> &origin,
+                                             units::length::meter_t radius,
+                                             units::angle::radian_t leftBoundaryAngle,
+                                             units::angle::radian_t rightBoundaryAngle)
     {
-        std::vector<const T*> filteredObjects;
+        std::vector<const T *> filteredObjects;
+
         constexpr double EPS = 1e-9;
-        bool anglesDiffer = std::abs(leftBoundaryAngle - rightBoundaryAngle) > EPS;
+        bool anglesEqual = mantle_api::IsEqual(leftBoundaryAngle, rightBoundaryAngle, EPS);
 
-        if (!anglesDiffer || radius <= 0.0)
+        if (anglesEqual || radius <= 0.0_m)
         {
             return filteredObjects;
         }
         bool wrappedAngle = leftBoundaryAngle < rightBoundaryAngle;
-        anglesDiffer = std::abs(leftBoundaryAngle - rightBoundaryAngle) > EPS;
+        anglesEqual = mantle_api::IsEqual(leftBoundaryAngle, rightBoundaryAngle, EPS);
 
-        for (const auto& object : objects)
+        for (const auto &object : objects)
         {
-            const auto& absPosition = object->GetReferencePointPosition();
+            const auto &absPosition = object->GetReferencePointPosition();
             const auto relativePosition = absPosition - origin;
-            const auto distance = relativePosition.distance();
+            const auto distance = relativePosition.Length();
             const auto dimension = object->GetDimension();
             const auto diagonal = openpass::hypot(dimension.width, dimension.length);
 
@@ -646,9 +617,9 @@ public:
                 continue;
             }
 
-            if (anglesDiffer && distance > 0.0)
+            if (!anglesEqual && distance > 0.0_m)
             {
-                double direction = std::atan2(relativePosition.y, relativePosition.x);
+                units::angle::radian_t direction = units::math::atan2(relativePosition.y, relativePosition.x);
 
                 if (wrappedAngle)
                 {
@@ -689,9 +660,9 @@ protected:
     //! @param[in]     message     Message to log
     //-----------------------------------------------------------------------------
     void Log(CbkLogLevel logLevel,
-             const char* file,
+             const char *file,
              int line,
-             const std::string& message)
+             const std::string &message)
     {
         if (callbacks)
         {
@@ -703,9 +674,9 @@ protected:
     }
 
 private:
-    const CallbackInterface* callbacks;
+    const CallbackInterface *callbacks;
     uint64_t next_free_uid{0};
-    std::unordered_map<std::string, Id>         trafficSignIdMapping;
+    std::unordered_map<std::string, Id> trafficSignIdMapping;
 
     IdMapping<Lane>             lanes;
     IdMapping<LaneBoundary>     laneBoundaries;
@@ -715,14 +686,14 @@ private:
     IdMapping<Interfaces::TrafficLight>     trafficLights;
     IdMapping<Interfaces::RoadMarking>      roadMarkings;
 
-    std::unordered_map<std::string, Road*> roadsById;
-    std::map<std::string, Junction*> junctionsById;
+    std::unordered_map<std::string, Road *> roadsById;
+    std::map<std::string, Junction *> junctionsById;
 
     std::unordered_map<const RoadInterface*, std::unique_ptr<Road>>                 roads;
     std::unordered_map<const RoadLaneSectionInterface*, std::unique_ptr<Section>>   sections;
     std::unordered_map<const JunctionInterface*, std::unique_ptr<Junction>>         junctions;
 
-    std::unordered_map<const RoadLaneInterface*, osi3::Lane*> osiLanes;
+    std::unordered_map<const RoadLaneInterface *, osi3::Lane *> osiLanes;
 
     RoadGraph roadGraph;
     RoadGraphVertexMapping vertexMapping;
@@ -737,4 +708,4 @@ private:
     const Implementation::InvalidLane invalidLane;
     };
 
-}
+} // namespace OWL
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldDataQuery.cpp b/sim/src/core/opSimulation/modules/World_OSI/WorldDataQuery.cpp
index 54f9a148914e75347846988a2359563730d04e2d..c0580182fb7c73e6cc227f2bdf36c9e8d5488cbd 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldDataQuery.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldDataQuery.cpp
@@ -10,11 +10,11 @@
  ********************************************************************************/
 #include "WorldDataQuery.h"
 
-static const OWL::Interfaces::Lane* GetLaneOnRoad(const OWL::Interfaces::Road* road, const std::vector<OWL::Id> laneIds)
+static const OWL::Interfaces::Lane *GetLaneOnRoad(const OWL::Interfaces::Road *road, const std::vector<OWL::Id> laneIds)
 {
-    for (const auto& section : road->GetSections())
+    for (const auto &section : road->GetSections())
     {
-        for (const auto& lane : section->GetLanes())
+        for (const auto &lane : section->GetLanes())
         {
             if (std::count(laneIds.cbegin(), laneIds.cend(), lane->GetId()) > 0)
             {
@@ -25,8 +25,10 @@ static const OWL::Interfaces::Lane* GetLaneOnRoad(const OWL::Interfaces::Road* r
     return nullptr;
 }
 
-WorldDataQuery::WorldDataQuery(const OWL::Interfaces::WorldData &worldData) : worldData{worldData}
-{}
+WorldDataQuery::WorldDataQuery(const OWL::Interfaces::WorldData &worldData) :
+    worldData{worldData}
+{
+}
 
 RouteQueryResult<std::optional<GlobalRoadPosition>> WorldDataQuery::ResolveRelativePoint(const RoadMultiStream &roadStream, ObjectPointRelative relativePoint, const RoadIntervals &touchedRoads) const
 {
@@ -72,11 +74,11 @@ RouteQueryResult<std::optional<GlobalRoadPosition>> WorldDataQuery::ResolveRelat
     worldData);
 }
 
-template<typename T>
+template <typename T>
 Stream<T> Stream<T>::Reverse() const
 {
     std::vector<StreamInfo<T>> newStream;
-    double currentS = 0.0;
+    units::length::meter_t currentS{0.0};
 
     for (auto oldStreamInfo = elements.crbegin(); oldStreamInfo != elements.crend(); ++oldStreamInfo)
     {
@@ -85,7 +87,7 @@ Stream<T> Stream<T>::Reverse() const
         streamInfo.element = oldStreamInfo->element;
 
         auto elementLength = streamInfo.element->GetLength();
-        streamInfo.sOffset = currentS + (streamInfo.inStreamDirection ? 0 : elementLength);
+        streamInfo.sOffset = currentS + (streamInfo.inStreamDirection ? 0_m : elementLength);
         newStream.push_back(streamInfo);
 
         currentS += elementLength;
@@ -93,66 +95,63 @@ Stream<T> Stream<T>::Reverse() const
     return Stream<T>{std::move(newStream)};
 }
 
-template<typename T>
-double Stream<T>::GetPositionByElementAndS(const T& element, double sCoordinate) const
+template <typename T>
+units::length::meter_t Stream<T>::GetPositionByElementAndS(const T &element, units::length::meter_t sCoordinate) const
 {
-    for (const auto& elemOnStream : elements)
+    for (const auto &elemOnStream : elements)
     {
         if (elemOnStream.element == &element)
         {
             return elemOnStream.GetStreamPosition(sCoordinate - element.GetDistance(OWL::MeasurementPoint::RoadStart));
         }
     }
-    return -1.0;
+    return -1.0_m;
 }
 
-template<typename T>
-std::pair<double, const T*> Stream<T>::GetElementAndSByPosition(double position) const
+template <typename T>
+std::pair<units::length::meter_t, const T *> Stream<T>::GetElementAndSByPosition(units::length::meter_t position) const
 {
-    for (const auto& element : elements)
+    for (const auto &element : elements)
     {
         if (element.StartS() <= position && element.EndS() >= position)
         {
-            double relativeDistance = element.inStreamDirection ? position - element.sOffset : element.sOffset - position;
+            const auto relativeDistance = element.inStreamDirection ? position - element.sOffset : element.sOffset - position;
             return std::make_pair(relativeDistance, &element());
         }
     }
-    return std::make_pair(0.0, nullptr);
+    return std::make_pair(0.0_m, nullptr);
 }
 
-template<typename T>
-bool Stream<T>::Contains(const T& element) const
+template <typename T>
+bool Stream<T>::Contains(const T &element) const
 {
     return std::find_if(elements.cbegin(), elements.cend(),
-                        [&element](auto& streamInfo)
-                            {return streamInfo.element == &element;})
-            != elements.cend();
+                        [&element](auto &streamInfo) { return streamInfo.element == &element; }) != elements.cend();
 }
 
-RouteQueryResult<double> WorldDataQuery::GetDistanceToEndOfLane(const LaneMultiStream& laneStream, double initialSearchPosition, double maxSearchLength, const std::vector<LaneType>& requestedLaneTypes) const
+RouteQueryResult<units::length::meter_t> WorldDataQuery::GetDistanceToEndOfLane(const LaneMultiStream &laneStream, units::length::meter_t initialSearchPosition, units::length::meter_t maxSearchLength, const std::vector<LaneType> &requestedLaneTypes) const
 {
-    return laneStream.Traverse<double, bool>(LaneMultiStream::TraversedFunction<double, bool>{[&](const auto& streamElement, const auto& previousDistance, const auto& laneTypeContinuous)
-    {
-        if (!laneTypeContinuous || std::find(requestedLaneTypes.cbegin(), requestedLaneTypes.cend(), streamElement().GetLaneType()) == requestedLaneTypes.cend())
-        {
-            return std::make_tuple<double, bool>(double{previousDistance}, false);
-        }
-        else if (streamElement.EndS() > initialSearchPosition +  maxSearchLength)
-        {
-            return std::make_tuple<double, bool>(std::numeric_limits<double>::infinity(), true);
-        }
-        else
-        {
-            return std::make_tuple<double, bool>(streamElement.EndS() - initialSearchPosition, true);
-        }
-    }},
-    0.0, true,
-    worldData);
+    return laneStream.Traverse<units::length::meter_t, bool>(LaneMultiStream::TraversedFunction<units::length::meter_t, bool>{[&](const auto &streamElement, const auto &previousDistance, const auto &laneTypeContinuous) {
+                                                                 if (!laneTypeContinuous || std::find(requestedLaneTypes.cbegin(), requestedLaneTypes.cend(), streamElement().GetLaneType()) == requestedLaneTypes.cend())
+                                                                 {
+                                                                     return std::make_tuple<units::length::meter_t, bool>(units::length::meter_t{previousDistance}, false);
+                                                                 }
+                                                                 else if (streamElement.EndS() > initialSearchPosition + maxSearchLength)
+                                                                 {
+                                                                     return std::make_tuple<units::length::meter_t, bool>(units::length::meter_t(std::numeric_limits<double>::infinity()), true);
+                                                                 }
+                                                                 else
+                                                                 {
+                                                                     return std::make_tuple<units::length::meter_t, bool>(streamElement.EndS() - initialSearchPosition, true);
+                                                                 }
+                                                             }},
+                                                             0.0_m, true,
+                                                             worldData);
 }
 
-OWL::CSection* WorldDataQuery::GetSectionByDistance(const std::string& odRoadId, double distance) const
+OWL::CSection *WorldDataQuery::GetSectionByDistance(const std::string& odRoadId, units::length::meter_t distance) const
 {
-    distance = std::max(0.0, distance);
+    distance = std::max(0.0_m, distance);
 
     auto road = GetRoadByOdId(odRoadId);
     if (!road)
@@ -173,13 +172,13 @@ OWL::CSection* WorldDataQuery::GetSectionByDistance(const std::string& odRoadId,
 OWL::CRoad* WorldDataQuery::GetRoadByOdId(const std::string& odRoadId) const
 {
     auto road = worldData.GetRoads().find(odRoadId);
-    return  road != worldData.GetRoads().cend() ? road->second : nullptr;
+    return road != worldData.GetRoads().cend() ? road->second : nullptr;
 }
 
 const OWL::Interfaces::Junction *WorldDataQuery::GetJunctionByOdId(const std::string &odJunctionId) const
 {
     auto junction = worldData.GetJunctions().find(odJunctionId);
-    return  junction != worldData.GetJunctions().cend() ? junction->second : nullptr;
+    return junction != worldData.GetJunctions().cend() ? junction->second : nullptr;
 }
 
 const OWL::Interfaces::Junction *WorldDataQuery::GetJunctionOfConnector(const std::string &connectingRoadId) const
@@ -187,7 +186,7 @@ const OWL::Interfaces::Junction *WorldDataQuery::GetJunctionOfConnector(const st
     const auto connectingRoad = GetRoadByOdId(connectingRoadId);
     for (auto junction : worldData.GetJunctions())
     {
-        const auto& junctionConnections = junction.second->GetConnectingRoads();
+        const auto &junctionConnections = junction.second->GetConnectingRoads();
         if (std::find(junctionConnections.cbegin(), junctionConnections.cend(), connectingRoad) != junctionConnections.cend())
         {
             return junction.second;
@@ -196,10 +195,10 @@ const OWL::Interfaces::Junction *WorldDataQuery::GetJunctionOfConnector(const st
     return nullptr;
 }
 
-OWL::CLanes WorldDataQuery::GetLanesOfLaneTypeAtDistance(const std::string& roadId, double distance, const std::vector<LaneType>& requestedLaneTypes) const
+OWL::CLanes WorldDataQuery::GetLanesOfLaneTypeAtDistance(const std::string &roadId, units::length::meter_t distance, const std::vector<LaneType> &requestedLaneTypes) const
 {
-    std::vector<OWL::CLane*> lanes;
-    OWL::CSection* sectionAtDistance = GetSectionByDistance(roadId, distance);
+    std::vector<OWL::CLane *> lanes;
+    OWL::CSection *sectionAtDistance = GetSectionByDistance(roadId, distance);
 
     if (sectionAtDistance)
     {
@@ -215,7 +214,7 @@ OWL::CLanes WorldDataQuery::GetLanesOfLaneTypeAtDistance(const std::string& road
     return lanes;
 }
 
-OWL::CLane& WorldDataQuery::GetLaneByOdId(const std::string& roadId, OWL::OdId odLaneId, double distance) const
+OWL::CLane &WorldDataQuery::GetLaneByOdId(const std::string& roadId, OWL::OdId odLaneId, units::length::meter_t distance) const
 {
     auto section = GetSectionByDistance(roadId, distance);
     if (!section)
@@ -223,7 +222,7 @@ OWL::CLane& WorldDataQuery::GetLaneByOdId(const std::string& roadId, OWL::OdId o
         return worldData.GetInvalidLane();
     }
 
-    for (const OWL::Lane* lane : section->GetLanes())
+    for (const OWL::Lane *lane : section->GetLanes())
     {
         // if a section covers a point the lanes also do
         if (lane->GetOdId() == odLaneId)
@@ -235,17 +234,16 @@ OWL::CLane& WorldDataQuery::GetLaneByOdId(const std::string& roadId, OWL::OdId o
     return worldData.GetInvalidLane();
 }
 
-
-std::pair<OWL::CLane&, double> WorldDataQuery::GetLaneByOffset(const std::string& roadId, double offset, double distance) const
+std::pair<OWL::CLane&, units::length::meter_t> WorldDataQuery::GetLaneByOffset(const std::string& roadId, units::length::meter_t offset, units::length::meter_t distance) const
 {
     auto section = GetSectionByDistance(roadId, distance);
     if (!section)
     {
-        return {worldData.GetInvalidLane(), 0};
+        return {worldData.GetInvalidLane(), 0_m};
     }
 
     auto lanes = section->GetLanes();
-    if (offset > 0)
+    if (offset > 0_m)
     {
         std::sort(lanes.begin(), lanes.end(),
         [](const OWL::Interfaces::Lane* first, const OWL::Interfaces::Lane* second){return first->GetOdId() < second->GetOdId();});
@@ -256,27 +254,27 @@ std::pair<OWL::CLane&, double> WorldDataQuery::GetLaneByOffset(const std::string
         [](const OWL::Interfaces::Lane* first, const OWL::Interfaces::Lane* second){return first->GetOdId() > second->GetOdId();});
     }
 
-    double cummulatedWidth{0.};
+    units::length::meter_t cummulatedWidth{0.};
     for (const OWL::Lane* lane : lanes)
     {
-        if (std::signbit(lane->GetOdId()) == std::signbit(offset))
+        if (std::signbit(lane->GetOdId()) == std::signbit(offset.value()))
         {
-            const double laneWidth = lane->GetWidth(distance);
+            const auto laneWidth = lane->GetWidth(distance);
             cummulatedWidth += laneWidth;
-            if (cummulatedWidth >= std::abs(offset))
+            if (cummulatedWidth >= units::math::abs(offset))
             {
-                const double tOnLane = offset - std::copysign(cummulatedWidth - 0.5 * laneWidth, offset);
+                const units::length::meter_t tOnLane = offset - units::length::meter_t(std::copysign(cummulatedWidth.value() - 0.5 * laneWidth.value(), offset.value()));
                 return {*lane, tOnLane};
             }
         }
     }
 
-    return {worldData.GetInvalidLane(), 0};
+    return {worldData.GetInvalidLane(), 0_m};
 }
 
-bool WorldDataQuery::IsSValidOnLane(const std::string& roadId, OWL::OdId laneId, double distance)
+bool WorldDataQuery::IsSValidOnLane(const std::string& roadId, OWL::OdId laneId, units::length::meter_t distance)
 {
-    if (distance < 0)
+    if (distance < 0_m)
     {
         return false;
     }
@@ -284,204 +282,198 @@ bool WorldDataQuery::IsSValidOnLane(const std::string& roadId, OWL::OdId laneId,
     return GetLaneByOdId(roadId, laneId, distance).Exists();
 }
 
-RouteQueryResult<std::vector<CommonTrafficSign::Entity>> WorldDataQuery::GetTrafficSignsInRange(LaneMultiStream laneStream, double startDistance, double searchRange) const
+RouteQueryResult<std::vector<CommonTrafficSign::Entity>> WorldDataQuery::GetTrafficSignsInRange(LaneMultiStream laneStream, units::length::meter_t startDistance, units::length::meter_t searchRange) const
 {
-    const bool backwardsSearch = searchRange < 0;
-    const double startPosition = backwardsSearch ? startDistance + searchRange : startDistance;
-    const double endPosition = backwardsSearch ? startDistance : startDistance + searchRange;
-    return laneStream.Traverse(LaneMultiStream::TraversedFunction<std::vector<CommonTrafficSign::Entity>>{[&](const auto& lane, const auto& previousTrafficSigns)
-    {
-        std::vector<CommonTrafficSign::Entity> foundTrafficSigns{previousTrafficSigns};
+    const bool backwardsSearch = searchRange < 0_m;
+    const auto startPosition = backwardsSearch ? startDistance + searchRange : startDistance;
+    const auto endPosition = backwardsSearch ? startDistance : startDistance + searchRange;
+    return laneStream.Traverse(LaneMultiStream::TraversedFunction<std::vector<CommonTrafficSign::Entity>>{[&](const auto &lane, const auto &previousTrafficSigns) {
+                                   std::vector<CommonTrafficSign::Entity> foundTrafficSigns{previousTrafficSigns};
 
-        if (lane.EndS() < startPosition)
-        {
-            return foundTrafficSigns;
-        }
-        if (lane.StartS() > endPosition)
-        {
-            return foundTrafficSigns;
-        }
-        auto sortedTrafficSigns = lane().GetTrafficSigns();
-        std::sort(sortedTrafficSigns.begin(), sortedTrafficSigns.end(),
-        [&lane](const auto first, const auto second)
-        {return lane.GetStreamPosition(first->GetS()) < lane.GetStreamPosition(second->GetS());});
-        for (const auto& trafficSign : sortedTrafficSigns)
-        {
-            double trafficSignPosition = lane.GetStreamPosition(trafficSign->GetS() - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
-            if (startPosition <= trafficSignPosition && trafficSignPosition <= endPosition)
-            {
-                foundTrafficSigns.push_back(trafficSign->GetSpecification(trafficSignPosition - startDistance));
-            }
-        }
-        return foundTrafficSigns;
-    }},
-    {},
-    worldData);
+                                   if (lane.EndS() < startPosition)
+                                   {
+                                       return foundTrafficSigns;
+                                   }
+                                   if (lane.StartS() > endPosition)
+                                   {
+                                       return foundTrafficSigns;
+                                   }
+                                   auto sortedTrafficSigns = lane().GetTrafficSigns();
+                                   std::sort(sortedTrafficSigns.begin(), sortedTrafficSigns.end(),
+                                             [&lane](const auto first, const auto second) { return lane.GetStreamPosition(first->GetS()) < lane.GetStreamPosition(second->GetS()); });
+                                   for (const auto &trafficSign : sortedTrafficSigns)
+                                   {
+                                       auto trafficSignPosition = lane.GetStreamPosition(trafficSign->GetS() - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
+                                       if (startPosition <= trafficSignPosition && trafficSignPosition <= endPosition)
+                                       {
+                                           foundTrafficSigns.push_back(trafficSign->GetSpecification(trafficSignPosition - startDistance));
+                                       }
+                                   }
+                                   return foundTrafficSigns;
+                               }},
+                               {},
+                               worldData);
 }
 
-RouteQueryResult<std::vector<CommonTrafficSign::Entity>> WorldDataQuery::GetRoadMarkingsInRange(LaneMultiStream laneStream, double startDistance, double searchRange) const
+RouteQueryResult<std::vector<CommonTrafficSign::Entity>> WorldDataQuery::GetRoadMarkingsInRange(LaneMultiStream laneStream, units::length::meter_t startDistance, units::length::meter_t searchRange) const
 {
-    return laneStream.Traverse(LaneMultiStream::TraversedFunction<std::vector<CommonTrafficSign::Entity>>{[&](const auto& lane, const auto& previousRoadMarkings)
-    {
-        std::vector<CommonTrafficSign::Entity> foundRoadMarkings{previousRoadMarkings};
+    return laneStream.Traverse(LaneMultiStream::TraversedFunction<std::vector<CommonTrafficSign::Entity>>{[&](const auto &lane, const auto &previousRoadMarkings) {
+                                   std::vector<CommonTrafficSign::Entity> foundRoadMarkings{previousRoadMarkings};
 
-        if (lane.EndS() < startDistance)
-        {
-            return foundRoadMarkings;
-        }
-        if (lane.StartS() > startDistance + searchRange)
-        {
-            return foundRoadMarkings;
-        }
-        auto sortedRoadMarkings = lane().GetRoadMarkings();
-        std::sort(sortedRoadMarkings.begin(), sortedRoadMarkings.end(),
-        [&lane](const auto first, const auto second)
-            {return lane.GetStreamPosition(first->GetS()) < lane.GetStreamPosition(second->GetS());});
+                                   if (lane.EndS() < startDistance)
+                                   {
+                                       return foundRoadMarkings;
+                                   }
+                                   if (lane.StartS() > startDistance + searchRange)
+                                   {
+                                       return foundRoadMarkings;
+                                   }
+                                   auto sortedRoadMarkings = lane().GetRoadMarkings();
+                                   std::sort(sortedRoadMarkings.begin(), sortedRoadMarkings.end(),
+                                             [&lane](const auto first, const auto second) { return lane.GetStreamPosition(first->GetS()) < lane.GetStreamPosition(second->GetS()); });
 
-        for (const auto& roadMarking : sortedRoadMarkings)
-        {
-            double roadMarkingPosition = lane.GetStreamPosition(roadMarking->GetS() - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
-            if (startDistance <= roadMarkingPosition && roadMarkingPosition <= startDistance + searchRange)
-            {
-                foundRoadMarkings.push_back(roadMarking->GetSpecification(roadMarkingPosition - startDistance));
-            }
-        }
-        return foundRoadMarkings;
-    }},
-    {},
-    worldData);
+                                   for (const auto &roadMarking : sortedRoadMarkings)
+                                   {
+                                       auto roadMarkingPosition = lane.GetStreamPosition(roadMarking->GetS() - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
+                                       if (startDistance <= roadMarkingPosition && roadMarkingPosition <= startDistance + searchRange)
+                                       {
+                                           foundRoadMarkings.push_back(roadMarking->GetSpecification(roadMarkingPosition - startDistance));
+                                       }
+                                   }
+                                   return foundRoadMarkings;
+                               }},
+                               {},
+                               worldData);
 }
 
-RouteQueryResult<std::vector<CommonTrafficLight::Entity>> WorldDataQuery::GetTrafficLightsInRange(LaneMultiStream laneStream, double startDistance, double searchRange) const
+RouteQueryResult<std::vector<CommonTrafficLight::Entity>> WorldDataQuery::GetTrafficLightsInRange(LaneMultiStream laneStream, units::length::meter_t startDistance, units::length::meter_t searchRange) const
 {
-    const bool backwardsSearch = searchRange < 0;
-    const double startPosition = backwardsSearch ? startDistance + searchRange : startDistance;
-    const double endPosition = backwardsSearch ? startDistance : startDistance + searchRange;
-    return laneStream.Traverse(LaneMultiStream::TraversedFunction<std::vector<CommonTrafficLight::Entity>>{[&](const auto& lane, const auto& previousTraffiLights)
-    {
-        std::vector<CommonTrafficLight::Entity> foundTrafficLights{previousTraffiLights};
+    const bool backwardsSearch = searchRange < 0_m;
+    const auto startPosition = backwardsSearch ? startDistance + searchRange : startDistance;
+    const auto endPosition = backwardsSearch ? startDistance : startDistance + searchRange;
+    return laneStream.Traverse(LaneMultiStream::TraversedFunction<std::vector<CommonTrafficLight::Entity>>{[&](const auto &lane, const auto &previousTraffiLights) {
+                                   std::vector<CommonTrafficLight::Entity> foundTrafficLights{previousTraffiLights};
 
-        if (lane.EndS() < startPosition)
-        {
-            return foundTrafficLights;
-        }
-        if (lane.StartS() > endPosition)
-        {
-            return foundTrafficLights;
-        }
-        auto sortedTrafficLights = lane().GetTrafficLights();
-        std::sort(sortedTrafficLights.begin(), sortedTrafficLights.end(), 
-        [&lane](const auto first, const auto second)
-        {return lane.GetStreamPosition(first->GetS()) < lane.GetStreamPosition(second->GetS());});
-        for (const auto& trafficLight : sortedTrafficLights)
-        {
-            double trafficLightPosition = lane.GetStreamPosition(trafficLight->GetS() - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
-            if (startPosition <= trafficLightPosition && trafficLightPosition <= endPosition)
-            {
-                foundTrafficLights.push_back(trafficLight->GetSpecification(trafficLightPosition - startDistance));
-            }
-        }
-        return foundTrafficLights;
-    }},
-    {},
-    worldData);
+                                   if (lane.EndS() < startPosition)
+                                   {
+                                       return foundTrafficLights;
+                                   }
+                                   if (lane.StartS() > endPosition)
+                                   {
+                                       return foundTrafficLights;
+                                   }
+                                   auto sortedTrafficLights = lane().GetTrafficLights();
+                                   std::sort(sortedTrafficLights.begin(), sortedTrafficLights.end(),
+                                             [&lane](const auto first, const auto second) { return lane.GetStreamPosition(first->GetS()) < lane.GetStreamPosition(second->GetS()); });
+                                   for (const auto &trafficLight : sortedTrafficLights)
+                                   {
+                                       auto trafficLightPosition = lane.GetStreamPosition(trafficLight->GetS() - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
+                                       if (startPosition <= trafficLightPosition && trafficLightPosition <= endPosition)
+                                       {
+                                           foundTrafficLights.push_back(trafficLight->GetSpecification(trafficLightPosition - startDistance));
+                                       }
+                                   }
+                                   return foundTrafficLights;
+                               }},
+                               {},
+                               worldData);
 }
 
-RouteQueryResult<std::vector<LaneMarking::Entity>> WorldDataQuery::GetLaneMarkings(const LaneMultiStream& laneStream, double startDistance, double range, Side side) const
+RouteQueryResult<std::vector<LaneMarking::Entity>> WorldDataQuery::GetLaneMarkings(const LaneMultiStream &laneStream, units::length::meter_t startDistance, units::length::meter_t range, Side side) const
 {
-    return laneStream.Traverse(LaneMultiStream::TraversedFunction<std::vector<LaneMarking::Entity>>{[&](const auto& lane, const auto& previousLaneMarkings)
-    {
-        std::vector<LaneMarking::Entity> laneMarkings{previousLaneMarkings};
-        std::map<double, LaneMarking::Entity> doubleLaneMarkings;
-        if (lane.EndS() < startDistance)
-        {
-            return laneMarkings;;
-        }
-        if (lane.StartS() > startDistance + range)
-        {
-            return laneMarkings;;
-        }
+    return laneStream.Traverse(LaneMultiStream::TraversedFunction<std::vector<LaneMarking::Entity>>{[&](const auto &lane, const auto &previousLaneMarkings) {
+                                   std::vector<LaneMarking::Entity> laneMarkings{previousLaneMarkings};
+                                   std::map<units::length::meter_t, LaneMarking::Entity> doubleLaneMarkings;
+                                   if (lane.EndS() < startDistance)
+                                   {
+                                       return laneMarkings;
+                                       ;
+                                   }
+                                   if (lane.StartS() > startDistance + range)
+                                   {
+                                       return laneMarkings;
+                                       ;
+                                   }
 
-        const auto& laneBoundaries = ((side == Side::Right) xor lane.inStreamDirection) ? lane().GetLeftLaneBoundaries() : lane().GetRightLaneBoundaries();
+                                   const auto &laneBoundaries = ((side == Side::Right) xor lane.inStreamDirection) ? lane().GetLeftLaneBoundaries() : lane().GetRightLaneBoundaries();
 
-        for (auto laneBoundaryIndex : laneBoundaries)
-        {
-            const auto& laneBoundary = worldData.GetLaneBoundary(laneBoundaryIndex);
-            const double boundaryStart = lane.inStreamDirection ? laneBoundary.GetSStart() : std::min(laneBoundary.GetSEnd(), lane().GetLength());
-            const double boundaryEnd = lane.inStreamDirection ? std::min(laneBoundary.GetSEnd(), lane().GetLength()) : laneBoundary.GetSStart();
-            const double boundaryStreamStart = lane.GetStreamPosition(boundaryStart - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
-            const double boundaryStreamEnd = lane.GetStreamPosition(boundaryEnd - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
-            if (boundaryStreamStart <= startDistance + range
-                    && boundaryStreamEnd >= startDistance)
-            {
-                LaneMarking::Entity laneMarking;
-                laneMarking.relativeStartDistance = boundaryStreamStart - startDistance;
-                laneMarking.width = laneBoundary.GetWidth();
-                laneMarking.type = laneBoundary.GetType();
-                laneMarking.color = laneBoundary.GetColor();
-                if (laneBoundary.GetSide() == OWL::LaneMarkingSide::Single)
-                {
-                    laneMarkings.push_back(laneMarking);
-                }
-                else
-                {
-                    if (doubleLaneMarkings.count(laneMarking.relativeStartDistance) == 0)
-                    {
-                        doubleLaneMarkings.insert(std::make_pair(laneMarking.relativeStartDistance, laneMarking));
-                    }
-                    else
-                    {
-                        auto& otherLaneMarking = doubleLaneMarkings.at(laneMarking.relativeStartDistance);
-                        LaneMarking::Type leftType;
-                        LaneMarking::Type rightType;
-                        if (laneBoundary.GetSide() == OWL::LaneMarkingSide::Left)
-                        {
-                            leftType = laneMarking.type;
-                            rightType = otherLaneMarking.type;
-                        }
-                        else
-                        {
-                            leftType = otherLaneMarking.type;
-                            rightType = laneMarking.type;
-                        }
-                        LaneMarking::Type combinedType;
-                        if (leftType == LaneMarking::Type::Solid && rightType == LaneMarking::Type::Solid)
-                        {
-                            combinedType = LaneMarking::Type::Solid_Solid;
-                        }
-                        else if (leftType == LaneMarking::Type::Solid && rightType == LaneMarking::Type::Broken)
-                        {
-                            combinedType = LaneMarking::Type::Solid_Broken;
-                        }
-                        else if (leftType == LaneMarking::Type::Broken && rightType == LaneMarking::Type::Solid)
-                        {
-                            combinedType = LaneMarking::Type::Broken_Solid;
-                        }
-                        else if (leftType == LaneMarking::Type::Broken && rightType == LaneMarking::Type::Broken)
-                        {
-                            combinedType = LaneMarking::Type::Broken_Broken;
-                        }
-                        else
-                        {
-                            throw std::runtime_error("Invalid type of double lane boundary");
-                        }
-                        laneMarking.type = combinedType;
-                        laneMarkings.push_back(laneMarking);
-                    }
-                }
-            }
-        }
+                                   for (auto laneBoundaryIndex : laneBoundaries)
+                                   {
+                                       const auto& laneBoundary = worldData.GetLaneBoundary(laneBoundaryIndex);
+                                       const auto boundaryStart = lane.inStreamDirection ? laneBoundary.GetSStart() : std::min(laneBoundary.GetSEnd(), lane().GetLength());
+                                       const auto boundaryEnd = lane.inStreamDirection ? std::min(laneBoundary.GetSEnd(), lane().GetLength()) : laneBoundary.GetSStart();
+                                       const auto boundaryStreamStart = lane.GetStreamPosition(boundaryStart - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
+                                       const auto boundaryStreamEnd = lane.GetStreamPosition(boundaryEnd - lane().GetDistance(OWL::MeasurementPoint::RoadStart));
+                                       if (boundaryStreamStart <= startDistance + range && boundaryStreamEnd >= startDistance)
+                                       {
+                                           LaneMarking::Entity laneMarking;
+                                           laneMarking.relativeStartDistance = boundaryStreamStart - startDistance;
+                                           laneMarking.width = laneBoundary.GetWidth();
+                                           laneMarking.type = laneBoundary.GetType();
+                                           laneMarking.color = laneBoundary.GetColor();
+                                           if (laneBoundary.GetSide() == OWL::LaneMarkingSide::Single)
+                                           {
+                                               laneMarkings.push_back(laneMarking);
+                                           }
+                                           else
+                                           {
+                                               if (doubleLaneMarkings.count(laneMarking.relativeStartDistance) == 0)
+                                               {
+                                                   doubleLaneMarkings.insert(std::make_pair(laneMarking.relativeStartDistance, laneMarking));
+                                               }
+                                               else
+                                               {
+                                                   auto &otherLaneMarking = doubleLaneMarkings.at(laneMarking.relativeStartDistance);
+                                                   LaneMarking::Type leftType;
+                                                   LaneMarking::Type rightType;
+                                                   if (laneBoundary.GetSide() == OWL::LaneMarkingSide::Left)
+                                                   {
+                                                       leftType = laneMarking.type;
+                                                       rightType = otherLaneMarking.type;
+                                                   }
+                                                   else
+                                                   {
+                                                       leftType = otherLaneMarking.type;
+                                                       rightType = laneMarking.type;
+                                                   }
+                                                   LaneMarking::Type combinedType;
+                                                   if (leftType == LaneMarking::Type::Solid && rightType == LaneMarking::Type::Solid)
+                                                   {
+                                                       combinedType = LaneMarking::Type::Solid_Solid;
+                                                   }
+                                                   else if (leftType == LaneMarking::Type::Solid && rightType == LaneMarking::Type::Broken)
+                                                   {
+                                                       combinedType = LaneMarking::Type::Solid_Broken;
+                                                   }
+                                                   else if (leftType == LaneMarking::Type::Broken && rightType == LaneMarking::Type::Solid)
+                                                   {
+                                                       combinedType = LaneMarking::Type::Broken_Solid;
+                                                   }
+                                                   else if (leftType == LaneMarking::Type::Broken && rightType == LaneMarking::Type::Broken)
+                                                   {
+                                                       combinedType = LaneMarking::Type::Broken_Broken;
+                                                   }
+                                                   else
+                                                   {
+                                                       throw std::runtime_error("Invalid type of double lane boundary");
+                                                   }
+                                                   laneMarking.type = combinedType;
+                                                   laneMarkings.push_back(laneMarking);
+                                               }
+                                           }
+                                       }
+                                   }
 
-        return laneMarkings;
-    }},
-    {},
-    worldData);
+                                   return laneMarkings;
+                               }},
+                               {},
+                               worldData);
 }
 
 std::vector<JunctionConnection> WorldDataQuery::GetConnectionsOnJunction(std::string junctionId, std::string incomingRoadId) const
 {
-    const auto& junction = GetJunctionByOdId(junctionId);
-    const auto& incomingRoad = GetRoadByOdId(incomingRoadId);
+    const auto &junction = GetJunctionByOdId(junctionId);
+    const auto &incomingRoad = GetRoadByOdId(incomingRoadId);
     std::vector<JunctionConnection> connections;
     for (const auto connectingRoad : junction->GetConnectingRoads())
     {
@@ -490,9 +482,9 @@ std::vector<JunctionConnection> WorldDataQuery::GetConnectionsOnJunction(std::st
             JunctionConnection connection;
             connection.connectingRoadId = connectingRoad->GetId();
             connection.outgoingRoadId = connectingRoad->GetSuccessor();
-            const auto& outgoingRoad = worldData.GetRoads().at(connectingRoad->GetSuccessor());
+            const auto &outgoingRoad = worldData.GetRoads().at(connectingRoad->GetSuccessor());
             connection.outgoingStreamDirection =
-                    junction->GetId() == (outgoingRoad->IsInStreamDirection() ? outgoingRoad->GetPredecessor() : outgoingRoad->GetSuccessor());
+                junction->GetId() == (outgoingRoad->IsInStreamDirection() ? outgoingRoad->GetPredecessor() : outgoingRoad->GetSuccessor());
             connections.push_back(connection);
         }
     }
@@ -502,12 +494,12 @@ std::vector<JunctionConnection> WorldDataQuery::GetConnectionsOnJunction(std::st
 std::vector<IntersectingConnection> WorldDataQuery::GetIntersectingConnections(std::string connectingRoadId) const
 {
     std::vector<IntersectingConnection> intersections;
-    const auto& junction = GetJunctionOfConnector(connectingRoadId);
+    const auto &junction = GetJunctionOfConnector(connectingRoadId);
     auto connectionInfos = junction->GetIntersections().find(connectingRoadId);
     if (connectionInfos != junction->GetIntersections().end())
     {
         std::transform(connectionInfos->second.cbegin(), connectionInfos->second.cend(), std::back_inserter(intersections),
-                       [&](const OWL::IntersectionInfo& connectionInfo){return IntersectingConnection{connectionInfo.intersectingRoad, connectionInfo.relativeRank};});
+                       [&](const OWL::IntersectionInfo &connectionInfo) { return IntersectingConnection{connectionInfo.intersectingRoad, connectionInfo.relativeRank}; });
     }
     return intersections;
 }
@@ -516,7 +508,7 @@ std::vector<JunctionConnectorPriority> WorldDataQuery::GetPrioritiesOnJunction(s
 {
     std::vector<JunctionConnectorPriority> priorities;
     const auto junction = GetJunctionByOdId(junctionId);
-    for (const auto& [high, low] : junction->GetPriorities())
+    for (const auto &[high, low] : junction->GetPriorities())
     {
         priorities.push_back({high, low});
     }
@@ -527,7 +519,7 @@ RoadNetworkElement WorldDataQuery::GetRoadSuccessor(std::string roadId) const
 {
     auto currentRoad = GetRoadByOdId(roadId);
     assert(currentRoad);
-    const auto& nextElementId = currentRoad->GetSuccessor();
+    const auto &nextElementId = currentRoad->GetSuccessor();
     if (worldData.GetRoads().count(nextElementId) > 0)
     {
         return {RoadNetworkElementType::Road, nextElementId};
@@ -543,7 +535,7 @@ RoadNetworkElement WorldDataQuery::GetRoadPredecessor(std::string roadId) const
 {
     auto currentRoad = GetRoadByOdId(roadId);
     assert(currentRoad);
-    const auto& nextElementId = currentRoad->GetPredecessor();
+    const auto &nextElementId = currentRoad->GetPredecessor();
     if (worldData.GetRoads().count(nextElementId) > 0)
     {
         return {RoadNetworkElementType::Road, nextElementId};
@@ -555,16 +547,16 @@ RoadNetworkElement WorldDataQuery::GetRoadPredecessor(std::string roadId) const
     return {RoadNetworkElementType::None, ""};
 }
 
-std::vector<const OWL::Interfaces::WorldObject*> WorldDataQuery::GetMovingObjectsInRangeOfJunctionConnection(std::string connectingRoadId, double range) const
+std::vector<const OWL::Interfaces::WorldObject *> WorldDataQuery::GetMovingObjectsInRangeOfJunctionConnection(std::string connectingRoadId, units::length::meter_t range) const
 {
     const auto [route, start, end] = GetRouteLeadingToConnector(connectingRoadId);
-    const auto& lanes = GetLanesOfLaneTypeAtDistance(connectingRoadId, 0.0, {LaneType::Driving});
-    std::vector<const OWL::Interfaces::WorldObject*> foundMovingObjects;
+    const auto &lanes = GetLanesOfLaneTypeAtDistance(connectingRoadId, 0.0_m, {LaneType::Driving});
+    std::vector<const OWL::Interfaces::WorldObject *> foundMovingObjects;
 
-    for (const auto& lane : lanes)
+    for (const auto &lane : lanes)
     {
-        auto laneStream = CreateLaneMultiStream(route, start, lane->GetOdId(), 0.0);
-        double laneStreamEnd = laneStream->GetPositionByVertexAndS(end, GetRoadByOdId(connectingRoadId)->GetLength());
+        auto laneStream = CreateLaneMultiStream(route, start, lane->GetOdId(), 0.0_m);
+        auto laneStreamEnd = laneStream->GetPositionByVertexAndS(end, GetRoadByOdId(connectingRoadId)->GetLength());
 
         auto movingObjects = GetObjectsOfTypeInRange<OWL::Interfaces::MovingObject>(*laneStream, laneStreamEnd - range, laneStreamEnd).at(end);
 
@@ -580,144 +572,142 @@ std::vector<const OWL::Interfaces::WorldObject*> WorldDataQuery::GetMovingObject
     return foundMovingObjects;
 }
 
-std::tuple<RoadGraph, RoadGraphVertex, RoadGraphVertex> WorldDataQuery::GetRouteLeadingToConnector (std::string connectingRoadId) const
+std::tuple<RoadGraph, RoadGraphVertex, RoadGraphVertex> WorldDataQuery::GetRouteLeadingToConnector(std::string connectingRoadId) const
 {
-     auto incomingRoadId = GetRoadPredecessor(connectingRoadId).id;
-     bool incomingRoadLeadsToJunction = GetRoadSuccessor(incomingRoadId).id == GetJunctionOfConnector(connectingRoadId)->GetId();
-     RoadGraph route;
-     auto end = add_vertex(RouteElement{connectingRoadId, true}, route);
-     auto current = add_vertex(RouteElement{incomingRoadId, incomingRoadLeadsToJunction}, route);
-     add_edge(current, end, route);
-     bool reachedEndOfRoadStream = false;
-     auto emplace_element_if = [&](const RoadNetworkElement& element)
-     {
-         if (element.type == RoadNetworkElementType::Road)
-         {
-             auto next = add_vertex(RouteElement{element.id, incomingRoadLeadsToJunction}, route);
-             add_edge(next, current, route);
-             current = next;
-             incomingRoadId = element.id;
-             return true;
-         }
-         else
-         {
-             return false;
-         }
-     };
+    auto incomingRoadId = GetRoadPredecessor(connectingRoadId).id;
+    bool incomingRoadLeadsToJunction = GetRoadSuccessor(incomingRoadId).id == GetJunctionOfConnector(connectingRoadId)->GetId();
+    RoadGraph route;
+    auto end = add_vertex(RouteElement{connectingRoadId, true}, route);
+    auto current = add_vertex(RouteElement{incomingRoadId, incomingRoadLeadsToJunction}, route);
+    add_edge(current, end, route);
+    bool reachedEndOfRoadStream = false;
+    auto emplace_element_if = [&](const RoadNetworkElement &element) {
+        if (element.type == RoadNetworkElementType::Road)
+        {
+            auto next = add_vertex(RouteElement{element.id, incomingRoadLeadsToJunction}, route);
+            add_edge(next, current, route);
+            current = next;
+            incomingRoadId = element.id;
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    };
 
-     while (!reachedEndOfRoadStream)
-     {
-         if (incomingRoadLeadsToJunction)
-         {
-             reachedEndOfRoadStream = !emplace_element_if(GetRoadPredecessor(incomingRoadId));
-         }
-         else
-         {
-             reachedEndOfRoadStream = !emplace_element_if(GetRoadSuccessor(incomingRoadId));
-         }
-     }
+    while (!reachedEndOfRoadStream)
+    {
+        if (incomingRoadLeadsToJunction)
+        {
+            reachedEndOfRoadStream = !emplace_element_if(GetRoadPredecessor(incomingRoadId));
+        }
+        else
+        {
+            reachedEndOfRoadStream = !emplace_element_if(GetRoadSuccessor(incomingRoadId));
+        }
+    }
 
-     return {route, current, end};
+    return {route, current, end};
 }
 
-double WorldDataQuery::GetDistanceUntilObjectEntersConnector(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
+units::length::meter_t WorldDataQuery::GetDistanceUntilObjectEntersConnector(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
 {
     //TODO This function needs to be made working again if OpponentAgent is implemented
-//    const OWL::Interfaces::Junction* junction = GetJunctionOfConnector(intersectingConnectorId);
-//    const auto& intersections = junction->GetIntersections().at(intersectingConnectorId);
-//    const auto& intersection = std::find_if(intersections.cbegin(), intersections.cend(),
-//                                            [this, ownConnectorId](const auto& connectionInfo){return worldData.GetRoadIdMapping().at(connectionInfo.intersectingRoad) == ownConnectorId;});
-//    if (intersection == intersections.cend())
-//    {
-//        return std::numeric_limits<double>::max();
-//    }
-//    std::vector<RouteElement> route = GetRouteLeadingToConnector(ownConnectorId);
-//    if (std::find_if(route.cbegin(), route.cend(),[&](const auto& element) {return element.roadId == position.mainLocatePoint.roadId;}) == route.end())
-//    {
-//        route.push_back({position.mainLocatePoint.roadId, position.mainLocatePoint.laneId < 0}); //Hotfix
-//    }
-//    const auto laneStream = CreateLaneStream(route, position.mainLocatePoint.roadId, position.mainLocatePoint.laneId, position.mainLocatePoint.roadPosition.s);
-//    const auto& laneOfObject = GetLaneByOdId(position.mainLocatePoint.roadId, position.mainLocatePoint.laneId, position.mainLocatePoint.roadPosition.s);
-//    double sStartOfObjectOnLaneStream = laneStream->GetPositionByElementAndS(laneOfObject, position.touchedRoads.at(position.mainLocatePoint.roadId).sStart);
-//    double sEndOfObjectOnLaneStream = laneStream->GetPositionByElementAndS(laneOfObject, position.touchedRoads.at(position.mainLocatePoint.roadId).sEnd);
-//    double frontOfObjectOnLaneStream = std::max(sStartOfObjectOnLaneStream, sEndOfObjectOnLaneStream);
-//    const auto& intersectingLane = GetLaneByOdId(intersectingConnectorId, intersectingLaneId, 0.0);
-//    const auto ownLane = std::find_if(laneStream->GetElements().cbegin(), laneStream->GetElements().cend(),
-//                 [&](const LaneStreamInfo& element){return worldData.GetRoadIdMapping().at(element.element->GetRoad().GetId()) == ownConnectorId;});
-//    double sStart = intersection->sOffsets.at({intersectingLane.GetId(), ownLane->element->GetId()}).first;
-//    double positionOfIntersectionOnLaneStream = laneStream->GetPositionByElementAndS(*ownLane->element, sStart);
-//    return positionOfIntersectionOnLaneStream - frontOfObjectOnLaneStream;
-    return 0;
+    //    const OWL::Interfaces::Junction* junction = GetJunctionOfConnector(intersectingConnectorId);
+    //    const auto& intersections = junction->GetIntersections().at(intersectingConnectorId);
+    //    const auto& intersection = std::find_if(intersections.cbegin(), intersections.cend(),
+    //                                            [this, ownConnectorId](const auto& connectionInfo){return worldData.GetRoadIdMapping().at(connectionInfo.intersectingRoad) == ownConnectorId;});
+    //    if (intersection == intersections.cend())
+    //    {
+    //        return std::numeric_limits<double>::max();
+    //    }
+    //    std::vector<RouteElement> route = GetRouteLeadingToConnector(ownConnectorId);
+    //    if (std::find_if(route.cbegin(), route.cend(),[&](const auto& element) {return element.roadId == position.mainLocatePoint.roadId;}) == route.end())
+    //    {
+    //        route.push_back({position.mainLocatePoint.roadId, position.mainLocatePoint.laneId < 0}); //Hotfix
+    //    }
+    //    const auto laneStream = CreateLaneStream(route, position.mainLocatePoint.roadId, position.mainLocatePoint.laneId, position.mainLocatePoint.roadPosition.s);
+    //    const auto& laneOfObject = GetLaneByOdId(position.mainLocatePoint.roadId, position.mainLocatePoint.laneId, position.mainLocatePoint.roadPosition.s);
+    //    double sStartOfObjectOnLaneStream = laneStream->GetPositionByElementAndS(laneOfObject, position.touchedRoads.at(position.mainLocatePoint.roadId).sStart);
+    //    double sEndOfObjectOnLaneStream = laneStream->GetPositionByElementAndS(laneOfObject, position.touchedRoads.at(position.mainLocatePoint.roadId).sEnd);
+    //    double frontOfObjectOnLaneStream = std::max(sStartOfObjectOnLaneStream, sEndOfObjectOnLaneStream);
+    //    const auto& intersectingLane = GetLaneByOdId(intersectingConnectorId, intersectingLaneId, 0.0);
+    //    const auto ownLane = std::find_if(laneStream->GetElements().cbegin(), laneStream->GetElements().cend(),
+    //                 [&](const LaneStreamInfo& element){return worldData.GetRoadIdMapping().at(element.element->GetRoad().GetId()) == ownConnectorId;});
+    //    units::length::meter_t sStart = intersection->sOffsets.at({intersectingLane.GetId(), ownLane->element->GetId()}).first;
+    //    double positionOfIntersectionOnLaneStream = laneStream->GetPositionByElementAndS(*ownLane->element, sStart);
+    //    return positionOfIntersectionOnLaneStream - frontOfObjectOnLaneStream;
+    return 0_m;
 }
 
-double WorldDataQuery::GetDistanceUntilObjectLeavesConnector(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
+units::length::meter_t WorldDataQuery::GetDistanceUntilObjectLeavesConnector(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
 {
     //TODO This function needs to be made working again if OpponentAgent is implemented
-//    const OWL::Interfaces::Junction* junction = GetJunctionOfConnector(intersectingConnectorId);
-//    const auto& intersections = junction->GetIntersections().at(intersectingConnectorId);
-//    const auto& intersection = std::find_if(intersections.cbegin(), intersections.cend(),
-//                                            [this, ownConnectorId](const auto& connectionInfo){return worldData.GetRoadIdMapping().at(connectionInfo.intersectingRoad) == ownConnectorId;});
-//    if (intersection == intersections.cend())
-//    {
-//        return std::numeric_limits<double>::max();
-//    }
-//    std::vector<RouteElement> route = GetRouteLeadingToConnector(ownConnectorId);
-//    if (std::find_if(route.cbegin(), route.cend(),[&](const auto& element) {return element.roadId == position.mainLocatePoint.roadId;}) == route.end())
-//    {
-//        route.push_back({position.mainLocatePoint.roadId, position.mainLocatePoint.laneId < 0}); //Hotfix
-//    }
-//    const auto laneStream = CreateLaneStream(route, position.mainLocatePoint.roadId, position.mainLocatePoint.laneId, position.mainLocatePoint.roadPosition.s);
-//    const auto& laneOfObject = GetLaneByOdId(position.mainLocatePoint.roadId, position.mainLocatePoint.laneId, position.mainLocatePoint.roadPosition.s);
-//    double sStartOfObjectOnLaneStream = laneStream->GetPositionByElementAndS(laneOfObject, position.touchedRoads.at(position.mainLocatePoint.roadId).sStart);
-//    double sEndOfObjectOnLaneStream = laneStream->GetPositionByElementAndS(laneOfObject, position.touchedRoads.at(position.mainLocatePoint.roadId).sEnd);
-//    double rearOfObjectOnLaneStream = std::min(sStartOfObjectOnLaneStream, sEndOfObjectOnLaneStream);
-//    const auto& intersectingLane = GetLaneByOdId(intersectingConnectorId, intersectingLaneId, 0.0);
-//    const auto ownLane = std::find_if(laneStream->GetElements().cbegin(), laneStream->GetElements().cend(),
-//                 [&](const LaneStreamInfo& element){return worldData.GetRoadIdMapping().at(element.element->GetRoad().GetId()) == ownConnectorId;});
-//    double sEnd = intersection->sOffsets.at({intersectingLane.GetId(), ownLane->element->GetId()}).second;
-//    double positionOfIntersectionOnLaneStream = laneStream->GetPositionByElementAndS(*ownLane->element, sEnd);
-//    return positionOfIntersectionOnLaneStream - rearOfObjectOnLaneStream;
-    return 0;
+    //    const OWL::Interfaces::Junction* junction = GetJunctionOfConnector(intersectingConnectorId);
+    //    const auto& intersections = junction->GetIntersections().at(intersectingConnectorId);
+    //    const auto& intersection = std::find_if(intersections.cbegin(), intersections.cend(),
+    //                                            [this, ownConnectorId](const auto& connectionInfo){return worldData.GetRoadIdMapping().at(connectionInfo.intersectingRoad) == ownConnectorId;});
+    //    if (intersection == intersections.cend())
+    //    {
+    //        return std::numeric_limits<double>::max();
+    //    }
+    //    std::vector<RouteElement> route = GetRouteLeadingToConnector(ownConnectorId);
+    //    if (std::find_if(route.cbegin(), route.cend(),[&](const auto& element) {return element.roadId == position.mainLocatePoint.roadId;}) == route.end())
+    //    {
+    //        route.push_back({position.mainLocatePoint.roadId, position.mainLocatePoint.laneId < 0}); //Hotfix
+    //    }
+    //    const auto laneStream = CreateLaneStream(route, position.mainLocatePoint.roadId, position.mainLocatePoint.laneId, position.mainLocatePoint.roadPosition.s);
+    //    const auto& laneOfObject = GetLaneByOdId(position.mainLocatePoint.roadId, position.mainLocatePoint.laneId, position.mainLocatePoint.roadPosition.s);
+    //    double sStartOfObjectOnLaneStream = laneStream->GetPositionByElementAndS(laneOfObject, position.touchedRoads.at(position.mainLocatePoint.roadId).sStart);
+    //    double sEndOfObjectOnLaneStream = laneStream->GetPositionByElementAndS(laneOfObject, position.touchedRoads.at(position.mainLocatePoint.roadId).sEnd);
+    //    double rearOfObjectOnLaneStream = std::min(sStartOfObjectOnLaneStream, sEndOfObjectOnLaneStream);
+    //    const auto& intersectingLane = GetLaneByOdId(intersectingConnectorId, intersectingLaneId, 0.0);
+    //    const auto ownLane = std::find_if(laneStream->GetElements().cbegin(), laneStream->GetElements().cend(),
+    //                 [&](const LaneStreamInfo& element){return worldData.GetRoadIdMapping().at(element.element->GetRoad().GetId()) == ownConnectorId;});
+    //    units::length::meter_t sEnd = intersection->sOffsets.at({intersectingLane.GetId(), ownLane->element->GetId()}).second;
+    //    double positionOfIntersectionOnLaneStream = laneStream->GetPositionByElementAndS(*ownLane->element, sEnd);
+    //    return positionOfIntersectionOnLaneStream - rearOfObjectOnLaneStream;
+    return 0_m;
 }
 
-std::shared_ptr<const LaneMultiStream> WorldDataQuery::CreateLaneMultiStream(const RoadGraph& roadGraph, RoadGraphVertex start, OWL::OdId startLaneId, double startDistance) const
+std::shared_ptr<const LaneMultiStream> WorldDataQuery::CreateLaneMultiStream(const RoadGraph &roadGraph, RoadGraphVertex start, OWL::OdId startLaneId, units::length::meter_t startDistance) const
 {
-    const auto& routeElement = get(RouteElement(), roadGraph, start);
-    const auto& startLane = GetLaneByOdId(routeElement.roadId, startLaneId, startDistance);
+    const auto &routeElement = get(RouteElement(), roadGraph, start);
+    const auto &startLane = GetLaneByOdId(routeElement.roadId, startLaneId, startDistance);
     if (!startLane.Exists())
     {
-        return std::make_shared<const LaneMultiStream>(CreateLaneMultiStreamRecursive(roadGraph, start, 0.0, nullptr));
+        return std::make_shared<const LaneMultiStream>(CreateLaneMultiStreamRecursive(roadGraph, start, 0.0_m, nullptr));
     }
-    return std::make_shared<const LaneMultiStream>(CreateLaneMultiStreamRecursive(roadGraph, start, 0.0, &startLane));
+    return std::make_shared<const LaneMultiStream>(CreateLaneMultiStreamRecursive(roadGraph, start, 0.0_m, &startLane));
 }
 
-std::unique_ptr<RoadStream> WorldDataQuery::CreateRoadStream(const std::vector<RouteElement>& route) const
+std::unique_ptr<RoadStream> WorldDataQuery::CreateRoadStream(const std::vector<RouteElement> &route) const
 {
-    double currentS = 0.0;
+    units::length::meter_t currentS{0.0};
 
     std::vector<RoadStreamElement> roads;
     std::transform(route.cbegin(),
                    route.cend(),
                    std::back_inserter(roads),
-                   [&](const auto& routeElement) -> RoadStreamElement
-    {
-        RoadStreamElement roadStreamInfo;
-        roadStreamInfo.road = GetRoadByOdId(routeElement.roadId);
-        roadStreamInfo.inStreamDirection = routeElement.inOdDirection;
-        roadStreamInfo.sOffset = currentS + (routeElement.inOdDirection ? 0 : roadStreamInfo.road->GetLength());
-
-        currentS += roadStreamInfo.road->GetLength();
-        return roadStreamInfo;
-    });
+                   [&](const auto &routeElement) -> RoadStreamElement {
+                       RoadStreamElement roadStreamInfo;
+                       roadStreamInfo.road = GetRoadByOdId(routeElement.roadId);
+                       roadStreamInfo.inStreamDirection = routeElement.inOdDirection;
+                       roadStreamInfo.sOffset = currentS + (routeElement.inOdDirection ? 0_m : roadStreamInfo.road->GetLength());
+
+                       currentS += roadStreamInfo.road->GetLength();
+                       return roadStreamInfo;
+                   });
     return std::make_unique<RoadStream>(std::move(roads));
 }
 
-std::shared_ptr<const RoadMultiStream> WorldDataQuery::CreateRoadMultiStream(const RoadGraph& roadGraph, RoadGraphVertex start) const
+std::shared_ptr<const RoadMultiStream> WorldDataQuery::CreateRoadMultiStream(const RoadGraph &roadGraph, RoadGraphVertex start) const
 {
-    return std::make_shared<const RoadMultiStream>(CreateRoadMultiStreamRecursive(roadGraph, start, 0.0));
+    return std::make_shared<const RoadMultiStream>(CreateRoadMultiStreamRecursive(roadGraph, start, 0.0_m));
 }
 
-RoadMultiStream::Node WorldDataQuery::CreateRoadMultiStreamRecursive(const RoadGraph& roadGraph, const RoadGraphVertex& current, double sOffset) const
+RoadMultiStream::Node WorldDataQuery::CreateRoadMultiStreamRecursive(const RoadGraph &roadGraph, const RoadGraphVertex &current, units::length::meter_t sOffset) const
 {
     const auto routeElement = get(RouteElement(), roadGraph, current);
     const auto road = GetRoadByOdId(routeElement.roadId);
@@ -731,18 +721,18 @@ RoadMultiStream::Node WorldDataQuery::CreateRoadMultiStreamRecursive(const RoadG
     {
         next.push_back(CreateRoadMultiStreamRecursive(roadGraph, *successor, sOffset + roadLength));
     }
-    auto streamInfo = std::optional<RoadStreamInfo>(std::in_place_t(), road, sOffset + (routeElement.inOdDirection ? 0 : roadLength), routeElement.inOdDirection);
+    auto streamInfo = std::optional<RoadStreamInfo>(std::in_place_t(), road, sOffset + (routeElement.inOdDirection ? 0_m : roadLength), routeElement.inOdDirection);
     RoadMultiStream::Node root{streamInfo, {next}, current};
 
     return root;
 }
 
-LaneMultiStream::Node WorldDataQuery::CreateLaneMultiStreamRecursive(const RoadGraph& roadGraph, const RoadGraphVertex& current, double sOffset, const OWL::Lane* lane) const
+LaneMultiStream::Node WorldDataQuery::CreateLaneMultiStreamRecursive(const RoadGraph &roadGraph, const RoadGraphVertex &current, units::length::meter_t sOffset, const OWL::Lane *lane) const
 {
     const auto routeElement = get(RouteElement(), roadGraph, current);
     std::vector<LaneMultiStream::Node> next{};
-    auto laneLength = lane ? lane->GetLength() : 0.0;
-    const auto& laneSuccessors = lane ? (routeElement.inOdDirection ? lane->GetNext() : lane->GetPrevious()) : std::vector<OWL::Id>{};
+    auto laneLength = lane ? lane->GetLength() : 0.0_m;
+    const auto &laneSuccessors = lane ? (routeElement.inOdDirection ? lane->GetNext() : lane->GetPrevious()) : std::vector<OWL::Id>{};
     bool foundSuccessorOnSameRoad = false;
     if (laneSuccessors.size() == 1)
     {
@@ -759,8 +749,7 @@ LaneMultiStream::Node WorldDataQuery::CreateLaneMultiStreamRecursive(const RoadG
         for (auto [successor, successorsEnd] = adjacent_vertices(current, roadGraph); successor != successorsEnd; successor++)
         {
             auto successorRoadId = get(RouteElement(), roadGraph, *successor).roadId;
-            auto laneSuccessorId = std::find_if(laneSuccessors.begin(), laneSuccessors.end(), [&](const auto& laneSuccessorId)
-            {
+            auto laneSuccessorId = std::find_if(laneSuccessors.begin(), laneSuccessors.end(), [&](const auto &laneSuccessorId) {
                 const auto& laneSuccessor = worldData.GetLane(laneSuccessorId);
                 const auto& laneSuccessorRoadId = laneSuccessor.GetRoad().GetId();
                 return laneSuccessorRoadId == successorRoadId;
@@ -775,20 +764,20 @@ LaneMultiStream::Node WorldDataQuery::CreateLaneMultiStreamRecursive(const RoadG
             }
         }
     }
-    auto streamInfo = lane ? std::optional<LaneStreamInfo>(std::in_place_t(), lane, sOffset + (routeElement.inOdDirection ? 0 : laneLength), routeElement.inOdDirection)
+    auto streamInfo = lane ? std::optional<LaneStreamInfo>(std::in_place_t(), lane, sOffset + (routeElement.inOdDirection ? 0_m : laneLength), routeElement.inOdDirection)
                            : std::nullopt;
     LaneMultiStream::Node root{streamInfo, {next}, current};
 
     return root;
 }
 
-OWL::CLane* WorldDataQuery::GetOriginatingRouteLane(std::vector<RouteElement> route, std::string startRoadId, OWL::OdId startLaneId, double startDistance) const
+OWL::CLane *WorldDataQuery::GetOriginatingRouteLane(std::vector<RouteElement> route, std::string startRoadId, OWL::OdId startLaneId, units::length::meter_t startDistance) const
 {
-    OWL::CLane* currentLane = &GetLaneByOdId(startRoadId, startLaneId, startDistance);
+    OWL::CLane *currentLane = &GetLaneByOdId(startRoadId, startLaneId, startDistance);
     auto routeIterator = std::find_if(route.crbegin(), route.crend(),
-                                      [&](const auto& routeElement){
-        return routeElement.roadId == startRoadId;
-    } );
+                                      [&](const auto &routeElement) {
+                                          return routeElement.roadId == startRoadId;
+                                      });
     bool reachedMostUpstreamLane = false;
     bool inStreamDirection = routeIterator->inOdDirection;
     while (!reachedMostUpstreamLane)
@@ -801,12 +790,11 @@ OWL::CLane* WorldDataQuery::GetOriginatingRouteLane(std::vector<RouteElement> ro
         }
         //search predecessor in current road
         auto upstreamLane = std::find_if(upstreamLanes.cbegin(), upstreamLanes.cend(),
-                                         [routeIterator, this](const OWL::Id& laneId)
-        {
-            const auto& upStreamLane = worldData.GetLane(laneId);
-            const auto upStreamRoadId = upStreamLane.GetRoad().GetId();
-            return upStreamRoadId == routeIterator->roadId;
-        });
+                                         [routeIterator, this](const OWL::Id &laneId) {
+                                             const auto& upStreamLane = worldData.GetLane(laneId);
+                                             const auto upStreamRoadId = upStreamLane.GetRoad().GetId();
+                                             return upStreamRoadId == routeIterator->roadId;
+                                         });
         if (upstreamLane == upstreamLanes.cend()) //no predecessor in current road -> go to previous road
         {
             ++routeIterator;
@@ -817,12 +805,11 @@ OWL::CLane* WorldDataQuery::GetOriginatingRouteLane(std::vector<RouteElement> ro
             }
             //search predecessor in previous road
             upstreamLane = std::find_if(upstreamLanes.cbegin(), upstreamLanes.cend(),
-                                        [routeIterator, this](const OWL::Id& laneId)
-            {
-                const auto& upStreamLane = worldData.GetLane(laneId);
-                const auto upStreamRoadId = upStreamLane.GetRoad().GetId();
-                return upStreamRoadId == routeIterator->roadId;
-            });
+                                        [routeIterator, this](const OWL::Id &laneId) {
+                                            const auto& upStreamLane = worldData.GetLane(laneId);
+                                            const auto upStreamRoadId = upStreamLane.GetRoad().GetId();
+                                            return upStreamRoadId == routeIterator->roadId;
+                                        });
         }
         if (upstreamLane == upstreamLanes.cend()) //none of the predecessors is on the route
         {
@@ -836,11 +823,11 @@ OWL::CLane* WorldDataQuery::GetOriginatingRouteLane(std::vector<RouteElement> ro
     return currentLane;
 }
 
-RouteQueryResult<std::optional<double>> WorldDataQuery::GetDistanceBetweenObjects(const RoadMultiStream& roadStream,
-                                                                                  const double ownStreamPosition,
+RouteQueryResult<std::optional<units::length::meter_t>> WorldDataQuery::GetDistanceBetweenObjects(const RoadMultiStream& roadStream,
+                                                                                  const units::length::meter_t ownStreamPosition,
                                                                                   const GlobalRoadPositions& target) const
 {
-    return roadStream.Traverse<std::optional<double>>(RoadMultiStream::TraversedFunction<std::optional<double>>{
+    return roadStream.Traverse<std::optional<units::length::meter_t>>(RoadMultiStream::TraversedFunction<std::optional<units::length::meter_t>>{
                                                           [&](const auto& road, const auto& previousResult)
     {
         const auto& roadId = road.element->GetId();
@@ -853,27 +840,25 @@ RouteQueryResult<std::optional<double>> WorldDataQuery::GetDistanceBetweenObject
         {
             return previousResult;
         }
-        return std::optional<double>{road.GetStreamPosition(roadPosition->roadPosition.s) - ownStreamPosition};
+        return std::optional<units::length::meter_t>{road.GetStreamPosition(roadPosition->roadPosition.s) - ownStreamPosition};
     }},
     {},
     worldData);
 }
 
-Position WorldDataQuery::GetPositionByDistanceAndLane(const OWL::Interfaces::Lane& lane, double distanceOnLane, double offset) const
+Position WorldDataQuery::GetPositionByDistanceAndLane(const OWL::Interfaces::Lane &lane, units::length::meter_t distanceOnLane, units::length::meter_t offset) const
 {
-    const auto& referencePoint = lane.GetInterpolatedPointsAtDistance(distanceOnLane).reference;
+    const auto &referencePoint = lane.GetInterpolatedPointsAtDistance(distanceOnLane).reference;
     auto yaw = lane.GetDirection(distanceOnLane);
 
-    return Position
-    {
-        referencePoint.x - std::sin(yaw) * offset,
-        referencePoint.y + std::cos(yaw) * offset,
+    return Position{
+        units::length::meter_t(referencePoint.x) - units::math::sin(yaw) * offset,
+        units::length::meter_t(referencePoint.y) + units::math::cos(yaw) * offset,
         yaw,
-        lane.GetCurvature(distanceOnLane)
-    };
+        lane.GetCurvature(distanceOnLane)};
 }
 
-RouteQueryResult<RelativeWorldView::Roads> WorldDataQuery::GetRelativeJunctions(const RoadMultiStream &roadStream, double startPosition, double range) const
+RouteQueryResult<RelativeWorldView::Roads> WorldDataQuery::GetRelativeJunctions(const RoadMultiStream &roadStream, units::length::meter_t startPosition, units::length::meter_t range) const
 {
     return roadStream.Traverse(RoadMultiStream::TraversedFunction<RelativeWorldView::Roads>{[&](const auto &road, const auto &previousResult) {
                                    if (road.EndS() < startPosition)
@@ -889,8 +874,8 @@ RouteQueryResult<RelativeWorldView::Roads> WorldDataQuery::GetRelativeJunctions(
                                    auto junction = GetJunctionOfConnector(roadId);
                                    if (junction)
                                    {
-                                       double startS = road.StartS() - startPosition;
-                                       double endS = road.EndS() - startPosition;
+                                       const auto startS = road.StartS() - startPosition;
+                                       const auto endS = road.EndS() - startPosition;
                                        junctions.push_back({startS, endS, roadId});
                                    }
                                    return junctions;
@@ -899,7 +884,7 @@ RouteQueryResult<RelativeWorldView::Roads> WorldDataQuery::GetRelativeJunctions(
                                worldData);
 }
 
-RouteQueryResult<RelativeWorldView::Roads> WorldDataQuery::GetRelativeRoads(const RoadMultiStream& roadStream, double startPosition, double range) const
+RouteQueryResult<RelativeWorldView::Roads> WorldDataQuery::GetRelativeRoads(const RoadMultiStream& roadStream, units::length::meter_t startPosition, units::length::meter_t range) const
 {
     return roadStream.Traverse(RoadMultiStream::TraversedFunction<RelativeWorldView::Roads>{[&](const auto& road, const auto& previousResult)
     {
@@ -915,8 +900,8 @@ RouteQueryResult<RelativeWorldView::Roads> WorldDataQuery::GetRelativeRoads(cons
         std::string roadId = road().GetId();
         auto junction = (GetJunctionOfConnector(roadId) != nullptr);
 
-        double startS = road.StartS() - startPosition;
-        double endS = road.EndS() - startPosition;
+        units::length::meter_t startS = road.StartS() - startPosition;
+        units::length::meter_t endS = road.EndS() - startPosition;
         roads.push_back({startS, endS, roadId, junction, road.inStreamDirection});
 
         return roads;
@@ -928,7 +913,7 @@ RouteQueryResult<RelativeWorldView::Roads> WorldDataQuery::GetRelativeRoads(cons
 std::optional<int> GetIdOfPredecessor(std::vector<OWL::Id> predecessors, std::map<int, OWL::Id> previousSectionLaneIds)
 {
     auto it = std::find_if(previousSectionLaneIds.cbegin(), previousSectionLaneIds.cend(),
-                 [&](const auto& lane){return std::count(predecessors.cbegin(), predecessors.cend(), lane.second) > 0;});
+                           [&](const auto &lane) { return std::count(predecessors.cbegin(), predecessors.cend(), lane.second) > 0; });
     if (it == previousSectionLaneIds.cend())
     {
         return std::nullopt;
@@ -936,9 +921,9 @@ std::optional<int> GetIdOfPredecessor(std::vector<OWL::Id> predecessors, std::ma
     return it->first;
 }
 
-int WorldDataQuery::FindNextEgoLaneId (const OWL::Interfaces::Lanes& lanesOnSection, bool inStreamDirection, std::map<int, OWL::Id> previousSectionLaneIds) const
+int WorldDataQuery::FindNextEgoLaneId(const OWL::Interfaces::Lanes &lanesOnSection, bool inStreamDirection, std::map<int, OWL::Id> previousSectionLaneIds) const
 {
-    for (const auto& lane : lanesOnSection)
+    for (const auto &lane : lanesOnSection)
     {
         const auto predecessors = inStreamDirection ? lane->GetPrevious() : lane->GetNext();
         std::optional<int> predecessorRelativeId = GetIdOfPredecessor(predecessors, previousSectionLaneIds);
@@ -953,16 +938,16 @@ int WorldDataQuery::FindNextEgoLaneId (const OWL::Interfaces::Lanes& lanesOnSect
     return 0;
 }
 
-std::map<int, OWL::Id> WorldDataQuery::AddLanesOfSection(const OWL::Interfaces::Lanes& lanesOnSection, bool inStreamDirection, int currentOwnLaneId, bool includeOncoming,
-                                                         const std::map<int, OWL::Id>& previousSectionLaneIds, std::vector<RelativeWorldView::Lane>& previousSectionLanes,
-                                                         RelativeWorldView::LanesInterval& laneInterval) const
+std::map<int, OWL::Id> WorldDataQuery::AddLanesOfSection(const OWL::Interfaces::Lanes &lanesOnSection, bool inStreamDirection, int currentOwnLaneId, bool includeOncoming,
+                                                         const std::map<int, OWL::Id> &previousSectionLaneIds, std::vector<RelativeWorldView::Lane> &previousSectionLanes,
+                                                         RelativeWorldView::LanesInterval &laneInterval) const
 {
     std::map<int, OWL::Id> lanesOnSectionLaneIds{};
-    for (const auto& lane : lanesOnSection)
+    for (const auto &lane : lanesOnSection)
     {
-        const auto& laneId = lane->GetOdId();
+        const auto &laneId = lane->GetOdId();
         bool inDrivingDirection = inStreamDirection ? (laneId < 0) : (laneId > 0);
-        if(!includeOncoming && !inDrivingDirection)
+        if (!includeOncoming && !inDrivingDirection)
         {
             continue;
         }
@@ -979,230 +964,224 @@ std::map<int, OWL::Id> WorldDataQuery::AddLanesOfSection(const OWL::Interfaces::
         if (predecessorRelativeId)
         {
             auto predecessor = std::find_if(previousSectionLanes.begin(), previousSectionLanes.end(),
-                                            [&](const auto& lane){return lane.relativeId == predecessorRelativeId;});
+                                            [&](const auto &lane) { return lane.relativeId == predecessorRelativeId; });
             predecessor->successor = relativeLaneId;
         }
     }
     return lanesOnSectionLaneIds;
 }
 
-RouteQueryResult<RelativeWorldView::Lanes> WorldDataQuery::GetRelativeLanes(const RoadMultiStream& roadStream, double startPosition, int startLaneId, double range, bool includeOncoming) const
+RouteQueryResult<RelativeWorldView::Lanes> WorldDataQuery::GetRelativeLanes(const RoadMultiStream &roadStream, units::length::meter_t startPosition, int startLaneId, units::length::meter_t range, bool includeOncoming) const
 {
     int currentOwnLaneId = startLaneId;
     return roadStream.Traverse<RelativeWorldView::Lanes, std::map<int, OWL::Id>>(
-     RoadMultiStream::TraversedFunction<RelativeWorldView::Lanes, std::map<int, OWL::Id>>{[&](const auto& road, const auto& previousResult, const auto& previousLaneIds)
-    {
-        std::map<int, OWL::Id> previousSectionLaneIds{previousLaneIds};
-        if (road.EndS() < startPosition)
-        {
-            return std::make_tuple(previousResult, previousLaneIds);
-        }
-        if (road.StartS() > startPosition + range)
-        {
-            return std::make_tuple(previousResult, previousLaneIds);
-        }
-        RelativeWorldView::Lanes relativeLanes{previousResult};
-        OWL::Interfaces::Sections sections = road().GetSections();
-        if (!road.inStreamDirection)
-        {
-            std::reverse(sections.begin(), sections.end());
-        }
-        for (const auto& section : sections)
-        {
-            const double sectionStart = road.GetStreamPosition(section->GetSOffset() + (road.inStreamDirection ? 0 : section->GetLength()));
-            const double sectionEnd = road.GetStreamPosition(section->GetSOffset() + (road.inStreamDirection ? section->GetLength() : 0));
-            if (sectionEnd < startPosition)
-            {
-                continue;
-            }
-            if (sectionStart > startPosition + range)
+        RoadMultiStream::TraversedFunction<RelativeWorldView::Lanes, std::map<int, OWL::Id>>{[&](const auto &road, const auto &previousResult, const auto &previousLaneIds) {
+            std::map<int, OWL::Id> previousSectionLaneIds{previousLaneIds};
+            if (road.EndS() < startPosition)
             {
-                return std::make_tuple(relativeLanes, previousSectionLaneIds);
+                return std::make_tuple(previousResult, previousLaneIds);
             }
-            RelativeWorldView::LanesInterval laneInterval;
-            laneInterval.startS = sectionStart - startPosition;
-            laneInterval.endS = sectionEnd - startPosition;
-            const auto& lanesOnSection = section->GetLanes();
-            if (previousSectionLaneIds.empty())
+            if (road.StartS() > startPosition + range)
             {
-                currentOwnLaneId = startLaneId;
+                return std::make_tuple(previousResult, previousLaneIds);
             }
-            else
+            RelativeWorldView::Lanes relativeLanes{previousResult};
+            OWL::Interfaces::Sections sections = road().GetSections();
+            if (!road.inStreamDirection)
             {
-                currentOwnLaneId = FindNextEgoLaneId(lanesOnSection, road.inStreamDirection, previousSectionLaneIds);
+                std::reverse(sections.begin(), sections.end());
             }
-            auto lanesOnSectionLaneIds = AddLanesOfSection(lanesOnSection, road.inStreamDirection, currentOwnLaneId, includeOncoming, previousSectionLaneIds, relativeLanes.back().lanes, laneInterval);
-            previousSectionLaneIds = lanesOnSectionLaneIds;
-            relativeLanes.push_back(laneInterval);
-        }
-        return std::make_tuple(relativeLanes, previousSectionLaneIds);
-    }},
-    {},
-    {},
-    worldData);
-}
-
-RouteQueryResult<std::optional<int>> WorldDataQuery::GetRelativeLaneId(const RoadMultiStream &roadStream, double ownPosition, int ownLaneId, GlobalRoadPositions targetPosition) const
-{
-    std::optional<int> currentOwnLaneId;
-    std::optional<int> currentTargetLaneId;
-    return roadStream.Traverse<std::optional<int>, std::map<int, OWL::Id>>(
-     RoadMultiStream::TraversedFunction<std::optional<int>, std::map<int, OWL::Id>>{[&](const auto& road, const auto& previousResult, const auto& previousLaneIds)->std::tuple<std::optional<int>, std::map<int, OWL::Id>>
-    {
-        if (previousResult.has_value())
-        {
-            return std::make_tuple(previousResult, previousLaneIds);
-        }
-        const auto& roadId = road.element->GetId();
-        auto positionOnRoad = helper::map::query(targetPosition, roadId);
-        auto streamPosition = road.GetStreamPosition(positionOnRoad->roadPosition.s);
-        auto sections = road().GetSections();
-        if (!road.inStreamDirection)
-        {
-            std::reverse(sections.begin(), sections.end());
-        }
-        std::map<int, OWL::Id> previousSectionLaneIds{previousLaneIds};
-        for (const auto& section : sections)
-        {
-            const double sectionStart = road.GetStreamPosition(section->GetSOffset() + (road.inStreamDirection ? 0 : section->GetLength()));
-            const double sectionEnd = road.GetStreamPosition(section->GetSOffset() + (road.inStreamDirection ? section->GetLength() : 0));
-            bool onSection = positionOnRoad.has_value() && sectionStart <= streamPosition && sectionEnd >= streamPosition;
-            const auto& lanesOnSection = section->GetLanes();
-            if (sectionStart <= ownPosition && sectionEnd >= ownPosition)
+            for (const auto &section : sections)
             {
-                if (currentTargetLaneId.has_value())
+                const auto sectionStart = road.GetStreamPosition(section->GetSOffset() + (road.inStreamDirection ? 0_m : section->GetLength()));
+                const auto sectionEnd = road.GetStreamPosition(section->GetSOffset() + (road.inStreamDirection ? section->GetLength() : 0_m));
+                if (sectionEnd < startPosition)
                 {
-                    currentTargetLaneId = FindNextEgoLaneId(lanesOnSection, road.inStreamDirection, previousSectionLaneIds);
+                    continue;
                 }
-                else
+                if (sectionStart > startPosition + range)
                 {
-                    currentOwnLaneId = ownLaneId;
+                    return std::make_tuple(relativeLanes, previousSectionLaneIds);
                 }
-            }
-            else
-            {
-                if (onSection)
+                RelativeWorldView::LanesInterval laneInterval;
+                laneInterval.startS = sectionStart - startPosition;
+                laneInterval.endS = sectionEnd - startPosition;
+                const auto &lanesOnSection = section->GetLanes();
+                if (previousSectionLaneIds.empty())
                 {
-                    currentTargetLaneId = positionOnRoad->laneId;
+                    currentOwnLaneId = startLaneId;
                 }
-                else if (currentTargetLaneId.has_value())
-                {
-                    currentTargetLaneId = FindNextEgoLaneId(lanesOnSection, road.inStreamDirection, previousSectionLaneIds);
-                }
-                if (currentOwnLaneId.has_value())
+                else
                 {
                     currentOwnLaneId = FindNextEgoLaneId(lanesOnSection, road.inStreamDirection, previousSectionLaneIds);
                 }
+                auto lanesOnSectionLaneIds = AddLanesOfSection(lanesOnSection, road.inStreamDirection, currentOwnLaneId, includeOncoming, previousSectionLaneIds, relativeLanes.back().lanes, laneInterval);
+                previousSectionLaneIds = lanesOnSectionLaneIds;
+                relativeLanes.push_back(laneInterval);
+            }
+            return std::make_tuple(relativeLanes, previousSectionLaneIds);
+        }},
+        {},
+        {},
+        worldData);
+}
+
+RouteQueryResult<std::optional<int>> WorldDataQuery::GetRelativeLaneId(const RoadMultiStream &roadStream, units::length::meter_t ownPosition, int ownLaneId, GlobalRoadPositions targetPosition) const
+{
+    std::optional<int> currentOwnLaneId;
+    std::optional<int> currentTargetLaneId;
+    return roadStream.Traverse<std::optional<int>, std::map<int, OWL::Id>>(
+        RoadMultiStream::TraversedFunction<std::optional<int>, std::map<int, OWL::Id>>{[&](const auto &road, const auto &previousResult, const auto &previousLaneIds) -> std::tuple<std::optional<int>, std::map<int, OWL::Id>> {
+            if (previousResult.has_value())
+            {
+                return std::make_tuple(previousResult, previousLaneIds);
             }
-            if (!currentOwnLaneId && !currentTargetLaneId)
+            const auto &roadId = road.element->GetId();
+            auto positionOnRoad = helper::map::query(targetPosition, roadId);
+            auto streamPosition = road.GetStreamPosition(positionOnRoad->roadPosition.s);
+            auto sections = road().GetSections();
+            if (!road.inStreamDirection)
             {
-                continue;
+                std::reverse(sections.begin(), sections.end());
             }
-            previousSectionLaneIds = {};
-            for (auto lane : section->GetLanes())
+            std::map<int, OWL::Id> previousSectionLaneIds{previousLaneIds};
+            for (const auto &section : sections)
             {
-                const auto& laneId = lane->GetOdId();
-                const auto currentId = currentOwnLaneId.has_value() ? currentOwnLaneId.value() : currentTargetLaneId.value();
-                int relativeLaneId = road.inStreamDirection ? (laneId - currentId) : (currentId - laneId);
-                bool differentSigns = currentId * laneId < 0;
-                if (differentSigns)
+                const auto sectionStart = road.GetStreamPosition(section->GetSOffset() + (road.inStreamDirection ? 0_m : section->GetLength()));
+                const auto sectionEnd = road.GetStreamPosition(section->GetSOffset() + (road.inStreamDirection ? section->GetLength() : 0_m));
+                bool onSection = positionOnRoad.has_value() && sectionStart <= streamPosition && sectionEnd >= streamPosition;
+                const auto &lanesOnSection = section->GetLanes();
+                if (sectionStart <= ownPosition && sectionEnd >= ownPosition)
                 {
-                    relativeLaneId += (relativeLaneId > 0) ? -1 : 1;
+                    if (currentTargetLaneId.has_value())
+                    {
+                        currentTargetLaneId = FindNextEgoLaneId(lanesOnSection, road.inStreamDirection, previousSectionLaneIds);
+                    }
+                    else
+                    {
+                        currentOwnLaneId = ownLaneId;
+                    }
                 }
-                if (currentOwnLaneId.has_value())
+                else
                 {
-                    if (onSection && positionOnRoad->laneId == laneId)
+                    if (onSection)
                     {
-                        return std::make_tuple(relativeLaneId, previousLaneIds);
+                        currentTargetLaneId = positionOnRoad->laneId;
+                    }
+                    else if (currentTargetLaneId.has_value())
+                    {
+                        currentTargetLaneId = FindNextEgoLaneId(lanesOnSection, road.inStreamDirection, previousSectionLaneIds);
+                    }
+                    if (currentOwnLaneId.has_value())
+                    {
+                        currentOwnLaneId = FindNextEgoLaneId(lanesOnSection, road.inStreamDirection, previousSectionLaneIds);
                     }
                 }
-                else
+                if (!currentOwnLaneId && !currentTargetLaneId)
+                {
+                    continue;
+                }
+                previousSectionLaneIds = {};
+                for (auto lane : section->GetLanes())
                 {
-                    if (sectionStart <= ownPosition && sectionEnd >= ownPosition && ownLaneId == laneId)
+                    const auto &laneId = lane->GetOdId();
+                    const auto currentId = currentOwnLaneId.has_value() ? currentOwnLaneId.value() : currentTargetLaneId.value();
+                    int relativeLaneId = road.inStreamDirection ? (laneId - currentId) : (currentId - laneId);
+                    bool differentSigns = currentId * laneId < 0;
+                    if (differentSigns)
+                    {
+                        relativeLaneId += (relativeLaneId > 0) ? -1 : 1;
+                    }
+                    if (currentOwnLaneId.has_value())
+                    {
+                        if (onSection && positionOnRoad->laneId == laneId)
+                        {
+                            return std::make_tuple(relativeLaneId, previousLaneIds);
+                        }
+                    }
+                    else
                     {
-                        return std::make_tuple(-relativeLaneId, previousLaneIds);
+                        if (sectionStart <= ownPosition && sectionEnd >= ownPosition && ownLaneId == laneId)
+                        {
+                            return std::make_tuple(-relativeLaneId, previousLaneIds);
+                        }
                     }
+                    previousSectionLaneIds.insert({relativeLaneId, lane->GetId()});
                 }
-                previousSectionLaneIds.insert({relativeLaneId, lane->GetId()});
             }
-         }
-         return std::make_tuple(std::nullopt, previousSectionLaneIds);
-    }},
-    {},
-    {},
-    worldData);
+            return std::make_tuple(std::nullopt, previousSectionLaneIds);
+        }},
+        {},
+        {},
+        worldData);
 }
 
-RouteQueryResult<std::optional<double> > WorldDataQuery::GetLaneCurvature(const LaneMultiStream& laneStream, double position) const
+RouteQueryResult<std::optional<units::curvature::inverse_meter_t>> WorldDataQuery::GetLaneCurvature(const LaneMultiStream &laneStream, units::length::meter_t position) const
 {
-    return laneStream.Traverse<std::optional<double>>(LaneMultiStream::TraversedFunction<std::optional<double>>{[&](const auto& lane, const auto& previousResult)
-    {
-        if (lane.StartS() <= position && lane.EndS() >= position)
-        {
-            return std::optional<double>(std::in_place_t(), lane.element->GetCurvature(lane.GetElementPosition(position) + lane.element->GetDistance(OWL::MeasurementPoint::RoadStart)));
-        }
-        return previousResult;
-    }},
-    std::nullopt,
-    worldData);
+        return laneStream.Traverse<std::optional<units::curvature::inverse_meter_t>>(LaneMultiStream::TraversedFunction<std::optional<units::curvature::inverse_meter_t>>{[&](const auto &lane, const auto &previousResult) {
+                                                                                         if (lane.StartS() <= position && lane.EndS() >= position)
+                                                                                         {
+                                                                                             return std::optional<units::curvature::inverse_meter_t>(std::in_place_t(), lane.element->GetCurvature(lane.GetElementPosition(position) + lane.element->GetDistance(OWL::MeasurementPoint::RoadStart)));
+                                                                                         }
+                                                                                         return previousResult;
+                                                                                     }},
+                                                                                     std::nullopt,
+                                                                                     worldData);
 }
 
-RouteQueryResult<std::optional<double> > WorldDataQuery::GetLaneWidth(const LaneMultiStream& laneStream, double position) const
+RouteQueryResult<std::optional<units::length::meter_t>> WorldDataQuery::GetLaneWidth(const LaneMultiStream &laneStream, units::length::meter_t position) const
 {
-    return laneStream.Traverse<std::optional<double>>(LaneMultiStream::TraversedFunction<std::optional<double>>{[&](const auto& lane, const auto& previousResult)
-    {
-        if (lane.StartS() <= position && lane.EndS() >= position)
-        {
-            return std::optional<double>(std::in_place_t(), lane.element->GetWidth(lane.GetElementPosition(position) + lane.element->GetDistance(OWL::MeasurementPoint::RoadStart)));
-        }
-        return previousResult;
-    }},
-    std::nullopt,
-    worldData);
+        return laneStream.Traverse<std::optional<units::length::meter_t>>(LaneMultiStream::TraversedFunction<std::optional<units::length::meter_t>>{[&](const auto &lane, const auto &previousResult) {
+                                                                              if (lane.StartS() <= position && lane.EndS() >= position)
+                                                                              {
+                                                                                  return std::optional<units::length::meter_t>(std::in_place_t(), lane.element->GetWidth(lane.GetElementPosition(position) + lane.element->GetDistance(OWL::MeasurementPoint::RoadStart)));
+                                                                              }
+                                                                              return previousResult;
+                                                                          }},
+                                                                          std::nullopt,
+                                                                          worldData);
 }
 
-RouteQueryResult<std::optional<double> > WorldDataQuery::GetLaneDirection(const LaneMultiStream& laneStream, double position) const
+RouteQueryResult<std::optional<units::angle::radian_t>> WorldDataQuery::GetLaneDirection(const LaneMultiStream &laneStream, units::length::meter_t position) const
 {
-    return laneStream.Traverse<std::optional<double>>(LaneMultiStream::TraversedFunction<std::optional<double>>{[&](const auto& lane, const auto& previousResult)
-    {
-        if (lane.StartS() <= position && lane.EndS() >= position)
-        {
-            return std::optional<double>(std::in_place_t(), lane.element->GetDirection(lane.GetElementPosition(position) + lane.element->GetDistance(OWL::MeasurementPoint::RoadStart)));
-        }
-        return previousResult;
-    }},
-    std::nullopt,
-    worldData);
+        return laneStream.Traverse<std::optional<units::angle::radian_t>>(LaneMultiStream::TraversedFunction<std::optional<units::angle::radian_t>>{[&](const auto &lane, const auto &previousResult) {
+                                                                              if (lane.StartS() <= position && lane.EndS() >= position)
+                                                                              {
+                                                                                  return std::optional<units::angle::radian_t>(std::in_place_t(), lane.element->GetDirection(lane.GetElementPosition(position) + lane.element->GetDistance(OWL::MeasurementPoint::RoadStart)));
+                                                                              }
+                                                                              return previousResult;
+                                                                          }},
+                                                                          std::nullopt,
+                                                                          worldData);
 }
 
-double CalculatePerpendicularDistance(const Common::Vector2d& point, const Common::Line& line)
+units::length::meter_t CalculatePerpendicularDistance(const Common::Vector2d<units::length::meter_t> &point, const Common::Line<units::length::meter_t> &line)
 {
-    const double lamdba = line.directionalVector.Dot(point - line.startPoint)
-                    / line.directionalVector.Dot(line.directionalVector);
-    Common::Vector2d foot = line.startPoint + line.directionalVector * lamdba;
-    Common::Vector2d vectorToLeft{-line.directionalVector.y, line.directionalVector.x};
-    Common::Vector2d distance = point - foot;
-    bool isLeft = distance.Dot(vectorToLeft) >= 0;
-    return isLeft ? distance.Length() : -distance.Length();
+        const double lamdba = line.directionalVector.Dot(point - line.startPoint) / line.directionalVector.Dot(line.directionalVector);
+        Common::Vector2d<units::length::meter_t> foot = line.startPoint + line.directionalVector * lamdba;
+        Common::Vector2d<units::length::meter_t> vectorToLeft{-line.directionalVector.y, line.directionalVector.x};
+        Common::Vector2d<units::length::meter_t> distance = point - foot;
+        bool isLeft = distance.Dot(vectorToLeft) >= 0;
+        return isLeft ? distance.Length() : -distance.Length();
 }
 
-std::optional<Position> WorldDataQuery::CalculatePositionIfOnLane(double sCoordinate, double tCoordinate, const OWL::Interfaces::Lane& lane) const
+std::optional<Position> WorldDataQuery::CalculatePositionIfOnLane(units::length::meter_t sCoordinate, units::length::meter_t tCoordinate, const OWL::Interfaces::Lane &lane) const
 {
-    const double laneStart = lane.GetDistance(OWL::MeasurementPoint::RoadStart);
-    const double laneEnd = lane.GetDistance(OWL::MeasurementPoint::RoadEnd);
-    if (sCoordinate >= laneStart && sCoordinate <= laneEnd)
-    {
-        return GetPositionByDistanceAndLane(lane, sCoordinate, tCoordinate);
-    }
-    else
-    {
-        return std::nullopt;
-    }
+        const auto laneStart = lane.GetDistance(OWL::MeasurementPoint::RoadStart);
+        const auto laneEnd = lane.GetDistance(OWL::MeasurementPoint::RoadEnd);
+        if (sCoordinate >= laneStart && sCoordinate <= laneEnd)
+        {
+            return GetPositionByDistanceAndLane(lane, sCoordinate, tCoordinate);
+        }
+        else
+        {
+            return std::nullopt;
+        }
 }
 
 RouteQueryResult<Obstruction> WorldDataQuery::GetObstruction(const LaneMultiStream &laneStream,
-                                                             double tCoordinate,
-                                                             const std::map<ObjectPoint, Common::Vector2d> &points,
+                                                             units::length::meter_t tCoordinate,
+                                                             const std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> &points,
                                                              const RoadIntervals &touchedRoads) const
 {
     return laneStream.Traverse<Obstruction, std::pair<std::optional<Position>,std::optional<Position>>>(LaneMultiStream::TraversedFunction<Obstruction, std::pair<std::optional<Position>,std::optional<Position>>>
@@ -1215,8 +1194,8 @@ RouteQueryResult<Obstruction> WorldDataQuery::GetObstruction(const LaneMultiStre
          {
              return std::make_tuple(previousResult, std::make_pair(firstPoint, secondPoint));
          }
-         const double objectStart = it->second.sMin.roadPosition.s;
-         const double objectEnd = it->second.sMax.roadPosition.s;
+         const auto objectStart = it->second.sMin.roadPosition.s;
+         const auto objectEnd = it->second.sMax.roadPosition.s;
          if (lane.inStreamDirection)
          {
              if(!firstPoint)
@@ -1244,10 +1223,10 @@ RouteQueryResult<Obstruction> WorldDataQuery::GetObstruction(const LaneMultiStre
              return std::make_tuple(Obstruction::Invalid(), std::make_pair(firstPoint, secondPoint));
          }
 
-         std::map<ObjectPoint, double> lateralDistances{};
+         std::map<ObjectPoint, units::length::meter_t> lateralDistances{};
          for (const auto& [objectPoint, pointPosition] : points)
          {
-             double distance = CalculatePerpendicularDistance(pointPosition, Common::Line{{firstPoint.value().xPos, firstPoint.value().yPos}, {secondPoint.value().xPos, secondPoint.value().yPos}});
+             auto distance = CalculatePerpendicularDistance(pointPosition, Common::Line<units::length::meter_t>{{firstPoint.value().xPos, firstPoint.value().yPos}, {secondPoint.value().xPos, secondPoint.value().yPos}});
              lateralDistances[objectPoint] = distance;
          }
          return std::make_tuple(Obstruction{lateralDistances}, std::make_pair(firstPoint, secondPoint));
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldDataQuery.h b/sim/src/core/opSimulation/modules/World_OSI/WorldDataQuery.h
index 1774eefe282a357baa4dce11b89cd583ae052ec5..32687b15e06c0caaa5dd6c388a73fb4a27bdbb52 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldDataQuery.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldDataQuery.h
@@ -10,34 +10,35 @@
  ********************************************************************************/
 #pragma once
 
+#include <algorithm>
 #include <numeric>
-#include <utility>
 #include <tuple>
+#include <utility>
+
 #include "OWL/DataTypes.h"
-#include "WorldData.h"
 #include "RoadStream.h"
-#include <numeric>
-#include <algorithm>
+#include "WorldData.h"
 
 //! This class represents one element of a Stream. StreamInfo can contain elements of the following types:
 //! OWL::Lane
 //! OWL::Road
-template<typename T>
+template <typename T>
 struct StreamInfo
 {
-    const T* element;  //!element represented by this object
-    double sOffset;         //!S Offset of the start point of the element from the beginning of the stream
-    bool inStreamDirection; //!Specifies whether the direction of the element is the same as the direction of the stream
+    const T *element;               //!element represented by this object
+    units::length::meter_t sOffset; //!S Offset of the start point of the element from the beginning of the stream
+    bool inStreamDirection;         //!Specifies whether the direction of the element is the same as the direction of the stream
 
-    StreamInfo () = default;
+    StreamInfo() = default;
 
-    StreamInfo (const T* element, double sOffset, bool inStreamDirection) :
+    StreamInfo(const T *element, units::length::meter_t sOffset, bool inStreamDirection) :
         element(element),
         sOffset(sOffset),
         inStreamDirection(inStreamDirection)
-    {}
+    {
+    }
 
-    const T& operator()() const
+    const T &operator()() const
     {
         return *element;
     }
@@ -46,26 +47,26 @@ struct StreamInfo
     //!
     //! \param elementPosition position relative to the start of the element
     //! \return position relative to the start of the element stream
-    double GetStreamPosition (double elementPosition) const
+    units::length::meter_t GetStreamPosition(units::length::meter_t elementPosition) const
     {
         return sOffset + (inStreamDirection ? elementPosition : -elementPosition);
     }
 
-    double GetElementPosition (double streamPosition) const
+    units::length::meter_t GetElementPosition(units::length::meter_t streamPosition) const
     {
         return inStreamDirection ? streamPosition - sOffset : sOffset - streamPosition;
     }
 
     //! Returns the element stream position of the start of lane
-    double StartS () const
+    units::length::meter_t StartS() const
     {
-        return sOffset - (inStreamDirection ? 0 : element->GetLength());
+        return sOffset - (inStreamDirection ? 0_m : element->GetLength());
     }
 
     //! Returns the element stream position of the end of lane
-    double EndS () const
+    units::length::meter_t EndS() const
     {
-        return sOffset + (inStreamDirection ? element->GetLength() : 0);
+        return sOffset + (inStreamDirection ? element->GetLength() : 0_m);
     }
 };
 
@@ -74,16 +75,17 @@ struct StreamInfo
 //! The elements supported by this class are:
 //! OWL::Lane*
 //! OWL::Road*
-template<typename T>
+template <typename T>
 class Stream
 {
 public:
     Stream() = default;
-    explicit Stream(const std::vector<StreamInfo<T>>& elements) :
+    explicit Stream(const std::vector<StreamInfo<T>> &elements) :
         elements(elements)
-    {}
+    {
+    }
 
-    const std::vector<StreamInfo<T>>& GetElements() const
+    const std::vector<StreamInfo<T>> &GetElements() const
     {
         return elements;
     }
@@ -93,13 +95,13 @@ public:
 
     //! Transform the sCoordinate on the given element to a position on the stream
     //! The element must be part of the stream
-    double GetPositionByElementAndS(const T& element, double sCoordinate) const;
+    units::length::meter_t GetPositionByElementAndS(const T &element, units::length::meter_t sCoordinate) const;
 
     //! Returns the element and s coordinate corresponding to the given position on the stream
-    std::pair<double, const T*> GetElementAndSByPosition(double position) const;
+    std::pair<units::length::meter_t, const T *> GetElementAndSByPosition(units::length::meter_t position) const;
 
     //! Returns true if the specified element is contained in this element stream, false otherwise
-    bool Contains(const T& element) const;
+    bool Contains(const T &element) const;
 
 private:
     std::vector<StreamInfo<T>> elements;
@@ -113,12 +115,12 @@ using RoadStreamInfo = StreamInfo<OWL::Interfaces::Road>;
 //! The elements supported by this class are:
 //! OWL::Lane*
 //! OWL::Road*
-template<typename T>
+template <typename T>
 class MultiStream
 {
 public:
-    template<typename Result, typename ... Intermediary>
-    using TraversedFunction = std::function<std::tuple<Result, Intermediary ...> (const StreamInfo<T>&, const Result&, const Intermediary& ...)>;
+    template <typename Result, typename... Intermediary>
+    using TraversedFunction = std::function<std::tuple<Result, Intermediary...>(const StreamInfo<T> &, const Result &, const Intermediary &...)>;
 
     struct Node
     {
@@ -126,18 +128,18 @@ public:
         std::vector<Node> next;
         RoadGraphVertex roadGraphVertex;
 
-        template<typename Result, typename ... Intermediary>
-        void Traverse (TraversedFunction<Result, Intermediary...> function,
-                       const Result& previousResult,
-                       const Intermediary& ... intermediaryResults,
-                       RouteQueryResult<Result>& queryResult,
-                       const OWL::Interfaces::WorldData& worldData) const
+        template <typename Result, typename... Intermediary>
+        void Traverse(TraversedFunction<Result, Intermediary...> function,
+                      const Result &previousResult,
+                      const Intermediary &...intermediaryResults,
+                      RouteQueryResult<Result> &queryResult,
+                      const OWL::Interfaces::WorldData &worldData) const
         {
             if (element.has_value())
             {
                 auto result = function(element.value(), previousResult, intermediaryResults...);
                 queryResult[roadGraphVertex] = std::get<Result>(result);
-                for (const auto& successor : next)
+                for (const auto &successor : next)
                 {
                     successor.template Traverse<Result, Intermediary...>(function, std::get<Result>(result), std::get<Intermediary>(result)..., queryResult, worldData);
                 }
@@ -145,20 +147,20 @@ public:
             else
             {
                 queryResult[roadGraphVertex] = previousResult;
-                for (const auto& successor : next)
+                for (const auto &successor : next)
                 {
                     successor.template Traverse<Result, Intermediary...>(function, previousResult, intermediaryResults..., queryResult, worldData);
                 }
             }
         }
 
-        const Node* FindVertex (const RoadGraphVertex& vertex) const
+        const Node *FindVertex(const RoadGraphVertex &vertex) const
         {
             if (roadGraphVertex == vertex)
             {
                 return this;
             }
-            for (const auto& successor : next)
+            for (const auto &successor : next)
             {
                 if (auto foundNode = successor.FindVertex(vertex))
                 {
@@ -170,41 +172,42 @@ public:
     };
 
     MultiStream() = default;
-    explicit MultiStream(const Node& root) :
+    explicit MultiStream(const Node &root) :
         root(root)
-    {}
-
-   const Node& GetRoot() const
-   {
-       return root;
-   }
-
-   template<typename Result, typename ... Intermediary>
-   RouteQueryResult<Result> Traverse (TraversedFunction<Result, Intermediary...> function,
-                                      const Result& zeroResult,
-                                      const Intermediary&... defaultIntermediaryResults,
-                                      const OWL::Interfaces::WorldData& worldData) const
-   {
-       RouteQueryResult<Result> result;
-       root.template Traverse<Result, Intermediary...>(function, zeroResult, defaultIntermediaryResults..., result, worldData);
-       return result;
-   }
-
-   double GetPositionByVertexAndS(const RoadGraphVertex& vertex, double sCoordinate) const
-   {
-       const Node* node = root.FindVertex(vertex);
-       if (!node)
-       {
-           throw std::runtime_error("Cannot find vertex in multistream");
-       }
-       if (!node->element.has_value())
-       {
-           return std::numeric_limits<double>::lowest();
-       }
-       const auto& element = node->element.value();
-       auto distance = element.element->GetDistance(OWL::MeasurementPoint::RoadStart);
-       return element.GetStreamPosition(sCoordinate - distance);
-   }
+    {
+    }
+
+    const Node &GetRoot() const
+    {
+        return root;
+    }
+
+    template <typename Result, typename... Intermediary>
+    RouteQueryResult<Result> Traverse(TraversedFunction<Result, Intermediary...> function,
+                                      const Result &zeroResult,
+                                      const Intermediary &...defaultIntermediaryResults,
+                                      const OWL::Interfaces::WorldData &worldData) const
+    {
+        RouteQueryResult<Result> result;
+        root.template Traverse<Result, Intermediary...>(function, zeroResult, defaultIntermediaryResults..., result, worldData);
+        return result;
+    }
+
+    units::length::meter_t GetPositionByVertexAndS(const RoadGraphVertex &vertex, units::length::meter_t sCoordinate) const
+    {
+        const Node *node = root.FindVertex(vertex);
+        if (!node)
+        {
+            throw std::runtime_error("Cannot find vertex in multistream");
+        }
+        if (!node->element.has_value())
+        {
+            return units::length::meter_t(std::numeric_limits<double>::lowest());
+        }
+        const auto &element = node->element.value();
+        auto distance = element.element->GetDistance(OWL::MeasurementPoint::RoadStart);
+        return element.GetStreamPosition(sCoordinate - distance);
+    }
 
 private:
     Node root;
@@ -217,7 +220,7 @@ using RoadMultiStream = MultiStream<OWL::Interfaces::Road>;
 class WorldDataQuery
 {
 public:
-    WorldDataQuery(const OWL::Interfaces::WorldData& worldData);
+    WorldDataQuery(const OWL::Interfaces::WorldData &worldData);
 
     RouteQueryResult<std::optional<GlobalRoadPosition>> ResolveRelativePoint(const RoadMultiStream &roadStream, ObjectPointRelative relativePoint, const RoadIntervals &touchedRoads) const;
 
@@ -226,16 +229,15 @@ public:
     //! Returns an empty vector if there is no such object within the range
     //! The result is returned for every node.
     //! T can be one of WorldObject, MovingObject or StationaryObject
-    template<typename T>
-    RouteQueryResult<std::vector<const OWL::Interfaces::WorldObject*>> GetObjectsOfTypeInRange(const LaneMultiStream& laneStream,
-                                                                                               const double startDistance,
-                                                                                               const double endDistance) const
+    template <typename T>
+    RouteQueryResult<std::vector<const OWL::Interfaces::WorldObject *>> GetObjectsOfTypeInRange(const LaneMultiStream &laneStream,
+                                                                                                const units::length::meter_t startDistance,
+                                                                                                const units::length::meter_t endDistance) const
     {
-        return laneStream.Traverse<std::vector<const OWL::Interfaces::WorldObject*>>(
-            LaneMultiStream::TraversedFunction<std::vector<const OWL::Interfaces::WorldObject*>>(
-                [&](const LaneStreamInfo& laneStreamElement, const std::vector<const OWL::Interfaces::WorldObject*>& previousOjects)
-                {
-                    std::vector<const OWL::Interfaces::WorldObject*> foundObjects{previousOjects};
+        return laneStream.Traverse<std::vector<const OWL::Interfaces::WorldObject *>>(
+            LaneMultiStream::TraversedFunction<std::vector<const OWL::Interfaces::WorldObject *>>(
+                [&](const LaneStreamInfo &laneStreamElement, const std::vector<const OWL::Interfaces::WorldObject *> &previousOjects) {
+                    std::vector<const OWL::Interfaces::WorldObject *> foundObjects{previousOjects};
 
                     if (laneStreamElement.EndS() < startDistance)
                     {
@@ -247,12 +249,12 @@ public:
                         return foundObjects;
                     }
 
-                    const auto& roadId = laneStreamElement.element->GetRoad().GetId();
+                    const auto &roadId = laneStreamElement.element->GetRoad().GetId();
 
                     const auto streamDirection = laneStreamElement.inStreamDirection;
                     const auto s_lanestart = laneStreamElement.element->GetDistance(OWL::MeasurementPoint::RoadStart);
 
-                    for (const auto& [laneOverlap, object] : laneStreamElement.element->GetWorldObjects(streamDirection))
+                    for (const auto &[laneOverlap, object] : laneStreamElement.element->GetWorldObjects(streamDirection))
                     {
                         const auto s_min = streamDirection ? laneOverlap.sMin.roadPosition.s : laneOverlap.sMax.roadPosition.s;
                         const auto s_max = streamDirection ? laneOverlap.sMax.roadPosition.s : laneOverlap.sMin.roadPosition.s;
@@ -264,7 +266,7 @@ public:
                         }
 
                         auto streamPositionEnd = laneStreamElement.GetStreamPosition(s_max - s_lanestart);
-                        if (dynamic_cast<const T*>(object) && streamPositionEnd >= startDistance)
+                        if (dynamic_cast<const T *>(object) && streamPositionEnd >= startDistance)
                         {
                             if (std::find(foundObjects.crbegin(), foundObjects.crend(), object) == foundObjects.crend())
                             {
@@ -275,8 +277,8 @@ public:
 
                     return foundObjects;
                 }),
-                {},
-                worldData);
+            {},
+            worldData);
     }
 
     //! Iterates over a LaneMultStream until either the type of the next lane does not match one of the specified LaneTypes
@@ -289,15 +291,15 @@ public:
     //! @param initialSearchPosition    start position in stream
     //! @param maxSearchLength          maxmium look ahead distance
     //! @param requestedLaneTypes       filter of LaneTypes
-    RouteQueryResult<double> GetDistanceToEndOfLane(const LaneMultiStream& laneStream, double initialSearchPosition, double maxSearchLength,
-                                                    const std::vector<LaneType>& requestedLaneTypes) const;
+    RouteQueryResult<units::length::meter_t> GetDistanceToEndOfLane(const LaneMultiStream &laneStream, units::length::meter_t initialSearchPosition, units::length::meter_t maxSearchLength,
+                                                                    const std::vector<LaneType> &requestedLaneTypes) const;
 
     //! Checks if given s-coordinate is valid for specified laneId.
     //!
     //! @param roadId OpenDrive id of road
     //! @param laneId OpenDrive Id of lane
     //! @param distance s-coordinate
-    bool IsSValidOnLane(const std::string& roadId, OWL::OdId laneId, double distance);
+    bool IsSValidOnLane(const std::string& roadId, OWL::OdId laneId, units::length::meter_t distance);
 
     //! Returns lane at specified distance.
     //! Returns InvalidLane if there is no lane at given distance and OpenDriveId
@@ -305,7 +307,7 @@ public:
     //! @param odRoadId OpenDrive id of road
     //! @param odLaneId OpendDrive Id of Lane
     //! @param distance s-coordinate
-    OWL::CLane& GetLaneByOdId(const std::string& odRoadId, OWL::OdId odLaneId, double distance) const;
+    OWL::CLane& GetLaneByOdId(const std::string& odRoadId, OWL::OdId odLaneId, units::length::meter_t distance) const;
 
     //! Returns lane at specified distance at given t offset of road
     //! Returns InvalidLane if there is no lane at given distance and OpenDriveId
@@ -314,14 +316,14 @@ public:
     //! @param offset t offset on road
     //! @param distance s-coordinate
     //! @return lane and t offset on lane
-    std::pair<OWL::CLane&, double> GetLaneByOffset(const std::string& odRoadId, double offset, double distance) const;
+    std::pair<OWL::CLane&, units::length::meter_t> GetLaneByOffset(const std::string& odRoadId, units::length::meter_t offset, units::length::meter_t distance) const;
 
     //! Returns section at specified distance.
     //! Returns nullptr if there is no section at given distance
     //!
     //! @param odRaodId ID of road in OpenDrive
     //! @param distance s-coordinate
-    OWL::CSection* GetSectionByDistance(const std::string& odRoadId, double distance) const;
+    OWL::CSection* GetSectionByDistance(const std::string& odRoadId, units::length::meter_t distance) const;
 
     //! Returns the OWL road with the specified OpenDrive id
     OWL::CRoad *GetRoadByOdId(const std::string& odRoadId) const;
@@ -336,8 +338,8 @@ public:
     //!
     //! @param distance s-coordinate
     //! @param requestedLaneTypes filter of laneTypes
-    OWL::CLanes GetLanesOfLaneTypeAtDistance(const std::string& roadId, double distance,
-                                             const std::vector<LaneType>& requestedLaneTypes) const;
+    OWL::CLanes GetLanesOfLaneTypeAtDistance(const std::string &roadId, units::length::meter_t distance,
+                                             const std::vector<LaneType> &requestedLaneTypes) const;
 
     //! Returns all TrafficSigns valid for the lanes in the LaneMultiStream within startDistance and startDistance + searchRange
     //! The result is returned for every node.
@@ -345,7 +347,7 @@ public:
     //! @param laneStream       lane stream to search in
     //! @param startDistance    start position in stream
     //! @param searchRange      range of search (positive)
-    RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetTrafficSignsInRange(LaneMultiStream laneStream, double startDistance, double searchRange) const;
+    RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetTrafficSignsInRange(LaneMultiStream laneStream, units::length::meter_t startDistance, units::length::meter_t searchRange) const;
 
     //! Returns all RoadMarkings valid for the lanes in the LaneMultiStream within startDistance and startDistance + searchRange
     //! The result is returned for every node.
@@ -353,7 +355,7 @@ public:
     //! @param laneStream       lane stream to search in
     //! @param startDistance    start position in stream
     //! @param searchRange      range of search (positive)
-    RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetRoadMarkingsInRange(LaneMultiStream laneStream, double startDistance, double searchRange) const;
+    RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetRoadMarkingsInRange(LaneMultiStream laneStream, units::length::meter_t startDistance, units::length::meter_t searchRange) const;
 
     //! Returns all TrafficLights valid for the lanes in the LaneMultiStream within startDistance and startDistance + searchRange
     //! The result is returned for every node.
@@ -361,7 +363,7 @@ public:
     //! @param laneStream       lane stream to search in
     //! @param startDistance    start position in stream
     //! @param searchRange      range of search (positive)
-    RouteQueryResult<std::vector<CommonTrafficLight::Entity>> GetTrafficLightsInRange(LaneMultiStream laneStream, double startDistance, double searchRange) const;
+    RouteQueryResult<std::vector<CommonTrafficLight::Entity>> GetTrafficLightsInRange(LaneMultiStream laneStream, units::length::meter_t startDistance, units::length::meter_t searchRange) const;
 
     //! Retrieves all lane markings within the given range on the given side of the lane inside the range
     //! The result is returned for every node.
@@ -370,7 +372,7 @@ public:
     //! \param startDistance    start position in stream
     //! \param range            search range
     //! \param side             side of the lane
-    RouteQueryResult<std::vector<LaneMarking::Entity>> GetLaneMarkings(const LaneMultiStream &laneStream, double startDistance, double range, Side side) const;
+    RouteQueryResult<std::vector<LaneMarking::Entity>> GetLaneMarkings(const LaneMultiStream &laneStream, units::length::meter_t startDistance, units::length::meter_t range, Side side) const;
 
     std::vector<JunctionConnection> GetConnectionsOnJunction(std::string junctionId, std::string incomingRoadId) const;
 
@@ -385,7 +387,7 @@ public:
     //!
     //! \param junctionId   OpenDrive id of the junction
     std::vector<JunctionConnectorPriority> GetPrioritiesOnJunction(std::string junctionId) const;
-    
+
     RoadNetworkElement GetRoadSuccessor(std::string roadId) const;
 
     RoadNetworkElement GetRoadPredecessor(std::string roadId) const;
@@ -396,7 +398,7 @@ public:
     //! \param connectingRoadId OpenDrive id of the connector
     //! \param range            Search range measured backwards from the end of the connector
     //! \return moving objects in search range on connecting and incoming road
-    std::vector<const OWL::Interfaces::WorldObject*> GetMovingObjectsInRangeOfJunctionConnection(std::string connectingRoadId, double range) const;
+    std::vector<const OWL::Interfaces::WorldObject *> GetMovingObjectsInRangeOfJunctionConnection(std::string connectingRoadId, units::length::meter_t range) const;
 
     //! Returns the distance from the front of the specified to the first intersection point of its road with the specified connector.
     //! If the object is not yet on the junction all possible route the object can take are considered and the minimum distance is returned
@@ -405,7 +407,7 @@ public:
     //! \param connectingRoadId OpenDrive id of connector intersecting with the route of the object
     //!
     //! \return distance of object to first intersection with connecting road
-    double GetDistanceUntilObjectEntersConnector(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const;
+    units::length::meter_t GetDistanceUntilObjectEntersConnector(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const;
 
     //! Returns the distance from the rear of the specified to the last intersection point of its road with the specified connector.
     //! If the object is not yet on the junction all possible route the object can take are considered and the maximum distance is returned
@@ -414,7 +416,7 @@ public:
     //! \param connectingRoadId OpenDrive id of connector intersecting with the route of the object
     //!
     //! \return distance of rear of object to last intersection with connecting road
-    double GetDistanceUntilObjectLeavesConnector(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const;
+    units::length::meter_t GetDistanceUntilObjectLeavesConnector(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const;
 
     //! Creates a LaneMultiStream that contains the OWL lanes out of a roadGraph.
     //!
@@ -423,7 +425,7 @@ public:
     //! \param startLaneId      OpenDrive id of the lane at the root, where the lane stream should start
     //! \param startDistance    s coordinate at the root, where the lane stream should start
     //! \return     LaneMultiStream starting with the specified lane and containing all consecutive lanes that are also contained in the given road graph
-    std::shared_ptr<const LaneMultiStream> CreateLaneMultiStream(const RoadGraph& roadGraph, RoadGraphVertex start, OWL::OdId startLaneId, double startDistance) const;
+    std::shared_ptr<const LaneMultiStream> CreateLaneMultiStream(const RoadGraph &roadGraph, RoadGraphVertex start, OWL::OdId startLaneId, units::length::meter_t startDistance) const;
 
     //! \brief Creates a RoadStream from the given route
     //!
@@ -431,14 +433,14 @@ public:
     //!
     //! \return a RoadStream across the Roads specified in route
     //!
-    std::unique_ptr<RoadStream> CreateRoadStream(const std::vector<RouteElement>& route) const;
+    std::unique_ptr<RoadStream> CreateRoadStream(const std::vector<RouteElement> &route) const;
 
     //! Creates a RoadMultiStream that contains the OWL roads out of a roadGraph.
     //!
     //! \param roadGraph        road graph to convert, must be a tree
     //! \param start            root of the tree
     //! \return     LaneMultiStream starting with the specified road and containing all consecutive roads that are also contained in the given road graph
-    std::shared_ptr<const RoadMultiStream> CreateRoadMultiStream(const RoadGraph& roadGraph, RoadGraphVertex start) const;
+    std::shared_ptr<const RoadMultiStream> CreateRoadMultiStream(const RoadGraph &roadGraph, RoadGraphVertex start) const;
 
     //! \brief GetDistanceBetweenObjects gets the distance between two ObjectPositions on a RoadStream
     //!
@@ -448,8 +450,8 @@ public:
     //! \param[in]    targetObject       Target object from whom the distance is calculated (if this object is behind, the distance is negative)
     //!
     //! \return The distance between object and targetObject on roadStream
-    RouteQueryResult<std::optional<double>> GetDistanceBetweenObjects(const RoadMultiStream& roadStream,
-                                                                      const double ownStreamPosition,
+    RouteQueryResult<std::optional<units::length::meter_t>> GetDistanceBetweenObjects(const RoadMultiStream& roadStream,
+                                                                      const units::length::meter_t ownStreamPosition,
                                                                       const GlobalRoadPositions& target) const;
 
     //! Calculates the obstruction with an object i.e. how far to left or the right the object is from my position
@@ -461,8 +463,8 @@ public:
     //! \param objectCorners    corners of the other object
     //! \return obstruction with other object
     RouteQueryResult<Obstruction> GetObstruction(const LaneMultiStream &laneStream,
-                                                 double tCoordinate,
-                                                 const std::map<ObjectPoint, Common::Vector2d> &points,
+                                                 units::length::meter_t tCoordinate,
+                                                 const std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> &points,
                                                  const RoadIntervals &touchedRoads) const;
 
     //! Returns the world position that corresponds to a position on a lane
@@ -470,7 +472,7 @@ public:
     //! \param lane             lane in the network
     //! \param distanceOnLane   s coordinate on the lane
     //! \param offset           t coordinate on the lane
-    Position GetPositionByDistanceAndLane(const OWL::Interfaces::Lane& lane, double distanceOnLane, double offset) const;
+    Position GetPositionByDistanceAndLane(const OWL::Interfaces::Lane &lane, units::length::meter_t distanceOnLane, units::length::meter_t offset) const;
 
     //! Returns the relative distances (start and end) and the connecting road id of all junctions on the road stream in range
     //!
@@ -478,7 +480,7 @@ public:
     //! \param startPosition    start search position on the road stream
     //! \param range            range of search
     //! \return information about all junctions in range
-    [[deprecated]] RouteQueryResult<RelativeWorldView::Roads> GetRelativeJunctions(const RoadMultiStream &roadStream, double startPosition, double range) const;
+    [[deprecated]] RouteQueryResult<RelativeWorldView::Roads> GetRelativeJunctions(const RoadMultiStream &roadStream, units::length::meter_t startPosition, units::length::meter_t range) const;
 
     //! Returns the relative distances (start and end) and the road id of all roads on the road stream in range
     //!
@@ -486,7 +488,7 @@ public:
     //! \param startPosition    start search position on the road stream
     //! \param range            range of search
     //! \return information about all roads in range
-    RouteQueryResult<RelativeWorldView::Roads> GetRelativeRoads(const RoadMultiStream& roadStream, double startPosition, double range) const;
+    RouteQueryResult<RelativeWorldView::Roads> GetRelativeRoads(const RoadMultiStream& roadStream, units::length::meter_t startPosition, units::length::meter_t range) const;
 
     //! Returns information about all lanes on the roadStream in range. These info are the relative distances (start and end),
     //! the laneId relative to the ego lane, the successors and predecessors if existing and the information wether the intended
@@ -499,7 +501,7 @@ public:
     //! \param range            range of search
     //! \param includeOncoming  indicating whether oncoming lanes should be included
     //! \return information about all lanes in range
-    RouteQueryResult<RelativeWorldView::Lanes> GetRelativeLanes(const RoadMultiStream& roadStream, double startPosition, int startLaneId, double range, bool includeOncoming) const;
+    RouteQueryResult<RelativeWorldView::Lanes> GetRelativeLanes(const RoadMultiStream &roadStream, units::length::meter_t startPosition, int startLaneId, units::length::meter_t range, bool includeOncoming) const;
 
     //! Returns the relative lane id of the located position of a point relative to the given position
     //!
@@ -509,13 +511,14 @@ public:
     //! \param ownLaneId        id of own lane
     //! \param targetPosition   position of queried point
     //! \return lane id relative to own position
-    RouteQueryResult<std::optional<int>> GetRelativeLaneId(const RoadMultiStream& roadStream, double ownPosition, int ownLaneId, GlobalRoadPositions targetPosition) const;
+    RouteQueryResult<std::optional<int>> GetRelativeLaneId(const RoadMultiStream &roadStream, units::length::meter_t ownPosition, int ownLaneId, GlobalRoadPositions targetPosition) const;
+
+    RouteQueryResult<std::optional<units::curvature::inverse_meter_t>> GetLaneCurvature(const LaneMultiStream &laneStream, units::length::meter_t position) const;
 
-    RouteQueryResult<std::optional<double>> GetLaneCurvature (const LaneMultiStream& laneStream, double position) const;
+    RouteQueryResult<std::optional<units::length::meter_t>> GetLaneWidth(const LaneMultiStream &laneStream, units::length::meter_t position) const;
 
-    RouteQueryResult<std::optional<double>> GetLaneWidth (const LaneMultiStream& laneStream, double position) const;
+    RouteQueryResult<std::optional<units::angle::radian_t>> GetLaneDirection(const LaneMultiStream &laneStream, units::length::meter_t position) const;
 
-    RouteQueryResult<std::optional<double>> GetLaneDirection (const LaneMultiStream& laneStream, double position) const;
 
     //! Returns the weight of the path for randomized route generation
     //!
@@ -524,28 +527,28 @@ public:
     std::map<RoadGraphEdge, double> GetEdgeWeights(const RoadGraph& roadGraph) const;
 
 private:
-    const OWL::Interfaces::WorldData& worldData;
+    const OWL::Interfaces::WorldData &worldData;
 
     //! Returns the most upstream lane on the specified route such that there is a continous stream of lanes regarding successor/predecessor relation
     //! up to the start lane
-    OWL::CLane* GetOriginatingRouteLane(std::vector<RouteElement> route, std::string startRoadId, OWL::OdId startLaneId, double startDistance) const;
-    
-    OWL::CRoad* GetOriginatingRouteRoad(const std::vector<std::string>& route, const std::string& startRoadId, const OWL::OdId startLaneId, const double startDistance) const;
+    OWL::CLane *GetOriginatingRouteLane(std::vector<RouteElement> route, std::string startRoadId, OWL::OdId startLaneId, units::length::meter_t startDistance) const;
+
+    OWL::CRoad *GetOriginatingRouteRoad(const std::vector<std::string> &route, const std::string &startRoadId, const OWL::OdId startLaneId, const units::length::meter_t startDistance) const;
 
     //! Returns the ids of the stream of roads leading the connecting road including the connecting road itself
     std::tuple<RoadGraph, RoadGraphVertex, RoadGraphVertex> GetRouteLeadingToConnector(std::string connectingRoadId) const;
 
     //! Returns the WorldPosition corresponding to the (s,t) position on the lane, if s is valid on the lane
     //! Otherwise the bool in the pair is false
-    std::optional<Position> CalculatePositionIfOnLane(double sCoordinate, double tCoordinate, const OWL::Interfaces::Lane& lane) const;
+    std::optional<Position> CalculatePositionIfOnLane(units::length::meter_t sCoordinate, units::length::meter_t tCoordinate, const OWL::Interfaces::Lane &lane) const;
 
-    int FindNextEgoLaneId(const OWL::Interfaces::Lanes& lanesOnSection, bool inStreamDirection, std::map<int, OWL::Id> previousSectionLaneIds) const;
+    int FindNextEgoLaneId(const OWL::Interfaces::Lanes &lanesOnSection, bool inStreamDirection, std::map<int, OWL::Id> previousSectionLaneIds) const;
 
-    std::map<int, OWL::Id> AddLanesOfSection(const OWL::Interfaces::Lanes& lanesOnSection, bool inStreamDirection,
-                                             int currentOwnLaneId, bool includeOncoming, const std::map<int, OWL::Id>& previousSectionLaneIds,
-                                             std::vector<RelativeWorldView::Lane>& previousSectionLanes, RelativeWorldView::LanesInterval& laneInterval) const;
+    std::map<int, OWL::Id> AddLanesOfSection(const OWL::Interfaces::Lanes &lanesOnSection, bool inStreamDirection,
+                                             int currentOwnLaneId, bool includeOncoming, const std::map<int, OWL::Id> &previousSectionLaneIds,
+                                             std::vector<RelativeWorldView::Lane> &previousSectionLanes, RelativeWorldView::LanesInterval &laneInterval) const;
 
-    RoadMultiStream::Node CreateRoadMultiStreamRecursive(const RoadGraph& roadGraph, const RoadGraphVertex& current, double sOffset) const;
+    RoadMultiStream::Node CreateRoadMultiStreamRecursive(const RoadGraph &roadGraph, const RoadGraphVertex &current, units::length::meter_t sOffset) const;
 
-    LaneMultiStream::Node CreateLaneMultiStreamRecursive(const RoadGraph& roadGraph, const RoadGraphVertex& current, double sOffset, const OWL::Lane* lane) const;
+    LaneMultiStream::Node CreateLaneMultiStreamRecursive(const RoadGraph &roadGraph, const RoadGraphVertex &current, units::length::meter_t sOffset, const OWL::Lane *lane) const;
 };
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldEntities.h b/sim/src/core/opSimulation/modules/World_OSI/WorldEntities.h
index 4919bbc2eab42649ae165bd4133653d9f4a94e4b..8a7e79c22044e795499bca866020adb6e3f0ded7 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldEntities.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldEntities.h
@@ -26,16 +26,13 @@ using namespace std::string_literals;
  * @param metainfo The metainfo, which shall be published with the entity
  * @return The entity info 
  */
-[[nodiscard]] const openpass::type::EntityInfo GetEntityInfo(const AgentBlueprintInterface& agentBlueprint)
+[[nodiscard]] const openpass::type::EntityInfo GetEntityInfo(const AgentBuildInstructions &agentBuildInstructions)
 {
     return {
         ENTITY_SOURCE,
-        {
-            {"type"s, openpass::utils::to_string(agentBlueprint.GetAgentCategory())},
-            {"name"s, agentBlueprint.GetObjectName()},
-            {"subtype"s, openpass::utils::to_string(agentBlueprint.GetVehicleModelParameters().vehicleType)}
-        }
-    };
+        {{"type"s, openpass::utils::to_string(agentBuildInstructions.agentCategory)},
+         {"name"s, agentBuildInstructions.name},
+         {"subtype"s, openpass::utils::to_string(agentBuildInstructions.entityProperties->type)}}};
 }
 
 } // namespace openpass::utils
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldImplementation.cpp b/sim/src/core/opSimulation/modules/World_OSI/WorldImplementation.cpp
index a87bcf2ee0b754bbf65b3dcee45147459cb725ce..7fe48788501bbb88c09caa14843ade64e827adc3 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldImplementation.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldImplementation.cpp
@@ -11,33 +11,34 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-#include "WorldData.h"
 #include "WorldImplementation.h"
-#include "common/RoutePlanning/RouteCalculation.h"
+
 #include "EntityRepository.h"
+#include "WorldData.h"
 #include "WorldEntities.h"
-
+#include "common/RoutePlanning/RouteCalculation.h"
 #include "osi3/osi_sensorview.pb.h"
 #include "osi3/osi_sensorviewconfiguration.pb.h"
 
 namespace {
-    template <typename T>
-    static std::vector<const T*> get_transformed(const std::vector<const OWL::Interfaces::WorldObject*>& worldObjects)
-    {
-        std::vector<const T*> transformedContainer;
-        std::transform(worldObjects.begin(), worldObjects.end(), std::back_inserter(transformedContainer),
-                       [](const OWL::Interfaces::WorldObject* object){ return object->GetLink<T>(); });
-        return transformedContainer;
-    }
+template <typename T>
+static std::vector<const T *> get_transformed(const std::vector<const OWL::Interfaces::WorldObject *> &worldObjects)
+{
+    std::vector<const T *> transformedContainer;
+    std::transform(worldObjects.begin(), worldObjects.end(), std::back_inserter(transformedContainer),
+                   [](const OWL::Interfaces::WorldObject *object) { return object->GetLink<T>(); });
+    return transformedContainer;
 }
+} // namespace
 
-WorldImplementation::WorldImplementation(const CallbackInterface* callbacks, StochasticsInterface* stochastics, DataBufferWriteInterface* dataBuffer):
+WorldImplementation::WorldImplementation(const CallbackInterface *callbacks, StochasticsInterface *stochastics, DataBufferWriteInterface *dataBuffer) :
     agentNetwork(this, callbacks),
     callbacks(callbacks),
     dataBuffer(dataBuffer),
     repository(dataBuffer),
     worldData(callbacks)
-{}
+{
+}
 
 WorldImplementation::~WorldImplementation()
 {
@@ -48,7 +49,7 @@ AgentInterface *WorldImplementation::GetAgent(int id) const
     return agentNetwork.GetAgent(id);
 }
 
-const std::vector<const WorldObjectInterface*>& WorldImplementation::GetWorldObjects() const
+const std::vector<const WorldObjectInterface *> &WorldImplementation::GetWorldObjects() const
 {
     return worldObjects;
 }
@@ -56,7 +57,7 @@ const std::vector<const WorldObjectInterface*>& WorldImplementation::GetWorldObj
 std::map<int, AgentInterface *> WorldImplementation::GetAgents()
 {
     std::map<int, AgentInterface *> agents;
-    for (auto& agent : agentNetwork.GetAgents())
+    for (auto &agent : agentNetwork.GetAgents())
     {
         agents.insert({agent.GetId(), &agent});
     }
@@ -68,17 +69,17 @@ const std::vector<int> WorldImplementation::GetRemovedAgentsInPreviousTimestep()
     return agentNetwork.GetRemovedAgentsInPreviousTimestep();
 }
 
-const std::vector<const TrafficObjectInterface*>& WorldImplementation::GetTrafficObjects() const
+const std::vector<const TrafficObjectInterface *> &WorldImplementation::GetTrafficObjects() const
 {
     return trafficObjects;
 }
 
-const TrafficRules& WorldImplementation::GetTrafficRules() const
+const TrafficRules &WorldImplementation::GetTrafficRules() const
 {
     return worldParameter.trafficRules;
 }
 
-void WorldImplementation::ExtractParameter(ParameterInterface* parameters)
+void WorldImplementation::ExtractParameter(ParameterInterface *parameters)
 {
     auto intParameter = parameters->GetParametersInt();
     auto doubleParameter = parameters->GetParametersDouble();
@@ -86,7 +87,7 @@ void WorldImplementation::ExtractParameter(ParameterInterface* parameters)
     auto boolParameter = parameters->GetParametersBool();
 
     worldParameter.timeOfDay = stringParameter.at("TimeOfDay");
-    worldParameter.visibilityDistance = intParameter.at("VisibilityDistance");
+    worldParameter.visibilityDistance = units::length::meter_t(intParameter.at("VisibilityDistance"));
     worldParameter.friction = doubleParameter.at("Friction");
     worldParameter.weather = stringParameter.at("Weather");
 
@@ -141,7 +142,7 @@ void WorldImplementation::Clear()
     }
 }
 
-void* WorldImplementation::GetWorldData()
+void *WorldImplementation::GetWorldData()
 {
     return &worldData;
 }
@@ -157,12 +158,12 @@ void WorldImplementation::QueueAgentUpdate(std::function<void()> func)
     agentNetwork.QueueAgentUpdate(func);
 }
 
-void WorldImplementation::QueueAgentRemove(const AgentInterface* agent)
+void WorldImplementation::QueueAgentRemove(const AgentInterface *agent)
 {
     agentNetwork.QueueAgentRemove(agent);
 }
 
-void WorldImplementation::RemoveAgent(const AgentInterface* agent)
+void WorldImplementation::RemoveAgent(const AgentInterface *agent)
 {
     worldData.RemoveMovingObjectById(agent->GetId());
     auto it = std::find(worldObjects.begin(), worldObjects.end(), agent);
@@ -175,8 +176,7 @@ void WorldImplementation::RemoveAgent(const AgentInterface* agent)
 void WorldImplementation::PublishGlobalData(int timestamp)
 {
     agentNetwork.PublishGlobalData(
-        [&](openpass::type::EntityId id, openpass::type::FlatParameterKey key, openpass::type::FlatParameterValue value)
-        {
+        [&](openpass::type::EntityId id, openpass::type::FlatParameterKey key, openpass::type::FlatParameterValue value) {
             dataBuffer->PutCyclic(id, key, value);
         });
 
@@ -200,7 +200,7 @@ void WorldImplementation::SyncGlobalData(int timestamp)
     worldData.ResetTemporaryMemory();
 }
 
-bool WorldImplementation::CreateScenery(const SceneryInterface* scenery, const SceneryDynamicsInterface& sceneryDynamics, const TurningRates& turningRates)
+bool WorldImplementation::CreateScenery(const SceneryInterface* scenery, const TurningRates& turningRates)
 {
     this->scenery = scenery;
     sceneryConverter = std::make_unique<SceneryConverter>(scenery,
@@ -218,22 +218,28 @@ bool WorldImplementation::CreateScenery(const SceneryInterface* scenery, const S
     auto [roadGraph, vertexMapping] = networkBuilder.Build();
     worldData.SetRoadGraph(std::move(roadGraph), std::move(vertexMapping));
     worldData.SetTurningRates(turningRates);
-    worldData.SetEnvironment(sceneryDynamics.GetEnvironment());
 
-    trafficLightNetwork = TrafficLightNetworkBuilder::Build(sceneryDynamics.GetTrafficSignalControllers(), worldData);
+    //TODO Add TrafficSignalControllers in mantleapi 
+    //trafficLightNetwork = TrafficLightNetworkBuilder::Build(sceneryDynamics.GetTrafficSignalControllers(), worldData);
     auto it = trafficLightNetwork.getOsiTrafficLightIds();
     dataBuffer->PutStatic("TrafficLights", it, false);
     return true;
 }
 
-AgentInterface &WorldImplementation::CreateAgentAdapter(const AgentBlueprintInterface& agentBlueprint)
+void WorldImplementation::SetWeather(const mantle_api::Weather& weather)
+{
+    worldData.SetEnvironment(weather);
+}
+
+
+AgentInterface &WorldImplementation::CreateAgentAdapter(const AgentBuildInstructions &agentBuildInstructions)
 {
     const auto id = repository.Register(openpass::entity::EntityType::MovingObject,
-                                        openpass::utils::GetEntityInfo(agentBlueprint));
+                                        openpass::utils::GetEntityInfo(agentBuildInstructions));
     auto &movingObject = worldData.AddMovingObject(id);
     auto &agent = agentNetwork.CreateAgent(movingObject, this, callbacks, localizer);
     movingObject.SetLink(&agent);
-    agent.InitParameter(agentBlueprint);
+    agent.InitParameter(agentBuildInstructions);
     worldObjects.push_back(&agent);
     return agent;
 }
@@ -243,7 +249,7 @@ std::string WorldImplementation::GetTimeOfDay() const
     return worldParameter.timeOfDay;
 }
 
-double WorldImplementation::GetVisibilityDistance() const
+units::length::meter_t WorldImplementation::GetVisibilityDistance() const
 {
     return worldParameter.visibilityDistance;
 }
@@ -253,45 +259,45 @@ double WorldImplementation::GetFriction() const
     return worldParameter.friction;
 }
 
-RouteQueryResult<std::vector<CommonTrafficSign::Entity>> WorldImplementation::GetTrafficSignsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double searchRange) const
+RouteQueryResult<std::vector<CommonTrafficSign::Entity>> WorldImplementation::GetTrafficSignsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t searchRange) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, startDistance);
-    double startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
+    const auto startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
     return worldDataQuery.GetTrafficSignsInRange(*laneMultiStream, startDistanceOnStream, searchRange);
 }
 
-RouteQueryResult<std::vector<CommonTrafficSign::Entity> > WorldImplementation::GetRoadMarkingsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double searchRange) const
+RouteQueryResult<std::vector<CommonTrafficSign::Entity>> WorldImplementation::GetRoadMarkingsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t searchRange) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, startDistance);
-    double startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
+    const auto startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
     return worldDataQuery.GetRoadMarkingsInRange(*laneMultiStream, startDistanceOnStream, searchRange);
 }
 
-RouteQueryResult<std::vector<CommonTrafficLight::Entity>> WorldImplementation::GetTrafficLightsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double searchRange) const
+RouteQueryResult<std::vector<CommonTrafficLight::Entity>> WorldImplementation::GetTrafficLightsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t searchRange) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, startDistance);
-    double startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
+    auto startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
     return worldDataQuery.GetTrafficLightsInRange(*laneMultiStream, startDistanceOnStream, searchRange);
 }
 
-RouteQueryResult<std::vector<LaneMarking::Entity> > WorldImplementation::GetLaneMarkings(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double range, Side side) const
+RouteQueryResult<std::vector<LaneMarking::Entity>> WorldImplementation::GetLaneMarkings(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t range, Side side) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, startDistance);
-    double startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
+    const auto startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
     return worldDataQuery.GetLaneMarkings(*laneMultiStream, startDistanceOnStream, range, side);
 }
 
-RouteQueryResult<RelativeWorldView::Roads> WorldImplementation::GetRelativeJunctions(const RoadGraph &roadGraph, RoadGraphVertex startNode, double startDistance, double range) const
+RouteQueryResult<RelativeWorldView::Roads> WorldImplementation::GetRelativeJunctions(const RoadGraph &roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range) const
 {
     const auto roadMultiStream = worldDataQuery.CreateRoadMultiStream(roadGraph, startNode);
-    double startDistanceOnStream = roadMultiStream->GetPositionByVertexAndS(startNode, startDistance);
+    const auto startDistanceOnStream = roadMultiStream->GetPositionByVertexAndS(startNode, startDistance);
     return worldDataQuery.GetRelativeJunctions(*roadMultiStream, startDistanceOnStream, range);
 }
 
-RouteQueryResult<RelativeWorldView::Roads> WorldImplementation::GetRelativeRoads(const RoadGraph& roadGraph, RoadGraphVertex startNode, double startDistance, double range) const
+RouteQueryResult<RelativeWorldView::Roads> WorldImplementation::GetRelativeRoads(const RoadGraph& roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range) const
 {
     const auto roadMultiStream = worldDataQuery.CreateRoadMultiStream(roadGraph, startNode);
-    double startDistanceOnStream = roadMultiStream->GetPositionByVertexAndS(startNode, startDistance);
+    const auto startDistanceOnStream = roadMultiStream->GetPositionByVertexAndS(startNode, startDistance);
     return worldDataQuery.GetRelativeRoads(*roadMultiStream, startDistanceOnStream, range);
 }
 
@@ -320,13 +326,13 @@ RoadNetworkElement WorldImplementation::GetRoadPredecessor(std::string roadId) c
     return worldDataQuery.GetRoadPredecessor(roadId);
 }
 
-std::pair<RoadGraph, RoadGraphVertex> WorldImplementation::GetRoadGraph(const RouteElement& start, int maxDepth, bool inDrivingDirection) const
+std::pair<RoadGraph, RoadGraphVertex> WorldImplementation::GetRoadGraph(const RouteElement &start, int maxDepth, bool inDrivingDirection) const
 {
     auto startVertex = worldData.GetRoadGraphVertexMapping().at(start);
     return RouteCalculation::FilterRoadGraphByStartPosition(worldData.GetRoadGraph(), startVertex, maxDepth, inDrivingDirection);
 }
 
-std::map<RoadGraphEdge, double> WorldImplementation::GetEdgeWeights(const RoadGraph& roadGraph) const
+std::map<RoadGraphEdge, double> WorldImplementation::GetEdgeWeights(const RoadGraph &roadGraph) const
 {
     return worldDataQuery.GetEdgeWeights(roadGraph);
 }
@@ -336,9 +342,9 @@ std::unique_ptr<RoadStreamInterface> WorldImplementation::GetRoadStream(const st
     return worldDataQuery.CreateRoadStream(route);
 }
 
-AgentInterface* WorldImplementation::GetEgoAgent()
+AgentInterface *WorldImplementation::GetEgoAgent()
 {
-    for (auto& agent : agentNetwork.GetAgents())
+    for (auto &agent : agentNetwork.GetAgents())
     {
         if (agent.IsEgoAgent())
         {
@@ -349,9 +355,9 @@ AgentInterface* WorldImplementation::GetEgoAgent()
     return nullptr;
 }
 
-AgentInterface* WorldImplementation::GetAgentByName(const std::string& scenarioName)
+AgentInterface *WorldImplementation::GetAgentByName(const std::string &scenarioName)
 {
-    for (auto& agent : agentNetwork.GetAgents())
+    for (auto &agent : agentNetwork.GetAgents())
     {
         if (agent.GetScenarioName() == (scenarioName))
         {
@@ -369,96 +375,96 @@ RouteQueryResult<std::optional<GlobalRoadPosition>> WorldImplementation::Resolve
 }
 
 RouteQueryResult<Obstruction> WorldImplementation::GetObstruction(const RoadGraph &roadGraph, RoadGraphVertex startNode, const GlobalRoadPosition &ownPosition,
-                                                                  const std::map<ObjectPoint, Common::Vector2d> &points, const RoadIntervals &touchedRoads) const
+                                                                  const std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> &points, const RoadIntervals &touchedRoads) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, ownPosition.laneId, ownPosition.roadPosition.s);
     return worldDataQuery.GetObstruction(*laneMultiStream, ownPosition.roadPosition.t, points, touchedRoads);
 }
 
-RouteQueryResult<RelativeWorldView::Lanes> WorldImplementation::GetRelativeLanes(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, double range, bool includeOncoming) const
+RouteQueryResult<RelativeWorldView::Lanes> WorldImplementation::GetRelativeLanes(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, units::length::meter_t range, bool includeOncoming) const
 {
     const auto roadMultiStream = worldDataQuery.CreateRoadMultiStream(roadGraph, startNode);
-    double startDistanceOnStream = roadMultiStream->GetPositionByVertexAndS(startNode, distance);
+    const auto startDistanceOnStream = roadMultiStream->GetPositionByVertexAndS(startNode, distance);
 
     return worldDataQuery.GetRelativeLanes(*roadMultiStream, startDistanceOnStream, laneId, range, includeOncoming);
 }
 
-RouteQueryResult<std::optional<int> > WorldImplementation::GetRelativeLaneId(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, double distance, GlobalRoadPositions targetPosition) const
+RouteQueryResult<std::optional<int>> WorldImplementation::GetRelativeLaneId(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, GlobalRoadPositions targetPosition) const
 {
     const auto roadMultiStream = worldDataQuery.CreateRoadMultiStream(roadGraph, startNode);
-    double startDistanceOnStream = roadMultiStream->GetPositionByVertexAndS(startNode, distance);
+    const auto startDistanceOnStream = roadMultiStream->GetPositionByVertexAndS(startNode, distance);
 
     return worldDataQuery.GetRelativeLaneId(*roadMultiStream, startDistanceOnStream, laneId, targetPosition);
 }
 
-RouteQueryResult<AgentInterfaces > WorldImplementation::GetAgentsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double backwardRange, double forwardRange) const
+RouteQueryResult<AgentInterfaces> WorldImplementation::GetAgentsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t backwardRange, units::length::meter_t forwardRange) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, startDistance);
-    double startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
+    const auto startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
     const auto queryResult = worldDataQuery.GetObjectsOfTypeInRange<OWL::Interfaces::MovingObject>(*laneMultiStream, startDistanceOnStream - backwardRange, startDistanceOnStream + forwardRange);
     RouteQueryResult<AgentInterfaces> result;
-    for (const auto& [node, objects]: queryResult)
+    for (const auto &[node, objects] : queryResult)
     {
         result[node] = get_transformed<AgentInterface>(objects);
     }
     return result;
 }
 
-RouteQueryResult<std::vector<const WorldObjectInterface*>> WorldImplementation::GetObjectsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double backwardRange, double forwardRange) const
+RouteQueryResult<std::vector<const WorldObjectInterface *>> WorldImplementation::GetObjectsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t backwardRange, units::length::meter_t forwardRange) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, startDistance);
-    double startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
+    const auto startDistanceOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, startDistance);
     const auto queryResult = worldDataQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(*laneMultiStream, startDistanceOnStream - backwardRange, startDistanceOnStream + forwardRange);
-    RouteQueryResult<std::vector<const WorldObjectInterface*>> result;
-    for (const auto& [node, objects]: queryResult)
+    RouteQueryResult<std::vector<const WorldObjectInterface *>> result;
+    for (const auto &[node, objects] : queryResult)
     {
         result[node] = get_transformed<WorldObjectInterface>(objects);
     }
     return result;
 }
 
-std::vector<const AgentInterface *> WorldImplementation::GetAgentsInRangeOfJunctionConnection(std::string connectingRoadId, double range) const
+std::vector<const AgentInterface *> WorldImplementation::GetAgentsInRangeOfJunctionConnection(std::string connectingRoadId, units::length::meter_t range) const
 {
     auto movingObjects = worldDataQuery.GetMovingObjectsInRangeOfJunctionConnection(connectingRoadId, range);
     return get_transformed<AgentInterface>(movingObjects);
 }
 
-double WorldImplementation::GetDistanceToConnectorEntrance(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
+units::length::meter_t WorldImplementation::GetDistanceToConnectorEntrance(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
 {
     return worldDataQuery.GetDistanceUntilObjectEntersConnector(/*position,*/ intersectingConnectorId, intersectingLaneId, ownConnectorId);
 }
 
-double WorldImplementation::GetDistanceToConnectorDeparture(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
+units::length::meter_t WorldImplementation::GetDistanceToConnectorDeparture(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const
 {
     return worldDataQuery.GetDistanceUntilObjectLeavesConnector(/*position,*/ intersectingConnectorId, intersectingLaneId, ownConnectorId);
 }
 
-Position WorldImplementation::LaneCoord2WorldCoord(double distanceOnLane, double offset, std::string roadId,
-        int laneId) const
+Position WorldImplementation::LaneCoord2WorldCoord(units::length::meter_t distanceOnLane, units::length::meter_t offset, std::string roadId,
+                                                   int laneId) const
 {
-    OWL::CLane& lane = worldDataQuery.GetLaneByOdId(roadId, laneId, distanceOnLane);
+    OWL::CLane &lane = worldDataQuery.GetLaneByOdId(roadId, laneId, distanceOnLane);
     return worldDataQuery.GetPositionByDistanceAndLane(lane, distanceOnLane, offset);
 }
 
-GlobalRoadPositions WorldImplementation::WorldCoord2LaneCoord(double x, double y, double heading) const
+GlobalRoadPositions WorldImplementation::WorldCoord2LaneCoord(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t heading) const
 {
-    return localizer.Locate({x,y}, heading);
+    return localizer.Locate({x, y}, heading);
 }
 
 bool WorldImplementation::IsSValidOnLane(std::string roadId, int laneId,
-        double distance) //when necessary optional parameter with reference to get point
+                                         units::length::meter_t distance) //when necessary optional parameter with reference to get point
 {
     return worldDataQuery.IsSValidOnLane(roadId, laneId, distance);
 }
 
 bool WorldImplementation::IsDirectionalRoadExisting(const std::string &roadId, bool inOdDirection) const
 {
-    return worldData.GetRoadGraphVertexMapping().find(RouteElement {roadId, inOdDirection}) != worldData.GetRoadGraphVertexMapping().end();
+    return worldData.GetRoadGraphVertexMapping().find(RouteElement{roadId, inOdDirection}) != worldData.GetRoadGraphVertexMapping().end();
 }
 
-bool WorldImplementation::IsLaneTypeValid(const std::string &roadId, const int laneId, const double distanceOnLane, const LaneTypes& validLaneTypes)
+bool WorldImplementation::IsLaneTypeValid(const std::string &roadId, const int laneId, const units::length::meter_t distanceOnLane, const LaneTypes &validLaneTypes)
 {
-    const auto& laneType = worldDataQuery.GetLaneByOdId(roadId, laneId, distanceOnLane).GetLaneType();
+    const auto &laneType = worldDataQuery.GetLaneByOdId(roadId, laneId, distanceOnLane).GetLaneType();
 
     if (std::find(validLaneTypes.begin(), validLaneTypes.end(), laneType) == validLaneTypes.end())
     {
@@ -468,84 +474,82 @@ bool WorldImplementation::IsLaneTypeValid(const std::string &roadId, const int l
     return true;
 }
 
-double WorldImplementation::GetLaneCurvature(std::string roadId, int laneId, double position) const
+units::curvature::inverse_meter_t WorldImplementation::GetLaneCurvature(std::string roadId, int laneId, units::length::meter_t position) const
 {
-    auto& lane =  worldDataQuery.GetLaneByOdId(roadId, laneId, position);
+    auto &lane = worldDataQuery.GetLaneByOdId(roadId, laneId, position);
     if (!lane.Exists())
     {
-        return 0.0;
+        return 0.0_i_m;
     }
     return lane.GetCurvature(position);
 }
 
-RouteQueryResult<std::optional<double> > WorldImplementation::GetLaneCurvature(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const
+RouteQueryResult<std::optional<units::curvature::inverse_meter_t>> WorldImplementation::GetLaneCurvature(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, position);
-    double positionOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, position);
+    const auto positionOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, position);
     return worldDataQuery.GetLaneCurvature(*laneMultiStream, positionOnStream + distance);
 }
 
-double WorldImplementation::GetLaneWidth(std::string roadId, int laneId, double position) const
+units::length::meter_t WorldImplementation::GetLaneWidth(std::string roadId, int laneId, units::length::meter_t position) const
 {
-    auto& lane =  worldDataQuery.GetLaneByOdId(roadId, laneId, position);
+    auto &lane = worldDataQuery.GetLaneByOdId(roadId, laneId, position);
     if (!lane.Exists())
     {
-        return 0.0;
+        return 0.0_m;
     }
     return lane.GetWidth(position);
 }
 
-RouteQueryResult<std::optional<double>> WorldImplementation::GetLaneWidth(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const
+RouteQueryResult<std::optional<units::length::meter_t>> WorldImplementation::GetLaneWidth(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, position);
-    double positionOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, position);
+    const auto positionOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, position);
     return worldDataQuery.GetLaneWidth(*laneMultiStream, positionOnStream + distance);
 }
 
-double WorldImplementation::GetLaneDirection(std::string roadId, int laneId, double position) const
+units::angle::radian_t WorldImplementation::GetLaneDirection(std::string roadId, int laneId, units::length::meter_t position) const
 {
-    auto& lane =  worldDataQuery.GetLaneByOdId(roadId, laneId, position);
+    auto &lane = worldDataQuery.GetLaneByOdId(roadId, laneId, position);
     if (!lane.Exists())
     {
-        return 0.0;
+        return 0.0_rad;
     }
     return lane.GetDirection(position);
 }
 
-RouteQueryResult<std::optional<double> > WorldImplementation::GetLaneDirection(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const
+RouteQueryResult<std::optional<units::angle::radian_t>> WorldImplementation::GetLaneDirection(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const
 {
     const auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, position);
-    double positionOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, position);
+    const auto positionOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, position);
     return worldDataQuery.GetLaneDirection(*laneMultiStream, positionOnStream + distance);
 }
 
-RouteQueryResult<double> WorldImplementation::GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance, double maximumSearchLength) const
+RouteQueryResult<units::length::meter_t> WorldImplementation::GetDistanceToEndOfLane(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance, units::length::meter_t maximumSearchLength) const
 {
     return GetDistanceToEndOfLane(roadGraph, startNode, laneId, initialSearchDistance, maximumSearchLength,
                                   {LaneType::Driving, LaneType::Exit, LaneType::OnRamp, LaneType::OffRamp, LaneType::Stop});
 }
 
-RouteQueryResult<double> WorldImplementation::GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance, double maximumSearchLength, const LaneTypes& laneTypes) const
+RouteQueryResult<units::length::meter_t> WorldImplementation::GetDistanceToEndOfLane(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance, units::length::meter_t maximumSearchLength, const LaneTypes &laneTypes) const
 {
     auto laneMultiStream = worldDataQuery.CreateLaneMultiStream(roadGraph, startNode, laneId, initialSearchDistance);
     auto initialPositionOnStream = laneMultiStream->GetPositionByVertexAndS(startNode, initialSearchDistance);
     return worldDataQuery.GetDistanceToEndOfLane(*laneMultiStream, initialPositionOnStream, maximumSearchLength, laneTypes);
 }
 
-LaneSections WorldImplementation::GetLaneSections(const std::string& roadId) const
+LaneSections WorldImplementation::GetLaneSections(const std::string &roadId) const
 {
     LaneSections result;
 
-    const auto& road = worldDataQuery.GetRoadByOdId(roadId);
+    const auto &road = worldDataQuery.GetRoadByOdId(roadId);
     for (const auto &section : road->GetSections())
     {
         LaneSection laneSection;
         laneSection.startS = section->GetSOffset();
         laneSection.endS = laneSection.startS + section->GetLength();
 
-
-
-        for (const auto& lane : section->GetLanes())
+        for (const auto &lane : section->GetLanes())
         {
             laneSection.laneIds.push_back(lane->GetOdId());
         }
@@ -556,17 +560,15 @@ LaneSections WorldImplementation::GetLaneSections(const std::string& roadId) con
     return result;
 }
 
-bool WorldImplementation::IntersectsWithAgent(double x, double y, double rotation, double length, double width,
-        double center)
+bool WorldImplementation::IntersectsWithAgent(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t rotation, units::length::meter_t length, units::length::meter_t width,
+                                              units::length::meter_t center)
 {
-
     polygon_t polyNewAgent = World::Localization::GetBoundingBox(x, y, length, width, rotation, center);
 
-    for (std::pair<int, AgentInterface*> agent : GetAgents())
+    for (std::pair<int, AgentInterface *> agent : GetAgents())
     {
         polygon_t polyAgent = agent.second->GetBoundingBox2D();
 
-
         bool intersects = bg::intersects(polyNewAgent, polyAgent);
         if (intersects)
         {
@@ -583,7 +585,7 @@ Position WorldImplementation::RoadCoord2WorldCoord(RoadPosition roadCoord, std::
     return worldDataQuery.GetPositionByDistanceAndLane(lane, roadCoord.s, tOnLane);
 }
 
-double WorldImplementation::GetRoadLength(const std::string& roadId) const
+units::length::meter_t WorldImplementation::GetRoadLength(const std::string &roadId) const
 {
     return worldDataQuery.GetRoadByOdId(roadId)->GetLength();
 }
@@ -592,16 +594,16 @@ void WorldImplementation::InitTrafficObjects()
 {
     assert(trafficObjects.size() == 0);
 
-    for (auto& baseTrafficObject : worldData.GetStationaryObjects())
+    for (auto &baseTrafficObject : worldData.GetStationaryObjects())
     {
-        TrafficObjectInterface* trafficObject = baseTrafficObject.second->GetLink<TrafficObjectInterface>();
+        TrafficObjectInterface *trafficObject = baseTrafficObject.second->GetLink<TrafficObjectInterface>();
         trafficObjects.push_back(trafficObject);
         worldObjects.push_back(trafficObject);
     }
 }
 
-RouteQueryResult<std::optional<double>> WorldImplementation::GetDistanceBetweenObjects(const RoadGraph& roadGraph, RoadGraphVertex startNode,
-                                                                                      double ownPosition, const GlobalRoadPositions &target) const
+RouteQueryResult<std::optional<units::length::meter_t>> WorldImplementation::GetDistanceBetweenObjects(const RoadGraph& roadGraph, RoadGraphVertex startNode,
+                                                                                      units::length::meter_t ownPosition, const GlobalRoadPositions &target) const
 {
     const auto roadStream = worldDataQuery.CreateRoadMultiStream(roadGraph, startNode);
     const auto ownStreamPosition = roadStream->GetPositionByVertexAndS(startNode, ownPosition);
@@ -612,3 +614,9 @@ RadioInterface &WorldImplementation::GetRadio()
 {
     return radio;
 }
+
+uint64_t WorldImplementation::GetUniqueLaneId(std::string roadId, int laneId, units::length::meter_t position) const
+{
+    auto &lane = worldDataQuery.GetLaneByOdId(roadId, laneId, position);
+    return lane.GetId();
+}
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldImplementation.h b/sim/src/core/opSimulation/modules/World_OSI/WorldImplementation.h
index 407faec0819c758463a073ef13e3a152c3a5f852..0deb6a893b81633f49f71ee0273714dfecfdd826 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldImplementation.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldImplementation.h
@@ -14,38 +14,35 @@
 #pragma once
 
 #include <algorithm>
-#include "include/worldInterface.h"
+
 #include "AgentNetwork.h"
-#include "SceneryConverter.h"
-#include "include/parameterInterface.h"
+#include "EntityRepository.h"
 #include "Localization.h"
 #include "RadioImplementation.h"
-#include "include/dataBufferInterface.h"
-#include "EntityRepository.h"
+#include "SceneryConverter.h"
 #include "WorldData.h"
 #include "WorldDataQuery.h"
-#include "include/sceneryDynamicsInterface.h"
+#include "include/parameterInterface.h"
 
-namespace osi3
-{
+namespace osi3 {
 class SensorView;
 class SensorViewConfiguration;
-}
+} // namespace osi3
 
 struct WorldParameterOSI
 {
     void Reset()
     {
         timeOfDay = "";
-        visibilityDistance = 0;
+        visibilityDistance = 0_m;
         friction = 0.0;
         weather = "";
     }
 
-    std::string timeOfDay {""};
-    int visibilityDistance {0};
-    double friction {0.0};
-    std::string weather {""};
+    std::string timeOfDay{""};
+    units::length::meter_t visibilityDistance{0};
+    double friction{0.0};
+    std::string weather{""};
     TrafficRules trafficRules{};
 };
 
@@ -95,24 +92,24 @@ class WorldImplementation : public WorldInterface
 public:
     const std::string MODULENAME = "WORLD";
 
-    WorldImplementation(const CallbackInterface* callbacks, StochasticsInterface* stochastics, DataBufferWriteInterface* dataBuffer);
-    WorldImplementation(const WorldImplementation&) = delete;
-    WorldImplementation(WorldImplementation&&) = delete;
-    WorldImplementation& operator=(const WorldImplementation&) = delete;
-    WorldImplementation& operator=(WorldImplementation&&) = delete;
+    WorldImplementation(const CallbackInterface *callbacks, StochasticsInterface *stochastics, DataBufferWriteInterface *dataBuffer);
+    WorldImplementation(const WorldImplementation &) = delete;
+    WorldImplementation(WorldImplementation &&) = delete;
+    WorldImplementation &operator=(const WorldImplementation &) = delete;
+    WorldImplementation &operator=(WorldImplementation &&) = delete;
 
     virtual ~WorldImplementation() override;
 
-    AgentInterface* GetAgent(int id) const override;
-    const std::vector<const WorldObjectInterface*>& GetWorldObjects() const override;
+    AgentInterface *GetAgent(int id) const override;
+    const std::vector<const WorldObjectInterface *> &GetWorldObjects() const override;
     std::map<int, AgentInterface *> GetAgents() override;
     const std::vector<int> GetRemovedAgentsInPreviousTimestep() override;
 
-    const std::vector<const TrafficObjectInterface*>& GetTrafficObjects() const override;
-    const TrafficRules& GetTrafficRules() const override;
+    const std::vector<const TrafficObjectInterface *> &GetTrafficObjects() const override;
+    const TrafficRules &GetTrafficRules() const override;
 
     // framework internal methods to access members without restrictions
-    void ExtractParameter(ParameterInterface* parameters) override;
+    void ExtractParameter(ParameterInterface *parameters) override;
 
     void Reset() override;
     void Clear() override;
@@ -120,102 +117,104 @@ public:
     // model callbacks
     std::string GetTimeOfDay() const override;
 
-    void* GetWorldData() override;
+    void *GetWorldData() override;
     void* GetOsiGroundTruth() const override;
 
     void QueueAgentUpdate(std::function<void()> func) override;
-    void QueueAgentRemove(const AgentInterface* agent) override;
-    void RemoveAgent(const AgentInterface* agent);
+    void QueueAgentRemove(const AgentInterface *agent) override;
+    void RemoveAgent(const AgentInterface *agent);
 
     void PublishGlobalData(int timestamp) override;
     void SyncGlobalData(int timestamp) override;
 
-    bool CreateScenery(const SceneryInterface* scenery, const SceneryDynamicsInterface& sceneryDynamics, const TurningRates& turningRates) override;
+    bool CreateScenery(const SceneryInterface* scenery, const TurningRates& turningRates) override;
 
-    AgentInterface* CreateAgentAdapterForAgent() override
+    void SetWeather(const mantle_api::Weather& weather) override;
+
+    AgentInterface *CreateAgentAdapterForAgent() override
     {
         throw std::runtime_error("WorldImplementation::CreateAgentAdapterForAgent: Deprecated method not implemented (see worldInterface.h)");
     }
 
-    AgentInterface &CreateAgentAdapter(const AgentBlueprintInterface& agentBlueprint) override;
+    AgentInterface &CreateAgentAdapter(const AgentBuildInstructions &agentBuildInstructions) override;
 
-    AgentInterface* GetEgoAgent() override;
+    AgentInterface *GetEgoAgent() override;
 
-    AgentInterface* GetAgentByName(const std::string& scenarioName) override;
+    AgentInterface *GetAgentByName(const std::string &scenarioName) override;
 
     RouteQueryResult<std::optional<GlobalRoadPosition>> ResolveRelativePoint(const RoadGraph& roadGraph, RoadGraphVertex startNode, ObjectPointRelative relativePoint, const WorldObjectInterface& object) const override;
 
-    RouteQueryResult<AgentInterfaces> GetAgentsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance,
-                                                                          double backwardRange, double forwardRange) const override;
 
-    RouteQueryResult<std::vector<const WorldObjectInterface*>> GetObjectsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance,
-                                                                                 double backwardRange, double forwardRange) const override;
-    AgentInterfaces GetAgentsInRangeOfJunctionConnection(std::string connectingRoadId, double range) const override;
+    RouteQueryResult<std::vector<const WorldObjectInterface *>> GetObjectsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance,
+                                                                                  units::length::meter_t backwardRange, units::length::meter_t forwardRange) const override;
+    AgentInterfaces GetAgentsInRangeOfJunctionConnection(std::string connectingRoadId, units::length::meter_t range) const override;
 
-    double GetDistanceToConnectorEntrance(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override;
-    double GetDistanceToConnectorDeparture(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override;
+    units::length::meter_t GetDistanceToConnectorEntrance(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override;
+    units::length::meter_t GetDistanceToConnectorDeparture(/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId) const override;
 
-    Position LaneCoord2WorldCoord(double distanceOnLane, double offset, std::string roadId,
-                                          int laneId) const override;
+    Position LaneCoord2WorldCoord(units::length::meter_t distanceOnLane, units::length::meter_t offset, std::string roadId,
+                                  int laneId) const override;
 
-    GlobalRoadPositions WorldCoord2LaneCoord(double x, double y, double heading) const override;
+    GlobalRoadPositions WorldCoord2LaneCoord(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t heading) const override;
 
-    bool IsSValidOnLane(std::string roadId, int laneId, double distance) override;
+    bool IsSValidOnLane(std::string roadId, int laneId, units::length::meter_t distance) override;
 
-    bool IsDirectionalRoadExisting(const std::string& roadId, bool inOdDirection) const override;
+    bool IsDirectionalRoadExisting(const std::string &roadId, bool inOdDirection) const override;
 
-    bool IsLaneTypeValid(const std::string &roadId, const int laneId, const double distanceOnLane, const LaneTypes& validLaneTypes) override;
+    bool IsLaneTypeValid(const std::string &roadId, const int laneId, const units::length::meter_t distanceOnLane, const LaneTypes &validLaneTypes) override;
 
-    double GetLaneCurvature(std::string roadId, int laneId, double position) const override;
-    RouteQueryResult<std::optional<double> > GetLaneCurvature(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const override;
+    units::curvature::inverse_meter_t GetLaneCurvature(std::string roadId, int laneId, units::length::meter_t position) const override;
+    RouteQueryResult<std::optional<units::curvature::inverse_meter_t>> GetLaneCurvature(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const override;
 
-    double GetLaneWidth(std::string roadId, int laneId, double position) const override;
-    RouteQueryResult<std::optional<double> > GetLaneWidth(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const override;
+    units::length::meter_t GetLaneWidth(std::string roadId, int laneId, units::length::meter_t position) const override;
+    RouteQueryResult<std::optional<units::length::meter_t>> GetLaneWidth(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const override;
 
-    double GetLaneDirection(std::string roadId, int laneId, double position) const override;
-    RouteQueryResult<std::optional<double> > GetLaneDirection(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance) const override;
+    units::angle::radian_t GetLaneDirection(std::string roadId, int laneId, units::length::meter_t position) const override;
+    RouteQueryResult<std::optional<units::angle::radian_t>> GetLaneDirection(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance) const override;
 
-    RouteQueryResult<double> GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance,
-                                  double maximumSearchLength) const override;
+    RouteQueryResult<units::length::meter_t> GetDistanceToEndOfLane(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance,
+                                                                    units::length::meter_t maximumSearchLength) const override;
 
-    RouteQueryResult<double> GetDistanceToEndOfLane(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance,
-                                  double maximumSearchLength, const LaneTypes& laneTypes) const override;
+    RouteQueryResult<units::length::meter_t> GetDistanceToEndOfLane(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance,
+                                                                    units::length::meter_t maximumSearchLength, const LaneTypes &laneTypes) const override;
 
-    RouteQueryResult<std::optional<double>> GetDistanceBetweenObjects(const RoadGraph& roadGraph, RoadGraphVertex startNode, double ownPosition, const GlobalRoadPositions &target) const override;
+    RouteQueryResult<std::optional<units::length::meter_t>> GetDistanceBetweenObjects(const RoadGraph& roadGraph, RoadGraphVertex startNode, units::length::meter_t ownPosition, const GlobalRoadPositions &target) const override;
 
-    LaneSections GetLaneSections(const std::string& roadId) const;
+    LaneSections GetLaneSections(const std::string &roadId) const;
 
-    bool IntersectsWithAgent(double x, double y, double rotation, double length, double width, double center) override;
+    bool IntersectsWithAgent(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t rotation, units::length::meter_t length, units::length::meter_t width, units::length::meter_t center) override;
 
     Position RoadCoord2WorldCoord(RoadPosition roadCoord, std::string roadID) const override;
 
-    double GetRoadLength(const std::string& roadId) const override;
+    units::length::meter_t GetRoadLength(const std::string &roadId) const override;
 
-    double GetVisibilityDistance() const override;
+    units::length::meter_t GetVisibilityDistance() const override;
 
     RouteQueryResult<Obstruction> GetObstruction(const RoadGraph &roadGraph, RoadGraphVertex startNode, const GlobalRoadPosition &ownPosition,
-                                                 const std::map<ObjectPoint, Common::Vector2d> &points, const RoadIntervals &touchedRoads) const override;
+                                                 const std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> &points, const RoadIntervals &touchedRoads) const override;
 
-    RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetTrafficSignsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                    double startDistance, double searchRange) const override;
+    RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetTrafficSignsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId,
+                                                                                    units::length::meter_t startDistance, units::length::meter_t searchRange) const override;
 
-    RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetRoadMarkingsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                    double startDistance, double searchRange) const override;
+    RouteQueryResult<std::vector<CommonTrafficSign::Entity>> GetRoadMarkingsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId,
+                                                                                    units::length::meter_t startDistance, units::length::meter_t searchRange) const override;
 
-    RouteQueryResult<std::vector<CommonTrafficLight::Entity>> GetTrafficLightsInRange(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId,
-                                                                                     double startDistance, double searchRange) const override;
+    RouteQueryResult<std::vector<CommonTrafficLight::Entity>> GetTrafficLightsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId,
+                                                                                      units::length::meter_t startDistance, units::length::meter_t searchRange) const override;
 
-    RouteQueryResult<std::vector<LaneMarking::Entity>> GetLaneMarkings(const RoadGraph& roadGraph, RoadGraphVertex startNode,
-                                                                       int laneId, double startDistance, double range, Side side) const override;
+    RouteQueryResult<std::vector<LaneMarking::Entity>> GetLaneMarkings(const RoadGraph &roadGraph, RoadGraphVertex startNode,
+                                                                       int laneId, units::length::meter_t startDistance, units::length::meter_t range, Side side) const override;
 
-    [[deprecated]] RouteQueryResult<RelativeWorldView::Roads> GetRelativeJunctions(const RoadGraph &roadGraph, RoadGraphVertex startNode, double startDistance, double range) const override;
+    [[deprecated]] RouteQueryResult<RelativeWorldView::Roads> GetRelativeJunctions(const RoadGraph &roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range) const override;
 
-    RouteQueryResult<RelativeWorldView::Roads> GetRelativeRoads (const RoadGraph& roadGraph, RoadGraphVertex startNode, double startDistance, double range) const override;
+    RouteQueryResult<RelativeWorldView::Roads> GetRelativeRoads (const RoadGraph& roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range) const override;
 
-    RouteQueryResult<RelativeWorldView::Lanes> GetRelativeLanes(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, double range, bool includeOncoming = true) const override;
+    RouteQueryResult<RelativeWorldView::Lanes> GetRelativeLanes(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, units::length::meter_t range, bool includeOncoming = true) const override;
 
-    RouteQueryResult<std::optional<int>> GetRelativeLaneId(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, GlobalRoadPositions targetPosition) const override;
+    RouteQueryResult<std::optional<int>> GetRelativeLaneId(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, GlobalRoadPositions targetPosition) const override;
 
+    RouteQueryResult<AgentInterfaces> GetAgentsInRange(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t backwardRange, units::length::meter_t forwardRange) const override;
+    
     std::vector<JunctionConnection> GetConnectionsOnJunction(std::string junctionId, std::string incomingRoadId) const override;
 
     std::vector<IntersectingConnection> GetIntersectingConnections(std::string connectingRoadId) const override;
@@ -226,11 +225,11 @@ public:
 
     RoadNetworkElement GetRoadPredecessor(std::string roadId) const override;
 
-    std::pair<RoadGraph, RoadGraphVertex> GetRoadGraph(const RouteElement& start, int maxDepth, bool inDrivingDirection = true) const override;
+    std::pair<RoadGraph, RoadGraphVertex> GetRoadGraph(const RouteElement &start, int maxDepth, bool inDrivingDirection = true) const override;
 
-    std::map<RoadGraphEdge, double> GetEdgeWeights (const RoadGraph& roadGraph) const override;
+    std::map<RoadGraphEdge, double> GetEdgeWeights(const RoadGraph &roadGraph) const override;
 
-    std::unique_ptr<RoadStreamInterface> GetRoadStream(const std::vector<RouteElement>& route) const override;
+    std::unique_ptr<RoadStreamInterface> GetRoadStream(const std::vector<RouteElement> &route) const override;
 
     double GetFriction() const override;
 
@@ -246,7 +245,7 @@ public:
     {
         throw std::runtime_error("WorldImplementation::SetTimeOfDay not implemented");
     }
-    virtual void SetWeekday([[maybe_unused]]Weekday weekday) override
+    virtual void SetWeekday([[maybe_unused]] Weekday weekday) override
     {
         throw std::runtime_error("WorldImplementation::SetWeekday not implemented");
     }
@@ -285,6 +284,8 @@ public:
 
     RadioInterface& GetRadio() override;
 
+    uint64_t GetUniqueLaneId(std::string roadId, int laneId, units::length::meter_t position) const override;
+
 protected:
     //-----------------------------------------------------------------------------
     //! Provides callback to LOG() macro
@@ -295,9 +296,9 @@ protected:
     //! @param[in]     message     Message to log
     //-----------------------------------------------------------------------------
     void Log(CbkLogLevel logLevel,
-             const char* file,
+             const char *file,
              int line,
-             const std::string& message)
+             const std::string &message)
     {
         if (callbacks)
         {
@@ -315,7 +316,7 @@ private:
     WorldDataQuery worldDataQuery{worldData};
     World::Localization::Localizer localizer{worldData};
 
-    std::vector<const TrafficObjectInterface*> trafficObjects;
+    std::vector<const TrafficObjectInterface *> trafficObjects;
 
     // world parameters
     WorldParameterOSI worldParameter;
@@ -324,18 +325,18 @@ private:
 
     TrafficLightNetwork trafficLightNetwork;
 
-    const CallbackInterface* callbacks;
+    const CallbackInterface *callbacks;
 
-    mutable std::vector<const WorldObjectInterface*> worldObjects;
+    mutable std::vector<const WorldObjectInterface *> worldObjects;
 
     const int stepSizeLookingForValidS = 100;
-    const SceneryInterface* scenery;
+    const SceneryInterface *scenery;
     RadioImplementation radio;
 
-    std::unordered_map<const OWL::Interfaces::MovingObject*, AgentInterface*> movingObjectMapping{{nullptr, nullptr}};
-    std::unordered_map<const OWL::Interfaces::MovingObject*, TrafficObjectInterface*> stationaryObjectMapping{{nullptr, nullptr}};
+    std::unordered_map<const OWL::Interfaces::MovingObject *, AgentInterface *> movingObjectMapping{{nullptr, nullptr}};
+    std::unordered_map<const OWL::Interfaces::MovingObject *, TrafficObjectInterface *> stationaryObjectMapping{{nullptr, nullptr}};
 
-    DataBufferWriteInterface* dataBuffer;
+    DataBufferWriteInterface *dataBuffer;
     openpass::entity::Repository repository;
     std::unique_ptr<SceneryConverter> sceneryConverter;
 };
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldObjectAdapter.cpp b/sim/src/core/opSimulation/modules/World_OSI/WorldObjectAdapter.cpp
index 50852b641aa24b4c3a646f69d5c1847931ce89eb..b4d2b4e6d5aeef37130e1f217c9bfeda7ce84c44 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldObjectAdapter.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldObjectAdapter.cpp
@@ -27,12 +27,12 @@ const polygon_t& WorldObjectAdapter::GetBoundingBox2D() const
     return boundingBox;
 }
 
-double WorldObjectAdapter::GetDistanceReferencePointToLeadingEdge() const
+units::length::meter_t WorldObjectAdapter::GetDistanceReferencePointToLeadingEdge() const
 {
     return baseTrafficObject.GetDimension().length / 2.0;
 }
 
-double WorldObjectAdapter::GetHeight() const
+units::length::meter_t WorldObjectAdapter::GetHeight() const
 {
     return baseTrafficObject.GetDimension().height;
 }
@@ -42,32 +42,32 @@ int WorldObjectAdapter::GetId() const
     return baseTrafficObject.GetId();
 }
 
-double WorldObjectAdapter::GetLength() const
+units::length::meter_t WorldObjectAdapter::GetLength() const
 {
     return baseTrafficObject.GetDimension().length;
 }
 
-double WorldObjectAdapter::GetPositionX() const
+units::length::meter_t WorldObjectAdapter::GetPositionX() const
 {
     return baseTrafficObject.GetReferencePointPosition().x;
 }
 
-double WorldObjectAdapter::GetPositionY() const
+units::length::meter_t WorldObjectAdapter::GetPositionY() const
 {
     return baseTrafficObject.GetReferencePointPosition().y;
 }
 
-double WorldObjectAdapter::GetWidth() const
+units::length::meter_t WorldObjectAdapter::GetWidth() const
 {
     return baseTrafficObject.GetDimension().width;
 }
 
-double WorldObjectAdapter::GetYaw() const
+units::angle::radian_t WorldObjectAdapter::GetYaw() const
 {
     return baseTrafficObject.GetAbsOrientation().yaw;
 }
 
-double WorldObjectAdapter::GetRoll() const
+units::angle::radian_t WorldObjectAdapter::GetRoll() const
 {
     return baseTrafficObject.GetAbsOrientation().roll;
 }
@@ -79,28 +79,28 @@ const OWL::Interfaces::WorldObject& WorldObjectAdapter::GetBaseTrafficObject() c
 
 const polygon_t WorldObjectAdapter::CalculateBoundingBox() const
 {
-    const double length = GetLength();
-    const double width = GetWidth();
-    const double height = GetHeight();
-    const double rotation = GetYaw();
-    const double roll = GetRoll();
+    const auto length = GetLength();
+    const auto width = GetWidth();
+    const auto height = GetHeight();
+    const auto rotation = GetYaw();
+    const auto roll = GetRoll();
 
-    const double x = GetPositionX();
-    const double y = GetPositionY();
+    const double x = units::unit_cast<double>(GetPositionX());
+    const double y = units::unit_cast<double>(GetPositionY());
 
-    const double center = GetDistanceReferencePointToLeadingEdge();
+    const auto center = GetDistanceReferencePointToLeadingEdge();
 
-    const double halfWidth = width / 2.0;
-    const double widthLeft = halfWidth * std::cos(roll) + (roll < 0 ? height * std::sin(-roll) : 0);
-    const double widthRight = halfWidth * std::cos(roll) + (roll > 0 ? height * std::sin(roll) : 0);
+    const auto halfWidth = width / 2.0;
+    const auto widthLeft = halfWidth * units::math::cos(roll) + (roll < 0_rad ? height * units::math::sin(-roll) : 0_m);
+    const auto widthRight = halfWidth * units::math::cos(roll) + (roll > 0_rad ? height * units::math::sin(roll) : 0_m);
 
     point_t boxPoints[]
     {
-        {center - length, -widthRight},
-        {center - length,  widthLeft},
-        {center,           widthLeft},
-        {center,          -widthRight},
-        {center - length, -widthRight}
+        {units::unit_cast<double>(center - length), units::unit_cast<double>(-widthRight)},
+        {units::unit_cast<double>(center - length), units::unit_cast<double>( widthLeft)},
+        {units::unit_cast<double>(center),          units::unit_cast<double>( widthLeft)},
+        {units::unit_cast<double>(center),          units::unit_cast<double>(-widthRight)},
+        {units::unit_cast<double>(center - length), units::unit_cast<double>(-widthRight)}
     };
 
     polygon_t box;
@@ -110,7 +110,7 @@ const polygon_t WorldObjectAdapter::CalculateBoundingBox() const
     bt::translate_transformer<double, 2, 2> translate(x, y);
 
     // rotation in mathematical negativ order (boost) -> invert to match
-    bt::rotate_transformer<bg::radian, double, 2, 2> rotate(-rotation);
+    bt::rotate_transformer<bg::radian, double, 2, 2> rotate(-rotation.value());
 
     bg::transform(box, boxTemp, rotate);
     bg::transform(boxTemp, box, translate);
@@ -120,30 +120,36 @@ const polygon_t WorldObjectAdapter::CalculateBoundingBox() const
 
 namespace WorldObjectCommon {
 
-double GetFrontDeltaS(double length, double width, double hdg, double distanceReferencePointToLeadingEdge)
+units::length::meter_t GetFrontDeltaS(units::length::meter_t length, units::length::meter_t width, units::angle::radian_t hdg, units::length::meter_t distanceReferencePointToLeadingEdge)
 {
     auto l_front = distanceReferencePointToLeadingEdge;
     auto l_rear = distanceReferencePointToLeadingEdge - length;
     auto w = width / 2;
 
-    auto s1 = l_front * cos(hdg) - w * sin(hdg);
-    auto s2 = l_front * cos(hdg) + w * sin(hdg);
-    auto s3 = l_rear  * cos(hdg) - w * sin(hdg);
-    auto s4 = l_rear  * cos(hdg) + w * sin(hdg);
+    const auto sinHeading = units::math::sin(hdg);
+    const auto cosHeading = units::math::cos(hdg);
+
+    const units::length::meter_t s1 = l_front * cosHeading - w * sinHeading;
+    const units::length::meter_t s2 = l_front * cosHeading + w * sinHeading;
+    const units::length::meter_t s3 = l_rear  * cosHeading - w * sinHeading;
+    const units::length::meter_t s4 = l_rear  * cosHeading + w * sinHeading;
 
     return std::max({s1, s2, s3, s4});
 }
 
-double GetRearDeltaS(double length, double width, double hdg, double distanceReferencePointToLeadingEdge)
+units::length::meter_t GetRearDeltaS(units::length::meter_t length, units::length::meter_t width, units::angle::radian_t hdg, units::length::meter_t distanceReferencePointToLeadingEdge)
 {
     auto l_front = distanceReferencePointToLeadingEdge;
     auto l_rear = distanceReferencePointToLeadingEdge - length;
     auto w = width / 2;
 
-    auto s1 = l_front * cos(hdg) - w * sin(hdg);
-    auto s2 = l_front * cos(hdg) + w * sin(hdg);
-    auto s3 = l_rear  * cos(hdg) - w * sin(hdg);
-    auto s4 = l_rear  * cos(hdg) + w * sin(hdg);
+    const auto sinHeading = units::math::sin(hdg);
+    const auto cosHeading = units::math::cos(hdg);
+
+    auto s1 = l_front * cosHeading - w * sinHeading;
+    auto s2 = l_front * cosHeading + w * sinHeading;
+    auto s3 = l_rear  * cosHeading - w * sinHeading;
+    auto s4 = l_rear  * cosHeading + w * sinHeading;
 
     return std::min({s1, s2, s3, s4});
 }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldObjectAdapter.h b/sim/src/core/opSimulation/modules/World_OSI/WorldObjectAdapter.h
index 313ed97894055e81d4dffbbeee6153cb831253ff..2378c45d707ed95b88c1230d086cffd91e9cf0d5 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldObjectAdapter.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldObjectAdapter.h
@@ -17,23 +17,23 @@ class WorldObjectAdapter : public virtual WorldObjectInterface
 {
 public:
     const polygon_t& GetBoundingBox2D() const;
-    double GetHeight() const;
+    units::length::meter_t GetHeight() const;
     int GetId() const;
-    double GetLength() const;
-    double GetPositionX() const;
-    double GetPositionY() const;
-    double GetPositionLateral() const;
-    double GetWidth() const;
-    double GetYaw() const;
-    double GetRoll() const;
-    double GetDistanceReferencePointToLeadingEdge() const;
+    units::length::meter_t GetLength() const;
+    units::length::meter_t GetPositionX() const;
+    units::length::meter_t GetPositionY() const;
+    units::length::meter_t GetPositionLateral() const;
+    units::length::meter_t GetWidth() const;
+    units::angle::radian_t GetYaw() const;
+    units::angle::radian_t GetRoll() const;
+    units::length::meter_t GetDistanceReferencePointToLeadingEdge() const;
     const OWL::Interfaces::WorldObject& GetBaseTrafficObject() const;
 
 
 protected:
     OWL::Interfaces::WorldObject& baseTrafficObject;
 
-    double s{0.0};
+    units::length::meter_t s{0.0};
     mutable bool boundingBoxNeedsUpdate{true};
 
 private:
@@ -53,8 +53,8 @@ public:
 
 namespace WorldObjectCommon {
 
-double GetFrontDeltaS(double length, double width, double hdg, double distanceReferencePointToLeadingEdge);
-double GetRearDeltaS(double length, double width, double hdg, double distanceReferencePointToLeadingEdge);
+units::length::meter_t GetFrontDeltaS(units::length::meter_t length, units::length::meter_t width, units::angle::radian_t hdg, units::length::meter_t distanceReferencePointToLeadingEdge);
+units::length::meter_t GetRearDeltaS(units::length::meter_t length, units::length::meter_t width, units::angle::radian_t hdg, units::length::meter_t distanceReferencePointToLeadingEdge);
 
 } // namespace WorldObjectCommon
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldToRoadCoordinateConverter.cpp b/sim/src/core/opSimulation/modules/World_OSI/WorldToRoadCoordinateConverter.cpp
index 6d51d7e02538ee895874fd378a43a4f0d34b1580..17ca9b3715d496cc28b39db8248ab16313271e1c 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldToRoadCoordinateConverter.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldToRoadCoordinateConverter.cpp
@@ -16,7 +16,7 @@
 namespace World {
 namespace Localization {
 
-bool WorldToRoadCoordinateConverter::IsConvertible(const Common::Vector2d& point) const
+bool WorldToRoadCoordinateConverter::IsConvertible(const Common::Vector2d<units::length::meter_t>& point) const
 {
     return CommonHelper::IntersectionCalculation::IsWithin(element.laneGeometryElement.joints.current.points.left,
                                                            element.laneGeometryElement.joints.next.points.left,
@@ -25,7 +25,7 @@ bool WorldToRoadCoordinateConverter::IsConvertible(const Common::Vector2d& point
                                                            point);
 }
 
-RoadPosition WorldToRoadCoordinateConverter::GetRoadCoordinate(const Common::Vector2d& point, double hdg) const
+RoadPosition WorldToRoadCoordinateConverter::GetRoadCoordinate(const Common::Vector2d<units::length::meter_t>& point, units::angle::radian_t hdg) const
 {
     const auto intersectionPoint = GetIntersectionPoint(point);
     const auto s = CalcS(intersectionPoint);
@@ -34,15 +34,15 @@ RoadPosition WorldToRoadCoordinateConverter::GetRoadCoordinate(const Common::Vec
     return {s, t, yaw};
 }
 
-double WorldToRoadCoordinateConverter::GetS(const Common::Vector2d& point) const
+units::length::meter_t WorldToRoadCoordinateConverter::GetS(const Common::Vector2d<units::length::meter_t>& point) const
 {
     const auto intersectionPoint = GetIntersectionPoint(point);
     return CalcS(intersectionPoint);
 }
 
-Common::Vector2d WorldToRoadCoordinateConverter::GetIntersectionPoint(const Common::Vector2d& point) const
+Common::Vector2d<units::length::meter_t> WorldToRoadCoordinateConverter::GetIntersectionPoint(const Common::Vector2d<units::length::meter_t>& point) const
 {
-    Common::Vector2d intersectionPoint;
+    Common::Vector2d<units::length::meter_t> intersectionPoint;
     if (element.tAxisCenter)
     {
         intersectionPoint = CommonHelper::CalculateIntersection(element.laneGeometryElement.joints.current.points.reference, element.referenceVector,
@@ -56,36 +56,35 @@ Common::Vector2d WorldToRoadCoordinateConverter::GetIntersectionPoint(const Comm
     return intersectionPoint;
 }
 
-double WorldToRoadCoordinateConverter::CalcS(const Common::Vector2d& intersectionPoint) const
+units::length::meter_t WorldToRoadCoordinateConverter::CalcS(const Common::Vector2d<units::length::meter_t>& intersectionPoint) const
 {
-    Common::Vector2d sVector = intersectionPoint - element.laneGeometryElement.joints.current.points.reference;
-    return element.laneGeometryElement.joints.current.sOffset + sVector.Length() * element.referenceScale;
-
+    Common::Vector2d<units::length::meter_t> sVector = intersectionPoint - element.laneGeometryElement.joints.current.points.reference;
+    return element.laneGeometryElement.joints.current.sOffset + units::length::meter_t(sVector.Length() * element.referenceScale);
 }
 
-double WorldToRoadCoordinateConverter::CalcT(const Common::Vector2d& point, const Common::Vector2d& intersectionPoint) const
+units::length::meter_t WorldToRoadCoordinateConverter::CalcT(const Common::Vector2d<units::length::meter_t>& point, const Common::Vector2d<units::length::meter_t>& intersectionPoint) const
 {
-    Common::Vector2d tVector = point - intersectionPoint;
-    return IsLeftOfReferenceAxis(tVector) ? tVector.Length() : - tVector.Length();
-
+    Common::Vector2d<units::length::meter_t> tVector = point - intersectionPoint;
+    units::length::meter_t tCoordinate{tVector.Length()};
+    return IsLeftOfReferenceAxis(tVector) ? tCoordinate : -tCoordinate;
 }
 
-double WorldToRoadCoordinateConverter::CalcYaw(double hdg) const
+units::angle::radian_t WorldToRoadCoordinateConverter::CalcYaw(units::angle::radian_t hdg) const
 {
     // Updated for direction awareness - might be an issue, when cars try to turn around
     return CommonHelper::SetAngleToValidRange(hdg - element.laneGeometryElement.joints.current.sHdg);
 }
 
-Common::Vector2d WorldToRoadCoordinateConverter::ProjectOntoReferenceAxis(const Common::Vector2d& point) const
+Common::Vector2d<units::length::meter_t> WorldToRoadCoordinateConverter::ProjectOntoReferenceAxis(const Common::Vector2d<units::length::meter_t>& point) const
 {
     const double lamdba = element.referenceVector.Dot(point - element.laneGeometryElement.joints.current.points.reference)
                     / element.referenceVector.Dot(element.referenceVector);
     return element.laneGeometryElement.joints.current.points.reference + element.referenceVector * lamdba;
 }
 
-bool WorldToRoadCoordinateConverter::IsLeftOfReferenceAxis(const Common::Vector2d& vector) const
+bool WorldToRoadCoordinateConverter::IsLeftOfReferenceAxis(const Common::Vector2d<units::length::meter_t>& vector) const
 {
-    Common::Vector2d vectorToLeft{-element.referenceVector.y, element.referenceVector.x};
+    Common::Vector2d<units::length::meter_t> vectorToLeft{-element.referenceVector.y, element.referenceVector.x};
     return vector.Dot(vectorToLeft) >= 0;
 }
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/WorldToRoadCoordinateConverter.h b/sim/src/core/opSimulation/modules/World_OSI/WorldToRoadCoordinateConverter.h
index d26756d9f42bb754441ddb8da4416e91c25b7916..8c2563f5afed6a7a2af66d24c672b8af453d5e69 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/WorldToRoadCoordinateConverter.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/WorldToRoadCoordinateConverter.h
@@ -23,20 +23,20 @@ public:
         element{localizationElement}
     {}
 
-    bool IsConvertible(const Common::Vector2d& point) const;
+    bool IsConvertible(const Common::Vector2d<units::length::meter_t>& point) const;
 
-    RoadPosition GetRoadCoordinate(const Common::Vector2d& point, double hdg) const;
+    RoadPosition GetRoadCoordinate(const Common::Vector2d<units::length::meter_t>& point, units::angle::radian_t hdg) const;
 
-    double GetS(const Common::Vector2d& point) const;
+    units::length::meter_t GetS(const Common::Vector2d<units::length::meter_t>& point) const;
 
 private:
-    Common::Vector2d GetIntersectionPoint(const Common::Vector2d& point) const;
-    double CalcS(const Common::Vector2d& intersectionPoint) const;
-    double CalcT(const Common::Vector2d& point, const Common::Vector2d& intersectionPoint) const;
-    double CalcYaw(double hdg) const;
-    Common::Vector2d ProjectOntoReferenceAxis(const Common::Vector2d& point) const;
+    Common::Vector2d<units::length::meter_t> GetIntersectionPoint(const Common::Vector2d<units::length::meter_t>& point) const;
+    units::length::meter_t CalcS(const Common::Vector2d<units::length::meter_t>& intersectionPoint) const;
+    units::length::meter_t CalcT(const Common::Vector2d<units::length::meter_t>& point, const Common::Vector2d<units::length::meter_t>& intersectionPoint) const;
+    units::angle::radian_t CalcYaw(units::angle::radian_t hdg) const;
+    Common::Vector2d<units::length::meter_t> ProjectOntoReferenceAxis(const Common::Vector2d<units::length::meter_t>& point) const;
 
-    bool IsLeftOfReferenceAxis(const Common::Vector2d& vector) const;
+    bool IsLeftOfReferenceAxis(const Common::Vector2d<units::length::meter_t>& vector) const;
 
 };
 
diff --git a/sim/src/core/opSimulation/modules/World_OSI/egoAgent.cpp b/sim/src/core/opSimulation/modules/World_OSI/egoAgent.cpp
index a96402e4cae0aa999fac24583a24f95385b8694a..79bfcec8e249490a7f2881984933f820fae486d8 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/egoAgent.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/egoAgent.cpp
@@ -11,12 +11,12 @@
 
 #include "egoAgent.h"
 
-const AgentInterface* EgoAgent::GetAgent() const
+const AgentInterface *EgoAgent::GetAgent() const
 {
     return agent;
 }
 
-void EgoAgent::SetRoadGraph(const RoadGraph&& roadGraph, RoadGraphVertex current, RoadGraphVertex target)
+void EgoAgent::SetRoadGraph(const RoadGraph &&roadGraph, RoadGraphVertex current, RoadGraphVertex target)
 {
     graphValid = true;
     this->roadGraph = roadGraph;
@@ -61,7 +61,7 @@ void EgoAgent::UpdatePositionInGraph()
             rootOfWayToTargetGraph--;
             auto routeElement = get(RouteElement(), wayToTarget, rootOfWayToTargetGraph);
             auto [successorBegin, successorsEnd] = adjacent_vertices(current, roadGraph);
-                    auto successor = std::find_if(successorBegin, successorsEnd, [&](const auto& vertex){return get(RouteElement(), roadGraph, vertex) == routeElement;});
+            auto successor = std::find_if(successorBegin, successorsEnd, [&](const auto &vertex) { return get(RouteElement(), roadGraph, vertex) == routeElement; });
             if (successor == successorsEnd)
             {
                 graphValid = false;
@@ -91,17 +91,17 @@ void EgoAgent::SetNewTarget(size_t alternativeIndex)
     SetWayToTarget(alternatives[alternativeIndex]);
 }
 
-const std::string& EgoAgent::GetRoadId() const
+const std::string &EgoAgent::GetRoadId() const
 {
     return get(RouteElement(), roadGraph, current).roadId;
 }
 
-double EgoAgent::GetVelocity(VelocityScope velocityScope) const
+units::velocity::meters_per_second_t EgoAgent::GetVelocity(VelocityScope velocityScope) const
 {
     return GetVelocity(velocityScope, agent);
 }
 
-double EgoAgent::GetVelocity(VelocityScope velocityScope, const WorldObjectInterface *object) const
+units::velocity::meters_per_second_t EgoAgent::GetVelocity(VelocityScope velocityScope, const WorldObjectInterface *object) const
 {
     if (velocityScope == VelocityScope::Absolute)
     {
@@ -112,16 +112,16 @@ double EgoAgent::GetVelocity(VelocityScope velocityScope, const WorldObjectInter
         const auto referencePoint = GetReferencePointPosition();
         if (!referencePoint.has_value())
         {
-            return std::numeric_limits<double>::quiet_NaN();
+            return units::velocity::meters_per_second_t(std::numeric_limits<double>::quiet_NaN());
         }
-        return object->GetVelocity().Projection(agent->GetYaw() + M_PI_2);
+        return object->GetVelocity().Projection(agent->GetYaw() + 90_deg);
     }
     else if (velocityScope == VelocityScope::Longitudinal)
     {
         const auto referencePoint = GetReferencePointPosition();
         if (!referencePoint.has_value())
         {
-            return std::numeric_limits<double>::quiet_NaN();
+            return units::velocity::meters_per_second_t(std::numeric_limits<double>::quiet_NaN());
         }
         return object->GetVelocity().Projection(agent->GetYaw());
     }
@@ -129,33 +129,35 @@ double EgoAgent::GetVelocity(VelocityScope velocityScope, const WorldObjectInter
     throw std::invalid_argument("velocity scope not within valid bounds");
 }
 
-double EgoAgent::GetDistanceToEndOfLane(double range, int relativeLane) const
+units::length::meter_t EgoAgent::GetDistanceToEndOfLane(units::length::meter_t range, int relativeLane) const
 {
     if (!graphValid)
     {
-        return NAN;
+        return units::length::meter_t{std::numeric_limits<double>::quiet_NaN()};
     }
     return world->GetDistanceToEndOfLane(wayToTarget,
                                          rootOfWayToTargetGraph,
                                          GetLaneIdFromRelative(relativeLane),
                                          GetMainLocatePosition().value().roadPosition.s,
-                                         range).at(0);
+                                         range)
+        .at(0);
 }
 
-double EgoAgent::GetDistanceToEndOfLane(double range, int relativeLane, const LaneTypes& acceptableLaneTypes) const
+units::length::meter_t EgoAgent::GetDistanceToEndOfLane(units::length::meter_t range, int relativeLane, const LaneTypes &acceptableLaneTypes) const
 {
     if (!graphValid)
     {
-        return NAN;
+        return units::length::meter_t{std::numeric_limits<double>::quiet_NaN()};
     }
     return world->GetDistanceToEndOfLane(wayToTarget,
                                          rootOfWayToTargetGraph,
                                          GetLaneIdFromRelative(relativeLane),
                                          GetMainLocatePosition().value().roadPosition.s,
-                                         range, acceptableLaneTypes).at(0);
+                                         range, acceptableLaneTypes)
+        .at(0);
 }
 
-RelativeWorldView::Lanes EgoAgent::GetRelativeLanes(double range, int relativeLane, bool includeOncoming) const
+RelativeWorldView::Lanes EgoAgent::GetRelativeLanes(units::length::meter_t range, int relativeLane, bool includeOncoming) const
 {
     if (!graphValid)
     {
@@ -166,7 +168,8 @@ RelativeWorldView::Lanes EgoAgent::GetRelativeLanes(double range, int relativeLa
                                    GetLaneIdFromRelative(relativeLane),
                                    GetMainLocatePosition().value().roadPosition.s,
                                    range,
-                                   includeOncoming).at(0);
+                                   includeOncoming)
+        .at(0);
 }
 
 std::optional<int> EgoAgent::GetRelativeLaneId(const WorldObjectInterface *object, ObjectPoint point) const
@@ -180,10 +183,11 @@ std::optional<int> EgoAgent::GetRelativeLaneId(const WorldObjectInterface *objec
                                     rootOfWayToTargetGraph,
                                     GetMainLocatePosition().value().laneId,
                                     GetMainLocatePosition().value().roadPosition.s,
-                                    objectPosition).at(0);
+                                    objectPosition)
+        .at(0);
 }
 
-std::vector<const WorldObjectInterface*> EgoAgent::GetObjectsInRange(double backwardRange, double forwardRange, int relativeLane) const
+std::vector<const WorldObjectInterface *> EgoAgent::GetObjectsInRange(units::length::meter_t backwardRange, units::length::meter_t forwardRange, int relativeLane) const
 {
     if (!graphValid)
     {
@@ -194,7 +198,8 @@ std::vector<const WorldObjectInterface*> EgoAgent::GetObjectsInRange(double back
                                                    GetLaneIdFromRelative(relativeLane),
                                                    GetMainLocatePosition().value().roadPosition.s,
                                                    backwardRange,
-                                                   forwardRange).at(0);
+                                                   forwardRange)
+                              .at(0);
 
     auto self = std::find(objectsInRange.cbegin(), objectsInRange.cend(), GetAgent());
 
@@ -206,18 +211,19 @@ std::vector<const WorldObjectInterface*> EgoAgent::GetObjectsInRange(double back
     return objectsInRange;
 }
 
-AgentInterfaces EgoAgent::GetAgentsInRange(double backwardRange, double forwardRange, int relativeLane) const
+AgentInterfaces EgoAgent::GetAgentsInRange(units::length::meter_t backwardRange, units::length::meter_t forwardRange, int relativeLane) const
 {
     if (!graphValid)
     {
         return {};
     }
-    auto agentsInRange =  world->GetAgentsInRange(wayToTarget,
-                                                  rootOfWayToTargetGraph,
-                                                  GetLaneIdFromRelative(relativeLane),
+    auto agentsInRange = world->GetAgentsInRange(wayToTarget,
+                                                 rootOfWayToTargetGraph,
+                                                 GetLaneIdFromRelative(relativeLane),
                                                   GetMainLocatePosition().value().roadPosition.s,
-                                                  backwardRange,
-                                                  forwardRange).at(0);
+                                                 backwardRange,
+                                                 forwardRange)
+                             .at(0);
 
     auto self = std::find(agentsInRange.cbegin(), agentsInRange.cend(), GetAgent());
 
@@ -229,7 +235,7 @@ AgentInterfaces EgoAgent::GetAgentsInRange(double backwardRange, double forwardR
     return agentsInRange;
 }
 
-std::vector<CommonTrafficSign::Entity> EgoAgent::GetTrafficSignsInRange(double range, int relativeLane) const
+std::vector<CommonTrafficSign::Entity> EgoAgent::GetTrafficSignsInRange(units::length::meter_t range, int relativeLane) const
 {
     if (!graphValid)
     {
@@ -239,10 +245,11 @@ std::vector<CommonTrafficSign::Entity> EgoAgent::GetTrafficSignsInRange(double r
                                          rootOfWayToTargetGraph,
                                          GetLaneIdFromRelative(relativeLane),
                                          GetMainLocatePosition().value().roadPosition.s,
-                                         range).at(0);
+                                         range)
+        .at(0);
 }
 
-std::vector<CommonTrafficSign::Entity> EgoAgent::GetRoadMarkingsInRange(double range, int relativeLane) const
+std::vector<CommonTrafficSign::Entity> EgoAgent::GetRoadMarkingsInRange(units::length::meter_t range, int relativeLane) const
 {
     if (!graphValid)
     {
@@ -252,10 +259,11 @@ std::vector<CommonTrafficSign::Entity> EgoAgent::GetRoadMarkingsInRange(double r
                                          rootOfWayToTargetGraph,
                                          GetLaneIdFromRelative(relativeLane),
                                          GetMainLocatePosition().value().roadPosition.s,
-                                         range).at(0);
+                                         range)
+        .at(0);
 }
 
-std::vector<CommonTrafficLight::Entity> EgoAgent::GetTrafficLightsInRange(double range, int relativeLane) const
+std::vector<CommonTrafficLight::Entity> EgoAgent::GetTrafficLightsInRange(units::length::meter_t range, int relativeLane) const
 {
     if (!graphValid)
     {
@@ -265,10 +273,11 @@ std::vector<CommonTrafficLight::Entity> EgoAgent::GetTrafficLightsInRange(double
                                           rootOfWayToTargetGraph,
                                           GetLaneIdFromRelative(relativeLane),
                                           GetMainLocatePosition().value().roadPosition.s,
-                                          range).at(0);
+                                          range)
+        .at(0);
 }
 
-std::vector<LaneMarking::Entity> EgoAgent::GetLaneMarkingsInRange(double range, Side side, int relativeLane) const
+std::vector<LaneMarking::Entity> EgoAgent::GetLaneMarkingsInRange(units::length::meter_t range, Side side, int relativeLane) const
 {
     if (!graphValid)
     {
@@ -279,10 +288,11 @@ std::vector<LaneMarking::Entity> EgoAgent::GetLaneMarkingsInRange(double range,
                                   GetLaneIdFromRelative(relativeLane),
                                   GetMainLocatePosition().value().roadPosition.s,
                                   range,
-                                  side).at(0);
+                                  side)
+        .at(0);
 }
 
-std::optional<double> EgoAgent::GetDistanceToObject(const WorldObjectInterface* otherObject, const ObjectPoint& ownPoint, const ObjectPoint& otherPoint) const
+std::optional<units::length::meter_t> EgoAgent::GetDistanceToObject(const WorldObjectInterface* otherObject, const ObjectPoint& ownPoint, const ObjectPoint& otherPoint) const
 {
     if (!otherObject)
     {
@@ -298,26 +308,27 @@ std::optional<double> EgoAgent::GetDistanceToObject(const WorldObjectInterface*
     const auto& otherObjectPos = GetRoadPositions(otherPoint, otherObject);
     const auto distance = world->GetDistanceBetweenObjects(wayToTarget, rootOfWayToTargetGraph,
                                                            ownPosition.value().roadPosition.s,
-                                                           otherObjectPos).at(0);
+                                                           otherObjectPos)
+                              .at(0);
 
     return distance;
 }
 
-std::optional<double> EgoAgent::GetNetDistance(const WorldObjectInterface *otherObject) const
+std::optional<units::length::meter_t> EgoAgent::GetNetDistance(const WorldObjectInterface *otherObject) const
 {
     const auto front = GetDistanceToObject(otherObject, ObjectPointRelative::Frontmost, ObjectPointRelative::Rearmost);
     const auto rear = GetDistanceToObject(otherObject, ObjectPointRelative::Rearmost, ObjectPointRelative::Frontmost);
-    if (front.has_value() && front.value() >= 0.0)
+    if (front.has_value() && front.value() >= 0.0_m)
     {
         return front;
     }
-    if (rear.has_value() && rear.value() <= 0.0)
+    if (rear.has_value() && rear.value() <= 0.0_m)
     {
         return rear;
     }
     if (front.has_value() || rear.has_value())
     {
-        return 0.0;
+        return 0.0_m;
     }
     return std::nullopt;
 }
@@ -329,7 +340,7 @@ Obstruction EgoAgent::GetObstruction(const WorldObjectInterface* otherObject, co
         return Obstruction::Invalid();
     }
 
-    std::map<ObjectPoint, Common::Vector2d> absolutePoints{};
+    std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> absolutePoints{};
     for (const auto& point : points)
     {
         if (std::holds_alternative<ObjectPointRelative>(point))
@@ -353,11 +364,11 @@ Obstruction EgoAgent::GetObstruction(const WorldObjectInterface* otherObject, co
                                  otherObject->GetTouchedRoads()).at(0);
 }
 
-double EgoAgent::GetRelativeYaw() const
+units::angle::radian_t EgoAgent::GetRelativeYaw() const
 {
     if (!graphValid)
     {
-        return NAN;
+        return units::angle::radian_t{std::numeric_limits<double>::quiet_NaN()};
     }
     if (get(RouteElement(), roadGraph, current).inOdDirection)
     {
@@ -365,36 +376,36 @@ double EgoAgent::GetRelativeYaw() const
     }
     else
     {
-        return std::fmod(GetMainLocatePosition().value().roadPosition.hdg + 2 * M_PI, 2 * M_PI) - M_PI;
+        return units::math::fmod(GetMainLocatePosition().value().roadPosition.hdg + 360_deg, 360_deg) - 180_deg;
     }
 }
 
-double EgoAgent::GetPositionLateral() const
+units::length::meter_t EgoAgent::GetPositionLateral() const
 {
     if (!graphValid)
     {
-        return NAN;
+        return units::length::meter_t{std::numeric_limits<double>::quiet_NaN()};
     }
     return get(RouteElement(), roadGraph, current).inOdDirection ? GetMainLocatePosition().value().roadPosition.t : -GetMainLocatePosition().value().roadPosition.t;
 }
 
-double EgoAgent::GetLaneRemainder(Side side) const
+units::length::meter_t EgoAgent::GetLaneRemainder(Side side) const
 {
-    const auto& roadId = GetRoadId();
+    const auto &roadId = GetRoadId();
     return side == Side::Left ? 0.5 * GetLaneWidth(0) - agent->GetTouchedRoads().at(roadId).tMax.roadPosition.t
                               : 0.5 * GetLaneWidth(0) + agent->GetTouchedRoads().at(roadId).tMin.roadPosition.t;
 }
 
-double EgoAgent::GetLaneWidth(int relativeLane) const
+units::length::meter_t EgoAgent::GetLaneWidth(int relativeLane) const
 {
     if (!graphValid)
     {
-        return NAN;
+        return units::length::meter_t{std::numeric_limits<double>::quiet_NaN()};
     }
     return world->GetLaneWidth(GetRoadId(), GetLaneIdFromRelative(relativeLane), GetMainLocatePosition().value().roadPosition.s);
 }
 
-std::optional<double> EgoAgent::GetLaneWidth(double distance, int relativeLane) const
+std::optional<units::length::meter_t> EgoAgent::GetLaneWidth(units::length::meter_t distance, int relativeLane) const
 {
     if (!graphValid)
     {
@@ -403,16 +414,16 @@ std::optional<double> EgoAgent::GetLaneWidth(double distance, int relativeLane)
     return world->GetLaneWidth(wayToTarget, rootOfWayToTargetGraph, GetLaneIdFromRelative(relativeLane), GetMainLocatePosition().value().roadPosition.s, distance).at(0);
 }
 
-double EgoAgent::GetLaneCurvature(int relativeLane) const
+units::curvature::inverse_meter_t EgoAgent::GetLaneCurvature(int relativeLane) const
 {
     if (!graphValid)
     {
-        return NAN;
+        return units::curvature::inverse_meter_t{std::numeric_limits<double>::quiet_NaN()};
     }
     return world->GetLaneCurvature(GetRoadId(), GetLaneIdFromRelative(relativeLane), GetMainLocatePosition().value().roadPosition.s);
 }
 
-std::optional<double> EgoAgent::GetLaneCurvature(double distance, int relativeLane) const
+std::optional<units::curvature::inverse_meter_t> EgoAgent::GetLaneCurvature(units::length::meter_t distance, int relativeLane) const
 {
     if (!graphValid)
     {
@@ -421,16 +432,16 @@ std::optional<double> EgoAgent::GetLaneCurvature(double distance, int relativeLa
     return world->GetLaneCurvature(wayToTarget, rootOfWayToTargetGraph, GetLaneIdFromRelative(relativeLane), GetMainLocatePosition().value().roadPosition.s, distance).at(0);
 }
 
-double EgoAgent::GetLaneDirection(int relativeLane) const
+units::angle::radian_t EgoAgent::GetLaneDirection(int relativeLane) const
 {
     if (!graphValid)
     {
-        return NAN;
+        return units::angle::radian_t{std::numeric_limits<double>::quiet_NaN()};
     }
     return world->GetLaneDirection(GetRoadId(), GetLaneIdFromRelative(relativeLane), GetMainLocatePosition().value().roadPosition.s);
 }
 
-std::optional<double> EgoAgent::GetLaneDirection(double distance, int relativeLane) const
+std::optional<units::angle::radian_t> EgoAgent::GetLaneDirection(units::length::meter_t distance, int relativeLane) const
 {
     if (!graphValid)
     {
@@ -444,7 +455,7 @@ const std::optional<GlobalRoadPosition>& EgoAgent::GetMainLocatePosition() const
     return mainLocatePosition;
 }
 
-std::optional<GlobalRoadPosition> EgoAgent::GetReferencePointPosition(const WorldObjectInterface* object) const
+std::optional<GlobalRoadPosition> EgoAgent::GetReferencePointPosition(const WorldObjectInterface *object) const
 {
     return GetPositionOnRoute(object->GetRoadPosition(ObjectPointPredefined::Reference));
 }
@@ -496,15 +507,15 @@ int EgoAgent::GetLaneIdFromRelative(int relativeLaneId) const
     {
         return 0;
     }
-    const auto& routeElement = get(RouteElement(), roadGraph, current);
+    const auto &routeElement = get(RouteElement(), roadGraph, current);
     const auto mainLaneId = GetMainLocatePosition().value().laneId;
     if (routeElement.inOdDirection)
     {
-        return  mainLaneId + relativeLaneId + ((mainLaneId < 0) && (relativeLaneId >= -mainLaneId) ? 1 : 0) + ((mainLaneId > 0) && (relativeLaneId <= -mainLaneId) ? -1 : 0);
+        return mainLaneId + relativeLaneId + ((mainLaneId < 0) && (relativeLaneId >= -mainLaneId) ? 1 : 0) + ((mainLaneId > 0) && (relativeLaneId <= -mainLaneId) ? -1 : 0);
     }
     else
     {
-        return  mainLaneId - relativeLaneId + ((mainLaneId < 0) && (relativeLaneId <= mainLaneId) ? 1 : 0) + ((mainLaneId > 0) && (relativeLaneId >= mainLaneId) ? -1 : 0);
+        return mainLaneId - relativeLaneId + ((mainLaneId < 0) && (relativeLaneId <= mainLaneId) ? 1 : 0) + ((mainLaneId > 0) && (relativeLaneId >= mainLaneId) ? -1 : 0);
     }
 }
 
@@ -517,7 +528,7 @@ std::optional<RouteElement> EgoAgent::GetPreviousRoad(size_t steps) const
     return get(RouteElement(), wayToTarget, rootOfWayToTargetGraph + steps);
 }
 
-std::optional<Position> EgoAgent::GetWorldPosition(double sDistance, double tDistance, double yaw) const
+std::optional<Position> EgoAgent::GetWorldPosition(units::length::meter_t sDistance, units::length::meter_t tDistance, units::angle::radian_t yaw) const
 {
     auto currentPosition = GetReferencePointPosition();
     if (!currentPosition.has_value())
@@ -583,13 +594,13 @@ void EgoAgent::SetWayToTarget(RoadGraphVertex targetVertex)
     rootOfWayToTargetGraph = vertex1;
 }
 
-template<>
+template <>
 ExecuteReturn<DistanceToEndOfLane> EgoAgentInterface::executeQuery(DistanceToEndOfLaneParameter param) const
 {
     return executeQueryDistanceToEndOfLane(param);
 }
 
-template<>
+template <>
 ExecuteReturn<ObjectsInRange> EgoAgentInterface::executeQuery(ObjectsInRangeParameter param) const
 {
     return executeQueryObjectsInRange(param);
@@ -608,7 +619,7 @@ ExecuteReturn<DistanceToEndOfLane> EgoAgent::executeQueryDistanceToEndOfLane(Dis
                                                      param.range);
     std::vector<DistanceToEndOfLane> results;
     std::transform(alternatives.cbegin(), alternatives.cend(), std::back_inserter(results),
-                   [&](const RoadGraphVertex& alternative){return queryResult.at(alternative);});
+                   [&](const RoadGraphVertex &alternative) { return queryResult.at(alternative); });
     return {results};
 }
 
@@ -626,11 +637,11 @@ ExecuteReturn<ObjectsInRange> EgoAgent::executeQueryObjectsInRange(ObjectsInRang
                                                 param.forwardRange);
     std::vector<ObjectsInRange> results;
     std::transform(alternatives.cbegin(), alternatives.cend(), std::back_inserter(results),
-                   [&](const RoadGraphVertex& alternative){return queryResult.at(alternative);});
+                   [&](const RoadGraphVertex &alternative) { return queryResult.at(alternative); });
     return {results};
 }
 
-RelativeWorldView::Roads EgoAgent::GetRelativeJunctions(double range) const
+RelativeWorldView::Roads EgoAgent::GetRelativeJunctions(units::length::meter_t range) const
 {
     if (!graphValid)
     {
@@ -639,10 +650,11 @@ RelativeWorldView::Roads EgoAgent::GetRelativeJunctions(double range) const
     return world->GetRelativeJunctions(wayToTarget,
                                        rootOfWayToTargetGraph,
                                        GetMainLocatePosition().value().roadPosition.s,
-                                       range).at(0);
+                                       range)
+        .at(0);
 }
 
-RelativeWorldView::Roads EgoAgent::GetRelativeRoads(double range) const
+RelativeWorldView::Roads EgoAgent::GetRelativeRoads(units::length::meter_t range) const
 {
     if (!graphValid)
     {
diff --git a/sim/src/core/opSimulation/modules/World_OSI/egoAgent.h b/sim/src/core/opSimulation/modules/World_OSI/egoAgent.h
index f7b76edd4a0185c82f1e4c5644ce7491a3dc2015..6f61a474aa420ce6d9cade3dd39b1c6cfeece681 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/egoAgent.h
+++ b/sim/src/core/opSimulation/modules/World_OSI/egoAgent.h
@@ -12,20 +12,23 @@
 #pragma once
 
 #include "include/agentInterface.h"
-#include "include/worldInterface.h"
 #include "include/egoAgentInterface.h"
+#include "include/worldInterface.h"
 
-class EgoAgent: public EgoAgentInterface
+using namespace units::literals;
+
+class EgoAgent : public EgoAgentInterface
 {
 public:
-    EgoAgent(const AgentInterface* agent, const WorldInterface* world) :
+    EgoAgent(const AgentInterface *agent, const WorldInterface *world) :
         agent(agent),
         world(world)
-    {}
+    {
+    }
 
-    const AgentInterface* GetAgent () const override;
+    const AgentInterface *GetAgent() const override;
 
-    void SetRoadGraph(const RoadGraph&& roadGraph, RoadGraphVertex current, RoadGraphVertex target) override;
+    void SetRoadGraph(const RoadGraph &&roadGraph, RoadGraphVertex current, RoadGraphVertex target) override;
 
     void Update() override;
 
@@ -33,72 +36,71 @@ public:
 
     bool HasValidRoute() const override;
 
-    void SetNewTarget (size_t alternativeIndex) override;
+    void SetNewTarget(size_t alternativeIndex) override;
 
-    const std::string& GetRoadId() const override;
+    const std::string &GetRoadId() const override;
 
-    double GetVelocity(VelocityScope velocityScope) const override;
+    units::velocity::meters_per_second_t GetVelocity(VelocityScope velocityScope) const override;
 
-    double GetVelocity(VelocityScope velocityScope, const WorldObjectInterface* object) const override;
+    units::velocity::meters_per_second_t GetVelocity(VelocityScope velocityScope, const WorldObjectInterface *object) const override;
 
-    double GetDistanceToEndOfLane (double range, int relativeLane = 0) const override;
+    units::length::meter_t GetDistanceToEndOfLane(units::length::meter_t range, int relativeLane = 0) const override;
 
-    double GetDistanceToEndOfLane(double range, int relativeLane, const LaneTypes &acceptableLaneTypes) const override;
+    units::length::meter_t GetDistanceToEndOfLane(units::length::meter_t range, int relativeLane, const LaneTypes &acceptableLaneTypes) const override;
 
-    RelativeWorldView::Lanes GetRelativeLanes(double range, int relativeLane = 0, bool includeOncoming = true) const override;
+    RelativeWorldView::Lanes GetRelativeLanes(units::length::meter_t range, int relativeLane = 0, bool includeOncoming = true) const override;
 
     std::optional<int> GetRelativeLaneId(const WorldObjectInterface* object, ObjectPoint point) const override;
 
-    [[deprecated]] RelativeWorldView::Roads GetRelativeJunctions(double range) const override;
+    [[deprecated]] RelativeWorldView::Roads GetRelativeJunctions(units::length::meter_t range) const override;
 
-    RelativeWorldView::Roads GetRelativeRoads(double range) const override;
+    RelativeWorldView::Roads GetRelativeRoads(units::length::meter_t range) const override;
 
-    std::vector<const WorldObjectInterface*> GetObjectsInRange (double backwardRange, double forwardRange, int relativeLane = 0) const override;
+    std::vector<const WorldObjectInterface *> GetObjectsInRange(units::length::meter_t backwardRange, units::length::meter_t forwardRange, int relativeLane = 0) const override;
 
-    AgentInterfaces GetAgentsInRange (double backwardRange, double forwardRange, int relativeLane = 0) const override;
+    AgentInterfaces GetAgentsInRange(units::length::meter_t backwardRange, units::length::meter_t forwardRange, int relativeLane = 0) const override;
 
-    std::vector<CommonTrafficSign::Entity> GetTrafficSignsInRange(double range, int relativeLane = 0) const override;
+    std::vector<CommonTrafficSign::Entity> GetTrafficSignsInRange(units::length::meter_t range, int relativeLane = 0) const override;
 
-    std::vector<CommonTrafficSign::Entity> GetRoadMarkingsInRange(double range, int relativeLane = 0) const override;
+    std::vector<CommonTrafficSign::Entity> GetRoadMarkingsInRange(units::length::meter_t range, int relativeLane = 0) const override;
 
-    std::vector<CommonTrafficLight::Entity> GetTrafficLightsInRange(double range, int relativeLane = 0) const override;
+    std::vector<CommonTrafficLight::Entity> GetTrafficLightsInRange(units::length::meter_t range, int relativeLane = 0) const override;
 
-    std::vector<LaneMarking::Entity> GetLaneMarkingsInRange(double range, Side side, int relativeLane = 0) const override;
+    std::vector<LaneMarking::Entity> GetLaneMarkingsInRange(units::length::meter_t range, Side side, int relativeLane = 0) const override;
 
-    std::optional<double> GetDistanceToObject(const WorldObjectInterface* otherObject, const ObjectPoint &ownPoint, const ObjectPoint &otherPoint) const override;
+    std::optional<units::length::meter_t> GetDistanceToObject(const WorldObjectInterface* otherObject, const ObjectPoint &ownPoint, const ObjectPoint &otherPoint) const override;
 
-    std::optional<double> GetNetDistance(const WorldObjectInterface* otherObject) const override;
+    std::optional<units::length::meter_t> GetNetDistance(const WorldObjectInterface* otherObject) const override;
 
     Obstruction GetObstruction(const WorldObjectInterface* otherObject, const std::vector<ObjectPoint> points) const override;
 
-    double GetRelativeYaw () const override;
+    units::angle::radian_t GetRelativeYaw() const override;
 
-    double GetPositionLateral() const override;
+    units::length::meter_t GetPositionLateral() const override;
 
-    double GetLaneRemainder(Side side) const override;
+    units::length::meter_t GetLaneRemainder(Side side) const override;
 
-    double GetLaneWidth(int relativeLane = 0) const override;
+    units::length::meter_t GetLaneWidth(int relativeLane = 0) const override;
 
-    std::optional<double> GetLaneWidth(double distance, int relativeLane = 0) const override;
+    std::optional<units::length::meter_t> GetLaneWidth(units::length::meter_t distance, int relativeLane = 0) const override;
 
-    double GetLaneCurvature(int relativeLane = 0) const override;
+    units::curvature::inverse_meter_t GetLaneCurvature(int relativeLane = 0) const override;
 
-    std::optional<double> GetLaneCurvature(double distance, int relativeLane = 0) const override;
+    std::optional<units::curvature::inverse_meter_t> GetLaneCurvature(units::length::meter_t distance, int relativeLane = 0) const override;
 
-    double GetLaneDirection(int relativeLane = 0) const override;
+    units::angle::radian_t GetLaneDirection(int relativeLane = 0) const override;
 
-    std::optional<double> GetLaneDirection(double distance, int relativeLane = 0) const override;
+    std::optional<units::angle::radian_t> GetLaneDirection(units::length::meter_t distance, int relativeLane = 0) const override;
 
     const std::optional<GlobalRoadPosition>& GetMainLocatePosition() const override;
 
     std::optional<GlobalRoadPosition> GetReferencePointPosition() const override;
 
-    int GetLaneIdFromRelative (int relativeLaneId) const override;
+    int GetLaneIdFromRelative(int relativeLaneId) const override;
 
-    std::optional<Position> GetWorldPosition(double sDistance, double tDistance, double yaw = 0) const override;
+    std::optional<Position> GetWorldPosition(units::length::meter_t sDistance, units::length::meter_t tDistance, units::angle::radian_t yaw = 0_rad) const override;
 
     GlobalRoadPositions GetRoadPositions(const ObjectPoint& point, const WorldObjectInterface* object) const override;
-
 private:
     std::optional<RouteElement> GetPreviousRoad(size_t steps = 1) const;
 
@@ -114,8 +116,8 @@ private:
 
     void SetWayToTarget(RoadGraphVertex targetVertex);
 
-    const AgentInterface* agent;
-    const WorldInterface* world;
+    const AgentInterface *agent;
+    const WorldInterface *world;
     bool graphValid{false};
     RoadGraph roadGraph{};
     RoadGraphVertex current{0};
diff --git a/sim/tests/fakes/gmock/fakeAgent.h b/sim/tests/fakes/gmock/fakeAgent.h
index 8bbc22083ef7f2f59e1b8b185576fbfab6f24501..8c8c9b27d13ce6b78f33cb3342922bd60a7552fe 100644
--- a/sim/tests/fakes/gmock/fakeAgent.h
+++ b/sim/tests/fakes/gmock/fakeAgent.h
@@ -12,55 +12,55 @@
 #pragma once
 
 #include "common/globalDefinitions.h"
-#include "gmock/gmock.h"
 #include "fakeWorldObject.h"
+#include "gmock/gmock.h"
 #include "include/agentInterface.h"
 #include "include/egoAgentInterface.h"
 
 class FakeAgent : public FakeWorldObject, public AgentInterface
 {
-  public:
+public:
     MOCK_CONST_METHOD0(GetAgentId, int());
-    MOCK_METHOD0(GetEgoAgent, EgoAgentInterface&());
+    MOCK_METHOD0(GetEgoAgent, EgoAgentInterface &());
     MOCK_CONST_METHOD0(GetVehicleModelType, std::string());
-    MOCK_CONST_METHOD0(GetVehicleModelParameters, VehicleModelParameters());
+    MOCK_CONST_METHOD0(GetVehicleModelParameters, std::shared_ptr<const mantle_api::EntityProperties>());
     MOCK_CONST_METHOD0(GetDriverProfileName, std::string());
     MOCK_CONST_METHOD0(GetScenarioName, std::string());
     MOCK_CONST_METHOD0(GetAgentCategory, AgentCategory());
     MOCK_CONST_METHOD0(GetAgentTypeName, std::string());
     MOCK_CONST_METHOD0(IsEgoAgent, bool());
-    MOCK_CONST_METHOD0(GetVelocityX, double());
-    MOCK_CONST_METHOD0(GetVelocityY, double());
-    MOCK_CONST_METHOD0(GetWheelbase, double());
+    MOCK_CONST_METHOD0(GetVelocityX, units::velocity::meters_per_second_t());
+    MOCK_CONST_METHOD0(GetVelocityY, units::velocity::meters_per_second_t());
+    MOCK_CONST_METHOD0(GetWheelbase, units::length::meter_t());
     MOCK_CONST_METHOD0(GetGear, int());
-    MOCK_CONST_METHOD0(GetDistanceCOGtoLeadingEdge, double());
-    MOCK_CONST_METHOD0(GetAccelerationX, double());
-    MOCK_CONST_METHOD0(GetAccelerationY, double());
+    MOCK_CONST_METHOD0(GetDistanceCOGtoLeadingEdge, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetAccelerationX, units::acceleration::meters_per_second_squared_t());
+    MOCK_CONST_METHOD0(GetAccelerationY, units::acceleration::meters_per_second_squared_t());
     MOCK_CONST_METHOD2(GetCollisionData, std::vector<void *>(int collisionPartnerId, int collisionDataId));
     MOCK_CONST_METHOD0(GetPostCrashVelocity, PostCrashVelocity());
     MOCK_METHOD1(SetPostCrashVelocity, void(PostCrashVelocity));
     MOCK_CONST_METHOD0(GetCollisionPartners, std::vector<CollisionPartner>());
-    MOCK_METHOD1(SetPositionX, void(double positionX));
-    MOCK_METHOD1(SetPositionY, void(double positionY));
-    MOCK_METHOD1(SetVehicleModelParameter, void(const VehicleModelParameters &parameter));
-    MOCK_METHOD1(SetVelocityX, void(double velocityX));
-    MOCK_METHOD1(SetVelocityY, void(double velocityY));
-    MOCK_METHOD1(SetVelocity, void(double value));
-    MOCK_METHOD1(SetAcceleration, void(double value));
-    MOCK_METHOD1(SetYaw, void(double value));
-    MOCK_METHOD1(SetRoll, void(double value));
-    MOCK_METHOD1(SetDistanceTraveled, void(double distanceTraveled));
-    MOCK_CONST_METHOD0(GetDistanceTraveled, double());
+    MOCK_METHOD1(SetPositionX, void(units::length::meter_t positionX));
+    MOCK_METHOD1(SetPositionY, void(units::length::meter_t positionY));
+    MOCK_METHOD1(SetVehicleModelParameter, void(std::shared_ptr<const mantle_api::EntityProperties> parameter));
+    MOCK_METHOD1(SetVelocityX, void(units::velocity::meters_per_second_t velocityX));
+    MOCK_METHOD1(SetVelocityY, void(units::velocity::meters_per_second_t velocityY));
+    MOCK_METHOD1(SetVelocity, void(units::velocity::meters_per_second_t value));
+    MOCK_METHOD1(SetAcceleration, void(units::acceleration::meters_per_second_squared_t value));
+    MOCK_METHOD1(SetYaw, void(units::angle::radian_t value));
+    MOCK_METHOD1(SetRoll, void(units::angle::radian_t value));
+    MOCK_METHOD1(SetDistanceTraveled, void(units::length::meter_t distanceTraveled));
+    MOCK_CONST_METHOD0(GetDistanceTraveled, units::length::meter_t());
     MOCK_METHOD1(SetGear, void(int gear));
-    MOCK_METHOD1(SetEngineSpeed, void(double engineSpeed));
+    MOCK_METHOD1(SetEngineSpeed, void(units::angular_velocity::revolutions_per_minute_t engineSpeed));
     MOCK_METHOD1(SetEffAccelPedal, void(double percent));
     MOCK_METHOD1(SetEffBrakePedal, void(double percent));
-    MOCK_METHOD1(SetSteeringWheelAngle, void(double steeringWheelAngle));
-    MOCK_METHOD3(SetWheelsRotationRateAndOrientation, void(double, double, double));
-    MOCK_METHOD1(SetMaxAcceleration, void(double maxAcceleration));
-    MOCK_METHOD1(SetMaxDeceleration, void(double maxDeceleration));
-    MOCK_METHOD1(SetAccelerationX, void(double accelerationX));
-    MOCK_METHOD1(SetAccelerationY, void(double accelerationY));
+    MOCK_METHOD1(SetSteeringWheelAngle, void(units::angle::radian_t steeringWheelAngle));
+    MOCK_METHOD3(SetWheelsRotationRateAndOrientation, void(units::angle::radian_t, units::velocity::meters_per_second_t, units::acceleration::meters_per_second_squared_t));
+    MOCK_METHOD1(SetMaxAcceleration, void(units::acceleration::meters_per_second_squared_t maxAcceleration));
+    MOCK_METHOD1(SetMaxDeceleration, void(units::acceleration::meters_per_second_squared_t maxDeceleration));
+    MOCK_METHOD1(SetAccelerationX, void(units::acceleration::meters_per_second_squared_t accelerationX));
+    MOCK_METHOD1(SetAccelerationY, void(units::acceleration::meters_per_second_squared_t accelerationY));
     MOCK_METHOD1(UpdateCollision, void(CollisionPartner collisionPartner));
     MOCK_METHOD0(Unlocate, void());
     MOCK_METHOD0(Locate, bool());
@@ -80,23 +80,22 @@ class FakeAgent : public FakeWorldObject, public AgentInterface
     MOCK_CONST_METHOD0(GetFlasher, bool());
     MOCK_METHOD4(InitAgentParameter, bool(int id, int agentTypeId, const AgentSpawnItem *agentSpawnItem,
                                           const SpawnItemParameterInterface &spawnItemParameter));
-    MOCK_METHOD2(InitAgentParameter, bool(int id, AgentBlueprintInterface *agentBlueprint));
-    MOCK_METHOD1(InitParameter, void(const AgentBlueprintInterface &agentBlueprint));
+    MOCK_METHOD1(InitParameter, void(const AgentBuildInstructions &agentBlueprint));
     MOCK_CONST_METHOD0(IsValid, bool());
     MOCK_CONST_METHOD0(GetAgentTypeId, int());
     MOCK_CONST_METHOD0(IsAgentInWorld, bool());
     MOCK_METHOD0(IsAgentAtEndOfRoad, bool());
     MOCK_METHOD1(SetPosition, void(Position pos));
-    MOCK_METHOD1(GetDistanceToFrontAgent, double(int laneId));
-    MOCK_METHOD1(GetDistanceToRearAgent, double(int laneId));
+    MOCK_METHOD1(GetDistanceToFrontAgent, units::length::meter_t(int laneId));
+    MOCK_METHOD1(GetDistanceToRearAgent, units::length::meter_t(int laneId));
     MOCK_METHOD0(RemoveSpecialAgentMarker, void());
     MOCK_METHOD0(SetSpecialAgentMarker, void());
     MOCK_METHOD0(SetObstacleFlag, void());
-    MOCK_METHOD0(GetDistanceToSpecialAgent, double());
+    MOCK_METHOD0(GetDistanceToSpecialAgent, units::length::meter_t());
     MOCK_METHOD0(IsObstacle, bool());
     MOCK_CONST_METHOD0(IsLeavingWorld, bool());
     MOCK_CONST_METHOD0(IsCrossingLanes, bool());
-    MOCK_METHOD0(GetDistanceFrontAgentToEgo, double());
+    MOCK_METHOD0(GetDistanceFrontAgentToEgo, units::length::meter_t());
     MOCK_METHOD0(HasTwoLeftLanes, bool());
     MOCK_METHOD0(HasTwoRightLanes, bool());
     MOCK_METHOD1(EstimateLaneChangeState, LaneChangeState(double thresholdLooming));
@@ -106,86 +105,86 @@ class FakeAgent : public FakeWorldObject, public AgentInterface
     MOCK_CONST_METHOD0(IsFirstCarInLane, bool());
     MOCK_CONST_METHOD0(GetTypeOfNearestMark, MarkType());
     MOCK_CONST_METHOD0(GetTypeOfNearestMarkString, std::string());
-    MOCK_CONST_METHOD1(GetDistanceToNearestMark, double(MarkType markType));
-    MOCK_CONST_METHOD1(GetOrientationOfNearestMark, double(MarkType markType));
+    MOCK_CONST_METHOD1(GetDistanceToNearestMark, units::length::meter_t(MarkType markType));
+    MOCK_CONST_METHOD1(GetOrientationOfNearestMark, units::angle::radian_t(MarkType markType));
     MOCK_CONST_METHOD1(GetViewDirectionToNearestMark, double(MarkType markType));
     MOCK_CONST_METHOD1(GetAgentViewDirectionToNearestMark, AgentViewDirection(MarkType markType));
     MOCK_CONST_METHOD2(GetDistanceToNearestMarkInViewDirection,
-                       double(MarkType markType, AgentViewDirection agentViewDirection));
-    MOCK_CONST_METHOD2(GetDistanceToNearestMarkInViewDirection, double(MarkType markType, double mainViewDirection));
+                       units::length::meter_t(MarkType markType, AgentViewDirection agentViewDirection));
+    MOCK_CONST_METHOD2(GetDistanceToNearestMarkInViewDirection, units::length::meter_t(MarkType markType, double mainViewDirection));
     MOCK_CONST_METHOD2(GetOrientationOfNearestMarkInViewDirection,
-                       double(MarkType markType, AgentViewDirection agentViewDirection));
-    MOCK_CONST_METHOD2(GetOrientationOfNearestMarkInViewDirection, double(MarkType markType, double mainViewDirection));
+                       units::angle::radian_t(MarkType markType, AgentViewDirection agentViewDirection));
+    MOCK_CONST_METHOD2(GetOrientationOfNearestMarkInViewDirection, units::angle::radian_t(MarkType markType, double mainViewDirection));
     MOCK_CONST_METHOD3(GetDistanceToNearestMarkInViewRange,
-                       double(MarkType markType, AgentViewDirection agentViewDirection, double range));
+                       units::length::meter_t(MarkType markType, AgentViewDirection agentViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetDistanceToNearestMarkInViewRange,
-                       double(MarkType markType, double mainViewDirection, double range));
+                       units::length::meter_t(MarkType markType, double mainViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetOrientationOfNearestMarkInViewRange,
-                       double(MarkType markType, AgentViewDirection agentViewDirection, double range));
+                       units::angle::radian_t(MarkType markType, AgentViewDirection agentViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetOrientationOfNearestMarkInViewRange,
-                       double(MarkType markType, double mainViewDirection, double range));
+                       units::angle::radian_t(MarkType markType, double mainViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetViewDirectionToNearestMarkInViewRange,
-                       double(MarkType markType, AgentViewDirection agentViewDirection, double range));
+                       double(MarkType markType, AgentViewDirection agentViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetViewDirectionToNearestMarkInViewRange,
-                       double(MarkType markType, double mainViewDirection, double range));
-    MOCK_CONST_METHOD2(GetTypeOfNearestObject, std::string(AgentViewDirection agentViewDirection, double range));
-    MOCK_CONST_METHOD2(GetTypeOfNearestObject, std::string(double mainViewDirection, double range));
+                       double(MarkType markType, double mainViewDirection, units::length::meter_t range));
+    MOCK_CONST_METHOD2(GetTypeOfNearestObject, std::string(AgentViewDirection agentViewDirection, units::length::meter_t range));
+    MOCK_CONST_METHOD2(GetTypeOfNearestObject, std::string(double mainViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetDistanceToNearestObjectInViewRange,
-                       double(ObjectType objectType, AgentViewDirection agentViewDirection, double range));
+                       units::length::meter_t(ObjectType objectType, AgentViewDirection agentViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetDistanceToNearestObjectInViewRange,
-                       double(ObjectType objectType, double mainViewDirection, double range));
+                       units::length::meter_t(ObjectType objectType, double mainViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetViewDirectionToNearestObjectInViewRange,
-                       double(ObjectType objectType, AgentViewDirection agentViewDirection, double range));
+                       double(ObjectType objectType, AgentViewDirection agentViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD3(GetViewDirectionToNearestObjectInViewRange,
-                       double(ObjectType objectType, double mainViewDirection, double range));
-    MOCK_CONST_METHOD2(GetIdOfNearestAgent, int(AgentViewDirection agentViewDirection, double range));
-    MOCK_CONST_METHOD2(GetIdOfNearestAgent, int(double mainViewDirection, double range));
+                       double(ObjectType objectType, double mainViewDirection, units::length::meter_t range));
+    MOCK_CONST_METHOD2(GetIdOfNearestAgent, int(AgentViewDirection agentViewDirection, units::length::meter_t range));
+    MOCK_CONST_METHOD2(GetIdOfNearestAgent, int(double mainViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD2(GetDistanceToNearestAgentInViewRange,
-                       double(AgentViewDirection agentViewDirection, double range));
-    MOCK_CONST_METHOD2(GetDistanceToNearestAgentInViewRange, double(double mainViewDirection, double range));
+                       units::length::meter_t(AgentViewDirection agentViewDirection, units::length::meter_t range));
+    MOCK_CONST_METHOD2(GetDistanceToNearestAgentInViewRange, units::length::meter_t(double mainViewDirection, units::length::meter_t range));
     MOCK_CONST_METHOD2(GetViewDirectionToNearestAgentInViewRange,
-                       double(AgentViewDirection agentViewDirection, double range));
-    MOCK_CONST_METHOD2(GetViewDirectionToNearestAgentInViewRange, double(double mainViewDirection, double range));
-    MOCK_CONST_METHOD2(GetVisibilityToNearestAgentInViewRange, double(double mainViewDirection, double range));
-    MOCK_CONST_METHOD0(GetYawRate, double());
-    MOCK_METHOD1(SetYawRate, void(double yawRate));
-    MOCK_CONST_METHOD0(GetCentripetalAcceleration, double());
-    MOCK_METHOD1(SetCentripetalAcceleration, void(double centripetalAcceleration));
-    MOCK_METHOD0(GetYawAcceleration, double());
-    MOCK_METHOD1(SetYawAcceleration, void(double yawAcceleration));
-    MOCK_CONST_METHOD0(GetTrajectoryTime, const std::vector<int>*());
-    MOCK_CONST_METHOD0(GetTrajectoryXPos, const std::vector<double>*());
-    MOCK_CONST_METHOD0(GetTrajectoryYPos, const std::vector<double>*());
-    MOCK_CONST_METHOD0(GetTrajectoryVelocity, const std::vector<double>*());
-    MOCK_CONST_METHOD0(GetTrajectoryAngle, const std::vector<double>*());
-    MOCK_METHOD1(SetAccelerationIntention, void(double accelerationIntention));
-    MOCK_CONST_METHOD0(GetAccelerationIntention, double());
-    MOCK_METHOD1(SetDecelerationIntention, void(double decelerationIntention));
-    MOCK_CONST_METHOD0(GetDecelerationIntention, double());
-    MOCK_METHOD1(SetAngleIntention, void(double angleIntention));
-    MOCK_CONST_METHOD0(GetAngleIntention, double());
+                       double(AgentViewDirection agentViewDirection, units::length::meter_t range));
+    MOCK_CONST_METHOD2(GetViewDirectionToNearestAgentInViewRange, double(double mainViewDirection, units::length::meter_t range));
+    MOCK_CONST_METHOD2(GetVisibilityToNearestAgentInViewRange, double(double mainViewDirection, units::length::meter_t range));
+    MOCK_CONST_METHOD0(GetYawRate, units::angular_velocity::radians_per_second_t());
+    MOCK_METHOD1(SetYawRate, void(units::angular_velocity::radians_per_second_t yawRate));
+    MOCK_CONST_METHOD0(GetCentripetalAcceleration, units::acceleration::meters_per_second_squared_t());
+    MOCK_METHOD1(SetCentripetalAcceleration, void(units::acceleration::meters_per_second_squared_t centripetalAcceleration));
+    MOCK_METHOD0(GetYawAcceleration, units::angular_acceleration::radians_per_second_squared_t());
+    MOCK_METHOD1(SetYawAcceleration, void(units::angular_acceleration::radians_per_second_squared_t yawAcceleration));
+    MOCK_CONST_METHOD0(GetTrajectoryTime, const std::vector<int> *());
+    MOCK_CONST_METHOD0(GetTrajectoryXPos, const std::vector<units::length::meter_t> *());
+    MOCK_CONST_METHOD0(GetTrajectoryYPos, const std::vector<units::length::meter_t> *());
+    MOCK_CONST_METHOD0(GetTrajectoryVelocity, const std::vector<units::velocity::meters_per_second_t> *());
+    MOCK_CONST_METHOD0(GetTrajectoryAngle, const std::vector<units::angle::radian_t> *());
+    MOCK_METHOD1(SetAccelerationIntention, void(units::acceleration::meters_per_second_squared_t accelerationIntention));
+    MOCK_CONST_METHOD0(GetAccelerationIntention, units::acceleration::meters_per_second_squared_t());
+    MOCK_METHOD1(SetDecelerationIntention, void(units::acceleration::meters_per_second_squared_t decelerationIntention));
+    MOCK_CONST_METHOD0(GetDecelerationIntention, units::acceleration::meters_per_second_squared_t());
+    MOCK_METHOD1(SetAngleIntention, void(units::angle::radian_t angleIntention));
+    MOCK_CONST_METHOD0(GetAngleIntention, units::angle::radian_t());
     MOCK_METHOD1(SetCollisionState, void(bool collisionState));
     MOCK_CONST_METHOD0(GetCollisionState, bool());
-    MOCK_CONST_METHOD0(GetAccelerationAbsolute, double());
+    MOCK_CONST_METHOD0(GetAccelerationAbsolute, units::acceleration::meters_per_second_squared_t());
     MOCK_CONST_METHOD0(GetTouchedRoads, const RoadIntervals &());
-    MOCK_CONST_METHOD1(GetAbsolutePosition, Common::Vector2d (const ObjectPoint& objectPoint));
+    MOCK_CONST_METHOD1(GetAbsolutePosition, Common::Vector2d<units::length::meter_t> (const ObjectPoint& objectPoint));
     MOCK_CONST_METHOD1(GetRoadPosition, const GlobalRoadPositions& (const ObjectPoint& point));
     MOCK_CONST_METHOD1(GetRoads, std::vector<std::string>(ObjectPoint point));
-    MOCK_CONST_METHOD0(GetDistanceReferencePointToLeadingEdge, double());
-    MOCK_CONST_METHOD0(GetEngineSpeed, double());
+    MOCK_CONST_METHOD0(GetDistanceReferencePointToLeadingEdge, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetEngineSpeed, units::angular_velocity::revolutions_per_minute_t());
     MOCK_CONST_METHOD0(GetEffAccelPedal, double());
     MOCK_CONST_METHOD0(GetEffBrakePedal, double());
-    MOCK_CONST_METHOD0(GetSteeringWheelAngle, double());
-    MOCK_CONST_METHOD0(GetMaxAcceleration, double());
-    MOCK_CONST_METHOD0(GetMaxDeceleration, double());
-    MOCK_CONST_METHOD0(GetSpeedGoalMin, double());
-    MOCK_CONST_METHOD0(GetSensorParameters, const openpass::sensors::Parameters&());
+    MOCK_CONST_METHOD0(GetSteeringWheelAngle, units::angle::radian_t());
+    MOCK_CONST_METHOD0(GetMaxAcceleration, units::acceleration::meters_per_second_squared_t());
+    MOCK_CONST_METHOD0(GetMaxDeceleration, units::acceleration::meters_per_second_squared_t());
+    MOCK_CONST_METHOD0(GetSpeedGoalMin, units::velocity::meters_per_second_t());
+    MOCK_CONST_METHOD0(GetSensorParameters, const openpass::sensors::Parameters &());
     MOCK_METHOD1(SetSensorParameters, void(openpass::sensors::Parameters sensorParameters));
-    MOCK_CONST_METHOD3(GetDistanceToConnectorEntrance, double (std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId));
-    MOCK_CONST_METHOD3(GetDistanceToConnectorDeparture, double (std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId));
-    MOCK_CONST_METHOD0(GetDistanceToNextJunction, double());
-    MOCK_CONST_METHOD0(GetYawAcceleration, double());
-    MOCK_CONST_METHOD0(GetTangentialAcceleration, double());
-    MOCK_METHOD1(SetTangentialAcceleration, void(double));
-    MOCK_METHOD3(SetVelocityVector, void(double, double, double));
+    MOCK_CONST_METHOD3(GetDistanceToConnectorEntrance, units::length::meter_t(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId));
+    MOCK_CONST_METHOD3(GetDistanceToConnectorDeparture, units::length::meter_t(std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId));
+    MOCK_CONST_METHOD0(GetDistanceToNextJunction, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetYawAcceleration, units::angular_acceleration::radians_per_second_squared_t());
+    MOCK_CONST_METHOD0(GetTangentialAcceleration, units::acceleration::meters_per_second_squared_t());
+    MOCK_METHOD1(SetTangentialAcceleration, void(units::acceleration::meters_per_second_squared_t));
+    MOCK_METHOD1(SetVelocityVector, void(const mantle_api::Vec3<units::velocity::meters_per_second_t> &velocity));
 };
diff --git a/sim/tests/fakes/gmock/fakeAgentBlueprint.h b/sim/tests/fakes/gmock/fakeAgentBlueprint.h
deleted file mode 100644
index 666c947f79bab0bd74b9a1e65ff810c539860d48..0000000000000000000000000000000000000000
--- a/sim/tests/fakes/gmock/fakeAgentBlueprint.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "gmock/gmock.h"
-#include "include/agentBlueprintInterface.h"
-
-class FakeAgentBlueprint : public AgentBlueprintInterface {
- public:
-  MOCK_METHOD1(SetVehicleComponentProfileNames,
-      void(VehicleComponentProfileNames));
-  MOCK_METHOD1(SetAgentCategory,
-      void(AgentCategory agentTypeGroupName));
-  MOCK_METHOD1(SetAgentProfileName,
-      void(std::string agentTypeName));
-  MOCK_METHOD1(SetVehicleProfileName,
-      void(std::string vehicleModelName));
-  MOCK_METHOD1(SetVehicleModelName,
-      void(std::string vehicleModelName));
-  MOCK_METHOD1(SetVehicleModelParameters,
-      void(VehicleModelParameters vehicleModelParameters));
-  MOCK_METHOD1(SetDriverProfileName,
-      void(std::string));
-  MOCK_METHOD1(SetSpawnParameter,
-      void(SpawnParameter spawnParameter));
-  MOCK_METHOD1(SetSpeedGoalMin,
-      void(double));
-  MOCK_CONST_METHOD0(GetAgentCategory,
-      AgentCategory());
-  MOCK_CONST_METHOD0(GetAgentProfileName,
-      std::string());
-  MOCK_CONST_METHOD0(GetVehicleProfileName,
-      std::string());
-  MOCK_CONST_METHOD0(GetVehicleModelName,
-      std::string());
-  MOCK_CONST_METHOD0(GetVehicleModelParameters,
-      VehicleModelParameters());
-  MOCK_CONST_METHOD0(GetVehicleComponentProfileNames,
-      VehicleComponentProfileNames());
-  MOCK_CONST_METHOD0(GetDriverProfileName,
-      std::string());
-  MOCK_CONST_METHOD0(GetObjectName,
-      std::string());
-  MOCK_CONST_METHOD0(GetAgentType,
-      core::AgentTypeInterface&());
-  MOCK_METHOD0(GetSpawnParameter,
-      SpawnParameter&());
-  MOCK_CONST_METHOD0(GetSpawnParameter,
-      const SpawnParameter&());
-  MOCK_CONST_METHOD0(GetSpeedGoalMin,
-      double());
-  MOCK_METHOD1(SetObjectName,
-      void(std::string));
-  MOCK_METHOD1(AddSensor,
-      void(openpass::sensors::Parameter));
-  MOCK_CONST_METHOD0(GetSensorParameters,
-      openpass::sensors::Parameters());
-  MOCK_METHOD1(SetAgentType,
-      void (std::shared_ptr<core::AgentTypeInterface> agentType));
-};
diff --git a/sim/tests/fakes/gmock/fakeAgentBlueprintProvider.h b/sim/tests/fakes/gmock/fakeAgentBlueprintProvider.h
index 05310233a2f9e3b4a1f8d36380c34926296cd659..437c56707a508032b0c40a9acd6d0da90c6078b4 100644
--- a/sim/tests/fakes/gmock/fakeAgentBlueprintProvider.h
+++ b/sim/tests/fakes/gmock/fakeAgentBlueprintProvider.h
@@ -16,7 +16,8 @@
 
 class FakeAgentBlueprintProvider : public AgentBlueprintProviderInterface {
 public:
-    MOCK_CONST_METHOD2(SampleAgent, AgentBlueprint(const std::string& agentProfileName, const openScenario::Parameters& assignedParameters));
+    MOCK_CONST_METHOD1(SampleSystem, System (const std::string &agentProfileName));
+    MOCK_CONST_METHOD1(SampleVehicleModelName, std::string (const std::string &agentProfileName));
 };
 
 
diff --git a/sim/tests/fakes/gmock/fakeAgentFactory.h b/sim/tests/fakes/gmock/fakeAgentFactory.h
index e36b3771eff4a68851921da941a0e4c0b82df0e2..9cc9effcbfb15282c404a7b3b24de7261370cfb9 100644
--- a/sim/tests/fakes/gmock/fakeAgentFactory.h
+++ b/sim/tests/fakes/gmock/fakeAgentFactory.h
@@ -20,5 +20,5 @@ class FakeAgentFactory : public core::AgentFactoryInterface
 public:
     MOCK_METHOD0(ResetIds, void());
     MOCK_METHOD0(Clear, void());
-    MOCK_METHOD1(AddAgent, core::Agent*(AgentBlueprintInterface*));
+    MOCK_METHOD1(AddAgent, core::Agent*(const AgentBuildInstructions&));
 };
diff --git a/sim/tests/fakes/gmock/fakeAgentSampler.h b/sim/tests/fakes/gmock/fakeAgentSampler.h
index 6512d834ecd8fada8a62ec3c19c2e348299e4bd8..c8424187530299810d9f2ed8e57803bcbdb04f2d 100644
--- a/sim/tests/fakes/gmock/fakeAgentSampler.h
+++ b/sim/tests/fakes/gmock/fakeAgentSampler.h
@@ -15,10 +15,10 @@
 class FakeAgentSampler : public AgentSamplerInterface
 {
  public:
-  MOCK_METHOD3(SampleAgent,
-      bool(AgentBlueprintInterface*,
-           LaneCategory,
-           unsigned int));
+     MOCK_METHOD3(SampleSystem,
+                  bool(AgentBlueprintInterface *,
+                       LaneCategory,
+                       unsigned int));
 };
 
 
diff --git a/sim/tests/fakes/gmock/fakeConfigurationContainer.h b/sim/tests/fakes/gmock/fakeConfigurationContainer.h
index dcef7be397545bd7cd50c9c2bb95af1889b158bd..8dfe90f45c289c86041e49bfa5129ce69fe5aacd 100644
--- a/sim/tests/fakes/gmock/fakeConfigurationContainer.h
+++ b/sim/tests/fakes/gmock/fakeConfigurationContainer.h
@@ -22,14 +22,10 @@ public:
                  std::shared_ptr<SystemConfigInterface> ());
     MOCK_CONST_METHOD0(GetSimulationConfig,
                 const SimulationConfigInterface * ());
-    MOCK_CONST_METHOD0(GetScenery,
-                 const SceneryInterface * ());
-    MOCK_CONST_METHOD0(GetScenario,
-                 const ScenarioInterface * ());
-    MOCK_CONST_METHOD0(GetVehicleModels,
-                 const VehicleModelsInterface * ());
     MOCK_CONST_METHOD0(GetProfiles,
                 const ProfilesInterface * ());
     MOCK_CONST_METHOD0(GetSystemConfigs,
                  const std::map<std::string, std::shared_ptr<SystemConfigInterface>>& ());
+    MOCK_CONST_METHOD0(GetRuntimeInformation,
+                 const openpass::common::RuntimeInformation& ());
 };
diff --git a/sim/tests/fakes/gmock/fakeControlStrategies.h b/sim/tests/fakes/gmock/fakeControlStrategies.h
new file mode 100644
index 0000000000000000000000000000000000000000..3e871ee17b39f91a67f9bed49fbd3ec7fdefeafe
--- /dev/null
+++ b/sim/tests/fakes/gmock/fakeControlStrategies.h
@@ -0,0 +1,24 @@
+/********************************************************************************
+ * Copyright (c) 2022 in-tech GmbH
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+#pragma once
+
+#include "include/controlStrategiesInterface.h"
+#include "gmock/gmock.h"
+
+class FakeControlStrategies : public ControlStrategiesInterface
+{
+public:
+    MOCK_METHOD1(GetStrategies, std::vector<std::shared_ptr<mantle_api::ControlStrategy>> (mantle_api::ControlStrategyType type));
+    MOCK_METHOD1(SetStrategies, void (std::vector<std::shared_ptr<mantle_api::ControlStrategy>> strategies));
+    MOCK_METHOD0(GetCustomCommands, const std::vector<std::string>& ());
+    MOCK_METHOD1(AddCustomCommand, void (const std::string& command));
+    MOCK_METHOD0(ResetCustomCommands, void ());
+};
diff --git a/sim/tests/fakes/gmock/fakeEgoAgent.h b/sim/tests/fakes/gmock/fakeEgoAgent.h
index 7172c960e43c9b3b03148be4f8c5f8ab5f94a4cd..12fed2670f0388a3d964bed5ff6027118ca5ad18 100644
--- a/sim/tests/fakes/gmock/fakeEgoAgent.h
+++ b/sim/tests/fakes/gmock/fakeEgoAgent.h
@@ -16,44 +16,44 @@
 
 class FakeEgoAgent : public EgoAgentInterface
 {
-  public:
-    MOCK_CONST_METHOD0(GetAgent, const AgentInterface* ());
-    MOCK_METHOD3(SetRoadGraph, void (const RoadGraph&& roadGraph, RoadGraphVertex current, RoadGraphVertex target));
-    MOCK_METHOD0(Update, void ());
-    MOCK_CONST_METHOD0(HasValidRoute, bool ());
-    MOCK_METHOD1(SetNewTarget, void (size_t alternativeIndex));
-    MOCK_CONST_METHOD0(GetRoadId, const std::string& ());
-    MOCK_CONST_METHOD1(GetVelocity, double (VelocityScope velocityScope));
-    MOCK_CONST_METHOD2(GetVelocity, double (VelocityScope velocityScope, const WorldObjectInterface* object));
-    MOCK_CONST_METHOD2(GetDistanceToEndOfLane, double (double range, int relativeLane));
-    MOCK_CONST_METHOD3(GetDistanceToEndOfLane, double (double range, int relativeLane, const LaneTypes& acceptableLaneTypes));
-    MOCK_CONST_METHOD3(GetRelativeLanes, RelativeWorldView::Lanes (double range, int relativeLane, bool includeOncoming));
+public:
+    MOCK_CONST_METHOD0(GetAgent, const AgentInterface *());
+    MOCK_METHOD3(SetRoadGraph, void(const RoadGraph &&roadGraph, RoadGraphVertex current, RoadGraphVertex target));
+    MOCK_METHOD0(Update, void());
+    MOCK_CONST_METHOD0(HasValidRoute, bool());
+    MOCK_METHOD1(SetNewTarget, void(size_t alternativeIndex));
+    MOCK_CONST_METHOD0(GetRoadId, const std::string &());
+    MOCK_CONST_METHOD1(GetVelocity, units::velocity::meters_per_second_t(VelocityScope velocityScope));
+    MOCK_CONST_METHOD2(GetVelocity, units::velocity::meters_per_second_t(VelocityScope velocityScope, const WorldObjectInterface *object));
+    MOCK_CONST_METHOD2(GetDistanceToEndOfLane, units::length::meter_t(units::length::meter_t range, int relativeLane));
+    MOCK_CONST_METHOD3(GetDistanceToEndOfLane, units::length::meter_t(units::length::meter_t range, int relativeLane, const LaneTypes &acceptableLaneTypes));
+    MOCK_CONST_METHOD3(GetRelativeLanes, RelativeWorldView::Lanes(units::length::meter_t range, int relativeLane, bool includeOncoming));
     MOCK_CONST_METHOD2(GetRelativeLaneId, std::optional<int> (const WorldObjectInterface* object, ObjectPoint point));
-    MOCK_CONST_METHOD1(GetRelativeJunctions, RelativeWorldView::Roads(double range));
-    MOCK_CONST_METHOD1(GetRelativeRoads, RelativeWorldView::Roads(double range));
-    MOCK_CONST_METHOD3(GetObjectsInRange, std::vector<const WorldObjectInterface*> (double backwardRange, double forwardRange, int relativeLane));
-    MOCK_CONST_METHOD3(GetAgentsInRange, AgentInterfaces (double backwardRange, double forwardRange, int relativeLane));
-    MOCK_CONST_METHOD2(GetTrafficSignsInRange, std::vector<CommonTrafficSign::Entity> (double range, int relativeLane));
-    MOCK_CONST_METHOD2(GetRoadMarkingsInRange, std::vector<CommonTrafficSign::Entity> (double range, int relativeLane));
-    MOCK_CONST_METHOD2(GetTrafficLightsInRange, std::vector<CommonTrafficLight::Entity> (double range, int relativeLane));
-    MOCK_CONST_METHOD3(GetLaneMarkingsInRange, std::vector<LaneMarking::Entity> (double range, Side side, int relativeLane));
-    MOCK_CONST_METHOD3(GetDistanceToObject, std::optional<double> (const WorldObjectInterface* otherObject, const ObjectPoint &ownPoint, const ObjectPoint &otherPoint));
-    MOCK_CONST_METHOD1(GetNetDistance, std::optional<double> (const WorldObjectInterface* otherObject));
+    MOCK_CONST_METHOD1(GetRelativeJunctions, RelativeWorldView::Roads(units::length::meter_t range));
+    MOCK_CONST_METHOD1(GetRelativeRoads, RelativeWorldView::Roads(units::length::meter_t range));
+    MOCK_CONST_METHOD3(GetObjectsInRange, std::vector<const WorldObjectInterface*> (units::length::meter_t backwardRange, units::length::meter_t forwardRange, int relativeLane));
+    MOCK_CONST_METHOD3(GetAgentsInRange, AgentInterfaces (units::length::meter_t backwardRange, units::length::meter_t forwardRange, int relativeLane));
+    MOCK_CONST_METHOD2(GetTrafficSignsInRange, std::vector<CommonTrafficSign::Entity> (units::length::meter_t range, int relativeLane));
+    MOCK_CONST_METHOD2(GetRoadMarkingsInRange, std::vector<CommonTrafficSign::Entity> (units::length::meter_t range, int relativeLane));
+    MOCK_CONST_METHOD2(GetTrafficLightsInRange, std::vector<CommonTrafficLight::Entity> (units::length::meter_t range, int relativeLane));
+    MOCK_CONST_METHOD3(GetLaneMarkingsInRange, std::vector<LaneMarking::Entity> (units::length::meter_t range, Side side, int relativeLane));
+    MOCK_CONST_METHOD3(GetDistanceToObject, std::optional<units::length::meter_t> (const WorldObjectInterface* otherObject, const ObjectPoint &ownPoint, const ObjectPoint &otherPoint));
+    MOCK_CONST_METHOD1(GetNetDistance, std::optional<units::length::meter_t> (const WorldObjectInterface* otherObject));
     MOCK_CONST_METHOD2(GetObstruction, Obstruction (const WorldObjectInterface* otherObject, const std::vector<ObjectPoint> points));
-    MOCK_CONST_METHOD0(GetRelativeYaw, double ());
-    MOCK_CONST_METHOD0(GetPositionLateral, double ());
-    MOCK_CONST_METHOD1(GetLaneRemainder, double (Side side));
-    MOCK_CONST_METHOD1(GetLaneWidth, double (int relativeLane));
-    MOCK_CONST_METHOD2(GetLaneWidth, std::optional<double> (double distance, int relativeLane));
-    MOCK_CONST_METHOD1(GetLaneCurvature, double (int relativeLane));
-    MOCK_CONST_METHOD2(GetLaneCurvature, std::optional<double> (double distance, int relativeLane));
-    MOCK_CONST_METHOD1(GetLaneDirection, double (int relativeLane));
-    MOCK_CONST_METHOD2(GetLaneDirection, std::optional<double> (double distance, int relativeLane));
+    MOCK_CONST_METHOD0(GetPositionLateral, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetRelativeYaw, units::angle::radian_t());
+    MOCK_CONST_METHOD1(GetLaneRemainder, units::length::meter_t(Side side));
+    MOCK_CONST_METHOD1(GetLaneWidth, units::length::meter_t(int relativeLane));
+    MOCK_CONST_METHOD2(GetLaneWidth, std::optional<units::length::meter_t>(units::length::meter_t distance, int relativeLane));
+    MOCK_CONST_METHOD1(GetLaneCurvature, units::curvature::inverse_meter_t(int relativeLane));
+    MOCK_CONST_METHOD2(GetLaneCurvature, std::optional<units::curvature::inverse_meter_t>(units::length::meter_t distance, int relativeLane));
+    MOCK_CONST_METHOD1(GetLaneDirection, units::angle::radian_t(int relativeLane));
+    MOCK_CONST_METHOD2(GetLaneDirection, std::optional<units::angle::radian_t>(units::length::meter_t distance, int relativeLane));
     MOCK_CONST_METHOD0(GetMainLocatePosition, const std::optional<GlobalRoadPosition>&());
-    MOCK_CONST_METHOD0(GetReferencePointPosition, std::optional<GlobalRoadPosition> ());
-    MOCK_CONST_METHOD1(GetLaneIdFromRelative, int (int relativeLaneId));
-    MOCK_CONST_METHOD3(GetWorldPosition, std::optional<Position> (double sDistance, double tDistance, double yaw));
+    MOCK_CONST_METHOD0(GetReferencePointPosition, std::optional<GlobalRoadPosition>());
+    MOCK_CONST_METHOD1(GetLaneIdFromRelative, int(int relativeLaneId));
+    MOCK_CONST_METHOD3(GetWorldPosition, std::optional<Position> (units::length::meter_t sDistance, units::length::meter_t tDistance, units::angle::radian_t yaw));
     MOCK_CONST_METHOD2(GetRoadPositions, GlobalRoadPositions (const ObjectPoint& point, const WorldObjectInterface* object));
-    MOCK_CONST_METHOD1(executeQueryDistanceToEndOfLane, ExecuteReturn<DistanceToEndOfLane> (DistanceToEndOfLaneParameter parameter));
-    MOCK_CONST_METHOD1(executeQueryObjectsInRange, ExecuteReturn<ObjectsInRange> (ObjectsInRangeParameter parameter));
+    MOCK_CONST_METHOD1(executeQueryDistanceToEndOfLane, ExecuteReturn<DistanceToEndOfLane>(DistanceToEndOfLaneParameter parameter));
+    MOCK_CONST_METHOD1(executeQueryObjectsInRange, ExecuteReturn<ObjectsInRange>(ObjectsInRangeParameter parameter));
 };
diff --git a/sim/tests/fakes/gmock/fakeEntityRepository.h b/sim/tests/fakes/gmock/fakeEntityRepository.h
new file mode 100644
index 0000000000000000000000000000000000000000..6b6f59539d4d367a0b91d90d35669bd5cbe24a64
--- /dev/null
+++ b/sim/tests/fakes/gmock/fakeEntityRepository.h
@@ -0,0 +1,37 @@
+/********************************************************************************
+ * Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+#pragma once
+
+#include "gmock/gmock.h"
+#include <MantleAPI/Test/test_utils.h>
+#include "include/entityRepositoryInterface.h"
+
+class FakeEntityRepository : public core::EntityRepositoryInterface
+{
+  public:
+    MOCK_METHOD2(Create, mantle_api::IVehicle& (const std::string& name, const mantle_api::VehicleProperties& properties));
+    MOCK_METHOD3(Create, mantle_api::IVehicle& (mantle_api::UniqueId id, const std::string& name, const mantle_api::VehicleProperties& properties));
+    MOCK_METHOD2(Create, mantle_api::IPedestrian& (const std::string& name, const mantle_api::PedestrianProperties& properties));
+    MOCK_METHOD3(Create, mantle_api::IPedestrian& (mantle_api::UniqueId id, const std::string& name, const mantle_api::PedestrianProperties& properties));
+    MOCK_METHOD2(Create, mantle_api::IStaticObject& (const std::string& name, const mantle_api::StaticObjectProperties& properties));
+    MOCK_METHOD3(Create, mantle_api::IStaticObject& (mantle_api::UniqueId id, const std::string& name, const mantle_api::StaticObjectProperties& properties));
+    MOCK_METHOD0(GetHost, mantle_api::IVehicle& ());
+    MOCK_METHOD1(Get, std::optional<std::reference_wrapper<mantle_api::IEntity>> (const std::string& name));
+    MOCK_METHOD1(Get, std::optional<std::reference_wrapper<mantle_api::IEntity>> (mantle_api::UniqueId id));
+    MOCK_CONST_METHOD1(Contains, bool (mantle_api::UniqueId id));
+    MOCK_METHOD1(Delete, void (const std::string& name));
+    MOCK_METHOD1(Delete, void (mantle_api::UniqueId id));
+    MOCK_CONST_METHOD0(GetEntities, const std::vector<std::unique_ptr<mantle_api::IEntity>>& ());
+    MOCK_METHOD1(RegisterEntityCreatedCallback, void (const std::function<void(mantle_api::IEntity&)>& callback));
+    MOCK_METHOD1(RegisterEntityDeletedCallback, void (const std::function<void(const std::string&)>& callback));
+    MOCK_METHOD1(RegisterEntityDeletedCallback, void (const std::function<void(mantle_api::UniqueId)>& callback));
+    MOCK_METHOD0(SpawnReadyAgents, bool ());
+    MOCK_METHOD0(ConsumeNewAgents, std::vector<core::Agent *> ());
+};
diff --git a/sim/tests/fakes/gmock/fakeEnvironment.h b/sim/tests/fakes/gmock/fakeEnvironment.h
new file mode 100644
index 0000000000000000000000000000000000000000..f8c54386636b240f6a0aa584fa4730251f574730
--- /dev/null
+++ b/sim/tests/fakes/gmock/fakeEnvironment.h
@@ -0,0 +1,41 @@
+/********************************************************************************
+ * Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+#pragma once
+
+#include "gmock/gmock.h"
+#include <MantleAPI/Common/i_geometry_helper.h>
+#include <MantleAPI/Test/test_utils.h>
+#include "include/environmentInterface.h"
+
+class FakeEnvironment : public core::EnvironmentInterface
+{
+  public:
+    MOCK_METHOD2(CreateMap, void (const std::string& map_file_path, const mantle_api::MapDetails& map_details));
+    MOCK_METHOD2(AddEntityToController, void (mantle_api::IEntity& entity, mantle_api::UniqueId controller_id));
+    MOCK_METHOD1(RemoveControllerFromEntity, void (mantle_api::UniqueId entity_id));
+    MOCK_METHOD2(UpdateControlStrategies, void (
+      mantle_api::UniqueId entity_id, std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies));
+    MOCK_CONST_METHOD2(HasControlStrategyGoalBeenReached, bool (mantle_api::UniqueId entity_id, mantle_api::ControlStrategyType type));
+    MOCK_CONST_METHOD0(GetQueryService, const mantle_api::ILaneLocationQueryService& ());
+    MOCK_CONST_METHOD0(GetConverter, const mantle_api::ICoordConverter* ());
+    MOCK_CONST_METHOD0(GetGeometryHelper, const mantle_api::IGeometryHelper* ());
+    MOCK_METHOD1(SetDateTime, void (mantle_api::Time time));
+    MOCK_METHOD0(GetDateTime, mantle_api::Time ());
+    MOCK_METHOD0(GetSimulationTime, mantle_api::Time ());
+    MOCK_METHOD1(SetWeather, void (mantle_api::Weather weather));
+    MOCK_METHOD1(SetRoadCondition, void (std::vector<mantle_api::FrictionPatch> friction_patches));
+    MOCK_METHOD2(SetTrafficSignalState, void (const std::string& traffic_signal_name, const std::string& traffic_signal_state));
+    MOCK_METHOD3(ExecuteCustomCommand, void (const std::vector<std::string>& actors, const std::string& type, const std::string& command));
+    MOCK_METHOD0(GetEntityRepository, core::EntityRepositoryInterface& ());
+    MOCK_METHOD0(GetControllerRepository, mantle_api::MockControllerRepository& ());
+    MOCK_METHOD1(Step, void (const mantle_api::Time &simulationTime));
+    MOCK_METHOD1(SetWorld, void (WorldInterface* world));
+    MOCK_METHOD0(Reset, void ());
+};
diff --git a/sim/tests/fakes/gmock/fakeEventDetectorNetwork.h b/sim/tests/fakes/gmock/fakeEventDetectorNetwork.h
index bbb2050d0616f3338a727638705f18e4010ba62b..cbb38261af496306278ac01f9cfa7fc8d0b874f1 100644
--- a/sim/tests/fakes/gmock/fakeEventDetectorNetwork.h
+++ b/sim/tests/fakes/gmock/fakeEventDetectorNetwork.h
@@ -19,8 +19,8 @@ using namespace core;
 class FakeEventDetectorNetwork : public EventDetectorNetworkInterface
 {
 public:
-    MOCK_METHOD4(Instantiate,
-                 bool(const std::string, const ScenarioInterface*, EventNetworkInterface*, StochasticsInterface*));
+    MOCK_METHOD3(Instantiate,
+                 bool(const std::string&, EventNetworkInterface*, StochasticsInterface*));
     MOCK_METHOD0(Clear,
                  void());
     MOCK_CONST_METHOD0(GetEventDetectors,
diff --git a/sim/tests/fakes/gmock/fakeManipulatorNetwork.h b/sim/tests/fakes/gmock/fakeManipulatorNetwork.h
index b7588b3b5735101385398453f19f4c1ba3595771..04c39aeed7b3e49394e98b690f54f26b431ff9de 100644
--- a/sim/tests/fakes/gmock/fakeManipulatorNetwork.h
+++ b/sim/tests/fakes/gmock/fakeManipulatorNetwork.h
@@ -16,8 +16,8 @@
 class FakeManipulatorNetwork : public ManipulatorNetworkInterface
 {
 public:
-    MOCK_METHOD3(Instantiate,
-                 bool(const std::string, const ScenarioInterface *, core::EventNetworkInterface *));
+    MOCK_METHOD2(Instantiate,
+                 bool(const std::string&, core::EventNetworkInterface *));
     MOCK_METHOD0(Clear,
                  void());
     MOCK_CONST_METHOD0(GetManipulators,
diff --git a/sim/tests/fakes/gmock/fakeOdRoad.h b/sim/tests/fakes/gmock/fakeOdRoad.h
index 02975718df83b10221d4e59c5dc1d87f33069152..dcedfb965e84963d7d7d54c1b1ede4ef237e8cd6 100644
--- a/sim/tests/fakes/gmock/fakeOdRoad.h
+++ b/sim/tests/fakes/gmock/fakeOdRoad.h
@@ -16,18 +16,18 @@
 class FakeOdRoad : public RoadInterface
 {
   public:
-    MOCK_METHOD5(AddGeometryLine, bool(double s, double x, double y, double hdg, double length));
-    MOCK_METHOD6(AddGeometryArc, bool(double s, double x, double y, double hdg, double length, double curvature));
+    MOCK_METHOD5(AddGeometryLine, bool(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length));
+    MOCK_METHOD6(AddGeometryArc, bool(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvature));
     MOCK_METHOD7(AddGeometrySpiral,
-                 bool(double s, double x, double y, double hdg, double length, double curvStart, double curvEnd));
+                 bool(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::curvature::inverse_meter_t curvStart, units::curvature::inverse_meter_t curvEnd));
     MOCK_METHOD9(AddGeometryPoly3,
-                 bool(double s, double x, double y, double hdg, double length, double a, double b, double c, double d));
+                 bool(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d));
     MOCK_METHOD6(AddGeometryParamPoly3,
-                 bool(double s, double x, double y, double hdg, double length, ParamPoly3Parameters parameters));
-    MOCK_METHOD5(AddElevation, bool(double s, double a, double b, double c, double d));
-    MOCK_METHOD5(AddLaneOffset, bool(double s, double a, double b, double c, double d));
+                 bool(units::length::meter_t s, units::length::meter_t x, units::length::meter_t y, units::angle::radian_t hdg, units::length::meter_t length, ParamPoly3Parameters parameters));
+    MOCK_METHOD5(AddElevation, bool(units::length::meter_t s, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d));
+    MOCK_METHOD5(AddLaneOffset, bool(units::length::meter_t s, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d));
     MOCK_METHOD4(AddLink, bool(RoadLinkType, RoadLinkElementType, const std::string &, ContactPointType));
-    MOCK_METHOD1(AddRoadLaneSection, RoadLaneSectionInterface *(double start));
+    MOCK_METHOD1(AddRoadLaneSection, RoadLaneSectionInterface *(units::length::meter_t start));
     MOCK_METHOD1(AddRoadSignal, void(const RoadSignalSpecification &signal));
     MOCK_METHOD1(AddRoadObject, void(const RoadObjectSpecification &object));
     MOCK_CONST_METHOD0(GetId, const std::string());
@@ -41,7 +41,7 @@ class FakeOdRoad : public RoadInterface
     MOCK_METHOD1(SetInDirection, void(bool inDirection));
     MOCK_CONST_METHOD0(GetInDirection, bool());
     MOCK_METHOD1(AddRoadType, void(const RoadTypeSpecification &));
-    MOCK_CONST_METHOD1(GetRoadType, RoadTypeInformation(double start));
+    MOCK_CONST_METHOD1(GetRoadType, RoadTypeInformation(units::length::meter_t start));
     MOCK_CONST_METHOD0(GetJunctionId, const std::string());
     MOCK_METHOD1(SetJunctionId, void(const std::string &id));
 };
diff --git a/sim/tests/fakes/gmock/fakeProfiles.h b/sim/tests/fakes/gmock/fakeProfiles.h
index 893bf22d8927beaeea18e71a794eb0efe22a48e8..a9e27af1ce5c7c57a09848ff6bb99cf657a2587f 100644
--- a/sim/tests/fakes/gmock/fakeProfiles.h
+++ b/sim/tests/fakes/gmock/fakeProfiles.h
@@ -19,17 +19,19 @@ class FakeProfiles : public ProfilesInterface {
       const std::unordered_map<std::string, AgentProfile> &());
   MOCK_METHOD2(AddAgentProfile,
       bool (std::string, AgentProfile));
-  MOCK_CONST_METHOD0(GetVehicleProfiles,
-      const std::unordered_map<std::string, VehicleProfile> &());
-  MOCK_METHOD2(AddVehicleProfile,
-      void (const std::string&, const VehicleProfile&));
+  MOCK_CONST_METHOD0(GetSystemProfiles,
+      const std::unordered_map<std::string, SystemProfile> &());
+  MOCK_METHOD2(AddSystemProfile,
+      void (const std::string&, const SystemProfile&));
   MOCK_CONST_METHOD0(GetProfileGroups,
       const ProfileGroups &());
   MOCK_METHOD3(AddProfileGroup,
       bool (std::string, std::string, openpass::parameter::ParameterSetLevel1));
   MOCK_CONST_METHOD1(GetDriverProbabilities,
       const StringProbabilities &(std::string));
-  MOCK_CONST_METHOD1(GetVehicleProfileProbabilities,
+  MOCK_CONST_METHOD1(GetSystemProfileProbabilities,
+      const StringProbabilities &(std::string));
+  MOCK_CONST_METHOD1(GetVehicleModelsProbabilities,
       const StringProbabilities &(std::string));
   MOCK_CONST_METHOD2(GetProfile,
       const openpass::parameter::ParameterSetLevel1& (const std::string&, const std::string&));
diff --git a/sim/tests/fakes/gmock/fakeRadio.h b/sim/tests/fakes/gmock/fakeRadio.h
index 95e9eaba7585a8e74d6420ee36ded8a2a7ecd3e2..1c22db2fbe43f688a9794613ea444feb3d872387 100644
--- a/sim/tests/fakes/gmock/fakeRadio.h
+++ b/sim/tests/fakes/gmock/fakeRadio.h
@@ -20,8 +20,8 @@
 class FakeRadio : public RadioInterface
 {
 public:
-    MOCK_METHOD4(Send, void(double, double, double, DetectedObject));
-    MOCK_METHOD3(Receive, std::vector<DetectedObject>(double, double, double));
+    MOCK_METHOD4(Send, void(units::length::meter_t, units::length::meter_t, units::power::watt_t, DetectedObject));
+    MOCK_METHOD3(Receive, std::vector<DetectedObject>(units::length::meter_t, units::length::meter_t, units::sensitivity));
     MOCK_METHOD0(Reset, void());
 };
 
diff --git a/sim/tests/fakes/gmock/fakeRoadGeometry.h b/sim/tests/fakes/gmock/fakeRoadGeometry.h
index 1aa484596b0f39255d1361d2f19dcc91de03dc83..348244f9f8f55d1aa3cbe269fd3e7e2d371d1ce5 100644
--- a/sim/tests/fakes/gmock/fakeRoadGeometry.h
+++ b/sim/tests/fakes/gmock/fakeRoadGeometry.h
@@ -16,9 +16,9 @@
 class FakeRoadGeometry : public RoadGeometryInterface
 {
   public:
-    MOCK_CONST_METHOD2(GetCoord, Common::Vector2d (double geometryOffset, double laneOffset));
-    MOCK_CONST_METHOD1(GetDir, double (double geometryOffset));
-    MOCK_CONST_METHOD0(GetS, double ());
-    MOCK_CONST_METHOD0(GetHdg, double ());
-    MOCK_CONST_METHOD0(GetLength, double ());
+      MOCK_CONST_METHOD2(GetCoord, Common::Vector2d<units::length::meter_t>(units::length::meter_t geometryOffset, units::length::meter_t laneOffset));
+      MOCK_CONST_METHOD1(GetDir, units::angle::radian_t(units::length::meter_t geometryOffset));
+      MOCK_CONST_METHOD0(GetS, units::length::meter_t());
+      MOCK_CONST_METHOD0(GetHdg, units::angle::radian_t());
+      MOCK_CONST_METHOD0(GetLength, units::length::meter_t());
 };
diff --git a/sim/tests/fakes/gmock/fakeRoadLane.h b/sim/tests/fakes/gmock/fakeRoadLane.h
index ca25efc44ce7c76e0ae7220287ffde1488aa6b31..8d7505fd6ba223bd9776d574f37546275dbc6361 100644
--- a/sim/tests/fakes/gmock/fakeRoadLane.h
+++ b/sim/tests/fakes/gmock/fakeRoadLane.h
@@ -16,9 +16,9 @@
 class FakeRoadLane : public RoadLaneInterface
 {
   public:
-    MOCK_METHOD5(AddWidth, bool (double sOffset, double a, double b, double c, double d));
-    MOCK_METHOD5(AddBorder, bool (double sOffset, double a, double b, double c, double d));
-    MOCK_METHOD6(AddRoadMark, bool (double sOffset,
+    MOCK_METHOD5(AddWidth, bool (units::length::meter_t sOffset, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d));
+    MOCK_METHOD5(AddBorder, bool (units::length::meter_t sOffset, units::length::meter_t a, double b, units::unit_t<units::inverse<units::length::meter>> c, units::unit_t<units::inverse<units::squared<units::length::meter>>> d));
+    MOCK_METHOD6(AddRoadMark, bool (units::length::meter_t sOffset,
                                     RoadLaneRoadDescriptionType descType,
                                     RoadLaneRoadMarkType roadMark,
                                     RoadLaneRoadMarkColor color,
diff --git a/sim/tests/fakes/gmock/fakeRoadLaneSection.h b/sim/tests/fakes/gmock/fakeRoadLaneSection.h
index f050da7155c7a9a6b538b5e3902b6abf2e8544ff..f5e5463cfe7590da79336373043905031f3707d4 100644
--- a/sim/tests/fakes/gmock/fakeRoadLaneSection.h
+++ b/sim/tests/fakes/gmock/fakeRoadLaneSection.h
@@ -18,7 +18,7 @@ class FakeRoadLaneSection : public RoadLaneSectionInterface
   public:
     MOCK_METHOD2(AddRoadLane, RoadLaneInterface *(int id, RoadLaneType type));
     MOCK_CONST_METHOD0(GetLanes, std::map<int, RoadLaneInterface *> &());
-    MOCK_CONST_METHOD0(GetStart, double());
+    MOCK_CONST_METHOD0(GetStart, units::length::meter_t());
     MOCK_METHOD1(SetInDirection, void(bool inDirection));
     MOCK_METHOD1(SetLaneIndexOffset, void(int laneIndexOffset));
     MOCK_METHOD1(SetId, void(int Id));
diff --git a/sim/tests/fakes/gmock/fakeRoadObject.h b/sim/tests/fakes/gmock/fakeRoadObject.h
index e4ba0d2927abf2dc4035b18e752c48b0706fac09..ace6ff588f8885119bc2ea571a4dc12b52193285 100644
--- a/sim/tests/fakes/gmock/fakeRoadObject.h
+++ b/sim/tests/fakes/gmock/fakeRoadObject.h
@@ -17,16 +17,16 @@ class FakeRoadObject : public RoadObjectInterface
 public:
     MOCK_CONST_METHOD0(GetType, RoadObjectType());
     MOCK_CONST_METHOD0(GetId, std::string());
-    MOCK_CONST_METHOD0(GetS, double());
-    MOCK_CONST_METHOD0(GetT, double());
-    MOCK_CONST_METHOD0(GetZOffset, double());
+    MOCK_CONST_METHOD0(GetS, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetT, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetZOffset, units::length::meter_t());
     MOCK_CONST_METHOD1(IsValidForLane, bool(int));
-    MOCK_CONST_METHOD0(GetLength, double());
-    MOCK_CONST_METHOD0(GetWidth, double());
-    MOCK_CONST_METHOD0(GetHdg, double());
-    MOCK_CONST_METHOD0(GetHeight, double());
-    MOCK_CONST_METHOD0(GetPitch, double());
-    MOCK_CONST_METHOD0(GetRoll, double());
+    MOCK_CONST_METHOD0(GetLength, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetWidth, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetHdg, units::angle::radian_t());
+    MOCK_CONST_METHOD0(GetHeight, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetPitch, units::angle::radian_t());
+    MOCK_CONST_METHOD0(GetRoll, units::angle::radian_t());
     MOCK_CONST_METHOD0(GetName, std::string());
     MOCK_CONST_METHOD0(IsContinuous, bool());
 };
diff --git a/sim/tests/fakes/gmock/fakeRoadSignal.h b/sim/tests/fakes/gmock/fakeRoadSignal.h
index 442eb25e01e8b3c6a41d0e72276c5240d1aa9077..e930b6be3c86cad712aec42808deb22712734b5d 100644
--- a/sim/tests/fakes/gmock/fakeRoadSignal.h
+++ b/sim/tests/fakes/gmock/fakeRoadSignal.h
@@ -19,8 +19,8 @@ class FakeRoadSignal: public RoadSignalInterface
 {
 public:
     MOCK_CONST_METHOD0(GetId, std::string ());
-    MOCK_CONST_METHOD0(GetS, double ());
-    MOCK_CONST_METHOD0(GetT, double ());
+    MOCK_CONST_METHOD0(GetS, units::length::meter_t ());
+    MOCK_CONST_METHOD0(GetT, units::length::meter_t ());
     MOCK_CONST_METHOD1(IsValidForLane, bool (int laneId));
     MOCK_CONST_METHOD0(GetCountry, std::string ());
     MOCK_CONST_METHOD0(GetType, std::string ());
@@ -30,11 +30,11 @@ public:
     MOCK_CONST_METHOD0(GetText, std::string ());
     MOCK_CONST_METHOD0(GetDependencies, std::vector<std::string> ());
     MOCK_CONST_METHOD0(GetIsDynamic, bool());
-    MOCK_CONST_METHOD0(GetWidth, double ());
-    MOCK_CONST_METHOD0(GetHeight, double ());
-    MOCK_CONST_METHOD0(GetZOffset, double ());
-    MOCK_CONST_METHOD0(GetPitch, double ());
-    MOCK_CONST_METHOD0(GetRoll, double ());
+    MOCK_CONST_METHOD0(GetWidth, units::length::meter_t ());
+    MOCK_CONST_METHOD0(GetHeight, units::length::meter_t ());
+    MOCK_CONST_METHOD0(GetZOffset, units::length::meter_t ());
+    MOCK_CONST_METHOD0(GetPitch, units::angle::radian_t ());
+    MOCK_CONST_METHOD0(GetRoll, units::angle::radian_t ());
     MOCK_CONST_METHOD0(GetOrientation, bool ());
-    MOCK_CONST_METHOD0(GetHOffset, double ());
+    MOCK_CONST_METHOD0(GetHOffset, units::angle::radian_t ());
 };
diff --git a/sim/tests/fakes/gmock/fakeScenario.h b/sim/tests/fakes/gmock/fakeScenario.h
deleted file mode 100644
index d32ed9d4bcf85fcea928d315e7827cf2781c8baf..0000000000000000000000000000000000000000
--- a/sim/tests/fakes/gmock/fakeScenario.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#pragma once
-
-#include "gmock/gmock.h"
-#include "include/scenarioInterface.h"
-
-class FakeScenario : public ScenarioInterface
-{
-public:
-    MOCK_CONST_METHOD0(GetScenarioEntities,
-                 const std::vector<ScenarioEntity*>&());
-    MOCK_CONST_METHOD0(GetVehicleCatalogPath,
-                 const std::string & ());
-    MOCK_METHOD1(SetVehicleCatalogPath,
-                 void(const std::string&));
-    MOCK_CONST_METHOD0(GetPedestrianCatalogPath,
-                 const std::string & ());
-    MOCK_METHOD1(SetPedestrianCatalogPath,
-                 void(const std::string&));
-    MOCK_CONST_METHOD0(GetTrajectoryCatalogPath,
-                 const std::string & ());
-    MOCK_METHOD1(SetTrajectoryCatalogPath,
-                 void(const std::string&));
-    MOCK_CONST_METHOD0(GetSceneryPath,
-                 const std::string & ());
-    MOCK_METHOD1(SetSceneryPath,
-                 void(const std::string&));
-    MOCK_CONST_METHOD0(GetSceneryDynamics,
-                 const SceneryDynamicsInterface& ());
-    MOCK_METHOD1(AddTrafficSignalController,
-                 void (const openScenario::TrafficSignalController& controller));
-    MOCK_METHOD1(AddScenarioEntity,
-                 void(const ScenarioEntity&));
-    MOCK_METHOD1(AddScenarioGroupsByEntityNames,
-                 void(const std::map<std::string, std::vector<std::string>>&));
-    MOCK_METHOD1(AddConditionalEventDetector,
-                 void(const openScenario::ConditionalEventDetectorInformation&));
-    MOCK_METHOD2(AddAction,
-                 void(const openScenario::Action, const std::string));
-    MOCK_CONST_METHOD0(GetEventDetectorInformations,
-                 const std::vector<openScenario::ConditionalEventDetectorInformation>&());
-    MOCK_CONST_METHOD0(GetScenarioGroups,
-                 const std::map<std::string, std::vector<ScenarioEntity*>>&());
-    MOCK_CONST_METHOD0(GetActions,
-                       std::vector<openScenario::ManipulatorInformation>());
-    MOCK_CONST_METHOD0(GetEndTime,
-                       int());
-    MOCK_METHOD1(SetEndTime,
-                 void(const double));
-    MOCK_CONST_METHOD0(GetEntities,
-                       const std::vector<ScenarioEntity>&());
-    MOCK_METHOD1(SetEnvironment,
-                 void (const openScenario::EnvironmentAction& ));
-};
diff --git a/sim/tests/fakes/gmock/fakeSpawnPointNetwork.h b/sim/tests/fakes/gmock/fakeSpawnPointNetwork.h
index aba8ec8f99316da017b52ebefbfd7d911a6e7677..05135a50ff6c9076c7f493a471f3dbae3885271a 100644
--- a/sim/tests/fakes/gmock/fakeSpawnPointNetwork.h
+++ b/sim/tests/fakes/gmock/fakeSpawnPointNetwork.h
@@ -18,19 +18,18 @@ namespace core {
 class FakeSpawnPointNetwork : public SpawnPointNetworkInterface
 {
 public:
-    MOCK_METHOD6(Instantiate,
-                 bool(const SpawnPointLibraryInfoCollection&,
-                      AgentFactoryInterface*,
-                      const AgentBlueprintProviderInterface*,
-                      StochasticsInterface*,
-                      const ScenarioInterface*,
-                      const std::optional<ProfileGroup>&));
+    MOCK_METHOD7(Instantiate,
+                bool(const SpawnPointLibraryInfoCollection& libraryInfos,
+                    AgentFactoryInterface* agentFactory,
+                    StochasticsInterface* stochastics,
+                    const std::optional<ProfileGroup>& spawnPointProfiles,
+                    ConfigurationContainerInterface* configurationContainer,
+                    std::shared_ptr<mantle_api::IEnvironment> environment,
+                    std::shared_ptr<Vehicles> vehicles));
     MOCK_METHOD0(TriggerPreRunSpawnZones,
                  bool());
     MOCK_METHOD1(TriggerRuntimeSpawnPoints,
                  bool(const int));
-    MOCK_METHOD0(ConsumeNewAgents,
-                 std::vector<Agent*>());
     MOCK_METHOD0(Clear,
                  void());
 };
diff --git a/sim/tests/fakes/gmock/fakeStream.h b/sim/tests/fakes/gmock/fakeStream.h
index 43cc42ed42ef56aceb4cdefff68761c8a4ba9371..db35f05df2f0994bc6c29f683e5c7e8968fe7bb9 100644
--- a/sim/tests/fakes/gmock/fakeStream.h
+++ b/sim/tests/fakes/gmock/fakeStream.h
@@ -22,8 +22,8 @@ public:
     MOCK_CONST_METHOD2(GetAgentsInRange, AgentInterfaces (const StreamPosition& start, const StreamPosition& end));
     MOCK_CONST_METHOD2(GetObjectsInRange, std::vector<const WorldObjectInterface*> (const StreamPosition& start, const StreamPosition& end));
     MOCK_CONST_METHOD2(GetStreamPosition, std::optional<StreamPosition> (const WorldObjectInterface* object, const ObjectPoint& point));
-    MOCK_CONST_METHOD0(GetLength, double ());
-    MOCK_CONST_METHOD0(GetLaneTypes, std::vector<std::pair<double, LaneType>> ());
+    MOCK_CONST_METHOD0(GetLength, units::length::meter_t ());
+    MOCK_CONST_METHOD0(GetLaneTypes, std::vector<std::pair<units::length::meter_t, LaneType>> ());
 };
 
 
@@ -35,5 +35,5 @@ public:
     MOCK_CONST_METHOD0(GetAllLaneStreams, std::vector<std::unique_ptr<LaneStreamInterface>> ());
     MOCK_CONST_METHOD2(GetLaneStream, std::unique_ptr<LaneStreamInterface> (const StreamPosition& startPosition, const int laneId));
     MOCK_CONST_METHOD1(GetLaneStream, std::unique_ptr<LaneStreamInterface> (const GlobalRoadPosition& startPosition));
-    MOCK_CONST_METHOD0(GetLength, double ());
+    MOCK_CONST_METHOD0(GetLength, units::length::meter_t ());
 };
diff --git a/sim/tests/fakes/gmock/fakeVehicleModels.h b/sim/tests/fakes/gmock/fakeVehicleModels.h
index 5a62670c152b49fc60ff45b779a503000f1db896..a3d35a0a9f6b091a1ab566495d2a34174ac0bfcc 100644
--- a/sim/tests/fakes/gmock/fakeVehicleModels.h
+++ b/sim/tests/fakes/gmock/fakeVehicleModels.h
@@ -15,12 +15,10 @@
 
 class FakeVehicleModels : public VehicleModelsInterface {
  public:
-  MOCK_CONST_METHOD0(GetVehicleModelMap,
-      const VehicleModelMap&());
+  MOCK_CONST_METHOD1(GetVehicleModel,
+      mantle_api::VehicleProperties(std::string));
   MOCK_METHOD2(AddVehicleModel,
-      void(const std::string&, const ParametrizedVehicleModelParameters&));
-  MOCK_CONST_METHOD2(GetVehicleModel,
-      VehicleModelParameters(std::string, const openScenario::Parameters&));
+      void(const std::string&, mantle_api::VehicleProperties));
 };
 
 
diff --git a/sim/tests/fakes/gmock/fakeWorld.h b/sim/tests/fakes/gmock/fakeWorld.h
index c99587025f8d26d34870e5cd864c004a4449b8e5..66bfeab196e4412284d0fa3de54958114fa641e6 100644
--- a/sim/tests/fakes/gmock/fakeWorld.h
+++ b/sim/tests/fakes/gmock/fakeWorld.h
@@ -10,100 +10,98 @@
  ********************************************************************************/
 #pragma once
 
+#include "common/globalDefinitions.h"
 #include "gmock/gmock.h"
-
 #include "include/parameterInterface.h"
-#include "include/sceneryDynamicsInterface.h"
 #include "include/worldInterface.h"
-#include "common/globalDefinitions.h"
-#include "common/openScenarioDefinitions.h"
 
 class FakeWorld : public WorldInterface
 {
   public:
     MOCK_METHOD0(CreateAgentAdapterForAgent, AgentInterface*());
-    MOCK_METHOD1(CreateAgentAdapter, AgentInterface&(const AgentBlueprintInterface &agentBlueprint));
+    MOCK_METHOD1(CreateAgentAdapter, AgentInterface&(const AgentBuildInstructions &agentBlueprint));
     MOCK_CONST_METHOD1(GetAgent, AgentInterface*(int id));
     MOCK_METHOD1(GetAgentByName, AgentInterface*(const std::string &scenarioName));
     MOCK_METHOD0(GetEgoAgent, AgentInterface*());
     MOCK_METHOD0(CreateGlobalDrivingView, bool());
-    MOCK_METHOD3(CreateScenery, bool(const SceneryInterface *scenery, const SceneryDynamicsInterface& sceneryDynamics, const TurningRates& turningRates));
+    MOCK_METHOD2(CreateScenery, bool(const SceneryInterface *scenery, const TurningRates& turningRates));
+    MOCK_METHOD1(SetWeather, void(const mantle_api::Weather& weather));
     MOCK_METHOD1(CreateWorldScenario, bool(const std::string &scenarioFilename));
     MOCK_METHOD1(CreateWorldScenery, bool(const std::string &sceneryFilename));
     MOCK_METHOD0(Instantiate, bool());
-    MOCK_CONST_METHOD1(GetLaneSections, LaneSections(const std::string& roadId));
-    MOCK_METHOD6(IntersectsWithAgent, bool(double x, double y, double rotation, double length, double width, double center));
+    MOCK_CONST_METHOD1(GetLaneSections, LaneSections(const std::string &roadId));
+    MOCK_METHOD6(IntersectsWithAgent, bool(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t rotation, units::length::meter_t length, units::length::meter_t width, units::length::meter_t center));
     MOCK_METHOD0(isInstantiated, bool());
-    MOCK_METHOD3(IsSValidOnLane, bool(std::string roadId, int laneId, double distance));
+    MOCK_METHOD3(IsSValidOnLane, bool(std::string roadId, int laneId, units::length::meter_t distance));
     MOCK_CONST_METHOD2(IsDirectionalRoadExisting, bool(const std::string &roadId, bool inOdDirection));
-    MOCK_METHOD4(IsLaneTypeValid, bool(const std::string &roadId, const int laneId, const double distanceOnLane, const LaneTypes& validLaneTypes));
-
-    MOCK_CONST_METHOD0(GetBicycle, const AgentInterface*());
+    MOCK_METHOD4(IsLaneTypeValid, bool(const std::string &roadId, const int laneId, const units::length::meter_t distanceOnLane, const LaneTypes& validLaneTypes));
+    MOCK_CONST_METHOD0(GetBicycle, const AgentInterface *());
     MOCK_CONST_METHOD1(GetLastCarInlane, const AgentInterface*(int laneNumber));
     MOCK_CONST_METHOD0(GetSpecialAgent, const AgentInterface*());
-    MOCK_METHOD0(GetRemovedAgentsInPreviousTimestep, const std::vector<int> ());
-    MOCK_METHOD0(GetAgents, std::map<int, AgentInterface*>());
-    MOCK_CONST_METHOD0(GetTrafficObjects, const std::vector<const TrafficObjectInterface*>&());
-    MOCK_CONST_METHOD0(GetWorldObjects, const std::vector<const WorldObjectInterface*>&());
-    MOCK_CONST_METHOD5(GetDistanceToEndOfLane, RouteQueryResult<double> (const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance,
-                                                                                     double maximumSearchLength));
-    MOCK_CONST_METHOD6(GetDistanceToEndOfLane, RouteQueryResult<double> (const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double initialSearchDistance,
-                                                                                     double maximumSearchLength, const LaneTypes& laneTypes));
+    MOCK_METHOD0(GetRemovedAgentsInPreviousTimestep, const std::vector<int>());
+    MOCK_METHOD0(GetAgents, std::map<int, AgentInterface *>());
+    MOCK_CONST_METHOD0(GetTrafficObjects, const std::vector<const TrafficObjectInterface *> &());
+    MOCK_CONST_METHOD0(GetWorldObjects, const std::vector<const WorldObjectInterface *> &());
+    MOCK_CONST_METHOD5(GetDistanceToEndOfLane, RouteQueryResult<units::length::meter_t>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance,
+                                                                                        units::length::meter_t maximumSearchLength));
+    MOCK_CONST_METHOD6(GetDistanceToEndOfLane, RouteQueryResult<units::length::meter_t>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t initialSearchDistance,
+                                                                                        units::length::meter_t maximumSearchLength, const LaneTypes &laneTypes));
     MOCK_CONST_METHOD0(GetFriction, double());
-    MOCK_CONST_METHOD3(GetLaneCurvature, double(std::string roadId, int laneId, double position));
-    MOCK_CONST_METHOD5(GetLaneCurvature,  RouteQueryResult<std::optional<double>>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance));
-    MOCK_CONST_METHOD3(GetLaneDirection, double(std::string roadId, int laneId, double position));
-    MOCK_CONST_METHOD5(GetLaneDirection,  RouteQueryResult<std::optional<double>>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance));
-    MOCK_CONST_METHOD3(GetLaneWidth, double(std::string roadId, int laneId, double position));
-    MOCK_CONST_METHOD5(GetLaneWidth,  RouteQueryResult<std::optional<double>>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double position, double distance));
-    MOCK_CONST_METHOD0(GetVisibilityDistance, double());
-    MOCK_CONST_METHOD2(GetLaneId, int(uint64_t streamId, double endDistance));
-    MOCK_CONST_METHOD4(LaneCoord2WorldCoord, Position(double distanceOnLane, double offset, std::string roadId, int laneId));
+    MOCK_CONST_METHOD3(GetLaneCurvature, units::curvature::inverse_meter_t(std::string roadId, int laneId, units::length::meter_t position));
+    MOCK_CONST_METHOD5(GetLaneCurvature, RouteQueryResult<std::optional<units::curvature::inverse_meter_t>>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance));
+    MOCK_CONST_METHOD3(GetLaneDirection, units::angle::radian_t(std::string roadId, int laneId, units::length::meter_t position));
+    MOCK_CONST_METHOD5(GetLaneDirection, RouteQueryResult<std::optional<units::angle::radian_t>>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance));
+    MOCK_CONST_METHOD3(GetLaneWidth, units::length::meter_t(std::string roadId, int laneId, units::length::meter_t position));
+    MOCK_CONST_METHOD5(GetLaneWidth, RouteQueryResult<std::optional<units::length::meter_t>>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t position, units::length::meter_t distance));
+    MOCK_CONST_METHOD0(GetVisibilityDistance, units::length::meter_t());
+    MOCK_CONST_METHOD2(GetLaneId, int(uint64_t streamId, units::length::meter_t endDistance));
+    MOCK_CONST_METHOD4(LaneCoord2WorldCoord, Position(units::length::meter_t distanceOnLane, units::length::meter_t offset, std::string roadId, int laneId));
     MOCK_CONST_METHOD2(RoadCoord2WorldCoord, Position(RoadPosition roadCoord, std::string roadID));
-    MOCK_CONST_METHOD3(WorldCoord2LaneCoord, GlobalRoadPositions (double x, double y, double heading));
-    MOCK_CONST_METHOD1(GetRoadLength, double(const std::string& roadId));
+    MOCK_CONST_METHOD3(WorldCoord2LaneCoord, GlobalRoadPositions(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t heading));
+    MOCK_CONST_METHOD1(GetRoadLength, units::length::meter_t(const std::string &roadId));
     MOCK_CONST_METHOD5(GetObstruction, RouteQueryResult<Obstruction>(const RoadGraph &roadGraph, RoadGraphVertex startNode, const GlobalRoadPosition &ownPosition,
-                                                                     const std::map<ObjectPoint, Common::Vector2d> &points, const RoadIntervals &touchedRoads));
+                                                                     const std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> &points, const RoadIntervals &touchedRoads));
     MOCK_CONST_METHOD0(GetTimeOfDay, std::string());
-    MOCK_CONST_METHOD0(GetTrafficRules, const TrafficRules& ());
-    MOCK_CONST_METHOD5(GetTrafficSignsInRange, RouteQueryResult<std::vector<CommonTrafficSign::Entity>>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double searchRange));
-    MOCK_CONST_METHOD5(GetRoadMarkingsInRange, RouteQueryResult<std::vector<CommonTrafficSign::Entity>>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double searchRange));
-    MOCK_CONST_METHOD5(GetTrafficLightsInRange, RouteQueryResult<std::vector<CommonTrafficLight::Entity>>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double searchRange));
-    MOCK_CONST_METHOD6(GetLaneMarkings, RouteQueryResult<std::vector<LaneMarking::Entity>> (const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double range, Side side));
-    MOCK_CONST_METHOD6(GetAgentsInRange, RouteQueryResult<AgentInterfaces>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double backwardRange, double forwardRange));
-    MOCK_CONST_METHOD6(GetObjectsInRange, RouteQueryResult<std::vector<const WorldObjectInterface*>>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double startDistance, double backwardRange, double forwardRange));
-    MOCK_CONST_METHOD2(GetAgentsInRangeOfJunctionConnection, AgentInterfaces (std::string connectingRoadId, double range));
-    MOCK_CONST_METHOD3(GetDistanceToConnectorEntrance, double (/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId));
-    MOCK_CONST_METHOD3(GetDistanceToConnectorDeparture, double (/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId));
+    MOCK_CONST_METHOD0(GetTrafficRules, const TrafficRules &());
+    MOCK_CONST_METHOD5(GetTrafficSignsInRange, RouteQueryResult<std::vector<CommonTrafficSign::Entity>>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t searchRange));
+    MOCK_CONST_METHOD5(GetRoadMarkingsInRange, RouteQueryResult<std::vector<CommonTrafficSign::Entity>>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t searchRange));
+    MOCK_CONST_METHOD5(GetTrafficLightsInRange, RouteQueryResult<std::vector<CommonTrafficLight::Entity>>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t searchRange));
+    MOCK_CONST_METHOD6(GetLaneMarkings, RouteQueryResult<std::vector<LaneMarking::Entity>>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t range, Side side));
+    MOCK_CONST_METHOD6(GetAgentsInRange, RouteQueryResult<AgentInterfaces>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t backwardRange, units::length::meter_t forwardRange));
+    MOCK_CONST_METHOD6(GetObjectsInRange, RouteQueryResult<std::vector<const WorldObjectInterface *>>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t startDistance, units::length::meter_t backwardRange, units::length::meter_t forwardRange));
+    MOCK_CONST_METHOD2(GetAgentsInRangeOfJunctionConnection, AgentInterfaces(std::string connectingRoadId, units::length::meter_t range));
+    MOCK_CONST_METHOD3(GetDistanceToConnectorEntrance, units::length::meter_t (/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId));
+    MOCK_CONST_METHOD3(GetDistanceToConnectorDeparture, units::length::meter_t (/*const ObjectPosition position,*/ std::string intersectingConnectorId, int intersectingLaneId, std::string ownConnectorId));
     MOCK_CONST_METHOD0(GetGlobalDrivingView, void*());
     MOCK_CONST_METHOD0(GetGlobalObjects, void*());
     MOCK_METHOD0(Clear, void());
     MOCK_METHOD1(ExtractParameter, void(ParameterInterface *parameters));
-    MOCK_METHOD1(RemoveAgent, void(const AgentInterface*agent));
-    MOCK_METHOD1(QueueAgentRemove, void(const AgentInterface*agent));
+    MOCK_METHOD1(RemoveAgent, void(const AgentInterface *agent));
+    MOCK_METHOD1(QueueAgentRemove, void(const AgentInterface *agent));
     MOCK_METHOD1(QueueAgentUpdate, void(std::function<void()> func));
     MOCK_METHOD2(QueueAgentUpdate, void(std::function<void(double)> func, double val));
     MOCK_METHOD0(Reset, void());
     MOCK_METHOD1(SetTimeOfDay, void(int timeOfDay));
     MOCK_METHOD1(SetWeekday, void(Weekday weekday));
     MOCK_METHOD1(SyncGlobalData, void(int timestamp));
-    MOCK_METHOD1(PublishGlobalData, void (int timestamp));
+    MOCK_METHOD1(PublishGlobalData, void(int timestamp));
     MOCK_CONST_METHOD0(GetOsiGroundTruth, void*());
-    MOCK_METHOD0(GetWorldData, void*());
+    MOCK_METHOD0(GetWorldData, void *());
     MOCK_CONST_METHOD0(GetWeekday, Weekday());
     MOCK_CONST_METHOD2(GetConnectionsOnJunction, std::vector<JunctionConnection> (std::string junctionId, std::string incomingRoadId));
     MOCK_CONST_METHOD1(GetIntersectingConnections, std::vector<IntersectingConnection> (std::string connectingRoadId));
     MOCK_CONST_METHOD1(GetPrioritiesOnJunction, std::vector<JunctionConnectorPriority> (std::string junctionId));
     MOCK_CONST_METHOD1(GetRoadSuccessor, RoadNetworkElement (std::string roadId));
     MOCK_CONST_METHOD1(GetRoadPredecessor, RoadNetworkElement (std::string roadId));
-    MOCK_CONST_METHOD4(GetDistanceBetweenObjects, RouteQueryResult<std::optional<double>> (const RoadGraph& roadGraph, RoadGraphVertex startNode, double ownPosition, const GlobalRoadPositions &target));
-    MOCK_CONST_METHOD4(GetRelativeJunctions, RouteQueryResult<RelativeWorldView::Roads>(const RoadGraph &roadGraph, RoadGraphVertex startNode, double startDistance, double range));
-    MOCK_CONST_METHOD4(GetRelativeRoads, RouteQueryResult<RelativeWorldView::Roads>(const RoadGraph& roadGraph, RoadGraphVertex startNode, double startDistance, double range));
-    MOCK_CONST_METHOD6(GetRelativeLanes, RouteQueryResult<RelativeWorldView::Lanes>(const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, double range, bool includeOncoming));
-    MOCK_CONST_METHOD5(GetRelativeLaneId, RouteQueryResult<std::optional<int>> (const RoadGraph& roadGraph, RoadGraphVertex startNode, int laneId, double distance, GlobalRoadPositions targetPosition));
-    MOCK_CONST_METHOD3(GetRoadGraph, std::pair<RoadGraph, RoadGraphVertex>(const RouteElement& start, int maxDepth, bool inDrivingDirection));
-    MOCK_CONST_METHOD1(GetEdgeWeights, std::map<RoadGraphEdge, double>(const RoadGraph& roadGraph));
+    MOCK_CONST_METHOD4(GetDistanceBetweenObjects, RouteQueryResult<std::optional<units::length::meter_t>> (const RoadGraph &roadGraph, RoadGraphVertex startNode, units::length::meter_t ownPosition, const GlobalRoadPositions &target));
+    MOCK_CONST_METHOD4(GetRelativeJunctions, RouteQueryResult<RelativeWorldView::Roads>(const RoadGraph &roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range));
+    MOCK_CONST_METHOD4(GetRelativeRoads, RouteQueryResult<RelativeWorldView::Roads>(const RoadGraph &roadGraph, RoadGraphVertex startNode, units::length::meter_t startDistance, units::length::meter_t range));
+    MOCK_CONST_METHOD6(GetRelativeLanes, RouteQueryResult<RelativeWorldView::Lanes>(const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, units::length::meter_t range, bool includeOncoming));
+    MOCK_CONST_METHOD5(GetRelativeLaneId, RouteQueryResult<std::optional<int>> (const RoadGraph &roadGraph, RoadGraphVertex startNode, int laneId, units::length::meter_t distance, GlobalRoadPositions targetPosition));
+    MOCK_CONST_METHOD3(GetRoadGraph, std::pair<RoadGraph, RoadGraphVertex>(const RouteElement &start, int maxDepth, bool inDrivingDirection));
+    MOCK_CONST_METHOD1(GetEdgeWeights, std::map<RoadGraphEdge, double>(const RoadGraph &roadGraph));
     MOCK_CONST_METHOD1(GetRoadStream, std::unique_ptr<RoadStreamInterface> (const std::vector<RouteElement>& route));
-    MOCK_CONST_METHOD4(ResolveRelativePoint, RouteQueryResult<std::optional<GlobalRoadPosition>> (const RoadGraph& roadGraph, RoadGraphVertex startNode, ObjectPointRelative relativePoint, const WorldObjectInterface& object));
+    MOCK_CONST_METHOD4(ResolveRelativePoint, RouteQueryResult<std::optional<GlobalRoadPosition>> (const RoadGraph &roadGraph, RoadGraphVertex startNode, ObjectPointRelative relativePoint, const WorldObjectInterface& object));
     MOCK_METHOD0(GetRadio, RadioInterface&());
+    MOCK_CONST_METHOD3(GetUniqueLaneId, uint64_t(std::string roadId, int laneId, units::length::meter_t position));
 };
diff --git a/sim/tests/fakes/gmock/fakeWorldObject.h b/sim/tests/fakes/gmock/fakeWorldObject.h
index 529fd3960b3f8aa9926865d3eafa40486e7d435f..f3ea39cd086b17ff2a0d9903751b38d92a1e9642 100644
--- a/sim/tests/fakes/gmock/fakeWorldObject.h
+++ b/sim/tests/fakes/gmock/fakeWorldObject.h
@@ -17,22 +17,22 @@ class FakeWorldObject : public virtual WorldObjectInterface
 {
 public:
     MOCK_CONST_METHOD0(GetType, ObjectTypeOSI());
-    MOCK_CONST_METHOD0(GetPositionX, double());
-    MOCK_CONST_METHOD0(GetPositionY, double());
+    MOCK_CONST_METHOD0(GetPositionX, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetPositionY, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetWidth, units::length::meter_t ());
+    MOCK_CONST_METHOD0(GetLength, units::length::meter_t());
     MOCK_CONST_METHOD1(GetRoadPosition, const GlobalRoadPositions& (const ObjectPoint& point));
     MOCK_CONST_METHOD0(GetTouchedRoads, const RoadIntervals &());
-    MOCK_CONST_METHOD1(GetAbsolutePosition, Common::Vector2d(const ObjectPoint &objectPoint));
-    MOCK_CONST_METHOD0(GetWidth, double());
-    MOCK_CONST_METHOD0(GetLength, double());
-    MOCK_CONST_METHOD0(GetHeight, double());
-    MOCK_CONST_METHOD0(GetYaw, double());
-    MOCK_CONST_METHOD0(GetRoll, double());
+    MOCK_CONST_METHOD1(GetAbsolutePosition, Common::Vector2d<units::length::meter_t>(const ObjectPoint &objectPoint));
+    MOCK_CONST_METHOD0(GetHeight, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetYaw, units::angle::radian_t());
+    MOCK_CONST_METHOD0(GetRoll, units::angle::radian_t());
     MOCK_CONST_METHOD0(GetId, int());
     MOCK_CONST_METHOD0(GetBoundingBox2D, const polygon_t& ());
-    MOCK_CONST_METHOD0(GetDistanceReferencePointToLeadingEdge, double());
-    MOCK_CONST_METHOD0(GetLaneDirection, double());
-    MOCK_CONST_METHOD1(GetVelocity, Common::Vector2d(ObjectPoint));
-    MOCK_CONST_METHOD1(GetAcceleration, Common::Vector2d(ObjectPoint));
+    MOCK_CONST_METHOD0(GetDistanceReferencePointToLeadingEdge, units::length::meter_t());
+    MOCK_CONST_METHOD0(GetVelocity, units::velocity::meters_per_second_t());
+    MOCK_CONST_METHOD1(GetVelocity, Common::Vector2d<units::velocity::meters_per_second_t>(ObjectPoint));
+    MOCK_CONST_METHOD1(GetAcceleration, Common::Vector2d<units::acceleration::meters_per_second_squared_t>(ObjectPoint));
     MOCK_METHOD0(Unlocate, void());
     MOCK_METHOD0(Locate, bool());
 };
diff --git a/sim/tests/integrationTests/OpenPassSlave_IntegrationTests/OpenPassSlave_IntegrationTests.pro b/sim/tests/integrationTests/OpenPassSlave_IntegrationTests/OpenPassSlave_IntegrationTests.pro
new file mode 100644
index 0000000000000000000000000000000000000000..7ec66cd78dc42f75128d74d3e20792fd829a5fde
--- /dev/null
+++ b/sim/tests/integrationTests/OpenPassSlave_IntegrationTests/OpenPassSlave_IntegrationTests.pro
@@ -0,0 +1,159 @@
+#/*******************************************************************************
+#* Copyright (c) 2019, 2021 in-tech GmbH
+#* Copyright (c) 2021 ITK Engineering GmbH
+#*
+#* This program and the accompanying materials are made
+#* available under the terms of the Eclipse Public License 2.0
+#* which is available at https://www.eclipse.org/legal/epl-2.0/
+#*
+#* SPDX-License-Identifier: EPL-2.0
+#*******************************************************************************/
+
+#-----------------------------------------------------------------------------
+# \file  OpenPassSlave_IntegationTests.pro
+# \brief This file contains tests for the OpenPassSlave module
+#-----------------------------------------------------------------------------/
+QT += xml
+
+CONFIG += OPENPASS_GTEST \
+          OPENPASS_GTEST_DEFAULT_MAIN
+include(../../testing.pri)
+
+OPENPASS_SLAVE = $$OPEN_SRC/core/slave
+CORE_SHARE = $$OPEN_SRC/core/common
+WORLD_OSI = $$OPEN_SRC/core/slave/modules/World_OSI
+
+INCLUDEPATH += . \
+    $$OPENPASS_SLAVE \
+    $$OPENPASS_SLAVE/framework \
+    $$OPENPASS_SLAVE/modelElements \
+    $$OPENPASS_SLAVE/bindings \
+    $$OPENPASS_SLAVE/importer/road \
+    $$OPEN_SRC/core \
+    $$CORE_SHARE/cephes \
+    $$WORLD_OSI \
+    $$WORLD_OSI/OWL \
+    $$WORLD_OSI/Localization \
+    $$OPEN_SRC/.. \
+    $$OPEN_SRC/../..
+
+SRC_SCENERY =   $$OPENPASS_SLAVE/importer/scenery.cpp \
+                $$OPENPASS_SLAVE/importer/sceneryImporter.cpp \
+                $$OPENPASS_SLAVE/importer/road.cpp \
+                $$OPENPASS_SLAVE/importer/junction.cpp \
+                $$OPENPASS_SLAVE/importer/connection.cpp \
+                $$OPENPASS_SLAVE/importer/road/roadSignal.cpp \
+                $$OPENPASS_SLAVE/importer/road/roadObject.cpp \
+                $$OPENPASS_SLAVE/bindings/worldBinding.cpp \
+                $$OPENPASS_SLAVE/bindings/worldLibrary.cpp \
+                $$OPENPASS_SLAVE/modules/Stochastics/stochastics_implementation.cpp
+
+INC_SCENERY =   $$OPENPASS_SLAVE/importer/scenery.h \
+                $$OPENPASS_SLAVE/importer/sceneryImporter.h \
+                $$OPENPASS_SLAVE/importer/road.h \
+                $$OPENPASS_SLAVE/importer/junction.h \
+                $$OPENPASS_SLAVE/importer/connection.h \
+                $$OPENPASS_SLAVE/importer/road/roadSignal.h \
+                $$OPENPASS_SLAVE/importer/road/roadObject.h \
+                $$OPENPASS_SLAVE/bindings/world.h \
+                $$OPENPASS_SLAVE/bindings/worldBinding.h \
+                $$OPENPASS_SLAVE/bindings/worldLibrary.h \
+                $$OPENPASS_SLAVE/modules/Stochastics/stochastics_implementation.h
+
+SRC_SYSTEMCONFIG =  $$OPENPASS_SLAVE/importer/systemConfig.cpp \
+                    $$OPENPASS_SLAVE/importer/systemConfigImporter.cpp \
+                    $$OPENPASS_SLAVE/modelElements/agentType.cpp \
+                    $$OPENPASS_SLAVE/modelElements/componentType.cpp
+
+INC_SYSTEMCONFIG =  $$OPENPASS_SLAVE/importer/systemConfig.h \
+                    $$OPENPASS_SLAVE/importer/systemConfigImporter.h \
+                    $$OPENPASS_SLAVE/modelElements/agentType.h \
+                    $$OPENPASS_SLAVE/modelElements/componentType.h
+
+SRC_VEHICLEMODELS = $$OPENPASS_SLAVE/importer/vehicleModels.cpp \
+                    $$OPENPASS_SLAVE/importer/vehicleModelsImporter.cpp
+
+INC_VEHICLEMODELS = $$OPENPASS_SLAVE/importer/vehicleModels.h \
+                    $$OPENPASS_SLAVE/importer/vehicleModelsImporter.h
+
+INC_SLAVECONFIG = $$OPENPASS_SLAVE/importer/slaveConfig.h \
+                  $$OPENPASS_SLAVE/importer/slaveConfigImporter.h \
+                  $$OPENPASS_SLAVE/framework/directories.h
+
+SRC_SLAVECONFIG = $$OPENPASS_SLAVE/importer/slaveConfig.cpp \
+                  $$OPENPASS_SLAVE/importer/slaveConfigImporter.cpp \
+                  $$OPENPASS_SLAVE/importer/parameterImporter.cpp \
+                  $$OPENPASS_SLAVE/framework/directories.cpp
+
+SRC_CORESHARE = $$OPEN_SRC/common/xmlParser.cpp \
+                $$CORE_SHARE/log.cpp \
+                $$CORE_SHARE/callbacks.cpp \
+                $$CORE_SHARE/cephes/fresnl.c \
+                $$CORE_SHARE/cephes/const.c \
+                $$CORE_SHARE/cephes/polevl.c
+
+INC_CORESHARE = $$OPEN_SRC/common/xmlParser.h \
+                $$CORE_SHARE/log.h \
+                $$CORE_SHARE/callbacks.h
+
+SRC_WORLD = $$WORLD_OSI/WorldData.cpp \
+            $$WORLD_OSI/WorldDataQuery.cpp \
+            $$WORLD_OSI/WorldDataException.cpp \
+            $$WORLD_OSI/WorldObjectAdapter.cpp \
+            $$WORLD_OSI/AgentAdapter.cpp \
+            $$WORLD_OSI/OWL/DataTypes.cpp \
+            $$WORLD_OSI/OWL/OpenDriveTypeMapper.cpp \
+            $$WORLD_OSI/Localization.cpp \
+            $$WORLD_OSI/WorldToRoadCoordinateConverter.cpp \
+            $$WORLD_OSI/egoAgent.cpp \
+            $$WORLD_OSI/LaneStream.cpp \
+            $$WORLD_OSI/RoadStream.cpp
+
+INC_WORLD = $$WORLD_OSI/WorldData.h \
+            $$WORLD_OSI/WorldDataQuery.h \
+            $$WORLD_OSI/WorldDataException.h \
+            $$WORLD_OSI/WorldObjectAdapter.h \
+            $$WORLD_OSI/AgentAdapter.h \
+            $$WORLD_OSI/OWL/DataTypes.h \
+            $$WORLD_OSI/OWL/OpenDriveTypeMapper.h \
+            $$WORLD_OSI/Localization.h \
+            $$WORLD_OSI/WorldToRoadCoordinateConverter.h \
+            $$WORLD_OSI/egoAgent.h \
+            $$WORLD_OSI/LaneStream.h \
+            $$WORLD_OSI/RoadStream.h
+
+SOURCES += \
+    $$OPEN_SRC/common/commonTools.cpp \
+    $$OPEN_SRC/common/eventDetectorDefinitions.cpp \
+    $$OPENPASS_SLAVE/modelElements/agentBlueprint.cpp \
+    $$OPENPASS_SLAVE/modelElements/parameters.cpp \
+    SceneryImporter_IntegrationTests.cpp \
+    SlaveConfigImporter_IntegrationTests.cpp \
+    SystemConfigImporter_IntegrationTests.cpp \
+    VehicleModelsImporter_IntegrationTests.cpp \
+    $$SRC_SCENARIO \
+    $$SRC_SCENERY \
+    $$SRC_SYSTEMCONFIG \
+    $$SRC_VEHICLEMODELS \
+    $$SRC_CORESHARE \
+    $$SRC_WORLD \
+    $$SRC_SLAVECONFIG
+
+HEADERS += \
+    $$OPEN_SRC/common/commonTools.h \
+    $$INC_SCENARIO \
+    $$INC_SCENERY \
+    $$INC_SYSTEMCONFIG \
+    $$INC_VEHICLEMODELS \
+    $$INC_CORESHARE \
+    $$INC_WORLD \
+    $$INC_SLAVECONFIG
+
+
+LIBS += -lopen_simulation_interface -lprotobuf
+
+win32: {
+    LIBS += -lboost_filesystem-mt
+} else {
+    LIBS += -lboost_filesystem
+}
diff --git a/sim/tests/integrationTests/Spawner_IntegrationTests/CMakeLists.txt b/sim/tests/integrationTests/Spawner_IntegrationTests/CMakeLists.txt
index f9e3ccb94dfec56fc71fd4b6280d8339f9f34d15..9b7c2b0d2f90d17fa355a0a0578a7c4b42eee888 100644
--- a/sim/tests/integrationTests/Spawner_IntegrationTests/CMakeLists.txt
+++ b/sim/tests/integrationTests/Spawner_IntegrationTests/CMakeLists.txt
@@ -16,7 +16,6 @@ add_openpass_target(
 
   SOURCES
     ${OPENPASS_SIMCORE_DIR}/core/common/log.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentBlueprint.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agent.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/channel.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/component.cpp
diff --git a/sim/tests/integrationTests/Spawner_IntegrationTests/Spawner_IntegrationTests.cpp b/sim/tests/integrationTests/Spawner_IntegrationTests/Spawner_IntegrationTests.cpp
index 6586ff5fd1f938eb147288c93e41934bfbcacac2..b1ea6f9b8f70a922c959a0aff6eee74e13862d4b 100644
--- a/sim/tests/integrationTests/Spawner_IntegrationTests/Spawner_IntegrationTests.cpp
+++ b/sim/tests/integrationTests/Spawner_IntegrationTests/Spawner_IntegrationTests.cpp
@@ -11,7 +11,6 @@
 
 #include "SpawnerPreRunCommon.h"
 #include "fakeAgent.h"
-#include "fakeAgentBlueprint.h"
 #include "fakeAgentBlueprintProvider.h"
 #include "fakeAgentFactory.h"
 #include "fakeCallback.h"
@@ -19,6 +18,8 @@
 #include "fakeStochastics.h"
 #include "fakeStream.h"
 #include "fakeWorld.h"
+#include "fakeEnvironment.h"
+#include "fakeEntityRepository.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 
@@ -34,6 +35,8 @@ using ::testing::Return;
 using ::testing::ReturnRef;
 using ::testing::VariantWith;
 
+using namespace units::literals;
+
 constexpr char ROADID[] = "MyRoad";
 
 class SpawnerPreRun_IntegrationTests : public testing::Test
@@ -69,20 +72,23 @@ public:
         ON_CALL(stochastics, GetUniformDistributed(2,4)).WillByDefault(Return(3));
         ON_CALL(stochastics, GetUniformDistributed(0,DoubleEq(6))).WillByDefault(Return(1));
         ON_CALL(stochastics, GetUniformDistributed(0,DoubleEq(41))).WillByDefault(Return(7));
-        ON_CALL(agentFactory, AddAgent(_)).WillByDefault([&](AgentBlueprintInterface* bluePrint)
+        ON_CALL(agentFactory, AddAgent(_)).WillByDefault([&](const AgentBuildInstructions& agentBuildInstructions)
         {
-            agents.push_back(new core::Agent(&world, *bluePrint));
-            auto laneId = -1 + static_cast<int>(bluePrint->GetSpawnParameter().positionY / 3.0);
+            agents.push_back(new core::Agent(&world, agentBuildInstructions));
+            auto laneId = -1 + static_cast<int>(agentBuildInstructions.spawnParameter.position.y / 3.0_m);
             auto agent = new FakeAgent;
             agentsOnLane[laneId].insert(agentsOnLane[laneId].begin(), agent);
-            ON_CALL(*agent, GetPositionX()).WillByDefault(Return(bluePrint->GetSpawnParameter().positionX));
-            ON_CALL(*agent, GetLength()).WillByDefault(Return(5.0));
-            ON_CALL(*agent, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(3.0));
-            ON_CALL(*agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{bluePrint->GetSpawnParameter().velocity, 0.0}));
-            ON_CALL(*agent, GetAgentTypeName()).WillByDefault(Return(bluePrint->GetAgentProfileName()));
+            ON_CALL(*agent, GetPositionX()).WillByDefault(Return(agentBuildInstructions.spawnParameter.position.x));
+            ON_CALL(*agent, GetLength()).WillByDefault(Return(5.0_m));
+            ON_CALL(*agent, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(3.0_m));
+            ON_CALL(*agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{agentBuildInstructions.spawnParameter.velocity, 0.0_mps}));
+            ON_CALL(*agent, GetAgentTypeName()).WillByDefault(Return(agentBuildInstructions.system.agentProfileName));
             return agents.back();
         });
 
+        ON_CALL(*environment, GetEntityRepository()).WillByDefault(ReturnRef(entityRepository));
+        ON_CALL(*environment, GetControllerRepository()).WillByDefault(ReturnRef(controllerRepository));
+
         RoadGraph roadGraph {};
         RoadGraphVertex vertex {};
         RouteElement routeElement{ROADID, true};
@@ -97,14 +103,14 @@ public:
         ON_CALL(world, GetRoadGraph(_, _, _))
                 .WillByDefault(Return(std::pair<RoadGraph, RoadGraphVertex>{roadGraph, vertex}));
         ON_CALL(world, LaneCoord2WorldCoord(_,_,_,_)).WillByDefault(
-                    [&](double distanceOnLane, double offset, std::string , int laneId)
-        {return Position{distanceOnLane, offset + 3 * laneId + 1.5, 0, 0};});
+                    [&](units::length::meter_t distanceOnLane, units::length::meter_t offset, std::string , int laneId)
+        {return Position{distanceOnLane, offset + 3_m * laneId + 1.5_m, 0_rad, 0_i_m};});
 
         FakeRoadStream* roadStream = new FakeRoadStream;
         ON_CALL(*roadStream, GetStreamPosition(_)).WillByDefault(
-                    [](const GlobalRoadPosition& roadPosition){return StreamPosition{roadPosition.roadPosition.s, 0};});
+                    [](const GlobalRoadPosition& roadPosition){return StreamPosition{roadPosition.roadPosition.s, 0_m};});
         FakeLaneStream* laneStream1 = new FakeLaneStream;
-        ON_CALL(*laneStream1, GetLength()).WillByDefault(Return(10000));
+        ON_CALL(*laneStream1, GetLength()).WillByDefault(Return(10000_m));
         ON_CALL(*laneStream1, GetAgentsInRange(_,_)).WillByDefault(
                     [&](StreamPosition start, StreamPosition end)
         {
@@ -120,14 +126,14 @@ public:
             return agentsInRange;
         });
         ON_CALL(*laneStream1, GetStreamPosition(_)).WillByDefault(
-                    [](const GlobalRoadPosition& roadPosition){return StreamPosition{roadPosition.roadPosition.s, 0};});
+                    [](const GlobalRoadPosition& roadPosition){return StreamPosition{roadPosition.roadPosition.s, 0_m};});
         ON_CALL(*laneStream1, GetRoadPosition(_)).WillByDefault(
-                    [](const StreamPosition& streamPosition){return GlobalRoadPosition{ROADID, -1, streamPosition.s, streamPosition.t, 0};});
-        std::vector<std::pair<double, LaneType>> laneTypes{{0, LaneType::Driving}};
+                    [](const StreamPosition& streamPosition){return GlobalRoadPosition{ROADID, -1, streamPosition.s, streamPosition.t, 0_rad};});
+        std::vector<std::pair<units::length::meter_t, LaneType>> laneTypes{{0_m, LaneType::Driving}};
         ON_CALL(*laneStream1, GetLaneTypes()).WillByDefault(Return(laneTypes));
-        ON_CALL(*laneStream1, GetStreamPosition(_, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault([](const WorldObjectInterface *object, const ObjectPoint &) { return StreamPosition{object->GetPositionX(), 0}; });
+        ON_CALL(*laneStream1, GetStreamPosition(_, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault([](const WorldObjectInterface *object, const ObjectPoint &) { return StreamPosition{object->GetPositionX(), 0_m}; });
         FakeLaneStream* laneStream2 = new FakeLaneStream;
-        ON_CALL(*laneStream2, GetLength()).WillByDefault(Return(10000));
+        ON_CALL(*laneStream2, GetLength()).WillByDefault(Return(10000_m));
         ON_CALL(*laneStream2, GetAgentsInRange(_,_)).WillByDefault(
                     [&](StreamPosition start, StreamPosition end)
         {
@@ -143,13 +149,13 @@ public:
             return agentsInRange;
         });
         ON_CALL(*laneStream2, GetStreamPosition(_)).WillByDefault(
-                    [](const GlobalRoadPosition& roadPosition){return StreamPosition{roadPosition.roadPosition.s, 0};});
+                    [](const GlobalRoadPosition& roadPosition){return StreamPosition{roadPosition.roadPosition.s, 0_m};});
         ON_CALL(*laneStream2, GetRoadPosition(_)).WillByDefault(
-                    [](const StreamPosition& streamPosition){return GlobalRoadPosition{ROADID, -2, streamPosition.s, streamPosition.t, 0};});
+                    [](const StreamPosition& streamPosition){return GlobalRoadPosition{ROADID, -2, streamPosition.s, streamPosition.t, 0_rad};});
         ON_CALL(*laneStream2, GetLaneTypes()).WillByDefault(Return(laneTypes));
-        ON_CALL(*laneStream2, GetStreamPosition(_, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault([](const WorldObjectInterface *object, const ObjectPoint &) { return StreamPosition{object->GetPositionX(), 0}; });
+        ON_CALL(*laneStream2, GetStreamPosition(_, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault([](const WorldObjectInterface *object, const ObjectPoint &) { return StreamPosition{object->GetPositionX(), 0_m}; });
         FakeLaneStream* laneStream3 = new FakeLaneStream;
-        ON_CALL(*laneStream3, GetLength()).WillByDefault(Return(10000));
+        ON_CALL(*laneStream3, GetLength()).WillByDefault(Return(10000_m));
         ON_CALL(*laneStream3, GetAgentsInRange(_,_)).WillByDefault(
                     [&](StreamPosition start, StreamPosition end)
         {
@@ -165,29 +171,32 @@ public:
             return agentsInRange;
         });
         ON_CALL(*laneStream3, GetStreamPosition(_)).WillByDefault(
-                    [](const GlobalRoadPosition& roadPosition){return StreamPosition{roadPosition.roadPosition.s, 0};});
+                    [](const GlobalRoadPosition& roadPosition){return StreamPosition{roadPosition.roadPosition.s, 0_m};});
         ON_CALL(*laneStream3, GetRoadPosition(_)).WillByDefault(
-                    [](const StreamPosition& streamPosition){return GlobalRoadPosition{ROADID, -3, streamPosition.s, streamPosition.t, 0};});
+                    [](const StreamPosition& streamPosition){return GlobalRoadPosition{ROADID, -3, streamPosition.s, streamPosition.t, 0_rad};});
         ON_CALL(*laneStream3, GetLaneTypes()).WillByDefault(Return(laneTypes));
-        ON_CALL(*laneStream3, GetStreamPosition(_, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault([](const WorldObjectInterface *object, const ObjectPoint &) { return StreamPosition{object->GetPositionX(), 0}; });
+        ON_CALL(*laneStream3, GetStreamPosition(_, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault([](const WorldObjectInterface *object, const ObjectPoint &) { return StreamPosition{object->GetPositionX(), 0_m}; });
         ON_CALL(*roadStream, GetLaneStream(_,-1)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream1))));
         ON_CALL(*roadStream, GetLaneStream(_,-2)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream2))));
         ON_CALL(*roadStream, GetLaneStream(_,-3)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream3))));
         ON_CALL(world, GetRoadStream(std::vector<RouteElement>{{ROADID,true}})).WillByDefault(Return(ByMove(std::unique_ptr<RoadStreamInterface>(roadStream))));
 
-        LaneSection fakeLaneSection1 {1000.0, 1500.0, {-1, -2, -3}};
+        LaneSection fakeLaneSection1 {1000.0_m, 1500.0_m, {-1, -2, -3}};
         LaneSections fakeLaneSections {fakeLaneSection1};
         ON_CALL(world, GetLaneSections(ROADID))
                 .WillByDefault(Return(fakeLaneSections));
 
-        AgentBlueprint agentBlueprint;
-        VehicleModelParameters vehicleModelParameters;
-        vehicleModelParameters.vehicleType = AgentVehicleType::Car;
-        vehicleModelParameters.boundingBoxDimensions.length = 5.0;
-        vehicleModelParameters.boundingBoxDimensions.width = 1.0;
-        vehicleModelParameters.boundingBoxCenter.x = 0.5;
-        agentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-        ON_CALL(agentBlueprintProvider, SampleAgent(_,_)).WillByDefault(Return(agentBlueprint));
+        AgentBuildInstructions agentBuildInstructions;
+        auto vehicleModelParameters = std::make_shared<mantle_api::VehicleProperties>();
+        vehicleModelParameters->type = mantle_api::EntityType::kVehicle;
+        vehicleModelParameters->classification = mantle_api::VehicleClass::kMedium_car;
+        vehicleModelParameters->bounding_box.dimension.length = 5.0_m;
+        vehicleModelParameters->bounding_box.dimension.width = 1.0_m;
+        vehicleModelParameters->bounding_box.geometric_center.x = 0.5_m;
+        const std::string vehicleModelName = "TestVehicle";
+        ON_CALL(agentBlueprintProvider, SampleSystem(_)).WillByDefault(Return(agentBuildInstructions.system));
+        ON_CALL(agentBlueprintProvider, SampleVehicleModelName(_)).WillByDefault(Return(vehicleModelName));
+        vehicles->insert({vehicleModelName, vehicleModelParameters});
     }
 
     ~SpawnerPreRun_IntegrationTests()
@@ -214,7 +223,11 @@ public:
     FakeWorld world;
     FakeAgentBlueprintProvider agentBlueprintProvider;
     FakeStochastics stochastics;
-    SpawnPointDependencies dependencies{&agentFactory, &world, &agentBlueprintProvider, &stochastics};
+    std::shared_ptr<FakeEnvironment> environment = std::make_shared<FakeEnvironment>();
+    FakeEntityRepository entityRepository;
+    mantle_api::MockControllerRepository controllerRepository;
+    std::shared_ptr<Vehicles> vehicles = std::make_shared<Vehicles>();
+    SpawnPointDependencies dependencies{&agentFactory, &world, &agentBlueprintProvider, &stochastics, environment, vehicles};
     FakeParameter parameters;
 
     std::shared_ptr<FakeParameter> spawnZone = std::make_shared<FakeParameter>();
@@ -263,7 +276,7 @@ const RelativeWorldView::Lane relativeLane0 {0, true, LaneType::Driving, std::nu
 const RelativeWorldView::Lane relativeLaneMinus1 {-1, true, LaneType::Driving, std::nullopt, std::nullopt};
 const RelativeWorldView::Lane relativeLaneMinus2 {-2, true, LaneType::Driving, std::nullopt, std::nullopt};
 
-void CheckTGap(std::vector<FakeAgent*> agentsOnLane, double expectedTGap, double minS, double maxS)
+void CheckTGap(std::vector<FakeAgent*> agentsOnLane, double expectedTGap, units::length::meter_t minS, units::length::meter_t maxS)
 {
     for (size_t i=0; i + 1 < agentsOnLane.size(); ++i)
     {
@@ -273,14 +286,14 @@ void CheckTGap(std::vector<FakeAgent*> agentsOnLane, double expectedTGap, double
         auto rearS = rearAgent->GetPositionX();
         if (minS <= frontS && frontS <= maxS)
         {
-            double deltaS = frontS - rearS - rearAgent->GetLength();
-            double velocity = rearAgent->GetVelocity(ObjectPointPredefined::Reference).Length();
-            EXPECT_THAT(deltaS / velocity, DoubleEq(expectedTGap));
+            auto deltaS = frontS - rearS - rearAgent->GetLength();
+            auto velocity = rearAgent->GetVelocity(ObjectPointPredefined::Reference).Length();
+            EXPECT_THAT(deltaS.value() / velocity.value(), DoubleEq(expectedTGap));
         }
     }
 }
 
-void CheckVelocity(std::vector<FakeAgent*> agentsOnLane, double expectedVelocity, double minS, double maxS)
+void CheckVelocity(std::vector<FakeAgent*> agentsOnLane, double expectedVelocity, units::length::meter_t minS, units::length::meter_t maxS)
 {
     for (size_t i=0; i + 1 < agentsOnLane.size(); ++i)
     {
@@ -289,13 +302,13 @@ void CheckVelocity(std::vector<FakeAgent*> agentsOnLane, double expectedVelocity
         auto rearAgent = agentsOnLane[i];
         if (minS <= frontS && frontS <= maxS)
         {
-            double velocity = rearAgent->GetVelocity(ObjectPointPredefined::Reference).Length();
-            EXPECT_THAT(velocity, DoubleEq(expectedVelocity));
+            auto velocity = rearAgent->GetVelocity(ObjectPointPredefined::Reference).Length();
+            EXPECT_THAT(velocity.value(), DoubleEq(expectedVelocity));
         }
     }
 }
 
-void CheckAgentProfile(std::vector<FakeAgent*> agentsOnLane, std::string expectedProfile, double minS, double maxS)
+void CheckAgentProfile(std::vector<FakeAgent*> agentsOnLane, std::string expectedProfile, units::length::meter_t minS, units::length::meter_t maxS)
 {
     for (size_t i=0; i + 1 < agentsOnLane.size(); ++i)
     {
@@ -320,44 +333,50 @@ TEST_F(SpawnerPreRun_IntegrationTests, ThreeContinuesLanes_SpawnWithCorrectTGapA
     ON_CALL(*spawnZone, GetParametersDouble()).WillByDefault(ReturnRef(parametersDouble));
 
     ON_CALL(world, GetDistanceToEndOfLane(_,_,_,_,_,_)).WillByDefault(
-                [](const RoadGraph&, RoadGraphVertex startNode, int, double initialSearchDistance, double, const LaneTypes&)
+                [](const RoadGraph&, RoadGraphVertex startNode, int, units::length::meter_t initialSearchDistance, units::length::meter_t, const LaneTypes&)
     {
-        return RouteQueryResult<double>{{startNode, 2000.0 - initialSearchDistance}};
+        return RouteQueryResult<units::length::meter_t>{{startNode, 2000.0_m - initialSearchDistance}};
     });
-    ON_CALL(world, IsSValidOnLane(ROADID, AllOf(Le(-1),Ge(-3)),AllOf(Ge(0),Le(2000)))).WillByDefault(Return(true));
-    ON_CALL(world, GetLaneWidth(_,_,_)).WillByDefault(Return(3.0));
-    ON_CALL(world, GetRoadLength(_)).WillByDefault(Return(10000.));
+    ON_CALL(world, IsSValidOnLane(ROADID, AllOf(Le(-1),Ge(-3)),AllOf(Ge(0_m),Le(2000_m)))).WillByDefault(Return(true));
+    ON_CALL(world, GetLaneWidth(_,_,_)).WillByDefault(Return(3.0_m));
+    ON_CALL(world, GetRoadLength(_)).WillByDefault(Return(10000._m));
 
     RouteQueryResult<std::vector<const WorldObjectInterface*>> noObjects{{0, {}}};
     ON_CALL(world, GetObjectsInRange(_,_,_,_,_,_)).WillByDefault(Return(noObjects));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1{{0, {{0,0,{relativeLaneMinus2, relativeLaneMinus1, relativeLane0}}}}};
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1{{0, {{0_m,0_m,{relativeLaneMinus2, relativeLaneMinus1, relativeLane0}}}}};
     ON_CALL(world, GetRelativeLanes(_,_,-1,_,_,_)).WillByDefault(Return(relativeLanesMinus1));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2{{0, {{0,0,{relativeLaneMinus1, relativeLane0, relativeLanePlus1}}}}};
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2{{0, {{0_m,0_m,{relativeLaneMinus1, relativeLane0, relativeLanePlus1}}}}};
     ON_CALL(world, GetRelativeLanes(_,_,-2,_,_,_)).WillByDefault(Return(relativeLanesMinus2));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus3{{0, {{0,0,{relativeLane0, relativeLanePlus1, relativeLanePlus2}}}}};
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus3{{0, {{0_m,0_m,{relativeLane0, relativeLanePlus1, relativeLanePlus2}}}}};
     ON_CALL(world, GetRelativeLanes(_,_,-3,_,_,_)).WillByDefault(Return(relativeLanesMinus3));
 
     NiceMock<FakeAgent> fakeAgent;
     ON_CALL(world, CreateAgentAdapter(_)).WillByDefault(ReturnRef(fakeAgent));
 
+    mantle_api::MockVehicle vehicle{};
+    ON_CALL(entityRepository, Create(_, testing::A<const mantle_api::VehicleProperties&>())).WillByDefault(ReturnRef(vehicle));
+
+    mantle_api::MockController controller{};
+    ON_CALL(controllerRepository, Create(_)).WillByDefault(ReturnRef(controller));
+
     auto spawner = CreateSpawner();
 
-    auto spawnedAgents = spawner.Trigger(0);
+    spawner.Trigger(0);
 
     ASSERT_THAT(agentsOnLane[-3].empty(), false);
-    CheckTGap(agentsOnLane[-3], 3, 1000, 1500);
-    CheckVelocity(agentsOnLane[-3], 25, 1000, 1500);
-    CheckAgentProfile(agentsOnLane[-3], "AgentProfile2a", 1000, 1500);
+    CheckTGap(agentsOnLane[-3], 3, 1000_m, 1500_m);
+    CheckVelocity(agentsOnLane[-3], 25, 1000_m, 1500_m);
+    CheckAgentProfile(agentsOnLane[-3], "AgentProfile2a", 1000_m, 1500_m);
 
     ASSERT_THAT(agentsOnLane[-2].empty(), false);
-    CheckTGap(agentsOnLane[-2], 2, 1000, 1500);
-    CheckVelocity(agentsOnLane[-2], 27, 1000, 1500);
-    CheckAgentProfile(agentsOnLane[-2], "AgentProfile1a", 1000, 1500);
+    CheckTGap(agentsOnLane[-2], 2, 1000_m, 1500_m);
+    CheckVelocity(agentsOnLane[-2], 27, 1000_m, 1500_m);
+    CheckAgentProfile(agentsOnLane[-2], "AgentProfile1a", 1000_m, 1500_m);
 
     ASSERT_THAT(agentsOnLane[-1].empty(), false);
-    CheckTGap(agentsOnLane[-1], 2, 1000, 1500);
-    CheckVelocity(agentsOnLane[-1], 40.5, 1000, 1500);
-    CheckAgentProfile(agentsOnLane[-1], "AgentProfile1a", 1000, 1500);
+    CheckTGap(agentsOnLane[-1], 2, 1000_m, 1500_m);
+    CheckVelocity(agentsOnLane[-1], 40.5, 1000_m, 1500_m);
+    CheckAgentProfile(agentsOnLane[-1], "AgentProfile1a", 1000_m, 1500_m);
 }
 
 TEST_F(SpawnerPreRun_IntegrationTests, IncreasingLaneNumber_SpawnWithCorrectTGapAndProfiles)
@@ -370,24 +389,24 @@ TEST_F(SpawnerPreRun_IntegrationTests, IncreasingLaneNumber_SpawnWithCorrectTGap
     ON_CALL(*spawnZone, GetParametersDouble()).WillByDefault(ReturnRef(parametersDouble));
 
     ON_CALL(world, GetDistanceToEndOfLane(_,_,_,_,_,_)).WillByDefault(
-                [](const RoadGraph&, RoadGraphVertex startNode, int, double initialSearchDistance, double, const LaneTypes&)
-    {return RouteQueryResult<double>{{startNode, 2000.0 - initialSearchDistance}};});
-    ON_CALL(world, IsSValidOnLane(ROADID, AllOf(Le(-1),Ge(-2)),AllOf(Ge(0),Le(2000)))).WillByDefault(Return(true));
-    ON_CALL(world, IsSValidOnLane(ROADID, -3,AllOf(Ge(1400),Le(2000)))).WillByDefault(Return(true));
-    ON_CALL(world, GetLaneWidth(_,_,_)).WillByDefault(Return(3.0));
-    ON_CALL(world, GetRoadLength(_)).WillByDefault(Return(10000.));
+                [](const RoadGraph&, RoadGraphVertex startNode, int, units::length::meter_t initialSearchDistance, units::length::meter_t, const LaneTypes&)
+    {return RouteQueryResult<units::length::meter_t>{{startNode, 2000.0_m - initialSearchDistance}};});
+    ON_CALL(world, IsSValidOnLane(ROADID, AllOf(Le(-1),Ge(-2)),AllOf(Ge(0_m),Le(2000_m)))).WillByDefault(Return(true));
+    ON_CALL(world, IsSValidOnLane(ROADID, -3,AllOf(Ge(1400_m),Le(2000_m)))).WillByDefault(Return(true));
+    ON_CALL(world, GetLaneWidth(_,_,_)).WillByDefault(Return(3.0_m));
+    ON_CALL(world, GetRoadLength(_)).WillByDefault(Return(10000._m));
 
     RouteQueryResult<std::vector<const WorldObjectInterface*>> noObjects{{0, {}}};
     ON_CALL(world, GetObjectsInRange(_,_,_,_,_,_)).WillByDefault(Return(noObjects));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1First{{0, {{0,0,{relativeLaneMinus1, relativeLane0}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-1,Le(1400),_,_)).WillByDefault(Return(relativeLanesMinus1First));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1Second{{0, {{0,0,{relativeLaneMinus2, relativeLaneMinus1, relativeLane0}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-1,Ge(1400),_,_)).WillByDefault(Return(relativeLanesMinus1Second));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2First{{0, {{0,0,{relativeLane0, relativeLanePlus1}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-2,Le(1400),_,_)).WillByDefault(Return(relativeLanesMinus2First));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2Second{{0, {{0,0,{relativeLaneMinus1, relativeLane0, relativeLanePlus1}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-2,Ge(1400),_,_)).WillByDefault(Return(relativeLanesMinus2Second));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus3{{0, {{0,0,{relativeLane0, relativeLanePlus1, relativeLanePlus2}}}}};
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1First{{0, {{0_m,0_m,{relativeLaneMinus1, relativeLane0}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-1,Le(1400_m),_,_)).WillByDefault(Return(relativeLanesMinus1First));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1Second{{0, {{0_m,0_m,{relativeLaneMinus2, relativeLaneMinus1, relativeLane0}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-1,Ge(1400_m),_,_)).WillByDefault(Return(relativeLanesMinus1Second));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2First{{0, {{0_m,0_m,{relativeLane0, relativeLanePlus1}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-2,Le(1400_m),_,_)).WillByDefault(Return(relativeLanesMinus2First));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2Second{{0, {{0_m,0_m,{relativeLaneMinus1, relativeLane0, relativeLanePlus1}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-2,Ge(1400_m),_,_)).WillByDefault(Return(relativeLanesMinus2Second));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus3{{0, {{0_m,0_m,{relativeLane0, relativeLanePlus1, relativeLanePlus2}}}}};
     ON_CALL(world, GetRelativeLanes(_,_,-3,_,_,_)).WillByDefault(Return(relativeLanesMinus3));
 
     NiceMock<FakeAgent> fakeAgent;
@@ -395,26 +414,32 @@ TEST_F(SpawnerPreRun_IntegrationTests, IncreasingLaneNumber_SpawnWithCorrectTGap
 
     auto spawner = CreateSpawner();
 
-    auto spawnedAgents = spawner.Trigger(0);
+    mantle_api::MockVehicle vehicle{};
+    ON_CALL(entityRepository, Create(_, testing::A<const mantle_api::VehicleProperties&>())).WillByDefault(ReturnRef(vehicle));
+
+    mantle_api::MockController controller{};
+    ON_CALL(controllerRepository, Create(_)).WillByDefault(ReturnRef(controller));
+
+    spawner.Trigger(0);
 
     ASSERT_THAT(agentsOnLane[-3].empty(), false);
-    CheckTGap(agentsOnLane[-3], 3, 1400, 1500);
-    CheckVelocity(agentsOnLane[-3], 25, 1400, 1500);
-    CheckAgentProfile(agentsOnLane[-3], "AgentProfile2a", 1400, 1500);
+    CheckTGap(agentsOnLane[-3], 3, 1400_m, 1500_m);
+    CheckVelocity(agentsOnLane[-3], 25, 1400_m, 1500_m);
+    CheckAgentProfile(agentsOnLane[-3], "AgentProfile2a", 1400_m, 1500_m);
 
     ASSERT_THAT(agentsOnLane[-2].empty(), false);
-    CheckTGap(agentsOnLane[-2], 2, 1400, 1500);
-    CheckVelocity(agentsOnLane[-2], 27, 1400, 1500);
-    CheckAgentProfile(agentsOnLane[-2], "AgentProfile1a", 1400, 1500);
-    CheckTGap(agentsOnLane[-2], 3, 1000, 1400);
-    CheckVelocity(agentsOnLane[-2], 25, 1000, 1400);
-    CheckAgentProfile(agentsOnLane[-2], "AgentProfile2a", 1000, 1400);
+    CheckTGap(agentsOnLane[-2], 2, 1400_m, 1500_m);
+    CheckVelocity(agentsOnLane[-2], 27, 1400_m, 1500_m);
+    CheckAgentProfile(agentsOnLane[-2], "AgentProfile1a", 1400_m, 1500_m);
+    CheckTGap(agentsOnLane[-2], 3, 1000_m, 1400_m);
+    CheckVelocity(agentsOnLane[-2], 25, 1000_m, 1400_m);
+    CheckAgentProfile(agentsOnLane[-2], "AgentProfile2a", 1000_m, 1400_m);
 
     ASSERT_THAT(agentsOnLane[-1].empty(), false);
-    CheckTGap(agentsOnLane[-1], 2, 1000, 1500);
-    CheckVelocity(agentsOnLane[-1], 40.5, 1400, 1500);
-    CheckVelocity(agentsOnLane[-1], 27, 1000, 1400);
-    CheckAgentProfile(agentsOnLane[-1], "AgentProfile1a", 1000, 1500);
+    CheckTGap(agentsOnLane[-1], 2, 1000_m, 1500_m);
+    CheckVelocity(agentsOnLane[-1], 40.5, 1400_m, 1500_m);
+    CheckVelocity(agentsOnLane[-1], 27, 1000_m, 1400_m);
+    CheckAgentProfile(agentsOnLane[-1], "AgentProfile1a", 1000_m, 1500_m);
 }
 
 TEST_F(SpawnerPreRun_IntegrationTests, DecreasingLaneNumber_SpawnWithCorrectTGapAndProfiles)
@@ -427,27 +452,27 @@ TEST_F(SpawnerPreRun_IntegrationTests, DecreasingLaneNumber_SpawnWithCorrectTGap
     ON_CALL(*spawnZone, GetParametersDouble()).WillByDefault(ReturnRef(parametersDouble));
 
     ON_CALL(world, GetDistanceToEndOfLane(_,_,-3,_,_,_)).WillByDefault(
-                [](const RoadGraph&, RoadGraphVertex startNode, int, double initialSearchDistance, double, const LaneTypes&)
-    {return RouteQueryResult<double>{{startNode, 1200.0 - initialSearchDistance}};});
+                [](const RoadGraph&, RoadGraphVertex startNode, int, units::length::meter_t initialSearchDistance, units::length::meter_t, const LaneTypes&)
+    {return RouteQueryResult<units::length::meter_t>{{startNode, 1200.0_m - initialSearchDistance}};});
     ON_CALL(world, GetDistanceToEndOfLane(_,_,AllOf(Le(-1),Ge(-2)),_,_,_)).WillByDefault(
-                [](const RoadGraph&, RoadGraphVertex startNode, int, double initialSearchDistance, double, const LaneTypes&)
-    {return RouteQueryResult<double>{{startNode, 2000.0 - initialSearchDistance}};});
-    ON_CALL(world, IsSValidOnLane(ROADID, AllOf(Le(-1),Ge(-2)),AllOf(Ge(0),Le(2000)))).WillByDefault(Return(true));
-    ON_CALL(world, IsSValidOnLane(ROADID, -3,AllOf(Ge(0),Le(1200)))).WillByDefault(Return(true));
-    ON_CALL(world, GetLaneWidth(_,_,_)).WillByDefault(Return(3.0));
-    ON_CALL(world, GetRoadLength(_)).WillByDefault(Return(10000.));
+                [](const RoadGraph&, RoadGraphVertex startNode, int, units::length::meter_t initialSearchDistance, units::length::meter_t, const LaneTypes&)
+    {return RouteQueryResult<units::length::meter_t>{{startNode, 2000.0_m - initialSearchDistance}};});
+    ON_CALL(world, IsSValidOnLane(ROADID, AllOf(Le(-1),Ge(-2)),AllOf(Ge(0_m),Le(2000_m)))).WillByDefault(Return(true));
+    ON_CALL(world, IsSValidOnLane(ROADID, -3,AllOf(Ge(0_m),Le(1200_m)))).WillByDefault(Return(true));
+    ON_CALL(world, GetLaneWidth(_,_,_)).WillByDefault(Return(3.0_m));
+    ON_CALL(world, GetRoadLength(_)).WillByDefault(Return(10000._m));
 
     RouteQueryResult<std::vector<const WorldObjectInterface*>> noObjects{{0, {}}};
     ON_CALL(world, GetObjectsInRange(_,_,_,_,_,_)).WillByDefault(Return(noObjects));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1First{{0, {{0,0,{relativeLaneMinus2, relativeLaneMinus1, relativeLane0}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-1,Le(1200),_,_)).WillByDefault(Return(relativeLanesMinus1First));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1Second{{0, {{0,0,{relativeLaneMinus1, relativeLane0}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-1,Ge(1200),_,_)).WillByDefault(Return(relativeLanesMinus1Second));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2First{{0, {{0,0,{relativeLaneMinus1, relativeLane0, relativeLanePlus1}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-2,Le(1200),_,_)).WillByDefault(Return(relativeLanesMinus2First));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2Second{{0, {{0,0,{relativeLane0, relativeLanePlus1}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-2,Ge(1200),_,_)).WillByDefault(Return(relativeLanesMinus2Second));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus3{{0, {{0,0,{relativeLane0, relativeLanePlus1, relativeLanePlus2}}}}};
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1First{{0, {{0_m,0_m,{relativeLaneMinus2, relativeLaneMinus1, relativeLane0}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-1,Le(1200_m),_,_)).WillByDefault(Return(relativeLanesMinus1First));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1Second{{0, {{0_m,0_m,{relativeLaneMinus1, relativeLane0}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-1,Ge(1200_m),_,_)).WillByDefault(Return(relativeLanesMinus1Second));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2First{{0, {{0_m,0_m,{relativeLaneMinus1, relativeLane0, relativeLanePlus1}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-2,Le(1200_m),_,_)).WillByDefault(Return(relativeLanesMinus2First));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2Second{{0, {{0_m,0_m,{relativeLane0, relativeLanePlus1}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-2,Ge(1200_m),_,_)).WillByDefault(Return(relativeLanesMinus2Second));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus3{{0, {{0_m,0_m,{relativeLane0, relativeLanePlus1, relativeLanePlus2}}}}};
     ON_CALL(world, GetRelativeLanes(_,_,-3,_,_,_)).WillByDefault(Return(relativeLanesMinus3));
 
     NiceMock<FakeAgent> fakeAgent;
@@ -455,26 +480,32 @@ TEST_F(SpawnerPreRun_IntegrationTests, DecreasingLaneNumber_SpawnWithCorrectTGap
 
     auto spawner = CreateSpawner();
 
-    auto spawnedAgents = spawner.Trigger(0);
+    mantle_api::MockVehicle vehicle{};
+    ON_CALL(entityRepository, Create(_, testing::A<const mantle_api::VehicleProperties&>())).WillByDefault(ReturnRef(vehicle));
+
+    mantle_api::MockController controller{};
+    ON_CALL(controllerRepository, Create(_)).WillByDefault(ReturnRef(controller));
+
+    spawner.Trigger(0);
 
     ASSERT_THAT(agentsOnLane[-3].empty(), false);
-    CheckTGap(agentsOnLane[-3], 3, 1000, 1200);
-    CheckVelocity(agentsOnLane[-3], 25, 1000, 1200);
-    CheckAgentProfile(agentsOnLane[-3], "AgentProfile2a", 1000, 1200);
+    CheckTGap(agentsOnLane[-3], 3, 1000_m, 1200_m);
+    CheckVelocity(agentsOnLane[-3], 25, 1000_m, 1200_m);
+    CheckAgentProfile(agentsOnLane[-3], "AgentProfile2a", 1000_m, 1200_m);
 
     ASSERT_THAT(agentsOnLane[-2].empty(), false);
-    CheckTGap(agentsOnLane[-2], 3, 1200, 1500);
-    CheckVelocity(agentsOnLane[-2], 25, 1200, 1500);
-    CheckAgentProfile(agentsOnLane[-2], "AgentProfile2a", 1200, 1000);
-    CheckTGap(agentsOnLane[-2], 2, 1000, 1200);
-    CheckVelocity(agentsOnLane[-2], 27, 1000, 1200);
-    CheckAgentProfile(agentsOnLane[-2], "AgentProfile1a", 1000, 1200);
+    CheckTGap(agentsOnLane[-2], 3, 1200_m, 1500_m);
+    CheckVelocity(agentsOnLane[-2], 25, 1200_m, 1500_m);
+    CheckAgentProfile(agentsOnLane[-2], "AgentProfile2a", 1200_m, 1000_m);
+    CheckTGap(agentsOnLane[-2], 2, 1000_m, 1200_m);
+    CheckVelocity(agentsOnLane[-2], 27, 1000_m, 1200_m);
+    CheckAgentProfile(agentsOnLane[-2], "AgentProfile1a", 1000_m, 1200_m);
 
     ASSERT_THAT(agentsOnLane[-1].empty(), false);
-    CheckTGap(agentsOnLane[-1], 2, 1000, 1500);
-    CheckVelocity(agentsOnLane[-1], 27, 1200, 1500);
-    CheckVelocity(agentsOnLane[-1], 40.5, 1000, 1200);
-    CheckAgentProfile(agentsOnLane[-1], "AgentProfile1a", 1000, 1500);
+    CheckTGap(agentsOnLane[-1], 2, 1000_m, 1500_m);
+    CheckVelocity(agentsOnLane[-1], 27, 1200_m, 1500_m);
+    CheckVelocity(agentsOnLane[-1], 40.5, 1000_m, 1200_m);
+    CheckAgentProfile(agentsOnLane[-1], "AgentProfile1a", 1000_m, 1500_m);
 }
 
 TEST_F(SpawnerPreRun_IntegrationTests, RightLaneStartsAndEndsWithinRange_SpawnWithCorrectTGapAndProfiles)
@@ -487,31 +518,31 @@ TEST_F(SpawnerPreRun_IntegrationTests, RightLaneStartsAndEndsWithinRange_SpawnWi
     ON_CALL(*spawnZone, GetParametersDouble()).WillByDefault(ReturnRef(parametersDouble));
 
     ON_CALL(world, GetDistanceToEndOfLane(_,_,-3,_,_,_)).WillByDefault(
-                [](const RoadGraph&, RoadGraphVertex startNode, int, double initialSearchDistance, double, const LaneTypes&)
-    {return RouteQueryResult<double>{{startNode, 1400.0 - initialSearchDistance}};});
+                [](const RoadGraph&, RoadGraphVertex startNode, int, units::length::meter_t initialSearchDistance, units::length::meter_t, const LaneTypes&)
+    {return RouteQueryResult<units::length::meter_t>{{startNode, 1400.0_m - initialSearchDistance}};});
     ON_CALL(world, GetDistanceToEndOfLane(_,_,AllOf(Le(-1),Ge(-2)),_,_,_)).WillByDefault(
-                [](const RoadGraph&, RoadGraphVertex startNode, int, double initialSearchDistance, double, const LaneTypes&)
-    {return RouteQueryResult<double>{{startNode, 2000.0 - initialSearchDistance}};});
-    ON_CALL(world, IsSValidOnLane(ROADID, AllOf(Le(-1),Ge(-2)),AllOf(Ge(0),Le(2000)))).WillByDefault(Return(true));
-    ON_CALL(world, IsSValidOnLane(ROADID, -3,AllOf(Ge(1200),Le(1400)))).WillByDefault(Return(true));
-    ON_CALL(world, GetLaneWidth(_,_,_)).WillByDefault(Return(3.0));
-    ON_CALL(world, GetRoadLength(_)).WillByDefault(Return(10000.));
+                [](const RoadGraph&, RoadGraphVertex startNode, int, units::length::meter_t initialSearchDistance, units::length::meter_t, const LaneTypes&)
+    {return RouteQueryResult<units::length::meter_t>{{startNode, 2000.0_m - initialSearchDistance}};});
+    ON_CALL(world, IsSValidOnLane(ROADID, AllOf(Le(-1),Ge(-2)),AllOf(Ge(0_m),Le(2000_m)))).WillByDefault(Return(true));
+    ON_CALL(world, IsSValidOnLane(ROADID, -3,AllOf(Ge(1200_m),Le(1400_m)))).WillByDefault(Return(true));
+    ON_CALL(world, GetLaneWidth(_,_,_)).WillByDefault(Return(3.0_m));
+    ON_CALL(world, GetRoadLength(_)).WillByDefault(Return(10000._m));
 
     RouteQueryResult<std::vector<const WorldObjectInterface*>> noObjects{{0, {}}};
     ON_CALL(world, GetObjectsInRange(_,_,_,_,_,_)).WillByDefault(Return(noObjects));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1First{{0, {{0,0,{relativeLaneMinus1, relativeLane0}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-1,Ge(1400),_,_)).WillByDefault(Return(relativeLanesMinus1First));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1Second{{0, {{0,0,{relativeLaneMinus2, relativeLaneMinus1, relativeLane0}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-1,AllOf(Ge(1200),Le(1400)),_,_)).WillByDefault(Return(relativeLanesMinus1Second));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1Third{{0, {{0,0,{relativeLaneMinus1, relativeLane0}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-1,Le(1200),_,_)).WillByDefault(Return(relativeLanesMinus1Third));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2First{{0, {{0,0,{relativeLane0, relativeLanePlus1}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-2,Ge(1400),_,_)).WillByDefault(Return(relativeLanesMinus2First));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2Second{{0, {{0,0,{relativeLaneMinus1, relativeLane0, relativeLanePlus1}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-2,AllOf(Ge(1200),Le(1400)),_,_)).WillByDefault(Return(relativeLanesMinus2Second));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2Third{{0, {{0,0,{relativeLane0, relativeLanePlus1}}}}};
-    ON_CALL(world, GetRelativeLanes(_,_,-2,Le(1200),_,_)).WillByDefault(Return(relativeLanesMinus2Third));
-    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus3{{0, {{0,0,{relativeLane0, relativeLanePlus1, relativeLanePlus2}}}}};
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1First{{0, {{0_m,0_m,{relativeLaneMinus1, relativeLane0}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-1,Ge(1400_m),_,_)).WillByDefault(Return(relativeLanesMinus1First));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1Second{{0, {{0_m,0_m,{relativeLaneMinus2, relativeLaneMinus1, relativeLane0}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-1,AllOf(Ge(1200_m),Le(1400_m)),_,_)).WillByDefault(Return(relativeLanesMinus1Second));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus1Third{{0, {{0_m,0_m,{relativeLaneMinus1, relativeLane0}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-1,Le(1200_m),_,_)).WillByDefault(Return(relativeLanesMinus1Third));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2First{{0, {{0_m,0_m,{relativeLane0, relativeLanePlus1}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-2,Ge(1400_m),_,_)).WillByDefault(Return(relativeLanesMinus2First));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2Second{{0, {{0_m,0_m,{relativeLaneMinus1, relativeLane0, relativeLanePlus1}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-2,AllOf(Ge(1200_m),Le(1400_m)),_,_)).WillByDefault(Return(relativeLanesMinus2Second));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus2Third{{0, {{0_m,0_m,{relativeLane0, relativeLanePlus1}}}}};
+    ON_CALL(world, GetRelativeLanes(_,_,-2,Le(1200_m),_,_)).WillByDefault(Return(relativeLanesMinus2Third));
+    RouteQueryResult<RelativeWorldView::Lanes> relativeLanesMinus3{{0, {{0_m,0_m,{relativeLane0, relativeLanePlus1, relativeLanePlus2}}}}};
     ON_CALL(world, GetRelativeLanes(_,_,-3,_,_,_)).WillByDefault(Return(relativeLanesMinus3));
 
     NiceMock<FakeAgent> fakeAgent;
@@ -519,28 +550,34 @@ TEST_F(SpawnerPreRun_IntegrationTests, RightLaneStartsAndEndsWithinRange_SpawnWi
 
     auto spawner = CreateSpawner();
 
-    auto spawnedAgents = spawner.Trigger(0);
+    mantle_api::MockVehicle vehicle{};
+    ON_CALL(entityRepository, Create(_, testing::A<const mantle_api::VehicleProperties&>())).WillByDefault(ReturnRef(vehicle));
+
+    mantle_api::MockController controller{};
+    ON_CALL(controllerRepository, Create(_)).WillByDefault(ReturnRef(controller));
+
+    spawner.Trigger(0);
 
     ASSERT_THAT(agentsOnLane[-3].empty(), false);
-    CheckTGap(agentsOnLane[-3], 3, 1200, 1500);
-    CheckVelocity(agentsOnLane[-3], 25, 1200, 1400);
-    CheckAgentProfile(agentsOnLane[-3], "AgentProfile2a", 1200, 1400);
+    CheckTGap(agentsOnLane[-3], 3, 1200_m, 1500_m);
+    CheckVelocity(agentsOnLane[-3], 25, 1200_m, 1400_m);
+    CheckAgentProfile(agentsOnLane[-3], "AgentProfile2a", 1200_m, 1400_m);
 
     ASSERT_THAT(agentsOnLane[-2].empty(), false);
-    CheckTGap(agentsOnLane[-2], 3, 1400, 1500);
-    CheckVelocity(agentsOnLane[-2], 25, 1400, 1500);
-    CheckAgentProfile(agentsOnLane[-2], "AgentProfile2a", 1400, 1500);
-    CheckTGap(agentsOnLane[-2], 2, 1200, 1400);
-    CheckVelocity(agentsOnLane[-2], 27, 1200, 1400);
-    CheckAgentProfile(agentsOnLane[-2], "AgentProfile1a", 1200, 1400);
-    CheckTGap(agentsOnLane[-2], 3, 1000, 1200);
-    CheckVelocity(agentsOnLane[-2], 25, 1000, 1200);
-    CheckAgentProfile(agentsOnLane[-2], "AgentProfile2a", 1000, 1200);
+    CheckTGap(agentsOnLane[-2], 3, 1400_m, 1500_m);
+    CheckVelocity(agentsOnLane[-2], 25, 1400_m, 1500_m);
+    CheckAgentProfile(agentsOnLane[-2], "AgentProfile2a", 1400_m, 1500_m);
+    CheckTGap(agentsOnLane[-2], 2, 1200_m, 1400_m);
+    CheckVelocity(agentsOnLane[-2], 27, 1200_m, 1400_m);
+    CheckAgentProfile(agentsOnLane[-2], "AgentProfile1a", 1200_m, 1400_m);
+    CheckTGap(agentsOnLane[-2], 3, 1000_m, 1200_m);
+    CheckVelocity(agentsOnLane[-2], 25, 1000_m, 1200_m);
+    CheckAgentProfile(agentsOnLane[-2], "AgentProfile2a", 1000_m, 1200_m);
 
     ASSERT_THAT(agentsOnLane[-1].empty(), false);
-    CheckTGap(agentsOnLane[-1], 2, 1000, 1500);
-    CheckVelocity(agentsOnLane[-1], 27, 1400, 1500);
-    CheckVelocity(agentsOnLane[-1], 40.5, 1200, 1400);
-    CheckVelocity(agentsOnLane[-1], 27, 1000, 1200);
-    CheckAgentProfile(agentsOnLane[-1], "AgentProfile1a", 1000, 1500);
+    CheckTGap(agentsOnLane[-1], 2, 1000_m, 1500_m);
+    CheckVelocity(agentsOnLane[-1], 27, 1400_m, 1500_m);
+    CheckVelocity(agentsOnLane[-1], 40.5, 1200_m, 1400_m);
+    CheckVelocity(agentsOnLane[-1], 27, 1000_m, 1200_m);
+    CheckAgentProfile(agentsOnLane[-1], "AgentProfile1a", 1000_m, 1500_m);
 }
diff --git a/sim/tests/integrationTests/opSimulation_IntegrationTests/CMakeLists.txt b/sim/tests/integrationTests/opSimulation_IntegrationTests/CMakeLists.txt
index 9e05b34af56ba3b47e364863721e7ae3df297a4b..c9b811852f8c7ff74a6b4e8f6883e64933422d9b 100644
--- a/sim/tests/integrationTests/opSimulation_IntegrationTests/CMakeLists.txt
+++ b/sim/tests/integrationTests/opSimulation_IntegrationTests/CMakeLists.txt
@@ -22,15 +22,6 @@ add_openpass_target(
     # Parameter
     ${COMPONENT_SOURCE_DIR}/importer/parameterImporter.cpp
 
-    # Scenario
-    ScenarioImporter_IntegrationTests.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/eventDetectorImporter.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/oscImporterCommon.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/scenario.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/scenarioImporter.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/scenarioImporterHelper.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/sceneryDynamics.cpp
-
     # Scenery
     SceneryImporter_IntegrationTests.cpp
     ${COMPONENT_SOURCE_DIR}/importer/connection.cpp
@@ -51,17 +42,11 @@ add_openpass_target(
 
     # SystemConfig
     SystemConfigImporter_IntegrationTests.cpp
-    ${COMPONENT_SOURCE_DIR}/modelElements/agentBlueprint.cpp
     ${COMPONENT_SOURCE_DIR}/modelElements/agentType.cpp
     ${COMPONENT_SOURCE_DIR}/modelElements/componentType.cpp
     ${COMPONENT_SOURCE_DIR}/importer/systemConfig.cpp
     ${COMPONENT_SOURCE_DIR}/importer/systemConfigImporter.cpp
 
-    # VehicleModels
-    VehicleModelsImporter_IntegrationTests.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/vehicleModels.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/vehicleModelsImporter.cpp
-
     # World
     ${COMPONENT_SOURCE_DIR}/bindings/worldBinding.cpp
     ${COMPONENT_SOURCE_DIR}/bindings/worldLibrary.cpp
@@ -86,14 +71,6 @@ add_openpass_target(
     # Parameter
     ${COMPONENT_SOURCE_DIR}/importer/parameterImporter.h
 
-    # Scenario
-    ${COMPONENT_SOURCE_DIR}/importer/eventDetectorImporter.h
-    ${COMPONENT_SOURCE_DIR}/importer/oscImporterCommon.h
-    ${COMPONENT_SOURCE_DIR}/importer/scenario.h
-    ${COMPONENT_SOURCE_DIR}/importer/scenarioImporter.h
-    ${COMPONENT_SOURCE_DIR}/importer/scenarioImporterHelper.h
-    ${COMPONENT_SOURCE_DIR}/importer/sceneryDynamics.h
-
     # Scenery
     ${COMPONENT_SOURCE_DIR}/importer/connection.h
     ${COMPONENT_SOURCE_DIR}/importer/junction.h
@@ -118,7 +95,6 @@ add_openpass_target(
 
     # VehicleModels
     ${COMPONENT_SOURCE_DIR}/importer/vehicleModels.h
-    ${COMPONENT_SOURCE_DIR}/importer/vehicleModelsImporter.h
 
     # World
     ${COMPONENT_SOURCE_DIR}/bindings/world.h
diff --git a/sim/tests/integrationTests/opSimulation_IntegrationTests/Resources/ImporterTest/VehicleModelsCatalog.xosc b/sim/tests/integrationTests/opSimulation_IntegrationTests/Resources/ImporterTest/VehicleModelsCatalog.xosc
index 05da35c2c227d54f0e984f6abf9192f02d2ce956..95ed98fe284347aaa8929e67c73d642c887713cf 100644
--- a/sim/tests/integrationTests/opSimulation_IntegrationTests/Resources/ImporterTest/VehicleModelsCatalog.xosc
+++ b/sim/tests/integrationTests/opSimulation_IntegrationTests/Resources/ImporterTest/VehicleModelsCatalog.xosc
@@ -2,7 +2,7 @@
 <OpenSCENARIO>
   <FileHeader revMajor="0" revMinor="1" date="2018-12-04T10:00:00" description="openPASS vehicle models" author="in-tech GmbH"/>
   <Catalog name="VehicleCatalog">
-    <Vehicle name="car_one" vehicleCategory="car">
+    <Vehicle mass="1000.0" name="car_one" vehicleCategory="car">
       <Properties>
         <Property name="AirDragCoefficient" parameterType="double" value="1.1"/>
         <Property name="AxleRatio" parameterType="double" value="2.2"/>
@@ -19,7 +19,6 @@
         <Property name="MomentInertiaYaw" parameterType="double" value="0.0"/>
         <Property name="NumberOfGears" parameterType="integer" value="1"/>
         <Property name="SteeringRatio" parameterType="double" value="7.7"/>
-        <Property name="Mass" parameterType="double" value="1000.0"/>
       </Properties>
       <BoundingBox>
         <Center x="1.0" y="0.0" z="1.1"/>
@@ -31,7 +30,7 @@
         <RearAxle maxSteering="0.0" wheelDiameter="0.5" trackWidth="1.0" positionX="0.0" positionZ="0.25"/>
       </Axles>
     </Vehicle>
-    <Vehicle name="car_two" vehicleCategory="car">
+    <Vehicle mass="999.9" name="car_two" vehicleCategory="car">
       <Properties>
         <Property name="AirDragCoefficient" parameterType="double" value="2.2"/>
         <Property name="AxleRatio" parameterType="double" value="3.3"/>
@@ -49,7 +48,6 @@
         <Property name="MomentInertiaYaw" parameterType="double" value="0.0"/>
         <Property name="NumberOfGears" parameterType="integer" value="2"/>
         <Property name="SteeringRatio" parameterType="double" value="9.9"/>
-        <Property name="Mass" parameterType="double" value="999.9"/>
       </Properties>
       <BoundingBox>
         <Center x="2.0" y="0.0" z="2.2"/>
diff --git a/sim/tests/integrationTests/opSimulation_IntegrationTests/SceneryImporter_IntegrationTests.cpp b/sim/tests/integrationTests/opSimulation_IntegrationTests/SceneryImporter_IntegrationTests.cpp
index d33de7532547ab989da02837a56a199674574f72..90ff30485700b339415c54da37033b6625275926 100644
--- a/sim/tests/integrationTests/opSimulation_IntegrationTests/SceneryImporter_IntegrationTests.cpp
+++ b/sim/tests/integrationTests/opSimulation_IntegrationTests/SceneryImporter_IntegrationTests.cpp
@@ -10,37 +10,31 @@
  ********************************************************************************/
 
 #define TESTING
-#include "gtest/gtest.h"
-#include "gmock/gmock.h"
-
 #include <algorithm>
-
 #include <filesystem>
 
+#include "AgentAdapter.h"
+#include "WorldData.h"
+#include "bindings/world.h"
 #include "core/opSimulation/modules/Stochastics/stochastics_implementation.h"
+#include "fakeDataBuffer.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "importer/scenery.h"
 #include "importer/sceneryImporter.h"
-#include "modelElements/agentBlueprint.h"
-#include "bindings/world.h"
-#include "fakeDataBuffer.h"
-#include "fakeSceneryDynamics.h"
 
-#include "AgentAdapter.h"
-#include "WorldData.h"
-
-using ::testing::Return;
+using ::testing::Contains;
 using ::testing::DoubleEq;
 using ::testing::DoubleNear;
 using ::testing::ElementsAre;
-using ::testing::Contains;
 using ::testing::Eq;
 using ::testing::IsEmpty;
 using ::testing::IsTrue;
 using ::testing::Ne;
-using ::testing::UnorderedElementsAre;
-using ::testing::SizeIs;
-using ::testing::IsEmpty;
 using ::testing::NiceMock;
+using ::testing::Return;
+using ::testing::SizeIs;
+using ::testing::UnorderedElementsAre;
 
 using namespace Configuration;
 using namespace Importer;
@@ -55,7 +49,6 @@ struct TESTSCENERY_FACTORY
     core::WorldBinding worldBinding;
     core::World world;
     Scenery scenery;
-    openScenario::EnvironmentAction environment;
 
     TESTSCENERY_FACTORY() :
         worldBinding(libraryName, &callbacks, &stochastics, &fakeDataBuffer),
@@ -63,7 +56,7 @@ struct TESTSCENERY_FACTORY
     {
     }
 
-    bool instantiate(const std::string& sceneryFile, const std::vector<openScenario::TrafficSignalController>&& trafficSignalControllers = {})
+    bool instantiate(const std::string &sceneryFile/*, const std::vector<TrafficSignalController> &&trafficSignalControllers = {}*/)
     {
         std::filesystem::path sceneryPath = std::filesystem::current_path() / "Resources" / "ImporterTest" / sceneryFile;
 
@@ -77,11 +70,7 @@ struct TESTSCENERY_FACTORY
             return false;
         }
 
-        FakeSceneryDynamics sceneryDynamics;
-        ON_CALL(sceneryDynamics, GetEnvironment()).WillByDefault(Return(environment));
-        ON_CALL(sceneryDynamics, GetTrafficSignalControllers()).WillByDefault(Return(trafficSignalControllers));
-
-        if (!(world.CreateScenery(&scenery, sceneryDynamics, {})))
+        if (!(world.CreateScenery(&scenery, {})))
         {
             return false;
         }
@@ -91,52 +80,49 @@ struct TESTSCENERY_FACTORY
 };
 
 namespace RelativeWorldView {
-std::ostream& operator<<(std::ostream& os, const Lane& lane)
+std::ostream &operator<<(std::ostream &os, const Lane &lane)
 {
     os << "id: " << lane.relativeId << ", "
        << "direction: " << lane.inDrivingDirection << ","
        << "type: " << static_cast<int>(lane.type) << ","
        << "predecessor: " << lane.predecessor.value_or(-999) << ","
-       << "successor: " <<lane.successor.value_or(-999);
+       << "successor: " << lane.successor.value_or(-999);
 
     return os;
 }
-}
+} // namespace RelativeWorldView
 
 //! This enum is used to help checking lane connections as specified in the openDrive file.
 //! Note: It's possible for two connected lanes to be each others predecessor/successor.
 enum LaneConnectionType
 {
-    REGULAR = 0,    //lane a has next lane b, lane b has previous lane a
-    NEXT = 1,       //lane a has next lane b, lane b has next lane a
-    PREVIOUS = 2    //lane a has previous lane b, lane b has previous lane a
+    REGULAR = 0, //lane a has next lane b, lane b has previous lane a
+    NEXT = 1,    //lane a has next lane b, lane b has next lane a
+    PREVIOUS = 2 //lane a has previous lane b, lane b has previous lane a
 };
 
-
 //! Helper function to sort all sections for a given road by their length
 //! This is used to make checking the correct import of the sceneries easier
 //! Note: in all sceneries section lengths in each road are increasing.
-std::vector<const OWL::Interfaces::Section*> GetDistanceSortedSectionsForRoad(OWL::Interfaces::WorldData* worldData, std::string roadId)
+std::vector<const OWL::Interfaces::Section *> GetDistanceSortedSectionsForRoad(OWL::Interfaces::WorldData *worldData, std::string roadId)
 {
     //Extract sections for given roadID
     auto sections = worldData->GetRoads().at(roadId)->GetSections();
-    std::vector<const OWL::Interfaces::Section*> queriedSections{sections.cbegin(),sections.cend()};
+    std::vector<const OWL::Interfaces::Section *> queriedSections{sections.cbegin(), sections.cend()};
 
     //Sort by distance
     std::sort(queriedSections.begin(), queriedSections.end(),
-              [](auto s1, auto s2)
-    {
-        return s1->GetDistance(OWL::MeasurementPoint::RoadStart) < s2->GetDistance(OWL::MeasurementPoint::RoadStart);
-    });
+              [](auto s1, auto s2) {
+                  return s1->GetDistance(OWL::MeasurementPoint::RoadStart) < s2->GetDistance(OWL::MeasurementPoint::RoadStart);
+              });
 
     return queriedSections;
 }
 
 //! Query lane by id for a given section
-const OWL::Interfaces::Lane* GetLaneById(const std::vector<const OWL::Interfaces::Lane*>& sectionLanes, int laneId)
+const OWL::Interfaces::Lane *GetLaneById(const std::vector<const OWL::Interfaces::Lane *> &sectionLanes, int laneId)
 {
-    auto queriedLane = std::find_if(sectionLanes.begin(), sectionLanes.end(), [laneId](const OWL::Interfaces::Lane* lane)
-    {
+    auto queriedLane = std::find_if(sectionLanes.begin(), sectionLanes.end(), [laneId](const OWL::Interfaces::Lane *lane) {
         return lane->GetOdId() == laneId;
     });
 
@@ -145,14 +131,14 @@ const OWL::Interfaces::Lane* GetLaneById(const std::vector<const OWL::Interfaces
 
 //! Check if lanes are connected according to openDrive definition.
 //! The connection (e.g. predecessor or succesor) can be specified for each lane.
-void CheckLaneConnections(const std::vector<const OWL::Interfaces::Lane*>& firstSectionLanes, std::vector<const OWL::Interfaces::Lane*> secondSectionLanes, int firstLaneId, int secondLaneId, LaneConnectionType howIsConnection = LaneConnectionType::REGULAR, bool strict = true)
+void CheckLaneConnections(const std::vector<const OWL::Interfaces::Lane *> &firstSectionLanes, std::vector<const OWL::Interfaces::Lane *> secondSectionLanes, int firstLaneId, int secondLaneId, LaneConnectionType howIsConnection = LaneConnectionType::REGULAR, bool strict = true)
 {
     auto firstLane = GetLaneById(firstSectionLanes, firstLaneId);
     auto secondLane = GetLaneById(secondSectionLanes, secondLaneId);
 
     if (strict)
     {
-        switch(howIsConnection)
+        switch (howIsConnection)
         {
         case PREVIOUS:
             ASSERT_THAT(firstLane->GetPrevious(), ElementsAre(secondLane->GetId()));
@@ -170,7 +156,7 @@ void CheckLaneConnections(const std::vector<const OWL::Interfaces::Lane*>& first
     }
     else
     {
-        switch(howIsConnection)
+        switch (howIsConnection)
         {
         case PREVIOUS:
             ASSERT_THAT(firstLane->GetPrevious(), Contains(secondLane->GetId()));
@@ -195,55 +181,54 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectLanes)
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("IntegrationTestScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
     RoadGraph roadGraph;
     RoadGraphVertex root = add_vertex(RouteElement{"1", true}, roadGraph);
-    const auto relativeLanes = world.GetRelativeLanes(roadGraph, root, -1, 0.0, 150.0).at(root);
+    const auto relativeLanes = world.GetRelativeLanes(roadGraph, root, -1, 0.0_m, 150.0_m).at(root);
     ASSERT_EQ(relativeLanes.size(), 5);
 
     const auto firstSection = relativeLanes.at(0);
-    ASSERT_EQ(firstSection.startS, 0.0);
-    ASSERT_EQ(firstSection.endS, 10.0);
+    ASSERT_EQ(firstSection.startS.value(), 0.0);
+    ASSERT_EQ(firstSection.endS.value(), 10.0);
     ASSERT_THAT(firstSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, std::nullopt, 0}));
 
     const auto secondSection = relativeLanes.at(1);
-    ASSERT_EQ(secondSection.startS, 10.0);
-    ASSERT_EQ(secondSection.endS, 30.0);
+    ASSERT_EQ(secondSection.startS.value(), 10.0);
+    ASSERT_EQ(secondSection.endS.value(), 30.0);
     ASSERT_THAT(secondSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                           RelativeWorldView::Lane{-1, true, LaneType::Driving, std::nullopt, -1}));
 
     const auto thirdSection = relativeLanes.at(2);
-    ASSERT_EQ(thirdSection.startS, 30.0);
-    ASSERT_EQ(thirdSection.endS, 60.0);
+    ASSERT_EQ(thirdSection.startS.value(), 30.0);
+    ASSERT_EQ(thirdSection.endS.value(), 60.0);
     ASSERT_THAT(thirdSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                          RelativeWorldView::Lane{-1, true, LaneType::Biking, -1, -1},
                                                          RelativeWorldView::Lane{-2, true, LaneType::Sidewalk, std::nullopt, -2}));
 
     const auto forthSection = relativeLanes.at(3);
-    ASSERT_EQ(forthSection.startS, 60.0);
-    ASSERT_EQ(forthSection.endS, 100.0);
+    ASSERT_EQ(forthSection.startS.value(), 60.0);
+    ASSERT_EQ(forthSection.endS.value(), 100.0);
     ASSERT_THAT(forthSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Stop, 0, std::nullopt},
                                                          RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1},
                                                          RelativeWorldView::Lane{-2, true, LaneType::Driving, -2, -2}));
 
     const auto fifthSection = relativeLanes.at(4);
-    ASSERT_EQ(fifthSection.startS, 100.0);
-    ASSERT_EQ(fifthSection.endS, 150.0);
+    ASSERT_EQ(fifthSection.startS.value(), 100.0);
+    ASSERT_EQ(fifthSection.endS.value(), 150.0);
     ASSERT_THAT(fifthSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, std::nullopt},
                                                          RelativeWorldView::Lane{-2, true, LaneType::Stop, -2, std::nullopt}));
 
-    double maxSearchDistance = 1000.0;
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, root, -1, 0.0, maxSearchDistance, {LaneType::Driving, LaneType::Stop}).at(root), 100.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, root, -2, 15.0, maxSearchDistance, {LaneType::Driving, LaneType::Biking}).at(root), 135.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, root, -3, 35.0, maxSearchDistance, {LaneType::Driving, LaneType::Stop, LaneType::Sidewalk}).at(root), 115.0);
-
-    EXPECT_THAT(world.GetLaneWidth("1", -1, 60.0), DoubleNear(3.0, EQUALITY_BOUND));
-    EXPECT_THAT(world.GetLaneWidth("1", -2, 35.0), DoubleNear(4.0, EQUALITY_BOUND));
-    EXPECT_THAT(world.GetLaneWidth("1", -2, 45.0), DoubleNear(4.5, EQUALITY_BOUND));
-    EXPECT_THAT(world.GetLaneWidth("1", -2, 55.0), DoubleNear(5.0, EQUALITY_BOUND));
-    EXPECT_THAT(world.GetLaneWidth("1", -3, 60.0), DoubleNear(5.0, EQUALITY_BOUND));
+    units::length::meter_t maxSearchDistance = 1000.0_m;
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, root, -1, 0.0_m, maxSearchDistance, {LaneType::Driving, LaneType::Stop}).at(root).value(), 100.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, root, -2, 15.0_m, maxSearchDistance, {LaneType::Driving, LaneType::Biking}).at(root).value(), 135.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, root, -3, 35.0_m, maxSearchDistance, {LaneType::Driving, LaneType::Stop, LaneType::Sidewalk}).at(root).value(), 115.0);
 
+    EXPECT_THAT(world.GetLaneWidth("1", -1, 60.0_m).value(), DoubleNear(3.0, EQUALITY_BOUND));
+    EXPECT_THAT(world.GetLaneWidth("1", -2, 35.0_m).value(), DoubleNear(4.0, EQUALITY_BOUND));
+    EXPECT_THAT(world.GetLaneWidth("1", -2, 45.0_m).value(), DoubleNear(4.5, EQUALITY_BOUND));
+    EXPECT_THAT(world.GetLaneWidth("1", -2, 55.0_m).value(), DoubleNear(5.0, EQUALITY_BOUND));
+    EXPECT_THAT(world.GetLaneWidth("1", -3, 60.0_m).value(), DoubleNear(5.0, EQUALITY_BOUND));
 }
 
 TEST(SceneryImporter_IntegrationTests, MultipleRoads_ImportWithCorrectLanes)
@@ -251,7 +236,7 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoads_ImportWithCorrectLanes)
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("MultipleRoadsIntegrationScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
     RoadGraph roadGraph;
     RoadGraphVertex node1 = add_vertex(RouteElement{"1", true}, roadGraph);
@@ -260,66 +245,65 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoads_ImportWithCorrectLanes)
     add_edge(node1, node2, roadGraph);
     add_edge(node2, node3, roadGraph);
 
-    const auto relativeLanes = world.GetRelativeLanes(roadGraph, node1, -1, 0.0, 6000.0).at(node3);
+    const auto relativeLanes = world.GetRelativeLanes(roadGraph, node1, -1, 0.0_m, 6000.0_m).at(node3);
     ASSERT_EQ(relativeLanes.size(), 6);
 
     const auto firstSection = relativeLanes.at(0);
-    ASSERT_EQ(firstSection.startS, 0.0);
-    ASSERT_EQ(firstSection.endS, 400.0);
+    ASSERT_EQ(firstSection.startS.value(), 0.0);
+    ASSERT_EQ(firstSection.endS.value(), 400.0);
     ASSERT_THAT(firstSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, std::nullopt, 0},
                                                          RelativeWorldView::Lane{-1, true, LaneType::Driving, std::nullopt, -1},
                                                          RelativeWorldView::Lane{-2, true, LaneType::Driving, std::nullopt, -2}));
 
     const auto secondSection = relativeLanes.at(1);
-    ASSERT_EQ(secondSection.startS, 400.0);
-    ASSERT_EQ(secondSection.endS, 1000.0);
+    ASSERT_EQ(secondSection.startS.value(), 400.0);
+    ASSERT_EQ(secondSection.endS.value(), 1000.0);
     ASSERT_THAT(secondSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                           RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1},
                                                           RelativeWorldView::Lane{-2, true, LaneType::Driving, -2, -2}));
 
     const auto thirdSection = relativeLanes.at(2);
-    ASSERT_EQ(thirdSection.startS, 1000.0);
-    ASSERT_EQ(thirdSection.endS, 2100.0);
+    ASSERT_EQ(thirdSection.startS.value(), 1000.0);
+    ASSERT_EQ(thirdSection.endS.value(), 2100.0);
     ASSERT_THAT(thirdSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                          RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1},
                                                          RelativeWorldView::Lane{-2, true, LaneType::Driving, -2, -2}));
 
     const auto forthSection = relativeLanes.at(3);
-    ASSERT_EQ(forthSection.startS, 2100.0);
-    ASSERT_EQ(forthSection.endS, 3000.0);
+    ASSERT_EQ(forthSection.startS.value(), 2100.0);
+    ASSERT_EQ(forthSection.endS.value(), 3000.0);
     ASSERT_THAT(forthSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                          RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1},
                                                          RelativeWorldView::Lane{-2, true, LaneType::Driving, -2, -2}));
 
     const auto fifthSection = relativeLanes.at(4);
-    ASSERT_EQ(fifthSection.startS, 3000.0);
-    ASSERT_EQ(fifthSection.endS, 4400.0);
+    ASSERT_EQ(fifthSection.startS.value(), 3000.0);
+    ASSERT_EQ(fifthSection.endS.value(), 4400.0);
     ASSERT_THAT(fifthSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                          RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1},
                                                          RelativeWorldView::Lane{-2, true, LaneType::Driving, -2, -2}));
 
     const auto sixthSection = relativeLanes.at(5);
-    ASSERT_EQ(sixthSection.startS, 4400.0);
-    ASSERT_EQ(sixthSection.endS, 6000.0);
+    ASSERT_EQ(sixthSection.startS.value(), 4400.0);
+    ASSERT_EQ(sixthSection.endS.value(), 6000.0);
     ASSERT_THAT(sixthSection.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, std::nullopt},
                                                          RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, std::nullopt},
                                                          RelativeWorldView::Lane{-2, true, LaneType::Driving, -2, std::nullopt}));
 
-    double maxSearchLength = 10000.0;
+    units::length::meter_t maxSearchLength = 10000.0_m;
     //--------------------------------------------------------RoId, laneId, s, maxsearch
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -1, 0.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 6000.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -2, 650.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 5350.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node2, 2, 0.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 3000.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node2, 2, 1500.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 4500.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node3, -3, 0.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 3000.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node3, -3, 1500.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 1500.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -1, 0.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 6000.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -2, 650.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 5350.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node2, 2, 0.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 3000.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node2, 2, 1500.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 4500.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node3, -3, 0.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 3000.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node3, -3, 1500.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 1500.0);
 
     //-----------------------------RoId, laneId, s
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -1, 60.0), 3.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -3, 999.9), 5.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("2", 1, 0.0), 3.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("3", -2, 1500.0), 4.0);
-
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -1, 60.0_m).value(), 3.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -3, 999.9_m).value(), 5.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("2", 1, 0.0_m).value(), 3.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("3", -2, 1500.0_m).value(), 4.0);
 }
 
 TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_ImportWithCorrectLanes)
@@ -327,7 +311,7 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_ImportWithCorr
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("MultipleRoadsWithJunctionIntegrationScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
     RoadGraph roadGraph;
     RoadGraphVertex node1 = add_vertex(RouteElement{"1", true}, roadGraph);
@@ -340,27 +324,27 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_ImportWithCorr
     add_edge(node1, node5, roadGraph);
     add_edge(node5, node3, roadGraph);
 
-    const auto relativeLanes = world.GetRelativeLanes(roadGraph, node1, -1, 0.0, 320.0);
+    const auto relativeLanes = world.GetRelativeLanes(roadGraph, node1, -1, 0.0_m, 320.0_m);
     const auto relativeLanesUp = relativeLanes.at(node2);
     ASSERT_EQ(relativeLanesUp.size(), 3);
 
     const auto firstSectionUp = relativeLanesUp.at(0);
-    ASSERT_EQ(firstSectionUp.startS, 0.0);
-    ASSERT_EQ(firstSectionUp.endS, 100.0);
+    ASSERT_EQ(firstSectionUp.startS.value(), 0.0);
+    ASSERT_EQ(firstSectionUp.endS.value(), 100.0);
     ASSERT_THAT(firstSectionUp.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, std::nullopt, 0},
                                                            RelativeWorldView::Lane{-1, true, LaneType::Driving, std::nullopt, -1},
                                                            RelativeWorldView::Lane{-2, true, LaneType::Driving, std::nullopt, std::nullopt},
                                                            RelativeWorldView::Lane{-3, true, LaneType::Driving, std::nullopt, std::nullopt}));
 
     const auto secondSectionUp = relativeLanesUp.at(1);
-    ASSERT_EQ(secondSectionUp.startS, 100.0);
-    ASSERT_EQ(secondSectionUp.endS, 120.0);
+    ASSERT_EQ(secondSectionUp.startS.value(), 100.0);
+    ASSERT_EQ(secondSectionUp.endS.value(), 120.0);
     ASSERT_THAT(secondSectionUp.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                             RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1}));
 
     const auto thirdSectionUp = relativeLanesUp.at(2);
-    ASSERT_EQ(thirdSectionUp.startS, 120.0);
-    ASSERT_EQ(thirdSectionUp.endS, 320.0);
+    ASSERT_EQ(thirdSectionUp.startS.value(), 120.0);
+    ASSERT_EQ(thirdSectionUp.endS.value(), 320.0);
     ASSERT_THAT(thirdSectionUp.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, std::nullopt},
                                                            RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, std::nullopt}));
 
@@ -368,50 +352,50 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_ImportWithCorr
     ASSERT_EQ(relativeLanesDown.size(), 3);
 
     const auto firstSectionDown = relativeLanesDown.at(0);
-    ASSERT_EQ(firstSectionDown.startS, 0.0);
-    ASSERT_EQ(firstSectionDown.endS, 100.0);
+    ASSERT_EQ(firstSectionDown.startS.value(), 0.0);
+    ASSERT_EQ(firstSectionDown.endS.value(), 100.0);
     ASSERT_THAT(firstSectionDown.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, std::nullopt, std::nullopt},
                                                              RelativeWorldView::Lane{-1, true, LaneType::Driving, std::nullopt, std::nullopt},
                                                              RelativeWorldView::Lane{-2, true, LaneType::Driving, std::nullopt, -1},
                                                              RelativeWorldView::Lane{-3, true, LaneType::Driving, std::nullopt, -2}));
 
     const auto secondSectionDown = relativeLanesDown.at(1);
-    ASSERT_EQ(secondSectionDown.startS, 100.0);
-    ASSERT_EQ(secondSectionDown.endS, 120.0);
+    ASSERT_EQ(secondSectionDown.startS.value(), 100.0);
+    ASSERT_EQ(secondSectionDown.endS.value(), 120.0);
     ASSERT_THAT(secondSectionDown.lanes, UnorderedElementsAre(RelativeWorldView::Lane{-1, true, LaneType::Driving, -2, -1},
                                                               RelativeWorldView::Lane{-2, true, LaneType::Driving, -3, -2}));
 
     const auto thirdSectionDown = relativeLanesDown.at(2);
-    ASSERT_EQ(thirdSectionDown.startS, 120.0);
-    ASSERT_EQ(thirdSectionDown.endS, 420.0);
+    ASSERT_EQ(thirdSectionDown.startS.value(), 120.0);
+    ASSERT_EQ(thirdSectionDown.endS.value(), 420.0);
     ASSERT_THAT(thirdSectionDown.lanes, UnorderedElementsAre(RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, std::nullopt},
                                                              RelativeWorldView::Lane{-2, true, LaneType::Driving, -2, std::nullopt}));
 
-    double maxSearchLength = 1000.0;
+    units::length::meter_t maxSearchLength = 1000.0_m;
     //--------------------------------------------------------RoId, laneId, s, maxsearch
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -1, 0.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2), 320.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -2, 90.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2), 230.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -3, 10.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 410.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -4, 0.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 420.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node2, -1, 0.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2), 200.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node2, -2, 150.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2), 50.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node3, -1, 0.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 300.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node4, -1, 0.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2), 220.0);
-    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node5, -2, 18.0, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3), 302.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -1, 0.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2).value(), 320.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -2, 90.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2).value(), 230.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -3, 10.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 410.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node1, -4, 0.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 420.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node2, -1, 0.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2).value(), 200.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node2, -2, 150.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2).value(), 50.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node3, -1, 0.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 300.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node4, -1, 0.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node2).value(), 220.0);
+    ASSERT_DOUBLE_EQ(world.GetDistanceToEndOfLane(roadGraph, node5, -2, 18.0_m, maxSearchLength, {LaneType::Driving, LaneType::Stop}).at(node3).value(), 302.0);
 
     //-----------------------------RoId, laneId, s
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -1, 60.0), 3.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -2, 95.0), 4.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -3, 99.0), 5.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -4, 0.0), 6.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("2", -1, 1.0), 3.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("2", -2, 20.0), 4.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("3", -1, 123.0), 5.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("3", -2, 200.0), 6.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("4", -1, 15.0), 3.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("4", -2, 15.0), 4.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("5", -1, 0.0), 5.0);
-    ASSERT_DOUBLE_EQ(world.GetLaneWidth("5", -2, 15.0), 6.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -1, 60.0_m).value(), 3.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -2, 95.0_m).value(), 4.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -3, 99.0_m).value(), 5.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("1", -4, 0.0_m).value(), 6.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("2", -1, 1.0_m).value(), 3.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("2", -2, 20.0_m).value(), 4.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("3", -1, 123.0_m).value(), 5.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("3", -2, 200.0_m).value(), 6.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("4", -1, 15.0_m).value(), 3.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("4", -2, 15.0_m).value(), 4.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("5", -1, 0.0_m).value(), 5.0);
+    ASSERT_DOUBLE_EQ(world.GetLaneWidth("5", -2, 15.0_m).value(), 6.0);
 }
 
 TEST(SceneryImporter_IntegrationTests, TJunction_ImportWithCorrectLanes)
@@ -419,7 +403,7 @@ TEST(SceneryImporter_IntegrationTests, TJunction_ImportWithCorrectLanes)
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("TJunctionBig.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
     RoadGraph roadGraph;
     RoadGraphVertex node1 = add_vertex(RouteElement{"R1", false}, roadGraph);
@@ -432,33 +416,33 @@ TEST(SceneryImporter_IntegrationTests, TJunction_ImportWithCorrectLanes)
     add_edge(node2, node2_3, roadGraph);
     add_edge(node2_3, node3, roadGraph);
 
-    const auto relativeLanes = world.GetRelativeLanes(roadGraph, node2, -1, 0.0, 320.0);
+    const auto relativeLanes = world.GetRelativeLanes(roadGraph, node2, -1, 0.0_m, 320.0_m);
     const auto relativeLanesLeft = relativeLanes.at(node1);
     ASSERT_THAT(relativeLanesLeft, SizeIs(4));
 
     const auto firstSectionLeft = relativeLanesLeft.at(0);
-    ASSERT_THAT(firstSectionLeft.startS, DoubleEq(0.0));
-    ASSERT_THAT(firstSectionLeft.endS, DoubleEq(200.0));
+    ASSERT_THAT(firstSectionLeft.startS.value(), DoubleEq(0.0));
+    ASSERT_THAT(firstSectionLeft.endS.value(), DoubleEq(200.0));
     ASSERT_THAT(firstSectionLeft.lanes, UnorderedElementsAre(RelativeWorldView::Lane{2, false, LaneType::Driving, std::nullopt, std::nullopt},
                                                              RelativeWorldView::Lane{1, false, LaneType::Driving, std::nullopt, std::nullopt},
                                                              RelativeWorldView::Lane{0, true, LaneType::Driving, std::nullopt, 0},
                                                              RelativeWorldView::Lane{-1, true, LaneType::Driving, std::nullopt, -1}));
 
     const auto secondSectionLeft = relativeLanesLeft.at(1);
-    ASSERT_THAT(secondSectionLeft.startS, DoubleEq(200.0));
-    ASSERT_THAT(secondSectionLeft.endS, DoubleEq(205.708));
+    ASSERT_THAT(secondSectionLeft.startS.value(), DoubleEq(200.0));
+    ASSERT_THAT(secondSectionLeft.endS.value(), DoubleEq(205.708));
     ASSERT_THAT(secondSectionLeft.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                               RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1}));
 
     const auto thirdSectionLeft = relativeLanesLeft.at(2);
-    ASSERT_THAT(thirdSectionLeft.startS, DoubleEq(205.708));
-    ASSERT_THAT(thirdSectionLeft.endS, DoubleEq(215.708));
+    ASSERT_THAT(thirdSectionLeft.startS.value(), DoubleEq(205.708));
+    ASSERT_THAT(thirdSectionLeft.endS.value(), DoubleEq(215.708));
     ASSERT_THAT(thirdSectionLeft.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
-                                                              RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1}));
+                                                             RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1}));
 
     const auto forthSectionLeft = relativeLanesLeft.at(3);
-    ASSERT_THAT(forthSectionLeft.startS, DoubleEq(215.708));
-    ASSERT_THAT(forthSectionLeft.endS, DoubleEq(415.708));
+    ASSERT_THAT(forthSectionLeft.startS.value(), DoubleEq(215.708));
+    ASSERT_THAT(forthSectionLeft.endS.value(), DoubleEq(415.708));
     ASSERT_THAT(forthSectionLeft.lanes, UnorderedElementsAre(RelativeWorldView::Lane{2, false, LaneType::Driving, std::nullopt, std::nullopt},
                                                              RelativeWorldView::Lane{1, false, LaneType::Driving, std::nullopt, std::nullopt},
                                                              RelativeWorldView::Lane{0, true, LaneType::Driving, 0, std::nullopt},
@@ -468,35 +452,34 @@ TEST(SceneryImporter_IntegrationTests, TJunction_ImportWithCorrectLanes)
     ASSERT_THAT(relativeLanesRight, SizeIs(4));
 
     const auto firstSectionRight = relativeLanesRight.at(0);
-    ASSERT_THAT(firstSectionRight.startS, DoubleEq(0.0));
-    ASSERT_THAT(firstSectionRight.endS, DoubleEq(200.0));
+    ASSERT_THAT(firstSectionRight.startS.value(), DoubleEq(0.0));
+    ASSERT_THAT(firstSectionRight.endS.value(), DoubleEq(200.0));
     ASSERT_THAT(firstSectionRight.lanes, UnorderedElementsAre(RelativeWorldView::Lane{2, false, LaneType::Driving, std::nullopt, std::nullopt},
                                                               RelativeWorldView::Lane{1, false, LaneType::Driving, std::nullopt, std::nullopt},
                                                               RelativeWorldView::Lane{0, true, LaneType::Driving, std::nullopt, 0},
                                                               RelativeWorldView::Lane{-1, true, LaneType::Driving, std::nullopt, -1}));
 
     const auto secondSectionRight = relativeLanesRight.at(1);
-    ASSERT_THAT(secondSectionRight.startS, DoubleEq(200.0));
-    ASSERT_THAT(secondSectionRight.endS, DoubleEq(210.0));
+    ASSERT_THAT(secondSectionRight.startS.value(), DoubleEq(200.0));
+    ASSERT_THAT(secondSectionRight.endS.value(), DoubleEq(210.0));
     ASSERT_THAT(secondSectionRight.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
                                                                RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1}));
 
     const auto thirdSectionRight = relativeLanesRight.at(2);
-    ASSERT_THAT(thirdSectionRight.startS, DoubleEq(210.0));
-    ASSERT_THAT(thirdSectionRight.endS, DoubleEq(215.708));
+    ASSERT_THAT(thirdSectionRight.startS.value(), DoubleEq(210.0));
+    ASSERT_THAT(thirdSectionRight.endS.value(), DoubleEq(215.708));
     ASSERT_THAT(thirdSectionRight.lanes, UnorderedElementsAre(RelativeWorldView::Lane{0, true, LaneType::Driving, 0, 0},
-                                                               RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1}));
+                                                              RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, -1}));
 
     const auto forthSectionRight = relativeLanesRight.at(3);
-    ASSERT_THAT(forthSectionRight.startS, DoubleEq(215.708));
-    ASSERT_THAT(forthSectionRight.endS, DoubleEq(415.708));
+    ASSERT_THAT(forthSectionRight.startS.value(), DoubleEq(215.708));
+    ASSERT_THAT(forthSectionRight.endS.value(), DoubleEq(415.708));
     ASSERT_THAT(forthSectionRight.lanes, UnorderedElementsAre(RelativeWorldView::Lane{2, false, LaneType::Driving, std::nullopt, std::nullopt},
                                                               RelativeWorldView::Lane{1, false, LaneType::Driving, std::nullopt, std::nullopt},
                                                               RelativeWorldView::Lane{0, true, LaneType::Driving, 0, std::nullopt},
                                                               RelativeWorldView::Lane{-1, true, LaneType::Driving, -1, std::nullopt}));
 }
 
-
 //! Test correct lane predeccessor and successors
 //! Scope is on WorldData and OWL-Level
 TEST(SceneryImporter_IntegrationTests, SingleRoad_CheckForCorrectLaneConnections)
@@ -504,27 +487,27 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_CheckForCorrectLaneConnections
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("IntegrationTestScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
 
     ASSERT_EQ(worldData->GetRoads().at("1")->GetSections().size(), 5);
 
     auto sections = GetDistanceSortedSectionsForRoad(worldData, "1");
 
     const std::vector<int> numberOfLanesPerSection = {1, 2, 3, 3, 2};
-    const std::vector<std::vector<int>> laneConnections = {{ -1}, {-1,-2}, {-1, -2, -3}, {0, -1, -2}};
+    const std::vector<std::vector<int>> laneConnections = {{-1}, {-1, -2}, {-1, -2, -3}, {0, -1, -2}};
 
-    for(unsigned count = 0; count < 4; count++)
+    for (unsigned count = 0; count < 4; count++)
     {
         auto firstSection = sections.at(count);
         auto firstSectionLanes = firstSection->GetLanes();
         auto secondSection = sections.at(count + 1);
         auto secondSectionLanes = secondSection->GetLanes();
 
-        ASSERT_EQ(firstSectionLanes.size(),  numberOfLanesPerSection[count]);
+        ASSERT_EQ(firstSectionLanes.size(), numberOfLanesPerSection[count]);
 
-        for(int laneNumber = 0; laneNumber < numberOfLanesPerSection[count]; laneNumber++)
+        for (int laneNumber = 0; laneNumber < numberOfLanesPerSection[count]; laneNumber++)
         {
             int secondLaneId = laneConnections.at(count).at(static_cast<unsigned>(laneNumber));
             if (secondLaneId != 0)
@@ -540,23 +523,23 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoads_CheckForCorrectLaneConnecti
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("MultipleRoadsIntegrationScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
 
     ASSERT_EQ(worldData->GetRoads().at("1")->GetSections().size(), 2);
     ASSERT_EQ(worldData->GetRoads().at("2")->GetSections().size(), 2);
     ASSERT_EQ(worldData->GetRoads().at("3")->GetSections().size(), 2);
 
     auto sectionsRoad1 = GetDistanceSortedSectionsForRoad(worldData, "1");
-    const auto& lanesRoad1Section1 = sectionsRoad1.front()->GetLanes();
-    const auto& lanesRoad1Section2 = sectionsRoad1.back()->GetLanes();
+    const auto &lanesRoad1Section1 = sectionsRoad1.front()->GetLanes();
+    const auto &lanesRoad1Section2 = sectionsRoad1.back()->GetLanes();
     auto sectionsRoad2 = GetDistanceSortedSectionsForRoad(worldData, "2");
-    const auto& lanesRoad2Section1 = sectionsRoad2.front()->GetLanes();
-    const auto& lanesRoad2Section2 = sectionsRoad2.back()->GetLanes();
+    const auto &lanesRoad2Section1 = sectionsRoad2.front()->GetLanes();
+    const auto &lanesRoad2Section2 = sectionsRoad2.back()->GetLanes();
     auto sectionsRoad3 = GetDistanceSortedSectionsForRoad(worldData, "3");
-    const auto& lanesRoad3Section1 = sectionsRoad3.front()->GetLanes();
-    const auto& lanesRoad3Section2 = sectionsRoad3.back()->GetLanes();
+    const auto &lanesRoad3Section1 = sectionsRoad3.front()->GetLanes();
+    const auto &lanesRoad3Section2 = sectionsRoad3.back()->GetLanes();
 
     //check connections inside road
     CheckLaneConnections(lanesRoad1Section1, lanesRoad1Section2, -1, -1);
@@ -586,9 +569,9 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_CheckForCorrec
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("MultipleRoadsWithJunctionIntegrationScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
 
     ASSERT_EQ(worldData->GetRoads().at("1")->GetSections().size(), 1);
     ASSERT_EQ(worldData->GetRoads().at("2")->GetSections().size(), 1);
@@ -596,12 +579,11 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_CheckForCorrec
     ASSERT_EQ(worldData->GetRoads().at("4")->GetSections().size(), 1);
     ASSERT_EQ(worldData->GetRoads().at("5")->GetSections().size(), 1);
 
-    const auto& lanesIncomingRoad = GetDistanceSortedSectionsForRoad(worldData, "1").back()->GetLanes();
-    const auto& lanesUpperOutgoingRoad = GetDistanceSortedSectionsForRoad(worldData, "2").back()->GetLanes();
-    const auto& lanesLowerOutgoingRoad = GetDistanceSortedSectionsForRoad(worldData, "3").back()->GetLanes();
-    const auto& lanesUpperConnectingRoad = GetDistanceSortedSectionsForRoad(worldData, "4").back()->GetLanes();
-    const auto& lanesLowerConnectingRoad = GetDistanceSortedSectionsForRoad(worldData, "5").back()->GetLanes();
-
+    const auto &lanesIncomingRoad = GetDistanceSortedSectionsForRoad(worldData, "1").back()->GetLanes();
+    const auto &lanesUpperOutgoingRoad = GetDistanceSortedSectionsForRoad(worldData, "2").back()->GetLanes();
+    const auto &lanesLowerOutgoingRoad = GetDistanceSortedSectionsForRoad(worldData, "3").back()->GetLanes();
+    const auto &lanesUpperConnectingRoad = GetDistanceSortedSectionsForRoad(worldData, "4").back()->GetLanes();
+    const auto &lanesLowerConnectingRoad = GetDistanceSortedSectionsForRoad(worldData, "5").back()->GetLanes();
 
     //check connections between incoming road and connecting roads
     CheckLaneConnections(lanesIncomingRoad, lanesUpperConnectingRoad, -1, -1);
@@ -623,9 +605,9 @@ TEST(SceneryImporter_IntegrationTests, TJunction_CheckForCorrectLaneConnections)
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("TJunctionBig.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
 
     ASSERT_EQ(worldData->GetRoads().at("R1")->GetSections().size(), 1);
     ASSERT_EQ(worldData->GetRoads().at("R2")->GetSections().size(), 1);
@@ -633,14 +615,13 @@ TEST(SceneryImporter_IntegrationTests, TJunction_CheckForCorrectLaneConnections)
     ASSERT_EQ(worldData->GetRoads().at("R2-1")->GetSections().size(), 2);
     ASSERT_EQ(worldData->GetRoads().at("R2-3")->GetSections().size(), 2);
 
-    const auto& lanesRoad1 = GetDistanceSortedSectionsForRoad(worldData, "R1").back()->GetLanes();
-    const auto& lanesRoad2 = GetDistanceSortedSectionsForRoad(worldData, "R2").back()->GetLanes();
-    const auto& lanesRoad3 = GetDistanceSortedSectionsForRoad(worldData, "R3").back()->GetLanes();
-    const auto& lanesRoad2_1first = GetDistanceSortedSectionsForRoad(worldData, "R2-1").front()->GetLanes();
-    const auto& lanesRoad2_1second = GetDistanceSortedSectionsForRoad(worldData, "R2-1").back()->GetLanes();
-    const auto& lanesRoad2_3first = GetDistanceSortedSectionsForRoad(worldData, "R2-3").front()->GetLanes();
-    const auto& lanesRoad2_3second = GetDistanceSortedSectionsForRoad(worldData, "R2-3").back()->GetLanes();
-
+    const auto &lanesRoad1 = GetDistanceSortedSectionsForRoad(worldData, "R1").back()->GetLanes();
+    const auto &lanesRoad2 = GetDistanceSortedSectionsForRoad(worldData, "R2").back()->GetLanes();
+    const auto &lanesRoad3 = GetDistanceSortedSectionsForRoad(worldData, "R3").back()->GetLanes();
+    const auto &lanesRoad2_1first = GetDistanceSortedSectionsForRoad(worldData, "R2-1").front()->GetLanes();
+    const auto &lanesRoad2_1second = GetDistanceSortedSectionsForRoad(worldData, "R2-1").back()->GetLanes();
+    const auto &lanesRoad2_3first = GetDistanceSortedSectionsForRoad(worldData, "R2-3").front()->GetLanes();
+    const auto &lanesRoad2_3second = GetDistanceSortedSectionsForRoad(worldData, "R2-3").back()->GetLanes();
 
     //check connections between incoming road and connecting roads
     CheckLaneConnections(lanesRoad2, lanesRoad2_1second, -1, 1, LaneConnectionType::NEXT, false);
@@ -657,7 +638,7 @@ TEST(SceneryImporter_IntegrationTests, TJunction_CheckForCorrectLaneConnections)
     CheckLaneConnections(lanesRoad2_3second, lanesRoad3, -2, 2, LaneConnectionType::NEXT, false);
 }
 
-void CheckLaneNeighbours(OWL::Interfaces::WorldData* worldData, const std::vector<const OWL::Interfaces::Lane*>& lanes, int leftLaneId, int rightLaneId)
+void CheckLaneNeighbours(OWL::Interfaces::WorldData *worldData, const std::vector<const OWL::Interfaces::Lane *> &lanes, int leftLaneId, int rightLaneId)
 {
     auto leftLane = GetLaneById(lanes, leftLaneId);
     auto rightLane = GetLaneById(lanes, rightLaneId);
@@ -671,13 +652,13 @@ TEST(SceneryImporter_IntegrationTests, TJunction_CheckForCorrectLaneNeighbours)
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("TJunctionBig.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
 
-    const auto& lanesRoad2 = GetDistanceSortedSectionsForRoad(worldData, "R2").back()->GetLanes();
-    const auto& lanesRoad2_1 = GetDistanceSortedSectionsForRoad(worldData, "R2-1").back()->GetLanes();
-    const auto& lanesRoad2_3 = GetDistanceSortedSectionsForRoad(worldData, "R2-3").back()->GetLanes();
+    const auto &lanesRoad2 = GetDistanceSortedSectionsForRoad(worldData, "R2").back()->GetLanes();
+    const auto &lanesRoad2_1 = GetDistanceSortedSectionsForRoad(worldData, "R2-1").back()->GetLanes();
+    const auto &lanesRoad2_3 = GetDistanceSortedSectionsForRoad(worldData, "R2-3").back()->GetLanes();
 
     CheckLaneNeighbours(worldData, lanesRoad2, 2, 1);
     CheckLaneNeighbours(worldData, lanesRoad2, 1, -1);
@@ -692,7 +673,7 @@ TEST(SceneryImporter_IntegrationTests, TJunction_ImportWithCorrectLaneMarkings)
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("TJunctionBig.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
     RoadGraph roadGraph;
     RoadGraphVertex node1 = add_vertex(RouteElement{"R1", true}, roadGraph);
@@ -701,54 +682,54 @@ TEST(SceneryImporter_IntegrationTests, TJunction_ImportWithCorrectLaneMarkings)
     add_edge(node1, node1_2, roadGraph);
     add_edge(node1_2, node2, roadGraph);
 
-    auto laneMarkings = world.GetLaneMarkings(roadGraph, node1, 2, 0.0, 400.0, Side::Left).at(node2);
+    auto laneMarkings = world.GetLaneMarkings(roadGraph, node1, 2, 0.0_m, 400.0_m, Side::Left).at(node2);
 
     ASSERT_THAT(laneMarkings, SizeIs(1));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(0.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(0.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Solid));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::White));
 
-    laneMarkings = world.GetLaneMarkings(roadGraph, node1, 2, 0.0, 400.0, Side::Right).at(node2);
+    laneMarkings = world.GetLaneMarkings(roadGraph, node1, 2, 0.0_m, 400.0_m, Side::Right).at(node2);
 
     ASSERT_THAT(laneMarkings, SizeIs(1));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(0.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(0.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Broken));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::White));
 
-    laneMarkings = world.GetLaneMarkings(roadGraph, node1, 1, 0.0, 400.0, Side::Left).at(node2);
+    laneMarkings = world.GetLaneMarkings(roadGraph, node1, 1, 0.0_m, 400.0_m, Side::Left).at(node2);
 
     ASSERT_THAT(laneMarkings, SizeIs(1));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(0.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(0.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Broken));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::White));
 
-    laneMarkings = world.GetLaneMarkings(roadGraph, node1, 1, 0.0, 400.0, Side::Right).at(node2);
+    laneMarkings = world.GetLaneMarkings(roadGraph, node1, 1, 0.0_m, 400.0_m, Side::Right).at(node2);
 
     ASSERT_THAT(laneMarkings, SizeIs(1));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(0.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(0.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Solid));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::White));
 
-    laneMarkings = world.GetLaneMarkings(roadGraph, node1, -1, 0.0, 400.0, Side::Left).at(node2);
+    laneMarkings = world.GetLaneMarkings(roadGraph, node1, -1, 0.0_m, 400.0_m, Side::Left).at(node2);
     ASSERT_THAT(laneMarkings, SizeIs(3));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(0.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(0.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Solid));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance, DoubleEq(200.0));
+    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance.value(), DoubleEq(200.0));
     ASSERT_THAT(laneMarkings.at(1).type, Eq(LaneMarking::Type::None));
-    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance, DoubleEq(215.708));
+    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance.value(), DoubleEq(215.708));
     ASSERT_THAT(laneMarkings.at(2).type, Eq(LaneMarking::Type::Solid));
-    ASSERT_THAT(laneMarkings.at(2).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(2).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(2).color, Eq(LaneMarking::Color::White));
 }
 
 //!Workaround, because the OSI lane is a private member
-osi3::Lane GetOsiLane(const OWL::Interfaces::Lane* lane)
+osi3::Lane GetOsiLane(const OWL::Interfaces::Lane *lane)
 {
     osi3::GroundTruth groundTruth;
     lane->CopyToGroundTruth(groundTruth);
@@ -765,13 +746,13 @@ void CheckLanePairings(const OWL::Interfaces::Lane* lane, std::vector<std::pair<
     }
 }
 
-void CheckLaneNeighbours(OWL::Interfaces::WorldData* worldData, const std::vector<const OWL::Interfaces::Lane*>& lanes)
+void CheckLaneNeighbours(OWL::Interfaces::WorldData *worldData, const std::vector<const OWL::Interfaces::Lane *> &lanes)
 {
     auto nrOfLanes = static_cast<int>(lanes.size());
-    for (int laneId = -1; -laneId < nrOfLanes; --laneId)
+    for (int laneId = -1; - laneId < nrOfLanes; --laneId)
     {
         auto firstLane = GetLaneById(lanes, laneId);
-        auto secondLane = GetLaneById(lanes, laneId-1);
+        auto secondLane = GetLaneById(lanes, laneId - 1);
         auto firstLaneId = firstLane->GetId();
         auto secondLaneId = secondLane->GetId();
         EXPECT_THAT(GetOsiLane(firstLane).classification().right_adjacent_lane_id(0).value(), secondLaneId);
@@ -779,7 +760,7 @@ void CheckLaneNeighbours(OWL::Interfaces::WorldData* worldData, const std::vecto
     }
 }
 
-void CheckLaneType(OWL::Interfaces::WorldData* worldData, const std::vector<const OWL::Interfaces::Lane*>& lanes, const std::vector<osi3::Lane_Classification_Type>& expectedTypes)
+void CheckLaneType(OWL::Interfaces::WorldData *worldData, const std::vector<const OWL::Interfaces::Lane *> &lanes, const std::vector<osi3::Lane_Classification_Type> &expectedTypes)
 {
     // Only negative lanes are checked and lane "0" is only a placeholder without internal representation.
     // Calling GetLaneById with 0 would fail so start at 1.
@@ -793,7 +774,7 @@ void CheckLaneType(OWL::Interfaces::WorldData* worldData, const std::vector<cons
 }
 
 /*
-void CheckLaneSubtype(OWL::Interfaces::WorldData* worldData, const std::vector<const OWL::Interfaces::Lane*>& lanes, const std::vector<osi3::Lane_Classification_Subtype>& expectedTypes)
+void CheckLaneSubtype(OWL::Interfaces::WorldData *worldData, const std::vector<const OWL::Interfaces::Lane *> &lanes, const std::vector<osi3::Lane_Classification_Subtype> &expectedTypes)
 {
     // Only negative lanes are checked and lane "0" is only a placeholder without internal representation.
     // Calling GetLaneById with 0 would fail so start at 1.
@@ -856,42 +837,30 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_CheckForCorrectOsiLaneClassifi
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("IntegrationTestScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
 
     ASSERT_EQ(worldData->GetRoads().at("1")->GetSections().size(), 5);
 
     auto sections = GetDistanceSortedSectionsForRoad(worldData, "1");
 
-    for(const auto section: sections)
+    for (const auto section : sections)
     {
         CheckLaneNeighbours(worldData, section->GetLanes());
     }
 
-    CheckLaneType(worldData, sections[0]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_DRIVING});
+    CheckLaneType(worldData, sections[0]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING, osi3::Lane_Classification_Type_TYPE_DRIVING});
 
-//    CheckLaneSubtype(worldData, sections[0]->GetLanes(), {osi3::Lane_Classification_Subtype_SUBTYPE_OTHER,
-//                                                          osi3::Lane_Classification_Subtype_SUBTYPE_NORMAL});
+    CheckLaneSubtype(worldData, sections[0]->GetLanes(), {osi3::Lane_Classification_Subtype_SUBTYPE_OTHER, osi3::Lane_Classification_Subtype_SUBTYPE_NORMAL});
 
-    CheckLaneType(worldData, sections[1]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_DRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_DRIVING});
+    CheckLaneType(worldData, sections[1]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING, osi3::Lane_Classification_Type_TYPE_DRIVING, osi3::Lane_Classification_Type_TYPE_DRIVING});
 
-//    CheckLaneSubtype(worldData, sections[1]->GetLanes(), {osi3::Lane_Classification_Subtype_SUBTYPE_OTHER,
-//                                                          osi3::Lane_Classification_Subtype_SUBTYPE_NORMAL,
-//                                                          osi3::Lane_Classification_Subtype_SUBTYPE_NORMAL});
+    CheckLaneSubtype(worldData, sections[1]->GetLanes(), {osi3::Lane_Classification_Subtype_SUBTYPE_OTHER, osi3::Lane_Classification_Subtype_SUBTYPE_NORMAL, osi3::Lane_Classification_Subtype_SUBTYPE_NORMAL});
 
-    CheckLaneType(worldData, sections[2]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_DRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_NONDRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_NONDRIVING});
+    CheckLaneType(worldData, sections[2]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING, osi3::Lane_Classification_Type_TYPE_DRIVING, osi3::Lane_Classification_Type_TYPE_NONDRIVING, osi3::Lane_Classification_Type_TYPE_NONDRIVING});
 
-//    CheckLaneSubtype(worldData, sections[2]->GetLanes(), {osi3::Lane_Classification_Subtype_SUBTYPE_OTHER,
-//                                                          osi3::Lane_Classification_Subtype_SUBTYPE_NORMAL,
-//                                                          osi3::Lane_Classification_Subtype_SUBTYPE_BIKING,
-//                                                          osi3::Lane_Classification_Subtype_SUBTYPE_SIDEWALK});
+    CheckLaneSubtype(worldData, sections[2]->GetLanes(), {osi3::Lane_Classification_Subtype_SUBTYPE_OTHER, osi3::Lane_Classification_Subtype_SUBTYPE_NORMAL, osi3::Lane_Classification_Subtype_SUBTYPE_BIKING, osi3::Lane_Classification_Subtype_SUBTYPE_SIDEWALK});
 }
 
 TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_CheckForCorrectOsiLaneClassification)
@@ -899,9 +868,9 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_CheckForCorrec
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("MultipleRoadsWithJunctionIntegrationScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
 
     ASSERT_EQ(worldData->GetRoads().at("1")->GetSections().size(), 1);
 
@@ -909,11 +878,7 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_CheckForCorrec
 
     CheckLaneNeighbours(worldData, sections1[0]->GetLanes());
 
-    CheckLaneType(worldData, sections1[0]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_DRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_DRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_DRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_DRIVING});
+    CheckLaneType(worldData, sections1[0]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING, osi3::Lane_Classification_Type_TYPE_DRIVING, osi3::Lane_Classification_Type_TYPE_DRIVING, osi3::Lane_Classification_Type_TYPE_DRIVING, osi3::Lane_Classification_Type_TYPE_DRIVING});
 
     ASSERT_EQ(worldData->GetRoads().at("4")->GetSections().size(), 1);
 
@@ -921,9 +886,7 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithJunctions_CheckForCorrec
 
     CheckLaneNeighbours(worldData, sections4[0]->GetLanes());
 
-    CheckLaneType(worldData, sections4[0]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING,
-                                                       osi3::Lane_Classification_Type_TYPE_INTERSECTION,
-                                                       osi3::Lane_Classification_Type_TYPE_INTERSECTION});
+    CheckLaneType(worldData, sections4[0]->GetLanes(), {osi3::Lane_Classification_Type_TYPE_NONDRIVING, osi3::Lane_Classification_Type_TYPE_INTERSECTION, osi3::Lane_Classification_Type_TYPE_INTERSECTION});
 }
 
 TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithNonIntersectingJunctions_JunctionsHaveNoIntersectionInformation)
@@ -931,30 +894,30 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithNonIntersectingJunctions
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("MultipleRoadsWithJunctionIntegrationScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
-    const auto& junctionMap = worldData->GetJunctions();
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
+    const auto &junctionMap = worldData->GetJunctions();
 
     ASSERT_THAT(junctionMap.size(), 1);
 
-    const auto& junction = junctionMap.begin()->second;
+    const auto &junction = junctionMap.begin()->second;
 
     ASSERT_THAT(junction->GetIntersections().size(), 0);
 }
 
 MATCHER_P(GeometryDoublePairEq, comparisonPair, "")
 {
-    constexpr static const double EPS = 1e-3;   // epsilon value for geometric comparisons
-    return std::abs(arg.first - comparisonPair.first) < EPS && std::abs(arg.second - comparisonPair.second) < EPS;
+    constexpr static const double EPS = 1e-3; // epsilon value for geometric comparisons
+    return std::abs(arg.first.value() - comparisonPair.first) < EPS && std::abs(arg.second.value() - comparisonPair.second) < EPS;
 }
 TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithIntersectingJunctions_JunctionsHaveIntersectionInformation)
 {
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("IntersectedJunctionScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    auto &world = tsf.world;
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
     WorldDataQuery worldDataQuery(*worldData);
 
     const std::string verticalRoadStringId = "vertical_connecting";
@@ -963,10 +926,10 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithIntersectingJunctions_Ju
     const auto verticalRoad = worldDataQuery.GetRoadByOdId(verticalRoadStringId);
     const auto horizontalRoad = worldDataQuery.GetRoadByOdId(horizontalRoadStringId);
 
-    const auto& verticalLane1 = worldDataQuery.GetLaneByOdId(verticalRoadStringId, -1, 0.0);
-    const auto& verticalLane2 = worldDataQuery.GetLaneByOdId(verticalRoadStringId, -2, 0.0);
-    const auto& horizontalLane1 = worldDataQuery.GetLaneByOdId(horizontalRoadStringId, -1, 0.0);
-    const auto& horizontalLane2 = worldDataQuery.GetLaneByOdId(horizontalRoadStringId, -2, 0.0);
+    const auto &verticalLane1 = worldDataQuery.GetLaneByOdId(verticalRoadStringId, -1, 0.0_m);
+    const auto &verticalLane2 = worldDataQuery.GetLaneByOdId(verticalRoadStringId, -2, 0.0_m);
+    const auto &horizontalLane1 = worldDataQuery.GetLaneByOdId(horizontalRoadStringId, -1, 0.0_m);
+    const auto &horizontalLane2 = worldDataQuery.GetLaneByOdId(horizontalRoadStringId, -2, 0.0_m);
 
     const std::pair<OWL::Id, OWL::Id> v1h1{verticalLane1.GetId(), horizontalLane1.GetId()};
     const std::pair<OWL::Id, OWL::Id> v1h2{verticalLane1.GetId(), horizontalLane2.GetId()};
@@ -988,10 +951,10 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithIntersectingJunctions_Ju
     const std::pair<double, double> h2v1SOffset{7, 10};
     const std::pair<double, double> h2v2SOffset{4, 7};
 
-    const auto& junctionMap = worldData->GetJunctions();
+    const auto &junctionMap = worldData->GetJunctions();
     ASSERT_THAT(junctionMap.size(), 1);
 
-    const auto& junction = junctionMap.begin()->second;
+    const auto &junction = junctionMap.begin()->second;
     ASSERT_THAT(junction->GetIntersections().size(), 2);
 
     std::vector<OWL::IntersectionInfo> verticalIntersectionInfos;
@@ -1006,10 +969,10 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithIntersectingJunctions_Ju
     ASSERT_THAT(verticalIntersectionInfos.size(), 1);
     ASSERT_THAT(horizontalIntersectionInfos.size(), 1);
 
-    const auto& verticalConnectionInfo = verticalIntersectionInfos.front();
-    const auto& horizontalConnectionInfo = horizontalIntersectionInfos.front();
+    const auto &verticalConnectionInfo = verticalIntersectionInfos.front();
+    const auto &horizontalConnectionInfo = horizontalIntersectionInfos.front();
 
-    ASSERT_THAT(verticalConnectionInfo.intersectingRoad, Eq(horizontalRoad->GetId()));// horizontalRoadIdPair->first);
+    ASSERT_THAT(verticalConnectionInfo.intersectingRoad, Eq(horizontalRoad->GetId())); // horizontalRoadIdPair->first);
     ASSERT_THAT(horizontalConnectionInfo.intersectingRoad, Eq(verticalRoad->GetId()));
 
     ASSERT_THAT(verticalConnectionInfo.relativeRank, IntersectingConnectionRank::Higher);
@@ -1026,30 +989,32 @@ TEST(SceneryImporter_IntegrationTests, MultipleRoadsWithIntersectingJunctions_Ju
     ASSERT_THAT(horizontalConnectionInfo.sOffsets.at(h2v2), GeometryDoublePairEq(h2v2SOffset));
 }
 
-[[nodiscard]] AgentInterface& ADD_AGENT (core::World& world,
-                               double x, double y, double width = 1.0, double length = 1.0)
+[[nodiscard]] AgentInterface& ADD_AGENT(core::World &world,
+                                                        units::length::meter_t x, units::length::meter_t y, units::length::meter_t width = 1.0_m, units::length::meter_t length = 1.0_m)
 {
-    VehicleModelParameters vehicleParameter;
-    vehicleParameter.vehicleType = AgentVehicleType::Car;
-    vehicleParameter.boundingBoxDimensions.width = width;
-    vehicleParameter.boundingBoxDimensions.length = length;
-    vehicleParameter.boundingBoxCenter.x = 0.0;
+    AgentBuildInstructions agentBuildInstructions;
+    agentBuildInstructions.agentCategory = AgentCategory::Scenario;
+
+    auto vehicleParameter = std::make_shared<mantle_api::VehicleProperties>();
+    vehicleParameter->type = mantle_api::EntityType::kVehicle;
+    vehicleParameter->classification = mantle_api::VehicleClass::kMedium_car;
+    vehicleParameter->bounding_box.dimension.width = width;
+    vehicleParameter->bounding_box.dimension.length = length;
+    vehicleParameter->bounding_box.geometric_center.x = 0.0_m;
+
+    agentBuildInstructions.entityProperties = vehicleParameter;
 
     SpawnParameter spawnParameter;
-    spawnParameter.positionX = x;
-    spawnParameter.positionY = y;
-    spawnParameter.velocity = 1.0;
-    spawnParameter.yawAngle = 0.0;
-    auto position = world.WorldCoord2LaneCoord(x,y,0);
+    agentBuildInstructions.spawnParameter.position.x = x;
+    agentBuildInstructions.spawnParameter.position.y = y;
+    agentBuildInstructions.spawnParameter.velocity = 1.0_mps;
+    agentBuildInstructions.spawnParameter.orientation.yaw = 0.0_rad;
+    auto position = world.WorldCoord2LaneCoord(x, y, 0_rad);
     RoadGraph roadGraph;
     auto vertex = add_vertex(RouteElement{position.cbegin()->second.roadId, true}, roadGraph);
-    spawnParameter.route = {roadGraph, vertex, vertex};
-
-    AgentBlueprint agentBlueprint;
-    agentBlueprint.SetVehicleModelParameters(vehicleParameter);
-    agentBlueprint.SetSpawnParameter(spawnParameter);
+    agentBuildInstructions.spawnParameter.route = {roadGraph, vertex, vertex};
 
-    return world.CreateAgentAdapter(agentBlueprint);
+    return world.CreateAgentAdapter(agentBuildInstructions);
 }
 
 TEST(GetObjectsInRange_IntegrationTests, OneObjectOnQueriedLane)
@@ -1058,14 +1023,14 @@ TEST(GetObjectsInRange_IntegrationTests, OneObjectOnQueriedLane)
     ASSERT_THAT(tsf.instantiate("SceneryLeftLaneEnds.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 10.0, 2.0);
-    auto& agent1 = ADD_AGENT(world, 10.0, 5.0);
-    auto& agent2 = ADD_AGENT(world, 10.0, 9.0);
+    auto& agent0 = ADD_AGENT(world, 10.0_m, 2.0_m);
+    auto& agent1 = ADD_AGENT(world, 10.0_m, 5.0_m);
+    auto& agent2 = ADD_AGENT(world, 10.0_m, 9.0_m);
     world.SyncGlobalData(0);
 
     RoadGraph roadGraph;
     RoadGraphVertex root = add_vertex(RouteElement{"1", true}, roadGraph);
-    const auto objectsInRange = world.GetObjectsInRange(roadGraph, root, -3, 0, 0, 500).at(root);
+    const auto objectsInRange = world.GetObjectsInRange(roadGraph, root, -3, 0_m, 0_m, 500_m).at(root);
     ASSERT_THAT(objectsInRange, SizeIs(1));
     ASSERT_THAT(objectsInRange.at(0), Eq(world.GetAgent(1)));
 }
@@ -1076,13 +1041,13 @@ TEST(GetObjectsInRange_IntegrationTests, NoObjectOnQueriedLane)
     ASSERT_THAT(tsf.instantiate("SceneryLeftLaneEnds.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 10.0, 2.0);
-    auto& agent1 = ADD_AGENT(world, 10.0, 9.0);
+    auto& agent0 = ADD_AGENT(world, 10.0_m, 2.0_m);
+    auto& agent1 = ADD_AGENT(world, 10.0_m, 9.0_m);
     world.SyncGlobalData(0);
 
     RoadGraph roadGraph;
     RoadGraphVertex root = add_vertex(RouteElement{"1", true}, roadGraph);
-    const auto objectsInRange = world.GetObjectsInRange(roadGraph, root, -3, 0, 0, 500).at(root);
+    const auto objectsInRange = world.GetObjectsInRange(roadGraph, root, -3, 0_m, 0_m, 500_m).at(root);
     ASSERT_THAT(objectsInRange, IsEmpty());
 }
 
@@ -1092,15 +1057,15 @@ TEST(GetObjectsInRange_IntegrationTests, TwoObjectsInDifferentSections)
     ASSERT_THAT(tsf.instantiate("SceneryLeftLaneEnds.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 10.0, 2.0);
-    auto& agent1 = ADD_AGENT(world, 310.0, 5.0);
-    auto& agent2 = ADD_AGENT(world, 10.0, 5.0);
-    auto& agent3 = ADD_AGENT(world, 10.0, 9.0);
+    auto& agent0 = ADD_AGENT(world, 10.0_m, 2.0_m);
+    auto& agent1 = ADD_AGENT(world, 310.0_m, 5.0_m);
+    auto& agent2 = ADD_AGENT(world, 10.0_m, 5.0_m);
+    auto& agent3 = ADD_AGENT(world, 10.0_m, 9.0_m);
     world.SyncGlobalData(0);
 
     RoadGraph roadGraph;
     RoadGraphVertex root = add_vertex(RouteElement{"1", true}, roadGraph);
-    const auto objectsInRange = world.GetObjectsInRange(roadGraph, root, -3, 0, 0, 500).at(root);
+    const auto objectsInRange = world.GetObjectsInRange(roadGraph, root, -3, 0_m, 0_m, 500_m).at(root);
     ASSERT_THAT(objectsInRange, SizeIs(2));
     ASSERT_THAT(objectsInRange.at(0), Eq(world.GetAgent(2)));
     ASSERT_THAT(objectsInRange.at(1), Eq(world.GetAgent(1)));
@@ -1112,14 +1077,14 @@ TEST(GetObjectsInRange_IntegrationTests, OneObjectOnSectionBorder)
     ASSERT_THAT(tsf.instantiate("SceneryLeftLaneEnds.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 300.0, 2.0);
-    auto& agent1 = ADD_AGENT(world, 300.0, 5.0);
-    auto& agent2 = ADD_AGENT(world, 300.0, 9.0);
+    auto& agent0 = ADD_AGENT(world, 300.0_m, 2.0_m);
+    auto& agent1 = ADD_AGENT(world, 300.0_m, 5.0_m);
+    auto& agent2 = ADD_AGENT(world, 300.0_m, 9.0_m);
     world.SyncGlobalData(0);
 
     RoadGraph roadGraph;
     RoadGraphVertex root = add_vertex(RouteElement{"1", true}, roadGraph);
-    const auto objectsInRange = world.GetObjectsInRange(roadGraph, root, -3, 0, 0, 500).at(root);
+    const auto objectsInRange = world.GetObjectsInRange(roadGraph, root, -3, 0_m, 0_m, 500_m).at(root);
     ASSERT_THAT(objectsInRange, SizeIs(1));
     ASSERT_THAT(objectsInRange.at(0), Eq(world.GetAgent(1)));
 }
@@ -1130,10 +1095,10 @@ TEST(GetObjectsInRange_IntegrationTests, MultipleRoads)
     ASSERT_THAT(tsf.instantiate("MultipleRoadsIntegrationScenery.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 510.0, 6.0);
-    auto& agent1 = ADD_AGENT(world, 1300.0, 2.0);
-    auto& agent2 = ADD_AGENT(world, 510.0, 2.0);
-    auto& agent3 = ADD_AGENT(world, 510.0, -1.0);
+    auto& agent0 = ADD_AGENT(world, 510.0_m, 6.0_m);
+    auto& agent1 = ADD_AGENT(world, 1300.0_m, 2.0_m);
+    auto& agent2 = ADD_AGENT(world, 510.0_m, 2.0_m);
+    auto& agent3 = ADD_AGENT(world, 510.0_m, -1.0_m);
     world.SyncGlobalData(0);
 
     RoadGraph roadGraph;
@@ -1142,7 +1107,7 @@ TEST(GetObjectsInRange_IntegrationTests, MultipleRoads)
     RoadGraphVertex node3 = add_vertex(RouteElement{"3", true}, roadGraph);
     add_edge(node1, node2, roadGraph);
     add_edge(node2, node3, roadGraph);
-    const auto objectsInRange = world.GetObjectsInRange(roadGraph, node1, -2, 500, 0, 1500).at(node3);
+    const auto objectsInRange = world.GetObjectsInRange(roadGraph, node1, -2, 500_m, 0_m, 1500_m).at(node3);
     ASSERT_THAT(objectsInRange, SizeIs(2));
     ASSERT_THAT(objectsInRange.at(0), Eq(world.GetAgent(2)));
     ASSERT_THAT(objectsInRange.at(1), Eq(world.GetAgent(1)));
@@ -1154,25 +1119,25 @@ TEST(Locator_IntegrationTests, AgentOnStraightRoad_CalculatesCorrectLocateResult
     ASSERT_THAT(tsf.instantiate("MultipleRoadsIntegrationScenery.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    const auto& agent1 = ADD_AGENT(world, 399.0, 1.0, 2.0, 5.0);
-    const auto& agent2 = ADD_AGENT(world, 2500.0, 1.0, 2.0, 5.0);
+    const auto& agent1 = ADD_AGENT(world, 399.0_m, 1.0_m, 2.0_m, 5.0_m);
+    const auto& agent2 = ADD_AGENT(world, 2500.0_m, 1.0_m, 2.0_m, 5.0_m);
     world.SyncGlobalData(0);
 
     EXPECT_THAT(agent1.GetRoads(ObjectPointPredefined::FrontCenter), ElementsAre("1"));
     EXPECT_THAT(agent1.GetRoadPosition(ObjectPointPredefined::FrontCenter).at("1").laneId, Eq(-2));
-    EXPECT_THAT(agent1.GetTouchedRoads().at("1").sMin.roadPosition.s, DoubleNear(396.5, 0.01));
-    EXPECT_THAT(agent1.GetTouchedRoads().at("1").sMax.roadPosition.s, DoubleNear(401.5, 0.01));
-    EXPECT_THAT(agent1.GetTouchedRoads().at("1").tMin.roadPosition.t, DoubleNear(2.0, 0.01));
+    EXPECT_THAT(agent1.GetTouchedRoads().at("1").sMin.roadPosition.s.value(), DoubleNear(396.5, 0.01));
+    EXPECT_THAT(agent1.GetTouchedRoads().at("1").sMax.roadPosition.s.value(), DoubleNear(401.5, 0.01));
+    EXPECT_THAT(agent1.GetTouchedRoads().at("1").tMin.roadPosition.t.value(), DoubleNear(2.0, 0.01));
     EXPECT_THAT(agent1.GetTouchedRoads().at("1").tMin.laneId, Eq(-3));
-    EXPECT_THAT(agent1.GetTouchedRoads().at("1").tMax.roadPosition.t, DoubleNear(-0.5, 0.01));
+    EXPECT_THAT(agent1.GetTouchedRoads().at("1").tMax.roadPosition.t.value(), DoubleNear(-0.5, 0.01));
     EXPECT_THAT(agent1.GetTouchedRoads().at("1").tMax.laneId, Eq(-2));
     EXPECT_THAT(agent2.GetRoads(ObjectPointPredefined::FrontCenter), ElementsAre("2"));
     EXPECT_THAT(agent2.GetRoadPosition(ObjectPointPredefined::FrontCenter).at("2").laneId, Eq(2));
-    EXPECT_THAT(agent2.GetTouchedRoads().at("2").sMin.roadPosition.s, DoubleNear(497.5, 0.01));
-    EXPECT_THAT(agent2.GetTouchedRoads().at("2").sMax.roadPosition.s, DoubleNear(502.5, 0.01));
-    EXPECT_THAT(agent2.GetTouchedRoads().at("2").tMin.roadPosition.t, DoubleNear(0.5, 0.01));
+    EXPECT_THAT(agent2.GetTouchedRoads().at("2").sMin.roadPosition.s.value(), DoubleNear(497.5, 0.01));
+    EXPECT_THAT(agent2.GetTouchedRoads().at("2").sMax.roadPosition.s.value(), DoubleNear(502.5, 0.01));
+    EXPECT_THAT(agent2.GetTouchedRoads().at("2").tMin.roadPosition.t.value(), DoubleNear(0.5, 0.01));
     EXPECT_THAT(agent2.GetTouchedRoads().at("2").tMin.laneId, Eq(2));
-    EXPECT_THAT(agent2.GetTouchedRoads().at("2").tMax.roadPosition.t, DoubleNear(-2.0, 0.01));
+    EXPECT_THAT(agent2.GetTouchedRoads().at("2").tMax.roadPosition.t.value(), DoubleNear(-2.0, 0.01));
     EXPECT_THAT(agent2.GetTouchedRoads().at("2").tMax.laneId, Eq(3));
 }
 
@@ -1182,17 +1147,17 @@ TEST(Locator_IntegrationTests, AgentOnJunction_CalculatesCorrectLocateResult)
     ASSERT_THAT(tsf.instantiate("TJunction.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent = ADD_AGENT(world, 208.0, -2.0, 2.0, 4.0);
+    auto& agent = ADD_AGENT(world, 208.0_m, -2.0_m, 2.0_m, 4.0_m);
     world.SyncGlobalData(0);
 
-    EXPECT_THAT(agent.GetTouchedRoads().at("R1-3").sMin.roadPosition.s, DoubleNear(6.0, 0.01));
-    EXPECT_THAT(agent.GetTouchedRoads().at("R1-3").sMax.roadPosition.s, DoubleNear(10.0, 0.01));
-    EXPECT_THAT(agent.GetTouchedRoads().at("R2-3").sMin.roadPosition.s, DoubleNear(M_PI, 0.15));       //front left corner
-    EXPECT_THAT(agent.GetTouchedRoads().at("R2-3").sMax.roadPosition.s, DoubleNear(std::atan(2.5) * 6, 0.15));       //intersection point on right boundary
-    EXPECT_THAT(agent.GetTouchedRoads().at("R3-2").sMin.roadPosition.s, DoubleNear(std::acos(5.0 / 6.0) * 6, 0.15)); //intersection point on left boundary
-    EXPECT_THAT(agent.GetTouchedRoads().at("R3-2").sMax.roadPosition.s, DoubleNear(std::atan(2.0) * 6, 0.15));       //rear right corner
-    EXPECT_THAT(agent.GetTouchedRoads().at("R2-1").sMin.roadPosition.s, DoubleNear(std::asin(0.3) * 6, 0.15));       //rear left corner
-    EXPECT_THAT(agent.GetTouchedRoads().at("R2-1").sMax.roadPosition.s, DoubleNear(std::atan(5.0 / 6.0) * 6, 0.15)); //intersection point on right boundary
+    EXPECT_THAT(agent.GetTouchedRoads().at("R1-3").sMin.roadPosition.s.value(), DoubleNear(6.0, 0.01));
+    EXPECT_THAT(agent.GetTouchedRoads().at("R1-3").sMax.roadPosition.s.value(), DoubleNear(10.0, 0.01));
+    EXPECT_THAT(agent.GetTouchedRoads().at("R2-3").sMin.roadPosition.s.value(), DoubleNear(M_PI, 0.15));       //front left corner
+    EXPECT_THAT(agent.GetTouchedRoads().at("R2-3").sMax.roadPosition.s.value(), DoubleNear(std::atan(2.5) * 6, 0.15));       //intersection point on right boundary
+    EXPECT_THAT(agent.GetTouchedRoads().at("R3-2").sMin.roadPosition.s.value(), DoubleNear(std::acos(5.0 / 6.0) * 6, 0.15)); //intersection point on left boundary
+    EXPECT_THAT(agent.GetTouchedRoads().at("R3-2").sMax.roadPosition.s.value(), DoubleNear(std::atan(2.0) * 6, 0.15));       //rear right corner
+    EXPECT_THAT(agent.GetTouchedRoads().at("R2-1").sMin.roadPosition.s.value(), DoubleNear(std::asin(0.3) * 6, 0.15));       //rear left corner
+    EXPECT_THAT(agent.GetTouchedRoads().at("R2-1").sMax.roadPosition.s.value(), DoubleNear(std::atan(5.0 / 6.0) * 6, 0.15)); //intersection point on right boundary
 }
 
 TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectLaneMarkings)
@@ -1200,161 +1165,162 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectLaneMarkings)
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("IntegrationTestScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
     RoadGraph roadGraph;
     RoadGraphVertex root = add_vertex(RouteElement{"1", true}, roadGraph);
-    auto laneMarkings = world.GetLaneMarkings(roadGraph, root, -1, 0.0, 99.0, Side::Left).at(root);
+    auto laneMarkings = world.GetLaneMarkings(roadGraph, root, -1, 0.0_m, 99.0_m, Side::Left).at(root);
     ASSERT_THAT(laneMarkings, SizeIs(5));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(0.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(0.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Solid));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance, DoubleEq(10.0));
+    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance.value(), DoubleEq(10.0));
     ASSERT_THAT(laneMarkings.at(1).type, Eq(LaneMarking::Type::None));
-    ASSERT_THAT(laneMarkings.at(1).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(1).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(1).color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance, DoubleEq(18.0));
+    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance.value(), DoubleEq(18.0));
     ASSERT_THAT(laneMarkings.at(2).type, Eq(LaneMarking::Type::Solid));
-    ASSERT_THAT(laneMarkings.at(2).width, DoubleEq(0.3));
+    ASSERT_THAT(laneMarkings.at(2).width.value(), DoubleEq(0.3));
     ASSERT_THAT(laneMarkings.at(2).color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(laneMarkings.at(3).relativeStartDistance, DoubleEq(30.0));
+    ASSERT_THAT(laneMarkings.at(3).relativeStartDistance.value(), DoubleEq(30.0));
 
-    laneMarkings = world.GetLaneMarkings(roadGraph, root, -1, 0.0, 99.0, Side::Right).at(root);
+    laneMarkings = world.GetLaneMarkings(roadGraph, root, -1, 0.0_m, 99.0_m, Side::Right).at(root);
     ASSERT_THAT(laneMarkings, SizeIs(5));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(0.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(0.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Broken));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::Yellow));
-    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance, DoubleEq(10.0));
+    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance.value(), DoubleEq(10.0));
     ASSERT_THAT(laneMarkings.at(1).type, Eq(LaneMarking::Type::Broken_Solid));
-    ASSERT_THAT(laneMarkings.at(1).width, DoubleEq(0.3));
+    ASSERT_THAT(laneMarkings.at(1).width.value(), DoubleEq(0.3));
     ASSERT_THAT(laneMarkings.at(1).color, Eq(LaneMarking::Color::Red));
-    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance, DoubleEq(21.0));
+    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance.value(), DoubleEq(21.0));
     ASSERT_THAT(laneMarkings.at(2).type, Eq(LaneMarking::Type::Solid_Broken));
-    ASSERT_THAT(laneMarkings.at(2).width, DoubleEq(0.3));
+    ASSERT_THAT(laneMarkings.at(2).width.value(), DoubleEq(0.3));
     ASSERT_THAT(laneMarkings.at(2).color, Eq(LaneMarking::Color::Blue));
-    ASSERT_THAT(laneMarkings.at(3).relativeStartDistance, DoubleEq(30.0));
+    ASSERT_THAT(laneMarkings.at(3).relativeStartDistance.value(), DoubleEq(30.0));
     ASSERT_THAT(laneMarkings.at(3).type, Eq(LaneMarking::Type::None));
 
-    laneMarkings = world.GetLaneMarkings(roadGraph, root, -2, 11.0, 88.0, Side::Left).at(root);
+    laneMarkings = world.GetLaneMarkings(roadGraph, root, -2, 11.0_m, 88.0_m, Side::Left).at(root);
     ASSERT_THAT(laneMarkings, SizeIs(4));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(-1.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(-1.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Broken_Solid));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.3));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.3));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::Red));
-    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance, DoubleEq(10.0));
+    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance.value(), DoubleEq(10.0));
     ASSERT_THAT(laneMarkings.at(1).type, Eq(LaneMarking::Type::Solid_Broken));
-    ASSERT_THAT(laneMarkings.at(1).width, DoubleEq(0.3));
+    ASSERT_THAT(laneMarkings.at(1).width.value(), DoubleEq(0.3));
     ASSERT_THAT(laneMarkings.at(1).color, Eq(LaneMarking::Color::Blue));
-    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance, DoubleEq(19.0));
+    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance.value(), DoubleEq(19.0));
 
-    laneMarkings = world.GetLaneMarkings(roadGraph, root, -2, 11.0, 88.0, Side::Right).at(root);
+    laneMarkings = world.GetLaneMarkings(roadGraph, root, -2, 11.0_m, 88.0_m, Side::Right).at(root);
     ASSERT_THAT(laneMarkings, SizeIs(4));
-    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance, DoubleEq(-1.0));
+    ASSERT_THAT(laneMarkings.at(0).relativeStartDistance.value(), DoubleEq(-1.0));
     ASSERT_THAT(laneMarkings.at(0).type, Eq(LaneMarking::Type::Broken_Broken));
-    ASSERT_THAT(laneMarkings.at(0).width, DoubleEq(0.15));
+    ASSERT_THAT(laneMarkings.at(0).width.value(), DoubleEq(0.15));
     ASSERT_THAT(laneMarkings.at(0).color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance, DoubleEq(4.0));
+    ASSERT_THAT(laneMarkings.at(1).relativeStartDistance.value(), DoubleEq(4.0));
     ASSERT_THAT(laneMarkings.at(1).type, Eq(LaneMarking::Type::Solid_Solid));
-    ASSERT_THAT(laneMarkings.at(1).width, DoubleEq(0.3));
+    ASSERT_THAT(laneMarkings.at(1).width.value(), DoubleEq(0.3));
     ASSERT_THAT(laneMarkings.at(1).color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance, DoubleEq(19.0));
+    ASSERT_THAT(laneMarkings.at(2).relativeStartDistance.value(), DoubleEq(19.0));
 }
 
-TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSigns)
+// TODO Reactivate after TrafficSignalController is available in MantleAPI
+/*TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSigns)
 {
-    openScenario::TrafficSignalController trafficSignalController;
+    TrafficSignalController trafficSignalController;
     trafficSignalController.delay = 0.0;
-    trafficSignalController.phases.push_back(openScenario::TrafficSignalControllerPhase{"", 1, {{"8", "red yellow"}, {"9", "green"}}});
+    trafficSignalController.phases.push_back(TrafficSignalControllerPhase{"", 1, {{"8", "red yellow"}, {"9", "green"}}});
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("IntegrationTestScenery.xodr", {trafficSignalController}), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
     RoadGraph roadGraph;
     RoadGraphVertex root = add_vertex(RouteElement{"1", true}, roadGraph);
-    auto trafficSigns = world.GetTrafficSignsInRange(roadGraph, root, -1, 5, 90).at(root);
+    auto trafficSigns = world.GetTrafficSignsInRange(roadGraph, root, -1, 5_m, 90_m).at(root);
     std::sort(trafficSigns.begin(), trafficSigns.end(),
-              [](CommonTrafficSign::Entity first, CommonTrafficSign::Entity second){return first.relativeDistance < second.relativeDistance;});
+              [](CommonTrafficSign::Entity first, CommonTrafficSign::Entity second) { return first.relativeDistance < second.relativeDistance; });
     ASSERT_THAT(trafficSigns, SizeIs(3));
-    ASSERT_THAT(trafficSigns.at(0).relativeDistance, DoubleEq(10.0));
+    ASSERT_THAT(trafficSigns.at(0).relativeDistance.value(), DoubleEq(10.0));
     ASSERT_THAT(trafficSigns.at(0).type, Eq(CommonTrafficSign::Type::MaximumSpeedLimit));
     ASSERT_THAT(trafficSigns.at(0).value, DoubleNear(50 / 3.6, 1e-3));
     ASSERT_THAT(trafficSigns.at(0).unit, Eq(CommonTrafficSign::Unit::MeterPerSecond));
     ASSERT_THAT(trafficSigns.at(0).supplementarySigns, IsEmpty());
-    ASSERT_THAT(trafficSigns.at(1).relativeDistance, DoubleEq(30.0));
+    ASSERT_THAT(trafficSigns.at(1).relativeDistance.value(), DoubleEq(30.0));
     ASSERT_THAT(trafficSigns.at(1).type, Eq(CommonTrafficSign::Type::SpeedLimitZoneBegin));
     ASSERT_THAT(trafficSigns.at(1).value, DoubleNear(30 / 3.6, 1e-3));
     ASSERT_THAT(trafficSigns.at(1).unit, Eq(CommonTrafficSign::Unit::MeterPerSecond));
     ASSERT_THAT(trafficSigns.at(1).supplementarySigns, IsEmpty());
-    ASSERT_THAT(trafficSigns.at(2).relativeDistance, DoubleEq(31.0));
+    ASSERT_THAT(trafficSigns.at(2).relativeDistance.value(), DoubleEq(31.0));
     ASSERT_THAT(trafficSigns.at(2).type, Eq(CommonTrafficSign::Type::AnnounceLeftLaneEnd));
     ASSERT_THAT(trafficSigns.at(2).value, Eq(2));
     ASSERT_THAT(trafficSigns.at(2).supplementarySigns, IsEmpty());
 
-    trafficSigns = world.GetTrafficSignsInRange(roadGraph, root, -2, 11, 90).at(root);
+    trafficSigns = world.GetTrafficSignsInRange(roadGraph, root, -2, 11_m, 90_m).at(root);
     std::sort(trafficSigns.begin(), trafficSigns.end(),
-              [](CommonTrafficSign::Entity first, CommonTrafficSign::Entity second){return first.relativeDistance < second.relativeDistance;});
+              [](CommonTrafficSign::Entity first, CommonTrafficSign::Entity second) { return first.relativeDistance < second.relativeDistance; });
     ASSERT_THAT(trafficSigns, SizeIs(5));
-    ASSERT_THAT(trafficSigns.at(0).relativeDistance, DoubleEq(4.0));
+    ASSERT_THAT(trafficSigns.at(0).relativeDistance.value(), DoubleEq(4.0));
     ASSERT_THAT(trafficSigns.at(0).type, Eq(CommonTrafficSign::Type::MaximumSpeedLimit));
     ASSERT_THAT(trafficSigns.at(0).value, DoubleNear(50 / 3.6, 1e-3));
     ASSERT_THAT(trafficSigns.at(0).unit, Eq(CommonTrafficSign::Unit::MeterPerSecond));
     ASSERT_THAT(trafficSigns.at(0).supplementarySigns, IsEmpty());
-    ASSERT_THAT(trafficSigns.at(1).relativeDistance, DoubleEq(14.0));
+    ASSERT_THAT(trafficSigns.at(1).relativeDistance.value(), DoubleEq(14.0));
     ASSERT_THAT(trafficSigns.at(1).type, Eq(CommonTrafficSign::Type::OvertakingBanBegin));
     ASSERT_THAT(trafficSigns.at(1).supplementarySigns, IsEmpty());
-    ASSERT_THAT(trafficSigns.at(2).relativeDistance, DoubleEq(24.0));
+    ASSERT_THAT(trafficSigns.at(2).relativeDistance.value(), DoubleEq(24.0));
     ASSERT_THAT(trafficSigns.at(2).type, Eq(CommonTrafficSign::Type::SpeedLimitZoneBegin));
     ASSERT_THAT(trafficSigns.at(2).value, DoubleNear(30 / 3.6, 1e-3));
     ASSERT_THAT(trafficSigns.at(2).unit, Eq(CommonTrafficSign::Unit::MeterPerSecond));
     ASSERT_THAT(trafficSigns.at(2).supplementarySigns, IsEmpty());
-    ASSERT_THAT(trafficSigns.at(3).relativeDistance, DoubleEq(25.0));
+    ASSERT_THAT(trafficSigns.at(3).relativeDistance.value(), DoubleEq(25.0));
     ASSERT_THAT(trafficSigns.at(3).type, Eq(CommonTrafficSign::Type::AnnounceLeftLaneEnd));
     ASSERT_THAT(trafficSigns.at(3).value, Eq(2));
     ASSERT_THAT(trafficSigns.at(3).unit, Eq(CommonTrafficSign::Unit::None));
     ASSERT_THAT(trafficSigns.at(3).supplementarySigns, IsEmpty());
-    ASSERT_THAT(trafficSigns.at(4).relativeDistance, DoubleEq(29.0));
+    ASSERT_THAT(trafficSigns.at(4).relativeDistance.value(), DoubleEq(29.0));
     ASSERT_THAT(trafficSigns.at(4).type, Eq(CommonTrafficSign::Type::Stop));
     ASSERT_THAT(trafficSigns.at(4).supplementarySigns, SizeIs(1));
     ASSERT_THAT(trafficSigns.at(4).supplementarySigns.front().type, Eq(CommonTrafficSign::Type::DistanceIndication));
     ASSERT_THAT(trafficSigns.at(4).supplementarySigns.front().value, DoubleEq(200.0));
     ASSERT_THAT(trafficSigns.at(4).supplementarySigns.front().unit, Eq(CommonTrafficSign::Unit::Meter));
 
-    auto roadMarkings = world.GetRoadMarkingsInRange(roadGraph, root, -2, 11, 90).at(root);
+    auto roadMarkings = world.GetRoadMarkingsInRange(roadGraph, root, -2, 11_m, 90_m).at(root);
     ASSERT_THAT(roadMarkings, SizeIs(1));
-    ASSERT_THAT(roadMarkings.at(0).relativeDistance, DoubleEq(30.0));
+    ASSERT_THAT(roadMarkings.at(0).relativeDistance.value(), DoubleEq(30.0));
     ASSERT_THAT(roadMarkings.at(0).type, Eq(CommonTrafficSign::Type::Stop));
 
-    auto trafficLights = world.GetTrafficLightsInRange(roadGraph, root, -2, 11, 90).at(root);
+    auto trafficLights = world.GetTrafficLightsInRange(roadGraph, root, -2, 11_m, 90_m).at(root);
     ASSERT_THAT(trafficLights.size(), Eq(1));
-    ASSERT_THAT(trafficLights.at(0).relativeDistance, DoubleEq(49.0));
+    ASSERT_THAT(trafficLights.at(0).relativeDistance.value(), DoubleEq(49.0));
     ASSERT_THAT(trafficLights.at(0).type, Eq(CommonTrafficLight::Type::ThreeLightsLeft));
     ASSERT_THAT(trafficLights.at(0).state, Eq(CommonTrafficLight::State::RedYellow));
 
-    trafficLights = world.GetTrafficLightsInRange(roadGraph, root, -3, 31, 90).at(root);
+    trafficLights = world.GetTrafficLightsInRange(roadGraph, root, -3, 31_m, 90_m).at(root);
     ASSERT_THAT(trafficLights.size(), Eq(2));
-    ASSERT_THAT(trafficLights.at(0).relativeDistance, DoubleEq(29.0));
+    ASSERT_THAT(trafficLights.at(0).relativeDistance.value(), DoubleEq(29.0));
     ASSERT_THAT(trafficLights.at(0).type, Eq(CommonTrafficLight::Type::ThreeLightsLeft));
     ASSERT_THAT(trafficLights.at(0).state, Eq(CommonTrafficLight::State::RedYellow));
-    ASSERT_THAT(trafficLights.at(1).relativeDistance, DoubleEq(34.0));
+    ASSERT_THAT(trafficLights.at(1).relativeDistance.value(), DoubleEq(34.0));
     ASSERT_THAT(trafficLights.at(1).type, Eq(CommonTrafficLight::Type::ThreeLights));
     ASSERT_THAT(trafficLights.at(1).state, Eq(CommonTrafficLight::State::Green));
-}
+}*/
 
 TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSignGeometriess)
 {
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("IntegrationTestScenery.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
-    OWL::Interfaces::WorldData* worldData = static_cast<OWL::Interfaces::WorldData*>(world.GetWorldData());
+    OWL::Interfaces::WorldData *worldData = static_cast<OWL::Interfaces::WorldData *>(world.GetWorldData());
     const auto& groundTruth = worldData->GetOsiGroundTruth();
 
     ASSERT_THAT(groundTruth.traffic_sign_size(), Eq(5));
-    auto& trafficSign0 = groundTruth.traffic_sign(0);
+    auto &trafficSign0 = groundTruth.traffic_sign(0);
     ASSERT_THAT(trafficSign0.main_sign().base().position().x(), DoubleEq(15));
     ASSERT_THAT(trafficSign0.main_sign().base().position().y(), DoubleEq(-0.5));
     ASSERT_THAT(trafficSign0.main_sign().base().position().z(), DoubleEq(1.7));
@@ -1362,7 +1328,7 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSignGe
     ASSERT_THAT(trafficSign0.main_sign().base().dimension().height(), DoubleEq(0.4));
     ASSERT_THAT(trafficSign0.main_sign().base().orientation().yaw(), DoubleEq(0.0));
 
-    auto& trafficSign1 = groundTruth.traffic_sign(1);
+    auto &trafficSign1 = groundTruth.traffic_sign(1);
     ASSERT_THAT(trafficSign1.main_sign().base().position().x(), DoubleEq(25));
     ASSERT_THAT(trafficSign1.main_sign().base().position().y(), DoubleEq(-0.5));
     ASSERT_THAT(trafficSign1.main_sign().base().position().z(), DoubleEq(1.7));
@@ -1370,7 +1336,7 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSignGe
     ASSERT_THAT(trafficSign1.main_sign().base().dimension().height(), DoubleEq(0.4));
     ASSERT_THAT(trafficSign1.main_sign().base().orientation().yaw(), DoubleNear(0.1, 1e-3));
 
-    auto& trafficSign2 = groundTruth.traffic_sign(2);
+    auto &trafficSign2 = groundTruth.traffic_sign(2);
     ASSERT_THAT(trafficSign2.main_sign().base().position().x(), DoubleEq(35));
     ASSERT_THAT(trafficSign2.main_sign().base().position().y(), DoubleEq(-0.5));
     ASSERT_THAT(trafficSign2.main_sign().base().position().z(), DoubleEq(1.7));
@@ -1378,7 +1344,7 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSignGe
     ASSERT_THAT(trafficSign2.main_sign().base().dimension().height(), DoubleEq(0.4));
     ASSERT_THAT(trafficSign2.main_sign().base().orientation().yaw(), DoubleEq(-M_PI + 0.1));
 
-    auto& trafficSign3 = groundTruth.traffic_sign(3);
+    auto &trafficSign3 = groundTruth.traffic_sign(3);
     ASSERT_THAT(trafficSign3.main_sign().base().position().x(), DoubleEq(36));
     ASSERT_THAT(trafficSign3.main_sign().base().position().y(), DoubleEq(-0.5));
     ASSERT_THAT(trafficSign3.main_sign().base().position().z(), DoubleEq(2.0));
@@ -1386,7 +1352,7 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSignGe
     ASSERT_THAT(trafficSign3.main_sign().base().dimension().height(), DoubleEq(1.0));
     ASSERT_THAT(trafficSign3.main_sign().base().orientation().yaw(), DoubleEq(0.0));
 
-    auto& trafficSign4 = groundTruth.traffic_sign(4);
+    auto &trafficSign4 = groundTruth.traffic_sign(4);
     ASSERT_THAT(trafficSign4.main_sign().base().position().x(), DoubleEq(40));
     ASSERT_THAT(trafficSign4.main_sign().base().position().y(), DoubleEq(-0.5));
     ASSERT_THAT(trafficSign4.main_sign().base().position().z(), DoubleEq(1.7));
@@ -1402,7 +1368,7 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSignGe
 
     ASSERT_THAT(groundTruth.road_marking_size(), Eq(2));
 
-    auto& roadMarking1 = groundTruth.road_marking(0);
+    auto &roadMarking1 = groundTruth.road_marking(0);
     ASSERT_THAT(roadMarking1.base().position().x(), DoubleEq(10));
     ASSERT_THAT(roadMarking1.base().position().y(), DoubleEq(7.5));
     ASSERT_THAT(roadMarking1.base().position().z(), DoubleEq(0.0));
@@ -1411,7 +1377,7 @@ TEST(SceneryImporter_IntegrationTests, SingleRoad_ImportWithCorrectTrafficSignGe
     ASSERT_THAT(roadMarking1.base().orientation().yaw(), DoubleEq(0.0));
     ASSERT_THAT(roadMarking1.classification().traffic_main_sign_type(), Eq(osi3::TrafficSign_MainSign_Classification_Type::TrafficSign_MainSign_Classification_Type_TYPE_ZEBRA_CROSSING));
 
-    auto& roadMarking2 = groundTruth.road_marking(1);
+    auto &roadMarking2 = groundTruth.road_marking(1);
     ASSERT_THAT(roadMarking2.base().position().x(), DoubleEq(41));
     ASSERT_THAT(roadMarking2.base().position().y(), DoubleEq(0.5));
     ASSERT_THAT(roadMarking2.base().position().z(), DoubleEq(0.0));
@@ -1426,7 +1392,7 @@ TEST(SceneryImporter_IntegrationTests, TJunction_ImportWithCorrectConnectionsAnd
     TESTSCENERY_FACTORY tsf;
     ASSERT_THAT(tsf.instantiate("TJunction.xodr"), IsTrue());
 
-    auto& world = tsf.world;
+    auto &world = tsf.world;
 
     auto connections = world.GetConnectionsOnJunction("J0", "R1");
     ASSERT_THAT(connections, SizeIs(2));
@@ -1457,8 +1423,7 @@ TEST(SceneryImporter_IntegrationTests, TJunction_ImportWithCorrectConnectionsAnd
 
     auto priorities = world.GetPrioritiesOnJunction("J0");
     std::sort(priorities.begin(), priorities.end(),
-              [](const JunctionConnectorPriority& first, const JunctionConnectorPriority& second)
-    {return first.high < second.high || (first.high == second.high && first.low < second.low);});
+              [](const JunctionConnectorPriority &first, const JunctionConnectorPriority &second) { return first.high < second.high || (first.high == second.high && first.low < second.low); });
     ASSERT_THAT(priorities.at(0).high, Eq("R1-2"));
     ASSERT_THAT(priorities.at(0).low, Eq("R3-2"));
     ASSERT_THAT(priorities.at(1).high, Eq("R1-3"));
@@ -1479,8 +1444,8 @@ TEST(GetObstruction_IntegrationTests, AgentsOnStraightRoad)
     ASSERT_THAT(tsf.instantiate("SceneryLeftLaneEnds.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 10.0, 2.0);
-    auto& agent1 = ADD_AGENT(world, 100.0, 2.5, 2.0);
+    auto& agent0 = ADD_AGENT(world, 10.0_m, 2.0_m);
+    auto& agent1 = ADD_AGENT(world, 100.0_m, 2.5_m, 2.0_m);
     world.SyncGlobalData(0);
 
     auto& egoAgent = agent0.GetEgoAgent();
@@ -1488,8 +1453,8 @@ TEST(GetObstruction_IntegrationTests, AgentsOnStraightRoad)
     auto root = add_vertex(RouteElement{"1", true}, roadGraph);
     egoAgent.SetRoadGraph(std::move(roadGraph), root, root);
     const auto obstruction = egoAgent.GetObstruction(&agent1, {ObjectPointRelative::Leftmost, ObjectPointRelative::Rightmost});
-    EXPECT_THAT(obstruction.lateralDistances.at(ObjectPointRelative::Leftmost), DoubleEq(1.5));
-    EXPECT_THAT(obstruction.lateralDistances.at(ObjectPointRelative::Rightmost), DoubleEq(-0.5));
+    EXPECT_THAT(obstruction.lateralDistances.at(ObjectPointRelative::Leftmost).value(), DoubleEq(1.5));
+    EXPECT_THAT(obstruction.lateralDistances.at(ObjectPointRelative::Rightmost).value(), DoubleEq(-0.5));
 }
 
 TEST(GetObstruction_IntegrationTests, AgentBehindJunction)
@@ -1498,8 +1463,8 @@ TEST(GetObstruction_IntegrationTests, AgentBehindJunction)
     ASSERT_THAT(tsf.instantiate("TJunction.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 10.0, -3.0);
-    auto& agent1 = ADD_AGENT(world, 203.5, -10.0, 1.0, 3.0);
+    auto& agent0 = ADD_AGENT(world, 10.0_m, -3.0_m);
+    auto& agent1 = ADD_AGENT(world, 203.5_m, -10.0_m, 1.0_m, 3.0_m);
     world.SyncGlobalData(0);
 
     auto& egoAgent = agent0.GetEgoAgent();
@@ -1511,8 +1476,8 @@ TEST(GetObstruction_IntegrationTests, AgentBehindJunction)
     add_edge(node2, node3, roadGraph);
     egoAgent.SetRoadGraph(std::move(roadGraph), node1, node3);
     const auto obstruction = egoAgent.GetObstruction(&agent1, {ObjectPointRelative::Leftmost, ObjectPointRelative::Rightmost});
-    EXPECT_THAT(obstruction.lateralDistances.at(ObjectPointRelative::Leftmost), DoubleNear(2.0, 1e-3));
-    EXPECT_THAT(obstruction.lateralDistances.at(ObjectPointRelative::Rightmost), DoubleNear(-1.0, 1e-3));
+    EXPECT_THAT(obstruction.lateralDistances.at(ObjectPointRelative::Leftmost).value(), DoubleNear(2.0, 1e-3));
+    EXPECT_THAT(obstruction.lateralDistances.at(ObjectPointRelative::Rightmost).value(), DoubleNear(-1.0, 1e-3));
 }
 
 TEST(EgoAgent_IntegrationTests, GetWorldPosition_MultipleRoads)
@@ -1521,7 +1486,7 @@ TEST(EgoAgent_IntegrationTests, GetWorldPosition_MultipleRoads)
     ASSERT_THAT(tsf.instantiate("MultipleRoadsIntegrationScenery.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 10.0, 2.0);
+    auto& agent0 = ADD_AGENT(world, 10.0_m, 2.0_m);
     world.SyncGlobalData(0);
 
     auto& egoAgent = agent0.GetEgoAgent();
@@ -1533,20 +1498,20 @@ TEST(EgoAgent_IntegrationTests, GetWorldPosition_MultipleRoads)
     add_edge(node2, node3, roadGraph);
     egoAgent.SetRoadGraph(std::move(roadGraph), node1, node3);
 
-    const auto worldPosition1 = egoAgent.GetWorldPosition(500, -1, 0).value();
-    EXPECT_THAT(worldPosition1.xPos, DoubleNear(510, 1e-3));
-    EXPECT_THAT(worldPosition1.yPos, DoubleNear(1, 1e-3));
-    EXPECT_THAT(worldPosition1.yawAngle, DoubleNear(0, 1e-3));
+    const auto worldPosition1 = egoAgent.GetWorldPosition(500_m, -1_m, 0_rad).value();
+    EXPECT_THAT(worldPosition1.xPos.value(), DoubleNear(510, 1e-3));
+    EXPECT_THAT(worldPosition1.yPos.value(), DoubleNear(1, 1e-3));
+    EXPECT_THAT(worldPosition1.yawAngle.value(), DoubleNear(0, 1e-3));
 
-    const auto worldPosition2 = egoAgent.GetWorldPosition(1500, 2, 0).value();
-    EXPECT_THAT(worldPosition2.xPos, DoubleNear(1510, 1e-3));
-    EXPECT_THAT(worldPosition2.yPos, DoubleNear(4, 1e-3));
-    EXPECT_THAT(worldPosition2.yawAngle, DoubleNear(0, 1e-3));
+    const auto worldPosition2 = egoAgent.GetWorldPosition(1500_m, 2_m, 0_rad).value();
+    EXPECT_THAT(worldPosition2.xPos.value(), DoubleNear(1510, 1e-3));
+    EXPECT_THAT(worldPosition2.yPos.value(), DoubleNear(4, 1e-3));
+    EXPECT_THAT(worldPosition2.yawAngle.value(), DoubleNear(0, 1e-3));
 
-    const auto worldPosition3 = egoAgent.GetWorldPosition(3500, 2, 0).value();
-    EXPECT_THAT(worldPosition3.xPos, DoubleNear(3510, 1e-3));
-    EXPECT_THAT(worldPosition3.yPos, DoubleNear(4, 1e-3));
-    EXPECT_THAT(worldPosition3.yawAngle, DoubleNear(0, 1e-3));
+    const auto worldPosition3 = egoAgent.GetWorldPosition(3500_m, 2_m, 0_rad).value();
+    EXPECT_THAT(worldPosition3.xPos.value(), DoubleNear(3510, 1e-3));
+    EXPECT_THAT(worldPosition3.yPos.value(), DoubleNear(4, 1e-3));
+    EXPECT_THAT(worldPosition3.yawAngle.value(), DoubleNear(0, 1e-3));
 }
 
 TEST(EgoAgent_IntegrationTests, GetWorldPosition_Junction)
@@ -1555,7 +1520,7 @@ TEST(EgoAgent_IntegrationTests, GetWorldPosition_Junction)
     ASSERT_THAT(tsf.instantiate("TJunction.xodr"), IsTrue());
 
     auto& world = tsf.world;
-    auto& agent0 = ADD_AGENT(world, 10.0, -1.0);
+    auto& agent0 = ADD_AGENT(world, 10.0_m, -1.0_m);
     world.SyncGlobalData(0);
 
     auto& egoAgent = agent0.GetEgoAgent();
@@ -1567,13 +1532,13 @@ TEST(EgoAgent_IntegrationTests, GetWorldPosition_Junction)
     add_edge(node2, node3, roadGraph);
     egoAgent.SetRoadGraph(std::move(roadGraph), node1, node3);
 
-    const auto worldPosition1 = egoAgent.GetWorldPosition(100, -1, 0).value();
-    EXPECT_THAT(worldPosition1.xPos, DoubleNear(110, 1e-3));
-    EXPECT_THAT(worldPosition1.yPos, DoubleNear(-2, 1e-3));
-    EXPECT_THAT(worldPosition1.yawAngle, DoubleNear(0, 1e-3));
+    const auto worldPosition1 = egoAgent.GetWorldPosition(100_m, -1_m, 0_rad).value();
+    EXPECT_THAT(worldPosition1.xPos.value(), DoubleNear(110, 1e-3));
+    EXPECT_THAT(worldPosition1.yPos.value(), DoubleNear(-2, 1e-3));
+    EXPECT_THAT(worldPosition1.yawAngle.value(), DoubleNear(0, 1e-3));
 
-    const auto worldPosition2 = egoAgent.GetWorldPosition(209.424778, -1, 0).value();
-    EXPECT_THAT(worldPosition2.xPos, DoubleNear(204, 1e-3));
-    EXPECT_THAT(worldPosition2.yPos, DoubleNear(-16, 1e-3));
-    EXPECT_THAT(worldPosition2.yawAngle, DoubleNear(-M_PI_2, 1e-3));
+    const auto worldPosition2 = egoAgent.GetWorldPosition(209.424778_m, -1_m, 0_rad).value();
+    EXPECT_THAT(worldPosition2.xPos.value(), DoubleNear(204, 1e-3));
+    EXPECT_THAT(worldPosition2.yPos.value(), DoubleNear(-16, 1e-3));
+    EXPECT_THAT(worldPosition2.yawAngle.value(), DoubleNear(-M_PI_2, 1e-3));
 }
diff --git a/sim/tests/integrationTests/opSimulation_IntegrationTests/VehicleModelsImporter_IntegrationTests.cpp b/sim/tests/integrationTests/opSimulation_IntegrationTests/VehicleModelsImporter_IntegrationTests.cpp
index 0653cfc1985ba79f997f8f38940c427073b2289e..b1f5acc9c40fbd8a36616e8b35ba0f42c2f438ce 100644
--- a/sim/tests/integrationTests/opSimulation_IntegrationTests/VehicleModelsImporter_IntegrationTests.cpp
+++ b/sim/tests/integrationTests/opSimulation_IntegrationTests/VehicleModelsImporter_IntegrationTests.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2017-2019 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -31,25 +32,26 @@ TEST(VehicleModelImporter, GivenVehicleAndPedestrianCatalogs_ImportsAllModels)
                     vehicleModels));
 
     auto vehicleModel1 = vehicleModels.GetVehicleModel("car_one");
-    EXPECT_THAT(vehicleModel1.vehicleType, Eq(AgentVehicleType::Car));
+    EXPECT_THAT(vehicleModel1.vehicleType, Eq(mantle_api::VehicleClass::kMedium_car));
+    EXPECT_THAT(vehicleModel1.mass, DoubleEq(1000.0));
     EXPECT_THAT(vehicleModel1.boundingBoxCenter.x, DoubleEq(1.0));
     EXPECT_THAT(vehicleModel1.boundingBoxCenter.y, DoubleEq(0));
     EXPECT_THAT(vehicleModel1.boundingBoxCenter.z, DoubleEq(1.1));
-    EXPECT_THAT(vehicleModel1.boundingBoxDimensions.width, DoubleEq(1.0));
-    EXPECT_THAT(vehicleModel1.boundingBoxDimensions.length, DoubleEq(4.0));
-    EXPECT_THAT(vehicleModel1.boundingBoxDimensions.height, DoubleEq(2.2));
+    EXPECT_THAT(vehicleModel1.bounding_box.dimension.width, DoubleEq(1.0));
+    EXPECT_THAT(vehicleModel1.bounding_box.dimension.length, DoubleEq(4.0));
+    EXPECT_THAT(vehicleModel1.bounding_box.dimension.height, DoubleEq(2.2));
     EXPECT_THAT(vehicleModel1.performance.maxSpeed, DoubleEq(10.0));
     EXPECT_THAT(vehicleModel1.performance.maxAcceleration, DoubleEq(10.0));
     EXPECT_THAT(vehicleModel1.performance.maxDeceleration, DoubleEq(9.8));
     EXPECT_THAT(vehicleModel1.frontAxle.maxSteering, DoubleEq(0.707));
     EXPECT_THAT(vehicleModel1.frontAxle.wheelDiameter, DoubleEq(0.5));
     EXPECT_THAT(vehicleModel1.frontAxle.trackWidth, DoubleEq(1.0));
-    EXPECT_THAT(vehicleModel1.frontAxle.positionX, DoubleEq(2.0));
+    EXPECT_THAT(vehicleModel1.front_axle.bb_center_to_axle_center.x, DoubleEq(2.0));
     EXPECT_THAT(vehicleModel1.frontAxle.positionZ, DoubleEq(0.25));
     EXPECT_THAT(vehicleModel1.rearAxle.maxSteering, DoubleEq(0.0));
     EXPECT_THAT(vehicleModel1.rearAxle.wheelDiameter, DoubleEq(0.5));
     EXPECT_THAT(vehicleModel1.rearAxle.trackWidth, DoubleEq(1.0));
-    EXPECT_THAT(vehicleModel1.rearAxle.positionX, DoubleEq(0.0));
+    EXPECT_THAT(vehicleModel1.rear_axle.bb_center_to_axle_center.x, DoubleEq(0.0));
     EXPECT_THAT(vehicleModel1.rearAxle.positionZ, DoubleEq(0.25));
     EXPECT_THAT(vehicleModel1.properties, ElementsAre(
                     std::make_pair("AirDragCoefficient", 1.1),
@@ -58,7 +60,6 @@ TEST(VehicleModelImporter, GivenVehicleAndPedestrianCatalogs_ImportsAllModels)
                     std::make_pair("FrictionCoefficient", 4.4),
                     std::make_pair("FrontSurface", 5.5),
                     std::make_pair("GearRatio1", 6.6),
-                    std::make_pair("Mass", 1000.0),
                     std::make_pair("MaximumEngineSpeed", 6000.),
                     std::make_pair("MaximumEngineTorque", 250.),
                     std::make_pair("MinimumEngineSpeed", 900.),
@@ -70,25 +71,26 @@ TEST(VehicleModelImporter, GivenVehicleAndPedestrianCatalogs_ImportsAllModels)
                     std::make_pair("SteeringRatio", 7.7)));
 
     auto vehicleModel2 = vehicleModels.GetVehicleModel("car_two");
-    EXPECT_THAT(vehicleModel2.vehicleType, Eq(AgentVehicleType::Car));
+    EXPECT_THAT(vehicleModel2.vehicleType, Eq(mantle_api::VehicleClass::kMedium_car));
+    EXPECT_THAT(vehicleModel1.mass, DoubleEq(999.9));
     EXPECT_THAT(vehicleModel2.boundingBoxCenter.x, DoubleEq(2.0));
     EXPECT_THAT(vehicleModel2.boundingBoxCenter.y, DoubleEq(0));
     EXPECT_THAT(vehicleModel2.boundingBoxCenter.z, DoubleEq(2.2));
-    EXPECT_THAT(vehicleModel2.boundingBoxDimensions.width, DoubleEq(1.5));
-    EXPECT_THAT(vehicleModel2.boundingBoxDimensions.length, DoubleEq(3.0));
-    EXPECT_THAT(vehicleModel2.boundingBoxDimensions.height, DoubleEq(4.4));
+    EXPECT_THAT(vehicleModel2.bounding_box.dimension.width, DoubleEq(1.5));
+    EXPECT_THAT(vehicleModel2.bounding_box.dimension.length, DoubleEq(3.0));
+    EXPECT_THAT(vehicleModel2.bounding_box.dimension.height, DoubleEq(4.4));
     EXPECT_THAT(vehicleModel2.performance.maxSpeed, DoubleEq(11.0));
     EXPECT_THAT(vehicleModel2.performance.maxAcceleration, DoubleEq(10.0));
     EXPECT_THAT(vehicleModel2.performance.maxDeceleration, DoubleEq(4.5));
     EXPECT_THAT(vehicleModel2.frontAxle.maxSteering, DoubleEq(0.5));
     EXPECT_THAT(vehicleModel2.frontAxle.wheelDiameter, DoubleEq(0.4));
     EXPECT_THAT(vehicleModel2.frontAxle.trackWidth, DoubleEq(1.1));
-    EXPECT_THAT(vehicleModel2.frontAxle.positionX, DoubleEq(2.5));
+    EXPECT_THAT(vehicleModel2.front_axle.bb_center_to_axle_center.x, DoubleEq(2.5));
     EXPECT_THAT(vehicleModel2.frontAxle.positionZ, DoubleEq(0.2));
     EXPECT_THAT(vehicleModel2.rearAxle.maxSteering, DoubleEq(0.0));
     EXPECT_THAT(vehicleModel2.rearAxle.wheelDiameter, DoubleEq(0.4));
     EXPECT_THAT(vehicleModel2.rearAxle.trackWidth, DoubleEq(1.1));
-    EXPECT_THAT(vehicleModel2.rearAxle.positionX, DoubleEq(0.0));
+    EXPECT_THAT(vehicleModel2.rear_axle.bb_center_to_axle_center.x, DoubleEq(0.0));
     EXPECT_THAT(vehicleModel2.rearAxle.positionZ, DoubleEq(0.2));
     EXPECT_THAT(vehicleModel2.properties, ElementsAre(
                     std::make_pair("AirDragCoefficient", 2.2),
@@ -98,7 +100,6 @@ TEST(VehicleModelImporter, GivenVehicleAndPedestrianCatalogs_ImportsAllModels)
                     std::make_pair("FrontSurface", 6.6),
                     std::make_pair("GearRatio1", 7.7),
                     std::make_pair("GearRatio2", 8.8),
-                    std::make_pair("Mass", 999.9),
                     std::make_pair("MaximumEngineSpeed", 6000.),
                     std::make_pair("MaximumEngineTorque", 250.),
                     std::make_pair("MinimumEngineSpeed", 900.),
@@ -110,15 +111,19 @@ TEST(VehicleModelImporter, GivenVehicleAndPedestrianCatalogs_ImportsAllModels)
                     std::make_pair("SteeringRatio", 9.9)));
 
     auto pedestrianModel1 = vehicleModels.GetVehicleModel("pedestrian_one");
-    EXPECT_THAT(pedestrianModel1.vehicleType, Eq(AgentVehicleType::Pedestrian));
-    EXPECT_THAT(pedestrianModel1.boundingBoxDimensions.length, DoubleEq(5.5));
-    EXPECT_THAT(pedestrianModel1.boundingBoxDimensions.width, DoubleEq(4.4));
-    EXPECT_THAT(pedestrianModel1.boundingBoxDimensions.height, DoubleEq(6.6));
+    // workaround for ground truth not being able to handle pedestrians
+    //EXPECT_THAT(pedestrianModel1.vehicleType, Eq(AgentVehicleType::Pedestrian));
+    EXPECT_THAT(pedestrianModel1.vehicleType, Eq(mantle_api::VehicleClass::kMedium_car));
+    EXPECT_THAT(pedestrianModel1.bounding_box.dimension.length, DoubleEq(5.5));
+    EXPECT_THAT(pedestrianModel1.bounding_box.dimension.width, DoubleEq(4.4));
+    EXPECT_THAT(pedestrianModel1.bounding_box.dimension.height, DoubleEq(6.6));
 
     auto pedestrianModel2 = vehicleModels.GetVehicleModel("pedestrian_two");
-    EXPECT_THAT(pedestrianModel2.vehicleType, Eq(AgentVehicleType::Pedestrian));
-    EXPECT_THAT(pedestrianModel2.boundingBoxDimensions.length, DoubleEq(2.2));
-    EXPECT_THAT(pedestrianModel2.boundingBoxDimensions.width, DoubleEq(3.3));
-    EXPECT_THAT(pedestrianModel2.boundingBoxDimensions.height, DoubleEq(1.1));
+    // workaround for ground truth not being able to handle pedestrians
+    //EXPECT_THAT(pedestrianModel2.vehicleType, Eq(AgentVehicleType::Pedestrian));
+    EXPECT_THAT(pedestrianModel2.vehicleType, Eq(mantle_api::VehicleClass::kMedium_car));
+    EXPECT_THAT(pedestrianModel2.bounding_box.dimension.length, DoubleEq(2.2));
+    EXPECT_THAT(pedestrianModel2.bounding_box.dimension.width, DoubleEq(3.3));
+    EXPECT_THAT(pedestrianModel2.bounding_box.dimension.height, DoubleEq(1.1));
 }
 
diff --git a/sim/tests/unitTests/CMakeLists.txt b/sim/tests/unitTests/CMakeLists.txt
index 90b13aa811842d55157c88d714bc00b7ff0c9593..5f26d8e5aae8daf4d5bc6eb1811d027041dde210 100644
--- a/sim/tests/unitTests/CMakeLists.txt
+++ b/sim/tests/unitTests/CMakeLists.txt
@@ -23,7 +23,6 @@ add_subdirectory(components/Dynamics_Collision)
 add_subdirectory(components/Dynamics_TF)
 add_subdirectory(components/Dynamics_TwoTrack)
 add_subdirectory(components/LimiterAccVehComp)
-add_subdirectory(components/OpenScenarioActions)
 add_subdirectory(components/SensorAggregation_OSI)
 add_subdirectory(components/SensorFusionErrorless_OSI)
 add_subdirectory(components/Sensor_Driver)
@@ -32,11 +31,9 @@ add_subdirectory(components/SignalPrioritizer)
 
 add_subdirectory(core/opSimulation)
 add_subdirectory(core/opSimulation/modules/BasicDataBuffer)
-add_subdirectory(core/opSimulation/modules/EventDetector)
 add_subdirectory(core/opSimulation/modules/Observation_Log)
 add_subdirectory(core/opSimulation/modules/SpawnerPreRunCommon)
 add_subdirectory(core/opSimulation/modules/SpawnerRuntimeCommon)
-add_subdirectory(core/opSimulation/modules/SpawnerScenario)
 add_subdirectory(core/opSimulation/modules/SpawnerWorldAnalyzer)
 add_subdirectory(core/opSimulation/modules/World_OSI)
 add_subdirectory(core/opSimulation/Scheduler)
diff --git a/sim/tests/unitTests/common/commonHelper_Tests.cpp b/sim/tests/unitTests/common/commonHelper_Tests.cpp
index 791c47600f9f41cc96b710299940f66a59a70475..6c04f6751176b9f2baa5f28c53ef562ae126f8ce 100644
--- a/sim/tests/unitTests/common/commonHelper_Tests.cpp
+++ b/sim/tests/unitTests/common/commonHelper_Tests.cpp
@@ -74,22 +74,16 @@ TEST_P(GetRoadWithLowestHeading_Test, GetRoadWithLowestHeading)
 }
 
 INSTANTIATE_TEST_SUITE_P(GetRoadWithLowestHeadingTestCase, GetRoadWithLowestHeading_Test, ::testing::Values(
-//                                  roadPositions                                                        expectedResult
- GetRoadWithLowestHeading_Data{{{"RoadA",{"RoadA",-1,0,0,0.1}}},                                        {"RoadA", true}},
- GetRoadWithLowestHeading_Data{{{"RoadA",{"RoadA",-1,0,0,0.1+M_PI}}},                                   {"RoadA", false}},
- GetRoadWithLowestHeading_Data{{{"RoadA",{"RoadA",-1,0,0,-0.1}},{"RoadB",{"RoadB",-1,0,0,0.2}}},        {"RoadA", true}},
- GetRoadWithLowestHeading_Data{{{"RoadA",{"RoadA",-1,0,0,-0.2}},{"RoadB",{"RoadB",-1,0,0,0.1}}},        {"RoadB", true}},
- GetRoadWithLowestHeading_Data{{{"RoadA",{"RoadA",-1,0,0,-0.1+M_PI}},{"RoadB",{"RoadB",-1,0,0,0.2}}},   {"RoadA", false}},
- GetRoadWithLowestHeading_Data{{{"RoadA",{"RoadA",-1,0,0,-0.2}},{"RoadB",{"RoadB",-1,0,0,M_PI+0.1}}},   {"RoadB", false}}
-));
+                                                                                              //                                  roadPositions                                                        expectedResult
+                                                                                              GetRoadWithLowestHeading_Data{{{"RoadA", {"RoadA", -1, 0_m, 0_m, 0.1_rad}}}, {"RoadA", true}}, GetRoadWithLowestHeading_Data{{{"RoadA", {"RoadA", -1, 0_m, 0_m, 0.1_rad + units::angle::radian_t(M_PI)}}}, {"RoadA", false}}, GetRoadWithLowestHeading_Data{{{"RoadA", {"RoadA", -1, 0_m, 0_m, -0.1_rad}}, {"RoadB", {"RoadB", -1, 0_m, 0_m, 0.2_rad}}}, {"RoadA", true}}, GetRoadWithLowestHeading_Data{{{"RoadA", {"RoadA", -1, 0_m, 0_m, -0.2_rad}}, {"RoadB", {"RoadB", -1, 0_m, 0_m, 0.1_rad}}}, {"RoadB", true}}, GetRoadWithLowestHeading_Data{{{"RoadA", {"RoadA", -1, 0_m, 0_m, -0.1_rad + units::angle::radian_t(M_PI)}}, {"RoadB", {"RoadB", -1, 0_m, 0_m, 0.2_rad}}}, {"RoadA", false}}, GetRoadWithLowestHeading_Data{{{"RoadA", {"RoadA", -1, 0_m, 0_m, -0.2_rad}}, {"RoadB", {"RoadB", -1, 0_m, 0_m, units::angle::radian_t(M_PI) + 0.1_rad}}}, {"RoadB", false}}));
 
 class SetAngleToValidRange_Data
 {
 public:
     // do not change order of items
     // unless you also change it in INSTANTIATE_TEST_CASE_P
-    double angle;
-    double normalizedAngle;
+    units::angle::radian_t angle;
+    units::angle::radian_t normalizedAngle;
 
     /// \brief This stream will be shown in case the test fails
     friend std::ostream& operator<<(std::ostream& os, const SetAngleToValidRange_Data& data)
@@ -106,36 +100,34 @@ TEST_P(SetAngleToValidRange, ReturnsAngleWithinPlusMinusPi)
 {
     auto data = GetParam();
 
-    double normalizedAngle = CommonHelper::SetAngleToValidRange(data.angle);
+    auto normalizedAngle = CommonHelper::SetAngleToValidRange(data.angle);
 
-    ASSERT_THAT(normalizedAngle, DoubleNear(data.normalizedAngle, 1e-3));
+    ASSERT_THAT(normalizedAngle.value(), DoubleNear(data.normalizedAngle.value(), 1e-3));
 }
 
 INSTANTIATE_TEST_SUITE_P(AngleList, SetAngleToValidRange,
-  /*                             angle   expectedNormalizedAngle  */
-  testing::Values(
-    SetAngleToValidRange_Data{                  0.0,               0.0 },
-    SetAngleToValidRange_Data{               M_PI_4,            M_PI_4 },
-    SetAngleToValidRange_Data{              -M_PI_4,           -M_PI_4 },
-    SetAngleToValidRange_Data{               M_PI_2,            M_PI_2 },
-    SetAngleToValidRange_Data{              -M_PI_2,           -M_PI_2 },
-    SetAngleToValidRange_Data{         3.0 * M_PI_4,      3.0 * M_PI_4 },
-    SetAngleToValidRange_Data{        -3.0 * M_PI_4,     -3.0 * M_PI_4 },
-    SetAngleToValidRange_Data{  2.0 * M_PI + M_PI_4,            M_PI_4 },
-    SetAngleToValidRange_Data{ -2.0 * M_PI - M_PI_4,           -M_PI_4 },
-    SetAngleToValidRange_Data{  2.0 * M_PI + M_PI_2,            M_PI_2 },
-    SetAngleToValidRange_Data{ -2.0 * M_PI - M_PI_2,           -M_PI_2 },
-    SetAngleToValidRange_Data{  4.0 * M_PI + M_PI_2,            M_PI_2 },
-    SetAngleToValidRange_Data{ -4.0 * M_PI - M_PI_2,           -M_PI_2 }
-  )
-);
+                         /*                             angle   expectedNormalizedAngle  */
+                         testing::Values(
+                             SetAngleToValidRange_Data{units::angle::radian_t(0.0), units::angle::radian_t(0.0)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(M_PI_4), units::angle::radian_t(M_PI_4)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(-M_PI_4), units::angle::radian_t(-M_PI_4)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(M_PI_2), units::angle::radian_t(M_PI_2)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(-M_PI_2), units::angle::radian_t(-M_PI_2)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(3.0 * M_PI_4), units::angle::radian_t(3.0 * M_PI_4)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(-3.0 * M_PI_4), units::angle::radian_t(-3.0 * M_PI_4)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(2.0 * M_PI + M_PI_4), units::angle::radian_t(M_PI_4)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(-2.0 * M_PI - M_PI_4), units::angle::radian_t(-M_PI_4)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(2.0 * M_PI + M_PI_2), units::angle::radian_t(M_PI_2)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(-2.0 * M_PI - M_PI_2), units::angle::radian_t(-M_PI_2)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(4.0 * M_PI + M_PI_2), units::angle::radian_t(M_PI_2)},
+                             SetAngleToValidRange_Data{units::angle::radian_t(-4.0 * M_PI - M_PI_2), units::angle::radian_t(-M_PI_2)}));
 
 struct GetIntersectionPoints_Data
 {
-    std::vector<Common::Vector2d> firstQuadrangle;
-    std::vector<Common::Vector2d> secondQuadrangle;
+    std::vector<Common::Vector2d<units::length::meter_t>> firstQuadrangle;
+    std::vector<Common::Vector2d<units::length::meter_t>> secondQuadrangle;
     bool firstIsRectangular;
-    std::vector<Common::Vector2d> expectedIntersection;
+    std::vector<Common::Vector2d<units::length::meter_t>> expectedIntersection;
 };
 
 class GetIntersectionPoints_Test : public testing::Test,
@@ -152,22 +144,24 @@ TEST_P(GetIntersectionPoints_Test, CorrectIntersectionPoints)
 
 INSTANTIATE_TEST_CASE_P(BothRectangular, GetIntersectionPoints_Test,
                         testing::Values(
-                         //Element corners                  Object corners                             Intersection points
-GetIntersectionPoints_Data{{{1,1},{1,3},{3,3},{3,1}},       {{2,4},{2,6},{4,6},{4,4}},           true, {}},
-GetIntersectionPoints_Data{{{1,1},{1,3},{3,3},{3,1}},       {{2,2},{2,6},{4,6},{4,2}},           true, {{2,2},{2,3},{3,2},{3,3}}},
-GetIntersectionPoints_Data{{{1,1},{1,3},{3,3},{3,1}},       {{0,0},{0,4},{4,4},{4,0}},           true, {{1,1},{1,3},{3,3},{3,1}}},
-GetIntersectionPoints_Data{{{1,1},{1,3},{3,3},{3,1}},       {{2,2},{2,2.5},{2.5,2.5},{2.5,2}},   true, {{2,2},{2,2.5},{2.5,2.5},{2.5,2}}},
-GetIntersectionPoints_Data{{{1,1},{1,3},{3,3},{3,1}},       {{1,4},{3,6},{6,3},{4,1}},           true, {{3,2},{2,3},{3,3}}},
-GetIntersectionPoints_Data{{{-1,0},{0,1},{1,0},{0,-1}},     {{0,0},{1,1},{2,0},{1,-1}},          true, {{0,0},{0.5,0.5},{1,0},{0.5,-0.5}}}));
+                            //Element corners                  Object corners                             Intersection points
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 3_m}, {3_m, 3_m}, {3_m, 1_m}}, {{2_m, 4_m}, {2_m, 6_m}, {4_m, 6_m}, {4_m, 4_m}}, true, {}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 3_m}, {3_m, 3_m}, {3_m, 1_m}}, {{2_m, 2_m}, {2_m, 6_m}, {4_m, 6_m}, {4_m, 2_m}}, true, {{2_m, 2_m}, {2_m, 3_m}, {3_m, 2_m}, {3_m, 3_m}}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 3_m}, {3_m, 3_m}, {3_m, 1_m}}, {{0_m, 0_m}, {0_m, 4_m}, {4_m, 4_m}, {4_m, 0_m}}, true, {{1_m, 1_m}, {1_m, 3_m}, {3_m, 3_m}, {3_m, 1_m}}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 3_m}, {3_m, 3_m}, {3_m, 1_m}}, {{2_m, 2_m}, {2_m, 2.5_m}, {2.5_m, 2.5_m}, {2.5_m, 2_m}}, true, {{2_m, 2_m}, {2_m, 2.5_m}, {2.5_m, 2.5_m}, {2.5_m, 2_m}}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 3_m}, {3_m, 3_m}, {3_m, 1_m}}, {{1_m, 4_m}, {3_m, 6_m}, {6_m, 3_m}, {4_m, 1_m}}, true, {{3_m, 2_m}, {2_m, 3_m}, {3_m, 3_m}}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 3_m}, {3_m, 3_m}, {3_m, 1_m}}, {{1_m, 1_m}, {1_m ,3_m}, {3_m, 3_m}, {3_m, 1_m}}, true, {{1_m, 1_m}, {1_m, 3_m}, {3_m, 3_m}, {3_m, 1_m}}},
+                            GetIntersectionPoints_Data{{{-1_m, 0_m}, {0_m, 1_m}, {1_m, 0_m}, {0_m, -1_m}}, {{0_m, 0_m}, {1_m, 1_m}, {2_m, 0_m}, {1_m, -1_m}}, true, {{0_m, 0_m}, {0.5_m, 0.5_m}, {1_m, 0_m}, {0.5_m, -0.5_m}}}));
 
 INSTANTIATE_TEST_CASE_P(SecondNotRectangular, GetIntersectionPoints_Test,
                         testing::Values(
-                         //Element corners                  Object corners                              Intersection points
-GetIntersectionPoints_Data{{{1,1},{1,2},{3,4},{3,1}},       {{2,5},{2,6},{4,6},{4,5}},           false, {}},
-GetIntersectionPoints_Data{{{1,1},{1,2},{3,4},{3,1}},       {{2,2},{2,6},{4,6},{4,2}},           false, {{2,2},{2,3},{3,2},{3,4}}},
-GetIntersectionPoints_Data{{{1,1},{1,2},{3,4},{3,1}},       {{0,0},{0,5},{4,5},{4,0}},           false, {{1,1},{1,2},{3,4},{3,1}}},
-GetIntersectionPoints_Data{{{1,1},{1,2},{3,4},{3,1}},       {{2,2},{2,2.5},{2.5,2.5},{2.5,2}},   false, {{2,2},{2,2.5},{2.5,2.5},{2.5,2}}},
-GetIntersectionPoints_Data{{{1,1},{1,2},{3,4},{3,1}},       {{-2,0},{-2,2},{0,2},{0,0}},         false, {}}));
+                            //Element corners                  Object corners                              Intersection points
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}, {{2_m, 5_m}, {2_m, 6_m}, {4_m, 6_m}, {4_m, 5_m}}, false, {}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}, {{2_m, 2_m}, {2_m, 6_m}, {4_m, 6_m}, {4_m, 2_m}}, false, {{2_m, 2_m}, {2_m, 3_m}, {3_m, 2_m}, {3_m, 4_m}}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}, {{0_m, 0_m}, {0_m, 5_m}, {4_m, 5_m}, {4_m, 0_m}}, false, {{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}, {{2_m, 2_m}, {2_m, 2.5_m}, {2.5_m, 2.5_m}, {2.5_m, 2_m}}, false, {{2_m, 2_m}, {2_m, 2.5_m}, {2.5_m, 2.5_m}, {2.5_m, 2_m}}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}, {{-2_m, 0_m}, {-2_m, 2_m}, {0_m, 2_m}, {0_m, 0_m}}, false, {}},
+                            GetIntersectionPoints_Data{{{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}, {{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}, false, {{1_m, 1_m}, {1_m, 2_m}, {3_m, 4_m}, {3_m, 1_m}}}));
 
 /// Data table with the basic Informations for situations
 /// \see PointQuery
@@ -176,16 +170,16 @@ struct WithinPolygon_Data
     // do not change order of items
     // unless you also change it in INSTANTIATE_TEST_CASE_P
     // (see bottom of file)
-    double Ax;
-    double Ay;
-    double Bx;
-    double By;
-    double Dx;
-    double Dy;
-    double Cx;
-    double Cy;
-    double Px;
-    double Py;
+    units::length::meter_t Ax;
+    units::length::meter_t Ay;
+    units::length::meter_t Bx;
+    units::length::meter_t By;
+    units::length::meter_t Dx;
+    units::length::meter_t Dy;
+    units::length::meter_t Cx;
+    units::length::meter_t Cy;
+    units::length::meter_t Px;
+    units::length::meter_t Py;
     bool withinPolygon;
 
     /// \brief This stream will be shown in case the test fails
@@ -211,7 +205,7 @@ class WithinPolygon: public ::testing::Test,
 TEST_P(WithinPolygon, ParameterTest)
 {
     auto data = GetParam();
-    Common::Vector2d point = {data.Px, data.Py};
+    Common::Vector2d<units::length::meter_t> point = {data.Px, data.Py};
     ASSERT_THAT(CommonHelper::IntersectionCalculation::IsWithin({data.Ax, data.Ay}, {data.Bx, data.By}, {data.Cx, data.Cy}, {data.Dx, data.Dy}, point),
                 Eq(data.withinPolygon));
 }
@@ -219,68 +213,62 @@ TEST_P(WithinPolygon, ParameterTest)
 INSTANTIATE_TEST_CASE_P(OutsideBoundarySet, WithinPolygon,
                         testing::Values(
                             //    /*                    Ax     Ay     Bx     By     Dx     Dy     Cx     Cy     Px     Py   withinPolygon */
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0, -10.1,   0.0,   false },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,  10.1,   0.0,   false },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,   0.0, -10.1,   false },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,   0.0,  10.1,   false },
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, -10.1_m, 0.0_m, false},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, 10.1_m, 0.0_m, false},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, 0.0_m, -10.1_m, false},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, 0.0_m, 10.1_m, false},
                             // 180° rotated
-                            WithinPolygon_Data{  10.0, -10.0, -10.0, -10.0, -10.0,  10.0,  10.0,  10.0, -10.1,   0.0,   false },
-                            WithinPolygon_Data{  10.0, -10.0, -10.0, -10.0, -10.0,  10.0,  10.0,  10.0,  10.1,   0.0,   false },
-                            WithinPolygon_Data{  10.0, -10.0, -10.0, -10.0, -10.0,  10.0,  10.0,  10.0,   0.0, -10.1,   false },
-                            WithinPolygon_Data{  10.0, -10.0, -10.0, -10.0, -10.0,  10.0,  10.0,  10.0,   0.0,  10.1,   false },
+                            WithinPolygon_Data{10.0_m, -10.0_m, -10.0_m, -10.0_m, -10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.1_m, 0.0_m, false},
+                            WithinPolygon_Data{10.0_m, -10.0_m, -10.0_m, -10.0_m, -10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.1_m, 0.0_m, false},
+                            WithinPolygon_Data{10.0_m, -10.0_m, -10.0_m, -10.0_m, -10.0_m, 10.0_m, 10.0_m, 10.0_m, 0.0_m, -10.1_m, false},
+                            WithinPolygon_Data{10.0_m, -10.0_m, -10.0_m, -10.0_m, -10.0_m, 10.0_m, 10.0_m, 10.0_m, 0.0_m, 10.1_m, false},
                             //  45° rotated
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,  -7.0,  -7.0,   false },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   7.0,  -7.0,   false },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   7.0,   7.0,   false },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,  -7.0,   7.0,   false },
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, -7.0_m, -7.0_m, false},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 7.0_m, -7.0_m, false},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 7.0_m, 7.0_m, false},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, -7.0_m, 7.0_m, false},
                             // other direction
-                            WithinPolygon_Data{  10.0, -10.0,  10.0,  10.0, -10.0,  10.0, -10.0, -10.0, -10.1,   0.0,   false },
-                            WithinPolygon_Data{  10.0, -10.0,  10.0,  10.0, -10.0,  10.0, -10.0, -10.0,  10.1,   0.0,   false },
-                            WithinPolygon_Data{  10.0, -10.0,  10.0,  10.0, -10.0,  10.0, -10.0, -10.0,   0.0, -10.1,   false },
-                            WithinPolygon_Data{  10.0, -10.0,  10.0,  10.0, -10.0,  10.0, -10.0, -10.0,   0.0,  10.1,   false }
-                        )
-                       );
+                            WithinPolygon_Data{10.0_m, -10.0_m, 10.0_m, 10.0_m, -10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.1_m, 0.0_m, false},
+                            WithinPolygon_Data{10.0_m, -10.0_m, 10.0_m, 10.0_m, -10.0_m, 10.0_m, -10.0_m, -10.0_m, 10.1_m, 0.0_m, false},
+                            WithinPolygon_Data{10.0_m, -10.0_m, 10.0_m, 10.0_m, -10.0_m, 10.0_m, -10.0_m, -10.0_m, 0.0_m, -10.1_m, false},
+                            WithinPolygon_Data{10.0_m, -10.0_m, 10.0_m, 10.0_m, -10.0_m, 10.0_m, -10.0_m, -10.0_m, 0.0_m, 10.1_m, false}));
 
 INSTANTIATE_TEST_CASE_P(InsideBoundarySet, WithinPolygon,
                         testing::Values(
                             /*                    Ax     Ay     Bx     By     Dx     Dy     Cx     Cy     Px     Py   withinPolygon */
-                            WithinPolygon_Data{ -12.3,  13.4,  15.6,  17.8,  19.2, -10.1, -12.3, -14.5,   0.0,   0.0,   true },
-                            WithinPolygon_Data{ -12.3,  13.4,  15.6,  17.8,  19.2, -10.1, -12.3, -14.5, -10.0, -10.0,   true },
-                            WithinPolygon_Data{ -12.3,  13.4,  15.6,  17.8,  19.2, -10.1, -12.3, -14.5,  10.0, -10.0,   true },
-                            WithinPolygon_Data{ -12.3,  13.4,  15.6,  17.8,  19.2, -10.1, -12.3, -14.5, -10.0,  10.0,   true },
-                            WithinPolygon_Data{ -12.3,  13.4,  15.6,  17.8,  19.2, -10.1, -12.3, -14.5,  10.0,  10.0,   true },
+                            WithinPolygon_Data{-12.3_m, 13.4_m, 15.6_m, 17.8_m, 19.2_m, -10.1_m, -12.3_m, -14.5_m, 0.0_m, 0.0_m, true},
+                            WithinPolygon_Data{-12.3_m, 13.4_m, 15.6_m, 17.8_m, 19.2_m, -10.1_m, -12.3_m, -14.5_m, -10.0_m, -10.0_m, true},
+                            WithinPolygon_Data{-12.3_m, 13.4_m, 15.6_m, 17.8_m, 19.2_m, -10.1_m, -12.3_m, -14.5_m, 10.0_m, -10.0_m, true},
+                            WithinPolygon_Data{-12.3_m, 13.4_m, 15.6_m, 17.8_m, 19.2_m, -10.1_m, -12.3_m, -14.5_m, -10.0_m, 10.0_m, true},
+                            WithinPolygon_Data{-12.3_m, 13.4_m, 15.6_m, 17.8_m, 19.2_m, -10.1_m, -12.3_m, -14.5_m, 10.0_m, 10.0_m, true},
                             //  45° rotated
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,  -3.0,  -3.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,  -3.0,   3.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   3.0,  -3.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,  -3.0,   3.0,   true },
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, -3.0_m, -3.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, -3.0_m, 3.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 3.0_m, -3.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, -3.0_m, 3.0_m, true},
                             // something in between
-                            WithinPolygon_Data{ -12.3,  13.4,  15.6,  17.8,  19.0, -12.0, -12.1, -12.2,   0.0,   0.0,   true },
-                            WithinPolygon_Data{ -12.3,  13.4,  15.6,  17.8,  19.0, -12.0, -12.1, -12.2, -10.0, -10.0,   true }
-                        )
-                       );
+                            WithinPolygon_Data{-12.3_m, 13.4_m, 15.6_m, 17.8_m, 19.0_m, -12.0_m, -12.1_m, -12.2_m, 0.0_m, 0.0_m, true},
+                            WithinPolygon_Data{-12.3_m, 13.4_m, 15.6_m, 17.8_m, 19.0_m, -12.0_m, -12.1_m, -12.2_m, -10.0_m, -10.0_m, true}));
 
 INSTANTIATE_TEST_CASE_P(OnEdgeSet, WithinPolygon,
                         testing::Values(
                             /*                    Ax     Ay     Bx     By     Dx     Dy     Cx     Cy     Px     Py   withinPolygon */
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,  10.0,   0.0,   true },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,   0.0,  10.0,   true },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,   0.0, -10.0,   true },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0, -10.0,   0.0,   true },
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, 10.0_m, 0.0_m, true},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, 0.0_m, 10.0_m, true},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, 0.0_m, -10.0_m, true},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, -10.0_m, 0.0_m, true},
                             // diagonal in between
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,   2.0,   2.0,   true },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,   2.0,  -2.0,   true },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,  -2.0,  -2.0,   true },
-                            WithinPolygon_Data{ -10.0,  10.0,  10.0,  10.0,  10.0, -10.0, -10.0, -10.0,  -2.0,   2.0,   true },
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, 2.0_m, 2.0_m, true},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, 2.0_m, -2.0_m, true},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, -2.0_m, -2.0_m, true},
+                            WithinPolygon_Data{-10.0_m, 10.0_m, 10.0_m, 10.0_m, 10.0_m, -10.0_m, -10.0_m, -10.0_m, -2.0_m, 2.0_m, true},
                             //  45° rotated deges
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   5.0,   5.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,  -5.0,   5.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   5.0,   5.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   5.0,  -5.0,   true },
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 5.0_m, 5.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, -5.0_m, 5.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 5.0_m, 5.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 5.0_m, -5.0_m, true},
                             //  45° rotated diagonal in between
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   0.0,  -7.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   0.0,  -7.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,   7.0,   0.0,   true },
-                            WithinPolygon_Data{   0.0,  10.0,  10.0,   0.0,   0.0, -10.0, -10.0,   0.0,  -7.0,   0.0,   true }
-                        )
-                       );
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 0.0_m, -7.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 0.0_m, -7.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, 7.0_m, 0.0_m, true},
+                            WithinPolygon_Data{0.0_m, 10.0_m, 10.0_m, 0.0_m, 0.0_m, -10.0_m, -10.0_m, 0.0_m, -7.0_m, 0.0_m, true}));
diff --git a/sim/tests/unitTests/common/routeCalculation_Tests.cpp b/sim/tests/unitTests/common/routeCalculation_Tests.cpp
index 4d1dc2d8e1857b1e04ad59136f1a27c5b1bf95cf..c746e1e7c2bb1e14937eceb0c5b7b60f01a126b5 100644
--- a/sim/tests/unitTests/common/routeCalculation_Tests.cpp
+++ b/sim/tests/unitTests/common/routeCalculation_Tests.cpp
@@ -32,8 +32,8 @@ TEST(RouteCalculation, NoPreviousRoad_BothPointsOnSameRoad)
     FakeStochastics stochastics;
 
     ON_CALL(agent, GetEgoAgent()).WillByDefault(ReturnRef(egoAgent));
-    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10, 0, 0.2}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10, 0, 0.1}}};
-    GlobalRoadPositions mainLocatePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10, 0, 0}}};
+    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10_m, 0_m, 0.2_rad}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10_m, 0_m, 0.1_rad}}};
+    GlobalRoadPositions mainLocatePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10_m, 0_m, 0_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(mainLocatePoint));
 
@@ -81,8 +81,8 @@ TEST(RouteCalculation, WithPreviousRoad_BothPointsOnSameRoad)
     FakeStochastics stochastics;
 
     ON_CALL(agent, GetEgoAgent()).WillByDefault(ReturnRef(egoAgent));
-    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10, 0, 0.2}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10, 0, 0.1}}};
-    GlobalRoadPositions mainLocatePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10, 0, 0}}};
+    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10_m, 0_m, 0.2_rad}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10_m, 0_m, 0.1_rad}}};
+    GlobalRoadPositions mainLocatePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10_m, 0_m, 0_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(mainLocatePoint));
 
@@ -126,8 +126,8 @@ TEST(RouteCalculation, NoPreviousRoad_MainLocatorOnNextRoad)
     FakeStochastics stochastics;
 
     ON_CALL(agent, GetEgoAgent()).WillByDefault(ReturnRef(egoAgent));
-    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10, 0, 0.2}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10, 0, 0.1}}};
-    GlobalRoadPositions mainLocatePoint = {{"RoadD", GlobalRoadPosition{"RoadD", -2, 10, 0, 0}}};
+    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10_m, 0_m, 0.2_rad}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10_m, 0_m, 0.1_rad}}};
+    GlobalRoadPositions mainLocatePoint = {{"RoadD", GlobalRoadPosition{"RoadD", -2, 10_m, 0_m, 0_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(mainLocatePoint));
 
@@ -179,8 +179,8 @@ TEST(RouteCalculation, WithPreviousRoad_MainLocatorOnNextRoad)
     FakeStochastics stochastics;
 
     ON_CALL(agent, GetEgoAgent()).WillByDefault(ReturnRef(egoAgent));
-    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10, 0, 0.2}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10, 0, 0.1}}};
-    GlobalRoadPositions mainLocatePoint = {{"RoadD", GlobalRoadPosition{"RoadD", -2, 10, 0, 0}}};
+    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10_m, 0_m, 0.2_rad}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10_m, 0_m, 0.1_rad}}};
+    GlobalRoadPositions mainLocatePoint = {{"RoadD", GlobalRoadPosition{"RoadD", -2, 10_m, 0_m, 0_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(mainLocatePoint));
 
@@ -228,8 +228,8 @@ TEST(RouteCalculation, PointsOnUnconnectedRoads)
     FakeStochastics stochastics;
 
     ON_CALL(agent, GetEgoAgent()).WillByDefault(ReturnRef(egoAgent));
-    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10, 0, 0.2}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10, 0, 0.1}}};
-    GlobalRoadPositions mainLocatePoint = {{"RoadC", GlobalRoadPosition{"RoadC", -2, 10, 0, 0}}};
+    GlobalRoadPositions referencePoint = {{"RoadA", GlobalRoadPosition{"RoadA", -2, 10_m, 0_m, 0.2_rad}},{"RoadB", GlobalRoadPosition{"RoadB", -2, 10_m, 0_m, 0.1_rad}}};
+    GlobalRoadPositions mainLocatePoint = {{"RoadC", GlobalRoadPosition{"RoadC", -2, 10_m, 0_m, 0_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(mainLocatePoint));
 
diff --git a/sim/tests/unitTests/common/ttcCalculation_Tests.cpp b/sim/tests/unitTests/common/ttcCalculation_Tests.cpp
index 55067cafa3bc48491ba4a5e693bce25253c52c1c..4e6ce3603e0a950aeacdb62bb4a120fb97aa1feb 100644
--- a/sim/tests/unitTests/common/ttcCalculation_Tests.cpp
+++ b/sim/tests/unitTests/common/ttcCalculation_Tests.cpp
@@ -29,28 +29,30 @@ using ::testing::NiceMock;
 using ::testing::DoubleNear;
 using ::testing::_;
 
+using namespace units::literals;
+
 struct TtcCalculationTest_Data
 {
-    double egoX;
-    double egoY;
-    double egoVelocityX;
-    double egoVelocityY;
-    double egoAcceleration;
-    double egoYaw;
-    double egoYawRate;
-    double egoYawAcceleration;
-    double opponentX;
-    double opponentY;
-    double opponentVelocityX;
-    double opponentVelocityY;
-    double opponentAcceleration;
-    double opponentYaw;
-    double opponentYawRate;
-    double opponentYawAcceleration;
-    double longitudinalBoundary;
-    double lateralBoundary;
+    units::length::meter_t egoX;
+    units::length::meter_t egoY;
+    units::velocity::meters_per_second_t egoVelocityX;
+    units::velocity::meters_per_second_t egoVelocityY;
+    units::acceleration::meters_per_second_squared_t egoAcceleration;
+    units::angle::radian_t egoYaw;
+    units::angular_velocity::radians_per_second_t egoYawRate;
+    units::angular_acceleration::radians_per_second_squared_t egoYawAcceleration;
+    units::length::meter_t opponentX;
+    units::length::meter_t opponentY;
+    units::velocity::meters_per_second_t opponentVelocityX;
+    units::velocity::meters_per_second_t opponentVelocityY;
+    units::acceleration::meters_per_second_squared_t opponentAcceleration;
+    units::angle::radian_t opponentYaw;
+    units::angular_velocity::radians_per_second_t opponentYawRate;
+    units::angular_acceleration::radians_per_second_squared_t opponentYawAcceleration;
+    units::length::meter_t longitudinalBoundary;
+    units::length::meter_t lateralBoundary;
 
-    double expectedTtc;
+    units::time::second_t expectedTtc;
 };
 
 class TtcCalcualtionTest: public ::TestWithParam<TtcCalculationTest_Data>
@@ -61,46 +63,46 @@ TEST_P(TtcCalcualtionTest, CalculateObjectTTC_ReturnsCorrectTtc)
 {
     auto data = GetParam();
     double fakeCycleTime = 10;
-    double fakeMaxTtc = 10.0;
+    units::time::second_t fakeMaxTtc = 10.0_s;
 
     NiceMock<FakeAgent> ego;
     ON_CALL(ego, GetPositionX()).WillByDefault(Return(data.egoX));
     ON_CALL(ego, GetPositionY()).WillByDefault(Return(data.egoY));
     ON_CALL(ego, GetYaw()).WillByDefault(Return(data.egoYaw));
-    ON_CALL(ego, GetRoll()).WillByDefault(Return(0.0));
+    ON_CALL(ego, GetRoll()).WillByDefault(Return(0.0_rad));
     ON_CALL(ego, GetYawRate()).WillByDefault(Return(data.egoYawRate));
     ON_CALL(ego, GetYawAcceleration()).WillByDefault(Return(data.egoYawAcceleration));
     ON_CALL(ego, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{data.egoVelocityX, data.egoVelocityY}));
-    ON_CALL(ego, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{data.egoAcceleration * std::cos(data.egoYaw), data.egoAcceleration * std::sin(data.egoYaw)}));
-    ON_CALL(ego, GetLength()).WillByDefault(Return(2.0));
-    ON_CALL(ego, GetWidth()).WillByDefault(Return(1.0));
-    ON_CALL(ego, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1.0));
+    ON_CALL(ego, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{data.egoAcceleration * units::math::cos(data.egoYaw), data.egoAcceleration * units::math::sin(data.egoYaw)}));
+    ON_CALL(ego, GetLength()).WillByDefault(Return(2.0_m));
+    ON_CALL(ego, GetWidth()).WillByDefault(Return(1.0_m));
+    ON_CALL(ego, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1.0_m));
 
     NiceMock<FakeAgent> opponent;
     ON_CALL(opponent, GetPositionX()).WillByDefault(Return(data.opponentX));
     ON_CALL(opponent, GetPositionY()).WillByDefault(Return(data.opponentY));
     ON_CALL(opponent, GetYaw()).WillByDefault(Return(data.opponentYaw));
-    ON_CALL(opponent, GetRoll()).WillByDefault(Return(0.0));
+    ON_CALL(opponent, GetRoll()).WillByDefault(Return(0.0_rad));
     ON_CALL(opponent, GetYawRate()).WillByDefault(Return(data.opponentYawRate));
     ON_CALL(opponent, GetYawAcceleration()).WillByDefault(Return(data.opponentYawAcceleration));
     ON_CALL(opponent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{data.opponentVelocityX, data.opponentVelocityY}));
-    ON_CALL(opponent, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{data.opponentAcceleration * std::cos(data.opponentYaw), data.opponentAcceleration * std::sin(data.opponentYaw)}));
-    ON_CALL(opponent, GetLength()).WillByDefault(Return(2.0));
-    ON_CALL(opponent, GetWidth()).WillByDefault(Return(1.0));
-    ON_CALL(opponent, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1.0));
+    ON_CALL(opponent, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{data.opponentAcceleration * units::math::cos(data.opponentYaw), data.opponentAcceleration * units::math::sin(data.opponentYaw)}));
+    ON_CALL(opponent, GetLength()).WillByDefault(Return(2.0_m));
+    ON_CALL(opponent, GetWidth()).WillByDefault(Return(1.0_m));
+    ON_CALL(opponent, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1.0_m));
 
     auto result = TtcCalculations::CalculateObjectTTC(ego, opponent, fakeMaxTtc, data.longitudinalBoundary, data.lateralBoundary, fakeCycleTime);
-    ASSERT_THAT(result, DoubleNear(data.expectedTtc, 0.001));
+    ASSERT_THAT(result.value(), DoubleNear(data.expectedTtc.value(), 0.001));
 }
 
 INSTANTIATE_TEST_CASE_P(TtcCalculationTestCase, TtcCalcualtionTest, ::testing::Values(
-//                       Ego                                           opponent
-//                           x,     y,  v_x, v_y,   a, yaw, yawRate, yawAcc,     x,     y,  v_x,  v_y,   a,     yaw, yawRate, yawAcc, long, lat,     ttc
-TtcCalculationTest_Data{ -20.0,   0.0, 10.0, 0.0, 0.0, 0.0,     0.0,    0.0,   0.0,   0.0, 12.0,  0.0, 0.0,     0.0,     0.0,    0.0,  0.0, 0.0, DBL_MAX},
-TtcCalculationTest_Data{   0.0,   0.0, 12.0, 0.0, 0.0, 0.0,     0.0,    0.0, -20.0,   0.0, 10.0,  0.0, 0.0,     0.0,     0.0,    0.0,  0.0, 0.0, DBL_MAX},
-TtcCalculationTest_Data{   0.0,  10.0, 10.0, 0.0, 0.0, 0.0,     0.0,    0.0,  40.5,  10.0,  2.0,  0.0, 0.0,     0.0,     0.0,    0.0,  0.0, 0.0,    4.82},
-TtcCalculationTest_Data{  20.0, -10.0, 10.0, 0.0, 0.0, 0.0,     0.0,    0.0,   5.0, -10.0, 40.0,  0.0, 0.0,     0.0,     0.0,    0.0,  0.0, 0.0,    0.44},
-TtcCalculationTest_Data{   0.0,   0.0,  0.0, 0.0, 0.0, 0.0,     0.0,    0.0,   0.0,  14.0,  0.0, -5.0, 0.0, -M_PI_2,     0.0,    0.0, 10.0, 5.0,     1.0},
-TtcCalculationTest_Data{   0.0,   0.0,  0.0, 0.0, 0.0, 0.0,     0.0,    0.0, -50.0,   0.0,  5.0,  0.0, 2.0,     0.0,     0.0,    0.0,  0.0, 0.0,    4.87},
-TtcCalculationTest_Data{   0.0,   0.0,  0.0, 0.0, 0.0, 0.0,     0.0,    0.0, -10.0, -10.0,  0.0, 10.0, 0.0,  M_PI_2,    -1.0,    0.0,  0.0, 0.0,    1.38}
+//                       Ego                                                                                                    opponent
+//                             x,       y,      v_x,     v_y,          a,     yaw,       yawRate,           yawAcc,     x,         y,      v_x,      v_y,          a,     yaw,        yawRate,           yawAcc,   long,   lat,         ttc
+TtcCalculationTest_Data{ -20.0_m,   0.0_m, 10.0_mps, 0.0_mps, 0.0_mps_sq, 0.0_rad, 0.0_rad_per_s, 0.0_rad_per_s_sq,   0.0_m,   0.0_m, 12.0_mps,  0.0_mps, 0.0_mps_sq, 0.0_rad,  0.0_rad_per_s, 0.0_rad_per_s_sq,  0.0_m, 0.0_m, units::time::second_t(std::numeric_limits<double>::max())},
+TtcCalculationTest_Data{   0.0_m,   0.0_m, 12.0_mps, 0.0_mps, 0.0_mps_sq, 0.0_rad, 0.0_rad_per_s, 0.0_rad_per_s_sq, -20.0_m,   0.0_m, 10.0_mps,  0.0_mps, 0.0_mps_sq, 0.0_rad,  0.0_rad_per_s, 0.0_rad_per_s_sq,  0.0_m, 0.0_m, units::time::second_t(std::numeric_limits<double>::max())},
+TtcCalculationTest_Data{   0.0_m,  10.0_m, 10.0_mps, 0.0_mps, 0.0_mps_sq, 0.0_rad, 0.0_rad_per_s, 0.0_rad_per_s_sq,  40.5_m,  10.0_m,  2.0_mps,  0.0_mps, 0.0_mps_sq, 0.0_rad,  0.0_rad_per_s, 0.0_rad_per_s_sq,  0.0_m, 0.0_m,      4.82_s},
+TtcCalculationTest_Data{  20.0_m, -10.0_m, 10.0_mps, 0.0_mps, 0.0_mps_sq, 0.0_rad, 0.0_rad_per_s, 0.0_rad_per_s_sq,   5.0_m, -10.0_m, 40.0_mps,  0.0_mps, 0.0_mps_sq, 0.0_rad,  0.0_rad_per_s, 0.0_rad_per_s_sq,  0.0_m, 0.0_m,      0.44_s},
+TtcCalculationTest_Data{   0.0_m,   0.0_m,  0.0_mps, 0.0_mps, 0.0_mps_sq, 0.0_rad, 0.0_rad_per_s, 0.0_rad_per_s_sq,   0.0_m,  14.0_m,  0.0_mps, -5.0_mps, 0.0_mps_sq, -90_deg,  0.0_rad_per_s, 0.0_rad_per_s_sq, 10.0_m, 5.0_m,       1.0_s},
+TtcCalculationTest_Data{   0.0_m,   0.0_m,  0.0_mps, 0.0_mps, 0.0_mps_sq, 0.0_rad, 0.0_rad_per_s, 0.0_rad_per_s_sq, -50.0_m,   0.0_m,  5.0_mps,  0.0_mps, 2.0_mps_sq, 0.0_rad,  0.0_rad_per_s, 0.0_rad_per_s_sq,  0.0_m, 0.0_m,      4.87_s},
+TtcCalculationTest_Data{   0.0_m,   0.0_m,  0.0_mps, 0.0_mps, 0.0_mps_sq, 0.0_rad, 0.0_rad_per_s, 0.0_rad_per_s_sq, -10.0_m, -10.0_m,  0.0_mps, 10.0_mps, 0.0_mps_sq,  90_deg, -1.0_rad_per_s, 0.0_rad_per_s_sq,  0.0_m, 0.0_m,      1.38_s}
 ));
diff --git a/sim/tests/unitTests/components/AlgorithmAEB/AlgorithmAebOSIUnitTests.h b/sim/tests/unitTests/components/AlgorithmAEB/AlgorithmAebOSIUnitTests.h
index 864cf605ce32c7068f7c7fb670b55dc7774dd49d..24827004ec248cbdabaa080e4f0951649885a8b6 100644
--- a/sim/tests/unitTests/components/AlgorithmAEB/AlgorithmAebOSIUnitTests.h
+++ b/sim/tests/unitTests/components/AlgorithmAEB/AlgorithmAebOSIUnitTests.h
@@ -30,7 +30,7 @@ public:
         delete implementation;
     }
 
-    void SetEgoValues(double velocity, double acceleration, double yawRate);
+    void SetEgoValues(units::velocity::meters_per_second_t velocity, units::acceleration::meters_per_second_squared_t acceleration, units::angular_velocity::radians_per_second_t yawRate);
 
     AlgorithmAutonomousEmergencyBrakingImplementation *implementation;
     NiceMock<FakeWorld> fakeWorldInterface;
diff --git a/sim/tests/unitTests/components/AlgorithmAEB/AlgorithmAeb_Tests.cpp b/sim/tests/unitTests/components/AlgorithmAEB/AlgorithmAeb_Tests.cpp
index 5897e158080245f87becb48980037ff674b353fb..b5b7697c150acb4b004a82c529745ecfd6c1c50d 100644
--- a/sim/tests/unitTests/components/AlgorithmAEB/AlgorithmAeb_Tests.cpp
+++ b/sim/tests/unitTests/components/AlgorithmAEB/AlgorithmAeb_Tests.cpp
@@ -23,9 +23,11 @@ using ::testing::NiceMock;
 using ::testing::Return;
 using ::testing::ReturnRef;
 
+using namespace units::literals;
+
 TEST_F(AlgorithmAutonomousEmergencyBraking_UnitTest, ActualTTCLessThanBrakeTTCWithStationaryObject_ShouldActivateAEB)
 {
-    SetEgoValues(20.0, 0.0, 0.0);
+    SetEgoValues(20.0_mps, 0.0_mps_sq, 0.0_rad_per_s);
 
     osi3::SensorData sensorData;
     auto stationaryObject = sensorData.add_stationary_object();
@@ -39,12 +41,12 @@ TEST_F(AlgorithmAutonomousEmergencyBraking_UnitTest, ActualTTCLessThanBrakeTTCWi
     implementation->UpdateInput(0, std::make_shared<SensorDataSignal>(sensorData), 0);
 
     implementation->Trigger(0);
-    EXPECT_LT(implementation->GetAcceleration(), 0.0);
+    EXPECT_LT(implementation->GetAcceleration().value(), 0.0);
 }
 
 TEST_F(AlgorithmAutonomousEmergencyBraking_UnitTest, ActualTTCLessThanBrakeTTCWithMovingObject_ShouldActivateAEB)
 {
-    SetEgoValues(20.0, 0.0, 0.0);
+    SetEgoValues(20.0_mps, 0.0_mps_sq, 0.0_rad_per_s);
 
     osi3::SensorData sensorData;
     auto movingObject = sensorData.add_moving_object();
@@ -62,12 +64,12 @@ TEST_F(AlgorithmAutonomousEmergencyBraking_UnitTest, ActualTTCLessThanBrakeTTCWi
     implementation->UpdateInput(0, std::make_shared<SensorDataSignal>(sensorData), 0);
 
     implementation->Trigger(0);
-    EXPECT_LT(implementation->GetAcceleration(), 0.0);
+    EXPECT_LT(implementation->GetAcceleration().value(), 0.0);
 }
 
 TEST_F(AlgorithmAutonomousEmergencyBraking_UnitTest, ActualTTCMoreThanBrakeTTC_ShouldNotActivateAEB)
 {
-    SetEgoValues(20.0, 0.0, 0.0);
+    SetEgoValues(20.0_mps, 0.0_mps_sq, 0.0_rad_per_s);
 
     osi3::SensorData sensorData;
     auto movingObject = sensorData.add_moving_object();
@@ -85,7 +87,7 @@ TEST_F(AlgorithmAutonomousEmergencyBraking_UnitTest, ActualTTCMoreThanBrakeTTC_S
     implementation->UpdateInput(0, std::make_shared<SensorDataSignal>(sensorData), 0);
 
     implementation->Trigger(0);
-    EXPECT_GE(implementation->GetAcceleration(), 0.0);
+    EXPECT_GE(implementation->GetAcceleration().value(), 0.0);
 }
 
 AlgorithmAutonomousEmergencyBraking_UnitTest::AlgorithmAutonomousEmergencyBraking_UnitTest()
@@ -108,9 +110,9 @@ AlgorithmAutonomousEmergencyBraking_UnitTest::AlgorithmAutonomousEmergencyBrakin
     ON_CALL(*aebParameters, GetParameterLists()).WillByDefault(ReturnRef(parameterLists));
     ON_CALL(*aebParameters, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameters));
 
-    ON_CALL(fakeEgoAgent, GetLength()).WillByDefault(Return(2.0));
-    ON_CALL(fakeEgoAgent, GetWidth()).WillByDefault(Return(1.0));
-    ON_CALL(fakeEgoAgent, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1.0));
+    ON_CALL(fakeEgoAgent, GetLength()).WillByDefault(Return(2.0_m));
+    ON_CALL(fakeEgoAgent, GetWidth()).WillByDefault(Return(1.0_m));
+    ON_CALL(fakeEgoAgent, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1.0_m));
 
     int fakeCycleTime = 50;
 
@@ -127,10 +129,10 @@ AlgorithmAutonomousEmergencyBraking_UnitTest::AlgorithmAutonomousEmergencyBrakin
                                                                            &fakeEgoAgent);
 }
 
-void AlgorithmAutonomousEmergencyBraking_UnitTest::SetEgoValues(double velocity, double acceleration, double yawRate)
+void AlgorithmAutonomousEmergencyBraking_UnitTest::SetEgoValues(units::velocity::meters_per_second_t velocity, units::acceleration::meters_per_second_squared_t acceleration, units::angular_velocity::radians_per_second_t yawRate)
 {
-    ON_CALL(fakeEgoAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{velocity, 0.0}));
-    ON_CALL(fakeEgoAgent, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{acceleration, 0.0}));
-    ON_CALL(fakeEgoAgent, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(fakeEgoAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{velocity, 0.0_mps}));
+    ON_CALL(fakeEgoAgent, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{acceleration, 0.0_mps_sq}));
+    ON_CALL(fakeEgoAgent, GetYaw()).WillByDefault(Return(0.0_rad));
     ON_CALL(fakeEgoAgent, GetYawRate()).WillByDefault(Return(yawRate));
 }
diff --git a/sim/tests/unitTests/components/Algorithm_AFDM/Afdm_Tests.cpp b/sim/tests/unitTests/components/Algorithm_AFDM/Afdm_Tests.cpp
index d369d72e7bd3e48a07d71b1e95ca0f23dc8afd74..4f8867ba73c4a2f469c57d9d92b77d8286e88830 100644
--- a/sim/tests/unitTests/components/Algorithm_AFDM/Afdm_Tests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_AFDM/Afdm_Tests.cpp
@@ -54,7 +54,7 @@ TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityHigherWish_Acc
     SurroundingObjects surroundingObjects;
 
     surroundingObjects.objectFront.exist = false;
-    vehicleInfo.absoluteVelocity = 200.0/3.6;
+    vehicleInfo.absoluteVelocity = units::velocity::kilometers_per_hour_t(200.0);
     const auto sensorDriverSignal0 = std::make_shared<SensorDriverSignal const>(vehicleInfo,
                                                                                 trafficRuleInfo,
                                                                                 geometricInfo,
@@ -66,12 +66,12 @@ TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityHigherWish_Acc
     implementation.UpdateOutput(2, outputSignal, 0);
 
     auto brakingSignal = std::static_pointer_cast<AccelerationSignal const>(outputSignal);
-    double acceleration = brakingSignal->acceleration;
+    units::acceleration::meters_per_second_squared_t acceleration = brakingSignal->acceleration;
 
-    ASSERT_THAT(acceleration, Ge(-maxDeceleration));
-    ASSERT_THAT(acceleration, Le(maxAcceleration));
+    ASSERT_THAT(acceleration.value(), Ge(-maxDeceleration));
+    ASSERT_THAT(acceleration.value(), Le(maxAcceleration));
 
-    vehicleInfo.absoluteVelocity = 20.0/3.6;
+    vehicleInfo.absoluteVelocity = units::velocity::kilometers_per_hour_t(20.0);
     const auto sensorDriverSignal1 = std::make_shared<SensorDriverSignal const>(vehicleInfo,
                                                                                 trafficRuleInfo,
                                                                                 geometricInfo,
@@ -84,8 +84,8 @@ TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityHigherWish_Acc
     brakingSignal = std::static_pointer_cast<AccelerationSignal const>(outputSignal);
     acceleration = brakingSignal->acceleration;
 
-    ASSERT_THAT(acceleration, Ge(-maxDeceleration));
-    ASSERT_THAT(acceleration, Le(maxAcceleration));
+    ASSERT_THAT(acceleration.value(), Ge(-maxDeceleration));
+    ASSERT_THAT(acceleration.value(), Le(maxAcceleration));
 }
 
 TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityIsWish_HoldVWish)
@@ -114,7 +114,7 @@ TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityIsWish_HoldVWi
     SurroundingObjects surroundingObjects;
 
     surroundingObjects.objectFront.exist = false;
-    vehicleInfo.absoluteVelocity = 120.0/3.6;
+    vehicleInfo.absoluteVelocity = units::velocity::kilometers_per_hour_t(120.0);
     const auto sensorDriverSignal = std::make_shared<SensorDriverSignal const>(vehicleInfo,
                                                                                trafficRuleInfo,
                                                                                geometricInfo,
@@ -126,8 +126,8 @@ TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityIsWish_HoldVWi
     implementation.UpdateOutput(2, outputSignal, 0);
 
     auto brakingSignal = std::static_pointer_cast<AccelerationSignal const>(outputSignal);
-    double acceleration = brakingSignal->acceleration;
-    ASSERT_THAT(acceleration, DoubleEq(0.0));
+    units::acceleration::meters_per_second_squared_t acceleration = brakingSignal->acceleration;
+    ASSERT_THAT(acceleration.value(), DoubleEq(0.0));
 }
 
 TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityHigherWish_AccUntilWish)
@@ -156,7 +156,7 @@ TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityHigherWish_Acc
     SurroundingObjects surroundingObjects;
 
     surroundingObjects.objectFront.exist = false;
-    vehicleInfo.absoluteVelocity = 150.0/3.6;
+    vehicleInfo.absoluteVelocity = units::velocity::kilometers_per_hour_t(150.0);
     const auto sensorDriverSignal0 = std::make_shared<SensorDriverSignal const>(vehicleInfo,
                                                                                 trafficRuleInfo,
                                                                                 geometricInfo,
@@ -168,10 +168,10 @@ TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityHigherWish_Acc
     implementation.UpdateOutput(2, outputSignal, 0);
 
     auto brakingSignal = std::static_pointer_cast<AccelerationSignal const>(outputSignal);
-    double acceleration = brakingSignal->acceleration;
-    ASSERT_THAT(acceleration, Lt(0.0));
+    units::acceleration::meters_per_second_squared_t acceleration = brakingSignal->acceleration;
+    ASSERT_THAT(acceleration.value(), Lt(0.0));
 
-    vehicleInfo.absoluteVelocity = 120.0/3.6;
+    vehicleInfo.absoluteVelocity = units::velocity::kilometers_per_hour_t(120.0);
     const auto sensorDriverSignal1 = std::make_shared<SensorDriverSignal const>(vehicleInfo,
                                                                                 trafficRuleInfo,
                                                                                 geometricInfo,
@@ -183,5 +183,5 @@ TEST(AgentFollowingDriverModel, TriggerWithNoFrontAgentAndVelocityHigherWish_Acc
 
     brakingSignal = std::static_pointer_cast<AccelerationSignal const>(outputSignal);
     acceleration = brakingSignal->acceleration;
-    ASSERT_THAT(acceleration, DoubleEq(0.0));
+    ASSERT_THAT(acceleration.value(), DoubleEq(0.0));
 }
diff --git a/sim/tests/unitTests/components/Algorithm_FmuWrapper/OsmpFmuUnitTests.cpp b/sim/tests/unitTests/components/Algorithm_FmuWrapper/OsmpFmuUnitTests.cpp
index 62f021aea4e30c4af6f311a1248a4228b525e4f9..bf8cf17fa35e40417ba8dfa534433e7569a04189 100644
--- a/sim/tests/unitTests/components/Algorithm_FmuWrapper/OsmpFmuUnitTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_FmuWrapper/OsmpFmuUnitTests.cpp
@@ -13,17 +13,25 @@
 
 #include "OsmpFmuHandler.h"
 
+using namespace units::literals;
+
 using ::testing::Eq;
 
 #ifdef USE_EXTENDED_OSI
 TEST(OsmpFmuUnitTests, GetTrafficCommandFromOpenScenarioTrajectory_FollowTrajectoryAction)
 {
-    openScenario::Trajectory trajectory;
-    trajectory.points.emplace_back(openScenario::TrajectoryPoint{0.0, 0.1, -0.2, 0.3});
-    trajectory.points.emplace_back(openScenario::TrajectoryPoint{5.1, -1.1, 1.2, 1.3});
-    trajectory.points.emplace_back(openScenario::TrajectoryPoint{15.2, 2.1, -2.2, -2.3});
-    openScenario::TrajectoryTimeReference timeReference{"", 0.0, 0.0};
-    trajectory.timeReference = timeReference;
+    mantle_api::Pose fakePose1{{0.1_m, -0.2_m, 0_m}, {0.3_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose2{{-1.1_m, 1.2_m, 0_m}, {1.3_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose3{{2.1_m, -2.2_m, 0_m}, {-2.3_rad, 0_rad, 0_rad}};
+
+    mantle_api::PolyLinePoint fakePolyLinePoint1{fakePose1, 0_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint2{fakePose2, 5.1_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint3{fakePose3, 15.2_s};
+
+    mantle_api::PolyLine polyLine{fakePolyLinePoint1, fakePolyLinePoint2, fakePolyLinePoint3};
+
+    mantle_api::Trajectory trajectory;
+    trajectory.type = polyLine;
 
     osi3::TrafficCommand trafficCommand;
     OsmpFmuHandler::AddTrafficCommandActionFromOpenScenarioTrajectory(trafficCommand.add_action(), trajectory);
@@ -55,10 +63,18 @@ TEST(OsmpFmuUnitTests, GetTrafficCommandFromOpenScenarioTrajectory_FollowTraject
 
 TEST(OsmpFmuUnitTests, GetTrafficCommandFromOpenScenarioTrajectory_FollowPathAction)
 {
-    openScenario::Trajectory trajectory;
-    trajectory.points.emplace_back(openScenario::TrajectoryPoint{0.0, 0.1, -0.2, 0.3});
-    trajectory.points.emplace_back(openScenario::TrajectoryPoint{5.1, -1.1, 1.2, 1.3});
-    trajectory.points.emplace_back(openScenario::TrajectoryPoint{15.2, 2.1, -2.2, -2.3});
+    mantle_api::Pose fakePose1{{0.1_m, -0.2_m, 0_m}, {0.3_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose2{{-1.1_m, 1.2_m, 0_m}, {1.3_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose3{{2.1_m, -2.2_m, 0_m}, {-2.3_rad, 0_rad, 0_rad}};
+
+    mantle_api::PolyLinePoint fakePolyLinePoint1{fakePose1};
+    mantle_api::PolyLinePoint fakePolyLinePoint2{fakePose2};
+    mantle_api::PolyLinePoint fakePolyLinePoint3{fakePose3};
+
+    mantle_api::PolyLine polyLine{fakePolyLinePoint1, fakePolyLinePoint2, fakePolyLinePoint3};
+
+    mantle_api::Trajectory trajectory;
+    trajectory.type = polyLine;
 
     osi3::TrafficCommand trafficCommand;
     OsmpFmuHandler::AddTrafficCommandActionFromOpenScenarioTrajectory(trafficCommand.add_action(), trajectory);
@@ -84,8 +100,8 @@ TEST(OsmpFmuUnitTests, GetTrafficCommandFromOpenScenarioTrajectory_FollowPathAct
 
 TEST(OsmpFmuUnitTests, GetTrafficCommandFromOpenScenarioPosition)
 {
-    constexpr double x = 3.14, y = 42.0;
-    openScenario::Position position = openScenario::WorldPosition{3.14, 42.0};
+    constexpr units::length::meter_t x = 3.14_m, y = 42.0_m;
+    mantle_api::Position position = mantle_api::Vec3<units::length::meter_t>{x, y, 0_m};
 
     osi3::TrafficCommand trafficCommand;
     OsmpFmuHandler::AddTrafficCommandActionFromOpenScenarioPosition(trafficCommand.add_action(), position, nullptr, nullptr);
@@ -95,8 +111,8 @@ TEST(OsmpFmuUnitTests, GetTrafficCommandFromOpenScenarioPosition)
     ASSERT_TRUE(hasAcquireGlobalPositionAction);
     const auto &positionAction = action.acquire_global_position_action();
     ASSERT_TRUE(positionAction.has_position());
-    ASSERT_EQ(positionAction.position().x(), x);
-    ASSERT_EQ(positionAction.position().y(), y);
+    ASSERT_EQ(positionAction.position().x(), x.value());
+    ASSERT_EQ(positionAction.position().y(), y.value());
     ASSERT_FALSE(positionAction.position().has_z());
     ASSERT_FALSE(positionAction.has_orientation());
     ASSERT_FALSE(positionAction.orientation().has_roll());
diff --git a/sim/tests/unitTests/components/Algorithm_Lateral/algorithmLateral_Tests.cpp b/sim/tests/unitTests/components/Algorithm_Lateral/algorithmLateral_Tests.cpp
index 6ceaac37d6757347654866507c92eb6cd68b34dc..87dd046042ef71b15f1100dab1892b7ad15a4354 100644
--- a/sim/tests/unitTests/components/Algorithm_Lateral/algorithmLateral_Tests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_Lateral/algorithmLateral_Tests.cpp
@@ -32,15 +32,15 @@ using ::testing::ReturnRef;
 /// \brief Data table for definition of individual test cases for AreaOfInterest::EGO_FRONT
 struct DataFor_AlgorithmLateralDriverImplementation_Trigger
 {
-    double                  input_LongitudinalVelocity;
-    double                  input_LateralDeviation;
-    double                  input_HeadingError;
-    double                  input_LastSteeringWheelAngle;
-    std::vector<double>     input_CurvatureSegmentsNear;
-    std::vector<double>     input_CurvatureSegmentsFar;
-    double                  input_KappaRoad;
-    double                  input_KappaManeuver;
-    double                  result_SteeringWheelAngle;
+    units::velocity::meters_per_second_t            input_LongitudinalVelocity;
+    units::length::meter_t                          input_LateralDeviation;
+    units::angle::radian_t                          input_HeadingError;
+    units::angle::degree_t                          input_LastSteeringWheelAngle;
+    std::vector<units::curvature::inverse_meter_t>  input_CurvatureSegmentsNear;
+    std::vector<units::curvature::inverse_meter_t>  input_CurvatureSegmentsFar;
+    units::curvature::inverse_meter_t               input_KappaRoad;
+    units::curvature::inverse_meter_t               input_KappaManeuver;
+    units::angle::degree_t                          result_SteeringWheelAngle;
 
     /// \brief This stream will be shown in case the test fails
     friend std::ostream& operator<<(std::ostream& os, const DataFor_AlgorithmLateralDriverImplementation_Trigger& obj)
@@ -71,28 +71,28 @@ TEST_P(LateralDriverTrigger, LateralDriver_CheckTriggerFunction)
 
     // Set data for test
     LateralSignal lateralSignal {ComponentState::Acting,
-                                0.0,
+                                {0.0_m,
                                 data.input_LateralDeviation,
-                                20.,
+                                20.0_rad_per_s_sq,
                                 data.input_HeadingError,
-                                10.,
-                                data.input_KappaManeuver,
+                                10._Hz,
+                                data.input_KappaManeuver},
                                 data.input_KappaRoad,
                                 data.input_CurvatureSegmentsNear,
                                 data.input_CurvatureSegmentsFar};
     stubLateralDriver->SetLateralInput(lateralSignal);
     stubLateralDriver->SetVehicleParameter(10.,
-                                           2 * M_PI,
-                                           3.);
+                                           units::angle::radian_t(2 * M_PI),
+                                           3.0_m);
     stubLateralDriver->SetVelocityAndSteeringWheelAngle(data.input_LongitudinalVelocity,
                                                         data.input_LastSteeringWheelAngle);
 
     // Call test
     stubLateralDriver->Trigger(0);
-    double result = stubLateralDriver->GetDesiredSteeringWheelAngle();
+    auto result = stubLateralDriver->GetDesiredSteeringWheelAngle();
 
     // Results must be within 1% of analytical results (since excact matches can't be guaranteed)
-    bool resultLegit = std::fabs(data.result_SteeringWheelAngle - result) <= .01 * std::fabs(data.result_SteeringWheelAngle);
+    bool resultLegit = units::math::fabs(data.result_SteeringWheelAngle - result) <= .01 * units::math::fabs(data.result_SteeringWheelAngle);
 
     // Evaluate result
     ASSERT_TRUE(resultLegit) << "SteeringWheelAngle: " << result << std::endl;
@@ -101,28 +101,24 @@ TEST_P(LateralDriverTrigger, LateralDriver_CheckTriggerFunction)
 /**********************************************************
  * The test data (must be defined below test)             *
  **********************************************************/
-INSTANTIATE_TEST_CASE_P(Default, LateralDriverTrigger,testing::Values
-(
-   /*
-        double                  input_LongitudinalVelocity;
-        double                  input_LateralDeviation;
-        double                  input_HeadingError;
-        double                  input_LastSteeringWheelAngle;
-        std::vector<double>     input_CurvatureSegmentsNear;
-        std::vector<double>     input_CurvatureSegmentsFar;
-        double                  input_KappaRoad;
-        double                  input_KappaManeuver;
-        double                  result_SteeringWheelAngle;
+INSTANTIATE_TEST_CASE_P(Default, LateralDriverTrigger, testing::Values(
+                                                           /*
+        units::velocity::meters_per_second_t                  input_LongitudinalVelocity;
+        units::length::meter_t                  input_LateralDeviation;
+        units::angle::radian_t                  input_HeadingError;
+        units::angle::degree_t                  input_LastSteeringWheelAngle;
+        std::vector<units::curvature::inverse_meter_t>     input_CurvatureSegmentsNear;
+        std::vector<units::curvature::inverse_meter_t>     input_CurvatureSegmentsFar;
+        units::curvature::inverse_meter_t                  input_KappaRoad;
+        units::curvature::inverse_meter_t                  input_KappaManeuver;
+        units::angle::degree_t                  result_SteeringWheelAngle;
    */
-
-    DataFor_AlgorithmLateralDriverImplementation_Trigger{50., 0., 0.,   0. * M_PI / 180.0, {0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0.}, 0., 0., 000.000000 * M_PI / 180.}, // Driving straight
-    DataFor_AlgorithmLateralDriverImplementation_Trigger{50., 1., 0.,   0. * M_PI / 180.0, {0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0.}, 0., 0., 013.750987 * M_PI / 180.}, // Lateral deviation from trajectory
-    DataFor_AlgorithmLateralDriverImplementation_Trigger{50., 0., 1., 300. * M_PI / 180.0, {0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0.}, 0., 0., 332.000000 * M_PI / 180.}, // Lateral deviation from trajectory with non central steering wheel capped to 320°/s (actual 343.77467)
-    DataFor_AlgorithmLateralDriverImplementation_Trigger{50., 0., 2., 350. * M_PI / 180.0, {0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0.}, 0., 0., 360.000000 * M_PI / 180.}, // Curvature of trajectory, 687.54935° capped at 360°
-    DataFor_AlgorithmLateralDriverImplementation_Trigger{50., 2., 1., 350. * M_PI / 180.0, {0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0.}, 0., 0., 360.000000 * M_PI / 180.}  // Total steering wheel angle, 371.27665° capped at 360°
-)
-);
-
+                                                           DataFor_AlgorithmLateralDriverImplementation_Trigger{50._mps, 0._m, 0._rad, 0._deg, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, 0._i_m, 0._i_m, 000.000000_deg},   // Driving straight
+                                                           DataFor_AlgorithmLateralDriverImplementation_Trigger{50._mps, 1._m, 0._rad, 0._deg, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, 0._i_m, 0._i_m, 013.750987_deg},   // Lateral deviation from trajectory
+                                                           DataFor_AlgorithmLateralDriverImplementation_Trigger{50._mps, 0._m, 1._rad, 300._deg, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, 0._i_m, 0._i_m, 332.000000_deg}, // Lateral deviation from trajectory with non central steering wheel capped to 320°/s (actual 343.77467)
+                                                           DataFor_AlgorithmLateralDriverImplementation_Trigger{50._mps, 0._m, 2._rad, 350._deg, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, 0._i_m, 0._i_m, 360.000000_deg}, // Curvature of trajectory, 687.54935° capped at 360°
+                                                           DataFor_AlgorithmLateralDriverImplementation_Trigger{50._mps, 2._m, 1._rad, 350._deg, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, {0._i_m, 0._i_m, 0._i_m, 0._i_m, 0._i_m}, 0._i_m, 0._i_m, 360.000000_deg}  // Total steering wheel angle, 371.27665° capped at 360°
+                                                           ));
 
 /*******************************************
  * CHECK Update input                      *
@@ -169,7 +165,7 @@ struct DataFor_AlgorithmLateralDriverImplementation_UpdateInput
 
 struct DataFor_AlgorithmLateralDriverImplementation_UpdateOutput
 {
-    double input_DesiredSteeringWheelAngle;
+    units::angle::radian_t input_DesiredSteeringWheelAngle;
     bool input_IsActive;
 
     /// \brief This stream will be shown in case the test fails
@@ -214,7 +210,7 @@ TEST_P(LateralDriverUpdateOutput, LateralDriver_CheckFunction_UpdateOutput)
     } else
     {
         ASSERT_EQ(signal->componentState, ComponentState::Disabled);
-        ASSERT_EQ(signal->steeringWheelAngle, 0.);
+        ASSERT_EQ(signal->steeringWheelAngle, 0._rad);
     }
 
 }
@@ -222,14 +218,10 @@ TEST_P(LateralDriverUpdateOutput, LateralDriver_CheckFunction_UpdateOutput)
 /**********************************************************
  * The test data (must be defined below test)             *
  **********************************************************/
-INSTANTIATE_TEST_CASE_P(Default, LateralDriverUpdateOutput,testing::Values
-(
-   /*
+INSTANTIATE_TEST_CASE_P(Default, LateralDriverUpdateOutput, testing::Values(
+                                                                /*
         double input_DesiredSteeringWheelAngle;
         bool input_IsActive;
    */
 
-    DataFor_AlgorithmLateralDriverImplementation_UpdateOutput{0.27 * M_PI / 180., true},
-    DataFor_AlgorithmLateralDriverImplementation_UpdateOutput{0.74 * M_PI / 180., false}
-)
-);
+                                                                DataFor_AlgorithmLateralDriverImplementation_UpdateOutput{units::angle::radian_t(0.27 * M_PI / 180.), true}, DataFor_AlgorithmLateralDriverImplementation_UpdateOutput{units::angle::radian_t(0.74 * M_PI / 180.), false}));
diff --git a/sim/tests/unitTests/components/Algorithm_Lateral/testAlgorithmLateralImplementation.h b/sim/tests/unitTests/components/Algorithm_Lateral/testAlgorithmLateralImplementation.h
index ea3b5826eb53b677b03657eb86b09b5dd54f60f0..d082119297e7258b2faef00ff2978eada9d96d9a 100644
--- a/sim/tests/unitTests/components/Algorithm_Lateral/testAlgorithmLateralImplementation.h
+++ b/sim/tests/unitTests/components/Algorithm_Lateral/testAlgorithmLateralImplementation.h
@@ -54,24 +54,27 @@ public:
 
     ~TestAlgorithmLateralImplementation(){}
 
-    void SetDesiredSteeringWheelAngle(double Angle) {out_desiredSteeringWheelAngle = Angle;}
+    void SetDesiredSteeringWheelAngle(units::angle::radian_t angle)
+    {
+        out_desiredSteeringWheelAngle = angle;
+    }
     void SetIsActive(bool active) {isActive = active;}
 
     void SetLateralInput(const LateralSignal lateralSignal) {steeringController.SetLateralInput(lateralSignal);}
     void SetVehicleParameter(const double &steeringRatio,
-                             const double &maximumSteeringWheelAngleAmplitude,
-                             const double &wheelbase)
+                             const units::angle::radian_t &maximumSteeringWheelAngleAmplitude,
+                             const units::length::meter_t &wheelbase)
     {
         steeringController.SetVehicleParameter(steeringRatio,
                                                maximumSteeringWheelAngleAmplitude,
                                                wheelbase);
     }
-    void SetVelocityAndSteeringWheelAngle(const double &velocity,
-                                          const double &steeringWheelAngle)
+    void SetVelocityAndSteeringWheelAngle(const units::velocity::meters_per_second_t &velocity,
+                                          const units::angle::radian_t &steeringWheelAngle)
     {
         steeringController.SetVelocityAndSteeringWheelAngle(velocity, steeringWheelAngle);
     }
 
-    double GetDesiredSteeringWheelAngle() {return out_desiredSteeringWheelAngle;}
+    units::angle::radian_t GetDesiredSteeringWheelAngle() {return out_desiredSteeringWheelAngle;}
 };
 
diff --git a/sim/tests/unitTests/components/Algorithm_Longitudinal/algorithmLongitudinal_Tests.cpp b/sim/tests/unitTests/components/Algorithm_Longitudinal/algorithmLongitudinal_Tests.cpp
index 7701d0170144e584fb2528b4f7b699661e05cc3f..a6d84470db4e4ff4b6444767f41c3a79742b9e76 100644
--- a/sim/tests/unitTests/components/Algorithm_Longitudinal/algorithmLongitudinal_Tests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_Longitudinal/algorithmLongitudinal_Tests.cpp
@@ -1,6 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2019 AMFD GmbH
  *               2019 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -22,14 +23,16 @@ using ::testing::_;
 using ::testing::ReturnRef;
 using ::testing::DoubleEq;
 
+using namespace units::literals;
+
 /********************************************
  * CHECK GetEngineTorqueMax                 *
  ********************************************/
 
 struct DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax
 {
-    double      input_EngineSpeed;
-    double      result_EngineTorqueMax;
+    units::angular_velocity::revolutions_per_minute_t input_EngineSpeed;
+    units::torque::newton_meter_t result_EngineTorqueMax;
 
     /// \brief This stream will be shown in case the test fails
     friend std::ostream& operator<<(std::ostream& os, const DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax& obj)
@@ -51,16 +54,16 @@ TEST_P(AlgorithmLongitudinalCalculationsGetEngineTorqueMax, AlgorithmLongitudina
     DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax data = GetParam();
 
     // Set up test
-    VehicleModelParameters vehicleParameters;
-    vehicleParameters.properties = {{"MaximumEngineTorque", 270.},
-                                    {"MinimumEngineSpeed", 800.},
-                                    {"MaximumEngineSpeed", 4000.}};
+    mantle_api::VehicleProperties vehicleParameters;
+    vehicleParameters.properties = {{"MaximumEngineTorque", "270.0"},
+                                    {"MinimumEngineSpeed", "800.0"},
+                                    {"MaximumEngineSpeed", "4000.0"}};
 
     std::function<void (CbkLogLevel, const char*, int, const std::string&)> Log;
-    AlgorithmLongitudinalCalculations calculation{0.0, 0.0, vehicleParameters, Log};
+    AlgorithmLongitudinalCalculations calculation{0.0_mps, 0.0_mps_sq, vehicleParameters, Log};
 
     // Call test
-    double result = calculation.GetEngineTorqueMax(data.input_EngineSpeed);
+    auto result = calculation.GetEngineTorqueMax(data.input_EngineSpeed);
 
     // Evaluate result
     ASSERT_EQ(result, data.result_EngineTorqueMax);
@@ -69,21 +72,18 @@ TEST_P(AlgorithmLongitudinalCalculationsGetEngineTorqueMax, AlgorithmLongitudina
 /**********************************************************
  * The test data (must be defined below test)             *
  **********************************************************/
-INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqueMax,testing::Values
-(
-   /*
+INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqueMax, testing::Values(
+                                                                                          /*
         double      input_EngineSpeed;
         double      result_EngineTorqueMax;
    */
 
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{ 700., 170.},  // Speed below minimum
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{1000., 190.},  // Speed below minimum + 1000 but above minimum
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{5000., 230.},  // Speed above maximum
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{3500., 250.},  // Speed above maximum - 1000 but below maximum
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{3000., 270.}  // Speed within threshold
-)
-);
-
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{700._rpm, 170._Nm},  // Speed below minimum
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{1000._rpm, 190._Nm}, // Speed below minimum + 1000 but above minimum
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{5000._rpm, 230._Nm}, // Speed above maximum
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{3500._rpm, 250._Nm}, // Speed above maximum - 1000 but below maximum
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMax{3000._rpm, 270._Nm}  // Speed within threshold
+                                                                                          ));
 
 /********************************************
  * CHECK GetEngineTorqueMin                 *
@@ -91,8 +91,8 @@ INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqu
 
 struct DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin
 {
-    double      input_EngineSpeed;
-    double      result_EngineTorqueMax;
+    units::angular_velocity::revolutions_per_minute_t input_EngineSpeed;
+    units::torque::newton_meter_t result_EngineTorqueMax;
 
     /// \brief This stream will be shown in case the test fails
     friend std::ostream& operator<<(std::ostream& os, const DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin& obj)
@@ -114,17 +114,17 @@ TEST_P(AlgorithmLongitudinalCalculationsGetEngineTorqueMin, AlgorithmLongitudina
     DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin data = GetParam();
 
     // Set up test
-    VehicleModelParameters vehicleParameters;
-    vehicleParameters.properties = {{"MaximumEngineTorque", 270.},
-                                    {"MinimumEngineTorque", 30.},
-                                    {"MinimumEngineSpeed", 800.},
-                                    {"MaximumEngineSpeed", 4000.}};
+    mantle_api::VehicleProperties vehicleParameters;
+    vehicleParameters.properties = {{"MaximumEngineTorque", "270."},
+                                    {"MinimumEngineTorque", "30."},
+                                    {"MinimumEngineSpeed", "800."},
+                                    {"MaximumEngineSpeed", "4000."}};
 
     std::function<void (CbkLogLevel, const char*, int, const std::string&)> Log;
-    AlgorithmLongitudinalCalculations calculation{0.0, 0.0, vehicleParameters, Log};
+    AlgorithmLongitudinalCalculations calculation{0.0_mps, 0.0_mps_sq, vehicleParameters, Log};
 
     // Call test
-    double result = calculation.GetEngineTorqueMin(data.input_EngineSpeed);
+    auto result = calculation.GetEngineTorqueMin(data.input_EngineSpeed);
 
     // Evaluate result
     ASSERT_EQ(result, data.result_EngineTorqueMax);
@@ -133,19 +133,17 @@ TEST_P(AlgorithmLongitudinalCalculationsGetEngineTorqueMin, AlgorithmLongitudina
 /**********************************************************
  * The test data (must be defined below test)             *
  **********************************************************/
-INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqueMin,testing::Values
-(
-   /*
+INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqueMin, testing::Values(
+                                                                                          /*
         double      input_EngineSpeed;
         double      result_EngineTorqueMax;
    */
 
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin{5000., -23.},  // Speed above max engine speed
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin{3000., -27.},  // Speed within threshold
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin{ 700., -17.},  // Speed below minimum
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin{1000., -19.}  // Speed below minimum - 1000 but not below minimum
-)
-);
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin{5000._rpm, -23._Nm}, // Speed above max engine speed
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin{3000._rpm, -27._Nm}, // Speed within threshold
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin{700._rpm, -17._Nm},  // Speed below minimum
+                                                                                          DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueMin{1000._rpm, -19._Nm}  // Speed below minimum - 1000 but not below minimum
+                                                                                          ));
 
 /********************************************
  * CHECK GetAccFromEngineTorque             *
@@ -153,9 +151,9 @@ INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqu
 
 struct DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque
 {
-    double      input_EngineTorque;
+    units::torque::newton_meter_t input_EngineTorque;
     int         input_ChosenGear;
-    double      result_AccelerationFromEngineTorque;
+    units::acceleration::meters_per_second_squared_t result_AccelerationFromEngineTorque;
 
     /// \brief This stream will be shown in case the test fails
     friend std::ostream& operator<<(std::ostream& os, const DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque& obj)
@@ -178,23 +176,23 @@ TEST_P(AlgorithmLongitudinalCalculationsGetAccFromEngineTorque, AlgorithmLongitu
     DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque data = GetParam();
 
     // Set up test
-    VehicleModelParameters vehicleParameters;
-    vehicleParameters.properties = {{"AxleRatio", 2.8},
-                                    {"GearRatio0", 0},
-                                    {"GearRatio1", 4.1},
-                                    {"GearRatio2", 2.5},
-                                    {"GearRatio3", 1.4},
-                                    {"GearRatio4", 1.},
-                                    {"GearRatio5", .9},
-                                    {"GearRatio6", .7},
-                                    {"Mass", 800}};
-    vehicleParameters.rearAxle.wheelDiameter = 0.7;
+    mantle_api::VehicleProperties vehicleParameters;
+    vehicleParameters.properties = {{"AxleRatio", "2.8"},
+                                    {"GearRatio0", "0"},
+                                    {"GearRatio1", "4.1"},
+                                    {"GearRatio2", "2.5"},
+                                    {"GearRatio3", "1.4"},
+                                    {"GearRatio4", "1"},
+                                    {"GearRatio5", ".9"},
+                                    {"GearRatio6", ".7"}};
+    vehicleParameters.mass = 800._kg;
+    vehicleParameters.rear_axle.wheel_diameter = 0.7_m;
 
     std::function<void (CbkLogLevel, const char*, int, const std::string&)> Log;
-    AlgorithmLongitudinalCalculations calculation{0.0, 0.0, vehicleParameters, Log};
+    AlgorithmLongitudinalCalculations calculation{0.0_mps, 0.0_mps_sq, vehicleParameters, Log};
 
     // Call test
-    double result = calculation.GetAccFromEngineTorque(data.input_EngineTorque, data.input_ChosenGear);
+    auto result = calculation.GetAccFromEngineTorque(data.input_EngineTorque, data.input_ChosenGear);
 
     // Evaluate result
     ASSERT_EQ(result, data.result_AccelerationFromEngineTorque);
@@ -203,20 +201,18 @@ TEST_P(AlgorithmLongitudinalCalculationsGetAccFromEngineTorque, AlgorithmLongitu
 /**********************************************************
  * The test data (must be defined below test)             *
  **********************************************************/
-INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetAccFromEngineTorque,testing::Values
-(
-   /*
+INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetAccFromEngineTorque, testing::Values(
+                                                                                              /*
         double      input_EngineTorque;
         int         input_ChosenGear;
         double      result_AccelerationFromEngineTorque;
    */
 
-    DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque{  0., 0,  0.},  // No Torque
-    DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque{100., 4,  1.},  // Normal, 4th gear
-    DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque{200., 0,  0.},  // Neutral gear
-    DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque{300., 5, 2.7}  // Normal, 5th gear
-)
-);
+                                                                                              DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque{0._Nm, 0, 0._mps_sq},   // No Torque
+                                                                                              DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque{100._Nm, 4, 1._mps_sq}, // Normal, 4th gear
+                                                                                              DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque{200._Nm, 0, 0._mps_sq}, // Neutral gear
+                                                                                              DataFor_AlgorithmLongitudinalCalculations_GetAccFromEngineTorque{300._Nm, 5, 2.7_mps_sq} // Normal, 5th gear
+                                                                                              ));
 
 /********************************************
  * CHECK GetEngineSpeedByVelocity           *
@@ -224,8 +220,8 @@ INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetAccFromEngi
 
 struct DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity
 {
-    double      input_Velocity;
-    double      result_EngineSpeed;
+    units::velocity::meters_per_second_t input_Velocity;
+    units::angular_velocity::revolutions_per_minute_t result_EngineSpeed;
 
     /// \brief This stream will be shown in case the test fails
     friend std::ostream& operator<<(std::ostream& os, const DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity& obj)
@@ -247,22 +243,22 @@ TEST_P(AlgorithmLongitudinalCalculationsGetEngineSpeedByVelocity, AlgorithmLongi
     DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity data = GetParam();
 
     // Set up tests
-    VehicleModelParameters vehicleParameters;
-    vehicleParameters.properties = {{"AxleRatio", 1},
-                                    {"GearRatio1", 4.1},
-                                    {"GearRatio2", 2.5},
-                                    {"GearRatio3", 1.4},
-                                    {"GearRatio4", 1.},
-                                    {"GearRatio5", .9},
-                                    {"GearRatio6", .7},
-                                    {"Mass", 800}};
-    vehicleParameters.rearAxle.wheelDiameter = 0.5;
+    mantle_api::VehicleProperties vehicleParameters;
+    vehicleParameters.properties = {{"AxleRatio", "1"},
+                                    {"GearRatio1", "4.1"},
+                                    {"GearRatio2", "2.5"},
+                                    {"GearRatio3", "1.4"},
+                                    {"GearRatio4", "1.0"},
+                                    {"GearRatio5", ".9"},
+                                    {"GearRatio6", ".7"}};
+    vehicleParameters.mass = 800._kg;
+    vehicleParameters.rear_axle.wheel_diameter = 0.5_m;
 
     std::function<void (CbkLogLevel, const char*, int, const std::string&)> Log;
-    AlgorithmLongitudinalCalculations calculation{0.0, 0.0, vehicleParameters, Log};
+    AlgorithmLongitudinalCalculations calculation{0.0_mps, 0.0_mps_sq, vehicleParameters, Log};
 
     // Call test
-    double result = calculation.GetEngineSpeedByVelocity(data.input_Velocity, 4) * 2 * M_PI;
+    auto result = calculation.GetEngineSpeedByVelocity(data.input_Velocity, 4) * 2 * M_PI;
 
     // Evaluate result
     ASSERT_EQ(result, data.result_EngineSpeed);
@@ -271,18 +267,13 @@ TEST_P(AlgorithmLongitudinalCalculationsGetEngineSpeedByVelocity, AlgorithmLongi
 /**********************************************************
  * The test data (must be defined below test)             *
  **********************************************************/
-INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineSpeedByVelocity,testing::Values
-(
-   /*
+INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineSpeedByVelocity, testing::Values(
+                                                                                                /*
         double      input_Velocity;
         double      result_EngineSpeed;
    */
 
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity{0., 0.},
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity{50., 12000.},
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity{20., 4800.}
-)
-);
+                                                                                                DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity{0._mps, 0._rpm}, DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity{50._mps, 12000._rpm}, DataFor_AlgorithmLongitudinalCalculations_GetEngineSpeedByVelocity{20._mps, 4800._rpm}));
 
 /********************************************
  * CHECK GetEngineTorqueAtGear              *
@@ -290,9 +281,9 @@ INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineSpeed
 
 struct DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear
 {
-    double      input_Acceleration;
+    units::acceleration::meters_per_second_squared_t input_Acceleration;
     int         input_Gear;
-    double      result_TorqueAtGear;
+    units::torque::newton_meter_t result_TorqueAtGear;
 
     /// \brief This stream will be shown in case the test fails
     friend std::ostream& operator<<(std::ostream& os, const DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear& obj)
@@ -315,23 +306,23 @@ TEST_P(AlgorithmLongitudinalCalculationsGetEngineTorqueAtGear, AlgorithmLongitud
     DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear data = GetParam();
 
     // Set up tests
-    VehicleModelParameters vehicleParameters;
-    vehicleParameters.properties = {{"AxleRatio", 1.},
-                                    {"GearRatio1", 4.1},
-                                    {"GearRatio2", 2.5},
-                                    {"GearRatio3", 1.4},
-                                    {"GearRatio4", 1.},
-                                    {"GearRatio5", .9},
-                                    {"GearRatio6", .7},
-                                    {"NumberOfGears", 6},
-                                    {"Mass", 500}};
-    vehicleParameters.rearAxle.wheelDiameter = 0.5;
+    mantle_api::VehicleProperties vehicleParameters;
+    vehicleParameters.properties = {{"AxleRatio", "1.0"},
+                                    {"GearRatio1", "4.1"},
+                                    {"GearRatio2", "2.5"},
+                                    {"GearRatio3", "1.4"},
+                                    {"GearRatio4", "1.0"},
+                                    {"GearRatio5", "0.9"},
+                                    {"GearRatio6", "0.7"},
+                                    {"NumberOfGears", "6"}};
+    vehicleParameters.mass = 500._kg;
+    vehicleParameters.rear_axle.wheel_diameter = 0.5_m;
 
     std::function<void (CbkLogLevel, const char*, int, const std::string&)> Log;
-    AlgorithmLongitudinalCalculations calculation{0.0, 0.0, vehicleParameters, Log};
+    AlgorithmLongitudinalCalculations calculation{0.0_mps, 0.0_mps_sq, vehicleParameters, Log};
 
     // Call test
-    double result = calculation.GetEngineTorqueAtGear(data.input_Gear, data.input_Acceleration);
+    auto result = calculation.GetEngineTorqueAtGear(data.input_Gear, data.input_Acceleration);
 
     // Evaluate result
     ASSERT_EQ(result, data.result_TorqueAtGear);
@@ -340,20 +331,18 @@ TEST_P(AlgorithmLongitudinalCalculationsGetEngineTorqueAtGear, AlgorithmLongitud
 /**********************************************************
  * The test data (must be defined below test)             *
  **********************************************************/
-INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqueAtGear,testing::Values
-(
-   /*
+INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqueAtGear, testing::Values(
+                                                                                             /*
         double      input_Acceleration;
         int         input_Gear;
         double      result_TorqueAtGear;
    */
 
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear{0., 1, 0.},  // No acceleration
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear{1., 0, 0.},  // Neutral gear
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear{1., 4, 125.}, // Normal, gear ratio 1.
-    DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear{1., 2, 50.} // Normal, gear ratio 2.5
-)
-);
+                                                                                             DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear{0._mps_sq, 1, 0._Nm},   // No acceleration
+                                                                                             DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear{1._mps_sq, 0, 0._Nm},   // Neutral gear
+                                                                                             DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear{1._mps_sq, 4, 125._Nm}, // Normal, gear ratio 1.
+                                                                                             DataFor_AlgorithmLongitudinalCalculations_GetEngineTorqueAtGear{1._mps_sq, 2, 50._Nm}   // Normal, gear ratio 2.5
+                                                                                             ));
 
 /********************************************
  * CHECK PedalPosition                      *
@@ -361,8 +350,8 @@ INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsGetEngineTorqu
 
 struct DataFor_AlgorithmLongitudinalCalculations_PedalPosition
 {
-    double      input_Acceleration;
-    double      engineTorqueMax;
+    units::acceleration::meters_per_second_squared_t input_Acceleration;
+    units::torque::newton_meter_t engineTorqueMax;
     double      result_AcceleratorPedalPosition;
     double      result_BrakePedalPosition;
 
@@ -388,18 +377,18 @@ TEST_P(AlgorithmLongitudinalCalculationsPedalPosition, AlgorithmLongitudinalCalc
     DataFor_AlgorithmLongitudinalCalculations_PedalPosition data = GetParam();
 
     // Set up test
-    VehicleModelParameters vehicleParameters;
-    vehicleParameters.properties = {{"AxleRatio", 1},
-                                    {"GearRatio1", 1},
-                                    {"NumberOfGears", 1},
-                                    {"MaximumEngineTorque", data.engineTorqueMax},
-                                    {"MinimumEngineSpeed", -10000},
-                                    {"MaximumEngineSpeed", 10000},
-                                    {"Mass", 1000}};
-    vehicleParameters.rearAxle.wheelDiameter = 2.;
+    mantle_api::VehicleProperties vehicleParameters;
+    vehicleParameters.properties = {{"AxleRatio", "1"},
+                                    {"GearRatio1", "1"},
+                                    {"NumberOfGears", "1"},
+                                    {"MaximumEngineTorque", std::to_string(data.engineTorqueMax.value())},
+                                    {"MinimumEngineSpeed", "-10000"},
+                                    {"MaximumEngineSpeed", " 10000"}};
+    vehicleParameters.mass = 1000._kg;
+    vehicleParameters.rear_axle.wheel_diameter = 2._m;
 
     std::function<void (CbkLogLevel, const char*, int, const std::string&)> Log;
-    AlgorithmLongitudinalCalculations calculation{0.0, data.input_Acceleration, vehicleParameters, Log};
+    AlgorithmLongitudinalCalculations calculation{0.0_mps, data.input_Acceleration, vehicleParameters, Log};
 
     // Call test
     calculation.CalculatePedalPositions();
@@ -414,30 +403,19 @@ TEST_P(AlgorithmLongitudinalCalculationsPedalPosition, AlgorithmLongitudinalCalc
 /**********************************************************
  * The test data (must be defined below test)             *
  **********************************************************/
-INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsPedalPosition,testing::Values
-(
-   /*
+INSTANTIATE_TEST_CASE_P(Default, AlgorithmLongitudinalCalculationsPedalPosition, testing::Values(
+                                                                                     /*
              double      input_Acceleration;
              double      engineTorqueMax;
              double      result_AcceleratorPedalPosition;
              double      result_BrakePedalPosition;
    */
 
-    DataFor_AlgorithmLongitudinalCalculations_PedalPosition{  // Brake
-                            -5.005,
-                            1000.0,
-                            0.0, 0.5},
-    DataFor_AlgorithmLongitudinalCalculations_PedalPosition{  // Decelerate, no brake
-                            -0.05,
-                            1000.0,
-                            50. / 1100.0, 0.0},
-    DataFor_AlgorithmLongitudinalCalculations_PedalPosition{  // No Acceleration
-                            0.0,
-                            2000.0,
-                            200.0 / 2200.0, 0.0},
-    DataFor_AlgorithmLongitudinalCalculations_PedalPosition{  // Accelerate
-                            1.5,
-                            2000.0,
-                            1700.0 / 2200.0, 0.0}
-)
-);
+                                                                                     DataFor_AlgorithmLongitudinalCalculations_PedalPosition{// Brake
+                                                                                                                                             -5.005_mps_sq, 1000.0_Nm, 0.0, 0.5},
+                                                                                     DataFor_AlgorithmLongitudinalCalculations_PedalPosition{// Decelerate, no brake
+                                                                                                                                             -0.05_mps_sq, 1000.0_Nm, 50. / 1100.0, 0.0},
+                                                                                     DataFor_AlgorithmLongitudinalCalculations_PedalPosition{// No Acceleration
+                                                                                                                                             0.0_mps_sq, 2000.0_Nm, 200.0 / 2200.0, 0.0},
+                                                                                     DataFor_AlgorithmLongitudinalCalculations_PedalPosition{// Accelerate
+                                                                                                                                             1.5_mps_sq, 2000.0_Nm, 1700.0 / 2200.0, 0.0}));
diff --git a/sim/tests/unitTests/components/ComponentController/componentController_Tests.cpp b/sim/tests/unitTests/components/ComponentController/componentController_Tests.cpp
index b3f44fe8b6c0400dded813580e8200afc09a1579..22fbe7a44a6ae7d9af00c6dd28a2aeba140b20a4 100644
--- a/sim/tests/unitTests/components/ComponentController/componentController_Tests.cpp
+++ b/sim/tests/unitTests/components/ComponentController/componentController_Tests.cpp
@@ -14,7 +14,6 @@
 
 #include "dontCare.h"
 #include "fakeCallback.h"
-#include "fakeEventNetwork.h"
 #include "fakeAgent.h"
 
 #include "condition.h"
@@ -22,7 +21,6 @@
 #include "componentControllerImpl.h"
 #include "common/agentCompToCompCtrlSignal.h"
 #include "common/compCtrlToAgentCompSignal.h"
-#include "common/events/componentStateChangeEvent.h"
 
 using ::testing::_;
 using ::testing::DontCare;
@@ -36,7 +34,6 @@ using namespace ComponentControl;
 TEST(ComponentController_UpdateOutput, HasComponentWarningSignal_ForwardsWarningToDriver)
 {
     NiceMock<FakeAgent> fakeAgent;
-    NiceMock<FakeEventNetwork> fakeEventNetwork;
     ComponentControllerImplementation componentController{DontCare<std::string>(),
                                                           DontCare<bool>(),
                                                           DontCare<int>(),
@@ -49,7 +46,7 @@ TEST(ComponentController_UpdateOutput, HasComponentWarningSignal_ForwardsWarning
                                                           nullptr,
                                                           nullptr,
                                                           &fakeAgent,
-                                                          &fakeEventNetwork};
+                                                          nullptr};
 
     // register linkId 0 as an undefined component in statemanager
     const int testLinkId = 0;
@@ -155,8 +152,8 @@ TEST(StateManager_GetMaxReachableStateOfComponentAtLocalLinkId, ComponentStateEq
     componentStateInformation->AddStateCondition(std::move(componentStateEquality), ComponentState::Acting);
     stateManager.AddComponent(localLinkId, componentStateInformation);
 
-    std::vector<const openpass::events::ComponentStateChangeEvent *> placeholderEventList {};
-    stateManager.UpdateMaxReachableStatesForRegisteredComponents(placeholderEventList);
+    std::vector<std::pair<std::string, ComponentState>> componentStates{};
+    stateManager.UpdateMaxReachableStatesForRegisteredComponents(componentStates);
 
     ASSERT_EQ(stateManager.GetMaxReachableStateOfComponentAtLocalLinkId(localLinkId), ComponentState::Acting);
 }
@@ -176,8 +173,8 @@ TEST(StateManager_GetMaxReachableStateOfComponentAtLocalLinkId, ComponentStateEq
     componentStateInformation->AddStateCondition(std::move(componentStateEquality), ComponentState::Acting);
     stateManager.AddComponent(localLinkId, componentStateInformation);
 
-    std::vector<const openpass::events::ComponentStateChangeEvent *> placeholderEventList {};
-    stateManager.UpdateMaxReachableStatesForRegisteredComponents(placeholderEventList);
+    std::vector<std::pair<std::string, ComponentState>> componentStates{};
+    stateManager.UpdateMaxReachableStatesForRegisteredComponents(componentStates);
 
     ASSERT_EQ(stateManager.GetMaxReachableStateOfComponentAtLocalLinkId(localLinkId), ComponentState::Undefined);
 }
@@ -209,13 +206,13 @@ TEST(StateManager_GetMaxReachableStateOfComponentAtLocalLinkId, TwoConditionsFul
     stateManager.AddComponent(localLinkIdA, testComponentAStateInformation);
     stateManager.AddComponent(localLinkIdB, testComponentBStateInformation);
 
-    std::vector<const openpass::events::ComponentStateChangeEvent *> placeholderEventList {};
-    stateManager.UpdateMaxReachableStatesForRegisteredComponents(placeholderEventList);
+    std::vector<std::pair<std::string, ComponentState>> componentStates{};
+    stateManager.UpdateMaxReachableStatesForRegisteredComponents(componentStates);
 
     ASSERT_EQ(stateManager.GetMaxReachableStateOfComponentAtLocalLinkId(localLinkIdA), ComponentState::Armed);
 }
 
-TEST(StateManager_GetMaxReachableStateOfComponentAtLocalLinkId, ComponentMaxStateSetByEvent_ConditionsIgnored)
+TEST(StateManager_GetMaxReachableStateOfComponentAtLocalLinkId, ComponentMaxStateSetByCommand_ConditionsIgnored)
 {
     const std::string componentName = "TestComponent";
     const int localLinkId = 0;
@@ -238,16 +235,8 @@ TEST(StateManager_GetMaxReachableStateOfComponentAtLocalLinkId, ComponentMaxStat
     openpass::type::AffectedEntities affected {};
     affected.entities.push_back(agentId);
 
-    auto event = std::make_unique<openpass::events::ComponentStateChangeEvent const>(0,
-                                                                   "",
-                                                                   "",
-                                                                triggering,
-                                                                   affected,
-                                                                   componentName,
-                                                                   ComponentState::Disabled);
-    std::vector<const openpass::events::ComponentStateChangeEvent *> placeholderEventList {};
-    placeholderEventList.push_back(event.get());
-    stateManager.UpdateMaxReachableStatesForRegisteredComponents(placeholderEventList);
+    std::vector<std::pair<std::string, ComponentState>> componentStates = {{componentName, ComponentState::Disabled}};
+    stateManager.UpdateMaxReachableStatesForRegisteredComponents(componentStates);
 
     ASSERT_EQ(stateManager.GetMaxReachableStateOfComponentAtLocalLinkId(localLinkId), ComponentState::Disabled);
 }
diff --git a/sim/tests/unitTests/components/Dynamics_Collision/dynamicsCollision_Tests.cpp b/sim/tests/unitTests/components/Dynamics_Collision/dynamicsCollision_Tests.cpp
index 695f1c2c3a9c3fb6654270c0fd08fb2aa077415c..a6dd7efc946d8788826ea37c0cf337bdd225a282 100644
--- a/sim/tests/unitTests/components/Dynamics_Collision/dynamicsCollision_Tests.cpp
+++ b/sim/tests/unitTests/components/Dynamics_Collision/dynamicsCollision_Tests.cpp
@@ -1,5 +1,5 @@
 /********************************************************************************
- * Copyright (c) 2019-2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2019-2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -27,13 +27,13 @@ class DynamicsCollision_Test : public ::testing::Test
 public:
     DynamicsCollision_Test()
     {
-        heavyVehicle.properties = {{"Mass", 2000.0}};
-        lightVehicle.properties = {{"Mass", 1000.0}};
+        heavyVehicle->mass = 2000.0_kg;
+        lightVehicle->mass = 1000.0_kg;
     }
 
 protected:
-    VehicleModelParameters heavyVehicle;
-    VehicleModelParameters lightVehicle;
+    std::shared_ptr<mantle_api::VehicleProperties> heavyVehicle = std::make_shared<mantle_api::VehicleProperties>();
+    std::shared_ptr<mantle_api::VehicleProperties> lightVehicle = std::make_shared<mantle_api::VehicleProperties>();
 };
 
 TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOnlyInXDirection)
@@ -43,14 +43,14 @@ TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOnlyInXDirection)
     std::pair<ObjectTypeOSI,int> pair0 = std::make_pair(ObjectTypeOSI::Vehicle, 0);
     std::pair<ObjectTypeOSI,int> pair1 = std::make_pair(ObjectTypeOSI::Vehicle, 1);
 
-    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{40.0, 0.0}));
-    ON_CALL(agent, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{40.0_mps, 0.0_mps}));
+    ON_CALL(agent, GetYaw()).WillByDefault(Return(0.0_rad));
     ON_CALL(agent, GetVehicleModelParameters()).WillByDefault(Return(heavyVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersAgent {pair1};
     ON_CALL(agent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersAgent));
 
-    ON_CALL(opponent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{10.0, 0.0}));
-    ON_CALL(opponent, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(opponent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{10.0_mps, 0.0_mps}));
+    ON_CALL(opponent, GetYaw()).WillByDefault(Return(0.0_rad));
     ON_CALL(opponent, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersOpponent {pair0};
     ON_CALL(opponent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersOpponent));
@@ -75,8 +75,8 @@ TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOnlyInXDirection)
 
     dynamicsCollision.Trigger(0);
 
-    ASSERT_THAT(dynamicsCollision.GetVelocity(), DoubleNear(30.0, 1e-3));
-    ASSERT_THAT(dynamicsCollision.GetMovingDirection(), DoubleNear(0.0, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetVelocity().value(), DoubleNear(30.0, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetMovingDirection().value(), DoubleNear(0.0, 1e-3));
 }
 
 TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOrthogonal)
@@ -86,14 +86,14 @@ TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOrthogonal)
     std::pair<ObjectTypeOSI,int> pair0 = std::make_pair(ObjectTypeOSI::Vehicle, 0);
     std::pair<ObjectTypeOSI,int> pair1 = std::make_pair(ObjectTypeOSI::Vehicle, 1);
 
-    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{40.0, 0.0}));
-    ON_CALL(agent, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{40.0_mps, 0.0_mps}));
+    ON_CALL(agent, GetYaw()).WillByDefault(Return(0.0_rad));
     ON_CALL(agent, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersAgent {pair1};
     ON_CALL(agent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersAgent));
 
-    ON_CALL(opponent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{0.0, 40.0}));
-    ON_CALL(opponent, GetYaw()).WillByDefault(Return(0.5 * M_PI));
+    ON_CALL(opponent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{0.0_mps, 40.0_mps}));
+    ON_CALL(opponent, GetYaw()).WillByDefault(Return(90_deg));
     ON_CALL(opponent, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersOpponent {pair0};
     ON_CALL(opponent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersOpponent));
@@ -119,8 +119,8 @@ TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOrthogonal)
     dynamicsCollision.Trigger(0);
 
     double expectedVelocity = 20.0 * std::sqrt(2);
-    ASSERT_THAT(dynamicsCollision.GetVelocity(), DoubleNear(expectedVelocity, 1e-3));
-    ASSERT_THAT(dynamicsCollision.GetMovingDirection(), DoubleNear(0.25 * M_PI, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetVelocity().value(), DoubleNear(expectedVelocity, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetMovingDirection().value(), DoubleNear(0.25 * M_PI, 1e-3));
 }
 
 TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOpposingDirections)
@@ -130,14 +130,14 @@ TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOpposingDirections)
     std::pair<ObjectTypeOSI,int> pair0 = std::make_pair(ObjectTypeOSI::Vehicle, 0);
     std::pair<ObjectTypeOSI,int> pair1 = std::make_pair(ObjectTypeOSI::Vehicle, 1);
 
-    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{-10.0 * M_SQRT2, -10.0 * M_SQRT2}));
-    ON_CALL(agent, GetYaw()).WillByDefault(Return(1.25 * M_PI));
+    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{units::velocity::meters_per_second_t{-10.0 * M_SQRT2, -10.0 * M_SQRT2}}));
+    ON_CALL(agent, GetYaw()).WillByDefault(Return(225_deg));
     ON_CALL(agent, GetVehicleModelParameters()).WillByDefault(Return(heavyVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersAgent {pair1};
     ON_CALL(agent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersAgent));
 
-    ON_CALL(opponent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{20.0 * M_SQRT2, 20.0 * M_SQRT2}));
-    ON_CALL(opponent, GetYaw()).WillByDefault(Return(0.25 * M_PI));
+    ON_CALL(opponent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{units::velocity::meters_per_second_t{20.0 * M_SQRT2, 20.0 * M_SQRT2}}));
+    ON_CALL(opponent, GetYaw()).WillByDefault(Return(45_deg));
     ON_CALL(opponent, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersOpponent {pair0};
     ON_CALL(opponent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersOpponent));
@@ -162,7 +162,7 @@ TEST_F(DynamicsCollision_Test, CollisionOfTwoAgentsOpposingDirections)
 
     dynamicsCollision.Trigger(0);
 
-    ASSERT_NEAR(dynamicsCollision.GetVelocity(), 0.0, 1e-9);
+    ASSERT_NEAR(dynamicsCollision.GetVelocity().value(), 0.0, 1e-9);
 }
 
 TEST_F(DynamicsCollision_Test, CollisionOfThreeAgentsOnlyInXDirection)
@@ -174,20 +174,20 @@ TEST_F(DynamicsCollision_Test, CollisionOfThreeAgentsOnlyInXDirection)
     std::pair<ObjectTypeOSI,int> pair1 = std::make_pair(ObjectTypeOSI::Vehicle, 1);
     std::pair<ObjectTypeOSI,int> pair2 = std::make_pair(ObjectTypeOSI::Vehicle, 2);
 
-    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{40.0, 0.0}));
-    ON_CALL(agent, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{40.0_mps, 0.0_mps}));
+    ON_CALL(agent, GetYaw()).WillByDefault(Return(0.0_rad));
     ON_CALL(agent, GetVehicleModelParameters()).WillByDefault(Return(heavyVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersAgent {pair1, pair2};
     ON_CALL(agent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersAgent));
 
-    ON_CALL(opponent1, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{20.0, 0.0}));
-    ON_CALL(opponent1, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(opponent1, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{20.0_mps, 0.0_mps}));
+    ON_CALL(opponent1, GetYaw()).WillByDefault(Return(0.0_rad));
     ON_CALL(opponent1, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersOpponent1 {pair0, pair2};
     ON_CALL(opponent1, GetCollisionPartners()).WillByDefault(Return(collisionPartnersOpponent1));
 
-    ON_CALL(opponent2, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{0.0, 0.0}));
-    ON_CALL(opponent2, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(opponent2, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{0.0_mps, 0.0_mps}));
+    ON_CALL(opponent2, GetYaw()).WillByDefault(Return(0.0_rad));
     ON_CALL(opponent2, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersOpponent2 {pair1, pair0};
     ON_CALL(opponent2, GetCollisionPartners()).WillByDefault(Return(collisionPartnersOpponent2));
@@ -213,8 +213,8 @@ TEST_F(DynamicsCollision_Test, CollisionOfThreeAgentsOnlyInXDirection)
 
     dynamicsCollision.Trigger(0);
 
-    ASSERT_THAT(dynamicsCollision.GetVelocity(), DoubleNear(25.0, 1e-3));
-    ASSERT_THAT(dynamicsCollision.GetMovingDirection(), DoubleNear(0.0, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetVelocity().value(), DoubleNear(25.0, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetMovingDirection().value(), DoubleNear(0.0, 1e-3));
 }
 
 TEST_F(DynamicsCollision_Test, CollisionOfThreeAgentsInDifferentDirections)
@@ -226,20 +226,20 @@ TEST_F(DynamicsCollision_Test, CollisionOfThreeAgentsInDifferentDirections)
     std::pair<ObjectTypeOSI,int> pair1 = std::make_pair(ObjectTypeOSI::Vehicle, 1);
     std::pair<ObjectTypeOSI,int> pair2 = std::make_pair(ObjectTypeOSI::Vehicle, 2);
 
-    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{0.0, -30.0}));
-    ON_CALL(agent, GetYaw()).WillByDefault(Return(-0.5 * M_PI));
+    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{0.0_mps, -30.0_mps}));
+    ON_CALL(agent, GetYaw()).WillByDefault(Return(-90_deg));
     ON_CALL(agent, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersAgent {pair1, pair2};
     ON_CALL(agent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersAgent));
 
-    ON_CALL(opponent1, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{30.0, -30.0}));
-    ON_CALL(opponent1, GetYaw()).WillByDefault(Return(-0.25 * M_PI));
+    ON_CALL(opponent1, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{30.0_mps, -30.0_mps}));
+    ON_CALL(opponent1, GetYaw()).WillByDefault(Return(-45_deg));
     ON_CALL(opponent1, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersOpponent1 {pair0, pair2};
     ON_CALL(opponent1, GetCollisionPartners()).WillByDefault(Return(collisionPartnersOpponent1));
 
-    ON_CALL(opponent2, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{30.0, 0.0}));
-    ON_CALL(opponent2, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(opponent2, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{30.0_mps, 0.0_mps}));
+    ON_CALL(opponent2, GetYaw()).WillByDefault(Return(0.0_deg));
     ON_CALL(opponent2, GetVehicleModelParameters()).WillByDefault(Return(lightVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersOpponent2 {pair1, pair0};
     ON_CALL(opponent2, GetCollisionPartners()).WillByDefault(Return(collisionPartnersOpponent2));
@@ -266,8 +266,8 @@ TEST_F(DynamicsCollision_Test, CollisionOfThreeAgentsInDifferentDirections)
     dynamicsCollision.Trigger(0);
 
     double expectedVelocity = 20.0 * std::sqrt(2);
-    ASSERT_THAT(dynamicsCollision.GetVelocity(), DoubleNear(expectedVelocity, 1e-3));
-    ASSERT_THAT(dynamicsCollision.GetMovingDirection(), DoubleNear(-0.25 * M_PI, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetVelocity().value(), DoubleNear(expectedVelocity, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetMovingDirection().value(), DoubleNear(-0.25 * M_PI, 1e-3));
 }
 
 TEST_F(DynamicsCollision_Test, CollisionOfAgentWithFixedObject)
@@ -275,8 +275,8 @@ TEST_F(DynamicsCollision_Test, CollisionOfAgentWithFixedObject)
     NiceMock<FakeAgent> agent;
     std::pair<ObjectTypeOSI,int> pair = std::make_pair(ObjectTypeOSI::Object, 0);
 
-    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{40.0, 0.0}));
-    ON_CALL(agent, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(agent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{40.0_mps, 0.0_mps}));
+    ON_CALL(agent, GetYaw()).WillByDefault(Return(0.0_deg));
     ON_CALL(agent, GetVehicleModelParameters()).WillByDefault(Return(heavyVehicle));
     std::vector<std::pair<ObjectTypeOSI,int>> collisionPartnersAgent {pair};
     ON_CALL(agent, GetCollisionPartners()).WillByDefault(Return(collisionPartnersAgent));
@@ -300,7 +300,7 @@ TEST_F(DynamicsCollision_Test, CollisionOfAgentWithFixedObject)
 
     dynamicsCollision.Trigger(0);
 
-    ASSERT_THAT(dynamicsCollision.GetVelocity(), DoubleNear(0.0, 1e-3));
+    ASSERT_THAT(dynamicsCollision.GetVelocity().value(), DoubleNear(0.0, 1e-3));
 }
 
 
diff --git a/sim/tests/unitTests/components/Dynamics_TF/dynamicsTF_Tests.cpp b/sim/tests/unitTests/components/Dynamics_TF/dynamicsTF_Tests.cpp
index d36030d1a55af1a753a4bfa8dcbd364daf4730ce..52cd4ba0c094c6f47aa8dc30c6567778fb658a1f 100644
--- a/sim/tests/unitTests/components/Dynamics_TF/dynamicsTF_Tests.cpp
+++ b/sim/tests/unitTests/components/Dynamics_TF/dynamicsTF_Tests.cpp
@@ -15,7 +15,6 @@
 #include "fakeAgent.h"
 #include "fakeParameter.h"
 #include "trajectoryTester.h"
-#include "common/trajectorySignal.h"
 
 using ::testing::Return;
 using ::testing::ReturnRef;
@@ -26,42 +25,53 @@ using ::testing::DontCare;
 using ::testing::DoubleNear;
 
 static void AssertDynamicsSignalEquality(std::shared_ptr<DynamicsSignal const> signal,
-                                         double x,
-                                         double y,
-                                         double yaw,
-                                         double yawRate,
-                                         double yawAcceleration,
-                                         double velocity,
-                                         double acceleration,
-                                         double distance)
+                                         units::length::meter_t x,
+                                         units::length::meter_t y,
+                                         units::angle::radian_t yaw,
+                                         units::angular_velocity::radians_per_second_t yawRate,
+                                         units::angular_acceleration::radians_per_second_squared_t yawAcceleration,
+                                         units::velocity::meters_per_second_t velocity,
+                                         units::acceleration::meters_per_second_squared_t acceleration,
+                                         units::length::meter_t distance)
 {
-    ASSERT_THAT(signal->positionX, DoubleNear(x, 1e-3));
-    ASSERT_THAT(signal->positionY, DoubleNear(y, 1e-3));
-    ASSERT_THAT(signal->yaw, DoubleNear(yaw, 1e-3));
-    ASSERT_THAT(signal->yawRate, DoubleNear(yawRate, 1e-3));
-    ASSERT_THAT(signal->yawAcceleration, DoubleNear(yawAcceleration, 1e-3));
-    ASSERT_THAT(signal->velocity, DoubleNear(velocity, 1e-3));
-    ASSERT_THAT(signal->acceleration, DoubleNear(acceleration, 1e-3));
-    ASSERT_THAT(signal->travelDistance, DoubleNear(distance, 1e-3));
+    ASSERT_THAT(signal->dynamicsInformation.positionX.value(), DoubleNear(x.value(), 1e-3));
+    ASSERT_THAT(signal->dynamicsInformation.positionY.value(), DoubleNear(y.value(), 1e-3));
+    ASSERT_THAT(signal->dynamicsInformation.yaw.value(), DoubleNear(yaw.value(), 1e-3));
+    ASSERT_THAT(signal->dynamicsInformation.yawRate.value(), DoubleNear(yawRate.value(), 1e-3));
+    ASSERT_THAT(signal->dynamicsInformation.yawAcceleration.value(), DoubleNear(yawAcceleration.value(), 1e-3));
+    ASSERT_THAT(signal->dynamicsInformation.velocity.value(), DoubleNear(velocity.value(), 1e-3));
+    ASSERT_THAT(signal->dynamicsInformation.acceleration.value(), DoubleNear(acceleration.value(), 1e-3));
+    ASSERT_THAT(signal->dynamicsInformation.travelDistance.value(), DoubleNear(distance.value(), 1e-3));
 }
 
 TEST(TrajectoryFollowerImplementation_WithoutExternalAcceleration_Unittests, DeactivationAfterEndOfTrajectory)
 {
-    TrajectoryPoint fakePosition1{0, 0, 0, 0};
-    TrajectoryPoint fakePosition2{0.1, 0, 2, 0.1};
-    TrajectoryPoint fakePosition3{0.2, 0, 4, 0.1};
+    mantle_api::Pose fakePose1{{0_m, 0_m, 0_m}, {0_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose2{{0_m, 2_m, 0_m}, {0.1_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose3{{0_m, 4_m, 0_m}, {0.31_rad, 0_rad, 0_rad}};
 
-    Trajectory fakeCoordinates = {{fakePosition1, fakePosition2, fakePosition3}, ""};
+    mantle_api::PolyLinePoint fakePolyLinePoint1{fakePose1, 0_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint2{fakePose2, 0.1_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint3{fakePose3, 0.2_s};
+
+    mantle_api::PolyLine polyLine{fakePolyLinePoint1, fakePolyLinePoint2, fakePolyLinePoint3};
+
+    Trajectory fakeCoordinates = {"", polyLine};
+    auto controlStrategy = std::make_shared<mantle_api::FollowTrajectoryControlStrategy>();
+    controlStrategy->trajectory = fakeCoordinates;
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlStrategies{controlStrategy};
 
     TrajectoryTester trajectoryTester(DontCare<bool>(),
                                       true);
+
+    ON_CALL(*trajectoryTester.controlStrategies, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory)).
+        WillByDefault(Return(controlStrategies));
+
     std::shared_ptr<TrajectoryFollowerImplementation> trajectoryFollower = trajectoryTester.trajectoryFollower;
 
     std::shared_ptr<SignalInterface const> resultSignalInterface;
     std::shared_ptr<DynamicsSignal const> result;
 
-    const auto trajectorySignal = std::make_shared<TrajectorySignal>(ComponentState::Acting, fakeCoordinates);
-    trajectoryFollower->UpdateInput(2, trajectorySignal, 0);
     trajectoryFollower->Trigger(0);
     trajectoryFollower->Trigger(100);
     trajectoryFollower->Trigger(200);
@@ -74,100 +84,123 @@ TEST(TrajectoryFollowerImplementation_WithoutExternalAcceleration_Unittests, Dea
 
 TEST(TrajectoryFollowerImplementation_WithoutExternalAcceleration_Unittests, LinearTrajectoryWithoutInterpolation)
 {
-    TrajectoryPoint fakePosition1{0, 0, 0, 0};
-    TrajectoryPoint fakePosition2{0.2, 3, 4, 0.1};
-    TrajectoryPoint fakePosition3{0.4, 9, 12, 0.4};
-    Trajectory fakeCoordinates = {{fakePosition1, fakePosition2, fakePosition3}, ""};
+    mantle_api::Pose fakePose1{{0_m, 0_m, 0_m}, {0_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose2{{3_m, 4_m, 0_m}, {0.1_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose3{{9_m, 12_m, 0_m}, {0.4_rad, 0_rad, 0_rad}};
+
+    mantle_api::PolyLinePoint fakePolyLinePoint1{fakePose1, 0_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint2{fakePose2, 0.2_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint3{fakePose3, 0.4_s};
+
+    mantle_api::PolyLine polyLine{fakePolyLinePoint1, fakePolyLinePoint2, fakePolyLinePoint3};
+
+    Trajectory fakeCoordinates = {"", polyLine};
+    auto controlStrategy = std::make_shared<mantle_api::FollowTrajectoryControlStrategy>();
+    controlStrategy->trajectory = fakeCoordinates;
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlStrategies{controlStrategy};
 
     TrajectoryTester trajectoryTester(DontCare<bool>(),
                                       DontCare<bool>(),
                                       200);
+
+    ON_CALL(*trajectoryTester.controlStrategies, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory)).
+        WillByDefault(Return(controlStrategies));
     std::shared_ptr<TrajectoryFollowerImplementation> trajectoryFollower = trajectoryTester.trajectoryFollower;
 
     std::shared_ptr<SignalInterface const> resultSignalInterface;
     std::shared_ptr<DynamicsSignal const> result;
 
-    const auto trajectorySignal = std::make_shared<TrajectorySignal>(ComponentState::Acting, fakeCoordinates);
-    trajectoryFollower->UpdateInput(2, trajectorySignal, 0);
     trajectoryFollower->Trigger(0);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 0);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 3.0, 4.0, 0.1, 0.5, 2.5, 25.0, 125.0, 5.0);
+    AssertDynamicsSignalEquality(result, 3.0_m, 4.0_m, 0.1_rad, 0.5_rad_per_s, 2.5_rad_per_s_sq, 25.0_mps, 125.0_mps_sq, 5.0_m);
 
     trajectoryFollower->Trigger(200);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 200);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 9.0, 12.0, 0.4, 1.5, 5.0, 50.0, 125.0, 10.0);
+    AssertDynamicsSignalEquality(result, 9.0_m, 12.0_m, 0.4_rad, 1.5_rad_per_s, 5.0_rad_per_s_sq, 50.0_mps, 125.0_mps_sq, 10.0_m);
 }
 
 TEST(TrajectoryFollowerImplementation_WithoutExternalAcceleration_Unittests, LinearTrajectoryWithInterpolation)
 {
-    TrajectoryPoint fakePosition1{0, 10, 10, -1};
-    TrajectoryPoint fakePosition2{0.1, 13, 6, -0.5};
-    TrajectoryPoint fakePosition3{0.4, 16, 9, 1};
-    TrajectoryPoint fakePosition4{0.8, 16, 13, 1};
-    Trajectory fakeCoordinates = {{fakePosition1, fakePosition2, fakePosition3, fakePosition4}, ""};
+    mantle_api::Pose fakePose1{{10_m, 10_m, 0_m}, {-1_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose2{{13_m, 6_m, 0_m}, {-0.5_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose3{{16_m, 9_m, 0_m}, {1_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose4{{16_m, 13_m, 0_m}, {1_rad, 0_rad, 0_rad}};
+
+    mantle_api::PolyLinePoint fakePolyLinePoint1{fakePose1, 0_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint2{fakePose2, 0.1_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint3{fakePose3, 0.4_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint4{fakePose4, 0.8_s};
+
+    mantle_api::PolyLine polyLine{fakePolyLinePoint1, fakePolyLinePoint2, fakePolyLinePoint3, fakePolyLinePoint4};
+
+    Trajectory fakeCoordinates = {"", polyLine};
+    auto controlStrategy = std::make_shared<mantle_api::FollowTrajectoryControlStrategy>();
+    controlStrategy->trajectory = fakeCoordinates;
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlStrategies{controlStrategy};
 
     FakeAgent fakeAgent;
-    ON_CALL(fakeAgent, GetPositionX()).WillByDefault(Return(10.0));
-    ON_CALL(fakeAgent, GetPositionY()).WillByDefault(Return(10.0));
-    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(-1.0));
+    ON_CALL(fakeAgent, GetPositionX()).WillByDefault(Return(10.0_m));
+    ON_CALL(fakeAgent, GetPositionY()).WillByDefault(Return(10.0_m));
+    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(-1.0_rad));
 
     TrajectoryTester trajectoryTester(DontCare<bool>(),
                                       DontCare<bool>(),
                                       nullptr,
                                       &fakeAgent,
                                       200);
+
+    ON_CALL(*trajectoryTester.controlStrategies, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory)).
+        WillByDefault(Return(controlStrategies));
     std::shared_ptr<TrajectoryFollowerImplementation> trajectoryFollower = trajectoryTester.trajectoryFollower;
 
     std::shared_ptr<SignalInterface const> resultSignalInterface;
     std::shared_ptr<DynamicsSignal const> result;
 
-    double velocity {0};
-    double acceleration {0};
-    double distance {0.0};
+    units::velocity::meters_per_second_t velocity{0};
+    units::acceleration::meters_per_second_squared_t acceleration{0};
+    units::length::meter_t distance {0.0};
 
-    const double cycleTimeInSeconds = 0.2;
+    const units::time::second_t cycleTimeInSeconds{0.2};
 
-    const auto trajectorySignal = std::make_shared<TrajectorySignal>(ComponentState::Acting, fakeCoordinates);
-    trajectoryFollower->UpdateInput(2, trajectorySignal, 0);
     trajectoryFollower->Trigger(0);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 0);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    distance =  (5 + std::sqrt(2));
+    distance = (5_m + units::math::sqrt(2_sq_m));
     velocity = distance / cycleTimeInSeconds;
     acceleration = velocity / cycleTimeInSeconds;
     AssertDynamicsSignalEquality(result,
-                              14,
-                              7,
-                              0.0,
-                              1.0 / cycleTimeInSeconds,
-                              25.0,
-                              velocity,
-                              acceleration,
-                              distance);
+                                 14_m,
+                                 7_m,
+                                 0.0_rad,
+                                 1.0_rad / cycleTimeInSeconds,
+                                 25.0_rad_per_s_sq,
+                                 velocity,
+                                 acceleration,
+                                 distance);
 
     trajectoryFollower->Trigger(200);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 100);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    double previousVelocity = velocity;
-    distance = std::sqrt(8);
+    auto previousVelocity = velocity;
+    distance = units::math::sqrt(8_sq_m);
     velocity = distance / cycleTimeInSeconds;
     acceleration = (velocity - previousVelocity) / cycleTimeInSeconds;
 
     AssertDynamicsSignalEquality(result,
-                              16.0,
-                              9.0,
-                              1.0,
-                              1.0 / cycleTimeInSeconds,
-                              0.0,
-                              velocity,
-                              acceleration,
-                              distance);
+                                 16.0_m,
+                                 9.0_m,
+                                 1.0_rad,
+                                 1.0_rad / cycleTimeInSeconds,
+                                 0.0_rad_per_s_sq,
+                                 velocity,
+                                 acceleration,
+                                 distance);
 
     trajectoryFollower->Trigger(400);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 400);
@@ -175,105 +208,130 @@ TEST(TrajectoryFollowerImplementation_WithoutExternalAcceleration_Unittests, Lin
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
 
     previousVelocity = velocity;
-    distance = 2.0;
+    distance = 2.0_m;
     velocity = distance / cycleTimeInSeconds;
     acceleration = (velocity - previousVelocity) / cycleTimeInSeconds;
 
     AssertDynamicsSignalEquality(result,
-                              16.0,
-                              11.0,
-                              1.0,
-                              0.0,
-                              -25.0,
-                              velocity,
-                              acceleration,
-                              distance);
+                                 16.0_m,
+                                 11.0_m,
+                                 1.0_rad,
+                                 0.0_rad_per_s,
+                                 -25.0_rad_per_s_sq,
+                                 velocity,
+                                 acceleration,
+                                 distance);
 }
 
 
 TEST(TrajectoryFollowerImplementation_WithExternalAcceleration_Unittests, LinearTrajectoryWithInterpolation)
 {
-    TrajectoryPoint fakePosition1{0, 10.0, 10.0, 0};
-    TrajectoryPoint fakePosition2{0.2, 13.0, 14.0, 0.2};
-    TrajectoryPoint fakePosition3{0.4, 15.0, 14.0, 0.4};
-    TrajectoryPoint fakePosition4{0.6, 15.0, 16.0, 0.6};
-    TrajectoryPoint fakePosition5{0.8, 17.0, 16.0, 0.8};
-    Trajectory fakeCoordinates = {{fakePosition1, fakePosition2, fakePosition3, fakePosition4, fakePosition5}, ""};
+    mantle_api::Pose fakePose1{{10_m, 10_m, 0_m}, {0_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose2{{13_m, 14_m, 0_m}, {0.2_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose3{{15_m, 14_m, 0_m}, {0.4_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose4{{15_m, 16_m, 0_m}, {0.6_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose5{{17_m, 16_m, 0_m}, {0.8_rad, 0_rad, 0_rad}};
+
+    mantle_api::PolyLinePoint fakePolyLinePoint1{fakePose1, 0_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint2{fakePose2, 0.2_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint3{fakePose3, 0.4_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint4{fakePose4, 0.6_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint5{fakePose5, 0.8_s};
+
+    mantle_api::PolyLine polyLine{fakePolyLinePoint1, fakePolyLinePoint2, fakePolyLinePoint3, fakePolyLinePoint4, fakePolyLinePoint5};
+
+    Trajectory fakeCoordinates{"", polyLine};
+    auto controlStrategy = std::make_shared<mantle_api::FollowTrajectoryControlStrategy>();
+    controlStrategy->trajectory = fakeCoordinates;
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlStrategies{controlStrategy};
 
     FakeAgent fakeAgent;
-    ON_CALL(fakeAgent, GetPositionX()).WillByDefault(Return(10.0));
-    ON_CALL(fakeAgent, GetPositionY()).WillByDefault(Return(10.0));
-    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(fakeAgent, GetPositionX()).WillByDefault(Return(10.0_m));
+    ON_CALL(fakeAgent, GetPositionY()).WillByDefault(Return(10.0_m));
+    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(0.0_rad));
 
     TrajectoryTester trajectoryTester(DontCare<bool>(),
                                       DontCare<bool>(),
                                       nullptr,
                                       &fakeAgent,
                                       200);
+
+    ON_CALL(*trajectoryTester.controlStrategies, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory)).
+        WillByDefault(Return(controlStrategies));
     std::shared_ptr<TrajectoryFollowerImplementation> trajectoryFollower = trajectoryTester.trajectoryFollower;
 
     std::shared_ptr<SignalInterface const> resultSignalInterface;
     std::shared_ptr<DynamicsSignal const> result;
-    auto inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Acting, -50.0);
+    auto inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Acting, -50.0_mps_sq);
 
-    const auto trajectorySignal = std::make_shared<TrajectorySignal>(ComponentState::Acting, fakeCoordinates);
-    trajectoryFollower->UpdateInput(2, trajectorySignal, 0);
     trajectoryFollower->Trigger(0);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 0);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 13.0, 14.0, 0.2, 1.0, 5.0, 25.0, 125.0, 5.0);
+    AssertDynamicsSignalEquality(result, 13.0_m, 14.0_m, 0.2_rad, 1.0_rad_per_s, 5.0_rad_per_s_sq, 25.0_mps, 125.0_mps_sq, 5.0_m);
 
     trajectoryFollower->UpdateInput(1, inputSignal, 0);
     trajectoryFollower->Trigger(200);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 200);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 15.0, 15.0, 0.5, 1.5, 2.5, 15.0, -50.0, 3.0);
-
+    AssertDynamicsSignalEquality(result, 15.0_m, 15.0_m, 0.5_rad, 1.5_rad_per_s, 2.5_rad_per_s_sq, 15.0_mps, -50.0_mps_sq, 3.0_m);
     trajectoryFollower->UpdateInput(1, inputSignal, 0);
     trajectoryFollower->Trigger(400);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 400);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 15.0, 16.0, 0.6, 0.5, -5.0, 5.0, -50.0, 1.0);
+    AssertDynamicsSignalEquality(result, 15.0_m, 16.0_m, 0.6_rad, 0.5_rad_per_s, -5.0_rad_per_s_sq, 5.0_mps, -50.0_mps_sq, 1.0_m);
 
-    inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Acting, 0.0);
+    inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Acting, 0.0_mps_sq);
     trajectoryFollower->UpdateInput(1, inputSignal, 0);
     trajectoryFollower->Trigger(600);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 600);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 16.0, 16.0, 0.7, 0.5, 0, 5.0, 0.0, 1.0);
+    AssertDynamicsSignalEquality(result, 16.0_m, 16.0_m, 0.7_rad, 0.5_rad_per_s, 0.0_rad_per_s_sq, 5.0_mps, 0.0_mps_sq, 1.0_m);
 }
 
 TEST(TrajectoryFollowerImplementation_WithExternalAcceleration_Unittests, DeactivationForNegativeVelocity)
 {
-    TrajectoryPoint fakePosition1{0, 10.0, 10.0, 0};
-    TrajectoryPoint fakePosition2{0.2, 13.0, 14.0, 0.2};
-    TrajectoryPoint fakePosition3{0.4, 15.0, 14.0, 0.4};
-    TrajectoryPoint fakePosition4{0.6, 15.0, 16.0, 0.6};
-    TrajectoryPoint fakePosition5{0.8, 17.0, 16.0, 0.8};
-    Trajectory fakeCoordinates = {{fakePosition1, fakePosition2, fakePosition3, fakePosition4, fakePosition5}, ""};
+    mantle_api::Pose fakePose1{{10_m, 10_m, 0_m}, {0_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose2{{13_m, 14_m, 0_m}, {0.2_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose3{{15_m, 14_m, 0_m}, {0.4_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose4{{15_m, 16_m, 0_m}, {0.6_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose5{{17_m, 16_m, 0_m}, {0.8_rad, 0_rad, 0_rad}};
+
+    mantle_api::PolyLinePoint fakePolyLinePoint1{fakePose1, 0_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint2{fakePose2, 0.2_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint3{fakePose3, 0.4_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint4{fakePose4, 0.6_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint5{fakePose5, 0.8_s};
+
+    mantle_api::PolyLine polyLine{fakePolyLinePoint1, fakePolyLinePoint2, fakePolyLinePoint3, fakePolyLinePoint4, fakePolyLinePoint5};
+
+    Trajectory fakeCoordinates{"", polyLine};
+    auto controlStrategy = std::make_shared<mantle_api::FollowTrajectoryControlStrategy>();
+    controlStrategy->trajectory = fakeCoordinates;
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlStrategies{controlStrategy};
 
     FakeAgent fakeAgent;
-    ON_CALL(fakeAgent, GetPositionX()).WillByDefault(Return(10.0));
-    ON_CALL(fakeAgent, GetPositionY()).WillByDefault(Return(10.0));
-    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(0.0));
+    ON_CALL(fakeAgent, GetPositionX()).WillByDefault(Return(10.0_m));
+    ON_CALL(fakeAgent, GetPositionY()).WillByDefault(Return(10.0_m));
+    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(0.0_rad));
 
     TrajectoryTester trajectoryTester(DontCare<bool>(),
                                       true,
                                       nullptr,
                                       &fakeAgent,
                                       200);
+
+    ON_CALL(*trajectoryTester.controlStrategies, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory)).
+        WillByDefault(Return(controlStrategies));
     std::shared_ptr<TrajectoryFollowerImplementation> trajectoryFollower = trajectoryTester.trajectoryFollower;
 
     std::shared_ptr<SignalInterface const> resultSignalInterface;
     std::shared_ptr<DynamicsSignal const> result;
-    auto inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Acting, -50.0);
+    auto inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Acting, -50.0_mps_sq);
 
-    const auto trajectorySignal = std::make_shared<TrajectorySignal>(ComponentState::Acting, fakeCoordinates);
-    trajectoryFollower->UpdateInput(2, trajectorySignal, 0);
     trajectoryFollower->Trigger(0);
 
     trajectoryFollower->UpdateInput(1, inputSignal, 0);
@@ -294,45 +352,54 @@ TEST(TrajectoryFollowerImplementation_WithExternalAcceleration_Unittests, Deacti
 
 TEST(TrajectoryFollowerImplementation_WithExternalAcceleration_Unittests, MultipleTimestepsWithinTwoCoordinates)
 {
-    TrajectoryPoint fakePosition1{0.0, 0.0, 0, 0};
-    TrajectoryPoint fakePosition2{0.3, 9.0, 0.0, 0.0};
-    Trajectory fakeCoordinates = {{fakePosition1, fakePosition2}, ""};
+    mantle_api::Pose fakePose1{{0_m, 0_m, 0_m}, {0_rad, 0_rad, 0_rad}};
+    mantle_api::Pose fakePose2{{9_m, 0_m, 0_m}, {0_rad, 0_rad, 0_rad}};
+
+    mantle_api::PolyLinePoint fakePolyLinePoint1{fakePose1, 0_s};
+    mantle_api::PolyLinePoint fakePolyLinePoint2{fakePose2, 0.3_s};
+
+    mantle_api::PolyLine polyLine{fakePolyLinePoint1, fakePolyLinePoint2};
+
+    Trajectory fakeCoordinates{"", polyLine};
+    auto controlStrategy = std::make_shared<mantle_api::FollowTrajectoryControlStrategy>();
+    controlStrategy->trajectory = fakeCoordinates;
+    std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlStrategies{controlStrategy};
 
     TrajectoryTester trajectoryTester(DontCare<bool>(),
                                       DontCare<bool>());
+
+    ON_CALL(*trajectoryTester.controlStrategies, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory)).
+        WillByDefault(Return(controlStrategies));
     std::shared_ptr<TrajectoryFollowerImplementation> trajectoryFollower = trajectoryTester.trajectoryFollower;
 
     std::shared_ptr<SignalInterface const> resultSignalInterface;
     std::shared_ptr<DynamicsSignal const> result;
-    auto inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Acting, -150.0);
+    auto inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Acting, -150.0_mps_sq);
 
-    const auto trajectorySignal = std::make_shared<TrajectorySignal>(ComponentState::Acting, fakeCoordinates);
-    trajectoryFollower->UpdateInput(2, trajectorySignal, 0);
     trajectoryFollower->Trigger(0);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 0);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 3.0, 0.0, 0.0, 0.0, 0.0, 30.0, 300.0, 3.0);
+    AssertDynamicsSignalEquality(result, 3.0_m, 0.0_m, 0.0_rad, 0.0_rad_per_s, 0.0_rad_per_s_sq, 30.0_mps, 300.0_mps_sq, 3.0_m);
 
     trajectoryFollower->Trigger(100);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 100);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 6.0, 0.0, 0, 0, 0.0, 30.0, 0.0, 3.0);
+    AssertDynamicsSignalEquality(result, 6.0_m, 0.0_m, 0_rad, 0_rad_per_s, 0.0_rad_per_s_sq, 30.0_mps, 0.0_mps_sq, 3.0_m);
 
     trajectoryFollower->UpdateInput(1, inputSignal, 200);
     trajectoryFollower->Trigger(200);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 200);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 7.5, 0.0, 0.0, 0, 0.0, 15.0, -150.0, 1.5);
+    AssertDynamicsSignalEquality(result, 7.5_m, 0.0_m, 0.0_rad, 0_rad_per_s, 0.0_rad_per_s_sq, 15.0_mps, -150.0_mps_sq, 1.5_m);
 
-    inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Disabled, 0.0);
+    inputSignal = std::make_shared<AccelerationSignal>(ComponentState::Disabled, 0.0_mps_sq);
     trajectoryFollower->UpdateInput(1, inputSignal, 300);
     trajectoryFollower->Trigger(300);
     trajectoryFollower->UpdateOutput(0, resultSignalInterface, 300);
 
     result = std::dynamic_pointer_cast<DynamicsSignal const>(resultSignalInterface);
-    AssertDynamicsSignalEquality(result, 9.0, 0.0, 0, 0, 0.0, 15.0, 0.0, 1.5);
+    AssertDynamicsSignalEquality(result, 9.0_m, 0.0_m, 0_rad, 0_rad_per_s, 0.0_rad_per_s_sq, 15.0_mps, 0.0_mps_sq, 1.5_m);
 }
-
diff --git a/sim/tests/unitTests/components/Dynamics_TF/trajectoryTester.cpp b/sim/tests/unitTests/components/Dynamics_TF/trajectoryTester.cpp
index 7c118d7ac53dfbb3d2346a5c853d20aed359c60d..335ad8826adb7bc0bd66053fad01b4aa10f329c8 100644
--- a/sim/tests/unitTests/components/Dynamics_TF/trajectoryTester.cpp
+++ b/sim/tests/unitTests/components/Dynamics_TF/trajectoryTester.cpp
@@ -9,6 +9,8 @@
  ********************************************************************************/
 #include "trajectoryTester.h"
 
+using testing::Return;
+
 TrajectoryTester::TrajectoryTester(const int cycleTime)
 {
     fakeBools.insert({"EnforceTrajectory", DontCare<bool>});
@@ -29,7 +31,8 @@ TrajectoryTester::TrajectoryTester(const int cycleTime)
         &fakeParameters,
         &fakePublisher,
         nullptr,
-        &fakeAgent);
+        &fakeAgent,
+        controlStrategies);
 }
 
 TrajectoryTester::TrajectoryTester(const bool enforceTrajectory, const bool automaticDeactivation, const int cycleTime)
@@ -52,7 +55,8 @@ TrajectoryTester::TrajectoryTester(const bool enforceTrajectory, const bool auto
         &fakeParameters,
         &fakePublisher,
         nullptr,
-        &fakeAgent);
+        &fakeAgent,
+        controlStrategies);
 }
 
 TrajectoryTester::TrajectoryTester(const bool enforceTrajectory,
@@ -78,7 +82,8 @@ TrajectoryTester::TrajectoryTester(const bool enforceTrajectory,
         &fakeParameters,
         &fakePublisher,
         nullptr,
-        &fakeAgent);
+        &fakeAgent,
+        controlStrategies);
 }
 
 TrajectoryTester::TrajectoryTester(const bool enforceTrajectory,
@@ -105,5 +110,6 @@ TrajectoryTester::TrajectoryTester(const bool enforceTrajectory,
         &fakeParameters,
         &fakePublisher,
         nullptr,
-        fakeAgent);
+        fakeAgent,
+        controlStrategies);
 }
diff --git a/sim/tests/unitTests/components/Dynamics_TF/trajectoryTester.h b/sim/tests/unitTests/components/Dynamics_TF/trajectoryTester.h
index d1e5d2e34469c5e31de001f211a662811f2e95c6..25ea67584921a0907c89ecd0107cac1abf837f28 100644
--- a/sim/tests/unitTests/components/Dynamics_TF/trajectoryTester.h
+++ b/sim/tests/unitTests/components/Dynamics_TF/trajectoryTester.h
@@ -17,6 +17,7 @@
 #include "fakeParameter.h"
 #include "fakeAgent.h"
 #include "fakeWorld.h"
+#include "fakeControlStrategies.h"
 
 #include "tfImplementation.h"
 
@@ -32,8 +33,6 @@ public:
 
     std::vector<int> fakeActingAgents {1};
 
-    EventContainer fakeEmptyEventContainer = {};
-
     NiceMock<FakePublisher> fakePublisher;
 
     std::map<std::string, bool> fakeBools;
@@ -43,6 +42,8 @@ public:
 
     std::shared_ptr<TrajectoryFollowerImplementation> trajectoryFollower;
 
+    std::shared_ptr<FakeControlStrategies> controlStrategies = std::make_shared<FakeControlStrategies>();
+
     TrajectoryTester(const int cycleTime = 100);
 
     TrajectoryTester(const bool enforceTrajectory,
diff --git a/sim/tests/unitTests/components/Dynamics_TwoTrack/UT_Dynamics2TM/tst_ut_dynamics2tmtest.cpp b/sim/tests/unitTests/components/Dynamics_TwoTrack/UT_Dynamics2TM/tst_ut_dynamics2tmtest.cpp
index 76548b2893cb3990621c8d0a59ba563cd65ae859..e1bebc9f403fa4e665c37493ca8a54c13f2b2208 100644
--- a/sim/tests/unitTests/components/Dynamics_TwoTrack/UT_Dynamics2TM/tst_ut_dynamics2tmtest.cpp
+++ b/sim/tests/unitTests/components/Dynamics_TwoTrack/UT_Dynamics2TM/tst_ut_dynamics2tmtest.cpp
@@ -221,7 +221,7 @@ void UT_Dynamics2TMTest::testCase1()
     vehicle->InitSetGeometry(x_wheelbase, x_COG, y_track, y_COG);
 
     vehicle->InitSetTire(vel*std::cos(angleSlide), F_max, F_slide, s_max, r_tire, 1.0);
-    Common::Vector2d vVel(vel*std::cos(angleSlide), vel*std::sin(angleSlide));
+    Common::Vector2d<units::length::meter_t> vVel(vel * std::cos(angleSlide), vel * std::sin(angleSlide));
 
     vehicle->SetVelocity(vVel, rateYaw);
     std::array<double, 4> brkSuper = {0.0, 0.0, 0.0, 0.0};
diff --git a/sim/tests/unitTests/components/LimiterAccVehComp/limiterAccVehComp_Tests.cpp b/sim/tests/unitTests/components/LimiterAccVehComp/limiterAccVehComp_Tests.cpp
index 84c5dfcf8fbbd5012fd447e940ee1314b3e05711..a5622cc3e11034b7ff693edfac1e07d79d3277fe 100644
--- a/sim/tests/unitTests/components/LimiterAccVehComp/limiterAccVehComp_Tests.cpp
+++ b/sim/tests/unitTests/components/LimiterAccVehComp/limiterAccVehComp_Tests.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2018-2019 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -25,15 +26,15 @@ using ::testing::_;
 struct LimiterTestParameter {
     LimiterTestParameter(const double &maximumLimit,
                          const double &minimumLimit,
-                         const double &currentVelocity,
-                         const double &airDragCoefficient,
-                         const double &axleRatio,
-                         const double &frontSurface,
-                         const double &maximumEngineTorque,
-                         const double &maximumEngineSpeed,
-                         const double &minimumEngineSpeed,
-                         const double &staticWheelRadius,
-                         const double &weight,
+                         const units::velocity::meters_per_second_t &currentVelocity,
+                         const std::string &airDragCoefficient,
+                         const std::string &axleRatio,
+                         const std::string &frontSurface,
+                         const std::string &maximumEngineTorque,
+                         const std::string &maximumEngineSpeed,
+                         const std::string &minimumEngineSpeed,
+                         const units::length::meter_t &staticWheelRadius,
+                         const units::mass::kilogram_t &weight,
                          const std::vector<double> &gearRatios):
         maximumLimit(maximumLimit),
         minimumLimit(minimumLimit),
@@ -51,15 +52,15 @@ struct LimiterTestParameter {
 
     const double maximumLimit;
     const double minimumLimit;
-    const double currentVelocity; // in kmh
-    const double airDragCoefficient;
-    const double axleRatio;
-    const double frontSurface;
-    const double maximumEngineTorque;
-    const double maximumEngineSpeed;
-    const double minimumEngineSpeed;
-    const double staticWheelRadius;
-    const double weight;
+    const units::velocity::meters_per_second_t currentVelocity;
+    const std::string airDragCoefficient;
+    const std::string axleRatio;
+    const std::string frontSurface;
+    const std::string maximumEngineTorque;
+    const std::string maximumEngineSpeed;
+    const std::string minimumEngineSpeed;
+    const units::length::meter_t staticWheelRadius;
+    const units::mass::kilogram_t weight;
     const std::vector<double> gearRatios;
 
 };
@@ -75,7 +76,7 @@ TEST_P(MaximumLimit,
     const LimiterTestParameter testInput = GetParam();
 
     NiceMock<FakeAgent> fakeAgent;
-    ON_CALL(fakeAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{testInput.currentVelocity / 3.6, 0.0}));
+    ON_CALL(fakeAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{testInput.currentVelocity, 0.0_mps}));
 
     NiceMock<FakeWorld> fakeWorld;
     ON_CALL(fakeWorld, GetFriction()).WillByDefault(Return(1.0));
@@ -93,23 +94,23 @@ TEST_P(MaximumLimit,
                                                                 nullptr,
                                                                 &fakeAgent);
 
-    const auto accelerationInputSignal = std::make_shared<AccelerationSignal const>(ComponentState::Acting, INFINITY);
+    const auto accelerationInputSignal = std::make_shared<AccelerationSignal const>(ComponentState::Acting, units::acceleration::meters_per_second_squared_t(INFINITY));
 
-    VehicleModelParameters fakeVehicleParameters;
-    fakeVehicleParameters.properties = {{"Mass", testInput.weight},
-                                        {"FrontSurface", testInput.frontSurface},
+    mantle_api::VehicleProperties fakeVehicleParameters;
+    fakeVehicleParameters.mass = testInput.weight;
+    fakeVehicleParameters.properties = {{"FrontSurface", testInput.frontSurface},
                                         {"AirDragCoefficient", testInput.airDragCoefficient},
                                         {"MaximumEngineTorque", testInput.maximumEngineTorque},
                                         {"MinimumEngineSpeed", testInput.minimumEngineSpeed},
                                         {"MaximumEngineSpeed", testInput.maximumEngineSpeed},
                                         {"AxleRatio", testInput.axleRatio},
-                                        {"FrictionCoefficient", 1.0},
-                                        {"NumberOfGears", testInput.gearRatios.size()}};
+                                        {"FrictionCoefficient", "1.0"},
+                                        {"NumberOfGears", std::to_string(testInput.gearRatios.size())}};
     for (size_t i = 0; i < testInput.gearRatios.size(); i++)
     {
-        fakeVehicleParameters.properties.insert({"GearRatio"+std::to_string(i+1), testInput.gearRatios[i]});
+        fakeVehicleParameters.properties.insert({"GearRatio"+std::to_string(i+1), std::to_string(testInput.gearRatios[i])});
     }
-    fakeVehicleParameters.rearAxle.wheelDiameter = 2 * testInput.staticWheelRadius;
+    fakeVehicleParameters.rear_axle.wheel_diameter = 2 * testInput.staticWheelRadius;
 
     const auto vehicleParameterInputSignal = std::make_shared<ParametersVehicleSignal const>(fakeVehicleParameters);
 
@@ -121,10 +122,10 @@ TEST_P(MaximumLimit,
     std::shared_ptr<SignalInterface const> signalInterface;
     limiter.UpdateOutput(0, signalInterface, DontCare<double>());
 
-    double resultAcceleration = std::dynamic_pointer_cast<AccelerationSignal const>(signalInterface)->acceleration;
+    auto resultAcceleration = std::dynamic_pointer_cast<AccelerationSignal const>(signalInterface)->acceleration;
 
     // ASSERT
-    ASSERT_NEAR(resultAcceleration, testInput.maximumLimit, 0.001);
+    ASSERT_NEAR(resultAcceleration.value(), testInput.maximumLimit, 0.001);
 }
 
 INSTANTIATE_TEST_CASE_P(Default, MaximumLimit,
@@ -133,11 +134,11 @@ INSTANTIATE_TEST_CASE_P(Default, MaximumLimit,
     // maximumEngineTorque, maximumEngineSpeed, minimumEngineSpeed, staticWheelRadius, weight, gearRatios
 
     testing::Values(
-        LimiterTestParameter{7.6668,  0,  30.0, 0.28, 2.813, 2.2, 270, 6000, 900, 0.318, 1525.0, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }},
-        LimiterTestParameter{6.5065,  0,  50.0, 0.28, 2.813, 2.2, 270, 6000, 900, 0.318, 1525.0, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }},
-        LimiterTestParameter{4.5591,  0,  70.0, 0.28, 2.813, 2.2, 270, 6000, 900, 0.318, 1525.0, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }},
-        LimiterTestParameter{3.0062,  0, 100.0, 0.28, 2.813, 2.2, 270, 6000, 900, 0.318, 1525.0, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }},
-        LimiterTestParameter{0.67098, 0, 200.0, 0.28, 2.813, 2.2, 270, 6000, 900, 0.318, 1525.0, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }}
+        LimiterTestParameter{7.6668,  0,  30.0_kph, "0.28", "2.813", "2.2", "270", "6000", "900", 0.318_m, 1525.0_kg, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }},
+        LimiterTestParameter{6.5065,  0,  50.0_kph, "0.28", "2.813", "2.2", "270", "6000", "900", 0.318_m, 1525.0_kg, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }},
+        LimiterTestParameter{4.5591,  0,  70.0_kph, "0.28", "2.813", "2.2", "270", "6000", "900", 0.318_m, 1525.0_kg, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }},
+        LimiterTestParameter{3.0062,  0, 100.0_kph, "0.28", "2.813", "2.2", "270", "6000", "900", 0.318_m, 1525.0_kg, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }},
+        LimiterTestParameter{0.67098, 0, 200.0_kph, "0.28", "2.813", "2.2", "270", "6000", "900", 0.318_m, 1525.0_kg, { 0.0, 5.0, 3.2, 2.143, 1.72, 1.314, 1.0, 0.822, 0.64 }}
     )
 );
 
diff --git a/sim/tests/unitTests/components/OpenScenarioActions/CMakeLists.txt b/sim/tests/unitTests/components/OpenScenarioActions/CMakeLists.txt
deleted file mode 100644
index 88419b1eda4558e694426b6c4eed22b7eb8cc02a..0000000000000000000000000000000000000000
--- a/sim/tests/unitTests/components/OpenScenarioActions/CMakeLists.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-################################################################################
-# Copyright (c) 2020-2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# http://www.eclipse.org/legal/epl-2.0.
-#
-# SPDX-License-Identifier: EPL-2.0
-################################################################################
-set(COMPONENT_TEST_NAME OpenScenarioActions_Tests)
-set(COMPONENT_SOURCE_DIR ${OPENPASS_SIMCORE_DIR}/components/OpenScenarioActions/src)
-
-add_openpass_target(
-  NAME ${COMPONENT_TEST_NAME} TYPE test COMPONENT module
-  DEFAULT_MAIN
-
-  SOURCES
-    openScenarioActions_Tests.cpp
-    ${COMPONENT_SOURCE_DIR}/openScenarioActionsImpl.cpp
-    ${COMPONENT_SOURCE_DIR}/oscActionsCalculation.cpp
-    ${COMPONENT_SOURCE_DIR}/transformLaneChange.cpp
-    ${COMPONENT_SOURCE_DIR}/transformSpeedAction.cpp
-    ${COMPONENT_SOURCE_DIR}/transformAcquirePosition.cpp
-    ${COMPONENT_SOURCE_DIR}/transformDefaultCustomCommandAction.cpp
-    ${COMPONENT_SOURCE_DIR}/transformSpeedAction.cpp
-
-  HEADERS
-    ${COMPONENT_SOURCE_DIR}/openScenarioActionsImpl.h
-    ${COMPONENT_SOURCE_DIR}/oscActionsCalculation.h
-    ${OPENPASS_SIMCORE_DIR}/common/events/laneChangeEvent.h
-    ${OPENPASS_SIMCORE_DIR}/common/events/trajectoryEvent.h
-    ${OPENPASS_SIMCORE_DIR}/common/trajectorySignal.h
-    ${OPENPASS_SIMCORE_DIR}/common/acquirePositionSignal.h
-    ${COMPONENT_SOURCE_DIR}/transformDefaultCustomCommandAction.h
-    ${OPENPASS_SIMCORE_DIR}/common/speedActionSignal.h
-
-  INCDIRS
-    ${COMPONENT_SOURCE_DIR}
-
-  LIBRARIES
-    Qt5::Core
-)
-
diff --git a/sim/tests/unitTests/components/SensorFusionErrorless_OSI/sensorFusionErrorless_Tests.cpp b/sim/tests/unitTests/components/SensorFusionErrorless_OSI/sensorFusionErrorless_Tests.cpp
index 6780a8c67be8f3e7d103dd319c75e04690838c68..a6ca7bf05abb6a4a033201f5eb4cfc7d91c2ea71 100644
--- a/sim/tests/unitTests/components/SensorFusionErrorless_OSI/sensorFusionErrorless_Tests.cpp
+++ b/sim/tests/unitTests/components/SensorFusionErrorless_OSI/sensorFusionErrorless_Tests.cpp
@@ -238,10 +238,10 @@ TEST(SensorFusionErrorless_Tests, ConvertToVehicleCoordinates_SetsCorrectVelocit
 {
     NiceMock<FakeAgent> fakeAgent;
     ON_CALL(fakeAgent, GetVelocity(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference)))
-    .WillByDefault(Return(Common::Vector2d{20.0,10.0}));
-    ON_CALL(fakeAgent, GetVelocity(VariantWith<ObjectPointCustom>(ObjectPointCustom{-2.0, 1.5})))
-    .WillByDefault(Return(Common::Vector2d{20.2,10.1}));
-    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(-M_PI_2));
+    .WillByDefault(Return(Common::Vector2d{20.0_mps,10.0_mps}));
+    ON_CALL(fakeAgent, GetVelocity(VariantWith<ObjectPointCustom>(ObjectPointCustom{-2.0_m, 1.5_m})))
+    .WillByDefault(Return(Common::Vector2d{20.2_mps,10.1_mps}));
+    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(-90_deg));
 
     osi3::DetectedMovingObject object;
     object.mutable_base()->mutable_velocity()->set_x(5.0);
@@ -262,10 +262,10 @@ TEST(SensorFusionErrorless_Tests, ConvertToVehicleCoordinates_SetsCorrectAcceler
 {
     NiceMock<FakeAgent> fakeAgent;
     ON_CALL(fakeAgent, GetAcceleration(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference)))
-    .WillByDefault(Return(Common::Vector2d{20.0,10.0}));
-    ON_CALL(fakeAgent, GetAcceleration(VariantWith<ObjectPointCustom>(ObjectPointCustom{-2.0, 1.5})))
-    .WillByDefault(Return(Common::Vector2d{20.2,10.1}));
-    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(-M_PI_2));
+    .WillByDefault(Return(Common::Vector2d{20.0_mps_sq,10.0_mps_sq}));
+    ON_CALL(fakeAgent, GetAcceleration(VariantWith<ObjectPointCustom>(ObjectPointCustom{-2.0_m, 1.5_m})))
+    .WillByDefault(Return(Common::Vector2d{20.2_mps_sq,10.1_mps_sq}));
+    ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(-90_deg));
 
     osi3::DetectedMovingObject object;
     object.mutable_base()->mutable_acceleration()->set_x(5.0);
diff --git a/sim/tests/unitTests/components/Sensor_Driver/sensorDriver_Tests.cpp b/sim/tests/unitTests/components/Sensor_Driver/sensorDriver_Tests.cpp
index 2fcd0515fced48a5868e9acedf3f588946c41944..7c13dcc987de623713e2ba5c33a2cf43394defe4 100644
--- a/sim/tests/unitTests/components/Sensor_Driver/sensorDriver_Tests.cpp
+++ b/sim/tests/unitTests/components/Sensor_Driver/sensorDriver_Tests.cpp
@@ -47,28 +47,28 @@ TEST(SensorDriver_UnitTests, CorrectInformationInSignal)
     RoadGraphVertex target = add_vertex(roadGraph);
     RoadGraphEdge edge = add_edge(start, target, roadGraph).first;
 
-    GlobalRoadPositions frontPosition{{roadId, GlobalRoadPosition{roadId, -2, 50, 4.0, 0.5}}};
+    GlobalRoadPositions frontPosition{{roadId, GlobalRoadPosition{roadId, -2, 50_m, 4.0_m, 0.5_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(frontPosition));
     ON_CALL(fakeEgoAgent, GetReferencePointPosition()).WillByDefault(Return(frontPosition.at(roadId)));
-    ON_CALL(fakeAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{2.0, 0.0}));
-    ON_CALL(fakeAgent, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{3.0, 0.0}));
+    ON_CALL(fakeAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{2.0_mps, 0.0_mps}));
+    ON_CALL(fakeAgent, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{3.0_mps_sq, 0.0_mps_sq}));
     ON_CALL(fakeAgent, IsCrossingLanes()).WillByDefault(Return(true));
-    ON_CALL(fakeEgoAgent, GetPositionLateral()).WillByDefault(Return(4.0));
-    ON_CALL(fakeEgoAgent, GetRelativeYaw()).WillByDefault(Return(5.0));
-    ON_CALL(fakeEgoAgent, GetLaneRemainder(Side::Left)).WillByDefault(Return(6.0));
-    ON_CALL(fakeEgoAgent, GetLaneRemainder(Side::Right)).WillByDefault(Return(7.0));
+    ON_CALL(fakeEgoAgent, GetPositionLateral()).WillByDefault(Return(4.0_m));
+    ON_CALL(fakeEgoAgent, GetRelativeYaw()).WillByDefault(Return(5.0_rad));
+    ON_CALL(fakeEgoAgent, GetLaneRemainder(Side::Left)).WillByDefault(Return(6.0_m));
+    ON_CALL(fakeEgoAgent, GetLaneRemainder(Side::Right)).WillByDefault(Return(7.0_m));
     std::vector<std::pair<ObjectTypeOSI, int>> collisionPartners = {{ObjectTypeOSI::Vehicle, 1}};
     ON_CALL(fakeAgent, GetCollisionPartners()).WillByDefault(Return(collisionPartners));
     ON_CALL(fakeAgent, GetRoads(_)).WillByDefault(Return(std::vector<std::string>{roadId}));
-    ON_CALL(fakeEgoAgent, GetLaneCurvature(1)).WillByDefault(Return(0.5));
-    ON_CALL(fakeEgoAgent, GetLaneCurvature(0)).WillByDefault(Return(0.6));
-    ON_CALL(fakeEgoAgent, GetLaneCurvature(-1)).WillByDefault(Return(0.7));
-    ON_CALL(fakeEgoAgent, GetLaneWidth(1)).WillByDefault(Return(5.0));
-    ON_CALL(fakeEgoAgent, GetLaneWidth(0)).WillByDefault(Return(6.0));
-    ON_CALL(fakeEgoAgent, GetLaneWidth(-1)).WillByDefault(Return(7.0));
-    ON_CALL(fakeEgoAgent, GetDistanceToEndOfLane(_, 1)).WillByDefault(Return(100.0));
-    ON_CALL(fakeEgoAgent, GetDistanceToEndOfLane(_, 0)).WillByDefault(Return(200.0));
-    ON_CALL(fakeEgoAgent, GetDistanceToEndOfLane(_, -1)).WillByDefault(Return(300.0));
+    ON_CALL(fakeEgoAgent, GetLaneCurvature(1)).WillByDefault(Return(0.5_i_m));
+    ON_CALL(fakeEgoAgent, GetLaneCurvature(0)).WillByDefault(Return(0.6_i_m));
+    ON_CALL(fakeEgoAgent, GetLaneCurvature(-1)).WillByDefault(Return(0.7_i_m));
+    ON_CALL(fakeEgoAgent, GetLaneWidth(1)).WillByDefault(Return(5.0_m));
+    ON_CALL(fakeEgoAgent, GetLaneWidth(0)).WillByDefault(Return(6.0_m));
+    ON_CALL(fakeEgoAgent, GetLaneWidth(-1)).WillByDefault(Return(7.0_m));
+    ON_CALL(fakeEgoAgent, GetDistanceToEndOfLane(_, 1)).WillByDefault(Return(100.0_m));
+    ON_CALL(fakeEgoAgent, GetDistanceToEndOfLane(_, 0)).WillByDefault(Return(200.0_m));
+    ON_CALL(fakeEgoAgent, GetDistanceToEndOfLane(_, -1)).WillByDefault(Return(300.0_m));
     CommonTrafficSign::Entity trafficSign;
     std::vector<CommonTrafficSign::Entity> trafficSigns{{trafficSign}};
     ON_CALL(fakeEgoAgent, GetTrafficSignsInRange(_, 1)).WillByDefault(Return(trafficSigns));
@@ -77,15 +77,12 @@ TEST(SensorDriver_UnitTests, CorrectInformationInSignal)
     LaneMarking::Entity laneMarking;
     std::vector<LaneMarking::Entity> laneMarkings{{laneMarking}};
     ON_CALL(fakeEgoAgent, GetLaneMarkingsInRange(_, _, _)).WillByDefault(Return(laneMarkings));
-    RelativeWorldView::Lanes relativeLanes {{0.0, 0.0,
-            {{-1, true, LaneType::Driving, std::nullopt, std::nullopt},
-            {0, true, LaneType::Driving, std::nullopt, std::nullopt},
-            {1, true, LaneType::Driving, std::nullopt, std::nullopt}}}};
+    RelativeWorldView::Lanes relativeLanes{{0.0_m, 0.0_m, {{-1, true, LaneType::Driving, std::nullopt, std::nullopt}, {0, true, LaneType::Driving, std::nullopt, std::nullopt}, {1, true, LaneType::Driving, std::nullopt, std::nullopt}}}};
     ON_CALL(fakeEgoAgent, GetRelativeLanes(_, _, _)).WillByDefault(Return(relativeLanes));
 
     ON_CALL(fakeWorld, GetRoadGraph(RouteElement{roadId, true}, _, true)).WillByDefault(Return(std::make_pair(roadGraph, start)));
     ON_CALL(fakeWorld, IsDirectionalRoadExisting(roadId, true)).WillByDefault(Return(true));
-    ON_CALL(fakeWorld, GetVisibilityDistance()).WillByDefault(Return(123.4));
+    ON_CALL(fakeWorld, GetVisibilityDistance()).WillByDefault(Return(123.4_m));
     std::map<RoadGraphEdge, double> edgeWeights{{edge, 1.0}};
     ON_CALL(fakeWorld, GetEdgeWeights(_)).WillByDefault([&edgeWeights](const RoadGraph& graph){auto [firstEdge, edgeEnd] = edges(graph); return std::map<RoadGraphEdge, double>{{*firstEdge, 1.0}};} );
 
@@ -94,25 +91,25 @@ TEST(SensorDriver_UnitTests, CorrectInformationInSignal)
 
     NiceMock<FakeAgent> otherAgent;
     std::vector<const WorldObjectInterface *> objectsInFront{{&otherAgent}};
-    EXPECT_CALL(fakeEgoAgent, GetObjectsInRange(0.0,_,0)).WillRepeatedly(Return(objectsInFront));
+    EXPECT_CALL(fakeEgoAgent, GetObjectsInRange(0.0_m, _, 0)).WillRepeatedly(Return(objectsInFront));
     ON_CALL(otherAgent, GetId()).WillByDefault(Return(2));
-    ON_CALL(fakeEgoAgent, GetNetDistance(&otherAgent)).WillByDefault(Return(50.0));
-    ON_CALL(otherAgent, GetYaw()).WillByDefault(Return(0.1));
-    ON_CALL(otherAgent, GetLength()).WillByDefault(Return(1.0));
-    ON_CALL(otherAgent, GetWidth()).WillByDefault(Return(1.1));
-    ON_CALL(otherAgent, GetHeight()).WillByDefault(Return(1.2));
-    ON_CALL(otherAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{10.0, 0.0}));
-    ON_CALL(otherAgent, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{11.0, 0.0}));
+    ON_CALL(fakeEgoAgent, GetNetDistance(&otherAgent)).WillByDefault(Return(50.0_m));
+    ON_CALL(otherAgent, GetYaw()).WillByDefault(Return(0.1_rad));
+    ON_CALL(otherAgent, GetLength()).WillByDefault(Return(1.0_m));
+    ON_CALL(otherAgent, GetWidth()).WillByDefault(Return(1.1_m));
+    ON_CALL(otherAgent, GetHeight()).WillByDefault(Return(1.2_m));
+    ON_CALL(otherAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{10.0_mps, 0.0_mps}));
+    ON_CALL(otherAgent, GetAcceleration(_)).WillByDefault(Return(Common::Vector2d{11.0_mps_sq, 0.0_mps_sq}));
 
     NiceMock<FakeWorldObject> trafficObject;
     std::vector<const WorldObjectInterface *> objectsBehind{{&trafficObject}};
-    EXPECT_CALL(fakeEgoAgent, GetObjectsInRange(_,0.0,1)).WillRepeatedly(Return(objectsBehind));
+    EXPECT_CALL(fakeEgoAgent, GetObjectsInRange(_, 0.0_m, 1)).WillRepeatedly(Return(objectsBehind));
     ON_CALL(trafficObject, GetId()).WillByDefault(Return(3));
-    ON_CALL(fakeEgoAgent, GetNetDistance(&trafficObject)).WillByDefault(Return(60.0));
-    ON_CALL(trafficObject, GetYaw()).WillByDefault(Return(0.2));
-    ON_CALL(trafficObject, GetLength()).WillByDefault(Return(2.0));
-    ON_CALL(trafficObject, GetWidth()).WillByDefault(Return(2.1));
-    ON_CALL(trafficObject, GetHeight()).WillByDefault(Return(2.2));
+    ON_CALL(fakeEgoAgent, GetNetDistance(&trafficObject)).WillByDefault(Return(60.0_m));
+    ON_CALL(trafficObject, GetYaw()).WillByDefault(Return(0.2_rad));
+    ON_CALL(trafficObject, GetLength()).WillByDefault(Return(2.0_m));
+    ON_CALL(trafficObject, GetWidth()).WillByDefault(Return(2.1_m));
+    ON_CALL(trafficObject, GetHeight()).WillByDefault(Return(2.2_m));
 
     SensorDriverImplementation sensorDriver("SensorDriver",
                                             false,
@@ -134,28 +131,28 @@ TEST(SensorDriver_UnitTests, CorrectInformationInSignal)
     std::shared_ptr<const SensorDriverSignal> sensorDriverSignal = std::dynamic_pointer_cast<const SensorDriverSignal>(data);
 
     auto ownVehicleInformation = sensorDriverSignal->GetOwnVehicleInformation();
-    EXPECT_THAT(ownVehicleInformation.absoluteVelocity, Eq(2.0));
-    EXPECT_THAT(ownVehicleInformation.acceleration, Eq(3.0));
-    EXPECT_THAT(ownVehicleInformation.lateralPosition, Eq(4.0));
-    EXPECT_THAT(ownVehicleInformation.heading, Eq(5.0));
-    EXPECT_THAT(ownVehicleInformation.distanceToLaneBoundaryLeft, Eq(6.0));
-    EXPECT_THAT(ownVehicleInformation.distanceToLaneBoundaryRight, Eq(7.0));
+    EXPECT_THAT(ownVehicleInformation.absoluteVelocity.value(), Eq(2.0));
+    EXPECT_THAT(ownVehicleInformation.acceleration.value(), Eq(3.0));
+    EXPECT_THAT(ownVehicleInformation.lateralPosition.value(), Eq(4.0));
+    EXPECT_THAT(ownVehicleInformation.heading.value(), Eq(5.0));
+    EXPECT_THAT(ownVehicleInformation.distanceToLaneBoundaryLeft.value(), Eq(6.0));
+    EXPECT_THAT(ownVehicleInformation.distanceToLaneBoundaryRight.value(), Eq(7.0));
     EXPECT_THAT(ownVehicleInformation.collision, Eq(true));
 
     auto geometryInformation = sensorDriverSignal->GetGeometryInformation();
-    EXPECT_THAT(geometryInformation.visibilityDistance, Eq(123.4));
+    EXPECT_THAT(geometryInformation.visibilityDistance.value(), Eq(123.4));
     EXPECT_THAT(geometryInformation.laneEgo.exists, Eq(true));
-    EXPECT_THAT(geometryInformation.laneEgo.curvature, Eq(0.6));
-    EXPECT_THAT(geometryInformation.laneEgo.width, Eq(6.0));
-    EXPECT_THAT(geometryInformation.laneEgo.distanceToEndOfLane, Eq(200.0));
+    EXPECT_THAT(geometryInformation.laneEgo.curvature.value(), Eq(0.6));
+    EXPECT_THAT(geometryInformation.laneEgo.width.value(), Eq(6.0));
+    EXPECT_THAT(geometryInformation.laneEgo.distanceToEndOfLane.value(), Eq(200.0));
     EXPECT_THAT(geometryInformation.laneLeft.exists, Eq(true));
-    EXPECT_THAT(geometryInformation.laneLeft.curvature, Eq(0.5));
-    EXPECT_THAT(geometryInformation.laneLeft.width, Eq(5.0));
-    EXPECT_THAT(geometryInformation.laneLeft.distanceToEndOfLane, Eq(100.0));
+    EXPECT_THAT(geometryInformation.laneLeft.curvature.value(), Eq(0.5));
+    EXPECT_THAT(geometryInformation.laneLeft.width.value(), Eq(5.0));
+    EXPECT_THAT(geometryInformation.laneLeft.distanceToEndOfLane.value(), Eq(100.0));
     EXPECT_THAT(geometryInformation.laneRight.exists, Eq(true));
-    EXPECT_THAT(geometryInformation.laneRight.curvature, Eq(0.7));
-    EXPECT_THAT(geometryInformation.laneRight.width, Eq(7.0));
-    EXPECT_THAT(geometryInformation.laneRight.distanceToEndOfLane, Eq(300.0));
+    EXPECT_THAT(geometryInformation.laneRight.curvature.value(), Eq(0.7));
+    EXPECT_THAT(geometryInformation.laneRight.width.value(), Eq(7.0));
+    EXPECT_THAT(geometryInformation.laneRight.distanceToEndOfLane.value(), Eq(300.0));
 
     auto trafficRuleInformation = sensorDriverSignal->GetTrafficRuleInformation();
     EXPECT_THAT(trafficRuleInformation.laneEgo.trafficSigns.size(), Eq(1));
@@ -166,22 +163,22 @@ TEST(SensorDriver_UnitTests, CorrectInformationInSignal)
     EXPECT_THAT(surroundingObjects.objectFront.exist, Eq(true));
     EXPECT_THAT(surroundingObjects.objectFront.isStatic, Eq(false));
     EXPECT_THAT(surroundingObjects.objectFront.id, Eq(2));
-    EXPECT_THAT(surroundingObjects.objectFront.absoluteVelocity, Eq(10.0));
-    EXPECT_THAT(surroundingObjects.objectFront.acceleration, Eq(11.0));
-    EXPECT_THAT(surroundingObjects.objectFront.heading, Eq(0.1));
-    EXPECT_THAT(surroundingObjects.objectFront.length, Eq(1.0));
-    EXPECT_THAT(surroundingObjects.objectFront.width, Eq(1.1));
-    EXPECT_THAT(surroundingObjects.objectFront.height, Eq(1.2));
-    EXPECT_THAT(surroundingObjects.objectFront.relativeLongitudinalDistance, Eq(50.0));
-//    EXPECT_THAT(surroundingObjects.objectFront.relativeLateralDistance, DoubleEq(-2.0));
+    EXPECT_THAT(surroundingObjects.objectFront.absoluteVelocity.value(), Eq(10.0));
+    EXPECT_THAT(surroundingObjects.objectFront.acceleration.value(), Eq(11.0));
+    EXPECT_THAT(surroundingObjects.objectFront.heading.value(), Eq(0.1));
+    EXPECT_THAT(surroundingObjects.objectFront.length.value(), Eq(1.0));
+    EXPECT_THAT(surroundingObjects.objectFront.width.value(), Eq(1.1));
+    EXPECT_THAT(surroundingObjects.objectFront.height.value(), Eq(1.2));
+    EXPECT_THAT(surroundingObjects.objectFront.relativeLongitudinalDistance.value(), Eq(50.0));
+    //    EXPECT_THAT(surroundingObjects.objectFront.relativeLateralDistance, DoubleEq(-2.0));
     EXPECT_THAT(surroundingObjects.objectRearLeft.exist, Eq(true));
     EXPECT_THAT(surroundingObjects.objectRearLeft.isStatic, Eq(true));
     EXPECT_THAT(surroundingObjects.objectRearLeft.id, Eq(3));
-    EXPECT_THAT(surroundingObjects.objectRearLeft.heading, Eq(0.2));
-    EXPECT_THAT(surroundingObjects.objectRearLeft.length, Eq(2.0));
-    EXPECT_THAT(surroundingObjects.objectRearLeft.width, Eq(2.1));
-    EXPECT_THAT(surroundingObjects.objectRearLeft.height, Eq(2.2));
-    EXPECT_THAT(surroundingObjects.objectRearLeft.relativeLongitudinalDistance, Eq(60.0));
+    EXPECT_THAT(surroundingObjects.objectRearLeft.heading.value(), Eq(0.2));
+    EXPECT_THAT(surroundingObjects.objectRearLeft.length.value(), Eq(2.0));
+    EXPECT_THAT(surroundingObjects.objectRearLeft.width.value(), Eq(2.1));
+    EXPECT_THAT(surroundingObjects.objectRearLeft.height.value(), Eq(2.2));
+    EXPECT_THAT(surroundingObjects.objectRearLeft.relativeLongitudinalDistance.value(), Eq(60.0));
     EXPECT_THAT(surroundingObjects.objectRear.exist, Eq(false));
     EXPECT_THAT(surroundingObjects.objectFrontLeft.exist, Eq(false));
     EXPECT_THAT(surroundingObjects.objectFrontRight.exist, Eq(false));
@@ -195,15 +192,15 @@ TEST(SensorDriverCalculations_UnitTests, GetLateralDistanceToObjectSameLane)
     ON_CALL(egoAgent, GetLaneIdFromRelative(-1)).WillByDefault(Return(-4));
     ON_CALL(egoAgent, GetLaneIdFromRelative(0)).WillByDefault(Return(-3));
     ON_CALL(egoAgent, GetLaneIdFromRelative(1)).WillByDefault(Return(-2));
-    ON_CALL(egoAgent, GetPositionLateral()).WillByDefault(Return(0.5));
+    ON_CALL(egoAgent, GetPositionLateral()).WillByDefault(Return(0.5_m));
 
     NiceMock<FakeAgent> otherAgent;
-    GlobalRoadPositions otherAgentPosition{{"MyRoad", GlobalRoadPosition{"MyRoad", -3, 50, -1.0, 0}}};
+    GlobalRoadPositions otherAgentPosition{{"MyRoad", GlobalRoadPosition{"MyRoad", -3, 50_m, -1.0_m, 0_rad}}};
     ON_CALL(otherAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(otherAgentPosition));
 
     SensorDriverCalculations sensorDriverCalculations(egoAgent);
-    double lateralDistance = sensorDriverCalculations.GetLateralDistanceToObject("MyRoad", &otherAgent);
-    ASSERT_THAT(lateralDistance, Eq(-1.5));
+    auto lateralDistance = sensorDriverCalculations.GetLateralDistanceToObject("MyRoad", &otherAgent);
+    ASSERT_THAT(lateralDistance.value(), Eq(-1.5));
 }
 
 TEST(SensorDriverCalculations_UnitTests, GetLateralDistanceToObjectLeftLane)
@@ -213,19 +210,19 @@ TEST(SensorDriverCalculations_UnitTests, GetLateralDistanceToObjectLeftLane)
     ON_CALL(egoAgent, GetLaneIdFromRelative(-1)).WillByDefault(Return(-4));
     ON_CALL(egoAgent, GetLaneIdFromRelative(0)).WillByDefault(Return(-3));
     ON_CALL(egoAgent, GetLaneIdFromRelative(1)).WillByDefault(Return(-2));
-    GlobalRoadPositions position{{"MyRoad",GlobalRoadPosition{"",-3,0,0.5,0}}};
+    GlobalRoadPositions position{{"MyRoad",GlobalRoadPosition{"",-3,0_m,0.5_m,0_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(position));
-    ON_CALL(egoAgent, GetPositionLateral()).WillByDefault(Return(0.5));
-    ON_CALL(egoAgent, GetLaneWidth(0)).WillByDefault(Return(4.0));
-    ON_CALL(egoAgent, GetLaneWidth(1)).WillByDefault(Return(5.0));
+    ON_CALL(egoAgent, GetPositionLateral()).WillByDefault(Return(0.5_m));
+    ON_CALL(egoAgent, GetLaneWidth(0)).WillByDefault(Return(4.0_m));
+    ON_CALL(egoAgent, GetLaneWidth(1)).WillByDefault(Return(5.0_m));
 
     NiceMock<FakeAgent> otherAgent;
-    GlobalRoadPositions otherAgentPosition{{"MyRoad", GlobalRoadPosition{"MyRoad", -2, 50, -1.0, 0}}};
+    GlobalRoadPositions otherAgentPosition{{"MyRoad", GlobalRoadPosition{"MyRoad", -2, 50_m, -1.0_m, 0_rad}}};
     ON_CALL(otherAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(otherAgentPosition));
 
     SensorDriverCalculations sensorDriverCalculations(egoAgent);
-    double lateralDistance = sensorDriverCalculations.GetLateralDistanceToObject("MyRoad", &otherAgent);
-    ASSERT_THAT(lateralDistance, Eq(3.0));
+    auto lateralDistance = sensorDriverCalculations.GetLateralDistanceToObject("MyRoad", &otherAgent);
+    ASSERT_THAT(lateralDistance.value(), Eq(3.0));
 }
 
 TEST(SensorDriverCalculations_UnitTests, GetLateralDistanceToObjectRightLane)
@@ -235,17 +232,17 @@ TEST(SensorDriverCalculations_UnitTests, GetLateralDistanceToObjectRightLane)
     ON_CALL(egoAgent, GetLaneIdFromRelative(-1)).WillByDefault(Return(-4));
     ON_CALL(egoAgent, GetLaneIdFromRelative(0)).WillByDefault(Return(-3));
     ON_CALL(egoAgent, GetLaneIdFromRelative(1)).WillByDefault(Return(-2));
-    GlobalRoadPositions position{{"MyRoad",GlobalRoadPosition{"",-3,0,0.5,0}}};
+    GlobalRoadPositions position{{"MyRoad",GlobalRoadPosition{"",-3,0_m,0.5_m,0_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(position));
-    ON_CALL(egoAgent, GetPositionLateral()).WillByDefault(Return(0.5));
-    ON_CALL(egoAgent, GetLaneWidth(0)).WillByDefault(Return(4.0));
-    ON_CALL(egoAgent, GetLaneWidth(-1)).WillByDefault(Return(5.0));
+    ON_CALL(egoAgent, GetPositionLateral()).WillByDefault(Return(0.5_m));
+    ON_CALL(egoAgent, GetLaneWidth(0)).WillByDefault(Return(4.0_m));
+    ON_CALL(egoAgent, GetLaneWidth(-1)).WillByDefault(Return(5.0_m));
 
     NiceMock<FakeAgent> otherAgent;
-    GlobalRoadPositions otherAgentPosition{{"MyRoad", GlobalRoadPosition{"MyRoad", -4, 50, -1.0, 0}}};
+    GlobalRoadPositions otherAgentPosition{{"MyRoad", GlobalRoadPosition{"MyRoad", -4, 50_m, -1.0_m, 0_rad}}};
     ON_CALL(otherAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(otherAgentPosition));
 
     SensorDriverCalculations sensorDriverCalculations(egoAgent);
-    double lateralDistance = sensorDriverCalculations.GetLateralDistanceToObject("MyRoad", &otherAgent);
-    ASSERT_THAT(lateralDistance, Eq(-6.0));
+    auto lateralDistance = sensorDriverCalculations.GetLateralDistanceToObject("MyRoad", &otherAgent);
+    ASSERT_THAT(lateralDistance.value(), Eq(-6.0));
 }
diff --git a/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_Tests.cpp b/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_Tests.cpp
index c507a984fd397b11cc4ebda575cb3056ee244aa6..fe137f2665a7c1fa259cec0b12e301773596f52b 100644
--- a/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_Tests.cpp
+++ b/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_Tests.cpp
@@ -10,6 +10,8 @@
  ********************************************************************************/
 
 #include <QtGlobal>
+#include <string>
+#include <cmath>
 
 #include "gtest/gtest.h"
 #include "gmock/gmock.h"
@@ -40,12 +42,12 @@ class DetectObjects_Data
 public:
     double detectionRange;
     double openingAngleH;
-    double mountingPositionLongitudinal;
-    double mountingPositionLateral;
-    double mountingPositionYaw;
-    double sensorX;
-    double sensorY;
-    double vehicleYaw;
+    units::length::meter_t mountingPositionLongitudinal;
+    units::length::meter_t mountingPositionLateral;
+    units::angle::radian_t mountingPositionYaw;
+    units::length::meter_t sensorX;
+    units::length::meter_t sensorY;
+    units::angle::radian_t vehicleYaw;
     bool   enableVisualObstruction;
     std::vector<MovingObjectParameter> movingObjects;
     std::vector<StationaryObjectParameter> stationaryObjects;
@@ -66,8 +68,7 @@ public:
         ON_CALL(fakeStochastics, GetLogNormalDistributed(_, _)).WillByDefault(Return(1));
 
         fakeDoubles = {{"FailureProbability", 0}, {"Latency", 0},
-                       {"RequiredPercentageOfVisibleArea", 0.4},{"Height", 0.0},
-                       {"Pitch", 0.0}, {"Roll", 0.0}};
+                       {"RequiredPercentageOfVisibleArea", 0.4}};
 
         ON_CALL(fakeParameters, GetParametersDouble()).WillByDefault(ReturnRef(fakeDoubles));
 
@@ -77,6 +78,14 @@ public:
         fakeBools = {};
         ON_CALL(fakeParameters, GetParametersBool()).WillByDefault(ReturnRef(fakeBools));
 
+        fakeStrings = {{"Position", "Position1"}};
+        ON_CALL(fakeParameters, GetParametersString()).WillByDefault(ReturnRef(fakeStrings));
+
+        fakeVehicleModelParameters->properties = {{"SensorPosition/Position1/Height", "0.0"},
+                                                  {"SensorPosition/Position1/Pitch", "0.0"},
+                                                  {"SensorPosition/Position1/Roll", "0.0"}};
+        ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(fakeVehicleModelParameters));
+
         ON_CALL(fakeWorldInterface, GetWorldData()).WillByDefault(Return(&fakeWorldData));
 
     }
@@ -91,32 +100,34 @@ public:
     std::map<std::string, double> fakeDoubles;
     std::map<std::string, int> fakeInts;
     std::map<std::string, bool> fakeBools;
+    std::map<std::string, const std::string> fakeStrings;
+    std::shared_ptr<mantle_api::VehicleProperties> fakeVehicleModelParameters = std::make_shared<mantle_api::VehicleProperties>();
 };
 
 void AddMovingObjectToSensorView (osi3::SensorView &sensorView, MovingObjectParameter &objectParameter)
 {
     osi3::MovingObject* movingObject = sensorView.mutable_global_ground_truth()->add_moving_object();
-    movingObject->mutable_base()->mutable_position()->set_x(objectParameter.position.x);
-    movingObject->mutable_base()->mutable_position()->set_y(objectParameter.position.y);
+    movingObject->mutable_base()->mutable_position()->set_x(objectParameter.position.x.value());
+    movingObject->mutable_base()->mutable_position()->set_y(objectParameter.position.y.value());
     movingObject->mutable_base()->mutable_dimension()->set_length(5);
     movingObject->mutable_base()->mutable_dimension()->set_width(2);
     movingObject->mutable_vehicle_attributes()->mutable_bbcenter_to_rear()->set_x(-0.5);
-    movingObject->mutable_base()->mutable_orientation()->set_yaw(objectParameter.yaw);
-    movingObject->mutable_base()->mutable_velocity()->set_x(objectParameter.velocity.x);
-    movingObject->mutable_base()->mutable_velocity()->set_y(objectParameter.velocity.y);
-    movingObject->mutable_base()->mutable_acceleration()->set_x(objectParameter.acceleration.x);
-    movingObject->mutable_base()->mutable_acceleration()->set_y(objectParameter.acceleration.y);
+    movingObject->mutable_base()->mutable_orientation()->set_yaw(objectParameter.yaw.value());
+    movingObject->mutable_base()->mutable_velocity()->set_x(objectParameter.velocity.x.value());
+    movingObject->mutable_base()->mutable_velocity()->set_y(objectParameter.velocity.y.value());
+    movingObject->mutable_base()->mutable_acceleration()->set_x(objectParameter.acceleration.x.value());
+    movingObject->mutable_base()->mutable_acceleration()->set_y(objectParameter.acceleration.y.value());
     movingObject->mutable_id()->set_value(objectParameter.id);
 }
 
 void AddStationaryObjectToSensorView (osi3::SensorView &sensorView, StationaryObjectParameter &objectParameter)
 {
     osi3::StationaryObject* stationaryObject = sensorView.mutable_global_ground_truth()->add_stationary_object();
-    stationaryObject->mutable_base()->mutable_position()->set_x(objectParameter.position.x);
-    stationaryObject->mutable_base()->mutable_position()->set_y(objectParameter.position.y);
+    stationaryObject->mutable_base()->mutable_position()->set_x(objectParameter.position.x.value());
+    stationaryObject->mutable_base()->mutable_position()->set_y(objectParameter.position.y.value());
     stationaryObject->mutable_base()->mutable_dimension()->set_length(5);
     stationaryObject->mutable_base()->mutable_dimension()->set_width(2);
-    stationaryObject->mutable_base()->mutable_orientation()->set_yaw(objectParameter.yaw);
+    stationaryObject->mutable_base()->mutable_orientation()->set_yaw(objectParameter.yaw.value());
     stationaryObject->mutable_id()->set_value(objectParameter.id);
 }
 
@@ -125,17 +136,19 @@ TEST_P(DetectObjects, StoresSensorDataWithDetectedObjects)
     auto data = GetParam();
     fakeDoubles["DetectionRange"] = data.detectionRange;
     fakeDoubles["OpeningAngleH"] = data.openingAngleH;
-    fakeDoubles["Longitudinal"] = data.mountingPositionLongitudinal;
-    fakeDoubles["Lateral"] = data.mountingPositionLateral;
-    fakeDoubles["Yaw"] = data.mountingPositionYaw;
+    fakeVehicleModelParameters->properties["SensorPosition/Position1/Longitudinal"] = std::to_string(data.mountingPositionLongitudinal.value());
+    fakeVehicleModelParameters->properties["SensorPosition/Position1/Lateral"] = std::to_string(data.mountingPositionLateral.value());
+    std::stringstream yawString; //Use stringstream, because std::to_string is not precise enough
+    yawString << std::setprecision(12) << data.mountingPositionYaw.value();
+    fakeVehicleModelParameters->properties["SensorPosition/Position1/Yaw"] = yawString.str();
     fakeBools["EnableVisualObstruction"] = data.enableVisualObstruction;
     sensorView->mutable_host_vehicle_id()->set_value(1);
     const ObjectPointCustom mountingPosition{data.mountingPositionLongitudinal, data.mountingPositionLateral};
-    MovingObjectParameter hostVehicle{1, {0, 0}, {9.0, 4.0}, {-2.1, 3.1}, data.vehicleYaw};
+    MovingObjectParameter hostVehicle{1, {0_m, 0_m}, {9.0_mps, 4.0_mps}, {-2.1_mps_sq, 3.1_mps_sq}, data.vehicleYaw};
     AddMovingObjectToSensorView(*sensorView, hostVehicle);
     ON_CALL(fakeAgent, GetAbsolutePosition(VariantWith<ObjectPointCustom>(mountingPosition))).WillByDefault(Return(Common::Vector2d{data.sensorX, data.sensorY}));
-    ON_CALL(fakeAgent, GetVelocity(VariantWith<ObjectPointCustom>(mountingPosition))).WillByDefault(Return(Common::Vector2d{10.0, 5.0}));
-    ON_CALL(fakeAgent, GetAcceleration(VariantWith<ObjectPointCustom>(mountingPosition))).WillByDefault(Return(Common::Vector2d{-2.0, 3.0}));
+    ON_CALL(fakeAgent, GetVelocity(VariantWith<ObjectPointCustom>(mountingPosition))).WillByDefault(Return(Common::Vector2d{10.0_mps, 5.0_mps}));
+    ON_CALL(fakeAgent, GetAcceleration(VariantWith<ObjectPointCustom>(mountingPosition))).WillByDefault(Return(Common::Vector2d{-2.0_mps_sq, 3.0_mps_sq}));
     for (auto object : data.movingObjects)
     {
         AddMovingObjectToSensorView(*sensorView, object);
@@ -197,31 +210,31 @@ TEST_P(DetectObjects, StoresSensorDataWithDetectedObjects)
     }
 }
 
-MovingObjectParameter testMovingObject2{2, {110.0, 100.0}, {5.0, 7.0}, {-0.2, 0.3}, 0.5};
-MovingObjectParameter testMovingObject3{3, {150.0, 54.0}, {6.0, 8.0}, {0.0, 0.0}, 0.0};
-MovingObjectParameter testMovingObject4{4, {130.0, 403.0}, {7.0, 9.0}, {-0.1, 0.4}, 0.0};
-MovingObjectParameter testMovingObject5{5, {101.0, 130.0}, {8.0, 10.0}, {-0.3, 0.5}, 0.0};
-MovingObjectParameter testMovingObject6{6, {70.0, 134.0}, {9.0, 11.0}, {-0.3, 0.5}, -0.5};
-MovingObjectParameter testMovingObject7{7, {0.0, 50.0}, {10.0, 12.0}, {-0.2, 0.2}, 0.0};
+MovingObjectParameter testMovingObject2{2, {110.0_m, 100.0_m}, {5.0_mps, 7.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 0.5_rad};
+MovingObjectParameter testMovingObject3{3, {150.0_m, 54.0_m}, {6.0_mps, 8.0_mps}, {0.0_mps_sq, 0.0_mps_sq}, 0.0_rad};
+MovingObjectParameter testMovingObject4{4, {130.0_m, 403.0_m}, {7.0_mps, 9.0_mps}, {-0.1_mps_sq, 0.4_mps_sq}, 0.0_rad};
+MovingObjectParameter testMovingObject5{5, {101.0_m, 130.0_m}, {8.0_mps, 10.0_mps}, {-0.3_mps_sq, 0.5_mps_sq}, 0.0_rad};
+MovingObjectParameter testMovingObject6{6, {70.0_m, 134.0_m}, {9.0_mps, 11.0_mps}, {-0.3_mps_sq, 0.5_mps_sq}, -0.5_rad};
+MovingObjectParameter testMovingObject7{7, {0.0_m, 50.0_m}, {10.0_mps, 12.0_mps}, {-0.2_mps_sq, 0.2_mps_sq}, 0.0_rad};
 std::vector<MovingObjectParameter> testMovingObjects{testMovingObject2, testMovingObject3, testMovingObject4, testMovingObject5, testMovingObject6, testMovingObject7};
 
-MovingObjectParameter expectedMovingObject2_a{2, {10.0, 0.0}, {-5.0, 2.0}, {1.8, -2.7}, 0.5};
-MovingObjectParameter expectedMovingObject3_a{3, {50.0, -46.0}, {-4.0, 3.0}, {2.0, -3.0}, 0.0};
+MovingObjectParameter expectedMovingObject2_a{2, {10.0_m, 0.0_m}, {-5.0_mps, 2.0_mps}, {1.8_mps_sq, -2.7_mps_sq}, 0.5_rad};
+MovingObjectParameter expectedMovingObject3_a{3, {50.0_m, -46.0_m}, {-4.0_mps, 3.0_mps}, {2.0_mps_sq, -3.0_mps_sq}, 0.0_rad};
 std::vector<MovingObjectParameter> expectedMovingObjects_a{expectedMovingObject2_a, expectedMovingObject3_a};
 std::vector<OWL::Id> expectedMovingObjectsVisibleIds_a{expectedMovingObject2_a.id, expectedMovingObject3_a.id};
 std::vector<OWL::Id> expectedMovingObjectsDetectedIds_a{expectedMovingObject2_a.id, expectedMovingObject3_a.id};
 
-MovingObjectParameter expectedMovingObject5_b{5, {1.0, 30.0}, {-2.0, 5.0}, {1.7, -2.5}, 0.0};
+MovingObjectParameter expectedMovingObject5_b{5, {1.0_m, 30.0_m}, {-2.0_mps, 5.0_mps}, {1.7_mps_sq, -2.5_mps_sq}, 0.0_rad};
 std::vector<MovingObjectParameter> expectedMovingObjects_b{expectedMovingObject2_a, expectedMovingObject3_a, expectedMovingObject5_b};
 std::vector<OWL::Id> expectedMovingObjectsVisibleIds_b{expectedMovingObject2_a.id, expectedMovingObject3_a.id, expectedMovingObject5_b.id};
 std::vector<OWL::Id> expectedMovingObjectsDetectedIds_b{expectedMovingObject2_a.id, expectedMovingObject3_a.id, expectedMovingObject5_b.id};
 
-MovingObjectParameter expectedMovingObject6_c{6, {-30.0, 34.0}, {-1.0, 6.0}, {1.7, -2.5}, -0.5};
+MovingObjectParameter expectedMovingObject6_c{6, {-30.0_m, 34.0_m}, {-1.0_mps, 6.0_mps}, {1.7_mps_sq, -2.5_mps_sq}, -0.5_rad};
 std::vector<MovingObjectParameter> expectedMovingObjects_c{expectedMovingObject2_a, expectedMovingObject3_a, expectedMovingObject5_b, expectedMovingObject6_c};
 std::vector<OWL::Id> expectedMovingObjectsVisibleIds_c{expectedMovingObject2_a.id, expectedMovingObject3_a.id, expectedMovingObject5_b.id, expectedMovingObject6_c.id};
 std::vector<OWL::Id> expectedMovingObjectsDetectedIds_c{expectedMovingObject2_a.id, expectedMovingObject3_a.id, expectedMovingObject5_b.id, expectedMovingObject6_c.id};
 
-MovingObjectParameter expectedMovingObject7_d{7, {-100, -50.0}, {0.0, 7.0}, {1.8, -2.8}, 0.0};
+MovingObjectParameter expectedMovingObject7_d{7, {-100_m, -50.0_m}, {0.0_mps, 7.0_mps}, {1.8_mps_sq, -2.8_mps_sq}, 0.0_rad};
 std::vector<MovingObjectParameter> expectedMovingObjects_d{expectedMovingObject2_a, expectedMovingObject3_a, expectedMovingObject5_b, expectedMovingObject6_c, expectedMovingObject7_d};
 std::vector<OWL::Id> expectedMovingObjectsVisibleIds_d{expectedMovingObject2_a.id, expectedMovingObject3_a.id, expectedMovingObject5_b.id, expectedMovingObject6_c.id, expectedMovingObject7_d.id};
 std::vector<OWL::Id> expectedMovingObjectsDetectedIds_d{expectedMovingObject2_a.id, expectedMovingObject3_a.id, expectedMovingObject5_b.id, expectedMovingObject6_c.id, expectedMovingObject7_d.id};
@@ -230,69 +243,69 @@ std::vector<MovingObjectParameter> expectedMovingObjects_e{expectedMovingObject2
 std::vector<OWL::Id> expectedMovingObjectsVisibleIds_e{expectedMovingObject2_a.id, expectedMovingObject3_a.id};
 std::vector<OWL::Id> expectedMovingObjectsDetectedIds_e{expectedMovingObject2_a.id, expectedMovingObject3_a.id};
 
-MovingObjectParameter expectedMovingObject7_f{7, {30.0, 0.0}, {7.0, 0.0}, {-2.8, -1.8}, -M_PI * 0.5};
+MovingObjectParameter expectedMovingObject7_f{7, {30.0_m, 0.0_m}, {7.0_mps, 0.0_mps}, {-2.8_mps_sq, -1.8_mps_sq}, -90_deg};
 std::vector<MovingObjectParameter> expectedMovingObjects_f{expectedMovingObject7_f};
 std::vector<OWL::Id> expectedMovingObjectsVisibleIds_f{expectedMovingObject7_f.id};
 std::vector<OWL::Id> expectedMovingObjectsDetectedIds_f{expectedMovingObject7_f.id};
 
-StationaryObjectParameter testStationaryObject12{12, {110.0, 100.0}, 0.5};
-StationaryObjectParameter testStationaryObject13{13, {150.0, 54.0}, 0.0};
-StationaryObjectParameter testStationaryObject14{14, {130.0, 403.0}, 0.0};
-StationaryObjectParameter testStationaryObject15{15, {101.0, 130.0}, 0.0};
-StationaryObjectParameter testStationaryObject16{16, {70.0, 134.0}, -0.5};
-StationaryObjectParameter testStationaryObject17{17, {0.0, 50.0}, 0.0};
+StationaryObjectParameter testStationaryObject12{12, {110.0_m, 100.0_m},  0.5_rad};
+StationaryObjectParameter testStationaryObject13{13, {150.0_m,  54.0_m},  0.0_rad};
+StationaryObjectParameter testStationaryObject14{14, {130.0_m, 403.0_m},  0.0_rad};
+StationaryObjectParameter testStationaryObject15{15, {101.0_m, 130.0_m},  0.0_rad};
+StationaryObjectParameter testStationaryObject16{16, { 70.0_m, 134.0_m}, -0.5_rad};
+StationaryObjectParameter testStationaryObject17{17, {  0.0_m,  50.0_m},  0.0_rad};
 std::vector<StationaryObjectParameter> testStationaryObjects{testStationaryObject12, testStationaryObject13, testStationaryObject14, testStationaryObject15, testStationaryObject16, testStationaryObject17};
 
-StationaryObjectParameter expectedStationaryObject12_a{12, {10.0, 0.0}, 0.5};
-StationaryObjectParameter expectedStationaryObject13_a{13, {50.0, -46.0}, 0.0};
+StationaryObjectParameter expectedStationaryObject12_a{12, {10.0_m, 0.0_m}, 0.5_rad};
+StationaryObjectParameter expectedStationaryObject13_a{13, {50.0_m, -46.0_m}, 0.0_rad};
 std::vector<StationaryObjectParameter> expectedStationaryObjects_a{expectedStationaryObject12_a, expectedStationaryObject13_a};
-StationaryObjectParameter expectedStationaryObject15_b{15, {1.0, 30.0}, 0.0};
+StationaryObjectParameter expectedStationaryObject15_b{15, {1.0_m, 30.0_m}, 0.0_rad};
 std::vector<StationaryObjectParameter> expectedStationaryObjects_b{expectedStationaryObject12_a, expectedStationaryObject13_a, expectedStationaryObject15_b};
-StationaryObjectParameter expectedStationaryObject16_c{16, {-30.0, 34.0}, -0.5};
+StationaryObjectParameter expectedStationaryObject16_c{16, {-30.0_m, 34.0_m}, -0.5_rad};
 std::vector<StationaryObjectParameter> expectedStationaryObjects_c{expectedStationaryObject12_a, expectedStationaryObject13_a, expectedStationaryObject15_b, expectedStationaryObject16_c};
-StationaryObjectParameter expectedStationaryObject17_d{17, {-100.0, -50.0}, 0.0};
+StationaryObjectParameter expectedStationaryObject17_d{17, {-100.0_m, -50.0_m}, 0.0_rad};
 std::vector<StationaryObjectParameter> expectedStationaryObjects_d{expectedStationaryObject12_a, expectedStationaryObject13_a, expectedStationaryObject15_b, expectedStationaryObject16_c, expectedStationaryObject17_d};
 std::vector<StationaryObjectParameter> expectedStationaryObjects_e{expectedStationaryObject12_a, expectedStationaryObject13_a};
-StationaryObjectParameter expectedStationaryObject17_f{17, {30.0, 0.0}, -M_PI * 0.5};
+StationaryObjectParameter expectedStationaryObject17_f{17, {30.0_m, 0.0_m}, -90_deg};
 std::vector<StationaryObjectParameter> expectedStationaryObjects_f{expectedStationaryObject17_f};
 
 INSTANTIATE_TEST_CASE_P(WithoutObstruction, DetectObjects,
     ::testing::Values(
-//                                 openingAngle   lateral        positionX    vehicleYaw                 movingObjects                           expectedMovingObjects
-//                         range       | longitudinal|      sensorYaw | positionY  |     visualObstruction    |            stationaryObjects              |    expectedStationaryObjects
-//                           |         |       |     |          |     |     |      |             |            |                   |                       |               |
-        DetectObjects_Data{0.0  , M_PI * 0.5, 0.0, 0.0,         0.0, 100.0, 100.0, 0.0,       false, testMovingObjects, testStationaryObjects, {},                      {},                          {}, {}}, //zero range => no detected objects
-        DetectObjects_Data{300.0, M_PI * 0.5, 0.0, 0.0,         0.0, 100.0, 100.0, 0.0,        false, {}               , {},                    {},                      {},                          {}, {}}, //no other objects beside host
-        DetectObjects_Data{300.0, M_PI * 0.5, 2.0, 3.0,         0.0, 100.0, 100.0, 0.0,        false, testMovingObjects, testStationaryObjects, expectedMovingObjects_a, expectedStationaryObjects_a, expectedMovingObjectsVisibleIds_a, expectedMovingObjectsDetectedIds_a}, //opening angle small
-        DetectObjects_Data{300.0, M_PI      , 2.0, 3.0,         0.0, 100.0, 100.0, 0.0,        false, testMovingObjects, testStationaryObjects, expectedMovingObjects_b, expectedStationaryObjects_b, expectedMovingObjectsVisibleIds_b, expectedMovingObjectsDetectedIds_b}, //half circle
-        DetectObjects_Data{300.0, M_PI * 1.5, 2.0, 3.0,         0.0, 100.0, 100.0, 0.0,        false, testMovingObjects, testStationaryObjects, expectedMovingObjects_c, expectedStationaryObjects_c, expectedMovingObjectsVisibleIds_c, expectedMovingObjectsDetectedIds_c}, //opening angle big
-        DetectObjects_Data{300.0, M_PI * 2.0, 2.0, 3.0,         0.0, 100.0, 100.0, 0.0,        false, testMovingObjects, testStationaryObjects, expectedMovingObjects_d, expectedStationaryObjects_d, expectedMovingObjectsVisibleIds_d, expectedMovingObjectsDetectedIds_d}, //full circle
-        DetectObjects_Data{300.0, M_PI * 0.5, 2.0, 3.0, -M_PI * 0.5, 100.0, 100.0, M_PI * 0.5, false, testMovingObjects, testStationaryObjects, expectedMovingObjects_e, expectedStationaryObjects_e, expectedMovingObjectsVisibleIds_e, expectedMovingObjectsDetectedIds_e}, //vehicle is rotated
-        DetectObjects_Data{30.5, M_PI * 0.5, 10.0, -10.0,       0.0,   0.0,  20.0, M_PI * 0.5, false, testMovingObjects, testStationaryObjects, expectedMovingObjects_f, expectedStationaryObjects_f, expectedMovingObjectsVisibleIds_f, expectedMovingObjectsDetectedIds_f}) //vehicle is pointing upwards, test correct sensorPosition
+//                                 openingAngle     lateral          positionX           vehicleYaw            movingObjects                           expectedMovingObjects
+//                         range       |  longitudinal  |      sensorYaw   |     positionY    | visualObstruction   |            stationaryObjects              |           expectedStationaryObjects
+//                           |         |        |       |          |       |         |        |        |            |                   |                       |                       |
+        DetectObjects_Data{0.0  , M_PI * 0.5, 0.0_m,  0.0_m,         0.0_rad, 100.0_m, 100.0_m, 0.0_rad, false, testMovingObjects, testStationaryObjects, {},                      {},                          {}, {}}, //zero range => no detected objects
+        DetectObjects_Data{300.0, M_PI * 0.5, 0.0_m,  0.0_m,         0.0_rad, 100.0_m, 100.0_m, 0.0_rad, false, {}               , {},                    {},                      {},                          {}, {}}, //no other objects beside host
+        DetectObjects_Data{300.0, M_PI * 0.5, 2.0_m,  3.0_m,         0.0_rad, 100.0_m, 100.0_m, 0.0_rad, false, testMovingObjects, testStationaryObjects, expectedMovingObjects_a, expectedStationaryObjects_a, expectedMovingObjectsVisibleIds_a, expectedMovingObjectsDetectedIds_a}, //opening angle small
+        DetectObjects_Data{300.0, M_PI      , 2.0_m,  3.0_m,         0.0_rad, 100.0_m, 100.0_m, 0.0_rad, false, testMovingObjects, testStationaryObjects, expectedMovingObjects_b, expectedStationaryObjects_b, expectedMovingObjectsVisibleIds_b, expectedMovingObjectsDetectedIds_b}, //half circle
+        DetectObjects_Data{300.0, M_PI * 1.5, 2.0_m,  3.0_m,         0.0_rad, 100.0_m, 100.0_m, 0.0_rad, false, testMovingObjects, testStationaryObjects, expectedMovingObjects_c, expectedStationaryObjects_c, expectedMovingObjectsVisibleIds_c, expectedMovingObjectsDetectedIds_c}, //opening angle big
+        DetectObjects_Data{300.0, M_PI * 2.0, 2.0_m,  3.0_m,         0.0_rad, 100.0_m, 100.0_m, 0.0_rad, false, testMovingObjects, testStationaryObjects, expectedMovingObjects_d, expectedStationaryObjects_d, expectedMovingObjectsVisibleIds_d, expectedMovingObjectsDetectedIds_d}, //full circle
+        DetectObjects_Data{300.0, M_PI * 0.5, 2.0_m,  3.0_m,         -90_deg, 100.0_m, 100.0_m,  90_deg, false, testMovingObjects, testStationaryObjects, expectedMovingObjects_e, expectedStationaryObjects_e, expectedMovingObjectsVisibleIds_e, expectedMovingObjectsDetectedIds_e}, //vehicle is rotated
+        DetectObjects_Data{30.5, M_PI * 0.5, 10.0_m, -10.0_m,        0.0_rad,   0.0_m,  20.0_m,  90_deg, false, testMovingObjects, testStationaryObjects, expectedMovingObjects_f, expectedStationaryObjects_f, expectedMovingObjectsVisibleIds_f, expectedMovingObjectsDetectedIds_f}) //vehicle is pointing upwards, test correct sensorPosition
 );
 
 //Obstruction Tests (RequiredPercentageOfVisibleArea = 40%)
 
 //Test A
 //Object 3 is behind Object 2, Object 5 is only partially inside detection field
-MovingObjectParameter testMovingObjectObstruction2{2, {50.0, 0.0}, {5.0, 7.0}, {-0.2, 0.3}, 0.0};
-MovingObjectParameter testMovingObjectObstruction3{3, {100.0, 0.0}, {6.0, 8.0}, {-0.3, 0.4}, 0.0};// shadowed by 2
-MovingObjectParameter testMovingObjectObstruction4{4, {50.0, 10.0}, {7.0, 9.0}, {-0.4, 0.5}, 0.0};
-MovingObjectParameter testMovingObjectObstruction5{5, {50.0, 51.0}, {8.0, 10.0}, {-0.4, 0.5}, 0.0};// only 30% inside detection field
+MovingObjectParameter testMovingObjectObstruction2{2, {50.0_m, 0.0_m}, {5.0_mps, 7.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 0.0_rad};
+MovingObjectParameter testMovingObjectObstruction3{3, {100.0_m, 0.0_m}, {6.0_mps, 8.0_mps}, {-0.3_mps_sq, 0.4_mps_sq}, 0.0_rad};// shadowed by 2
+MovingObjectParameter testMovingObjectObstruction4{4, {50.0_m, 10.0_m}, {7.0_mps, 9.0_mps}, {-0.4_mps_sq, 0.5_mps_sq}, 0.0_rad};
+MovingObjectParameter testMovingObjectObstruction5{5, {50.0_m, 51.0_m}, {8.0_mps, 10.0_mps}, {-0.4_mps_sq, 0.5_mps_sq}, 0.0_rad};// only 30% inside detection field
 std::vector<MovingObjectParameter> testMovingObjectsObstruction_a{testMovingObjectObstruction2, testMovingObjectObstruction3, testMovingObjectObstruction4, testMovingObjectObstruction5};
-MovingObjectParameter expectedMovingObjectObstruction2{2, {50.0, 0.0}, {-5.0, 2.0}, {1.8, -2.7}, 0.0};
-MovingObjectParameter expectedMovingObjectObstruction4{4, {50.0, 10.0}, {-3.0, 4.0}, {1.6, -2.5}, 0.0};
+MovingObjectParameter expectedMovingObjectObstruction2{2, {50.0_m, 0.0_m}, {-5.0_mps, 2.0_mps}, {1.8_mps_sq, -2.7_mps_sq}, 0.0_rad};
+MovingObjectParameter expectedMovingObjectObstruction4{4, {50.0_m, 10.0_m}, {-3.0_mps, 4.0_mps}, {1.6_mps_sq, -2.5_mps_sq}, 0.0_rad};
 std::vector<MovingObjectParameter> expectedMovingObjectsObstruction_a{expectedMovingObjectObstruction2, expectedMovingObjectObstruction4};
 std::vector<OWL::Id> expectedVisibleMovingObjectIdsObstruction_a{testMovingObjectObstruction2.id, testMovingObjectObstruction4.id, testMovingObjectObstruction5.id};
 std::vector<OWL::Id> expectedDetectedMovingObjectIdsObstruction_a{testMovingObjectObstruction2.id, testMovingObjectObstruction4.id};
 
 //Test B
 //Like Test A but with StationaryObjects as Objects 2 and 5
-StationaryObjectParameter testStationaryObjectObstruction2{2, {50.0, 0.0}, 0.0};
-StationaryObjectParameter testStationaryObjectObstruction5{4, {50.0, 51.0}, 0.0};// only 30% inside detection field
+StationaryObjectParameter testStationaryObjectObstruction2{2, {50.0_m, 0.0_m}, 0.0_rad};
+StationaryObjectParameter testStationaryObjectObstruction5{4, {50.0_m, 51.0_m}, 0.0_rad};// only 30% inside detection field
 std::vector<MovingObjectParameter> testMovingObjectsObstruction_b{testMovingObjectObstruction3, testMovingObjectObstruction4};
 std::vector<StationaryObjectParameter> testStationaryObjectsObstruction_b{testStationaryObjectObstruction2, testStationaryObjectObstruction5};
-StationaryObjectParameter expectedStationaryObjectObstruction2{2, {50.0, 0.0}, 0.0};
+StationaryObjectParameter expectedStationaryObjectObstruction2{2, {50.0_m, 0.0_m}, 0.0_rad};
 std::vector<MovingObjectParameter> expectedMovingObjectsObstruction_b{ expectedMovingObjectObstruction4};
 std::vector<StationaryObjectParameter> expectedStationaryObjectsObstruction_b{expectedStationaryObjectObstruction2};
 std::vector<OWL::Id> expectedVisibleMovingObjectIdsObstruction_b{testMovingObjectObstruction4.id};
@@ -300,48 +313,48 @@ std::vector<OWL::Id> expectedDetectedMovingObjectIdsObstruction_b{testMovingObje
 
 //Test C
 //Objects rotated; Object 7 is 50% shadowed by Object 6
-MovingObjectParameter testMovingObjectObstruction6{6, {50.0, 2.5}, {5.0, 7.0}, {-0.2, 0.3}, M_PI * 0.5};
-MovingObjectParameter testMovingObjectObstruction7{7, {70.0, 0.0}, {6.0, 8.0}, {-0.2, 0.3}, M_PI * 0.5};
+MovingObjectParameter testMovingObjectObstruction6{6, {50.0_m, 2.5_m}, {5.0_mps, 7.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 90_deg};
+MovingObjectParameter testMovingObjectObstruction7{7, {70.0_m, 0.0_m}, {6.0_mps, 8.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 90_deg};
 std::vector<MovingObjectParameter> testMovingObjectsObstruction_c{testMovingObjectObstruction6, testMovingObjectObstruction7};
-MovingObjectParameter expectedMovingObjectObstruction6{6, {50.0, 2.5}, {-5.0, 2.0}, {1.8, -2.7}, M_PI * 0.5};
-MovingObjectParameter expectedMovingObjectObstruction7{7, {70.0, 0.0}, {-4.0, 3.0}, {1.8, -2.7}, M_PI * 0.5};
+MovingObjectParameter expectedMovingObjectObstruction6{6, {50.0_m, 2.5_m}, {-5.0_mps, 2.0_mps}, {1.8_mps_sq, -2.7_mps_sq}, 90_deg};
+MovingObjectParameter expectedMovingObjectObstruction7{7, {70.0_m, 0.0_m}, {-4.0_mps, 3.0_mps}, {1.8_mps_sq, -2.7_mps_sq}, 90_deg};
 std::vector<MovingObjectParameter> expectedMovingObjectsObstruction_c{expectedMovingObjectObstruction6, expectedMovingObjectObstruction7};
 std::vector<OWL::Id> expectedVisibleMovingObjectIdsObstruction_c{testMovingObjectObstruction6.id, testMovingObjectObstruction7.id};
 std::vector<OWL::Id> expectedDetectedMovingObjectIdsObstruction_c{testMovingObjectObstruction6.id, testMovingObjectObstruction7.id};
 
 //Test D
 //Objects rotated and half circle; Object 9 is 70% shadowed by Object 8
-MovingObjectParameter testMovingObjectObstruction8{8, {11.0, 7.5}, {5.0, 7.0}, {-0.2, 0.3}, M_PI * 0.5};
-MovingObjectParameter testMovingObjectObstruction9{9, {101.0, 100.0}, {6.0, 8.0}, {-0.2, 0.3}, M_PI * 0.5};
+MovingObjectParameter testMovingObjectObstruction8{8, {11.0_m, 7.5_m}, {5.0_mps, 7.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 90_deg};
+MovingObjectParameter testMovingObjectObstruction9{9, {101.0_m, 100.0_m}, {6.0_mps, 8.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 90_deg};
 std::vector<MovingObjectParameter> testMovingObjectsObstruction_d{testMovingObjectObstruction8, testMovingObjectObstruction9};
-MovingObjectParameter expectedMovingObjectObstruction8{8, {11.0, 7.5}, {-5.0, 2.0}, {1.8, -2.7}, M_PI * 0.5};
+MovingObjectParameter expectedMovingObjectObstruction8{8, {11.0_m, 7.5_m}, {-5.0_mps, 2.0_mps}, {1.8_mps_sq, -2.7_mps_sq}, 90_deg};
 std::vector<MovingObjectParameter> expectedMovingObjectsObstruction_d{expectedMovingObjectObstruction8};
 std::vector<OWL::Id> expectedVisibleMovingObjectIdsObstruction_d{testMovingObjectObstruction8.id, testMovingObjectObstruction9.id};
 std::vector<OWL::Id> expectedDetectedMovingObjectIdsObstruction_d{testMovingObjectObstruction8.id};
 
 //Test E
 //Objects 10 and 11 partially shadow Object 12 with less then 40% but together with more than 70%
-MovingObjectParameter testMovingObjectObstruction10{10, {97.0, 3.0}, {5.0, 7.0}, {-0.2, 0.3}, M_PI * 0.5};
-MovingObjectParameter testMovingObjectObstruction11{11, {97.0, -3.0}, {6.0, 8.0}, {-0.2, 0.3}, M_PI * 0.5};
-MovingObjectParameter testMovingObjectObstruction12{12, {100.0, 0.0}, {6.0, 8.0}, {-0.2, 0.3}, M_PI * 0.5};
+MovingObjectParameter testMovingObjectObstruction10{10, {97.0_m, 3.0_m}, {5.0_mps, 7.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 90_deg};
+MovingObjectParameter testMovingObjectObstruction11{11, {97.0_m, -3.0_m}, {6.0_mps, 8.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 90_deg};
+MovingObjectParameter testMovingObjectObstruction12{12, {100.0_m, 0.0_m}, {6.0_mps, 8.0_mps}, {-0.2_mps_sq, 0.3_mps_sq}, 90_deg};
 std::vector<MovingObjectParameter> testMovingObjectsObstruction_e{testMovingObjectObstruction10, testMovingObjectObstruction11, testMovingObjectObstruction12};
-MovingObjectParameter expectedMovingObjectObstruction10{10, {97.0, 3.0}, {-5.0, 2.0}, {1.8, -2.7}, M_PI * 0.5};
-MovingObjectParameter expectedMovingObjectObstruction11{11, {97.0, -3.0}, {-4.0, 3.0}, {1.8, -2.7}, M_PI * 0.5};
+MovingObjectParameter expectedMovingObjectObstruction10{10, {97.0_m, 3.0_m}, {-5.0_mps, 2.0_mps}, {1.8_mps_sq, -2.7_mps_sq}, 90_deg};
+MovingObjectParameter expectedMovingObjectObstruction11{11, {97.0_m, -3.0_m}, {-4.0_mps, 3.0_mps}, {1.8_mps_sq, -2.7_mps_sq}, 90_deg};
 std::vector<MovingObjectParameter> expectedMovingObjectsObstruction_e{expectedMovingObjectObstruction10, expectedMovingObjectObstruction11};
 std::vector<OWL::Id> expectedVisibleMovingObjectIdsObstruction_e{testMovingObjectObstruction10.id, testMovingObjectObstruction11.id, testMovingObjectObstruction12.id};
 std::vector<OWL::Id> expectedDetectedMovingObjectIdsObstruction_e{testMovingObjectObstruction10.id, testMovingObjectObstruction11.id};
 
 INSTANTIATE_TEST_CASE_P(WithObstruction, DetectObjects,
     ::testing::Values(
-//                                openingAngle   lateral   positionX vehicleYaw           movingObjects                                      expectedMovingObjects
-//                         range      | longitudinal|   yaw   |position | visualObstruction    |            stationaryObjects                         |                       expectedStationaryObjects
-//                           |        |        |    |    |    |    |    |    |                 |                   |                                  |                                    |
-        DetectObjects_Data{300.0, M_PI * 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, true, {}                            , {},                                 {},                                 {}, {}, {}}, //no other objects beside host
-        DetectObjects_Data{300.0, M_PI * 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, true, testMovingObjectsObstruction_a, {},                                 expectedMovingObjectsObstruction_a, {}, expectedVisibleMovingObjectIdsObstruction_a, expectedDetectedMovingObjectIdsObstruction_a}, //Test A
-        DetectObjects_Data{300.0, M_PI * 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, true, testMovingObjectsObstruction_b, testStationaryObjectsObstruction_b, expectedMovingObjectsObstruction_b, expectedStationaryObjectsObstruction_b, expectedVisibleMovingObjectIdsObstruction_b, expectedDetectedMovingObjectIdsObstruction_b}, //Test B
-        DetectObjects_Data{300.0, M_PI * 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, true, testMovingObjectsObstruction_c, {},                                 expectedMovingObjectsObstruction_c, {}, expectedVisibleMovingObjectIdsObstruction_c, expectedDetectedMovingObjectIdsObstruction_c}, //Test C
-        DetectObjects_Data{300.0, M_PI * 1.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, true, testMovingObjectsObstruction_d, {},                                 expectedMovingObjectsObstruction_d, {}, expectedVisibleMovingObjectIdsObstruction_d, expectedDetectedMovingObjectIdsObstruction_d}, //Test D
-        DetectObjects_Data{300.0, M_PI * 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, true, testMovingObjectsObstruction_e, {},                                 expectedMovingObjectsObstruction_e, {}, expectedVisibleMovingObjectIdsObstruction_e, expectedDetectedMovingObjectIdsObstruction_e}) //Test E
+//                                openingAngle       lateral   positionX     vehicleYaw           movingObjects                                      expectedMovingObjects
+//                         range      |  longitudinal   |   yaw   |    positionY |    visualObstruction    |            stationaryObjects                         |                       expectedStationaryObjects
+//                           |        |        |        |    |    |       |      |       |                 |                   |                                  |                                    |
+        DetectObjects_Data{300.0, M_PI * 0.5, 0.5_m, 0.0_m, 0.0_rad, 0.0_m, 0.0_m, 0.0_rad, true, {}                            , {},                                 {},                                 {}, {}, {}}, //no other objects beside host
+        DetectObjects_Data{300.0, M_PI * 0.5, 0.5_m, 0.0_m, 0.0_rad, 0.0_m, 0.0_m, 0.0_rad, true, testMovingObjectsObstruction_a, {},                                 expectedMovingObjectsObstruction_a, {}, expectedVisibleMovingObjectIdsObstruction_a, expectedDetectedMovingObjectIdsObstruction_a}, //Test A
+        DetectObjects_Data{300.0, M_PI * 0.5, 0.5_m, 0.0_m, 0.0_rad, 0.0_m, 0.0_m, 0.0_rad, true, testMovingObjectsObstruction_b, testStationaryObjectsObstruction_b, expectedMovingObjectsObstruction_b, expectedStationaryObjectsObstruction_b, expectedVisibleMovingObjectIdsObstruction_b, expectedDetectedMovingObjectIdsObstruction_b}, //Test B
+        DetectObjects_Data{300.0, M_PI * 0.5, 0.5_m, 0.0_m, 0.0_rad, 0.0_m, 0.0_m, 0.0_rad, true, testMovingObjectsObstruction_c, {},                                 expectedMovingObjectsObstruction_c, {}, expectedVisibleMovingObjectIdsObstruction_c, expectedDetectedMovingObjectIdsObstruction_c}, //Test C
+        DetectObjects_Data{300.0, M_PI * 1.0, 0.5_m, 0.0_m, 0.0_rad, 0.0_m, 0.0_m, 0.0_rad, true, testMovingObjectsObstruction_d, {},                                 expectedMovingObjectsObstruction_d, {}, expectedVisibleMovingObjectIdsObstruction_d, expectedDetectedMovingObjectIdsObstruction_d}, //Test D
+        DetectObjects_Data{300.0, M_PI * 0.5, 0.5_m, 0.0_m, 0.0_rad, 0.0_m, 0.0_m, 0.0_rad, true, testMovingObjectsObstruction_e, {},                                 expectedMovingObjectsObstruction_e, {}, expectedVisibleMovingObjectIdsObstruction_e, expectedDetectedMovingObjectIdsObstruction_e}) //Test E
 );
 
 // This test should be enabled as soon as the mounting position of the sensor is taken into account of all readings in SensorData
@@ -355,30 +368,30 @@ TEST_F(DetectObjects, DISABLED_CompareMovingObjectsWithMountingPosition)
 
     fakeDoubles["DetectionRange"] = 300.0;
     fakeDoubles["OpeningAngleH"] = M_PI * 2.0;
-    fakeDoubles["Longitudinal"] = sensor_mounting_posOffX;
-    fakeDoubles["Lateral"] = sensor_mounting_posOffY;
-    fakeDoubles["Yaw"] = sensor_mounting_Yaw;
+    fakeVehicleModelParameters->properties["SensorPosition/Position1/Longitudinal"] = std::to_string(sensor_mounting_posOffX);
+    fakeVehicleModelParameters->properties["SensorPosition/Position1/Lateral"] = std::to_string(sensor_mounting_posOffY);
+    fakeVehicleModelParameters->properties["SensorPosition/Position1/Yaw"] = std::to_string(sensor_mounting_Yaw);
     fakeBools["EnableVisualObstruction"] = false;
     sensorView->mutable_host_vehicle_id()->set_value(1);
 
-    auto yawZero = 0.0;
-    auto YawOrtho = M_PI / 2.0;
-    auto YawOpposing = M_PI;
+    auto yawZero = 0.0_rad;
+    auto YawOrtho = units::angle::radian_t(M_PI / 2.0);
+    auto YawOpposing = units::angle::radian_t(M_PI);
 
     std::vector<MovingObjectParameter> expectedMovingObjects {};
     std::vector<StationaryObjectParameter> expectedStationaryObjects {};
 
-    MovingObjectParameter hostVehicle{1, {0.0, 0.0}, {0.0, 0.0}, {0, 0}, yawZero};
+    MovingObjectParameter hostVehicle{1, {0.0_m, 0.0_m}, {0.0_mps, 0.0_mps}, {0_mps_sq, 0_mps_sq}, yawZero};
     AddMovingObjectToSensorView(*sensorView, hostVehicle);
 
-    MovingObjectParameter orthoVehicle{2, {2.0, 2.0}, {0.0, 0.0}, {0, 0}, YawOrtho};
-    MovingObjectParameter opposingVehicle{3, {8.0, 0.0}, {0.0, 0.0}, {0, 0}, YawOpposing};
+    MovingObjectParameter orthoVehicle{2, {2.0_m, 2.0_m}, {0.0_mps, 0.0_mps}, {0_mps_sq, 0_mps_sq}, YawOrtho};
+    MovingObjectParameter opposingVehicle{3, {8.0_m, 0.0_m}, {0.0_mps, 0.0_mps}, {0_mps_sq, 0_mps_sq}, YawOpposing};
     AddMovingObjectToSensorView(*sensorView, orthoVehicle);
     AddMovingObjectToSensorView(*sensorView, opposingVehicle);
     expectedMovingObjects.emplace_back(orthoVehicle);
     expectedMovingObjects.emplace_back(opposingVehicle);
 
-    StationaryObjectParameter orthoObject {10, {2,-2}, YawOrtho};
+    StationaryObjectParameter orthoObject {10, {2_m,-2_m}, YawOrtho};
     AddStationaryObjectToSensorView(*sensorView, orthoObject);
     expectedStationaryObjects.emplace_back(orthoObject);
 
@@ -433,9 +446,9 @@ TEST_F(DetectObjects, DISABLED_CompareMovingObjectsWithMountingPosition)
     auto sensorData_s0_pos_Z = sensorData.moving_object(0).base().position().z();
 
     //Are Moving Objects correct rotated to each other
-    ASSERT_EQ(sensorData_m0_yaw_ortho - movingHost_yaw, world_yawDelta_Ortho);
-    ASSERT_EQ(sensorData_m1_yaw_opposite - movingHost_yaw, world_yawDelta_Opposite);
-    ASSERT_EQ(sensorData_s0_yaw_ortho - movingHost_yaw, world_yawDelta_Ortho);
+    ASSERT_EQ(sensorData_m0_yaw_ortho - movingHost_yaw, world_yawDelta_Ortho.value());
+    ASSERT_EQ(sensorData_m1_yaw_opposite - movingHost_yaw, world_yawDelta_Opposite.value());
+    ASSERT_EQ(sensorData_s0_yaw_ortho - movingHost_yaw, world_yawDelta_Ortho.value());
 
    /*ASSERT_EQ(sensorData.has_mounting_position(), true);
    ASSERT_EQ(sensorData.mounting_position().orientation().yaw(), sensor_mounting_Yaw);
@@ -448,9 +461,9 @@ TEST_F(DetectObjects, DISABLED_CompareMovingObjectsWithMountingPosition)
    ASSERT_EQ(sensorData.sensor_view(0).mounting_position().position().y(), sensor_mounting_posOffY);
 
    //Are Absolute values in SensorSpace?
-   ASSERT_EQ(sensorData_m0_yaw_ortho + sensor_mounting_Yaw, world_yawDelta_Ortho );
-   ASSERT_EQ(sensorData_m1_yaw_opposite + sensor_mounting_Yaw, world_yawDelta_Opposite);
-   ASSERT_EQ(sensorData_s0_yaw_ortho + sensor_mounting_Yaw, world_yawDelta_Opposite);
+   ASSERT_EQ(sensorData_m0_yaw_ortho + sensor_mounting_Yaw, world_yawDelta_Ortho.value());
+   ASSERT_EQ(sensorData_m1_yaw_opposite + sensor_mounting_Yaw, world_yawDelta_Opposite.value());
+   ASSERT_EQ(sensorData_s0_yaw_ortho + sensor_mounting_Yaw, world_yawDelta_Opposite.value());
 
    ASSERT_EQ(sensorData_m0_pos_X + sensor_mounting_posOffX, groundTruth->moving_object(1).base().position().x());
    ASSERT_EQ(sensorData_m1_pos_X + sensor_mounting_posOffX, groundTruth->moving_object(2).base().position().x());
diff --git a/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_Tests.h b/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_Tests.h
index d291e5c6c59894ddca4e95a67bb7e2bb8f23dc66..7072af9b93f96c43665848b3207f785f2ff79dc5 100644
--- a/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_Tests.h
+++ b/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_Tests.h
@@ -24,9 +24,9 @@ public:
     SensorGeometric2DWithObstruction_UnitTests();
     virtual ~SensorGeometric2DWithObstruction_UnitTests() = 0;
 
-    void PlaceEgo(double x, double y, double yaw);
-    void PlaceAgent(double x, double y, double length, double width, double yaw);
-    void InitSensor(double range, double openingAngleH, bool obstruction, double minAreaPercentage);
+    void PlaceEgo(units::length::meter_t x, units::length::meter_t y, units::angle::radian_t yaw);
+    void PlaceAgent(units::length::meter_t x, units::length::meter_t y, units::length::meter_t length, units::length::meter_t width, units::angle::radian_t yaw);
+    void InitSensor(units::length::meter_t range, double openingAngleH, bool obstruction, double minAreaPercentage);
     const std::vector<DetectedObject> DetectAndSortObjects();
 
     const polygon_t& GetBBByAgentId(size_t id);
diff --git a/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_TestsCommon.h b/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_TestsCommon.h
index b63dc4dcfa05bfadbd0bbaf118d5c584ec2063af..7a17a9c6eb5c214632c441fff930f4e82e283748 100644
--- a/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_TestsCommon.h
+++ b/sim/tests/unitTests/components/Sensor_OSI/sensorOSI_TestsCommon.h
@@ -17,10 +17,10 @@ class MovingObjectParameter
 {
 public:
     MovingObjectParameter(unsigned int id,
-                          Common::Vector2d position,
-                          Common::Vector2d velocity,
-                          Common::Vector2d acceleration,
-                          double yaw) :
+                          Common::Vector2d<units::length::meter_t> position,
+                          Common::Vector2d<units::velocity::meters_per_second_t> velocity,
+                          Common::Vector2d<units::acceleration::meters_per_second_squared_t> acceleration,
+                          units::angle::radian_t yaw) :
         id(id),
         position(position),
         velocity(velocity),
@@ -31,10 +31,10 @@ public:
     MovingObjectParameter (const osi3::DetectedMovingObject& movingObject)
     {
         id = movingObject.header().ground_truth_id(0).value();
-        position = Common::Vector2d(movingObject.base().position().x(), movingObject.base().position().y());
-        velocity = Common::Vector2d(movingObject.base().velocity().x(), movingObject.base().velocity().y());
-        acceleration = Common::Vector2d(movingObject.base().acceleration().x(), movingObject.base().acceleration().y());
-        yaw = movingObject.base().orientation().yaw();
+        position = Common::Vector2d<units::length::meter_t>(units::length::meter_t(movingObject.base().position().x()), units::length::meter_t(movingObject.base().position().y()));
+        velocity = Common::Vector2d<units::velocity::meters_per_second_t>(units::velocity::meters_per_second_t(movingObject.base().velocity().x()), units::velocity::meters_per_second_t(movingObject.base().velocity().y()));
+        acceleration = Common::Vector2d<units::acceleration::meters_per_second_squared_t>(units::acceleration::meters_per_second_squared_t(movingObject.base().acceleration().x()), units::acceleration::meters_per_second_squared_t(movingObject.base().acceleration().y()));
+        yaw = units::angle::radian_t(movingObject.base().orientation().yaw());
     }
 
     bool operator==(const MovingObjectParameter& rhs) const
@@ -51,7 +51,7 @@ public:
             return false;
         }
 
-        if ((yaw - rhs.yaw) > EPSILON)
+        if ((yaw - rhs.yaw) > units::angle::radian_t(EPSILON))
         {
             return false;
         }
@@ -72,18 +72,18 @@ public:
     }
 
     unsigned int id;
-    Common::Vector2d position;
-    Common::Vector2d velocity;
-    Common::Vector2d acceleration;
-    double yaw;
+    Common::Vector2d<units::length::meter_t> position;
+    Common::Vector2d<units::velocity::meters_per_second_t> velocity;
+    Common::Vector2d<units::acceleration::meters_per_second_squared_t> acceleration;
+    units::angle::radian_t yaw;
 };
 
 class StationaryObjectParameter
 {
 public:
     StationaryObjectParameter(unsigned int id,
-                          Common::Vector2d position,
-                          double yaw) :
+                          Common::Vector2d<units::length::meter_t> position,
+                          units::angle::radian_t yaw) :
         id(id),
         position(position),
         yaw(yaw)
@@ -92,8 +92,8 @@ public:
     StationaryObjectParameter (const osi3::DetectedStationaryObject& stationaryObject)
     {
         id = stationaryObject.header().ground_truth_id(0).value();
-        position = Common::Vector2d(stationaryObject.base().position().x(), stationaryObject.base().position().y());
-        yaw = stationaryObject.base().orientation().yaw();
+        position = Common::Vector2d<units::length::meter_t>(units::length::meter_t(stationaryObject.base().position().x()), units::length::meter_t(stationaryObject.base().position().y()));
+        yaw = units::angle::radian_t(stationaryObject.base().orientation().yaw());
     }
 
     bool operator==(const StationaryObjectParameter& rhs) const
@@ -108,7 +108,7 @@ public:
             return false;
         }
 
-        if ((yaw - rhs.yaw) > EPSILON)
+        if ((yaw - rhs.yaw) > units::angle::radian_t(EPSILON))
         {
             return false;
         }
@@ -127,6 +127,6 @@ public:
     }
 
     unsigned int id;
-    Common::Vector2d position;
-    double yaw;
+    Common::Vector2d<units::length::meter_t> position;
+    units::angle::radian_t yaw;
 };
diff --git a/sim/tests/unitTests/core/opSimulation/CMakeLists.txt b/sim/tests/unitTests/core/opSimulation/CMakeLists.txt
index c09516d67c17ec910e596d0fd72cede586fcea0a..01a6198d8d76a9a735852d0f016c94ca5156db45 100644
--- a/sim/tests/unitTests/core/opSimulation/CMakeLists.txt
+++ b/sim/tests/unitTests/core/opSimulation/CMakeLists.txt
@@ -36,14 +36,6 @@ add_openpass_target(
     # EventNetwork
     eventNetwork_Tests.cpp
     ${COMPONENT_SOURCE_DIR}/framework/eventNetwork.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/eventDetectorImporter.cpp
-
-    # ImporterCommon
-    ${COMPONENT_SOURCE_DIR}/importer/importerCommon.cpp
-
-    # ManipulatorImporter
-    manipulatorImporter_Tests.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/oscImporterCommon.cpp
 
     # ParameterImporter
     parameterImporter_Tests.cpp
@@ -51,6 +43,7 @@ add_openpass_target(
 
     # ProfilesImporter
     profilesImporter_Tests.cpp
+    ${COMPONENT_SOURCE_DIR}/importer/importerCommon.cpp
     ${COMPONENT_SOURCE_DIR}/importer/profiles.cpp
     ${COMPONENT_SOURCE_DIR}/importer/profilesImporter.cpp
 
@@ -63,14 +56,6 @@ add_openpass_target(
     sampler_Tests.cpp
     ${COMPONENT_SOURCE_DIR}/framework/sampler.cpp
 
-    # ScenarioImporter
-    scenarioImporter_Tests.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/oscImporterCommon.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/scenario.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/scenarioImporter.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/scenarioImporterHelper.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/sceneryDynamics.cpp
-
     # SceneryImporter
     roadGeometry_Tests.cpp
     sceneryImporter_Tests.cpp
@@ -91,11 +76,7 @@ add_openpass_target(
     ${COMPONENT_SOURCE_DIR}/importer/systemConfig.cpp
     ${COMPONENT_SOURCE_DIR}/importer/systemConfigImporter.cpp
 
-    # VehicleModelsImporter
-    vehicleModelsImporter_Tests.cpp
     ${COMPONENT_SOURCE_DIR}/importer/vehicleModels.cpp
-    ${COMPONENT_SOURCE_DIR}/importer/vehicleModelsImporter.cpp
-
   HEADERS
     ${OPENPASS_SIMCORE_DIR}/core/common/log.h
 
@@ -115,18 +96,12 @@ add_openpass_target(
 
     # EventNetwork
     ${COMPONENT_SOURCE_DIR}/framework/eventNetwork.h
-    ${COMPONENT_SOURCE_DIR}/importer/eventDetectorImporter.h
-
-    # ImporterCommon
-    ${COMPONENT_SOURCE_DIR}/importer/importerCommon.h
-
-    # ManipulatorImporter
-    ${COMPONENT_SOURCE_DIR}/importer/oscImporterCommon.h
 
     # ParameterImporter
     ${COMPONENT_SOURCE_DIR}/importer/parameterImporter.h
 
     # ProfilesImporter
+    ${COMPONENT_SOURCE_DIR}/importer/importerCommon.h
     ${COMPONENT_SOURCE_DIR}/importer/profiles.h
     ${COMPONENT_SOURCE_DIR}/importer/profilesImporter.h
 
@@ -137,13 +112,6 @@ add_openpass_target(
     # Sampler
     ${COMPONENT_SOURCE_DIR}/framework/sampler.h
 
-    # ScenarioImporter
-    ${COMPONENT_SOURCE_DIR}/importer/oscImporterCommon.h
-    ${COMPONENT_SOURCE_DIR}/importer/scenario.h
-    ${COMPONENT_SOURCE_DIR}/importer/scenarioImporter.h
-    ${COMPONENT_SOURCE_DIR}/importer/scenarioImporterHelper.h
-    ${COMPONENT_SOURCE_DIR}/importer/sceneryDynamics.h
-
     # SceneryImporter
     ${COMPONENT_SOURCE_DIR}/importer/connection.h
     ${COMPONENT_SOURCE_DIR}/importer/junction.h
@@ -156,10 +124,7 @@ add_openpass_target(
     ${COMPONENT_SOURCE_DIR}/importer/simulationConfig.h
     ${COMPONENT_SOURCE_DIR}/importer/simulationConfigImporter.h
 
-    # VehicleModelsImporter
     ${COMPONENT_SOURCE_DIR}/importer/vehicleModels.h
-    ${COMPONENT_SOURCE_DIR}/importer/vehicleModelsImporter.h
-
   INCDIRS
     ${COMPONENT_SOURCE_DIR}
     ${COMPONENT_SOURCE_DIR}/..
diff --git a/sim/tests/unitTests/core/opSimulation/Scheduler/CMakeLists.txt b/sim/tests/unitTests/core/opSimulation/Scheduler/CMakeLists.txt
index d75eda7cfd5b69c3ba5d60177f1d55348b329273..053af2df51304e55c2f75aee0b9101295cc2855c 100644
--- a/sim/tests/unitTests/core/opSimulation/Scheduler/CMakeLists.txt
+++ b/sim/tests/unitTests/core/opSimulation/Scheduler/CMakeLists.txt
@@ -21,13 +21,11 @@ add_openpass_target(
     ${COMPONENT_SOURCE_DIR}/schedulerTasks.cpp
     ${COMPONENT_SOURCE_DIR}/taskBuilder.cpp
     ${COMPONENT_SOURCE_DIR}/tasks.cpp
-    ${OPENPASS_SIMCORE_DIR}/common/eventDetectorDefinitions.cpp
     ${OPENPASS_SIMCORE_DIR}/core/common/log.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/bindings/eventDetectorBinding.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/bindings/eventDetectorLibrary.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/agentDataPublisher.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agent.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentBlueprint.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/channel.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/component.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/parameters.cpp
diff --git a/sim/tests/unitTests/core/opSimulation/Scheduler/agentParser_Tests.cpp b/sim/tests/unitTests/core/opSimulation/Scheduler/agentParser_Tests.cpp
index 04ad7d8a7a5be146b664788951e633ad94d3efb0..b0ecda24e66dd5a4fc984302c738c7f6fa5fb69a 100644
--- a/sim/tests/unitTests/core/opSimulation/Scheduler/agentParser_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/Scheduler/agentParser_Tests.cpp
@@ -15,7 +15,6 @@
 #include "channel.h"
 #include "component.h"
 #include "fakeAgent.h"
-#include "fakeAgentBlueprint.h"
 #include "fakeComponent.h"
 #include "fakeWorld.h"
 #include "gmock/gmock.h"
@@ -37,12 +36,12 @@ using namespace core::scheduling;
 
 TEST(AgentParser, RecurringComponent_IsParsed)
 {
-    NiceMock<FakeAgentBlueprint> fakeAgentBlueprint;
+    AgentBuildInstructions agentBuildInstructions;
     NiceMock<FakeWorld> fakeWorld;
     NiceMock<FakeAgent> fakeAgent;
     EXPECT_CALL(fakeWorld, CreateAgentAdapter(_)).WillOnce(ReturnRef(fakeAgent));
 
-    Agent testAgent(&fakeWorld, fakeAgentBlueprint);
+    Agent testAgent(&fakeWorld, agentBuildInstructions);
 
     Channel testChannel(1);
     Component testTargetComponent("", &testAgent);
@@ -77,12 +76,12 @@ TEST(AgentParser, RecurringComponent_IsParsed)
 
 TEST(AgentParser, ThreeRecurringComponents_AreParsed)
 {
-    NiceMock<FakeAgentBlueprint> fakeAgentBlueprint;
+    AgentBuildInstructions agentBuildInstructions;
     NiceMock<FakeWorld> fakeWorld;
     NiceMock<FakeAgent> fakeAgent;
     EXPECT_CALL(fakeWorld, CreateAgentAdapter(_)).WillOnce(ReturnRef(fakeAgent));
 
-    Agent testAgent(&fakeWorld, fakeAgentBlueprint);
+    Agent testAgent(&fakeWorld, agentBuildInstructions);
 
     Channel testChannel(1);
     Component testTargetComponent("", &testAgent);
@@ -135,12 +134,12 @@ TEST(AgentParser, ThreeRecurringComponents_AreParsed)
 
 TEST(AgentParser, NonRecurringComponent_IsParsed)
 {
-    NiceMock<FakeAgentBlueprint> fakeAgentBlueprint;
+    AgentBuildInstructions agentBuildInstructions;
     NiceMock<FakeWorld> fakeWorld;
     NiceMock<FakeAgent> fakeAgent;
     EXPECT_CALL(fakeWorld, CreateAgentAdapter(_)).WillOnce(ReturnRef(fakeAgent));
 
-    Agent testAgent(&fakeWorld, fakeAgentBlueprint);
+    Agent testAgent(&fakeWorld, agentBuildInstructions);
 
     Channel testChannel(1);
     Component testTargetComponent("", &testAgent);
@@ -174,12 +173,12 @@ TEST(AgentParser, NonRecurringComponent_IsParsed)
 
 TEST(AgentParser, MixedComponents_AreParsedWithRightTaskType)
 {
-    NiceMock<FakeAgentBlueprint> fakeAgentBlueprint;
+    AgentBuildInstructions agentBuildInstructions;
     NiceMock<FakeWorld> fakeWorld;
     NiceMock<FakeAgent> fakeAgent;
     EXPECT_CALL(fakeWorld, CreateAgentAdapter(_)).WillOnce(ReturnRef(fakeAgent));
 
-    Agent testAgent(&fakeWorld, fakeAgentBlueprint);
+    Agent testAgent(&fakeWorld, agentBuildInstructions);
 
     Channel testChannel(1);
     Component testTargetComponent("", &testAgent);
diff --git a/sim/tests/unitTests/core/opSimulation/Scheduler/scheduler_Tests.cpp b/sim/tests/unitTests/core/opSimulation/Scheduler/scheduler_Tests.cpp
index 8f8442094c05de04615f2b319a763524fa6ae818..1f10a89c77a6e5bf736663d5286b3b1520e536d5 100644
--- a/sim/tests/unitTests/core/opSimulation/Scheduler/scheduler_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/Scheduler/scheduler_Tests.cpp
@@ -15,17 +15,24 @@
 #include "eventDetector.h"
 #include "eventDetectorLibrary.h"
 #include "fakeDataBuffer.h"
+#include "fakeEnvironment.h"
 #include "fakeEventDetectorNetwork.h"
 #include "fakeEventNetwork.h"
 #include "fakeManipulatorNetwork.h"
 #include "fakeObservationNetwork.h"
 #include "fakeSpawnPointNetwork.h"
 #include "fakeWorld.h"
+#include "fakeAgentFactory.h"
+#include "fakeConfigurationContainer.h"
+#include "fakeStochastics.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "scheduler.h"
 #include "schedulerTasks.h"
 #include "runResult.h"
+#include "environment.h"
+#include "agentBlueprintProvider.h"
+#include "common/globalDefinitions.h"
 
 using namespace core::scheduling;
 
@@ -76,6 +83,10 @@ TEST(DISABLED_Scheduler, RunWorks)
     NiceMock<FakeManipulatorNetwork> fakeManipulatorNetwork;
     NiceMock<FakeObservationNetwork> fakeObservationNetwork;
     NiceMock<FakeEventDetectorNetwork> fakeEventDetectorNetwork;
+    NiceMock<FakeStochastics> fakestochastics;
+    NiceMock<FakeConfigurationContainer> fakeConfigurationContainer;
+    NiceMock<FakeEnvironment> fakeEnvironment;
+    ON_CALL(fakeEnvironment, GetSimulationTime());
 
     NiceMock<FakeEventNetwork> fakeEventNetwork;
     core::EventDetectorLibrary edl("", nullptr);
@@ -88,8 +99,8 @@ TEST(DISABLED_Scheduler, RunWorks)
 
     ON_CALL(fakeEventDetectorNetwork, GetEventDetectors()).WillByDefault(Return(fakeEventDetectors));
 
-    Scheduler scheduler(fakeWorld, fakeSpawnPointNetwork, fakeEventDetectorNetwork, fakeManipulatorNetwork, fakeObservationNetwork, fakeDataBuffer);
+    Scheduler scheduler(fakeWorld, fakeSpawnPointNetwork, fakeEventDetectorNetwork, fakeManipulatorNetwork, fakeObservationNetwork, fakeDataBuffer, fakeEnvironment);
 
     RunResult runResult{};
-    scheduler.Run(0, 300, runResult, fakeEventNetwork);
+    scheduler.Run(0, runResult, fakeEventNetwork, nullptr);
 }
diff --git a/sim/tests/unitTests/core/opSimulation/Scheduler/taskBuilder_Tests.cpp b/sim/tests/unitTests/core/opSimulation/Scheduler/taskBuilder_Tests.cpp
index 5456f2d1756ec800c12e5187cf77d7197195d832..c2507934ebc1a94f00f92e6995a0e63f90394031 100644
--- a/sim/tests/unitTests/core/opSimulation/Scheduler/taskBuilder_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/Scheduler/taskBuilder_Tests.cpp
@@ -9,7 +9,6 @@
  ********************************************************************************/
 #include <vector>
 
-#include "include/scenarioInterface.h"
 #include "eventDetector.h"
 #include "fakeDataBuffer.h"
 #include "fakeEventDetectorNetwork.h"
@@ -51,7 +50,8 @@ TEST(TaskBuilder, SpawningTaskCreation_Works)
                             nullptr,
                             &fakeEventDetectorNetwork,
                             &fakeManipulatorNetwork,
-                            &fakeDataBuffer);
+                            &fakeDataBuffer,
+                            nullptr);
 
     auto commonTasks = taskBuilder.CreateSpawningTasks();
     ASSERT_THAT(commonTasks, SizeIs(Gt(size_t(0))));
@@ -86,7 +86,8 @@ TEST(TaskBuilder, PreAgentTaskCreation_Works)
                             nullptr,
                             &fakeEventDetectorNetwork,
                             &fakeManipulatorNetwork,
-                            &fakeDataBuffer);
+                            &fakeDataBuffer,
+                            nullptr);
 
     auto commonTasks = taskBuilder.CreatePreAgentTasks();
     ASSERT_THAT(commonTasks, SizeIs(Gt(size_t(0))));
@@ -113,7 +114,8 @@ TEST(TaskBuilder, SynchronizeTaskCreation_Works)
                             nullptr,
                             &fakeEventDetectorNetwork,
                             &fakeManipulatorNetwork,
-                            &fakeDataBuffer);
+                            &fakeDataBuffer,
+                            nullptr);
 
     auto finalizeTasks = taskBuilder.CreateSynchronizeTasks();
     ASSERT_THAT(finalizeTasks, SizeIs(Gt(size_t(0))));
diff --git a/sim/tests/unitTests/core/opSimulation/agentSampler_Tests.cpp b/sim/tests/unitTests/core/opSimulation/agentSampler_Tests.cpp
index da87d0c3382e627e7f8683fc95b2e3b5aa1f6c08..3192710e51bfaf72fee22b2daf3925726d9cb60e 100644
--- a/sim/tests/unitTests/core/opSimulation/agentSampler_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/agentSampler_Tests.cpp
@@ -11,13 +11,11 @@
 #include "gtest/gtest.h"
 #include "gmock/gmock.h"
 
-#include "fakeAgentBlueprint.h"
 #include "fakeProfiles.h"
 #include "fakeConfigurationContainer.h"
 #include "fakeStochastics.h"
 #include "fakeVehicleModels.h"
 #include "fakeParameter.h"
-#include "fakeScenario.h"
 #include "fakeAgentType.h"
 #include "fakeSystemConfig.h"
 
@@ -53,18 +51,18 @@ TEST(DynamicProfileSampler, SampleDriverProfile)
     ASSERT_THAT(sampledProfiles.driverProfileName, "SomeDriver");
 }
 
-TEST(DynamicProfileSampler, SampleVehicleProfile)
+TEST(DynamicProfileSampler, SampleSystemProfile)
 {
     NiceMock<FakeStochastics> fakeStochastics;
     NiceMock<FakeProfiles> fakeProfiles;
-    StringProbabilities vehicleProbabilities {{"SomeVehicle", 1.0}};
-    ON_CALL(fakeProfiles, GetVehicleProfileProbabilities("SomeAgentProfile")).WillByDefault(ReturnRef(vehicleProbabilities));
+    StringProbabilities systemProbabilities {{"SomeSystem", 1.0}};
+    ON_CALL(fakeProfiles, GetSystemProfileProbabilities("SomeAgentProfile")).WillByDefault(ReturnRef(systemProbabilities));
     ON_CALL(fakeStochastics, GetUniformDistributed(_,_)).WillByDefault(Return(0));
 
     SampledProfiles sampledProfiles = SampledProfiles::make("SomeAgentProfile", fakeStochastics, &fakeProfiles)
-            .SampleVehicleProfile();
+            .SampleSystemProfile();
 
-    ASSERT_THAT(sampledProfiles.vehicleProfileName, "SomeVehicle");
+    ASSERT_THAT(sampledProfiles.systemProfileName, "SomeSystem");
 }
 
 TEST(DynamicProfileSampler, SampleVehicleComponentProfiles)
@@ -77,17 +75,17 @@ TEST(DynamicProfileSampler, SampleVehicleComponentProfiles)
     someComponent.type = "SomeComponent";
     someComponent.componentProfiles = probabilities;
 
-    VehicleProfile someVehicleProfile;
-    someVehicleProfile.vehicleComponents = {{someComponent}};
-    std::unordered_map<std::string, VehicleProfile> vehicleProfiles {{"SomeVehicle", someVehicleProfile}};
-    ON_CALL(fakeProfiles, GetVehicleProfiles()).WillByDefault(ReturnRef(vehicleProfiles));
+    SystemProfile someSystemProfile;
+    someSystemProfile.vehicleComponents = {{someComponent}};
+    std::unordered_map<std::string, SystemProfile> systemProfiles {{"SomeSystem", someSystemProfile}};
+    ON_CALL(fakeProfiles, GetSystemProfiles()).WillByDefault(ReturnRef(systemProfiles));
     ON_CALL(fakeStochastics, GetUniformDistributed(_,_)).WillByDefault(Return(0));
 
-    StringProbabilities vehicleProbabilities {{"SomeVehicle", 1.0}};
-    ON_CALL(fakeProfiles, GetVehicleProfileProbabilities("SomeAgentProfile")).WillByDefault(ReturnRef(vehicleProbabilities));
+    StringProbabilities systemProbabilities {{"SomeSystem", 1.0}};
+    ON_CALL(fakeProfiles, GetSystemProfileProbabilities("SomeAgentProfile")).WillByDefault(ReturnRef(systemProbabilities));
 
     SampledProfiles sampledProfiles = SampledProfiles::make("SomeAgentProfile", fakeStochastics, &fakeProfiles)
-            .SampleVehicleProfile()
+            .SampleSystemProfile()
             .SampleVehicleComponentProfiles();
 
     ASSERT_THAT(sampledProfiles.vehicleComponentProfileNames.at("SomeComponent"), "SomeProfile");
@@ -99,7 +97,6 @@ TEST(DynamicAgentTypeGenerator, GatherBasicComponents)
     SampledProfiles sampledProfiles = SampledProfiles::make("", fakeStochastics, nullptr);
     auto systemConfigBlueprint = std::make_shared<NiceMock<FakeSystemConfig>>();
     NiceMock<FakeProfiles> profiles;
-    NiceMock<FakeVehicleModels> vehicleModels;
     DefaultComponents defaultComponents;
     DynamicParameters dynamicParameters = DynamicParameters::empty();
 
@@ -116,7 +113,7 @@ TEST(DynamicAgentTypeGenerator, GatherBasicComponents)
 
     ON_CALL(*systemConfigBlueprint, GetSystems()).WillByDefault(ReturnRef(systems));
 
-    AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles, &vehicleModels)
+    AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles)
             .GatherBasicComponents();
 
     ASSERT_THAT(agentBuildInformation.agentType->GetComponents().size(), Eq(defaultComponents.basicComponentNames.size()));
@@ -132,7 +129,6 @@ TEST(DynamicAgentTypeGenerator, GatherDriverComponents)
     SampledProfiles sampledProfiles = SampledProfiles::make("", fakeStochastics, nullptr);
     auto systemConfigBlueprint = std::make_shared<NiceMock<FakeSystemConfig>>();
     NiceMock<FakeProfiles> profiles;
-    NiceMock<FakeVehicleModels> vehicleModels;
     DefaultComponents defaultComponents;
     DynamicParameters dynamicParameters = DynamicParameters::empty();
 
@@ -166,7 +162,7 @@ TEST(DynamicAgentTypeGenerator, GatherDriverComponents)
 
     ON_CALL(*systemConfigBlueprint, GetSystems()).WillByDefault(ReturnRef(systems));
 
-    AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles, &vehicleModels)
+    AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles)
             .GatherDriverComponents();
 
     ASSERT_THAT(agentBuildInformation.agentType->GetComponents().size(), Eq(defaultComponents.driverComponentNames.size() + 5));
@@ -187,11 +183,10 @@ TEST(DynamicAgentTypeGenerator, GatherVehicleComponents)
     SampledProfiles sampledProfiles = SampledProfiles::make("", fakeStochastics, nullptr);
     auto systemConfigBlueprint = std::make_shared<NiceMock<FakeSystemConfig>>();
     NiceMock<FakeProfiles> profiles;
-    NiceMock<FakeVehicleModels> vehicleModels;
     DefaultComponents defaultComponents;
     DynamicParameters dynamicParameters = DynamicParameters::empty();
 
-    sampledProfiles.vehicleProfileName = "SomeVehicle";
+    sampledProfiles.systemProfileName = "SomeSystem";
     sampledProfiles.vehicleComponentProfileNames = {{"VehicleComponentA", "ProfileA"}, {"VehicleComponentB", "ProfileB"}};
 
     op::ParameterSetLevel1 parametersAA {{"aa", 0}};
@@ -210,11 +205,11 @@ TEST(DynamicAgentTypeGenerator, GatherVehicleComponents)
     VehicleComponent vehicleComponentB;
     vehicleComponentB.type = "VehicleComponentB";
 
-    VehicleProfile vehicleProfile;
-    vehicleProfile.vehicleComponents = {{vehicleComponentA, vehicleComponentB}};
+    SystemProfile systemProfile;
+    systemProfile.vehicleComponents = {{vehicleComponentA, vehicleComponentB}};
 
-    std::unordered_map<std::string, VehicleProfile> vehicleProfiles {{"SomeVehicle", vehicleProfile}};
-    ON_CALL(profiles, GetVehicleProfiles()).WillByDefault(ReturnRef(vehicleProfiles));
+    std::unordered_map<std::string, SystemProfile> systemProfiles {{"SomeSystem", systemProfile}};
+    ON_CALL(profiles, GetSystemProfiles()).WillByDefault(ReturnRef(systemProfiles));
 
     auto fakeAgentType = std::make_shared<NiceMock<core::FakeAgentType>>();
     std::map<int, std::shared_ptr< core::AgentTypeInterface>> systems = {{0, fakeAgentType}};
@@ -230,7 +225,7 @@ TEST(DynamicAgentTypeGenerator, GatherVehicleComponents)
     ON_CALL(*fakeAgentType, GetComponents()).WillByDefault(ReturnRef(components));
     ON_CALL(*systemConfigBlueprint, GetSystems()).WillByDefault(ReturnRef(systems));
 
-    AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles, &vehicleModels)
+    AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles)
             .GatherVehicleComponents();
 
     ASSERT_THAT(agentBuildInformation.agentType->GetComponents().size(), Eq(defaultComponents.vehicleComponentNames.size() + 2));
@@ -253,12 +248,11 @@ TEST(DynamicAgentTypeGenerator, GatherSensors)
     SampledProfiles sampledProfiles = SampledProfiles::make("", fakeStochastics, nullptr);
     auto systemConfigBlueprint = std::make_shared<NiceMock<FakeSystemConfig>>();
     NiceMock<FakeProfiles> profiles;
-    NiceMock<FakeVehicleModels> vehicleModels;
     DefaultComponents defaultComponents;
     DynamicParameters dynamicParameters = DynamicParameters::empty();
     dynamicParameters.sensorLatencies = {{5, 1.0}, {7, 2.0}};
 
-    sampledProfiles.vehicleProfileName = "SomeVehicle";
+    sampledProfiles.systemProfileName = "SomeSystem";
 
     openpass::sensors::Profile sensorProfileA;
     sensorProfileA.name = "ProfileA";
@@ -273,27 +267,22 @@ TEST(DynamicAgentTypeGenerator, GatherSensors)
     ON_CALL(profiles, CloneProfile("SensorTypeA", "ProfileA")).WillByDefault(Return(parameter));
     ON_CALL(profiles, CloneProfile("SensorTypeB", "ProfileB")).WillByDefault(Return(parameter));
 
-    VehicleProfile vehicleProfile;
+    SystemProfile systemProfile;
 
     openpass::sensors::Parameter sensorA;
     sensorA.id = 5;
     sensorA.profile = sensorProfileA;
-
-    openpass::sensors::Position positionA;
-    positionA.longitudinal = 2.0;
-    sensorA.position = positionA;
+    sensorA.positionName = "PositionA";
 
     openpass::sensors::Parameter sensorB;
     sensorB.id = 7;
     sensorB.profile = sensorProfileB;
+    sensorB.positionName = "PositionB";
 
-    openpass::sensors::Position positionB;
-    positionB.longitudinal = 3.0;
-    sensorB.position = positionB;
-    vehicleProfile.sensors = {sensorA, sensorB};
+    systemProfile.sensors = {sensorA, sensorB};
 
-    std::unordered_map<std::string, VehicleProfile> vehicleProfiles {{"SomeVehicle", vehicleProfile}};
-    ON_CALL(profiles, GetVehicleProfiles()).WillByDefault(ReturnRef(vehicleProfiles));
+    std::unordered_map<std::string, SystemProfile> systemProfiles {{"SomeSystem", systemProfile}};
+    ON_CALL(profiles, GetSystemProfiles()).WillByDefault(ReturnRef(systemProfiles));
 
     auto fakeAgentType = std::make_shared<NiceMock<core::FakeAgentType>>();
     std::map<int, std::shared_ptr<core::AgentTypeInterface>> systems = {{0, fakeAgentType}};
@@ -310,7 +299,7 @@ TEST(DynamicAgentTypeGenerator, GatherSensors)
     ON_CALL(*fakeAgentType, GetComponents()).WillByDefault(ReturnRef(components));
     ON_CALL(*systemConfigBlueprint, GetSystems()).WillByDefault(ReturnRef(systems));
 
-    AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles, &vehicleModels)
+    AgentBuildInformation agentBuildInformation = AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles)
             .GatherSensors();
 
     const auto& gatheredComponents = agentBuildInformation.agentType->GetComponents();
@@ -332,53 +321,22 @@ TEST(DynamicAgentTypeGenerator, GatherSensors)
     ASSERT_THAT(gatheredComponents.at("Sensor_7")->GetOutputLinks().at(3), Eq(101));
 }
 
-TEST(DynamicAgentTypeGenerator, SetVehicleModelParameters)
-{
-    NiceMock<FakeStochastics> fakeStochastics;
-    SampledProfiles sampledProfiles = SampledProfiles::make("", fakeStochastics, nullptr);
-    auto systemConfigBlueprint = std::make_shared<NiceMock<FakeSystemConfig>>();
-    NiceMock<FakeProfiles> profiles;
-    NiceMock<FakeVehicleModels> vehicleModels;
-    DynamicParameters dynamicParameters = DynamicParameters::empty();
-
-    sampledProfiles.vehicleProfileName = "SomeVehicle";
-
-    VehicleProfile vehicleProfile;
-    vehicleProfile.vehicleModel = "SomeVehicleModel";
-    std::unordered_map<std::string, VehicleProfile> vehicleProfiles{{"SomeVehicle", vehicleProfile}};
-    ON_CALL(profiles, GetVehicleProfiles()).WillByDefault(ReturnRef(vehicleProfiles));
-
-    VehicleModelParameters vehicleModelParameters;
-    vehicleModelParameters.boundingBoxDimensions.length = 5.0;
-    vehicleModelParameters.boundingBoxDimensions.width = 2.0;
-    ON_CALL(vehicleModels, GetVehicleModel("SomeVehicleModel", _)).WillByDefault(Return(vehicleModelParameters));
-    openScenario::Parameters assignedParameters;
-
-    AgentBuildInformation agentBuildInformation =
-            AgentBuildInformation::make(sampledProfiles, dynamicParameters, systemConfigBlueprint, &profiles, &vehicleModels)
-            .SetVehicleModelParameters(assignedParameters);
-
-    ASSERT_THAT(agentBuildInformation.vehicleModelName, Eq("SomeVehicleModel"));
-    ASSERT_THAT(agentBuildInformation.vehicleModelParameters.boundingBoxDimensions.length, Eq(5.0));
-    ASSERT_THAT(agentBuildInformation.vehicleModelParameters.boundingBoxDimensions.width, Eq(2.0));
-}
-
 TEST(DynamicParametersSampler, SampleSensorLatencies)
 {
     NiceMock<FakeStochastics> fakeStochastics;
     ON_CALL(fakeStochastics, GetNormalDistributed(_,_)).WillByDefault(Return(10));
 
-    std::string vehicleProfileName ="SomeVehicle";
+    std::string systemProfileName ="SomeSystem";
     openpass::sensors::Parameter sensorParameter;
     sensorParameter.id = 5;
     sensorParameter.profile.name = "SomeProfile";
     sensorParameter.profile.type = "SomeSensorType";
 
-    VehicleProfile vehicleProfile;
-    vehicleProfile.sensors = {{sensorParameter}};
+    SystemProfile systemProfile;
+    systemProfile.sensors = {{sensorParameter}};
 
     Profiles profiles;
-    profiles.AddVehicleProfile(vehicleProfileName, vehicleProfile);
+    profiles.AddSystemProfile(systemProfileName, systemProfile);
 
     openpass::parameter::ParameterSetLevel1 parameter{{"Latency", op::NormalDistribution{10.0, 0.0, 5.0, 15.0}}};
     ProfileGroup profileGroup{{"SomeProfile", parameter}};
@@ -386,7 +344,7 @@ TEST(DynamicParametersSampler, SampleSensorLatencies)
 
     profiles.AddProfileGroup("SomeSensorType", "SomeProfile", parameter);
 
-    DynamicParameters dynamicParameters = DynamicParameters::make(fakeStochastics, vehicleProfileName, &profiles).SampleSensorLatencies();
+    DynamicParameters dynamicParameters = DynamicParameters::make(fakeStochastics, systemProfileName, &profiles).SampleSensorLatencies();
 
     ASSERT_THAT(dynamicParameters.sensorLatencies.at(5), DoubleEq(10.0));
 }
diff --git a/sim/tests/unitTests/core/opSimulation/modules/SpawnerPreRunCommon/CMakeLists.txt b/sim/tests/unitTests/core/opSimulation/modules/SpawnerPreRunCommon/CMakeLists.txt
index 5e7f364a5faca278e22d15d955600f19dbaca4a3..2878cd5d0a138d82a00756f71e04a2bc0da75a17 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/SpawnerPreRunCommon/CMakeLists.txt
+++ b/sim/tests/unitTests/core/opSimulation/modules/SpawnerPreRunCommon/CMakeLists.txt
@@ -27,7 +27,6 @@ add_openpass_target(
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicAgentTypeGenerator.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/sampler.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agent.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentBlueprint.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentType.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/channel.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/component.cpp
@@ -47,7 +46,6 @@ add_openpass_target(
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicAgentTypeGenerator.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/sampler.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agent.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentBlueprint.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentType.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/channel.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/component.h
diff --git a/sim/tests/unitTests/core/opSimulation/modules/SpawnerPreRunCommon/spawnerPreRunCommon_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/SpawnerPreRunCommon/spawnerPreRunCommon_Tests.cpp
index c836c5896554738ed5659320b35d3c0fc1021f68..034ebab4235c37025b93696c7428bd9b8b5c15f6 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/SpawnerPreRunCommon/spawnerPreRunCommon_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/SpawnerPreRunCommon/spawnerPreRunCommon_Tests.cpp
@@ -124,13 +124,13 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_AllOptionalParamet
     ON_CALL(*roadStreamLong, GetLaneStream(_,-1)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream1))));
     LaneStreamInterface* laneStream2 = new FakeLaneStream;
     ON_CALL(*roadStreamLong, GetLaneStream(_,-2)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream2))));
-    ON_CALL(*roadStreamLong, GetLength()).WillByDefault(Return(1500.0));
+    ON_CALL(*roadStreamLong, GetLength()).WillByDefault(Return(1500.0_m));
     ON_CALL(*roadStreamLong, GetStreamPosition(_)).WillByDefault([](GlobalRoadPosition position)
     {if(position.roadId == "RoadA")
-        {return StreamPosition{position.roadPosition.s, 0};}
+        {return StreamPosition{position.roadPosition.s, 0_m};}
         if(position.roadId == "RoadB")
-        {return StreamPosition{position.roadPosition.s + 1000.0, 0};}
-        return StreamPosition{-1, 0};});
+        {return StreamPosition{position.roadPosition.s + 1000.0_m, 0_m};}
+        return StreamPosition{-1_m, 0_m};});
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadA", true}, {"RoadB", true}})).
             WillByDefault(Return(ByMove(std::move(roadStreamLong))));
 
@@ -139,30 +139,30 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_AllOptionalParamet
     ON_CALL(*roadStreamShort, GetLaneStream(_,-3)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream3))));
     LaneStreamInterface* laneStream4 = new FakeLaneStream;
     ON_CALL(*roadStreamShort, GetLaneStream(_,-4)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream4))));
-    ON_CALL(*roadStreamShort, GetLength()).WillByDefault(Return(1000.0));
+    ON_CALL(*roadStreamShort, GetLength()).WillByDefault(Return(1000.0_m));
     ON_CALL(*roadStreamShort, GetStreamPosition(_)).WillByDefault([](GlobalRoadPosition position)
     {if(position.roadId == "RoadA")
-        {return StreamPosition{position.roadPosition.s, 0};}
-        return StreamPosition{-1, 0};});
+        {return StreamPosition{position.roadPosition.s, 0_m};}
+        return StreamPosition{-1_m, 0_m};});
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadA", true}})).
             WillByDefault(Return(ByMove(std::move(roadStreamShort))));
-    ON_CALL(fakeWorld, GetRoadLength(_)).WillByDefault(Return(1000.));
+    ON_CALL(fakeWorld, GetRoadLength(_)).WillByDefault(Return(1000._m));
 
     auto result = ExtractSpawnAreas(parameter, fakeWorld, &callbacks);
 
     ASSERT_THAT(result, SizeIs(4));
     EXPECT_THAT(result.at(0).laneStream.get(), Eq(laneStream1));
-    EXPECT_THAT(result.at(0).sStart, Eq(10.0));
-    EXPECT_THAT(result.at(0).sEnd, Eq(1050.0));
+    EXPECT_THAT(result.at(0).sStart.value(), Eq(10.0));
+    EXPECT_THAT(result.at(0).sEnd.value(), Eq(1050.0));
     EXPECT_THAT(result.at(1).laneStream.get(), Eq(laneStream2));
-    EXPECT_THAT(result.at(1).sStart, Eq(10.0));
-    EXPECT_THAT(result.at(1).sEnd, Eq(1050.0));
+    EXPECT_THAT(result.at(1).sStart.value(), Eq(10.0));
+    EXPECT_THAT(result.at(1).sEnd.value(), Eq(1050.0));
     EXPECT_THAT(result.at(2).laneStream.get(), Eq(laneStream3));
-    EXPECT_THAT(result.at(2).sStart, Eq(15.0));
-    EXPECT_THAT(result.at(2).sEnd, Eq(55.0));
+    EXPECT_THAT(result.at(2).sStart.value(), Eq(15.0));
+    EXPECT_THAT(result.at(2).sEnd.value(), Eq(55.0));
     EXPECT_THAT(result.at(3).laneStream.get(), Eq(laneStream4));
-    EXPECT_THAT(result.at(3).sStart, Eq(15.0));
-    EXPECT_THAT(result.at(3).sEnd, Eq(55.0));
+    EXPECT_THAT(result.at(3).sStart.value(), Eq(15.0));
+    EXPECT_THAT(result.at(3).sEnd.value(), Eq(55.0));
 }
 
 TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_NoOptionalParameters)
@@ -211,7 +211,7 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_NoOptionalParamete
     laneStreamsA.emplace_back(laneStream1);
     laneStreamsA.emplace_back(laneStream2);
     ON_CALL(*roadStreamLong, GetAllLaneStreams()).WillByDefault(Return(ByMove(std::move(laneStreamsA))));
-    ON_CALL(*roadStreamLong, GetLength()).WillByDefault(Return(1500.0));
+    ON_CALL(*roadStreamLong, GetLength()).WillByDefault(Return(1500.0_m));
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadA", true}, {"RoadB", true}})).
             WillByDefault(Return(ByMove(std::move(roadStreamLong))));
 
@@ -222,26 +222,26 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_NoOptionalParamete
     laneStreamsB.emplace_back(laneStream3);
     laneStreamsB.emplace_back(laneStream4);
     ON_CALL(*roadStreamShort, GetAllLaneStreams()).WillByDefault(Return(ByMove(std::move(laneStreamsB))));
-    ON_CALL(*roadStreamShort, GetLength()).WillByDefault(Return(1000.0));
+    ON_CALL(*roadStreamShort, GetLength()).WillByDefault(Return(1000.0_m));
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadA", true}})).
             WillByDefault(Return(ByMove(std::move(roadStreamShort))));
-    ON_CALL(fakeWorld, GetRoadLength(_)).WillByDefault(Return(1000.));
+    ON_CALL(fakeWorld, GetRoadLength(_)).WillByDefault(Return(1000._m));
 
     auto result = ExtractSpawnAreas(parameter, fakeWorld, &callbacks);
 
     ASSERT_THAT(result, SizeIs(4));
     EXPECT_THAT(result.at(0).laneStream.get(), Eq(laneStream1));
-    EXPECT_THAT(result.at(0).sStart, Eq(0.0));
-    EXPECT_THAT(result.at(0).sEnd, Eq(1500.0));
+    EXPECT_THAT(result.at(0).sStart.value(), Eq(0.0));
+    EXPECT_THAT(result.at(0).sEnd.value(), Eq(1500.0));
     EXPECT_THAT(result.at(1).laneStream.get(), Eq(laneStream2));
-    EXPECT_THAT(result.at(1).sStart, Eq(0.0));
-    EXPECT_THAT(result.at(1).sEnd, Eq(1500.0));
+    EXPECT_THAT(result.at(1).sStart.value(), Eq(0.0));
+    EXPECT_THAT(result.at(1).sEnd.value(), Eq(1500.0));
     EXPECT_THAT(result.at(2).laneStream.get(), Eq(laneStream3));
-    EXPECT_THAT(result.at(2).sStart, Eq(0.0));
-    EXPECT_THAT(result.at(2).sEnd, Eq(1000.0));
+    EXPECT_THAT(result.at(2).sStart.value(), Eq(0.0));
+    EXPECT_THAT(result.at(2).sEnd.value(), Eq(1000.0));
     EXPECT_THAT(result.at(3).laneStream.get(), Eq(laneStream4));
-    EXPECT_THAT(result.at(3).sStart, Eq(0.0));
-    EXPECT_THAT(result.at(3).sEnd, Eq(1000.0));
+    EXPECT_THAT(result.at(3).sStart.value(), Eq(0.0));
+    EXPECT_THAT(result.at(3).sEnd.value(), Eq(1000.0));
 }
 
 TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreasWithSOutOfRange_ReturnsValidS)
@@ -288,13 +288,13 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreasWithSOutOfRange_Ret
     ON_CALL(*roadStreamLong, GetLaneStream(_,-1)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream1))));
     LaneStreamInterface* laneStream2 = new FakeLaneStream;
     ON_CALL(*roadStreamLong, GetLaneStream(_,-2)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream2))));
-    ON_CALL(*roadStreamLong, GetLength()).WillByDefault(Return(1500.0));
+    ON_CALL(*roadStreamLong, GetLength()).WillByDefault(Return(1500.0_m));
     ON_CALL(*roadStreamLong, GetStreamPosition(_)).WillByDefault([](GlobalRoadPosition position)
     {if(position.roadId == "RoadA")
-        {return StreamPosition{position.roadPosition.s, 0};}
+        {return StreamPosition{position.roadPosition.s, 0_m};}
         if(position.roadId == "RoadB")
-        {return StreamPosition{position.roadPosition.s + 1000.0, 0};}
-        return StreamPosition{-1, 0};});
+        {return StreamPosition{position.roadPosition.s + 1000.0_m, 0_m};}
+        return StreamPosition{-1_m, 0_m};});
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadA", true}, {"RoadB", true}})).
             WillByDefault(Return(ByMove(std::move(roadStreamLong))));
 
@@ -305,32 +305,32 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreasWithSOutOfRange_Ret
     laneStreamsB.emplace_back(laneStream3);
     laneStreamsB.emplace_back(laneStream4);
     ON_CALL(*roadStreamShort, GetAllLaneStreams()).WillByDefault(Return(ByMove(std::move(laneStreamsB))));
-    ON_CALL(*roadStreamShort, GetLength()).WillByDefault(Return(1000.0));
+    ON_CALL(*roadStreamShort, GetLength()).WillByDefault(Return(1000.0_m));
     ON_CALL(*roadStreamShort, GetStreamPosition(_)).WillByDefault([](GlobalRoadPosition position)
     {if(position.roadId == "RoadA")
-        {return StreamPosition{position.roadPosition.s, 0};}
-        return StreamPosition{-1, 0};});
+        {return StreamPosition{position.roadPosition.s, 0_m};}
+        return StreamPosition{-1_m, 0_m};});
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadA", true}})).
             WillByDefault(Return(ByMove(std::move(roadStreamShort))));
 
-    ON_CALL(fakeWorld, GetRoadLength("RoadA")).WillByDefault(Return(1000.));
-    ON_CALL(fakeWorld, GetRoadLength("RoadB")).WillByDefault(Return(500.));
+    ON_CALL(fakeWorld, GetRoadLength("RoadA")).WillByDefault(Return(1000._m));
+    ON_CALL(fakeWorld, GetRoadLength("RoadB")).WillByDefault(Return(500._m));
 
     auto result = ExtractSpawnAreas(parameter, fakeWorld, &callbacks);
 
     ASSERT_THAT(result, SizeIs(4));
     EXPECT_THAT(result.at(0).laneStream.get(), Eq(laneStream1));
-    EXPECT_THAT(result.at(0).sStart, Eq(0.0));
-    EXPECT_THAT(result.at(0).sEnd, Eq(1500.0));
+    EXPECT_THAT(result.at(0).sStart.value(), Eq(0.0));
+    EXPECT_THAT(result.at(0).sEnd.value(), Eq(1500.0));
     EXPECT_THAT(result.at(1).laneStream.get(), Eq(laneStream2));
-    EXPECT_THAT(result.at(1).sStart, Eq(0.0));
-    EXPECT_THAT(result.at(1).sEnd, Eq(1500.0));
+    EXPECT_THAT(result.at(1).sStart.value(), Eq(0.0));
+    EXPECT_THAT(result.at(1).sEnd.value(), Eq(1500.0));
     EXPECT_THAT(result.at(2).laneStream.get(), Eq(laneStream3));
-    EXPECT_THAT(result.at(2).sStart, Eq(10.0));
-    EXPECT_THAT(result.at(2).sEnd, Eq(1000.0));
+    EXPECT_THAT(result.at(2).sStart.value(), Eq(10.0));
+    EXPECT_THAT(result.at(2).sEnd.value(), Eq(1000.0));
     EXPECT_THAT(result.at(3).laneStream.get(), Eq(laneStream4));
-    EXPECT_THAT(result.at(3).sStart, Eq(10.0));
-    EXPECT_THAT(result.at(3).sEnd, Eq(1000.0));
+    EXPECT_THAT(result.at(3).sStart.value(), Eq(10.0));
+    EXPECT_THAT(result.at(3).sEnd.value(), Eq(1000.0));
 }
 
 TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_AgainstOdDirection)
@@ -366,27 +366,27 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_AgainstOdDirection
     ON_CALL(*roadStream, GetLaneStream(_,1)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream1))));
     LaneStreamInterface* laneStream2 = new FakeLaneStream;
     ON_CALL(*roadStream, GetLaneStream(_,2)).WillByDefault(Return(ByMove(std::unique_ptr<LaneStreamInterface>(laneStream2))));
-    ON_CALL(*roadStream, GetLength()).WillByDefault(Return(1500.0));
+    ON_CALL(*roadStream, GetLength()).WillByDefault(Return(1500.0_m));
     ON_CALL(*roadStream, GetStreamPosition(_)).WillByDefault([](GlobalRoadPosition position)
     {if(position.roadId == "RoadA")
-        {return StreamPosition{1000. - position.roadPosition.s, 0};}
+        {return StreamPosition{1000._m - position.roadPosition.s, 0_m};}
         if(position.roadId == "RoadB")
-        {return StreamPosition{1500. - position.roadPosition.s, 0};}
-        return StreamPosition{-1, 0};});
+        {return StreamPosition{1500._m - position.roadPosition.s, 0_m};}
+        return StreamPosition{-1_m, 0_m};});
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadA", false}, {"RoadB", false}})).
             WillByDefault(Return(ByMove(std::move(roadStream))));
-    ON_CALL(fakeWorld, GetRoadLength("RoadA")).WillByDefault(Return(1000.));
-    ON_CALL(fakeWorld, GetRoadLength("RoadB")).WillByDefault(Return(500.));
+    ON_CALL(fakeWorld, GetRoadLength("RoadA")).WillByDefault(Return(1000._m));
+    ON_CALL(fakeWorld, GetRoadLength("RoadB")).WillByDefault(Return(500._m));
 
     auto result = ExtractSpawnAreas(parameter, fakeWorld, &callbacks);
 
     ASSERT_THAT(result, SizeIs(2));
     EXPECT_THAT(result.at(0).laneStream.get(), Eq(laneStream1));
-    EXPECT_THAT(result.at(0).sStart, Eq(990.0));
-    EXPECT_THAT(result.at(0).sEnd, Eq(1450.0));
+    EXPECT_THAT(result.at(0).sStart.value(), Eq(990.0));
+    EXPECT_THAT(result.at(0).sEnd.value(), Eq(1450.0));
     EXPECT_THAT(result.at(1).laneStream.get(), Eq(laneStream2));
-    EXPECT_THAT(result.at(1).sStart, Eq(990.0));
-    EXPECT_THAT(result.at(1).sEnd, Eq(1450.0));
+    EXPECT_THAT(result.at(1).sStart.value(), Eq(990.0));
+    EXPECT_THAT(result.at(1).sEnd.value(), Eq(1450.0));
 }
 
 
@@ -430,13 +430,13 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_AllLanesBothDirect
     std::vector<std::unique_ptr<LaneStreamInterface>> laneStreamsIn{};
     laneStreamsIn.emplace_back(laneStreamIn);
     ON_CALL(*roadStreamIn, GetAllLaneStreams()).WillByDefault(Return(ByMove(std::move(laneStreamsIn))));
-    ON_CALL(*roadStreamIn, GetLength()).WillByDefault(Return(1500.0));
+    ON_CALL(*roadStreamIn, GetLength()).WillByDefault(Return(1500.0_m));
     ON_CALL(*roadStreamIn, GetStreamPosition(_)).WillByDefault([](GlobalRoadPosition position)
     {if(position.roadId == "RoadA")
-        {return StreamPosition{position.roadPosition.s, 0};}
+        {return StreamPosition{position.roadPosition.s, 0_m};}
         if(position.roadId == "RoadB")
-        {return StreamPosition{1000. + position.roadPosition.s, 0};}
-        return StreamPosition{-1, 0};});
+        {return StreamPosition{1000._m + position.roadPosition.s, 0_m};}
+        return StreamPosition{-1_m, 0_m};});
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadA", true}, {"RoadB", true}})).
             WillByDefault(Return(ByMove(std::move(roadStreamIn))));
 
@@ -445,25 +445,25 @@ TEST(SpawnerPreRunCommonParameterExtractor, ExtractSpawnAreas_AllLanesBothDirect
     std::vector<std::unique_ptr<LaneStreamInterface>> laneStreamsAgainst{};
     laneStreamsAgainst.emplace_back(laneStreamAgainst);
     ON_CALL(*roadStreamAgainst, GetAllLaneStreams()).WillByDefault(Return(ByMove(std::move(laneStreamsAgainst))));
-    ON_CALL(*roadStreamAgainst, GetLength()).WillByDefault(Return(1500.0));
+    ON_CALL(*roadStreamAgainst, GetLength()).WillByDefault(Return(1500.0_m));
     ON_CALL(*roadStreamAgainst, GetStreamPosition(_)).WillByDefault([](GlobalRoadPosition position)
     {if(position.roadId == "RoadA")
-        {return StreamPosition{1500. - position.roadPosition.s, 0};}
+        {return StreamPosition{1500._m - position.roadPosition.s, 0_m};}
         if(position.roadId == "RoadB")
-        {return StreamPosition{500. - position.roadPosition.s, 0};}
-        return StreamPosition{-1, 0};});
+        {return StreamPosition{500._m - position.roadPosition.s, 0_m};}
+        return StreamPosition{-1_m, 0_m};});
     ON_CALL(fakeWorld, GetRoadStream(std::vector<RouteElement>{{"RoadB", false}, {"RoadA", false}})).
             WillByDefault(Return(ByMove(std::move(roadStreamAgainst))));
-    ON_CALL(fakeWorld, GetRoadLength("RoadA")).WillByDefault(Return(1000.));
-    ON_CALL(fakeWorld, GetRoadLength("RoadB")).WillByDefault(Return(500.));
+    ON_CALL(fakeWorld, GetRoadLength("RoadA")).WillByDefault(Return(1000._m));
+    ON_CALL(fakeWorld, GetRoadLength("RoadB")).WillByDefault(Return(500._m));
 
     auto result = ExtractSpawnAreas(parameter, fakeWorld, &callbacks);
 
     ASSERT_THAT(result, SizeIs(2));
     EXPECT_THAT(result.at(0).laneStream.get(), Eq(laneStreamIn));
-    EXPECT_THAT(result.at(0).sStart, Eq(10.0));
-    EXPECT_THAT(result.at(0).sEnd, Eq(1050.0));
+    EXPECT_THAT(result.at(0).sStart.value(), Eq(10.0));
+    EXPECT_THAT(result.at(0).sEnd.value(), Eq(1050.0));
     EXPECT_THAT(result.at(1).laneStream.get(), Eq(laneStreamAgainst));
-    EXPECT_THAT(result.at(1).sStart, Eq(450.0));
-    EXPECT_THAT(result.at(1).sEnd, Eq(1490.0));
+    EXPECT_THAT(result.at(1).sStart.value(), Eq(450.0));
+    EXPECT_THAT(result.at(1).sEnd.value(), Eq(1490.0));
 }
diff --git a/sim/tests/unitTests/core/opSimulation/modules/SpawnerRuntimeCommon/CMakeLists.txt b/sim/tests/unitTests/core/opSimulation/modules/SpawnerRuntimeCommon/CMakeLists.txt
index 929b10b9fefe88f2f89d93c565ef422850482666..0413d3f24fa993e6cc4d3763bd8afd43f5997288 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/SpawnerRuntimeCommon/CMakeLists.txt
+++ b/sim/tests/unitTests/core/opSimulation/modules/SpawnerRuntimeCommon/CMakeLists.txt
@@ -26,7 +26,6 @@ add_openpass_target(
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicAgentTypeGenerator.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/sampler.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agent.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentBlueprint.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentType.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/channel.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/component.cpp
@@ -46,7 +45,6 @@ add_openpass_target(
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicAgentTypeGenerator.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/sampler.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agent.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentBlueprint.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentType.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/channel.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/component.h
diff --git a/sim/tests/unitTests/core/opSimulation/modules/SpawnerRuntimeCommon/spawnerRuntimeCommon_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/SpawnerRuntimeCommon/spawnerRuntimeCommon_Tests.cpp
index 477f3c19217b79e44c9c5b1e433ef3fb212dd5c0..7ab5dd57741c76e8a3582e3ca57d2135642d5b53 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/SpawnerRuntimeCommon/spawnerRuntimeCommon_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/SpawnerRuntimeCommon/spawnerRuntimeCommon_Tests.cpp
@@ -131,11 +131,11 @@ TEST(SpawnerRuntimeCommonParameterExtractor, ExtractSpawnPointParameters)
     const auto result = SpawnPointRuntimeCommonParameterExtractor::ExtractSpawnPointParameters(parameter, worldAnalyzer, validLaneTypes, &callbacks);
 
     const auto spawnPositions = result.spawnPositions;
-    ASSERT_THAT(result.spawnPositions, UnorderedElementsAre(SpawnPosition{"RoadA", 1, 10.},
-                                                            SpawnPosition{"RoadA", 2, 10.},
-                                                            SpawnPosition{"RoadA", 3, 10.},
-                                                            SpawnPosition{"RoadB", -1, 11.},
-                                                            SpawnPosition{"RoadB", -2, 11.}));
+    ASSERT_THAT(result.spawnPositions, UnorderedElementsAre(SpawnPosition{"RoadA", 1, 10._m},
+                                                            SpawnPosition{"RoadA", 2, 10._m},
+                                                            SpawnPosition{"RoadA", 3, 10._m},
+                                                            SpawnPosition{"RoadB", -1, 11._m},
+                                                            SpawnPosition{"RoadB", -2, 11._m}));
 
     SpawningAgentProfile spawningAgentProfile1 = {"Profile1", openpass::parameter::NormalDistribution{1.,2.,3.,4.}, {0.1,0.2}, openpass::parameter::NormalDistribution{2.,3.,4.,5.}};
     SpawningAgentProfile spawningAgentProfile2 = {"Profile2", openpass::parameter::NormalDistribution{1.,2.,3.,4.}, {0.1,0.2}, openpass::parameter::NormalDistribution{2.,3.,4.,5.}};
@@ -196,10 +196,10 @@ TEST(SpawnerRuntimeCommonParameterExtractor, ExtractSpawnPoints)
 
     const auto result = SpawnPointRuntimeCommonParameterExtractor::ExtractSpawnPoints(parameter, worldAnalyzer, validLaneTypes, &callbacks);
 
-    ASSERT_THAT(result, UnorderedElementsAre(SpawnPosition{roadA, 1, 10.},
-                                             SpawnPosition{roadA, 2, 10.},
-                                             SpawnPosition{roadA, 3, 10.},
-                                             SpawnPosition{roadB , -1, 11.}));
+    ASSERT_THAT(result, UnorderedElementsAre(SpawnPosition{roadA, 1, 10._m},
+                                             SpawnPosition{roadA, 2, 10._m},
+                                             SpawnPosition{roadA, 3, 10._m},
+                                             SpawnPosition{roadB , -1, 11._m}));
 
     SpawningAgentProfile spawningAgentProfile1 = {"Profile1", openpass::parameter::NormalDistribution{1.,2.,3.,4.}, {0.1,0.2}, openpass::parameter::NormalDistribution{2.,3.,4.,5.}};
     SpawningAgentProfile spawningAgentProfile2 = {"Profile2", openpass::parameter::NormalDistribution{1.,2.,3.,4.}, {0.1,0.2}, openpass::parameter::NormalDistribution{2.,3.,4.,5.}};
diff --git a/sim/tests/unitTests/core/opSimulation/modules/SpawnerScenario/CMakeLists.txt b/sim/tests/unitTests/core/opSimulation/modules/SpawnerScenario/CMakeLists.txt
deleted file mode 100644
index 30615404b2e4bf4ae9a82b7f51e75f1994b4455e..0000000000000000000000000000000000000000
--- a/sim/tests/unitTests/core/opSimulation/modules/SpawnerScenario/CMakeLists.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-################################################################################
-# Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# http://www.eclipse.org/legal/epl-2.0.
-#
-# SPDX-License-Identifier: EPL-2.0
-################################################################################
-set(COMPONENT_TEST_NAME SpawnerScenario_Tests)
-set(COMPONENT_SOURCE_DIR ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modules/Spawners/Scenario)
-
-add_openpass_target(
-  NAME ${COMPONENT_TEST_NAME} TYPE test COMPONENT core
-  DEFAULT_MAIN
-
-  SOURCES
-    spawnerScenario_Tests.cpp
-    ${COMPONENT_SOURCE_DIR}/SpawnerScenario.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/common/log.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/agentBlueprintProvider.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/agentDataPublisher.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicProfileSampler.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicParametersSampler.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicAgentTypeGenerator.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/sampler.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agent.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentBlueprint.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentType.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/channel.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/component.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/componentType.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/parameters.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/bindings/modelBinding.cpp
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/bindings/modelLibrary.cpp
-
-  HEADERS
-    ${COMPONENT_SOURCE_DIR}/SpawnerScenario.h
-    ${OPENPASS_SIMCORE_DIR}/core/common/log.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/agentBlueprintProvider.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/agentDataPublisher.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicProfileSampler.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicParametersSampler.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/dynamicAgentTypeGenerator.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/sampler.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agent.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentBlueprint.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/agentType.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/channel.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/component.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/componentType.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements/parameters.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/bindings/modelBinding.h
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/bindings/modelLibrary.h
-
-  INCDIRS
-    ${COMPONENT_SOURCE_DIR}
-    ${COMPONENT_SOURCE_DIR}/..
-    ${OPENPASS_SIMCORE_DIR}/core
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/bindings
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/importer
-    ${OPENPASS_SIMCORE_DIR}/core/opSimulation/modelElements
-
-  LIBRARIES
-    Qt5::Core
-    CoreCommon
-)
diff --git a/sim/tests/unitTests/core/opSimulation/modules/SpawnerScenario/spawnerScenario_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/SpawnerScenario/spawnerScenario_Tests.cpp
deleted file mode 100644
index e98a721c33d42e946cc17560ad08d18fb5f55d42..0000000000000000000000000000000000000000
--- a/sim/tests/unitTests/core/opSimulation/modules/SpawnerScenario/spawnerScenario_Tests.cpp
+++ /dev/null
@@ -1,384 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019-2020 in-tech GmbH
- *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "SpawnerScenario.h"
-#include "agentBlueprint.h"
-#include "dontCare.h"
-#include "fakeAgent.h"
-#include "fakeAgentBlueprintProvider.h"
-#include "fakeAgentFactory.h"
-#include "fakeStochastics.h"
-#include "fakeScenario.h"
-#include "fakeWorld.h"
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::DontCare;
-using ::testing::Matcher;
-using ::testing::NiceMock;
-using ::testing::Return;
-using ::testing::ReturnRef;
-
-MATCHER_P(MatchesAgentBlueprint, referenceAgentBlueprint, "matches blueprint")
-{
-    if (!(arg->GetAgentProfileName() == referenceAgentBlueprint.GetAgentProfileName() && arg->GetAgentCategory() == referenceAgentBlueprint.GetAgentCategory()) && arg->GetObjectName() == referenceAgentBlueprint.GetObjectName())
-    {
-        return false;
-    }
-    const auto actualSpawnParameters = arg->GetSpawnParameter();
-    const auto expectedSpawnParameters = referenceAgentBlueprint.GetSpawnParameter();
-    if (!(actualSpawnParameters.velocity == expectedSpawnParameters.velocity && actualSpawnParameters.positionX == expectedSpawnParameters.positionX && actualSpawnParameters.yawAngle == expectedSpawnParameters.yawAngle))
-    {
-        return false;
-    }
-    const auto actualVehicleModelParameters = arg->GetVehicleModelParameters();
-    const auto expectedVehicleModelParameters = referenceAgentBlueprint.GetVehicleModelParameters();
-    if (!(actualVehicleModelParameters.boundingBoxDimensions.length == expectedVehicleModelParameters.boundingBoxDimensions.length
-          && actualVehicleModelParameters.boundingBoxDimensions.width == expectedVehicleModelParameters.boundingBoxDimensions.width
-          && actualVehicleModelParameters.boundingBoxCenter.x == expectedVehicleModelParameters.boundingBoxCenter.x))
-    {
-        return false;
-    }
-
-    return true;
-}
-
-TEST(SpawnPointScenario, Trigger_SpawnsEgoAgentAccordingToScenarioWorldPosition)
-{
-    NiceMock<FakeWorld> fakeWorld;
-    NiceMock<FakeScenario> fakeScenario;
-    NiceMock<FakeAgentBlueprintProvider> fakeAgentBlueprintProvider;
-    NiceMock<FakeAgentFactory> fakeAgentFactory;
-    NiceMock<FakeStochastics> fakeStochastics;
-
-    SpawnPointDependencies dependencies(&fakeAgentFactory, &fakeWorld, &fakeAgentBlueprintProvider, &fakeStochastics);
-    dependencies.scenario = &fakeScenario;
-
-    const std::string entityName = "Ego";
-    constexpr double x = 10.0;
-    constexpr double y = 5.0;
-    constexpr double heading = 0.5;
-    constexpr double velocity = 25;
-    constexpr double acceleration = 25;
-
-    openScenario::WorldPosition worldPosition{x, y, std::nullopt, heading, std::nullopt, std::nullopt};
-
-    ScenarioEntity entity;
-    entity.name = entityName;
-    entity.catalogReference.entryName = entityName;
-    entity.spawnInfo.velocity = velocity;
-    entity.spawnInfo.acceleration = acceleration;
-    entity.spawnInfo.position = worldPosition;
-
-    std::vector<ScenarioEntity> entities{entity};
-    std::optional<AgentBlueprint> actualAgentBlueprintOptional;
-    AgentBlueprint actualAgentBlueprint;
-    VehicleModelParameters vehicleModelParameters;
-    vehicleModelParameters.boundingBoxDimensions.length = 1;
-    vehicleModelParameters.boundingBoxDimensions.width = 0.5;
-    vehicleModelParameters.boundingBoxCenter.x = 0.;
-    actualAgentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-    actualAgentBlueprintOptional = actualAgentBlueprint;
-
-    SpawnParameter expectedSpawnParameter;
-    expectedSpawnParameter.velocity = velocity;
-    expectedSpawnParameter.positionX = x;
-    expectedSpawnParameter.positionY = y;
-    expectedSpawnParameter.yawAngle = heading;
-
-    AgentBlueprint expectedAgentBlueprint;
-    expectedAgentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-    expectedAgentBlueprint.SetAgentProfileName(entityName);
-    expectedAgentBlueprint.SetAgentCategory(AgentCategory::Ego);
-    expectedAgentBlueprint.SetObjectName(entityName);
-    expectedAgentBlueprint.SetSpawnParameter(expectedSpawnParameter);
-
-    ON_CALL(fakeScenario, GetEntities())
-        .WillByDefault(ReturnRef(entities));
-
-    ON_CALL(fakeAgentBlueprintProvider, SampleAgent(entity.catalogReference.entryName, _))
-        .WillByDefault(Return(actualAgentBlueprint));
-    ON_CALL(fakeWorld, IntersectsWithAgent(_, _, _, _, _, _))
-        .WillByDefault(Return(false));
-    GlobalRoadPositions roadPositions{{"Road1",{"Road1",-1,0,0,0}}};
-    ON_CALL(fakeWorld, WorldCoord2LaneCoord(x,y,heading)).WillByDefault(Return(roadPositions));
-    RoadGraph roadGraph{};
-    auto vertex = add_vertex(RouteElement{"Road1",true}, roadGraph);
-    ON_CALL(fakeWorld, GetRoadGraph(RouteElement{"Road1",true}, _, true)).WillByDefault(Return(std::make_pair(roadGraph, vertex)));
-    ON_CALL(fakeWorld, IsDirectionalRoadExisting("Road1", true)).WillByDefault(Return(true));
-
-    // If this is called and the blueprints match, we're creating our Agent correctly
-    EXPECT_CALL(fakeAgentFactory, AddAgent(MatchesAgentBlueprint(expectedAgentBlueprint)))
-        // There is no interface for agent, so we need to fake a valid object (!= nullptr)
-        // If the spawnpoint ever needs a true object, this will crash (!)
-        .WillOnce(Return(reinterpret_cast<core::Agent*>(0x1234)));
-
-    SpawnerScenario spawnerScenario{&dependencies, nullptr};
-    spawnerScenario.Trigger(0);
-}
-
-TEST(SpawnerScenario, Trigger_SpawnsEgoAgentAccordingToScenarioLanePosition)
-{
-    NiceMock<FakeWorld> fakeWorld;
-    NiceMock<FakeScenario> fakeScenario;
-    NiceMock<FakeAgentBlueprintProvider> fakeAgentBlueprintProvider;
-    NiceMock<FakeAgentFactory> fakeAgentFactory;
-    NiceMock<FakeStochastics> fakeStochastics;
-
-    SpawnPointDependencies dependencies(&fakeAgentFactory, &fakeWorld, &fakeAgentBlueprintProvider, &fakeStochastics);
-    dependencies.scenario = &fakeScenario;
-
-    const std::string entityName = "Ego";
-    const std::string roadId = "ROADID";
-    constexpr int laneId = -1;
-    constexpr double s = 10;
-    constexpr double offset = 0;
-    constexpr double velocity = 25;
-    constexpr double acceleration = 25;
-
-    openScenario::LanePosition lanePosition;
-    lanePosition.roadId = roadId;
-    lanePosition.laneId = laneId;
-    lanePosition.s = s;
-    lanePosition.offset = offset;
-
-    ScenarioEntity entity;
-    entity.name = entityName;
-    entity.catalogReference.entryName = entityName;
-    entity.spawnInfo.velocity = velocity;
-    entity.spawnInfo.acceleration = acceleration;
-    entity.spawnInfo.position = lanePosition;
-
-    std::vector<ScenarioEntity> entities{entity};
-    std::optional<AgentBlueprint> actualAgentBlueprintOptional;
-    AgentBlueprint actualAgentBlueprint;
-    VehicleModelParameters vehicleModelParameters;
-    vehicleModelParameters.boundingBoxDimensions.length = 1;
-    vehicleModelParameters.boundingBoxDimensions.width = 0.5;
-    vehicleModelParameters.boundingBoxCenter.x = 0.;
-    actualAgentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-    actualAgentBlueprintOptional = actualAgentBlueprint;
-
-    SpawnParameter expectedSpawnParameter;
-    constexpr double expectedX = 100.0;
-    constexpr double expectedY = 10.0;
-    constexpr double expectedYaw = 1.0;
-    expectedSpawnParameter.velocity = velocity;
-    expectedSpawnParameter.positionX = expectedX;
-    expectedSpawnParameter.positionY = expectedY;
-    expectedSpawnParameter.yawAngle = expectedYaw;
-
-    AgentBlueprint expectedAgentBlueprint;
-    expectedAgentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-    expectedAgentBlueprint.SetAgentProfileName(entityName);
-    expectedAgentBlueprint.SetAgentCategory(AgentCategory::Ego);
-    expectedAgentBlueprint.SetObjectName(entityName);
-    expectedAgentBlueprint.SetSpawnParameter(expectedSpawnParameter);
-
-    Position position{expectedX, expectedY, expectedYaw, 0};
-
-    ON_CALL(fakeScenario, GetEntities()).WillByDefault(ReturnRef(entities));
-
-    ON_CALL(fakeAgentBlueprintProvider, SampleAgent(entity.catalogReference.entryName, _))
-        .WillByDefault(Return(actualAgentBlueprint));
-    ON_CALL(fakeWorld, IsSValidOnLane(roadId, laneId, s))
-        .WillByDefault(Return(true));
-    ON_CALL(fakeWorld, IsSValidOnLane(roadId, laneId, s))
-        .WillByDefault(Return(true));
-    ON_CALL(fakeWorld, GetLaneWidth(roadId, laneId, s))
-        .WillByDefault(Return(0.75));
-    ON_CALL(fakeWorld, LaneCoord2WorldCoord(s, offset, roadId, laneId))
-        .WillByDefault(Return(position));
-    ON_CALL(fakeWorld, IntersectsWithAgent(_, _, _, _, _, _))
-        .WillByDefault(Return(false));
-    GlobalRoadPositions roadPositions{{"Road1",{"Road1",-1,0,0,0}}};
-    ON_CALL(fakeWorld, WorldCoord2LaneCoord(expectedX,expectedY,expectedYaw)).WillByDefault(Return(roadPositions));
-    RoadGraph roadGraph{};
-    auto vertex = add_vertex(RouteElement{"Road1",true}, roadGraph);
-    ON_CALL(fakeWorld, GetRoadGraph(RouteElement{"Road1",true}, _, true)).WillByDefault(Return(std::make_pair(roadGraph, vertex)));
-    ON_CALL(fakeWorld, IsDirectionalRoadExisting("Road1", true)).WillByDefault(Return(true));
-
-     // If this is called and the blueprints match, we're creating our Agent correctly
-    EXPECT_CALL(fakeAgentFactory, AddAgent(MatchesAgentBlueprint(expectedAgentBlueprint)))
-        // There is no interface for agent, so we need to fake a valid object (!= nullptr)
-        // If the spawnpoint ever needs a true object, this will crash (!)
-        .WillOnce(Return(reinterpret_cast<core::Agent*>(0x1234)));
-
-    SpawnerScenario spawnerScenario{&dependencies, nullptr};
-    spawnerScenario.Trigger(0);
-}
-
-TEST(SpawnerScenario, Trigger_SpawnsScenarioAgentAccordingToScenarioWorldPosition)
-{
-    NiceMock<FakeWorld> fakeWorld;
-    NiceMock<FakeScenario> fakeScenario;
-    NiceMock<FakeAgentBlueprintProvider> fakeAgentBlueprintProvider;
-    NiceMock<FakeAgentFactory> fakeAgentFactory;
-    NiceMock<FakeStochastics> fakeStochastics;
-
-    SpawnPointDependencies dependencies(&fakeAgentFactory, &fakeWorld, &fakeAgentBlueprintProvider, &fakeStochastics);
-    dependencies.scenario = &fakeScenario;
-
-    const std::string entityName = "ENTITY";
-    constexpr double x = 10.0;
-    constexpr double y = 5.0;
-    constexpr double heading = 0.5;
-    constexpr double velocity = 25;
-    constexpr double acceleration = 25;
-
-    openScenario::WorldPosition worldPosition{x, y, std::nullopt, heading, std::nullopt, std::nullopt};
-
-    ScenarioEntity entity;
-    entity.name = entityName;
-    entity.catalogReference.entryName = entityName;
-    entity.spawnInfo.velocity = velocity;
-    entity.spawnInfo.acceleration = acceleration;
-    entity.spawnInfo.position = worldPosition;
-
-    std::vector<ScenarioEntity> entities{entity};
-    std::optional<AgentBlueprint> actualAgentBlueprintOptional;
-    AgentBlueprint actualAgentBlueprint;
-    VehicleModelParameters vehicleModelParameters;
-    vehicleModelParameters.boundingBoxDimensions.length = 1;
-    vehicleModelParameters.boundingBoxDimensions.width = 0.5;
-    vehicleModelParameters.boundingBoxCenter.x = 0.;
-    actualAgentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-    actualAgentBlueprintOptional = actualAgentBlueprint;
-
-    SpawnParameter expectedSpawnParameter;
-    expectedSpawnParameter.velocity = velocity;
-    expectedSpawnParameter.positionX = x;
-    expectedSpawnParameter.positionY = y;
-    expectedSpawnParameter.yawAngle = heading;
-
-    AgentBlueprint expectedAgentBlueprint;
-    expectedAgentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-    expectedAgentBlueprint.SetAgentProfileName(entityName);
-    expectedAgentBlueprint.SetAgentCategory(AgentCategory::Scenario);
-    expectedAgentBlueprint.SetObjectName(entityName);
-    expectedAgentBlueprint.SetSpawnParameter(expectedSpawnParameter);
-
-    ON_CALL(fakeScenario, GetEntities())
-        .WillByDefault(ReturnRef(entities));
-
-    ON_CALL(fakeAgentBlueprintProvider, SampleAgent(entity.catalogReference.entryName, _))
-        .WillByDefault(Return(actualAgentBlueprint));
-    ON_CALL(fakeWorld, IntersectsWithAgent(_, _, _, _, _, _))
-        .WillByDefault(Return(false));
-    GlobalRoadPositions roadPositions{{"Road1",{"Road1",-1,0,0,0}}};
-    ON_CALL(fakeWorld, WorldCoord2LaneCoord(x,y,heading)).WillByDefault(Return(roadPositions));
-    RoadGraph roadGraph{};
-    auto vertex = add_vertex(RouteElement{"Road1",true}, roadGraph);
-    ON_CALL(fakeWorld, GetRoadGraph(RouteElement{"Road1",true}, _, true)).WillByDefault(Return(std::make_pair(roadGraph, vertex)));
-    ON_CALL(fakeWorld, IsDirectionalRoadExisting("Road1", true)).WillByDefault(Return(true));
-
-    // If this is called and the blueprints match, we're creating our Agent correctly
-    EXPECT_CALL(fakeAgentFactory, AddAgent(MatchesAgentBlueprint(expectedAgentBlueprint)))
-        // There is no interface for agent, so we need to fake a valid object (!= nullptr)
-        // If the spawnpoint ever needs a true object, this will crash (!)
-        .WillOnce(Return(reinterpret_cast<core::Agent*>(0x1234)));
-
-    SpawnerScenario spawnerScenario{&dependencies, nullptr};
-    spawnerScenario.Trigger(0);
-}
-
-TEST(SpawnerScenario, Trigger_SpawnsScenarioAgentAccordingToScenarioLanePosition)
-{
-    NiceMock<FakeWorld> fakeWorld;
-    NiceMock<FakeScenario> fakeScenario;
-    NiceMock<FakeAgentBlueprintProvider> fakeAgentBlueprintProvider;
-    NiceMock<FakeAgentFactory> fakeAgentFactory;
-    NiceMock<FakeStochastics> fakeStochastics;
-
-    SpawnPointDependencies dependencies(&fakeAgentFactory, &fakeWorld, &fakeAgentBlueprintProvider, &fakeStochastics);
-    dependencies.scenario = &fakeScenario;
-
-    const std::string entityName = "ENTITY";
-    const std::string roadId = "ROADID";
-    constexpr int laneId = -1;
-    constexpr double s = 10;
-    constexpr double offset = 0;
-    constexpr double velocity = 25;
-    constexpr double acceleration = 25;
-
-    openScenario::LanePosition lanePosition;
-    lanePosition.roadId = roadId;
-    lanePosition.laneId = laneId;
-    lanePosition.s = s;
-    lanePosition.offset = offset;
-
-    ScenarioEntity entity;
-    entity.name = entityName;
-    entity.catalogReference.entryName = entityName;
-    entity.spawnInfo.velocity = velocity;
-    entity.spawnInfo.acceleration = acceleration;
-    entity.spawnInfo.position = lanePosition;
-
-    std::vector<ScenarioEntity> entities{entity};
-    std::optional<AgentBlueprint> actualAgentBlueprintOptional;
-    AgentBlueprint actualAgentBlueprint;
-    VehicleModelParameters vehicleModelParameters;
-    vehicleModelParameters.boundingBoxDimensions.length = 1;
-    vehicleModelParameters.boundingBoxDimensions.width = 0.5;
-    vehicleModelParameters.boundingBoxCenter.x = 0.;
-    actualAgentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-    actualAgentBlueprintOptional = actualAgentBlueprint;
-
-    SpawnParameter expectedSpawnParameter;
-    constexpr double expectedX = 100.0;
-    constexpr double expectedY = 10.0;
-    constexpr double expectedYaw = 1.0;
-    expectedSpawnParameter.velocity = velocity;
-    expectedSpawnParameter.positionX = expectedX;
-    expectedSpawnParameter.positionY = expectedY;
-    expectedSpawnParameter.yawAngle = expectedYaw;
-
-    AgentBlueprint expectedAgentBlueprint;
-    expectedAgentBlueprint.SetVehicleModelParameters(vehicleModelParameters);
-    expectedAgentBlueprint.SetAgentProfileName(entityName);
-    expectedAgentBlueprint.SetAgentCategory(AgentCategory::Scenario);
-    expectedAgentBlueprint.SetObjectName(entityName);
-    expectedAgentBlueprint.SetSpawnParameter(expectedSpawnParameter);
-
-    Position position{expectedX, expectedY, expectedYaw, 0};
-
-    ON_CALL(fakeScenario, GetEntities())
-        .WillByDefault(ReturnRef(entities));
-
-    ON_CALL(fakeAgentBlueprintProvider, SampleAgent(entity.catalogReference.entryName, _))
-        .WillByDefault(Return(actualAgentBlueprint));
-    ON_CALL(fakeWorld, IsSValidOnLane(roadId, laneId, s))
-        .WillByDefault(Return(true));
-    ON_CALL(fakeWorld, IsSValidOnLane(roadId, laneId, s))
-        .WillByDefault(Return(true));
-    ON_CALL(fakeWorld, GetLaneWidth(roadId, laneId, s))
-        .WillByDefault(Return(0.75));
-    ON_CALL(fakeWorld, LaneCoord2WorldCoord(s, offset, roadId, laneId))
-        .WillByDefault(Return(position));
-    ON_CALL(fakeWorld, IntersectsWithAgent(_, _, _, _, _, _))
-        .WillByDefault(Return(false));
-    GlobalRoadPositions roadPositions{{"Road1",{"Road1",-1,0,0,0}}};
-    ON_CALL(fakeWorld, WorldCoord2LaneCoord(expectedX,expectedY,expectedYaw)).WillByDefault(Return(roadPositions));
-    RoadGraph roadGraph{};
-    auto vertex = add_vertex(RouteElement{"Road1",true}, roadGraph);
-    ON_CALL(fakeWorld, GetRoadGraph(RouteElement{"Road1",true}, _, true)).WillByDefault(Return(std::make_pair(roadGraph, vertex)));
-    ON_CALL(fakeWorld, IsDirectionalRoadExisting("Road1", true)).WillByDefault(Return(true));
-
-    // If this is called and the blueprints match, we're creating our Agent correctly
-    EXPECT_CALL(fakeAgentFactory, AddAgent(MatchesAgentBlueprint(expectedAgentBlueprint)))
-        // There is no interface for agent, so we need to fake a valid object (!= nullptr)
-        // If the spawnpoint ever needs a true object, this will crash (!)
-        .WillOnce(Return(reinterpret_cast<core::Agent*>(0x1234)));
-
-    SpawnerScenario spawnerScenario{&dependencies, nullptr};
-    spawnerScenario.Trigger(0);
-}
diff --git a/sim/tests/unitTests/core/opSimulation/modules/SpawnerWorldAnalyzer/spawnerWorldAnalyzer_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/SpawnerWorldAnalyzer/spawnerWorldAnalyzer_Tests.cpp
index 1b53291bd527534a390f9dde7cbe5f7947ebfc70..946c87b08fd7e93aced74b24c7effdf568593fdd 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/SpawnerWorldAnalyzer/spawnerWorldAnalyzer_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/SpawnerWorldAnalyzer/spawnerWorldAnalyzer_Tests.cpp
@@ -8,15 +8,13 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-#include "gtest/gtest.h"
-#include "gmock/gmock.h"
-
 #include "common/WorldAnalyzer.h"
-
+#include "dontCare.h"
 #include "fakeAgent.h"
-#include "fakeWorld.h"
 #include "fakeStream.h"
-#include "dontCare.h"
+#include "fakeWorld.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 
 using ::testing::_;
 using ::testing::AllOf;
@@ -32,21 +30,20 @@ using ::testing::ReturnRef;
 using ::testing::UnorderedElementsAreArray;
 using ::testing::VariantWith;
 
-namespace
-{
+namespace {
 
-    static const auto NO_AGENTS_IN_RANGE = AgentInterfaces{};
-    static const auto NO_OBJECTS_IN_RANGE = std::vector<const WorldObjectInterface*>{};
+static const auto NO_AGENTS_IN_RANGE = AgentInterfaces{};
+static const auto NO_OBJECTS_IN_RANGE = std::vector<const WorldObjectInterface *>{};
 
-    static inline std::pair<RoadGraph, RoadGraphVertex> GetSingleVertexRoadGraph(const RouteElement& routeElement)
-    {
-        RoadGraph roadGraph;
-        auto vertex = add_vertex(routeElement, roadGraph);
-        return {roadGraph, vertex};
-    }
+static inline std::pair<RoadGraph, RoadGraphVertex> GetSingleVertexRoadGraph(const RouteElement &routeElement)
+{
+    RoadGraph roadGraph;
+    auto vertex = add_vertex(routeElement, roadGraph);
+    return {roadGraph, vertex};
 }
+} // namespace
 
-bool operator== (const RoadGraph& lhs, const RoadGraph& rhs)
+bool operator==(const RoadGraph &lhs, const RoadGraph &rhs)
 {
     return get(RouteElement(), lhs, 0) == get(RouteElement(), rhs, 0);
 }
@@ -56,27 +53,27 @@ TEST(WorldAnalyzer, GetValidLaneSpawningRanges_NoScenarioAgentsAllDrivingLanes_R
     const RoadId roadId{"ROADID"};
     const auto [roadGraph, vertex] = GetSingleVertexRoadGraph(RouteElement{roadId, true});
     const LaneId laneId{-1};
-    const SPosition sStart{0};
-    const SPosition sEnd{100};
-    const LaneSection fakeLaneSection {sStart, sEnd, {laneId}};
-    const LaneSections fakeLaneSections {fakeLaneSection};
-    const Ranges expectedValidRanges {{sStart, sEnd}};
-    const RouteQueryResult<double> endOfLaneResult {{vertex, sEnd}};
+    const SPosition sStart{0_m};
+    const SPosition sEnd{100_m};
+    const LaneSection fakeLaneSection{sStart, sEnd, {laneId}};
+    const LaneSections fakeLaneSections{fakeLaneSection};
+    const Ranges expectedValidRanges{{sStart, sEnd}};
+    const RouteQueryResult<units::length::meter_t> endOfLaneResult{{vertex, sEnd}};
 
     const LaneTypes validLaneTypes = {LaneType::Driving};
 
     std::unique_ptr<FakeLaneStream> laneStream = std::make_unique<FakeLaneStream>();
-    ON_CALL(*laneStream, GetLength()).WillByDefault(Return(10000));
-    EXPECT_CALL(*laneStream, GetAgentsInRange(StreamPosition{sStart, 0},
-                                            StreamPosition{sEnd, 0}))
-            .WillOnce(Return(NO_AGENTS_IN_RANGE));
-    EXPECT_CALL(*laneStream, GetLaneTypes()).WillOnce(Return(std::vector<std::pair<double, LaneType>>{std::make_pair(0, LaneType::Driving)}));
+    ON_CALL(*laneStream, GetLength()).WillByDefault(Return(10000_m));
+    EXPECT_CALL(*laneStream, GetAgentsInRange(StreamPosition{sStart, 0_m},
+                                              StreamPosition{sEnd, 0_m}))
+        .WillOnce(Return(NO_AGENTS_IN_RANGE));
+    EXPECT_CALL(*laneStream, GetLaneTypes()).WillOnce(Return(std::vector<std::pair<units::length::meter_t, LaneType>>{std::make_pair(0_m, LaneType::Driving)}));
 
     FakeWorld fakeWorld;
     WorldAnalyzer worldAnalyzer(&fakeWorld,
-                                [](const auto&) {});
+                                [](const auto &) {});
 
-    const auto& actualResult = worldAnalyzer.GetValidLaneSpawningRanges(std::move(laneStream), sStart, sEnd, validLaneTypes);
+    const auto &actualResult = worldAnalyzer.GetValidLaneSpawningRanges(std::move(laneStream), sStart, sEnd, validLaneTypes);
     EXPECT_THAT(actualResult,
                 expectedValidRanges);
 }
@@ -86,30 +83,30 @@ TEST(WorldAnalyzer, GetValidLaneSpawningRanges_NoScenarioAgentsMixedLaneTypes_Re
     const RoadId roadId{"ROADID"};
     const auto [roadGraph, vertex] = GetSingleVertexRoadGraph(RouteElement{roadId, true});
     const LaneId laneId{-1};
-    const SPosition sStart{10};
-    const SPosition sEnd{100};
-    const SPosition sLaneType1{0};
-    const SPosition sLaneType2{50};
-    const SPosition sLaneType3{90};
-    const LaneSection fakeLaneSection {sStart, sEnd, {laneId}};
-    const LaneSections fakeLaneSections {fakeLaneSection};
-    const Ranges expectedValidRanges {{sStart, sLaneType2}, {sLaneType3, sEnd}};
-    const RouteQueryResult<double> endOfLaneResult {{vertex, sEnd}};
+    const SPosition sStart{10_m};
+    const SPosition sEnd{100_m};
+    const SPosition sLaneType1{0_m};
+    const SPosition sLaneType2{50_m};
+    const SPosition sLaneType3{90_m};
+    const LaneSection fakeLaneSection{sStart, sEnd, {laneId}};
+    const LaneSections fakeLaneSections{fakeLaneSection};
+    const Ranges expectedValidRanges{{sStart, sLaneType2}, {sLaneType3, sEnd}};
+    const RouteQueryResult<units::length::meter_t> endOfLaneResult{{vertex, sEnd}};
 
     const LaneTypes validLaneTypes = {LaneType::Driving};
 
     std::unique_ptr<FakeLaneStream> laneStream = std::make_unique<FakeLaneStream>();
-    ON_CALL(*laneStream, GetLength()).WillByDefault(Return(10000));
-    ON_CALL(*laneStream, GetAgentsInRange(_,_))
-            .WillByDefault(Return(NO_AGENTS_IN_RANGE));
-    std::vector<std::pair<double, LaneType>> laneTypes{{sLaneType1, LaneType::Driving},{sLaneType2, LaneType::None}, {sLaneType3, LaneType::Driving}};
+    ON_CALL(*laneStream, GetLength()).WillByDefault(Return(10000_m));
+    ON_CALL(*laneStream, GetAgentsInRange(_, _))
+        .WillByDefault(Return(NO_AGENTS_IN_RANGE));
+    std::vector<std::pair<units::length::meter_t, LaneType>> laneTypes{{sLaneType1, LaneType::Driving}, {sLaneType2, LaneType::None}, {sLaneType3, LaneType::Driving}};
     EXPECT_CALL(*laneStream, GetLaneTypes()).WillOnce(Return(laneTypes));
 
     FakeWorld fakeWorld;
     WorldAnalyzer worldAnalyzer(&fakeWorld,
-                                [](const auto&) {});
+                                [](const auto &) {});
 
-    const auto& actualResult = worldAnalyzer.GetValidLaneSpawningRanges(std::move(laneStream), sStart, sEnd, validLaneTypes);
+    const auto &actualResult = worldAnalyzer.GetValidLaneSpawningRanges(std::move(laneStream), sStart, sEnd, validLaneTypes);
     EXPECT_THAT(actualResult,
                 expectedValidRanges);
 }
@@ -125,11 +122,12 @@ struct GetValidLaneSpawningRanges_OneAgent_Data
     const std::vector<Range> expectedValidRanges;
 };
 
-class GetValidLaneSpawningRanges_OneAgent : public::testing::TestWithParam<GetValidLaneSpawningRanges_OneAgent_Data>
+class GetValidLaneSpawningRanges_OneAgent : public ::testing::TestWithParam<GetValidLaneSpawningRanges_OneAgent_Data>
 {
 public:
     GetValidLaneSpawningRanges_OneAgent()
-    {}
+    {
+    }
 
     FakeAgent fakeAgent;
     FakeWorld fakeWorld;
@@ -141,30 +139,30 @@ TEST_P(GetValidLaneSpawningRanges_OneAgent, GetValidLaneSpawningRanges)
     const auto data = GetParam();
     const LaneTypes validLaneTypes = {LaneType::Driving};
 
-    ON_CALL(*laneStream, GetLength()).WillByDefault(Return(10000));
-    EXPECT_CALL(*laneStream, GetAgentsInRange(StreamPosition{data.sStart, 0},
-                                            StreamPosition{data.sEnd, 0}))
-            .WillOnce(Return(AgentInterfaces{&fakeAgent}));
+    ON_CALL(*laneStream, GetLength()).WillByDefault(Return(10000_m));
+    EXPECT_CALL(*laneStream, GetAgentsInRange(StreamPosition{data.sStart, 0_m},
+                                              StreamPosition{data.sEnd, 0_m}))
+        .WillOnce(Return(AgentInterfaces{&fakeAgent}));
 
     EXPECT_CALL(fakeAgent, GetAgentCategory())
-            .WillRepeatedly(Return(data.agentCategory));
+        .WillRepeatedly(Return(data.agentCategory));
 
     EXPECT_CALL(*laneStream, GetStreamPosition(&fakeAgent, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter)))
-        .WillRepeatedly(Return(StreamPosition{data.scenarioAgentBounds.first, 0.}));
+        .WillRepeatedly(Return(StreamPosition{data.scenarioAgentBounds.first, 0._m}));
 
     EXPECT_CALL(*laneStream, GetStreamPosition(&fakeAgent, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter)))
-        .WillRepeatedly(Return(StreamPosition{data.scenarioAgentBounds.second, 0.}));
+        .WillRepeatedly(Return(StreamPosition{data.scenarioAgentBounds.second, 0._m}));
 
-    EXPECT_CALL(*laneStream, GetLaneTypes()).WillOnce(Return(std::vector<std::pair<double, LaneType>>{std::make_pair(0, LaneType::Driving)}));
+    EXPECT_CALL(*laneStream, GetLaneTypes()).WillOnce(Return(std::vector<std::pair<units::length::meter_t, LaneType>>{std::make_pair(0_m, LaneType::Driving)}));
 
     WorldAnalyzer worldAnalyzer{&fakeWorld,
-                                [](const auto&) {}};
+                                [](const auto &) {}};
 
-    const auto& actualResult = worldAnalyzer.GetValidLaneSpawningRanges(std::move(laneStream), data.sStart, data.sEnd, validLaneTypes);
+    const auto &actualResult = worldAnalyzer.GetValidLaneSpawningRanges(std::move(laneStream), data.sStart, data.sEnd, validLaneTypes);
 
-    Ranges expectedValidLaneRanges {};
+    Ranges expectedValidLaneRanges{};
 
-    for (const auto& range : data.expectedValidRanges)
+    for (const auto &range : data.expectedValidRanges)
     {
         expectedValidLaneRanges.emplace_back(range.first, range.second);
     }
@@ -173,21 +171,20 @@ TEST_P(GetValidLaneSpawningRanges_OneAgent, GetValidLaneSpawningRanges)
 }
 
 INSTANTIATE_TEST_CASE_P(WorldAnalyzer_AltersValidSpawnRangeCorrectly, GetValidLaneSpawningRanges_OneAgent,
-    ::testing::Values(
-                                              // sStart | sEnd |      agentCategory     |      bounds      |      expectedValidRanges |
-        // single common agent does not impact valid ranges
-        GetValidLaneSpawningRanges_OneAgent_Data{0,   100,   AgentCategory::Common,           {5, 10},                   {{0, 100}}},
-        // single ego agent renders agent bounds invalid as spawning points
-        GetValidLaneSpawningRanges_OneAgent_Data{0,   100,      AgentCategory::Ego,           {5, 10},                   {{0, 4.999}, {10.001, 100}}},
-        // single scenario agent renders agent bounds invalid as spawning points
-        GetValidLaneSpawningRanges_OneAgent_Data{0,   100, AgentCategory::Scenario,           {5, 10},                   {{0, 4.999}, {10.001, 100}}},
-        // a range entirely encapsulated by a single agent is invalid
-        GetValidLaneSpawningRanges_OneAgent_Data{25,    30, AgentCategory::Scenario,         {20, 35},                    {}},
-        // a single ego agent outside the range leave full range valid
-        GetValidLaneSpawningRanges_OneAgent_Data{0,   100,      AgentCategory::Ego,         {105,110},                   {{0, 100}}},
-        // a single scenario agent outside the range leave full range valid
-        GetValidLaneSpawningRanges_OneAgent_Data{0,   100, AgentCategory::Scenario,         {105,110},                   {{0, 100}}}
-    ));
+                        ::testing::Values(
+                            // sStart | sEnd |      agentCategory     |      bounds      |      expectedValidRanges |
+                            // single common agent does not impact valid ranges
+                            GetValidLaneSpawningRanges_OneAgent_Data{0_m, 100_m, AgentCategory::Common, {5_m, 10_m}, {{0_m, 100_m}}},
+                            // single ego agent renders agent bounds invalid as spawning points
+                            GetValidLaneSpawningRanges_OneAgent_Data{0_m, 100_m, AgentCategory::Ego, {5_m, 10_m}, {{0_m, 4.999_m}, {10.001_m, 100_m}}},
+                            // single scenario agent renders agent bounds invalid as spawning points
+                            GetValidLaneSpawningRanges_OneAgent_Data{0_m, 100_m, AgentCategory::Scenario, {5_m, 10_m}, {{0_m, 4.999_m}, {10.001_m, 100_m}}},
+                            // a range entirely encapsulated by a single agent is invalid
+                            GetValidLaneSpawningRanges_OneAgent_Data{25_m, 30_m, AgentCategory::Scenario, {20_m, 35_m}, {}},
+                            // a single ego agent outside the range leave full range valid
+                            GetValidLaneSpawningRanges_OneAgent_Data{0_m, 100_m, AgentCategory::Ego, {105_m, 110_m}, {{0_m, 100_m}}},
+                            // a single scenario agent outside the range leave full range valid
+                            GetValidLaneSpawningRanges_OneAgent_Data{0_m, 100_m, AgentCategory::Scenario, {105_m, 110_m}, {{0_m, 100_m}}}));
 
 struct GetValidLaneSpawningRanges_TwoAgents_Data
 {
@@ -203,11 +200,12 @@ struct GetValidLaneSpawningRanges_TwoAgents_Data
     const std::vector<Range> expectedValidRanges;
 };
 
-class GetValidLaneSpawningRanges_TwoAgents : public::testing::TestWithParam<GetValidLaneSpawningRanges_TwoAgents_Data>
+class GetValidLaneSpawningRanges_TwoAgents : public ::testing::TestWithParam<GetValidLaneSpawningRanges_TwoAgents_Data>
 {
 public:
     GetValidLaneSpawningRanges_TwoAgents()
-    {}
+    {
+    }
 
     FakeAgent firstFakeAgent;
     FakeAgent secondFakeAgent;
@@ -219,41 +217,41 @@ TEST_P(GetValidLaneSpawningRanges_TwoAgents, GetValidLaneSpawningRanges)
 {
     const auto data = GetParam();
 
-    ON_CALL(*laneStream, GetLength()).WillByDefault(Return(10000));
-    EXPECT_CALL(*laneStream, GetAgentsInRange(StreamPosition{data.sStart, 0},
-                                            StreamPosition{data.sEnd, 0}))
-            .WillOnce(Return(AgentInterfaces{&firstFakeAgent, &secondFakeAgent}));
+    ON_CALL(*laneStream, GetLength()).WillByDefault(Return(10000_m));
+    EXPECT_CALL(*laneStream, GetAgentsInRange(StreamPosition{data.sStart, 0_m},
+                                              StreamPosition{data.sEnd, 0_m}))
+        .WillOnce(Return(AgentInterfaces{&firstFakeAgent, &secondFakeAgent}));
 
     EXPECT_CALL(firstFakeAgent, GetAgentCategory())
-            .WillRepeatedly(Return(data.firstAgentCategory));
+        .WillRepeatedly(Return(data.firstAgentCategory));
 
     EXPECT_CALL(*laneStream, GetStreamPosition(&firstFakeAgent, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter)))
-        .WillRepeatedly(Return(StreamPosition{data.firstScenarioAgentBounds.first, 0.}));
+        .WillRepeatedly(Return(StreamPosition{data.firstScenarioAgentBounds.first, 0._m}));
 
     EXPECT_CALL(*laneStream, GetStreamPosition(&firstFakeAgent, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter)))
-        .WillRepeatedly(Return(StreamPosition{data.firstScenarioAgentBounds.second, 0.}));
+        .WillRepeatedly(Return(StreamPosition{data.firstScenarioAgentBounds.second, 0._m}));
 
     EXPECT_CALL(secondFakeAgent, GetAgentCategory())
-            .WillRepeatedly(Return(data.secondAgentCategory));
+        .WillRepeatedly(Return(data.secondAgentCategory));
 
     EXPECT_CALL(*laneStream, GetStreamPosition(&secondFakeAgent, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter)))
-        .WillRepeatedly(Return(StreamPosition{data.secondScenarioAgentBounds.first, 0.}));
+        .WillRepeatedly(Return(StreamPosition{data.secondScenarioAgentBounds.first, 0._m}));
 
     EXPECT_CALL(*laneStream, GetStreamPosition(&secondFakeAgent, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter)))
-        .WillRepeatedly(Return(StreamPosition{data.secondScenarioAgentBounds.second, 0.}));
+        .WillRepeatedly(Return(StreamPosition{data.secondScenarioAgentBounds.second, 0._m}));
 
-    EXPECT_CALL(*laneStream, GetLaneTypes()).WillOnce(Return(std::vector<std::pair<double, LaneType>>{std::make_pair(0, LaneType::Driving)}));
+    EXPECT_CALL(*laneStream, GetLaneTypes()).WillOnce(Return(std::vector<std::pair<units::length::meter_t, LaneType>>{std::make_pair(0_m, LaneType::Driving)}));
 
     WorldAnalyzer worldAnalyzer{&fakeWorld,
-                                [](const auto&) {}};
+                                [](const auto &) {}};
 
     const LaneTypes validLaneTypes = {LaneType::Driving};
 
-    const auto& actualResult = worldAnalyzer.GetValidLaneSpawningRanges(std::move(laneStream), data.sStart, data.sEnd, validLaneTypes);
+    const auto &actualResult = worldAnalyzer.GetValidLaneSpawningRanges(std::move(laneStream), data.sStart, data.sEnd, validLaneTypes);
 
-    Ranges expectedValidLaneRanges {};
+    Ranges expectedValidLaneRanges{};
 
-    for (const auto& range : data.expectedValidRanges)
+    for (const auto &range : data.expectedValidRanges)
     {
         expectedValidLaneRanges.emplace_back(range.first, range.second);
     }
@@ -262,48 +260,48 @@ TEST_P(GetValidLaneSpawningRanges_TwoAgents, GetValidLaneSpawningRanges)
 }
 
 INSTANTIATE_TEST_CASE_P(WorldAnalyzer_AltersValidSpawnRangeCorrectly, GetValidLaneSpawningRanges_TwoAgents,
-    ::testing::Values(
-                                               //sStart | sEnd |    firstAgentCategory  | firstScenarioAgentBounds | secondAgentCategory    | secondAgentBounds | shouldHaveValidRanges | expectedValidRanges
-        // only common agents -- full range should be valid
-        GetValidLaneSpawningRanges_TwoAgents_Data{0,   100,   AgentCategory::Common,         DontCare<Range>(),   AgentCategory::Common,  DontCare<Range>(),                   {{0, 100}}},
-        // only a scenario agent and a common agent (the reverse will act as a one agent situation with the agent having category common)
-        // only range outside of agent bounds should be valid
-        GetValidLaneSpawningRanges_TwoAgents_Data{0,   100,      AgentCategory::Ego,                   {5, 10},   AgentCategory::Common,           {20, 25},                   {{0, 4.999}, {10.001, 100}}}, // the first value of further ranges are padded with .01 to avoid re-detecting the same agent
-        GetValidLaneSpawningRanges_TwoAgents_Data{0,   100, AgentCategory::Scenario,                   {5, 10},   AgentCategory::Common,           {20, 25},                   {{0, 4.999}, {10.001, 100}}},
-        // two internal scenario agents
-        // spawn range before rear of nearest agent and after front of furthest agent is valid
-        GetValidLaneSpawningRanges_TwoAgents_Data{0,   100,      AgentCategory::Ego,                   {5, 10}, AgentCategory::Scenario,           {25, 50},                   {{0, 4.999}, {50.001, 100}}},
-        GetValidLaneSpawningRanges_TwoAgents_Data{0,   100, AgentCategory::Scenario,                   {5, 10}, AgentCategory::Scenario,           {25, 50},                   {{0, 4.999}, {50.001, 100}}},
-        // two external scenario agents encapsualting spawn range -- no valid spawn range
-        GetValidLaneSpawningRanges_TwoAgents_Data{10,   100,      AgentCategory::Ego,                    {0, 5}, AgentCategory::Scenario,           {100, 105},                 {}},
-        GetValidLaneSpawningRanges_TwoAgents_Data{10,   100, AgentCategory::Scenario,                    {0, 5}, AgentCategory::Scenario,           {100, 105},                 {}},
-        // one internal scenario agent and one external (beyond range) -- partial valid spawn range
-        GetValidLaneSpawningRanges_TwoAgents_Data{10,   100, AgentCategory::Scenario,                    {0, 5}, AgentCategory::Scenario,           {50, 55},                   {{55.001, 100}}},
-        // one internal scenario agent and one external (before range) -- partial valid spawn range
-        GetValidLaneSpawningRanges_TwoAgents_Data{0,     75, AgentCategory::Scenario,                  {50, 55}, AgentCategory::Scenario,         {100, 105},                   {{0, 49.999}}},
-        // two external agents (outside of range - beyond) -- full valid range
-        GetValidLaneSpawningRanges_TwoAgents_Data{0,   100,       AgentCategory::Ego,                {105, 110}, AgentCategory::Scenario,         {125, 130},                   {{0, 100}}},
-        // two external agents (outside of range - before) -- full valid range
-        GetValidLaneSpawningRanges_TwoAgents_Data{100,   200, AgentCategory::Scenario,                   {0, 5}, AgentCategory::Scenario,           {55, 60},                   {{100, 200}}}
-    ));
+                        ::testing::Values(
+                            //sStart | sEnd |    firstAgentCategory  | firstScenarioAgentBounds | secondAgentCategory    | secondAgentBounds | shouldHaveValidRanges | expectedValidRanges
+                            // only common agents -- full range should be valid
+                            GetValidLaneSpawningRanges_TwoAgents_Data{0_m, 100_m, AgentCategory::Common, DontCare<Range>(), AgentCategory::Common, DontCare<Range>(), {{0_m, 100_m}}},
+                            // only a scenario agent and a common agent (the reverse will act as a one agent situation with the agent having category common)
+                            // only range outside of agent bounds should be valid
+                            GetValidLaneSpawningRanges_TwoAgents_Data{0_m, 100_m, AgentCategory::Ego, {5_m, 10_m}, AgentCategory::Common, {20_m, 25_m}, {{0_m, 4.999_m}, {10.001_m, 100_m}}}, // the first value of further ranges are padded with .01 to avoid re-detecting the same agent
+                            GetValidLaneSpawningRanges_TwoAgents_Data{0_m, 100_m, AgentCategory::Scenario, {5_m, 10_m}, AgentCategory::Common, {20_m, 25_m}, {{0_m, 4.999_m}, {10.001_m, 100_m}}},
+                            // two internal scenario agents
+                            // spawn range before rear of nearest agent and after front of furthest agent is valid
+                            GetValidLaneSpawningRanges_TwoAgents_Data{0_m, 100_m, AgentCategory::Ego, {5_m, 10_m}, AgentCategory::Scenario, {25_m, 50_m}, {{0_m, 4.999_m}, {50.001_m, 100_m}}},
+                            GetValidLaneSpawningRanges_TwoAgents_Data{0_m, 100_m, AgentCategory::Scenario, {5_m, 10_m}, AgentCategory::Scenario, {25_m, 50_m}, {{0_m, 4.999_m}, {50.001_m, 100_m}}},
+                            // two external scenario agents encapsualting spawn range -- no valid spawn range
+                            GetValidLaneSpawningRanges_TwoAgents_Data{10_m, 100_m, AgentCategory::Ego, {0_m, 5_m}, AgentCategory::Scenario, {100_m, 105_m}, {}},
+                            GetValidLaneSpawningRanges_TwoAgents_Data{10_m, 100_m, AgentCategory::Scenario, {0_m, 5_m}, AgentCategory::Scenario, {100_m, 105_m}, {}},
+                            // one internal scenario agent and one external (beyond range) -- partial valid spawn range
+                            GetValidLaneSpawningRanges_TwoAgents_Data{10_m, 100_m, AgentCategory::Scenario, {0_m, 5_m}, AgentCategory::Scenario, {50_m, 55_m}, {{55.001_m, 100_m}}},
+                            // one internal scenario agent and one external (before range) -- partial valid spawn range
+                            GetValidLaneSpawningRanges_TwoAgents_Data{0_m, 75_m, AgentCategory::Scenario, {50_m, 55_m}, AgentCategory::Scenario, {100_m, 105_m}, {{0_m, 49.999_m}}},
+                            // two external agents (outside of range - beyond) -- full valid range
+                            GetValidLaneSpawningRanges_TwoAgents_Data{0_m, 100_m, AgentCategory::Ego, {105_m, 110_m}, AgentCategory::Scenario, {125_m, 130_m}, {{0_m, 100_m}}},
+                            // two external agents (outside of range - before) -- full valid range
+                            GetValidLaneSpawningRanges_TwoAgents_Data{100_m, 200_m, AgentCategory::Scenario, {0_m, 5_m}, AgentCategory::Scenario, {55_m, 60_m}, {{100_m, 200_m}}}));
 
 struct CalculateSpawnVelocityToPreventCrashing_Data
 {
-    const double opponentRearDistanceFromStartOfRoad;
-    const double opponentVelocity;
-
-    const double intendedSpawnPosition;
-    const double agentFrontLength;
-    const double agentRearLength;
-    const double intendedVelocity;
-    const double expectedAdjustedVelocity;
+    const units::length::meter_t opponentRearDistanceFromStartOfRoad;
+    const units::velocity::meters_per_second_t opponentVelocity;
+
+    const units::length::meter_t intendedSpawnPosition;
+    const units::length::meter_t agentFrontLength;
+    const units::length::meter_t agentRearLength;
+    const units::velocity::meters_per_second_t intendedVelocity;
+    const units::velocity::meters_per_second_t expectedAdjustedVelocity;
 };
 
-class CalculateSpawnVelocityToPreventCrashingTests : public::testing::TestWithParam<CalculateSpawnVelocityToPreventCrashing_Data>
+class CalculateSpawnVelocityToPreventCrashingTests : public ::testing::TestWithParam<CalculateSpawnVelocityToPreventCrashing_Data>
 {
 public:
     CalculateSpawnVelocityToPreventCrashingTests()
-    {}
+    {
+    }
 
     FakeWorld fakeWorld;
     FakeAgent fakeAgent;
@@ -318,16 +316,16 @@ TEST_P(CalculateSpawnVelocityToPreventCrashingTests, AdjustsVelocityToPreventCra
 
     std::unique_ptr<FakeLaneStream> laneStream = std::make_unique<FakeLaneStream>();
 
-    EXPECT_CALL(*laneStream, GetObjectsInRange(_,_))
-            .WillOnce(Return(std::vector<const WorldObjectInterface*>{&fakeAgent}));
+    EXPECT_CALL(*laneStream, GetObjectsInRange(_, _))
+        .WillOnce(Return(std::vector<const WorldObjectInterface *>{&fakeAgent}));
 
     EXPECT_CALL(*laneStream, GetStreamPosition(&fakeAgent, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter)))
-        .WillOnce(Return(StreamPosition{data.opponentRearDistanceFromStartOfRoad, 0.}));
+        .WillOnce(Return(StreamPosition{data.opponentRearDistanceFromStartOfRoad, 0._m}));
     EXPECT_CALL(fakeAgent, GetVelocity(_))
-            .WillOnce(Return(Common::Vector2d{data.opponentVelocity, 0.0}))
-            .WillOnce(Return(Common::Vector2d{data.opponentVelocity, 0.0}));
+            .WillOnce(Return(Common::Vector2d{data.opponentVelocity, 0.0_mps}))
+            .WillOnce(Return(Common::Vector2d{data.opponentVelocity, 0.0_mps}));
 
-    const auto emptyLoggingCallback = [](const std::string&) {};
+    const auto emptyLoggingCallback = [](const std::string &) {};
     WorldAnalyzer worldAnalyzer(&fakeWorld,
                                 emptyLoggingCallback);
     const auto actualAdjustedVelocity = worldAnalyzer.CalculateSpawnVelocityToPreventCrashing(std::move(laneStream),
@@ -336,31 +334,31 @@ TEST_P(CalculateSpawnVelocityToPreventCrashingTests, AdjustsVelocityToPreventCra
                                                                                               data.agentRearLength,
                                                                                               data.intendedVelocity);
 
-    EXPECT_THAT(actualAdjustedVelocity, DoubleEq(data.expectedAdjustedVelocity));
+    EXPECT_THAT(actualAdjustedVelocity.value(), DoubleEq(data.expectedAdjustedVelocity.value()));
 }
 
 INSTANTIATE_TEST_CASE_P(WorldAnalyzer_CalculateSpawnVelocityToPreventCrashing, CalculateSpawnVelocityToPreventCrashingTests,
-    ::testing::Values(
-                                                  // opponentRearDistanceFromStartOfRoad |  opponentVelocity | intendedSpawnPosition | agentFrontLength | agentRearLength | intendedVelocity | expectedAdjustedVelocity |
-        CalculateSpawnVelocityToPreventCrashing_Data{                                  60,                 20,                   49.5,               0.5,              0.5,                30,                      25.0}
-));
+                        ::testing::Values(
+                            // opponentRearDistanceFromStartOfRoad |  opponentVelocity | intendedSpawnPosition | agentFrontLength | agentRearLength | intendedVelocity | expectedAdjustedVelocity |
+                            CalculateSpawnVelocityToPreventCrashing_Data{60_m, 20_mps, 49.5_m, 0.5_m, 0.5_m, 30_mps, 25.0_mps}));
 
 struct SpawnWillCauseCrash_Data
 {
     const SPosition spawnPosition;
-    const double spawnVelocity;
+    const units::velocity::meters_per_second_t spawnVelocity;
     const Direction direction;
     const bool objectExistsInSearchDirection;
     const SPosition objectPosition;
-    const double objectVelocity;
+    const units::velocity::meters_per_second_t objectVelocity;
     const bool expectedSpawnWillCauseCrashResult;
 };
 
-class SpawnWillCauseCrashTests : public::testing::TestWithParam<SpawnWillCauseCrash_Data>
+class SpawnWillCauseCrashTests : public ::testing::TestWithParam<SpawnWillCauseCrash_Data>
 {
 public:
     SpawnWillCauseCrashTests()
-    {}
+    {
+    }
 
     FakeWorld fakeWorld;
     FakeAgent fakeObjectInLane;
@@ -372,37 +370,37 @@ TEST_P(SpawnWillCauseCrashTests, PredictsCrashesAccurately)
     const auto data = GetParam();
 
     const SPosition sPosition{data.spawnPosition};
-    const double agentFrontLength{.5};
-    const double agentRearLength{.5};
-    const double velocity{data.spawnVelocity};
+    const units::length::meter_t agentFrontLength{.5};
+    const units::length::meter_t agentRearLength{.5};
+    const units::velocity::meters_per_second_t velocity{data.spawnVelocity};
 
     if (!data.objectExistsInSearchDirection)
     {
-        EXPECT_CALL(*laneStream, GetObjectsInRange(_,_))
-                .WillOnce(Return(NO_OBJECTS_IN_RANGE));
+        EXPECT_CALL(*laneStream, GetObjectsInRange(_, _))
+            .WillOnce(Return(NO_OBJECTS_IN_RANGE));
     }
     else
     {
-        std::vector<const WorldObjectInterface*> objectsInRange{&fakeObjectInLane};
-        EXPECT_CALL(*laneStream, GetObjectsInRange(_,_))
-                .WillOnce(Return(objectsInRange));
+        std::vector<const WorldObjectInterface *> objectsInRange{&fakeObjectInLane};
+        EXPECT_CALL(*laneStream, GetObjectsInRange(_, _))
+            .WillOnce(Return(objectsInRange));
 
         EXPECT_CALL(fakeObjectInLane, GetVelocity(_))
-                .WillOnce(Return(Common::Vector2d{data.objectVelocity, 0.0}));
+                .WillOnce(Return(Common::Vector2d{data.objectVelocity, 0.0_mps}));
 
         if (data.direction == Direction::FORWARD)
         {
             EXPECT_CALL(*laneStream, GetStreamPosition(&fakeObjectInLane, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter)))
-                .WillOnce(Return(StreamPosition{data.objectPosition, 0.}));
+                .WillOnce(Return(StreamPosition{data.objectPosition, 0._m}));
         }
         else
         {
             EXPECT_CALL(*laneStream, GetStreamPosition(&fakeObjectInLane, VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter)))
-                .WillOnce(Return(StreamPosition{data.objectPosition, 0.}));
+                .WillOnce(Return(StreamPosition{data.objectPosition, 0._m}));
         }
     }
 
-    const auto emptyLoggingCallback = [](const std::string&) {};
+    const auto emptyLoggingCallback = [](const std::string &) {};
     WorldAnalyzer worldAnalyzer(&fakeWorld,
                                 emptyLoggingCallback);
     const auto actualSpawnWillCauseCrashResult = worldAnalyzer.SpawnWillCauseCrash(std::move(laneStream),
@@ -416,9 +414,8 @@ TEST_P(SpawnWillCauseCrashTests, PredictsCrashesAccurately)
 }
 
 INSTANTIATE_TEST_CASE_P(WorldAnalyzer_SpawnWillCauseCrash, SpawnWillCauseCrashTests,
-    ::testing::Values(
+                        ::testing::Values(
                             //      spawnPosition     |   spawnVelocity   |      direction     | objectExistsInSearchDirection |    objectPosition    |   objectVelocity  | expectedSpawnWillCauseCrashResult
-        SpawnWillCauseCrash_Data{DontCare<SPosition>(), DontCare<double>(),  Direction::FORWARD,                          false, DontCare<SPosition>(), DontCare<double>(), false},
-        SpawnWillCauseCrash_Data{                    0,               30.0,  Direction::FORWARD,                           true,                  75.0,                0.0, true},
-        SpawnWillCauseCrash_Data{                 75.0,                0.0, Direction::BACKWARD,                           true,                   0.0,               30.0, true}
-));
+                            SpawnWillCauseCrash_Data{DontCare<SPosition>(), DontCare<units::velocity::meters_per_second_t>(), Direction::FORWARD, false, DontCare<SPosition>(), DontCare<units::velocity::meters_per_second_t>(), false},
+                            SpawnWillCauseCrash_Data{0_m, 30.0_mps, Direction::FORWARD, true, 75.0_m, 0.0_mps, true},
+                            SpawnWillCauseCrash_Data{75.0_m, 0.0_mps, Direction::BACKWARD, true, 0.0_m, 30.0_mps, true}));
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGenerator.h b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGenerator.h
index a3ce0e29970940b546953dd7d971249e4af2de23..89874ee824429abed834537b14f1ee178db44f42 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGenerator.h
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGenerator.h
@@ -17,11 +17,11 @@ struct LaneGeometryElementsGenerator {
     std::vector<OWL::Interfaces::LaneGeometryElements*> laneGeometryElementsContainer;
 
     const OWL::Interfaces::LaneGeometryElements& SimpleLane(
-            Common::Vector2d origin,
-            double width,
+            Common::Vector2d<units::length::meter_t> origin,
+            units::length::meter_t width,
             int numberOfElements,
             double elementLength,
-            double hdg = 0.0
+            units::angle::radian_t hdg = 0.0
             )
     {
         auto laneGeometryElements = new OWL::Interfaces::LaneGeometryElements();
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGeometryElementGenerator.h b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGeometryElementGenerator.h
index f3f282c0037b48b4d564fe2e4eb13e157a548eca..01395077fee5dda899b4a054a366b47eb72b9bed 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGeometryElementGenerator.h
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGeometryElementGenerator.h
@@ -16,101 +16,87 @@ namespace Testing {
 
 struct LaneGeometryElementGenerator
 {
-
-static Primitive::LaneGeometryElement RectangularLaneGeometryElement(
-        Common::Vector2d origin,
-        double width,
-        double length,
-        double hdg = 0.0,
-        OWL::Interfaces::Lane* lane = nullptr)
-{
-    Common::Vector2d current_left {
-        origin.x - width/2 * std::sin(hdg),
-        origin.y + width/2 * std::cos(hdg)
-    };
-
-    Common::Vector2d current_reference = origin;
-
-    Common::Vector2d current_right {
-        origin.x + width/2 * std::sin(hdg),
-        origin.y - width/2 * std::cos(hdg)
-    };
-
-    Common::Vector2d next_left {
-        origin.x + length*std::cos(hdg) - width/2 * std::sin(hdg),
-        origin.y + length*std::sin(hdg) + width/2 * std::cos(hdg)
-    };
-
-    Common::Vector2d next_reference {
-        origin.x + length*std::cos(hdg),
-        origin.y + length*std::sin(hdg)
-    };
-
-    Common::Vector2d next_right {
-        origin.x + length*std::cos(hdg) + width/2 * std::sin(hdg),
-        origin.y + length*std::sin(hdg) - width/2 * std::cos(hdg)
-    };
-
-    OWL::Primitive::LaneGeometryJoint current
-    {
-        {
-            current_left,
-            current_reference,
-            current_right
-        },
-        0.0,
-        0.0,
-        hdg
-    };
-
-    OWL::Primitive::LaneGeometryJoint next
+    static Primitive::LaneGeometryElement RectangularLaneGeometryElement(
+        Common::Vector2d<units::length::meter_t> origin,
+        units::length::meter_t width,
+        units::length::meter_t length,
+        units::angle::radian_t hdg = 0.0_rad,
+        OWL::Interfaces::Lane *lane = nullptr)
     {
-        {
-            next_left,
-            next_reference,
-            next_right
-        },
-        0.0,
-        length,
-        hdg
-    };
-
-    return OWL::Primitive::LaneGeometryElement(current, next, lane);
-}
+        Common::Vector2d<units::length::meter_t> current_left{
+            origin.x - width / 2 * units::math::sin(hdg),
+            origin.y + width / 2 * units::math::cos(hdg)};
+
+        Common::Vector2d<units::length::meter_t> current_reference = origin;
+
+        Common::Vector2d<units::length::meter_t> current_right{
+            origin.x + width / 2 * units::math::sin(hdg),
+            origin.y - width / 2 * units::math::cos(hdg)};
+
+        Common::Vector2d<units::length::meter_t> next_left{
+            origin.x + length * units::math::cos(hdg) - width / 2 * units::math::sin(hdg),
+            origin.y + length * units::math::sin(hdg) + width / 2 * units::math::cos(hdg)};
+
+        Common::Vector2d<units::length::meter_t> next_reference{
+            origin.x + length * units::math::cos(hdg),
+            origin.y + length * units::math::sin(hdg)};
+
+        Common::Vector2d<units::length::meter_t> next_right{
+            origin.x + length * units::math::cos(hdg) + width / 2 * units::math::sin(hdg),
+            origin.y + length * units::math::sin(hdg) - width / 2 * units::math::cos(hdg)};
+
+        OWL::Primitive::LaneGeometryJoint current{
+            {current_left,
+             current_reference,
+             current_right},
+            0.0_i_m,
+            0.0_m,
+            hdg};
+
+        OWL::Primitive::LaneGeometryJoint next{
+            {next_left,
+             next_reference,
+             next_right},
+            0.0_i_m,
+            length,
+            hdg};
+
+        return OWL::Primitive::LaneGeometryElement(current, next, lane);
+    }
 
 static Primitive::LaneGeometryElement RectangularLaneGeometryElementWithCurvature(
-        Common::Vector2d origin,
-        double width,
-        double length,
-        double curvatureStart,
-        double curvatureEnd,
-        double hdg = 0.0)
+        Common::Vector2d<units::length::meter_t> origin,
+        units::length::meter_t width,
+        units::length::meter_t length,
+        units::curvature::inverse_meter_t curvatureStart,
+        units::curvature::inverse_meter_t curvatureEnd,
+        units::angle::radian_t hdg = 0.0_rad)
 {
-    Common::Vector2d current_left {
-        origin.x - width/2 * std::sin(hdg),
-        origin.y + width/2 * std::cos(hdg)
+    Common::Vector2d<units::length::meter_t> current_left {
+        origin.x - width/2 * units::math::sin(hdg),
+        origin.y + width/2 * units::math::cos(hdg)
     };
 
-    Common::Vector2d current_reference = origin;
+    Common::Vector2d<units::length::meter_t> current_reference = origin;
 
-    Common::Vector2d current_right {
-        origin.x + width/2 * std::sin(hdg),
-        origin.y - width/2 * std::cos(hdg)
+    Common::Vector2d<units::length::meter_t> current_right {
+        origin.x + width/2 * units::math::sin(hdg),
+        origin.y - width/2 * units::math::cos(hdg)
     };
 
-    Common::Vector2d next_left {
-        origin.x + length*std::cos(hdg) - width/2 * std::sin(hdg),
-        origin.y + length*std::sin(hdg) + width/2 * std::cos(hdg)
+    Common::Vector2d<units::length::meter_t> next_left {
+        origin.x + length*units::math::cos(hdg) - width/2 * units::math::sin(hdg),
+        origin.y + length*units::math::sin(hdg) + width/2 * units::math::cos(hdg)
     };
 
-    Common::Vector2d next_reference {
-        origin.x + length*std::cos(hdg),
-        origin.y + length*std::sin(hdg)
+    Common::Vector2d<units::length::meter_t> next_reference {
+        origin.x + length*units::math::cos(hdg),
+        origin.y + length*units::math::sin(hdg)
     };
 
-    Common::Vector2d next_right {
-        origin.x + length*std::cos(hdg) + width/2 * std::sin(hdg),
-        origin.y + length*std::sin(hdg) - width/2 * std::cos(hdg)
+    Common::Vector2d<units::length::meter_t> next_right {
+        origin.x + length*units::math::cos(hdg) + width/2 * units::math::sin(hdg),
+        origin.y + length*units::math::sin(hdg) - width/2 * units::math::cos(hdg)
     };
 
     OWL::Primitive::LaneGeometryJoint current
@@ -121,7 +107,7 @@ static Primitive::LaneGeometryElement RectangularLaneGeometryElementWithCurvatur
             current_right
         },
         curvatureStart,
-        0.0,
+        0.0_m,
         hdg
     };
 
@@ -141,28 +127,28 @@ static Primitive::LaneGeometryElement RectangularLaneGeometryElementWithCurvatur
 }
 
 static Primitive::LaneGeometryElement TriangularLaneGeometryElement(
-        Common::Vector2d origin,
-        double width,
-        double length,
-        double hdg = 0.0)
+        Common::Vector2d<units::length::meter_t> origin,
+        units::length::meter_t width,
+        units::length::meter_t length,
+        units::angle::radian_t hdg = 0.0_rad)
 {
-    Common::Vector2d current_left = origin;
-    Common::Vector2d current_reference = origin;
-    Common::Vector2d current_right = origin;
+    Common::Vector2d<units::length::meter_t> current_left = origin;
+    Common::Vector2d<units::length::meter_t> current_reference = origin;
+    Common::Vector2d<units::length::meter_t> current_right = origin;
 
-    Common::Vector2d next_left {
-        origin.x + length*std::cos(hdg) - width/2 * std::sin(hdg),
-        origin.y + length*std::sin(hdg) + width/2 * std::cos(hdg)
+    Common::Vector2d<units::length::meter_t> next_left {
+        origin.x + length*units::math::cos(hdg) - width/2 * units::math::sin(hdg),
+        origin.y + length*units::math::sin(hdg) + width/2 * units::math::cos(hdg)
     };
 
-    Common::Vector2d next_reference {
-        origin.x + length*std::cos(hdg),
-        origin.y + length*std::sin(hdg)
+    Common::Vector2d<units::length::meter_t> next_reference {
+        origin.x + length*units::math::cos(hdg),
+        origin.y + length*units::math::sin(hdg)
     };
 
-    Common::Vector2d next_right {
-        origin.x + length*std::cos(hdg) + width/2 * std::sin(hdg),
-        origin.y + length*std::sin(hdg) - width/2 * std::cos(hdg)
+    Common::Vector2d<units::length::meter_t> next_right {
+        origin.x + length*units::math::cos(hdg) + width/2 * units::math::sin(hdg),
+        origin.y + length*units::math::sin(hdg) - width/2 * units::math::cos(hdg)
     };
 
     OWL::Primitive::LaneGeometryJoint current
@@ -172,8 +158,8 @@ static Primitive::LaneGeometryElement TriangularLaneGeometryElement(
             current_reference,
             current_right
         },
-        0.0,
-        0.0,
+        0.0_i_m,
+        0.0_m,
         hdg
     };
 
@@ -184,7 +170,7 @@ static Primitive::LaneGeometryElement TriangularLaneGeometryElement(
             next_reference,
             next_right
         },
-        0.0,
+        0.0_i_m,
         length,
         hdg
     };
@@ -193,37 +179,37 @@ static Primitive::LaneGeometryElement TriangularLaneGeometryElement(
 }
 
 static Primitive::LaneGeometryElement CurvedLaneGeometryElement(
-        Common::Vector2d origin,
-        double width,
-        double length,
-        double sDistance,
-        double radius)
+        Common::Vector2d<units::length::meter_t> origin,
+        units::length::meter_t width,
+        units::length::meter_t length,
+        units::length::meter_t sDistance,
+        units::length::meter_t radius)
 {
     double openingAngle = length / radius;
 
-    Common::Vector2d current_left {
+    Common::Vector2d<units::length::meter_t> current_left {
         origin.x,
         origin.y + width/2
     };
 
-    Common::Vector2d current_reference = origin;
+    Common::Vector2d<units::length::meter_t> current_reference = origin;
 
-    Common::Vector2d current_right {
+    Common::Vector2d<units::length::meter_t> current_right {
         origin.x,
         origin.y - width/2
     };
 
-    Common::Vector2d next_left {
+    Common::Vector2d<units::length::meter_t> next_left {
         origin.x + radius * std::sin(openingAngle) - width/2 * std::sin(openingAngle),
         origin.y + radius * (1 - std::cos(openingAngle)) + width/2 * std::cos(openingAngle)
     };
 
-    Common::Vector2d next_reference {
+    Common::Vector2d<units::length::meter_t> next_reference {
         origin.x + radius * std::sin(openingAngle),
         origin.y + radius * (1 - std::cos(openingAngle))
     };
 
-    Common::Vector2d next_right {
+    Common::Vector2d<units::length::meter_t> next_right {
         origin.x + radius * std::sin(openingAngle) + width/2 * std::sin(openingAngle),
         origin.y + radius * (1 - std::cos(openingAngle)) - width/2 * std::cos(openingAngle)
     };
@@ -236,8 +222,8 @@ static Primitive::LaneGeometryElement CurvedLaneGeometryElement(
             current_right
         },
         1.0 / radius,
-        0.0,
-        0.0
+        0.0_m,
+        0.0_rad
     };
 
     OWL::Primitive::LaneGeometryJoint next
@@ -249,7 +235,7 @@ static Primitive::LaneGeometryElement CurvedLaneGeometryElement(
         },
         1.0 / radius,
         sDistance,
-        0.0
+        0.0_rad
     };
 
     return OWL::Primitive::LaneGeometryElement(current, next, nullptr);
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGeometryElementGenerator_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGeometryElementGenerator_Tests.cpp
index 3b1ea55b352ad681f828b382e4dde798af4a058c..3dc47451742c4d362200303060a15e70e7e6faa0 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGeometryElementGenerator_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/Generators/laneGeometryElementGenerator_Tests.cpp
@@ -22,18 +22,18 @@ struct LaneGeometryElementGenerator_DataSet
     // (see bottom of file)
 
     // data for generator
-    Common::Vector2d origin;
-    double width;
-    double length;
-    double hdg;
+    Common::Vector2d<units::length::meter_t> origin;
+    units::length::meter_t width;
+    units::length::meter_t length;
+    units::angle::radian_t hdg;
 
     // expected values
-    Common::Vector2d currentLeft;
-    Common::Vector2d currentReference;
-    Common::Vector2d currentRight;
-    Common::Vector2d nextLeft;
-    Common::Vector2d nextReference;
-    Common::Vector2d nextRight;
+    Common::Vector2d<units::length::meter_t> currentLeft;
+    Common::Vector2d<units::length::meter_t> currentReference;
+    Common::Vector2d<units::length::meter_t> currentRight;
+    Common::Vector2d<units::length::meter_t> nextLeft;
+    Common::Vector2d<units::length::meter_t> nextReference;
+    Common::Vector2d<units::length::meter_t> nextRight;
 
     /// \brief This stream will be shown in case the test fails
     friend std::ostream& operator<<(std::ostream& os, const LaneGeometryElementGenerator_DataSet& obj)
@@ -75,19 +75,19 @@ TEST_P(LaneGeometryElementGenerator, RectangularLaneGeometryElementVerification)
     auto current = elementUnderTest.joints.current;
     auto next = elementUnderTest.joints.next;
 
-    EXPECT_THAT(current.points.left.x,      DoubleNear(data.currentLeft.x,      1e-2));
-    EXPECT_THAT(current.points.left.y,      DoubleNear(data.currentLeft.y,      1e-2));
-    EXPECT_THAT(current.points.reference.x, DoubleNear(data.currentReference.x, 1e-2));
-    EXPECT_THAT(current.points.reference.y, DoubleNear(data.currentReference.y, 1e-2));
-    EXPECT_THAT(current.points.right.x,     DoubleNear(data.currentRight.x,     1e-2));
-    EXPECT_THAT(current.points.right.y,     DoubleNear(data.currentRight.y,     1e-2));
-
-    EXPECT_THAT(next.points.left.x,         DoubleNear(data.nextLeft.x,         1e-2));
-    EXPECT_THAT(next.points.left.y,         DoubleNear(data.nextLeft.y,         1e-2));
-    EXPECT_THAT(next.points.reference.x,    DoubleNear(data.nextReference.x,    1e-2));
-    EXPECT_THAT(next.points.reference.y,    DoubleNear(data.nextReference.y,    1e-2));
-    EXPECT_THAT(next.points.right.x,        DoubleNear(data.nextRight.x,        1e-2));
-    EXPECT_THAT(next.points.right.y,        DoubleNear(data.nextRight.y,        1e-2));
+    EXPECT_THAT(current.points.left.x.value(),      DoubleNear(data.currentLeft.x.value(),      1e-2));
+    EXPECT_THAT(current.points.left.y.value(),      DoubleNear(data.currentLeft.y.value(),      1e-2));
+    EXPECT_THAT(current.points.reference.x.value(), DoubleNear(data.currentReference.x.value(), 1e-2));
+    EXPECT_THAT(current.points.reference.y.value(), DoubleNear(data.currentReference.y.value(), 1e-2));
+    EXPECT_THAT(current.points.right.x.value(),     DoubleNear(data.currentRight.x.value(),     1e-2));
+    EXPECT_THAT(current.points.right.y.value(),     DoubleNear(data.currentRight.y.value(),     1e-2));
+
+    EXPECT_THAT(next.points.left.x.value(),         DoubleNear(data.nextLeft.x.value(),         1e-2));
+    EXPECT_THAT(next.points.left.y.value(),         DoubleNear(data.nextLeft.y.value(),         1e-2));
+    EXPECT_THAT(next.points.reference.x.value(),    DoubleNear(data.nextReference.x.value(),    1e-2));
+    EXPECT_THAT(next.points.reference.y.value(),    DoubleNear(data.nextReference.y.value(),    1e-2));
+    EXPECT_THAT(next.points.right.x.value(),        DoubleNear(data.nextRight.x.value(),        1e-2));
+    EXPECT_THAT(next.points.right.y.value(),        DoubleNear(data.nextRight.y.value(),        1e-2));
 }
 
 
@@ -105,43 +105,43 @@ TEST_P(LaneGeometryElementGenerator, TriangularLaneGeometryElementVerification)
     auto current = elementUnderTest.joints.current;
     auto next = elementUnderTest.joints.next;
 
-    EXPECT_THAT(current.points.left.x,      DoubleNear(data.currentReference.x, 1e-2));
-    EXPECT_THAT(current.points.left.y,      DoubleNear(data.currentReference.y, 1e-2));
-    EXPECT_THAT(current.points.reference.x, DoubleNear(data.currentReference.x, 1e-2));
-    EXPECT_THAT(current.points.reference.y, DoubleNear(data.currentReference.y, 1e-2));
-    EXPECT_THAT(current.points.right.x,     DoubleNear(data.currentReference.x, 1e-2));
-    EXPECT_THAT(current.points.right.y,     DoubleNear(data.currentReference.y, 1e-2));
-
-    EXPECT_THAT(next.points.left.x,         DoubleNear(data.nextLeft.x,         1e-2));
-    EXPECT_THAT(next.points.left.y,         DoubleNear(data.nextLeft.y,         1e-2));
-    EXPECT_THAT(next.points.reference.x,    DoubleNear(data.nextReference.x,    1e-2));
-    EXPECT_THAT(next.points.reference.y,    DoubleNear(data.nextReference.y,    1e-2));
-    EXPECT_THAT(next.points.right.x,        DoubleNear(data.nextRight.x,        1e-2));
-    EXPECT_THAT(next.points.right.y,        DoubleNear(data.nextRight.y,        1e-2));
+    EXPECT_THAT(current.points.left.x.value(),      DoubleNear(data.currentReference.x.value(), 1e-2));
+    EXPECT_THAT(current.points.left.y.value(),      DoubleNear(data.currentReference.y.value(), 1e-2));
+    EXPECT_THAT(current.points.reference.x.value(), DoubleNear(data.currentReference.x.value(), 1e-2));
+    EXPECT_THAT(current.points.reference.y.value(), DoubleNear(data.currentReference.y.value(), 1e-2));
+    EXPECT_THAT(current.points.right.x.value(),     DoubleNear(data.currentReference.x.value(), 1e-2));
+    EXPECT_THAT(current.points.right.y.value(),     DoubleNear(data.currentReference.y.value(), 1e-2));
+
+    EXPECT_THAT(next.points.left.x.value(),         DoubleNear(data.nextLeft.x.value(),         1e-2));
+    EXPECT_THAT(next.points.left.y.value(),         DoubleNear(data.nextLeft.y.value(),         1e-2));
+    EXPECT_THAT(next.points.reference.x.value(),    DoubleNear(data.nextReference.x.value(),    1e-2));
+    EXPECT_THAT(next.points.reference.y.value(),    DoubleNear(data.nextReference.y.value(),    1e-2));
+    EXPECT_THAT(next.points.right.x.value(),        DoubleNear(data.nextRight.x.value(),        1e-2));
+    EXPECT_THAT(next.points.right.y.value(),        DoubleNear(data.nextRight.y.value(),        1e-2));
 }
 
 
 
 INSTANTIATE_TEST_CASE_P(RandomSetWithRotatingHeading, LaneGeometryElementGenerator,
   testing::Values(
-    /*                                     origin  width length hdg    curr_left         curr_ref          curr_right        next_left         next_ref          next_right  */
-    /*                                        v       v   v     v          v                 v                 v                 v                 v                 v       */
-    LaneGeometryElementGenerator_DataSet{{-16,   1},  8, 12, -6.28, {-16.01,   5.00}, {-16.00,   1.00}, {-15.99,  -3.00}, { -4.01,   5.04}, { -4.00,   1.04}, { -3.99,  -2.96}},
-    LaneGeometryElementGenerator_DataSet{{  7,   0},  4, 12, -5.50, {  5.59,   1.42}, {  7.00,   0.00}, {  8.41,  -1.42}, { 14.09,   9.88}, { 15.50,   8.47}, { 16.92,   7.05}},
-    LaneGeometryElementGenerator_DataSet{{ -7,  10},  3, 12, -4.71, { -8.50,  10.00}, { -7.00,  10.00}, { -5.50,  10.00}, { -8.53,  22.00}, { -7.03,  22.00}, { -5.53,  22.00}},
-    LaneGeometryElementGenerator_DataSet{{-17,  13},  7, 12, -3.93, {-19.48,  10.53}, {-17.00,  13.00}, {-14.52,  15.47}, {-27.94,  19.04}, {-25.46,  21.51}, {-22.98,  23.98}},
-    LaneGeometryElementGenerator_DataSet{{-17,   7},  9, 11, -3.14, {-16.99,   2.50}, {-17.00,   7.00}, {-17.01,  11.50}, {-27.99,   2.48}, {-28.00,   6.98}, {-28.01,  11.48}},
-    LaneGeometryElementGenerator_DataSet{{ -1,  14},  3, 11, -2.36, {  0.06,  12.94}, { -1.00,  14.00}, { -2.06,  15.06}, { -7.75,   5.19}, { -8.81,   6.25}, { -9.86,   7.32}},
-    LaneGeometryElementGenerator_DataSet{{-15,   8},  3, 11, -1.57, {-13.50,   8.00}, {-15.00,   8.00}, {-16.50,   8.00}, {-13.49,  -3.00}, {-14.99,  -3.00}, {-16.49,  -3.00}},
-    LaneGeometryElementGenerator_DataSet{{-15,   6},  3, 11, -0.79, {-13.93,   7.06}, {-15.00,   6.00}, {-16.07,   4.94}, { -6.19,  -0.76}, { -7.26,  -1.81}, { -8.32,  -2.87}},
-    LaneGeometryElementGenerator_DataSet{{ 19,   3}, 10, 12,  0.00, { 19.00,   8.00}, { 19.00,   3.00}, { 19.00,  -2.00}, { 31.00,   8.00}, { 31.00,   3.00}, { 31.00,  -2.00}},
-    LaneGeometryElementGenerator_DataSet{{-12,  -9},  6, 12,  0.79, {-14.13,  -6.89}, {-12.00,  -9.00}, { -9.87, -11.11}, { -5.68,   1.64}, { -3.55,  -0.48}, { -1.42,  -2.59}},
-    LaneGeometryElementGenerator_DataSet{{  5, -17},  3, 10,  1.57, {  3.50, -17.00}, {  5.00, -17.00}, {  6.50, -17.00}, {  3.51,  -7.00}, {  5.01,  -7.00}, {  6.51,  -7.00}},
-    LaneGeometryElementGenerator_DataSet{{ 14,  -8},  9, 11,  2.36, { 10.83, -11.19}, { 14.00,  -8.00}, { 17.17,  -4.81}, {  3.02,  -3.45}, {  6.19,  -0.25}, {  9.36,   2.94}},
-    LaneGeometryElementGenerator_DataSet{{  1,  -2},  6, 12,  3.14, {  1.00,  -5.00}, {  1.00,  -2.00}, {  1.00,   1.00}, {-11.00,  -4.98}, {-11.00,  -1.98}, {-11.00,   1.02}},
-    LaneGeometryElementGenerator_DataSet{{ -3,  16},  5, 10,  3.93, { -1.23,  14.24}, { -3.00,  16.00}, { -4.77,  17.76}, { -8.28,   7.15}, {-10.05,   8.91}, {-11.82,  10.67}},
-    LaneGeometryElementGenerator_DataSet{{ 14, -20},  6, 11,  4.71, { 17.00, -20.01}, { 14.00, -20.00}, { 11.00, -19.99}, { 16.97, -31.01}, { 13.97, -31.00}, { 10.97, -30.99}},
-    LaneGeometryElementGenerator_DataSet{{ 14,   1},  9, 11,  5.5,  { 17.17,   4.19}, { 14.00,   1.00}, { 10.83,  -2.19}, { 24.97,  -3.57}, { 21.80,  -6.76}, { 18.62,  -9.95}},
-    LaneGeometryElementGenerator_DataSet{{  5,   6},  8, 11,  6.28, {  5.01,  10.00}, {  5.00,   6.00}, {  4.99,   2.00}, { 16.01,   9.96}, { 16.00,   5.96}, { 15.99,   1.96}},
-    LaneGeometryElementGenerator_DataSet{{  5,   6},  6,  0,   0.0, {  5.00,   9.00}, {  5.00,   6.00}, {  5.00,   3.00}, {  5.00,   9.00}, {  5.00,   6.00}, {  5.00,   3.00}}
+    /*                                         origin    width length    hdg          curr_left             curr_ref              curr_right            next_left             next_ref              next_right  */
+    /*                                           v         v     v        v               v                     v                     v                     v                     v                     v       */
+    LaneGeometryElementGenerator_DataSet{{-16_m,   1_m},  8_m, 12_m, -6.28_rad, {-16.01_m,   5.00_m}, {-16.00_m,   1.00_m}, {-15.99_m,  -3.00_m}, { -4.01_m,   5.04_m}, { -4.00_m,   1.04_m}, { -3.99_m,  -2.96_m}},
+    LaneGeometryElementGenerator_DataSet{{  7_m,   0_m},  4_m, 12_m, -5.50_rad, {  5.59_m,   1.42_m}, {  7.00_m,   0.00_m}, {  8.41_m,  -1.42_m}, { 14.09_m,   9.88_m}, { 15.50_m,   8.47_m}, { 16.92_m,   7.05_m}},
+    LaneGeometryElementGenerator_DataSet{{ -7_m,  10_m},  3_m, 12_m, -4.71_rad, { -8.50_m,  10.00_m}, { -7.00_m,  10.00_m}, { -5.50_m,  10.00_m}, { -8.53_m,  22.00_m}, { -7.03_m,  22.00_m}, { -5.53_m,  22.00_m}},
+    LaneGeometryElementGenerator_DataSet{{-17_m,  13_m},  7_m, 12_m, -3.93_rad, {-19.48_m,  10.53_m}, {-17.00_m,  13.00_m}, {-14.52_m,  15.47_m}, {-27.94_m,  19.04_m}, {-25.46_m,  21.51_m}, {-22.98_m,  23.98_m}},
+    LaneGeometryElementGenerator_DataSet{{-17_m,   7_m},  9_m, 11_m, -3.14_rad, {-16.99_m,   2.50_m}, {-17.00_m,   7.00_m}, {-17.01_m,  11.50_m}, {-27.99_m,   2.48_m}, {-28.00_m,   6.98_m}, {-28.01_m,  11.48_m}},
+    LaneGeometryElementGenerator_DataSet{{ -1_m,  14_m},  3_m, 11_m, -2.36_rad, {  0.06_m,  12.94_m}, { -1.00_m,  14.00_m}, { -2.06_m,  15.06_m}, { -7.75_m,   5.19_m}, { -8.81_m,   6.25_m}, { -9.86_m,   7.32_m}},
+    LaneGeometryElementGenerator_DataSet{{-15_m,   8_m},  3_m, 11_m, -1.57_rad, {-13.50_m,   8.00_m}, {-15.00_m,   8.00_m}, {-16.50_m,   8.00_m}, {-13.49_m,  -3.00_m}, {-14.99_m,  -3.00_m}, {-16.49_m,  -3.00_m}},
+    LaneGeometryElementGenerator_DataSet{{-15_m,   6_m},  3_m, 11_m, -0.79_rad, {-13.93_m,   7.06_m}, {-15.00_m,   6.00_m}, {-16.07_m,   4.94_m}, { -6.19_m,  -0.76_m}, { -7.26_m,  -1.81_m}, { -8.32_m,  -2.87_m}},
+    LaneGeometryElementGenerator_DataSet{{ 19_m,   3_m}, 10_m, 12_m,  0.00_rad, { 19.00_m,   8.00_m}, { 19.00_m,   3.00_m}, { 19.00_m,  -2.00_m}, { 31.00_m,   8.00_m}, { 31.00_m,   3.00_m}, { 31.00_m,  -2.00_m}},
+    LaneGeometryElementGenerator_DataSet{{-12_m,  -9_m},  6_m, 12_m,  0.79_rad, {-14.13_m,  -6.89_m}, {-12.00_m,  -9.00_m}, { -9.87_m, -11.11_m}, { -5.68_m,   1.64_m}, { -3.55_m,  -0.48_m}, { -1.42_m,  -2.59_m}},
+    LaneGeometryElementGenerator_DataSet{{  5_m, -17_m},  3_m, 10_m,  1.57_rad, {  3.50_m, -17.00_m}, {  5.00_m, -17.00_m}, {  6.50_m, -17.00_m}, {  3.51_m,  -7.00_m}, {  5.01_m,  -7.00_m}, {  6.51_m,  -7.00_m}},
+    LaneGeometryElementGenerator_DataSet{{ 14_m,  -8_m},  9_m, 11_m,  2.36_rad, { 10.83_m, -11.19_m}, { 14.00_m,  -8.00_m}, { 17.17_m,  -4.81_m}, {  3.02_m,  -3.45_m}, {  6.19_m,  -0.25_m}, {  9.36_m,   2.94_m}},
+    LaneGeometryElementGenerator_DataSet{{  1_m,  -2_m},  6_m, 12_m,  3.14_rad, {  1.00_m,  -5.00_m}, {  1.00_m,  -2.00_m}, {  1.00_m,   1.00_m}, {-11.00_m,  -4.98_m}, {-11.00_m,  -1.98_m}, {-11.00_m,   1.02_m}},
+    LaneGeometryElementGenerator_DataSet{{ -3_m,  16_m},  5_m, 10_m,  3.93_rad, { -1.23_m,  14.24_m}, { -3.00_m,  16.00_m}, { -4.77_m,  17.76_m}, { -8.28_m,   7.15_m}, {-10.05_m,   8.91_m}, {-11.82_m,  10.67_m}},
+    LaneGeometryElementGenerator_DataSet{{ 14_m, -20_m},  6_m, 11_m,  4.71_rad, { 17.00_m, -20.01_m}, { 14.00_m, -20.00_m}, { 11.00_m, -19.99_m}, { 16.97_m, -31.01_m}, { 13.97_m, -31.00_m}, { 10.97_m, -30.99_m}},
+    LaneGeometryElementGenerator_DataSet{{ 14_m,   1_m},  9_m, 11_m,   5.5_rad, { 17.17_m,   4.19_m}, { 14.00_m,   1.00_m}, { 10.83_m,  -2.19_m}, { 24.97_m,  -3.57_m}, { 21.80_m,  -6.76_m}, { 18.62_m,  -9.95_m}},
+    LaneGeometryElementGenerator_DataSet{{  5_m,   6_m},  8_m, 11_m,  6.28_rad, {  5.01_m,  10.00_m}, {  5.00_m,   6.00_m}, {  4.99_m,   2.00_m}, { 16.01_m,   9.96_m}, { 16.00_m,   5.96_m}, { 15.99_m,   1.96_m}},
+    LaneGeometryElementGenerator_DataSet{{  5_m,   6_m},  6_m,  0_m,   0.0_rad, {  5.00_m,   9.00_m}, {  5.00_m,   6.00_m}, {  5.00_m,   3.00_m}, {  5.00_m,   9.00_m}, {  5.00_m,   6.00_m}, {  5.00_m,   3.00_m}}
 ));
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/agentAdapter_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/agentAdapter_Tests.cpp
index 37183e0a5e6efaff095e6f65fb827a722ec03e03..ff72d7ec9d7d512b217cd97c0ded2d52164683e5 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/agentAdapter_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/agentAdapter_Tests.cpp
@@ -16,27 +16,26 @@
 #include "fakeWorld.h"
 #include "fakeWorldData.h"
 #include "fakeCallback.h"
-#include "fakeAgentBlueprint.h"
 #include "fakeLocalizer.h"
 #include "Localization.h"
 #include <optional>
 
-using ::testing::Return;
-using ::testing::ReturnRef;
-using ::testing::IsNull;
 using ::testing::_;
+using ::testing::AllOf;
+using ::testing::DoubleEq;
+using ::testing::ElementsAreArray;
 using ::testing::Eq;
 using ::testing::Ge;
+using ::testing::IsNull;
 using ::testing::Le;
 using ::testing::Lt;
-using ::testing::AllOf;
-using ::testing::DoubleEq;
-using ::testing::ElementsAreArray;
+using ::testing::Return;
+using ::testing::ReturnRef;
 
 class AgentAdapterTest
 {
 public:
-explicit AgentAdapterTest(const AgentVehicleType type, OWL::Implementation::MovingObject& obj) :
+explicit AgentAdapterTest(OWL::Implementation::MovingObject& obj, const mantle_api::EntityType type, const mantle_api::VehicleClass classification = mantle_api::VehicleClass::kInvalid) :
         fakeLocalizer(fakeWorldData), fakeWorld(), fakeCallbacks()
 {
     RoadGraph graph = RoadGraph(2);
@@ -47,17 +46,16 @@ explicit AgentAdapterTest(const AgentVehicleType type, OWL::Implementation::Movi
     route.target = 0;
     route.roadGraph = graph;
 
-    spawnParameter.positionX = 0;
-    spawnParameter.positionY = 0;
-    spawnParameter.yawAngle = 0;
-    spawnParameter.velocity = 0;
-    spawnParameter.acceleration = 0;
-    spawnParameter.gear = 1;
-    spawnParameter.route = route;
+    agentBuildInstructions.spawnParameter.position.x = 0_m;
+    agentBuildInstructions.spawnParameter.position.y = 0_m;
+    agentBuildInstructions.spawnParameter.orientation.yaw = 0_rad;
+    agentBuildInstructions.spawnParameter.velocity = 0_mps;
+    agentBuildInstructions.spawnParameter.acceleration = 0_mps_sq;
+    agentBuildInstructions.spawnParameter.gear = 1;
+    agentBuildInstructions.spawnParameter.route = route;
 
     ON_CALL(fakeWorldData, AddMovingObject(321)).WillByDefault(ReturnRef(obj));
-    ON_CALL(fakeAgentBlueprint, GetSpawnParameter()).WillByDefault(ReturnRef(spawnParameter));
-    ON_CALL(fakeAgentBlueprint, GetSensorParameters()).WillByDefault(Return(sensorParameter));
+    agentBuildInstructions.system.sensorParameters = sensorParameter;
     World::Localization::Result localizerResult;
     ON_CALL(fakeLocalizer, Locate(_,_)).WillByDefault(Return(localizerResult));
 
@@ -65,116 +63,135 @@ explicit AgentAdapterTest(const AgentVehicleType type, OWL::Implementation::Movi
 
     switch (type)
     {
-    case AgentVehicleType::Pedestrian:
-        ON_CALL(fakeAgentBlueprint, GetVehicleModelParameters()).WillByDefault(Return(returnPedestrian()));
+    case mantle_api::EntityType::kOther:
+        agentBuildInstructions.entityProperties = returnOther();
         break;
-    case AgentVehicleType::Car:
-        ON_CALL(fakeAgentBlueprint, GetVehicleModelParameters()).WillByDefault(Return(returnCar()));
+    case mantle_api::EntityType::kPedestrian:
+        agentBuildInstructions.entityProperties = returnPedestrian();
         break;
-    case AgentVehicleType::Motorbike:
-        ON_CALL(fakeAgentBlueprint, GetVehicleModelParameters()).WillByDefault(Return(returnMotorbike()));
+    case mantle_api::EntityType::kAnimal:
+        agentBuildInstructions.entityProperties = returnAnimal();
         break;
-    case AgentVehicleType::NONE:
-        ON_CALL(fakeAgentBlueprint, GetVehicleModelParameters()).WillByDefault(Return(returnNONE()));
+    case mantle_api::EntityType::kStatic:
+        agentBuildInstructions.entityProperties = returnStaticObject();
         break;
-    case AgentVehicleType::Undefined:
-        ON_CALL(fakeAgentBlueprint, GetVehicleModelParameters()).WillByDefault(Return(returnUndefined()));
-        break;
-    case AgentVehicleType::Bicycle:
-        ON_CALL(fakeAgentBlueprint, GetVehicleModelParameters()).WillByDefault(Return(returnBicycle()));
-        break;
-    case AgentVehicleType::Truck:
-        ON_CALL(fakeAgentBlueprint, GetVehicleModelParameters()).WillByDefault(Return(returnTruck()));
+    case mantle_api::EntityType::kVehicle:
+        switch(classification)
+        {
+        case mantle_api::VehicleClass::kMedium_car:
+            agentBuildInstructions.entityProperties = returnCar();
+            break;
+        case mantle_api::VehicleClass::kMotorbike:
+            agentBuildInstructions.entityProperties = returnMotorbike();
+            break;
+        case mantle_api::VehicleClass::kBicycle:
+            agentBuildInstructions.entityProperties = returnBicycle();
+            break;
+        case mantle_api::VehicleClass::kHeavy_truck:
+            agentBuildInstructions.entityProperties = returnHeavyTruck();
+            break;
+        }
         break;
     }
 
 
-    agentAdapter->InitParameter(fakeAgentBlueprint);
+    agentAdapter->InitParameter(agentBuildInstructions);
 
 }
 
-    static VehicleModelParameters returnNONE()
+    static std::shared_ptr<mantle_api::EntityProperties> returnOther()
     {
-        VehicleModelParameters params;
-        params.vehicleType = AgentVehicleType::NONE;
-        return params;
+        auto defaultOther = std::make_shared<mantle_api::EntityProperties>();
+        defaultOther->type = mantle_api::EntityType::kOther;
+        return defaultOther;
     }
 
-    static VehicleModelParameters returnUndefined()
+    static std::shared_ptr<mantle_api::VehicleProperties> returnBicycle()
     {
-        VehicleModelParameters params;
-        params.vehicleType = AgentVehicleType::Undefined;
-        return params;
-    }
-
-    static VehicleModelParameters returnBicycle()
-    {
-        VehicleModelParameters params;
+        auto params = std::make_shared<mantle_api::VehicleProperties>();
         params = returnMotorbike();
-        params.vehicleType = AgentVehicleType::Bicycle;
+        params->type = mantle_api::EntityType::kVehicle;
+        params->classification = mantle_api::VehicleClass::kBicycle;
         return params;
     }
 
-    static VehicleModelParameters returnTruck()
+    static std::shared_ptr<mantle_api::VehicleProperties> returnHeavyTruck()
     {
-        VehicleModelParameters params;
+        auto params = std::make_shared<mantle_api::VehicleProperties>();
         params = returnCar();
-        params.vehicleType = AgentVehicleType::Truck;
+        params->type = mantle_api::EntityType::kVehicle;
+        params->classification = mantle_api::VehicleClass::kHeavy_truck;
         return params;
     }
 
-    static VehicleModelParameters returnPedestrian()
+    static std::shared_ptr<mantle_api::EntityProperties> returnPedestrian()
     {
-        VehicleModelParameters defaultPedestrian;
-        defaultPedestrian.vehicleType = AgentVehicleType::Pedestrian;
+        auto defaultPedestrian = std::make_shared<mantle_api::EntityProperties>();
+        defaultPedestrian->type = mantle_api::EntityType::kPedestrian;
         return defaultPedestrian;
     }
 
-    static VehicleModelParameters returnCar()
+    static std::shared_ptr<mantle_api::EntityProperties> returnAnimal()
+    {
+        auto defaultAnimal = std::make_shared<mantle_api::EntityProperties>();
+        defaultAnimal->type = mantle_api::EntityType::kAnimal;
+        return defaultAnimal;
+    }
+
+    static std::shared_ptr<mantle_api::EntityProperties> returnStaticObject()
     {
-        VehicleModelParameters defaultCar;
-        defaultCar.vehicleType = AgentVehicleType::Car;
-        defaultCar.frontAxle.positionX = 0.3;
-        defaultCar.frontAxle.positionZ = 0.1;
-        defaultCar.frontAxle.wheelDiameter = 2.0;
-        defaultCar.frontAxle.trackWidth = 2.0;
-        defaultCar.rearAxle.trackWidth = 2.0;
-        defaultCar.rearAxle.wheelDiameter = 2.0;
-        defaultCar.rearAxle.positionX = -0.3;
-        defaultCar.rearAxle.positionZ = 0.1;
-        defaultCar.boundingBoxCenter.x = defaultCar.boundingBoxCenter.y = 0;
-        defaultCar.boundingBoxCenter.z = 0.2;
-        defaultCar.boundingBoxDimensions.height = 0.5;
-        defaultCar.boundingBoxDimensions.width = 0.5;
-        defaultCar.boundingBoxDimensions.length = 0.5;
-        defaultCar.properties.emplace("SteeringRatio",10.0);
+        auto defaultStaticObject = std::make_shared<mantle_api::EntityProperties>();
+        defaultStaticObject->type = mantle_api::EntityType::kStatic;
+        return defaultStaticObject;
+    }
+
+    static std::shared_ptr<mantle_api::VehicleProperties> returnCar()
+    {
+        auto defaultCar = std::make_shared<mantle_api::VehicleProperties>();
+        defaultCar->type = mantle_api::EntityType::kVehicle;
+        defaultCar->classification = mantle_api::VehicleClass::kMedium_car;
+        defaultCar->front_axle.bb_center_to_axle_center.x = 0.3_m;
+        defaultCar->front_axle.bb_center_to_axle_center.z = 0.1_m;
+        defaultCar->front_axle.wheel_diameter = 2.0_m;
+        defaultCar->front_axle.track_width = 2.0_m;
+        defaultCar->rear_axle.track_width = 2.0_m;
+        defaultCar->rear_axle.wheel_diameter = 2.0_m;
+        defaultCar->rear_axle.bb_center_to_axle_center.x = -0.3_m;
+        defaultCar->rear_axle.bb_center_to_axle_center.z = 0.1_m;
+        defaultCar->bounding_box.geometric_center.x = defaultCar->bounding_box.geometric_center.y = 0_m;
+        defaultCar->bounding_box.geometric_center.z= 0.2_m;
+        defaultCar->bounding_box.dimension.height = 0.5_m;
+        defaultCar->bounding_box.dimension.width = 0.5_m;
+        defaultCar->bounding_box.dimension.length = 0.5_m;
+        defaultCar->properties.emplace("SteeringRatio","10.0");
 
         return defaultCar;
     }
 
-    static VehicleModelParameters returnMotorbike()
+    static std::shared_ptr<mantle_api::VehicleProperties> returnMotorbike()
     {
-        VehicleModelParameters defaultBicycle;
-        defaultBicycle.vehicleType = AgentVehicleType::Motorbike;
-        defaultBicycle.frontAxle.positionX = 0.3;
-        defaultBicycle.frontAxle.positionZ = 0.1;
-        defaultBicycle.rearAxle.positionX = -0.3;
-        defaultBicycle.rearAxle.positionZ = 0.1;
-        defaultBicycle.frontAxle.wheelDiameter = 1.5;
-        defaultBicycle.rearAxle.wheelDiameter = 1.5;
-        defaultBicycle.frontAxle.trackWidth = 2.0;
-        defaultBicycle.rearAxle.trackWidth = 2.0;
-        defaultBicycle.boundingBoxCenter.x = defaultBicycle.boundingBoxCenter.y = 0;
-        defaultBicycle.boundingBoxCenter.z = 0.2;
-        defaultBicycle.boundingBoxDimensions.height = 0.5;
-        defaultBicycle.boundingBoxDimensions.width = 0.25;
-        defaultBicycle.boundingBoxDimensions.length = 0.5;
-        defaultBicycle.properties.emplace("SteeringRatio",5.0);
+        auto defaultBicycle = std::make_shared<mantle_api::VehicleProperties>();
+        defaultBicycle->type = mantle_api::EntityType::kVehicle;
+        defaultBicycle->classification = mantle_api::VehicleClass::kMotorbike;
+        defaultBicycle->front_axle.bb_center_to_axle_center.x = 0.3_m;
+        defaultBicycle->front_axle.bb_center_to_axle_center.z = 0.1_m;
+        defaultBicycle->rear_axle.bb_center_to_axle_center.x = -0.3_m;
+        defaultBicycle->rear_axle.bb_center_to_axle_center.z = 0.1_m;
+        defaultBicycle->front_axle.wheel_diameter = 1.5_m;
+        defaultBicycle->rear_axle.wheel_diameter = 1.5_m;
+        defaultBicycle->front_axle.track_width = 2.0_m;
+        defaultBicycle->rear_axle.track_width = 2.0_m;
+        defaultBicycle->bounding_box.geometric_center.x = defaultBicycle->bounding_box.geometric_center.y = 0_m;
+        defaultBicycle->bounding_box.geometric_center.z = 0.2_m;
+        defaultBicycle->bounding_box.dimension.height = 0.5_m;
+        defaultBicycle->bounding_box.dimension.width = 0.25_m;
+        defaultBicycle->bounding_box.dimension.length = 0.5_m;
+        defaultBicycle->properties.emplace("SteeringRatio","5.0");
 
         return defaultBicycle;
     }
 
-    void SetWheelRotation(double angle, double velocity, double acceleration)
+    void SetWheelRotation(units::angle::radian_t angle, units::velocity::meters_per_second_t velocity, units::acceleration::meters_per_second_squared_t acceleration)
     {
         agentAdapter->SetWheelsRotationRateAndOrientation(angle, velocity, acceleration);
     }
@@ -186,25 +203,24 @@ private:
     WorldInterface *fakeWorld;
     const CallbackInterface *fakeCallbacks;
 
-    const testing::NiceMock<FakeAgentBlueprint> fakeAgentBlueprint;
     const testing::NiceMock<World::Localization::FakeLocalizer> fakeLocalizer;
-    SpawnParameter spawnParameter;
     openpass::sensors::Parameters sensorParameter;
+    AgentBuildInstructions agentBuildInstructions;
 
 };
 
-TEST(AgentAdapter_Test, GenerateCarWheels)
+TEST(DISABLED_AgentAdapter_Test, GenerateCarWheels)
 {
     osi3::MovingObject osi_car;
     osi3::MovingObject* osi_p = &osi_car;
     OWL::Implementation::MovingObject movingObject(&osi_car);
-    AgentAdapterTest cartest (AgentVehicleType::Car, movingObject);
+    AgentAdapterTest cartest (movingObject, mantle_api::EntityType::kVehicle, mantle_api::VehicleClass::kMedium_car);
 
-    VehicleModelParameters input_car = AgentAdapterTest::returnCar();
+    std::shared_ptr<const mantle_api::VehicleProperties> input_car = AgentAdapterTest::returnCar();
 
-    ASSERT_FLOAT_EQ(input_car.frontAxle.positionX - input_car.boundingBoxCenter.x , osi_car.vehicle_attributes().bbcenter_to_front().x());
+    ASSERT_FLOAT_EQ(input_car->front_axle.bb_center_to_axle_center.x.value() - input_car->bounding_box.geometric_center.x.value() , osi_car.vehicle_attributes().bbcenter_to_front().x());
     ASSERT_FLOAT_EQ(0, osi_car.vehicle_attributes().bbcenter_to_front().y());
-    ASSERT_FLOAT_EQ(input_car.frontAxle.positionZ - input_car.boundingBoxCenter.z , osi_car.vehicle_attributes().bbcenter_to_front().z());
+    ASSERT_FLOAT_EQ(input_car->front_axle.bb_center_to_axle_center.z.value() - input_car->bounding_box.geometric_center.z.value() , osi_car.vehicle_attributes().bbcenter_to_front().z());
 
     ASSERT_EQ(osi_car.type(), osi3::MovingObject_Type_TYPE_VEHICLE);
     ASSERT_EQ(osi_car.vehicle_attributes().wheel_data_size(), 4);
@@ -224,81 +240,82 @@ TEST(AgentAdapter_Test, GenerateCarWheels)
     ASSERT_EQ(movingObject.GetWheelData(0,2), std::nullopt);
     ASSERT_EQ(movingObject.GetWheelData(0,2), std::nullopt);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->wheelRadius, input_car.frontAxle.wheelDiameter / 2.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->wheelRadius, input_car.frontAxle.wheelDiameter / 2.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->wheelRadius, input_car.rearAxle.wheelDiameter / 2.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->wheelRadius, input_car.rearAxle.wheelDiameter / 2.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->wheelRadius.value(), input_car->front_axle.wheel_diameter.value() / 2.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->wheelRadius.value(), input_car->front_axle.wheel_diameter.value() / 2.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->wheelRadius.value(), input_car->rear_axle.wheel_diameter.value() / 2.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->wheelRadius.value(), input_car->rear_axle.wheel_diameter.value() / 2.0);
 
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.x, input_car.frontAxle.positionX - input_car.boundingBoxCenter.x);
-    ASSERT_FLOAT_EQ(osi_car.vehicle_attributes().bbcenter_to_front().x(), movingObject.GetWheelData(0,0)->position.x);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->position.x, input_car.frontAxle.positionX - input_car.boundingBoxCenter.x);
-    ASSERT_FLOAT_EQ(osi_car.vehicle_attributes().bbcenter_to_front().x(), movingObject.GetWheelData(0,1)->position.x);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.x.value(), input_car->front_axle.bb_center_to_axle_center.x.value() - input_car->bounding_box.geometric_center.x.value());
+    ASSERT_FLOAT_EQ(osi_car.vehicle_attributes().bbcenter_to_front().x(), movingObject.GetWheelData(0,0)->position.x.value());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->position.x.value(), input_car->front_axle.bb_center_to_axle_center.x.value() - input_car->bounding_box.geometric_center.x.value());
+    ASSERT_FLOAT_EQ(osi_car.vehicle_attributes().bbcenter_to_front().x(), movingObject.GetWheelData(0,1)->position.x.value());
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.x, input_car.rearAxle.positionX - input_car.boundingBoxCenter.x);
-    ASSERT_FLOAT_EQ(osi_car.vehicle_attributes().bbcenter_to_rear().x(), movingObject.GetWheelData(1,0)->position.x);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->position.x, input_car.rearAxle.positionX - input_car.boundingBoxCenter.x);
-    ASSERT_FLOAT_EQ(osi_car.vehicle_attributes().bbcenter_to_rear().x(), movingObject.GetWheelData(1,1)->position.x);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.x.value(), input_car->rear_axle.bb_center_to_axle_center.x.value() - input_car->bounding_box.geometric_center.x.value());
+    ASSERT_FLOAT_EQ(osi_car.vehicle_attributes().bbcenter_to_rear().x(), movingObject.GetWheelData(1,0)->position.x.value());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->position.x.value(), input_car->rear_axle.bb_center_to_axle_center.x.value() - input_car->bounding_box.geometric_center.x.value());
+    ASSERT_FLOAT_EQ(osi_car.vehicle_attributes().bbcenter_to_rear().x(), movingObject.GetWheelData(1,1)->position.x.value());
 
-    ASSERT_GE(movingObject.GetWheelData(0,0)->position.x, 0);
-    ASSERT_GE(movingObject.GetWheelData(0,1)->position.x,0);
-    ASSERT_LE(movingObject.GetWheelData(1,0)->position.x,0);
-    ASSERT_LE(movingObject.GetWheelData(1,1)->position.x,0);
+    ASSERT_GE(movingObject.GetWheelData(0,0)->position.x.value(), 0);
+    ASSERT_GE(movingObject.GetWheelData(0,1)->position.x.value(),0);
+    ASSERT_LE(movingObject.GetWheelData(1,0)->position.x.value(),0);
+    ASSERT_LE(movingObject.GetWheelData(1,1)->position.x.value(),0);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.y, - (input_car.frontAxle.trackWidth / 2.0f - input_car.boundingBoxCenter.y));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->position.y, (input_car.frontAxle.trackWidth / 2.0f - input_car.boundingBoxCenter.y));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.y, - (input_car.frontAxle.trackWidth / 2.0f - input_car.boundingBoxCenter.y));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->position.y, (input_car.frontAxle.trackWidth / 2.0f - input_car.boundingBoxCenter.y));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.y.value(), - (input_car->front_axle.track_width.value() / 2.0f - input_car->bounding_box.geometric_center.y.value()));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->position.y.value(), (input_car->front_axle.track_width.value() / 2.0f - input_car->bounding_box.geometric_center.y.value()));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.y.value(), - (input_car->front_axle.track_width.value() / 2.0f - input_car->bounding_box.geometric_center.y.value()));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->position.y.value(), (input_car->front_axle.track_width.value() / 2.0f - input_car->bounding_box.geometric_center.y.value()));
 
-    ASSERT_LE(movingObject.GetWheelData(0,0)->position.y, 0);
-    ASSERT_GE(movingObject.GetWheelData(0,1)->position.y,0);
-    ASSERT_LE(movingObject.GetWheelData(1,0)->position.y,0);
-    ASSERT_GE(movingObject.GetWheelData(1,1)->position.y,0);
+    ASSERT_LE(movingObject.GetWheelData(0,0)->position.y.value(), 0);
+    ASSERT_GE(movingObject.GetWheelData(0,1)->position.y.value(),0);
+    ASSERT_LE(movingObject.GetWheelData(1,0)->position.y.value(),0);
+    ASSERT_GE(movingObject.GetWheelData(1,1)->position.y.value(),0);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.z, osi_car.vehicle_attributes().bbcenter_to_front().z());
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->position.z, osi_car.vehicle_attributes().bbcenter_to_front().z());
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.z, osi_car.vehicle_attributes().bbcenter_to_rear().z());
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->position.z, osi_car.vehicle_attributes().bbcenter_to_rear().z());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.z.value(), osi_car.vehicle_attributes().bbcenter_to_front().z());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->position.z.value(), osi_car.vehicle_attributes().bbcenter_to_front().z());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.z.value(), osi_car.vehicle_attributes().bbcenter_to_rear().z());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->position.z.value(), osi_car.vehicle_attributes().bbcenter_to_rear().z());
 
-    cartest.SetWheelRotation(0.3, 2.0, 0.41);
+    cartest.SetWheelRotation(0.3_rad, 2.0_mps, 0.41_mps_sq);
 
-    auto rotation_rate_front = 2.0 / (input_car.frontAxle.wheelDiameter / 2.0);
-    auto rotation_rate_rear = 2.0 / (input_car.rearAxle.wheelDiameter / 2.0);
+    auto rotation_rate_front = 2.0 / (input_car->front_axle.wheel_diameter.value() / 2.0);
+    auto rotation_rate_rear = 2.0 / (input_car->rear_axle.wheel_diameter.value() / 2.0);
     auto dTime = (2.0 - 0.0) / 0.41;
+    auto angle = rotation_rate_front * dTime;
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->rotation_rate, rotation_rate_front);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->rotation_rate, rotation_rate_front);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->rotation_rate, rotation_rate_rear);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->rotation_rate, rotation_rate_rear);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->rotation_rate.value(), rotation_rate_front);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->rotation_rate.value(), rotation_rate_front);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->rotation_rate.value(), rotation_rate_rear);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->rotation_rate.value(), rotation_rate_rear);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.pitch, CommonHelper::SetAngleToValidRange(rotation_rate_front * dTime));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->orientation.pitch, CommonHelper::SetAngleToValidRange(rotation_rate_front * dTime));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.pitch, CommonHelper::SetAngleToValidRange(rotation_rate_rear * dTime));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->orientation.pitch, CommonHelper::SetAngleToValidRange(rotation_rate_rear * dTime));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.pitch.value(), CommonHelper::SetAngleToValidRange(units::angle::radian_t{angle}).value());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->orientation.pitch.value(), CommonHelper::SetAngleToValidRange(units::angle::radian_t{angle}).value());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.pitch.value(), CommonHelper::SetAngleToValidRange(units::angle::radian_t{angle}).value());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->orientation.pitch.value(), CommonHelper::SetAngleToValidRange(units::angle::radian_t{angle}).value());
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.roll, 0.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->orientation.roll, 0.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.roll, 0.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->orientation.roll, 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.roll.value(), 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->orientation.roll.value(), 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.roll.value(), 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->orientation.roll.value(), 0.0);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.yaw, 0.3 * input_car.properties.at("SteeringRatio"));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->orientation.yaw, 0.3 * input_car.properties.at("SteeringRatio"));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.yaw, 0.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->orientation.yaw, 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.yaw.value(), 0.3 * std::stod(input_car->properties.at("SteeringRatio")));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,1)->orientation.yaw.value(), 0.3 * std::stod(input_car->properties.at("SteeringRatio")));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.yaw.value(), 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,1)->orientation.yaw.value(), 0.0);
 
 }
 
-TEST(AgentAdapter_Test, GenerateMotorbikeWheels)
+TEST(DISABLED_AgentAdapter_Test, GenerateMotorbikeWheels)
 {
     osi3::MovingObject osi_bike;
     OWL::Implementation::MovingObject movingObject(&osi_bike);
-    AgentAdapterTest biketest(AgentVehicleType::Motorbike, movingObject);
+    AgentAdapterTest biketest(movingObject, mantle_api::EntityType::kVehicle, mantle_api::VehicleClass::kMotorbike);
 
-    VehicleModelParameters input_bike = AgentAdapterTest::returnMotorbike();
+    std::shared_ptr<const mantle_api::VehicleProperties> input_bike = AgentAdapterTest::returnMotorbike();
 
-    ASSERT_FLOAT_EQ(input_bike.frontAxle.positionX - input_bike.boundingBoxCenter.x , osi_bike.vehicle_attributes().bbcenter_to_front().x());
+    ASSERT_FLOAT_EQ(input_bike->front_axle.bb_center_to_axle_center.x.value() - input_bike->bounding_box.geometric_center.x.value() , osi_bike.vehicle_attributes().bbcenter_to_front().x());
     ASSERT_FLOAT_EQ(0, osi_bike.vehicle_attributes().bbcenter_to_front().y());
-    ASSERT_FLOAT_EQ(input_bike.frontAxle.positionZ - input_bike.boundingBoxCenter.z, osi_bike.vehicle_attributes().bbcenter_to_front().z());
+    ASSERT_FLOAT_EQ(input_bike->front_axle.bb_center_to_axle_center.z.value() - input_bike->bounding_box.geometric_center.z.value(), osi_bike.vehicle_attributes().bbcenter_to_front().z());
 
     ASSERT_EQ(osi_bike.type(), osi3::MovingObject_Type_TYPE_VEHICLE);
     ASSERT_EQ(osi_bike.vehicle_attributes().wheel_data_size(), 2);
@@ -312,47 +329,46 @@ TEST(AgentAdapter_Test, GenerateMotorbikeWheels)
     ASSERT_EQ(movingObject.GetWheelData(1,0)->index, 0);
     ASSERT_EQ(movingObject.GetWheelData(1,0)->axle, 1);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->wheelRadius, input_bike.frontAxle.wheelDiameter / 2.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->wheelRadius, input_bike.rearAxle.wheelDiameter / 2.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->wheelRadius.value(), input_bike->front_axle.wheel_diameter.value() / 2.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->wheelRadius.value(), input_bike->rear_axle.wheel_diameter.value() / 2.0);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.x, input_bike.frontAxle.positionX - input_bike.boundingBoxCenter.x);
-    ASSERT_FLOAT_EQ(osi_bike.vehicle_attributes().bbcenter_to_front().x(), movingObject.GetWheelData(0,0)->position.x);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.x.value(), input_bike->front_axle.bb_center_to_axle_center.x.value() - input_bike->bounding_box.geometric_center.x.value());
+    ASSERT_FLOAT_EQ(osi_bike.vehicle_attributes().bbcenter_to_front().x(), movingObject.GetWheelData(0,0)->position.x.value());
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.x, input_bike.rearAxle.positionX - input_bike.boundingBoxCenter.x);
-    ASSERT_FLOAT_EQ(osi_bike.vehicle_attributes().bbcenter_to_rear().x(), movingObject.GetWheelData(0,1)->position.x);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.x.value(), input_bike->rear_axle.bb_center_to_axle_center.x.value() - input_bike->bounding_box.geometric_center.x.value());
+    ASSERT_FLOAT_EQ(osi_bike.vehicle_attributes().bbcenter_to_rear().x(), movingObject.GetWheelData(0,1)->position.x.value());
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.y, 0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.y, 0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.y.value(), 0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.y.value(), 0);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.z, osi_bike.vehicle_attributes().bbcenter_to_front().z());
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.z, osi_bike.vehicle_attributes().bbcenter_to_rear().z());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->position.z.value(), osi_bike.vehicle_attributes().bbcenter_to_front().z());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->position.z.value(), osi_bike.vehicle_attributes().bbcenter_to_rear().z());
 
-    biketest.SetWheelRotation(0.3, 2.0, 0.41);
+    biketest.SetWheelRotation(0.3_rad, 2.0_mps, 0.41_mps_sq);
 
-    auto rotation_rate_front = 2.0 / (input_bike.frontAxle.wheelDiameter / 2.0);
-    auto rotation_rate_rear = 2.0 / (input_bike.rearAxle.wheelDiameter / 2.0);
+    auto rotation_rate_front = 2.0 / (input_bike->front_axle.wheel_diameter.value() / 2.0);
+    auto rotation_rate_rear = 2.0 / (input_bike->rear_axle.wheel_diameter.value() / 2.0);
     auto dTime = (2.0 - 0.0) / 0.41;
+    auto angle = rotation_rate_front * dTime;
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->rotation_rate, rotation_rate_front);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->rotation_rate, rotation_rate_rear);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->rotation_rate.value(), rotation_rate_front);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->rotation_rate.value(), rotation_rate_rear);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.pitch, CommonHelper::SetAngleToValidRange(rotation_rate_front * dTime));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.pitch, CommonHelper::SetAngleToValidRange(rotation_rate_front * dTime));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.pitch.value(), CommonHelper::SetAngleToValidRange(units::angle::radian_t{angle}).value());
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.pitch.value(), CommonHelper::SetAngleToValidRange(units::angle::radian_t{angle}).value());
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.roll, 0.0);
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.roll, 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.roll.value(), 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.roll.value(), 0.0);
 
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.yaw, 0.3 * input_bike.properties.at("SteeringRatio"));
-    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.yaw, 0.0);
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(0,0)->orientation.yaw.value(), 0.3 * std::stod(input_bike->properties.at("SteeringRatio")));
+    ASSERT_FLOAT_EQ(movingObject.GetWheelData(1,0)->orientation.yaw.value(), 0.0);
 }
 
 TEST(AgentAdapter_Test, GeneratePedestrianWheels)
 {
     osi3::MovingObject osi_person;
     OWL::Implementation::MovingObject movingObject(&osi_person);
-    AgentAdapterTest pedestrianTest(AgentVehicleType::Pedestrian, movingObject);
-
-    VehicleModelParameters input_car = AgentAdapterTest::returnCar();
+    AgentAdapterTest pedestrianTest(movingObject, mantle_api::EntityType::kPedestrian);
 
     ASSERT_EQ(osi_person.type(), osi3::MovingObject_Type_TYPE_PEDESTRIAN);
     ASSERT_EQ(osi_person.vehicle_attributes().wheel_data_size(), 0);
@@ -368,66 +384,66 @@ TEST(AgentAdapter_Test, SetWheelData)
 
 TEST(MovingObject_Tests, SetAndGetReferencePointPosition_ReturnsCorrectPosition)
 {
-    OWL::Primitive::AbsPosition position;
-    position.x = 100.0;
-    position.y = 150.0;
-    position.z = 10.0;
+    mantle_api::Vec3<units::length::meter_t> position;
+    position.x = 100.0_m;
+    position.y = 150.0_m;
+    position.z = 10.0_m;
     osi3::MovingObject osiObject;
     OWL::Implementation::MovingObject movingObject(&osiObject);
-    movingObject.SetLength(8.0);
-    movingObject.SetBoundingBoxCenterToRear(7.0, 0.0, 0.0);
-    movingObject.SetYaw(0.5);
+    movingObject.SetLength(8.0_m);
+    movingObject.SetBoundingBoxCenterToRear(7.0_m, 0.0_m, 0.0_m);
+    movingObject.SetYaw(0.5_rad);
     movingObject.SetReferencePointPosition(position);
-    OWL::Primitive::AbsPosition resultPosition = movingObject.GetReferencePointPosition();
-    ASSERT_THAT(resultPosition.x, DoubleEq(position.x));
-    ASSERT_THAT(resultPosition.y, DoubleEq(position.y));
-    ASSERT_THAT(resultPosition.z, DoubleEq(position.z));
+    const auto resultPosition = movingObject.GetReferencePointPosition();
+    ASSERT_THAT(resultPosition.x.value(), DoubleEq(position.x.value()));
+    ASSERT_THAT(resultPosition.y.value(), DoubleEq(position.y.value()));
+    ASSERT_THAT(resultPosition.z.value(), DoubleEq(position.z.value()));
 }
 
 TEST(MovingObject_Tests, SetAndGetReferencePointPositionWithYawChangeInBetween_ReturnsCorrectPosition)
 {
-    OWL::Primitive::AbsPosition position;
-    position.x = 100.0;
-    position.y = 150.0;
-    position.z = 10.0;
+    mantle_api::Vec3<units::length::meter_t> position;
+    position.x = 100.0_m;
+    position.y = 150.0_m;
+    position.z = 10.0_m;
     osi3::MovingObject osiObject;
     OWL::Implementation::MovingObject movingObject(&osiObject);
-    movingObject.SetLength(8.0);
-    movingObject.SetBoundingBoxCenterToRear(7.0, 0.0, 0.0);
-    movingObject.SetYaw(0.5);
+    movingObject.SetLength(8.0_m);
+    movingObject.SetBoundingBoxCenterToRear(7.0_m, 0.0_m, 0.0_m);
+    movingObject.SetYaw(0.5_rad);
     movingObject.SetReferencePointPosition(position);
-    movingObject.SetYaw(0.7);
-    OWL::Primitive::AbsPosition resultPosition = movingObject.GetReferencePointPosition();
-    ASSERT_THAT(resultPosition.x, DoubleEq(position.x));
-    ASSERT_THAT(resultPosition.y, DoubleEq(position.y));
-    ASSERT_THAT(resultPosition.z, DoubleEq(position.z));
+    movingObject.SetYaw(0.7_rad);
+    auto resultPosition = movingObject.GetReferencePointPosition();
+    ASSERT_THAT(resultPosition.x.value(), DoubleEq(position.x.value()));
+    ASSERT_THAT(resultPosition.y.value(), DoubleEq(position.y.value()));
+    ASSERT_THAT(resultPosition.z.value(), DoubleEq(position.z.value()));
 }
 
 TEST(MovingObject_Tests, SetReferencePointPosition_SetsCorrectPositionOnOSIObject)
 {
-    OWL::Primitive::AbsPosition position;
-    position.x = 100.0;
-    position.y = 150.0;
-    position.z = 10.0;
+    mantle_api::Vec3<units::length::meter_t> position;
+    position.x = 100.0_m;
+    position.y = 150.0_m;
+    position.z = 10.0_m;
     osi3::MovingObject osiObject;
     OWL::Implementation::MovingObject movingObject(&osiObject);
-    movingObject.SetLength(8.0);
-    movingObject.SetBoundingBoxCenterToRear(-2.0, 0.0, 0.0);
-    movingObject.SetYaw(M_PI * 0.25);
+    movingObject.SetLength(8.0_m);
+    movingObject.SetBoundingBoxCenterToRear(-2.0_m, 0.0_m, 0.0_m);
+    movingObject.SetYaw(M_PI * 0.25_rad);
     movingObject.SetReferencePointPosition(position);
     auto resultPosition = osiObject.base().position();
-    ASSERT_THAT(resultPosition.x(), DoubleEq(position.x + std::sqrt(2)));
-    ASSERT_THAT(resultPosition.y(), DoubleEq(position.y + std::sqrt(2)));
-    ASSERT_THAT(resultPosition.z(), DoubleEq(position.z));
+    ASSERT_THAT(resultPosition.x(), DoubleEq(position.x.value() + std::sqrt(2)));
+    ASSERT_THAT(resultPosition.y(), DoubleEq(position.y.value() + std::sqrt(2)));
+    ASSERT_THAT(resultPosition.z(), DoubleEq(position.z.value()));
 }
 
 TEST(MovingObject_Tests, SetWheelsRotationRateAndOrientation)
 {
-    auto wheelDiameter = 1.0;
+    units::length::meter_t wheelDiameter = 1.0_m;
 
     osi3::MovingObject osiObject;
     OWL::Implementation::MovingObject movingObject(&osiObject);
-    movingObject.SetType(AgentVehicleType::Car);
+    movingObject.SetType(mantle_api::EntityType::kVehicle);
 
     OWL::WheelData wheeldata {};
     wheeldata.wheelRadius = wheelDiameter / 2.0;
@@ -444,8 +460,8 @@ TEST(MovingObject_Tests, SetWheelsRotationRateAndOrientation)
     wheeldata.axle = 1;
     movingObject.AddWheel(wheeldata);
 
-    movingObject.SetWheelsRotationRateAndOrientation(0.1, wheelDiameter / 2.0, wheelDiameter / 2.0, 2.0);
-    movingObject.SetFrontAxleSteeringYaw(0.4);
+    movingObject.SetWheelsRotationRateAndOrientation(0.1_mps, wheelDiameter / 2.0, wheelDiameter / 2.0, 2.0_s);
+    movingObject.SetFrontAxleSteeringYaw(0.4_rad);
 
     auto rotationrate = 0.1 / (wheelDiameter / 2.0);
 
@@ -454,25 +470,25 @@ TEST(MovingObject_Tests, SetWheelsRotationRateAndOrientation)
     std::optional<const OWL::WheelData> RearWheel = movingObject.GetWheelData(1,0);
     std::optional<const OWL::WheelData> RearWheel2 = movingObject.GetWheelData(1,1);
 
-    ASSERT_FLOAT_EQ(FrontWheel.value().orientation.yaw, 0.4);
-    ASSERT_FLOAT_EQ(RearWheel.value().orientation.yaw, 0.0);
-    ASSERT_FLOAT_EQ(FrontWheel2.value().orientation.yaw, 0.4);
-    ASSERT_FLOAT_EQ(RearWheel2.value().orientation.yaw, 0.0);
-
-    ASSERT_FLOAT_EQ(FrontWheel.value().orientation.pitch, 0.4);
-    ASSERT_FLOAT_EQ(RearWheel.value().orientation.pitch, 0.4);
-    ASSERT_FLOAT_EQ(FrontWheel2.value().orientation.pitch, 0.4);
-    ASSERT_FLOAT_EQ(RearWheel2.value().orientation.pitch, 0.4);
-
-    ASSERT_FLOAT_EQ(FrontWheel.value().orientation.roll, 0.0);
-    ASSERT_FLOAT_EQ(RearWheel.value().orientation.roll, 0.0);
-    ASSERT_FLOAT_EQ(FrontWheel2.value().orientation.roll, 0.0);
-    ASSERT_FLOAT_EQ(RearWheel2.value().orientation.roll, 0.0);
-
-    ASSERT_FLOAT_EQ(FrontWheel.value().rotation_rate, rotationrate);
-    ASSERT_FLOAT_EQ(RearWheel.value().rotation_rate, rotationrate);
-    ASSERT_FLOAT_EQ(FrontWheel2.value().rotation_rate, rotationrate);
-    ASSERT_FLOAT_EQ(RearWheel2.value().rotation_rate, rotationrate);
+    ASSERT_FLOAT_EQ(FrontWheel.value().orientation.yaw.value(), 0.4);
+    ASSERT_FLOAT_EQ(RearWheel.value().orientation.yaw.value(), 0.0);
+    ASSERT_FLOAT_EQ(FrontWheel2.value().orientation.yaw.value(), 0.4);
+    ASSERT_FLOAT_EQ(RearWheel2.value().orientation.yaw.value(), 0.0);
+
+    ASSERT_FLOAT_EQ(FrontWheel.value().orientation.pitch.value(), 0.4);
+    ASSERT_FLOAT_EQ(RearWheel.value().orientation.pitch.value(), 0.4);
+    ASSERT_FLOAT_EQ(FrontWheel2.value().orientation.pitch.value(), 0.4);
+    ASSERT_FLOAT_EQ(RearWheel2.value().orientation.pitch.value(), 0.4);
+
+    ASSERT_FLOAT_EQ(FrontWheel.value().orientation.roll.value(), 0.0);
+    ASSERT_FLOAT_EQ(RearWheel.value().orientation.roll.value(), 0.0);
+    ASSERT_FLOAT_EQ(FrontWheel2.value().orientation.roll.value(), 0.0);
+    ASSERT_FLOAT_EQ(RearWheel2.value().orientation.roll.value(), 0.0);
+
+    ASSERT_FLOAT_EQ(FrontWheel.value().rotation_rate.value(), rotationrate.value());
+    ASSERT_FLOAT_EQ(RearWheel.value().rotation_rate.value(), rotationrate.value());
+    ASSERT_FLOAT_EQ(FrontWheel2.value().rotation_rate.value(), rotationrate.value());
+    ASSERT_FLOAT_EQ(RearWheel2.value().rotation_rate.value(), rotationrate.value());
 }
 
 TEST(MovingObject_Tests, SetAgentType_MapsCorrectOSIType)
@@ -480,72 +496,74 @@ TEST(MovingObject_Tests, SetAgentType_MapsCorrectOSIType)
     osi3::MovingObject osiObject;
     OWL::Implementation::MovingObject movingObject(&osiObject);
 
-    const std::vector<std::pair<AgentVehicleType, osi3::MovingObject_VehicleClassification_Type>> expectedVehicleTypes = 
-    {{AgentVehicleType::Car, osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_MEDIUM_CAR},
-     {AgentVehicleType::Motorbike, osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_MOTORBIKE},
-     {AgentVehicleType::Bicycle, osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_BICYCLE},
-     {AgentVehicleType::Truck, osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_HEAVY_TRUCK}};
+    const std::vector<std::pair<mantle_api::VehicleClass, osi3::MovingObject_VehicleClassification_Type>> expectedVehicleTypes =
+        {{mantle_api::VehicleClass::kMedium_car, osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_MEDIUM_CAR},
+         {mantle_api::VehicleClass::kMotorbike, osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_MOTORBIKE},
+         {mantle_api::VehicleClass::kBicycle, osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_BICYCLE},
+         {mantle_api::VehicleClass::kHeavy_truck, osi3::MovingObject_VehicleClassification_Type::MovingObject_VehicleClassification_Type_TYPE_HEAVY_TRUCK}};
 
-    for (const auto & [agentVehicleType, expectedOsiVehicleType] : expectedVehicleTypes)
+    for (const auto &[agentVehicleType, expectedOsiVehicleType] : expectedVehicleTypes)
     {
-        movingObject.SetType(agentVehicleType);
+        movingObject.SetType(mantle_api::EntityType::kVehicle);
+        movingObject.SetVehicleClassification(agentVehicleType);
 
         ASSERT_THAT(osiObject.type(), osi3::MovingObject_Type::MovingObject_Type_TYPE_VEHICLE);
         ASSERT_THAT(osiObject.vehicle_classification().type(), expectedOsiVehicleType);
     }
 
-    movingObject.SetType(AgentVehicleType::Pedestrian);
+    movingObject.SetType(mantle_api::EntityType::kPedestrian);
     ASSERT_THAT(osiObject.type(), osi3::MovingObject_Type::MovingObject_Type_TYPE_PEDESTRIAN);
 }
 
 struct CalculateBoundingBoxData
 {
-    double yaw;
-    double roll;
-    std::vector<std::pair<double,double>> expectedResult;
+    units::angle::radian_t yaw;
+    units::angle::radian_t roll;
+    std::vector<std::pair<double, double>> expectedResult;
 };
 
 class CalculateBoundingBox_Tests : public testing::Test,
-        public ::testing::WithParamInterface<CalculateBoundingBoxData>
+                                   public ::testing::WithParamInterface<CalculateBoundingBoxData>
 {
 };
 
 class TestWorldObject : public WorldObjectAdapter
 {
 public:
-    TestWorldObject (OWL::Interfaces::WorldObject& baseTrafficObject) :
+    TestWorldObject(OWL::Interfaces::WorldObject &baseTrafficObject) :
         WorldObjectAdapter(baseTrafficObject)
-    {}
+    {
+    }
 
-    virtual double GetLaneRemainder(const std::string& roadId, Side) const{};
-    virtual ObjectTypeOSI GetType() const {}
+    virtual units::length::meter_t GetLaneRemainder(const std::string &roadId, Side) const {};
+    virtual ObjectTypeOSI GetType() const {};
     virtual const RoadIntervals &GetTouchedRoads() const
     {
-    }
-    virtual Common::Vector2d GetAbsolutePosition(const ObjectPoint& objectPoint) const {return {0,0};}
+    };
+    virtual Common::Vector2d<units::length::meter_t> GetAbsolutePosition(const ObjectPoint& objectPoint) const {return {0_m,0_m};}
     virtual const GlobalRoadPositions& GetRoadPosition(const ObjectPoint& point) const {return {};}
-    virtual Common::Vector2d GetVelocity(ObjectPoint point) const {return {0,0};}
-    virtual Common::Vector2d GetAcceleration(ObjectPoint point) const {return {0,0};}
+    virtual Common::Vector2d<units::velocity::meters_per_second_t> GetVelocity(ObjectPoint point) const {return {0_mps,0_mps};}
+    virtual Common::Vector2d<units::acceleration::meters_per_second_squared_t> GetAcceleration(ObjectPoint point) const {return {0_mps_sq,0_mps_sq};}
     virtual bool Locate() {return false;}
     virtual void Unlocate() {};
 };
 
 TEST_P(CalculateBoundingBox_Tests, CalculateBoundingBox_ReturnCorrectPoints)
 {
-    const auto& data = GetParam();
+    const auto &data = GetParam();
     OWL::Fakes::MovingObject movingObject;
-    OWL::Primitive::AbsPosition position{10, 20, 0};
+    mantle_api::Vec3<units::length::meter_t> position{10_m, 20_m, 0_m};
     ON_CALL(movingObject, GetReferencePointPosition()).WillByDefault(Return(position));
-    OWL::Primitive::Dimension dimension{6.0, 2.0, 1.6};
+    mantle_api::Dimension3 dimension{6.0_m, 2.0_m, 1.6_m};
     ON_CALL(movingObject, GetDimension()).WillByDefault(Return(dimension));
-    OWL::Primitive::AbsOrientation orientation{data.yaw, 0, data.roll};
+    mantle_api::Orientation3<units::angle::radian_t> orientation{data.yaw, 0_rad, data.roll};
     ON_CALL(movingObject, GetAbsOrientation()).WillByDefault(Return(orientation));
 
     TestWorldObject object(movingObject);
 
     auto result = object.GetBoundingBox2D();
 
-    std::vector<std::pair<double,double>> resultPoints;
+    std::vector<std::pair<double, double>> resultPoints;
     for (const point_t point : result.outer())
     {
         resultPoints.emplace_back(bg::get<0>(point), bg::get<1>(point));
@@ -556,10 +574,9 @@ TEST_P(CalculateBoundingBox_Tests, CalculateBoundingBox_ReturnCorrectPoints)
 }
 
 INSTANTIATE_TEST_SUITE_P(BoundingBoxTest, CalculateBoundingBox_Tests,
-                        testing::Values(
-//!                      yaw     roll   expectedResult
-CalculateBoundingBoxData{0.0,     0.0, {{7.0, 19.0},{7.0, 21.0}, {13.0, 21.0}, {13.0, 19.0}}},
-CalculateBoundingBoxData{M_PI_2,  0.0, {{11.0, 17.0},{9.0, 17.0}, {9.0, 23.0}, {11.0, 23.0}}},
-CalculateBoundingBoxData{0.0,  M_PI_4, {{7.0, 20 - 2.6*M_SQRT1_2},{7.0, 20.0 + M_SQRT1_2}, {13.0, 20.0  + M_SQRT1_2}, {13.0, 20.0 - 2.6*M_SQRT1_2}}},
-CalculateBoundingBoxData{0.0, -M_PI_4, {{7.0, 20 - M_SQRT1_2},{7.0, 20.0 + 2.6*M_SQRT1_2}, {13.0, 20.0  + 2.6*M_SQRT1_2}, {13.0, 20.0 - M_SQRT1_2}}}
-));
+                         testing::Values(
+                             //!                      yaw     roll   expectedResult
+                             CalculateBoundingBoxData{0.0_rad, 0.0_rad, {{7.0, 19.0}, {7.0, 21.0}, {13.0, 21.0}, {13.0, 19.0}}},
+                             CalculateBoundingBoxData{units::angle::radian_t(M_PI_2), 0.0_rad, {{11.0, 17.0}, {9.0, 17.0}, {9.0, 23.0}, {11.0, 23.0}}},
+                             CalculateBoundingBoxData{0.0_rad, units::angle::radian_t(M_PI_4), {{7.0, 20 - 2.6 * M_SQRT1_2}, {7.0, 20.0 + M_SQRT1_2}, {13.0, 20.0 + M_SQRT1_2}, {13.0, 20.0 - 2.6 * M_SQRT1_2}}},
+                             CalculateBoundingBoxData{0.0_rad, units::angle::radian_t(-M_PI_4), {{7.0, 20 - M_SQRT1_2}, {7.0, 20.0 + 2.6 * M_SQRT1_2}, {13.0, 20.0 + 2.6 * M_SQRT1_2}, {13.0, 20.0 - M_SQRT1_2}}}));
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/datatypes_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/datatypes_Tests.cpp
index 6e7c69f6d90c9d4b3f9d2a9814fcca32974bc32b..beaf7560e4b36b373412468a98607c0f6c0b772f 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/datatypes_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/datatypes_Tests.cpp
@@ -29,6 +29,8 @@ using ::testing::SizeIs;
 using ::testing::ElementsAre;
 using ::testing::NiceMock;
 
+using namespace units::literals;
+
 TEST(TrafficSigns, SetSpecificationWithUnsupportedMainType_ReturnsFalse)
 {
     FakeRoadSignal roadSignal;
@@ -52,7 +54,7 @@ TEST(TrafficSigns, SetSpecificationTypeOnly)
 
     ASSERT_THAT(trafficSign.SetSpecification(&roadSignal, position), Eq(true));
 
-    const auto specification = trafficSign.GetSpecification(5);
+    const auto specification = trafficSign.GetSpecification(5_m);
 
     ASSERT_THAT(specification.type, Eq(CommonTrafficSign::Type::HighWayExit));
     ASSERT_THAT(osiSign.main_sign().classification().type(), Eq(osi3::TrafficSign_MainSign_Classification_Type::TrafficSign_MainSign_Classification_Type_TYPE_HIGHWAY_EXIT));
@@ -70,7 +72,7 @@ TEST(TrafficSigns, SetSpecificationSubtypeDefinesValue)
 
     ASSERT_THAT(trafficSign.SetSpecification(&roadSignal, position), Eq(true));
 
-    const auto specification = trafficSign.GetSpecification(5);
+    const auto specification = trafficSign.GetSpecification(5_m);
 
     ASSERT_THAT(specification.type, Eq(CommonTrafficSign::Type::HighwayExitPole));
     ASSERT_THAT(specification.value, Eq(200.0));
@@ -90,7 +92,7 @@ TEST(TrafficSigns, SetSpecificationSubtypeIsValue)
 
     ASSERT_THAT(trafficSign.SetSpecification(&roadSignal, position), Eq(true));
 
-    const auto specification = trafficSign.GetSpecification(5);
+    const auto specification = trafficSign.GetSpecification(5_m);
 
     ASSERT_THAT(specification.type, Eq(CommonTrafficSign::Type::EndOfMaximumSpeedLimit));
     ASSERT_THAT(specification.value, DoubleNear(80.0 / 3.6, 1e-3));
@@ -110,7 +112,7 @@ TEST(TrafficSigns, SetSpecificationWithText)
 
     ASSERT_THAT(trafficSign.SetSpecification(&roadSignal, position), Eq(true));
 
-    const auto specification = trafficSign.GetSpecification(5);
+    const auto specification = trafficSign.GetSpecification(5_m);
 
     ASSERT_THAT(specification.type, Eq(CommonTrafficSign::Type::TownBegin));
     ASSERT_THAT(specification.text, Eq("SomeText"));
@@ -133,7 +135,7 @@ TEST(TrafficSigns, SetSpecificationWithSupplementarySign)
     ASSERT_THAT(trafficSign.SetSpecification(&mainSignal, position), Eq(true));
 
     trafficSign.AddSupplementarySign(&supplementarySignal, position);
-    const auto specification = trafficSign.GetSpecification(5);
+    const auto specification = trafficSign.GetSpecification(5_m);
 
     ASSERT_THAT(specification.type, Eq(CommonTrafficSign::Type::OvertakingBanBegin));
     ASSERT_THAT(specification.supplementarySigns.size(), Eq(1));
@@ -148,10 +150,10 @@ TEST(TrafficSigns, SetSpecification_SetsCorrectBaseStationary)
 {
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("333"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(5.0));
-    ON_CALL(roadSignal, GetZOffset()).WillByDefault(Return(3.0));
-    Position position{10, 11, -1.5, 0};
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(5.0_m));
+    ON_CALL(roadSignal, GetZOffset()).WillByDefault(Return(3.0_m));
+    Position position{10_m, 11_m, -1.5_rad, 0_i_m};
 
     osi3::TrafficSign osiSign;
     OWL::Implementation::TrafficSign trafficSign(&osiSign);
@@ -173,10 +175,10 @@ TEST(TrafficSigns_GetSpecification, GivenSignWithoutSupplementarySigns_ReturnsCo
 
     OWL::Implementation::TrafficSign sign{&osiSign};
 
-    const auto spec = sign.GetSpecification(1.1);
+    const auto spec = sign.GetSpecification(1.1_m);
 
     ASSERT_THAT(spec.value, DoubleEq(5.0));
-    ASSERT_THAT(spec.relativeDistance, DoubleEq(1.1));
+    ASSERT_THAT(spec.relativeDistance.value(), DoubleEq(1.1));
     ASSERT_THAT(spec.supplementarySigns, SizeIs(0));
 }
 
@@ -193,16 +195,16 @@ TEST(TrafficSigns_GetSpecification, GivenSignWithOneSupplementarySign_ReturnsCor
 
     OWL::Implementation::TrafficSign sign{&osiSign};
 
-    const auto spec = sign.GetSpecification(1.1);
+    const auto spec = sign.GetSpecification(1.1_m);
 
     ASSERT_THAT(spec.value, DoubleEq(6.0));
-    ASSERT_THAT(spec.relativeDistance, DoubleEq(1.1));
+    ASSERT_THAT(spec.relativeDistance.value(), DoubleEq(1.1));
     ASSERT_THAT(spec.supplementarySigns, SizeIs(1));
 
     auto supplementary = spec.supplementarySigns.begin();
 
     EXPECT_THAT(supplementary->type, Eq(CommonTrafficSign::Type::DistanceIndication));
-    ASSERT_THAT(supplementary->relativeDistance, DoubleEq(1.1));
+    ASSERT_THAT(supplementary->relativeDistance.value(), DoubleEq(1.1));
     EXPECT_THAT(supplementary->value, Eq(7.0));
 }
 
@@ -222,20 +224,20 @@ TEST(TrafficSigns_GetSpecification, GivenSignWithTwoSupplementarySigns_ReturnsCo
 
     OWL::Implementation::TrafficSign sign{&osiSign};
 
-    const auto spec = sign.GetSpecification(1.1);
+    const auto spec = sign.GetSpecification(1.1_m);
 
     ASSERT_THAT(spec.value, DoubleEq(8.0));
-    ASSERT_THAT(spec.relativeDistance, DoubleEq(1.1));
+    ASSERT_THAT(spec.relativeDistance.value(), DoubleEq(1.1));
     ASSERT_THAT(spec.supplementarySigns, SizeIs(2));
 
     auto supplementary1 = spec.supplementarySigns.begin();
     auto supplementary2 = std::next(supplementary1);
 
     EXPECT_THAT(supplementary1->type, Eq(CommonTrafficSign::Type::DistanceIndication));
-    ASSERT_THAT(supplementary1->relativeDistance, DoubleEq(1.1));
+    ASSERT_THAT(supplementary1->relativeDistance.value(), DoubleEq(1.1));
     EXPECT_THAT(supplementary1->value, Eq(9.0));
     EXPECT_THAT(supplementary2->type, Eq(CommonTrafficSign::Type::DistanceIndication));
-    ASSERT_THAT(supplementary2->relativeDistance, DoubleEq(1.1));
+    ASSERT_THAT(supplementary2->relativeDistance.value(), DoubleEq(1.1));
     EXPECT_THAT(supplementary2->value, Eq(10.0));
 }
 
@@ -262,7 +264,7 @@ TEST(RoadMarking, SetSpecificationTypeOnly)
 
     ASSERT_THAT(roadMarking.SetSpecification(&roadSignal, position), Eq(true));
 
-    const auto specification = roadMarking.GetSpecification(5);
+    const auto specification = roadMarking.GetSpecification(5_m);
 
     ASSERT_THAT(specification.type, Eq(CommonTrafficSign::Type::Stop));
     ASSERT_THAT(osiMarking.classification().type(), Eq(osi3::RoadMarking_Classification_Type::RoadMarking_Classification_Type_TYPE_SYMBOLIC_TRAFFIC_SIGN));
@@ -273,8 +275,8 @@ TEST(RoadMarking, SetSpecification_SetsCorrectBaseStationary)
 {
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("294"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0));
-    Position position{10, 11, -1.5, 0};
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0_m));
+    Position position{10_m, 11_m, -1.5_rad, 0_i_m};
 
     osi3::RoadMarking osiMarking;
     OWL::Implementation::RoadMarking roadMarking(&osiMarking);
@@ -301,18 +303,18 @@ TEST(LaneAssignmentCollector, GetDownstream_ReturnObjectsInCorrectOrder)
     OWL::Fakes::MovingObject object1;
     OWL::Fakes::MovingObject object2;
     OWL::Fakes::MovingObject object3;
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,15,0,0},
-                              GlobalRoadPosition{"",0,12,0,0},
-                              GlobalRoadPosition{"",0,12,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,12,0,0},
-                              GlobalRoadPosition{"",0,17,0,0},
-                              GlobalRoadPosition{"",0,15,0,0},
-                              GlobalRoadPosition{"",0,15,0,0}};
-    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,11,0,0},
-                              GlobalRoadPosition{"",0,20,0,0},
-                              GlobalRoadPosition{"",0,15,0,0},
-                              GlobalRoadPosition{"",0,15,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,12_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,12_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,12_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,17_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,11_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,20_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad}};
     laneAssignmentCollector.Insert(overlap1, &object1);
     laneAssignmentCollector.Insert(overlap2, &object2);
     laneAssignmentCollector.Insert(overlap3, &object3);
@@ -330,18 +332,18 @@ TEST(LaneAssignmentCollector, GetUpstream_ReturnObjectsInCorrectOrder)
     OWL::Fakes::MovingObject object1;
     OWL::Fakes::MovingObject object2;
     OWL::Fakes::MovingObject object3;
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,15,0,0},
-                              GlobalRoadPosition{"",0,12,0,0},
-                              GlobalRoadPosition{"",0,12,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,12,0,0},
-                              GlobalRoadPosition{"",0,17,0,0},
-                              GlobalRoadPosition{"",0,15,0,0},
-                              GlobalRoadPosition{"",0,15,0,0}};
-    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,11,0,0},
-                              GlobalRoadPosition{"",0,20,0,0},
-                              GlobalRoadPosition{"",0,15,0,0},
-                              GlobalRoadPosition{"",0,15,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,12_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,12_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,12_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,17_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,11_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,20_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad}};
     laneAssignmentCollector.Insert(overlap1, &object1);
     laneAssignmentCollector.Insert(overlap2, &object2);
     laneAssignmentCollector.Insert(overlap3, &object3);
@@ -358,8 +360,8 @@ TEST(TrafficLights, SetSpecification_ThreeLights)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.011"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return("20"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLightRed;
@@ -371,7 +373,7 @@ TEST(TrafficLights, SetSpecification_ThreeLights)
 
     ASSERT_THAT(trafficLight.SetSpecification(&roadSignal, position), Eq(true));
 
-    const auto specification = trafficLight.GetSpecification(5);
+    const auto specification = trafficLight.GetSpecification(5_m);
 
     ASSERT_THAT(specification.type, Eq(CommonTrafficLight::Type::ThreeLightsRight));
     ASSERT_THAT(osiLightRed.classification().icon(), Eq(osi3::TrafficLight_Classification_Icon_ICON_ARROW_RIGHT));
@@ -426,8 +428,8 @@ TEST(TrafficLights, SetSpecification_TwoLights_13)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.013"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return(""));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLightRed;
@@ -438,7 +440,7 @@ TEST(TrafficLights, SetSpecification_TwoLights_13)
 
     ASSERT_THAT(trafficLight.SetSpecification(&roadSignal, position), Eq(true));
 
-    const auto specification = trafficLight.GetSpecification(5);
+    const auto specification = trafficLight.GetSpecification(5_m);
 
     ASSERT_THAT(specification.type, Eq(CommonTrafficLight::Type::TwoLightsBicycle));
     ASSERT_THAT(osiLightRed.classification().icon(), Eq(osi3::TrafficLight_Classification_Icon_ICON_BICYCLE));
@@ -479,8 +481,8 @@ TEST(TrafficLights, SetSpecification_TwoLights_09_10)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.009"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return("10"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLightRed;
@@ -507,8 +509,8 @@ TEST(TrafficLights, SetSpecification_TwoLights_09_20)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.009"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return("20"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLightYellow;
@@ -535,8 +537,8 @@ TEST(TrafficLights, SetSpecification_TwoLights_09_30)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.009"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return("30"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLightRed;
@@ -563,8 +565,8 @@ TEST(TrafficLights, SetSpecification_TwoLights_Pedestrian)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.002"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return(""));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLightRed;
@@ -591,8 +593,8 @@ TEST(TrafficLights, SetSpecification_TwoLights_PedestrianAndBike)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.007"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return(""));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLightRed;
@@ -619,8 +621,8 @@ TEST(TrafficLights, SetSpecification_TwoLights_YellowGreenWithArrows)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.010"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return("10"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLightRed;
@@ -658,8 +660,8 @@ TEST(TrafficLights, SetSpecification_OneLight_WithArrows_Red)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.020"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return(""));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLight;
@@ -701,8 +703,8 @@ TEST(TrafficLights, SetSpecification_OneLight_WithArrows_Yellow)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.008"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return(""));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLight;
@@ -744,8 +746,8 @@ TEST(TrafficLights, SetSpecification_OneLight_WithArrows_Green)
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.012"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return(""));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(0.1_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(0.2_m));
     Position position{};
 
     osi3::TrafficLight osiLight;
@@ -787,14 +789,14 @@ TEST(TrafficLights, SetSpecification_SetsCorrectBaseStationaryForPositiveOrienta
 {
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("333"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(5.0));
-    ON_CALL(roadSignal, GetZOffset()).WillByDefault(Return(3.0));
-    ON_CALL(roadSignal, GetHOffset()).WillByDefault(Return(2.0));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(5.0_m));
+    ON_CALL(roadSignal, GetZOffset()).WillByDefault(Return(3.0_m));
+    ON_CALL(roadSignal, GetHOffset()).WillByDefault(Return(2.0_rad));
     ON_CALL(roadSignal, GetOrientation()).WillByDefault(Return(true));
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.011"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return("20"));
-    Position position{10, 11, -1.5, 0};
+    Position position{10_m, 11_m, -1.5_rad, 0_i_m};
 
     osi3::TrafficLight osiLightRed;
     osi3::TrafficLight osiLightYellow;
@@ -829,14 +831,14 @@ TEST(TrafficLights, SetSpecification_SetsCorrectBaseTwoSignalTrafficLight)
 {
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("333"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(5.0));
-    ON_CALL(roadSignal, GetZOffset()).WillByDefault(Return(3.0));
-    ON_CALL(roadSignal, GetHOffset()).WillByDefault(Return(1.0));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(5.0_m));
+    ON_CALL(roadSignal, GetZOffset()).WillByDefault(Return(3.0_m));
+    ON_CALL(roadSignal, GetHOffset()).WillByDefault(Return(1.0_rad));
     ON_CALL(roadSignal, GetOrientation()).WillByDefault(Return(false));
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.002"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return(""));
-    Position position{10, 11, 1.5, 0};
+    Position position{10_m, 11_m, 1.5_rad, 0_i_m};
 
     osi3::TrafficLight osiLightRed;
     osi3::TrafficLight osiLightYellow;
@@ -863,14 +865,14 @@ TEST(TrafficLights, SetSpecification_SetsCorrectBaseStationaryForNegativeOrienta
 {
     FakeRoadSignal roadSignal;
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("333"));
-    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0));
-    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(5.0));
-    ON_CALL(roadSignal, GetZOffset()).WillByDefault(Return(3.0));
-    ON_CALL(roadSignal, GetHOffset()).WillByDefault(Return(1.0));
+    ON_CALL(roadSignal, GetWidth()).WillByDefault(Return(4.0_m));
+    ON_CALL(roadSignal, GetHeight()).WillByDefault(Return(5.0_m));
+    ON_CALL(roadSignal, GetZOffset()).WillByDefault(Return(3.0_m));
+    ON_CALL(roadSignal, GetHOffset()).WillByDefault(Return(1.0_rad));
     ON_CALL(roadSignal, GetOrientation()).WillByDefault(Return(false));
     ON_CALL(roadSignal, GetType()).WillByDefault(Return("1.000.011"));
     ON_CALL(roadSignal, GetSubType()).WillByDefault(Return("20"));
-    Position position{10, 11, 1.5, 0};
+    Position position{10_m, 11_m, 1.5_rad, 0_i_m};
 
     osi3::TrafficLight osiLightRed;
     osi3::TrafficLight osiLightYellow;
@@ -909,13 +911,13 @@ TEST(DefaultMovingObject, MovingObjectAddWheels)
     OWL::OsiDefaultValues defaultValues;
 
     OWL::WheelData wheelData;
-    wheelData.position = {0.0, 1.0, 2.0};
+    wheelData.position = {0.0_m, 1.0_m, 2.0_m};
     wheelData.axle = 1;
     wheelData.index = 1;
-    wheelData.rotation_rate = 1.0;
-    wheelData.width = 2.0;
-    wheelData.wheelRadius = 3.0;
-    wheelData.rim_radius = 4.0;
+    wheelData.rotation_rate = 1.0_rpm;
+    wheelData.width = 2.0_m;
+    wheelData.wheelRadius = 3.0_m;
+    wheelData.rim_radius = 4.0_m;
 
     ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->number_wheels(),0);
     moving_object.AddWheel(wheelData);
@@ -923,15 +925,15 @@ TEST(DefaultMovingObject, MovingObjectAddWheels)
 
     ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).axle(),wheelData.axle);
     ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).index(),wheelData.index);
-    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).rotation_rate(),wheelData.rotation_rate);
-    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).width(),wheelData.width);
-    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).wheel_radius(),wheelData.wheelRadius);
-    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).rim_radius(),wheelData.rim_radius);
+    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).rotation_rate(), wheelData.rotation_rate.value());
+    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).width(), wheelData.width.value());
+    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).wheel_radius(), wheelData.wheelRadius.value());
+    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(0).rim_radius(), wheelData.rim_radius.value());
 
     wheelData.index = 2;
     moving_object.AddWheel(wheelData);
     ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(1).index(),wheelData.index);
-    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(1).rim_radius(),wheelData.rim_radius);
+    ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->wheel_data().at(1).rim_radius(), wheelData.rim_radius.value());
     ASSERT_EQ(osi_moving_object.mutable_vehicle_attributes()->number_wheels(),2);
 }
 
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/egoAgent_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/egoAgent_Tests.cpp
index c856966d51d996b58209f5e0c8d19b88c4816689..c9fd8008a6e9e38ac9dd8aba634d56ba251807dc 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/egoAgent_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/egoAgent_Tests.cpp
@@ -29,7 +29,7 @@ TEST(EgoAgent_Test, GetDistanceToEndOfLane)
     NiceMock<FakeAgent> fakeAgent;
     NiceMock<FakeWorld> fakeWorld;
 
-    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12, 0, 0}}};
+    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12_m, 0_m, 0_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(agentPosition));
     std::vector<std::string> roads{"Road1"};
     ON_CALL(fakeAgent, GetRoads(_)).WillByDefault(Return(roads));
@@ -39,14 +39,14 @@ TEST(EgoAgent_Test, GetDistanceToEndOfLane)
     RoadGraphVertex target = add_vertex(RouteElement{"Road2", true}, roadGraph);
     add_edge(root, target, roadGraph);
 
-    RouteQueryResult<double> distances{{0, 123}};
-    ON_CALL(fakeWorld, GetDistanceToEndOfLane(_,_,-1,12,100)).WillByDefault(Return(distances));
+    RouteQueryResult<units::length::meter_t> distances{{0, 123_m}};
+    ON_CALL(fakeWorld, GetDistanceToEndOfLane(_, _, -1, 12_m, 100_m)).WillByDefault(Return(distances));
 
     EgoAgent egoAgent {&fakeAgent, &fakeWorld};
     egoAgent.SetRoadGraph(std::move(roadGraph), root, target);
 
-    const auto result = egoAgent.GetDistanceToEndOfLane(100, 1);
-    ASSERT_THAT(result, Eq(123));
+    const auto result = egoAgent.GetDistanceToEndOfLane(100_m, 1);
+    ASSERT_THAT(result.value(), Eq(123));
 }
 
 TEST(EgoAgent_Test, GetObjectsInRange)
@@ -54,7 +54,7 @@ TEST(EgoAgent_Test, GetObjectsInRange)
     NiceMock<FakeAgent> fakeAgent;
     NiceMock<FakeWorld> fakeWorld;
 
-    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12, 0, 0}}};
+    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12_m, 0_m, 0_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(agentPosition));
     std::vector<std::string> roads{"Road1"};
     ON_CALL(fakeAgent, GetRoads(_)).WillByDefault(Return(roads));
@@ -66,12 +66,12 @@ TEST(EgoAgent_Test, GetObjectsInRange)
 
     FakeAgent otherAgent;
     RouteQueryResult<std::vector<const WorldObjectInterface*>> objects{{0, {&otherAgent}}};
-    ON_CALL(fakeWorld, GetObjectsInRange(_,_,-1,12,100, 100)).WillByDefault(Return(objects));
+    ON_CALL(fakeWorld, GetObjectsInRange(_, _, -1, 12_m, 100_m, 100_m)).WillByDefault(Return(objects));
 
     EgoAgent egoAgent {&fakeAgent, &fakeWorld};
     egoAgent.SetRoadGraph(std::move(roadGraph), root, target);
 
-    const auto result = egoAgent.GetObjectsInRange(100, 100, 1);
+    const auto result = egoAgent.GetObjectsInRange(100_m, 100_m, 1);
     ASSERT_THAT(result, ElementsAre(&otherAgent));
 }
 
@@ -80,7 +80,7 @@ TEST(EgoAgent_Test, GetAgentsInRange)
     NiceMock<FakeAgent> fakeAgent;
     NiceMock<FakeWorld> fakeWorld;
 
-    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12, 0, 0}}};
+    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12_m, 0_m, 0_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(agentPosition));
     std::vector<std::string> roads{"Road1"};
     ON_CALL(fakeAgent, GetRoads(_)).WillByDefault(Return(roads));
@@ -92,12 +92,12 @@ TEST(EgoAgent_Test, GetAgentsInRange)
 
     FakeAgent otherAgent;
     RouteQueryResult<AgentInterfaces> objects{{0, {&otherAgent}}};
-    ON_CALL(fakeWorld, GetAgentsInRange(_,_,-1,12,100, 100)).WillByDefault(Return(objects));
+    ON_CALL(fakeWorld, GetAgentsInRange(_, _, -1, 12_m, 100_m, 100_m)).WillByDefault(Return(objects));
 
     EgoAgent egoAgent {&fakeAgent, &fakeWorld};
     egoAgent.SetRoadGraph(std::move(roadGraph), root, target);
 
-    const auto result = egoAgent.GetAgentsInRange(100, 100, 1);
+    const auto result = egoAgent.GetAgentsInRange(100_m, 100_m, 1);
     ASSERT_THAT(result, ElementsAre(&otherAgent));
 }
 
@@ -106,7 +106,7 @@ TEST(EgoAgent_Test, GetTrafficSignsInRange)
     NiceMock<FakeAgent> fakeAgent;
     NiceMock<FakeWorld> fakeWorld;
 
-    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12, 0, 0}}};
+    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12_m, 0_m, 0_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(agentPosition));
     std::vector<std::string> roads{"Road1"};
     ON_CALL(fakeAgent, GetRoads(_)).WillByDefault(Return(roads));
@@ -118,12 +118,12 @@ TEST(EgoAgent_Test, GetTrafficSignsInRange)
 
 
     RouteQueryResult<std::vector<CommonTrafficSign::Entity>> objects{{0, {CommonTrafficSign::Entity{}}}};
-    ON_CALL(fakeWorld, GetTrafficSignsInRange(_,_,-1,12,100)).WillByDefault(Return(objects));
+    ON_CALL(fakeWorld, GetTrafficSignsInRange(_, _, -1, 12_m, 100_m)).WillByDefault(Return(objects));
 
     EgoAgent egoAgent {&fakeAgent, &fakeWorld};
     egoAgent.SetRoadGraph(std::move(roadGraph), root, target);
 
-    const auto result = egoAgent.GetTrafficSignsInRange(100, 1);
+    const auto result = egoAgent.GetTrafficSignsInRange(100_m, 1);
     ASSERT_THAT(result, SizeIs(1));
 }
 
@@ -137,8 +137,8 @@ TEST(EgoAgent_Test, GetReferencePointPosition_FirstRoad)
     RoadGraphVertex target = add_vertex(RouteElement{"Road2", true}, roadGraph);
     add_edge(root, target, roadGraph);
 
-    GlobalRoadPositions referencePoint{{"Road1", {"Road1", -2, 2.0, 3.0, 0.1}}};
-    GlobalRoadPositions frontPoint{{"Road1", {"Road1", -2, 12.0, 3.0, 0.1}}};
+    GlobalRoadPositions referencePoint{{"Road1", {"Road1", -2, 2.0_m, 3.0_m, 0.1_rad}}};
+    GlobalRoadPositions frontPoint{{"Road1", {"Road1", -2, 12.0_m, 3.0_m, 0.1_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(frontPoint));
     std::vector<std::string> roads{"Road1"};
@@ -151,9 +151,9 @@ TEST(EgoAgent_Test, GetReferencePointPosition_FirstRoad)
 
     ASSERT_THAT(result.has_value(), Eq(true));
     ASSERT_THAT(result.value().laneId, Eq(-2));
-    ASSERT_THAT(result.value().roadPosition.s, Eq(2.0));
-    ASSERT_THAT(result.value().roadPosition.t, Eq(3.0));
-    ASSERT_THAT(result.value().roadPosition.hdg, Eq(0.1));
+    ASSERT_THAT(result.value().roadPosition.s.value(), Eq(2.0));
+    ASSERT_THAT(result.value().roadPosition.t.value(), Eq(3.0));
+    ASSERT_THAT(result.value().roadPosition.hdg.value(), Eq(0.1));
 }
 
 TEST(EgoAgent_Test, GetReferencePointPosition_SecondRoad)
@@ -166,8 +166,8 @@ TEST(EgoAgent_Test, GetReferencePointPosition_SecondRoad)
     RoadGraphVertex target = add_vertex(RouteElement{"Road2", true}, roadGraph);
     add_edge(root, target, roadGraph);
 
-    GlobalRoadPositions referencePoint{{"Road2", {"Road2", -2, 2.0, 3.0, 0.1}}};
-    GlobalRoadPositions frontPoint{{"Road2", {"Road2", -2, 12.0, 3.0, 0.1}}};
+    GlobalRoadPositions referencePoint{{"Road2", {"Road2", -2, 2.0_m, 3.0_m, 0.1_rad}}};
+    GlobalRoadPositions frontPoint{{"Road2", {"Road2", -2, 12.0_m, 3.0_m, 0.1_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(frontPoint));
     std::vector<std::string> roads{"Road2"};
@@ -181,9 +181,9 @@ TEST(EgoAgent_Test, GetReferencePointPosition_SecondRoad)
 
     ASSERT_THAT(result.has_value(), Eq(true));
     ASSERT_THAT(result.value().laneId, Eq(-2));
-    ASSERT_THAT(result.value().roadPosition.s, Eq(2.0));
-    ASSERT_THAT(result.value().roadPosition.t, Eq(3.0));
-    ASSERT_THAT(result.value().roadPosition.hdg, Eq(0.1));
+    ASSERT_THAT(result.value().roadPosition.s.value(), Eq(2.0));
+    ASSERT_THAT(result.value().roadPosition.t.value(), Eq(3.0));
+    ASSERT_THAT(result.value().roadPosition.hdg.value(), Eq(0.1));
 }
 
 TEST(EgoAgent_Test, GetReferencePointPosition_NotOnRoute)
@@ -196,8 +196,8 @@ TEST(EgoAgent_Test, GetReferencePointPosition_NotOnRoute)
     RoadGraphVertex target = add_vertex(RouteElement{"Road2", true}, roadGraph);
     add_edge(root, target, roadGraph);
 
-    GlobalRoadPositions referencePoint{{"Offroad", {"Offroad", -2, 2.0, 3.0, 0.1}}};
-    GlobalRoadPositions frontPoint{{"Offroad", {"Offroad", -2, 12.0, 3.0, 0.1}}};
+    GlobalRoadPositions referencePoint{{"Offroad", {"Offroad", -2, 2.0_m, 3.0_m, 0.1_rad}}};
+    GlobalRoadPositions frontPoint{{"Offroad", {"Offroad", -2, 12.0_m, 3.0_m, 0.1_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(frontPoint));
 
@@ -221,17 +221,17 @@ public:
         add_edge(root, node3, roadGraph);
         ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(agentPosition));
         ON_CALL(fakeAgent, GetRoads(_)).WillByDefault(Return(roads));
-        RouteQueryResult<double> distances {{node1, 100},
-                                            {node21, 150},
-                                            {node22, 200},
-                                            {node3, 50}};
-        ON_CALL(fakeWorld, GetDistanceToEndOfLane(_,_,-3,12,500)).WillByDefault(Return(distances));
+        RouteQueryResult<units::length::meter_t> distances{{node1, 100_m},
+                                                           {node21, 150_m},
+                                                           {node22, 200_m},
+                                                           {node3, 50_m}};
+        ON_CALL(fakeWorld, GetDistanceToEndOfLane(_, _, -3, 12_m, 500_m)).WillByDefault(Return(distances));
 
         RouteQueryResult<std::vector<const WorldObjectInterface*>> objects{{node1, {&opponent1, &opponent2}},
                                                                            {node21, {}},
                                                                            {node22, {}},
                                                                            {node3, {&opponent1}}};
-        ON_CALL(fakeWorld, GetObjectsInRange(_,_,-3,12,100,500)).WillByDefault(Return(objects));
+        ON_CALL(fakeWorld, GetObjectsInRange(_, _, -3, 12_m, 100_m, 500_m)).WillByDefault(Return(objects));
 
         egoAgent.SetRoadGraph(std::move(roadGraph), root, node21);
     }
@@ -239,7 +239,7 @@ public:
     NiceMock<FakeAgent> fakeAgent;
     NiceMock<FakeWorld> fakeWorld;
     EgoAgent egoAgent {&fakeAgent, &fakeWorld};
-    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12, 0, 0}}};
+    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", -2, 12_m, 0_m, 0_rad}}};
     std::vector<std::string> roads{"Road1"};
     RoadGraph roadGraph;
     RoadGraphVertex root = add_vertex(RouteElement{"Road1", true}, roadGraph);
@@ -255,8 +255,8 @@ public:
 TEST_F(EgoAgent_GetAlternatives_Test, GetAlternativesFilterByDistance)
 {
     const auto alternatives = egoAgent.GetAlternatives(
-                                  Predicate<DistanceToEndOfLane>{[](const auto& distance){return distance < 160;}},
-                                  DistanceToEndOfLaneParameter{500, -1});
+        Predicate<DistanceToEndOfLane>{[](const units::length::meter_t &distance) { return distance < 160_m; }},
+        DistanceToEndOfLaneParameter{500_m, -1});
 
     ASSERT_THAT(alternatives, ElementsAre(0, 1, 3));
 }
@@ -264,9 +264,9 @@ TEST_F(EgoAgent_GetAlternatives_Test, GetAlternativesFilterByDistance)
 TEST_F(EgoAgent_GetAlternatives_Test, GetAlternativesFilterByDistanceAndObjects)
 {
     const auto alternatives = egoAgent.GetAlternatives(
-                                  Predicate<DistanceToEndOfLane, ObjectsInRange>{[](const auto& distance, const auto& objects){return distance < 160 && objects.value.empty();}},
-                                  DistanceToEndOfLaneParameter{500, -1},
-                                  ObjectsInRangeParameter{100, 500, -1});
+        Predicate<DistanceToEndOfLane, ObjectsInRange>{[](const units::length::meter_t &distance, const auto &objects) { return distance < 160_m && objects.value.empty(); }},
+        DistanceToEndOfLaneParameter{500_m, -1},
+        ObjectsInRangeParameter{100_m, 500_m, -1});
 
     ASSERT_THAT(alternatives, ElementsAre(1));
 }
@@ -274,9 +274,9 @@ TEST_F(EgoAgent_GetAlternatives_Test, GetAlternativesFilterByDistanceAndObjects)
 TEST_F(EgoAgent_GetAlternatives_Test, GetAlternativesFilterAndSortByDistance)
 {
     const auto alternatives = egoAgent.GetAlternatives(
-                                  Predicate<DistanceToEndOfLane>{[](const auto& distance){return distance < 160;}},
-                                  Compare<DistanceToEndOfLane>{[](const auto& distances){return distances.first < distances.second;}},
-                                  DistanceToEndOfLaneParameter{500, -1});
+        Predicate<DistanceToEndOfLane>{[](const units::length::meter_t &distance) { return distance < 160_m; }},
+        Compare<DistanceToEndOfLane>{[](const auto &distances) { return distances.first < distances.second; }},
+        DistanceToEndOfLaneParameter{500_m, -1});
 
     ASSERT_THAT(alternatives, ElementsAre(3, 0, 1));
 }
@@ -284,10 +284,10 @@ TEST_F(EgoAgent_GetAlternatives_Test, GetAlternativesFilterAndSortByDistance)
 TEST_F(EgoAgent_GetAlternatives_Test, GetAlternativesFilterAndSortByDistanceAndObjects)
 {
     const auto alternatives = egoAgent.GetAlternatives(
-                                  Predicate<DistanceToEndOfLane, ObjectsInRange>{[](const auto& distance, const auto& objects){return distance < 160 && !objects.value.empty();}},
-                                  Compare<DistanceToEndOfLane, ObjectsInRange>{[](const auto& distances, const auto& objects){return objects.first.value.size() < objects.second.value.size();}},
-                                  DistanceToEndOfLaneParameter{500, -1},
-                                  ObjectsInRangeParameter{100, 500, -1});
+        Predicate<DistanceToEndOfLane, ObjectsInRange>{[](const units::length::meter_t &distance, const auto &objects) { return distance < 160_m && !objects.value.empty(); }},
+        Compare<DistanceToEndOfLane, ObjectsInRange>{[](const auto &distances, const auto &objects) { return objects.first.value.size() < objects.second.value.size(); }},
+        DistanceToEndOfLaneParameter{500_m, -1},
+        ObjectsInRangeParameter{100_m, 500_m, -1});
 
     ASSERT_THAT(alternatives, ElementsAre(3, 0));
 }
@@ -310,7 +310,7 @@ TEST_P(GetLaneIdFromRelativeTest, CalculatesCorrectLaneId)
     NiceMock<FakeAgent> fakeAgent;
     NiceMock<FakeWorld> fakeWorld;
 
-    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", data.ownLaneId, 0, 0, 0}}};
+    GlobalRoadPositions agentPosition{{"Road1", GlobalRoadPosition{"Road1", data.ownLaneId, 0_m, 0_m, 0_rad}}};
     ON_CALL(fakeAgent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(agentPosition));
     std::vector<std::string> roads{"Road1"};
     ON_CALL(fakeAgent, GetRoads(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(Return(roads));
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/fakeLaneManager_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/fakeLaneManager_Tests.cpp
index bbbd28ee4e75ebcc073379b84fc173e018905ba7..825e5dce2bcc945859ddb3d72b0de2ba615de610 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/fakeLaneManager_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/fakeLaneManager_Tests.cpp
@@ -24,10 +24,10 @@ using ::testing::ElementsAre;
 
 TEST(FakeLaneManager, SingleLaneTest)
 {
-    FakeLaneManager flm(1, 1, 3.0, {1000}, "TestRoadId");
+    FakeLaneManager flm(1, 1, 3.0_m, {1000_m}, "TestRoadId");
 
     EXPECT_THAT(flm.lanes[0][0]->Exists(), Eq(true));
-    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0), Eq(3.0));
+    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0_m).value(), Eq(3.0));
     EXPECT_THAT(flm.lanes[0][0]->GetLeftLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[0][0]->GetRightLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[0][0]->GetPrevious(), IsEmpty());
@@ -36,11 +36,11 @@ TEST(FakeLaneManager, SingleLaneTest)
 
 TEST(FakeLaneManager, GetLaneTest)
 {
-    FakeLaneManager flm(1, 1, 3.0, {1000}, "TestRoadId");
+    FakeLaneManager flm(1, 1, 3.0_m, {1000_m}, "TestRoadId");
 
     auto& lane = flm.GetLane(0, 0);
     EXPECT_THAT(lane.Exists(), Eq(true));
-    EXPECT_THAT(lane.GetWidth(0), Eq(3.0));
+    EXPECT_THAT(lane.GetWidth(0_m).value(), Eq(3.0));
     EXPECT_THAT(lane.GetLeftLane(), Ref(flm.invalidLane));
     EXPECT_THAT(lane.GetRightLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[0][0]->GetPrevious(), IsEmpty());
@@ -49,17 +49,17 @@ TEST(FakeLaneManager, GetLaneTest)
 
 TEST(FakeLaneManager, SingleColumnTest)
 {
-    FakeLaneManager flm(1, 2, 3.0, {1000}, "TestRoadId");
+    FakeLaneManager flm(1, 2, 3.0_m, {1000_m}, "TestRoadId");
 
     EXPECT_THAT(flm.lanes[0][0]->Exists(), Eq(true));
-    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0), Eq(3.0));
+    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0_m).value(), Eq(3.0));
     EXPECT_THAT(flm.lanes[0][0]->GetLeftLane(), Ref(flm.invalidLane));
     EXPECT_THAT(&flm.lanes[0][0]->GetRightLane(), Eq(flm.lanes[0][1]));
     EXPECT_THAT(flm.lanes[0][0]->GetPrevious(), IsEmpty());
     EXPECT_THAT(flm.lanes[0][0]->GetNext(), IsEmpty());
 
     EXPECT_THAT(flm.lanes[0][1]->Exists(), Eq(true));
-    EXPECT_THAT(flm.lanes[0][1]->GetWidth(0), Eq(3.0));
+    EXPECT_THAT(flm.lanes[0][1]->GetWidth(0_m).value(), Eq(3.0));
     EXPECT_THAT(&flm.lanes[0][1]->GetLeftLane(), Eq(flm.lanes[0][0]));
     EXPECT_THAT(flm.lanes[0][1]->GetRightLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[0][0]->GetPrevious(), IsEmpty());
@@ -68,17 +68,17 @@ TEST(FakeLaneManager, SingleColumnTest)
 
 TEST(FakeLaneManager, SingleRowTest)
 {
-    FakeLaneManager flm(2, 1, 3.0, {1000, 1000}, "TestRoadId");
+    FakeLaneManager flm(2, 1, 3.0_m, {1000_m, 1000_m}, "TestRoadId");
 
     EXPECT_THAT(flm.lanes[0][0]->Exists(), Eq(true));
-    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0), Eq(3.0));
+    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0_m).value(), Eq(3.0));
     EXPECT_THAT(flm.lanes[0][0]->GetLeftLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[0][0]->GetRightLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[0][0]->GetPrevious(), IsEmpty());
     EXPECT_THAT(flm.lanes[0][0]->GetNext(), ElementsAre(flm.lanes[1][0]->GetId()));
 
     EXPECT_THAT(flm.lanes[1][0]->Exists(), Eq(true));
-    EXPECT_THAT(flm.lanes[1][0]->GetWidth(0), Eq(3.0));
+    EXPECT_THAT(flm.lanes[1][0]->GetWidth(0_m).value(), Eq(3.0));
     EXPECT_THAT(flm.lanes[1][0]->GetLeftLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[1][0]->GetRightLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[1][0]->GetNext(), IsEmpty());
@@ -87,17 +87,17 @@ TEST(FakeLaneManager, SingleRowTest)
 
 TEST(FakeLaneManager, MatrixTest)
 {
-    FakeLaneManager flm(2, 3, 3.0, {1000, 1000}, "TestRoadId");
+    FakeLaneManager flm(2, 3, 3.0_m, {1000_m, 1000_m}, "TestRoadId");
 
     EXPECT_THAT(flm.lanes[0][0]->Exists(), Eq(true));
-    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0), Eq(3.0));
+    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0_m).value(), Eq(3.0));
     EXPECT_THAT(flm.lanes[0][0]->GetLeftLane(), Ref(flm.invalidLane));
     EXPECT_THAT(&flm.lanes[0][0]->GetRightLane(), Eq(flm.lanes[0][1]));
     EXPECT_THAT(flm.lanes[0][0]->GetPrevious(), IsEmpty());
     EXPECT_THAT(flm.lanes[0][0]->GetNext(), ElementsAre(flm.lanes[1][0]->GetId()));
 
     EXPECT_THAT(flm.lanes[1][2]->Exists(), Eq(true));
-    EXPECT_THAT(flm.lanes[1][2]->GetWidth(0), Eq(3.0));
+    EXPECT_THAT(flm.lanes[1][2]->GetWidth(0_m).value(), Eq(3.0));
     EXPECT_THAT(&flm.lanes[1][2]->GetLeftLane(), Eq(flm.lanes[1][1]));
     EXPECT_THAT(flm.lanes[1][2]->GetRightLane(), Ref(flm.invalidLane));
     EXPECT_THAT(flm.lanes[1][2]->GetNext(), IsEmpty());
@@ -106,7 +106,7 @@ TEST(FakeLaneManager, MatrixTest)
 
 TEST(FakeLaneManager, SectionConnectionTest)
 {
-    FakeLaneManager flm(2, 2, 3.0, {1000, 1000}, "TestRoadId");
+    FakeLaneManager flm(2, 2, 3.0_m, {1000_m, 1000_m}, "TestRoadId");
 
     EXPECT_THAT(&flm.lanes[0][0]->GetSection(), &flm.lanes[0][1]->GetSection());
     EXPECT_THAT(&flm.lanes[1][0]->GetSection(), &flm.lanes[1][1]->GetSection());
@@ -119,23 +119,23 @@ TEST(FakeLaneManager, SectionConnectionTest)
 
 TEST(FakeLaneManager, ApplyMovingObjectTest)
 {
-    FakeLaneManager flm(2, 2, 3.0, {1000, 1000}, "TestRoadId");
+    FakeLaneManager flm(2, 2, 3.0_m, {1000_m, 1000_m}, "TestRoadId");
     Fakes::MovingObject fmo00;
     Fakes::MovingObject fmo01;
     Fakes::MovingObject fmo11;
 
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,1,0,0},
-                              GlobalRoadPosition{"",0,1,0,0},
-                              GlobalRoadPosition{"",0,1,0,0},
-                              GlobalRoadPosition{"",0,1,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,2,0,0},
-                              GlobalRoadPosition{"",0,2,0,0},
-                              GlobalRoadPosition{"",0,2,0,0},
-                              GlobalRoadPosition{"",0,2,0,0}};
-    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,3,0,0},
-                              GlobalRoadPosition{"",0,3,0,0},
-                              GlobalRoadPosition{"",0,3,0,0},
-                              GlobalRoadPosition{"",0,3,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,1_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,2_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,2_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,2_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,2_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,3_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,3_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,3_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,3_m,0_m,0_rad}};
     flm.AddWorldObject(0, 0, fmo00, overlap1);
     flm.AddWorldObject(0, 0, fmo01, overlap2);
     flm.AddWorldObject(1, 1, fmo11, overlap3);
@@ -153,49 +153,49 @@ TEST(FakeLaneManager, ApplyMovingObjectTest)
 
 TEST(FakeLaneManager, SetWidth)
 {
-    FakeLaneManager flm(2, 2, 3.0, {1000, 1000}, "TestRoadId");
+    FakeLaneManager flm(2, 2, 3.0_m, {1000_m, 1000_m}, "TestRoadId");
 
-    flm.SetWidth(0, 0, 1.0, 10.0);
-    flm.SetWidth(0, 1, 2.0, 20.0);
-    flm.SetWidth(1, 0, 3.0, 30.0);
-    flm.SetWidth(1, 1, 4.0, 40.0);
+    flm.SetWidth(0, 0, 1.0_m, 10.0_m);
+    flm.SetWidth(0, 1, 2.0_m, 20.0_m);
+    flm.SetWidth(1, 0, 3.0_m, 30.0_m);
+    flm.SetWidth(1, 1, 4.0_m, 40.0_m);
 
     // default values (set by constructor)
-    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0.0), Eq(3.0));
-    EXPECT_THAT(flm.lanes[0][1]->GetWidth(0.0), Eq(3.0));
-    EXPECT_THAT(flm.lanes[1][0]->GetWidth(0.0), Eq(3.0));
-    EXPECT_THAT(flm.lanes[1][1]->GetWidth(0.0), Eq(3.0));
+    EXPECT_THAT(flm.lanes[0][0]->GetWidth(0.0_m).value(), Eq(3.0));
+    EXPECT_THAT(flm.lanes[0][1]->GetWidth(0.0_m).value(), Eq(3.0));
+    EXPECT_THAT(flm.lanes[1][0]->GetWidth(0.0_m).value(), Eq(3.0));
+    EXPECT_THAT(flm.lanes[1][1]->GetWidth(0.0_m).value(), Eq(3.0));
 
     // special values at distance x
-    EXPECT_THAT(flm.lanes[0][0]->GetWidth(10.0), Eq(1.0));
-    EXPECT_THAT(flm.lanes[0][1]->GetWidth(20.0), Eq(2.0));
-    EXPECT_THAT(flm.lanes[1][0]->GetWidth(30.0), Eq(3.0));
-    EXPECT_THAT(flm.lanes[1][1]->GetWidth(40.0), Eq(4.0));
+    EXPECT_THAT(flm.lanes[0][0]->GetWidth(10.0_m).value(), Eq(1.0));
+    EXPECT_THAT(flm.lanes[0][1]->GetWidth(20.0_m).value(), Eq(2.0));
+    EXPECT_THAT(flm.lanes[1][0]->GetWidth(30.0_m).value(), Eq(3.0));
+    EXPECT_THAT(flm.lanes[1][1]->GetWidth(40.0_m).value(), Eq(4.0));
 }
 
 TEST(FakeLaneManager, SetLength)
 {
-    FakeLaneManager flm(1, 2, 3.0, {1000, 1000}, "TestRoadId");
+    FakeLaneManager flm(1, 2, 3.0_m, {1000_m, 1000_m}, "TestRoadId");
 
-    flm.SetLength(0, 0, 1.0);
-    EXPECT_THAT(flm.lanes[0][0]->GetLength(), Eq(1.0));
-    EXPECT_THAT(flm.lanes[0][0]->GetDistance(OWL::MeasurementPoint::RoadStart), Eq(0.0));
-    EXPECT_THAT(flm.lanes[0][0]->GetDistance(OWL::MeasurementPoint::RoadEnd),   Eq(1.0));
+    flm.SetLength(0, 0, 1.0_m);
+    EXPECT_THAT(flm.lanes[0][0]->GetLength().value(), Eq(1.0));
+    EXPECT_THAT(flm.lanes[0][0]->GetDistance(OWL::MeasurementPoint::RoadStart).value(), Eq(0.0));
+    EXPECT_THAT(flm.lanes[0][0]->GetDistance(OWL::MeasurementPoint::RoadEnd).value(), Eq(1.0));
 
-    flm.SetLength(0, 1, 2.0, 20.0);
+    flm.SetLength(0, 1, 2.0_m, 20.0_m);
 
-    EXPECT_THAT(flm.lanes[0][1]->GetLength(), Eq(2.0));
-    EXPECT_THAT(flm.lanes[0][1]->GetDistance(OWL::MeasurementPoint::RoadStart), Eq(20.0));
-    EXPECT_THAT(flm.lanes[0][1]->GetDistance(OWL::MeasurementPoint::RoadEnd),   Eq(22.0));
+    EXPECT_THAT(flm.lanes[0][1]->GetLength().value(), Eq(2.0));
+    EXPECT_THAT(flm.lanes[0][1]->GetDistance(OWL::MeasurementPoint::RoadStart).value(), Eq(20.0));
+    EXPECT_THAT(flm.lanes[0][1]->GetDistance(OWL::MeasurementPoint::RoadEnd).value(), Eq(22.0));
 }
 
 ////////////////////////////////////////////////////////////////////////////
 TEST(FakeLaneManager, SectionCoversValidPosition_ReturnsTrue)
 {
-    FakeLaneManager flm(1, 1, 3.0, {200}, "TestRoadId");
+    FakeLaneManager flm(1, 1, 3.0_m, {200_m}, "TestRoadId");
 
     const auto& sections = flm.GetSections();
-    const std::vector<double> distances = {0.0, 50.0, 200.0};
+    const std::vector<units::length::meter_t> distances = {0.0_m, 50.0_m, 200.0_m};
 
     ASSERT_EQ(sections.size(), 1);
     const auto& section = sections.begin()->second;
@@ -209,10 +209,10 @@ TEST(FakeLaneManager, SectionCoversValidPosition_ReturnsTrue)
 
 TEST(FakeLaneManager, SectionCoversInValidPosition_ReturnsFalse)
 {
-    FakeLaneManager flm(1, 1, 3.0, {200}, "TestRoadId");
+    FakeLaneManager flm(1, 1, 3.0_m, {200_m}, "TestRoadId");
 
     const auto& sections = flm.GetSections();
-    const std::vector<double> distances = {-1.0, 201.0};
+    const std::vector<units::length::meter_t> distances = {-1.0_m, 201.0_m};
 
     ASSERT_EQ(sections.size(), 1);
     const auto& section = sections.begin()->second;
@@ -225,11 +225,11 @@ TEST(FakeLaneManager, SectionCoversInValidPosition_ReturnsFalse)
 
 TEST(FakeLaneManager, SectionCoversIntervalValidPositions_ReturnsTrue)
 {
-    FakeLaneManager flm(1, 1, 3.0, {200}, "TestRoadId");
+    FakeLaneManager flm(1, 1, 3.0_m, {200_m}, "TestRoadId");
 
     const auto& sections = flm.GetSections();
-    std::vector<double> startDistances = {0.0, 30.0, 190.0};
-    std::vector<double> endDistances = {10.0, 40.0, 200.0};
+    std::vector<units::length::meter_t> startDistances = {0.0_m, 30.0_m, 190.0_m};
+    std::vector<units::length::meter_t> endDistances = {10.0_m, 40.0_m, 200.0_m};
 
     ASSERT_EQ(sections.size(), 1);
     const auto& section = sections.begin()->second;
@@ -243,11 +243,11 @@ TEST(FakeLaneManager, SectionCoversIntervalValidPositions_ReturnsTrue)
 
 TEST(FakeLaneManager,  SectionCoversIntervalOneDistanceOutsideSectionRange_ReturnsTrue)
 {
-    FakeLaneManager flm(1, 1, 3.0, {200}, "TestRoadId");
+    FakeLaneManager flm(1, 1, 3.0_m, {200_m}, "TestRoadId");
 
     const auto& sections = flm.GetSections();
-    std::vector<double> startDistances = {-10.0, 190.0};
-    std::vector<double> endDistances = {10.0, 210.0};
+    std::vector<units::length::meter_t> startDistances = {-10.0_m, 190.0_m};
+    std::vector<units::length::meter_t> endDistances = {10.0_m, 210.0_m};
 
     ASSERT_EQ(sections.size(), 1);
     const auto& section = sections.begin()->second;
@@ -260,11 +260,11 @@ TEST(FakeLaneManager,  SectionCoversIntervalOneDistanceOutsideSectionRange_Retur
 
 TEST(FakeLaneManager,  SectionCoversIntervalBothDistancesOutsideSectionRange_ReturnsFalse)
 {
-    FakeLaneManager flm(1, 1, 3.0, {200}, "TestRoadId");
+    FakeLaneManager flm(1, 1, 3.0_m, {200_m}, "TestRoadId");
 
     const auto& sections = flm.GetSections();
-    std::vector<double> startDistances = {-50.0, 210.0};
-    std::vector<double> endDistances = {-10.0, 300.0};
+    std::vector<units::length::meter_t> startDistances = {-50.0_m, 210.0_m};
+    std::vector<units::length::meter_t> endDistances = {-10.0_m, 300.0_m};
 
     ASSERT_EQ(sections.size(), 1);
     const auto& section = sections.begin()->second;
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/geometryConverter_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/geometryConverter_Tests.cpp
index 0fa6897539f1c6f00c02aa7045698d23cd499541..8e0d16e36ca680aeada02ab3cd96352f49ae56b9 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/geometryConverter_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/geometryConverter_Tests.cpp
@@ -29,9 +29,9 @@ using ::testing::SizeIs;
 
 TEST(GeometryConverter_UnitTests, CalculateJointOnlyRightLanes)
 {
-    constexpr double geometryOffset = 123.4;
-    constexpr double roadOffset = 12.3;
-    constexpr double roadSectionStart = 1.2;
+    constexpr units::length::meter_t geometryOffset{123.4};
+    constexpr units::length::meter_t roadOffset{12.3};
+    constexpr units::length::meter_t roadSectionStart{1.2};
 
     FakeRoadLaneSection section;
     FakeOdRoad road;
@@ -41,35 +41,35 @@ TEST(GeometryConverter_UnitTests, CalculateJointOnlyRightLanes)
     FakeRoadLane lane0;
     FakeRoadLane laneMinus1;
     FakeRoadLane laneMinus2;
-    RoadLaneWidth widthMinus1{0, 3.0, 0.0, 0.0, 0.0};
+    RoadLaneWidth widthMinus1{0_m, 3.0_m, 0.0, units::unit_t<units::inverse<units::length::meter>>{0.0}, units::unit_t<units::inverse<units::squared<units::length::meter>>>{0.0}};
     RoadLaneWidths widthsMinus1{&widthMinus1};
     ON_CALL(laneMinus1, GetWidths()).WillByDefault(ReturnRef(widthsMinus1));
-    RoadLaneWidth widthMinus2{0, 4.0, 0.0, 0.0, 0.0};
+    RoadLaneWidth widthMinus2{0_m, 4.0_m, 0.0, units::unit_t<units::inverse<units::length::meter>>{0.0}, units::unit_t<units::inverse<units::squared<units::length::meter>>>{0.0}};
     RoadLaneWidths widthsMinus2{&widthMinus2};
     ON_CALL(laneMinus2, GetWidths()).WillByDefault(ReturnRef(widthsMinus2));
     std::map<int, RoadLaneInterface*> lanes{{0, &lane0}, {-1, &laneMinus1}, {-2, &laneMinus2}};
     ON_CALL(section, GetLanes()).WillByDefault(ReturnRef(lanes));
 
     FakeRoadGeometry geometry;
-    ON_CALL(geometry, GetCoord(geometryOffset,_)).WillByDefault(Return(Common::Vector2d{101.0, 102.0}));
+    ON_CALL(geometry, GetCoord(geometryOffset,_)).WillByDefault(Return(Common::Vector2d<units::length::meter_t>{101.0_m, 102.0_m}));
 
     auto result = GeometryConverter::CalculateBorderPoints(&section, &road, &geometry, geometryOffset, roadOffset, roadSectionStart);
 
     ASSERT_THAT(result.s, Eq(roadOffset));
     ASSERT_THAT(result.points, SizeIs(3));
-    ASSERT_THAT(result.points.at(0).point, Eq(Common::Vector2d{101.0, 102.0}));
+    ASSERT_THAT(result.points.at(0).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 102.0_m}));
     ASSERT_THAT(result.points.at(0).lane, Eq(&lane0));
-    ASSERT_THAT(result.points.at(1).point, Eq(Common::Vector2d{101.0, 99.0}));
+    ASSERT_THAT(result.points.at(1).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 99.0_m}));
     ASSERT_THAT(result.points.at(1).lane, Eq(&laneMinus1));
-    ASSERT_THAT(result.points.at(2).point, Eq(Common::Vector2d{101.0, 95.0}));
+    ASSERT_THAT(result.points.at(2).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 95.0_m}));
     ASSERT_THAT(result.points.at(2).lane, Eq(&laneMinus2));
 }
 
 TEST(GeometryConverter_UnitTests, CalculateJointOnlyRightLanesWithBorders)
 {
-    constexpr double geometryOffset = 123.4;
-    constexpr double roadOffset = 12.3;
-    constexpr double roadSectionStart = 1.2;
+    constexpr units::length::meter_t geometryOffset{123.4};
+    constexpr units::length::meter_t roadOffset{12.3};
+    constexpr units::length::meter_t roadSectionStart{1.2};
 
     FakeRoadLaneSection section;
     FakeOdRoad road;
@@ -81,11 +81,11 @@ TEST(GeometryConverter_UnitTests, CalculateJointOnlyRightLanesWithBorders)
     FakeRoadLane laneMinus2;
 
     RoadLaneWidths emptyWidths {};
-    RoadLaneWidth widthMinus1{0, 3.0, 0.0, 0.0, 0.0};
+    RoadLaneWidth widthMinus1{0_m, 3.0_m, 0.0, units::unit_t<units::inverse<units::length::meter>>{0.0}, units::unit_t<units::inverse<units::squared<units::length::meter>>>{0.0}};
     RoadLaneWidths widthsMinus1{&widthMinus1};
     ON_CALL(laneMinus1, GetWidths()).WillByDefault(ReturnRef(emptyWidths));
     ON_CALL(laneMinus1, GetBorders()).WillByDefault(ReturnRef(widthsMinus1));
-    RoadLaneWidth widthMinus2{0, 7.0, 0.0, 0.0, 0.0};
+    RoadLaneWidth widthMinus2{0_m, 7.0_m, 0.0, units::unit_t<units::inverse<units::length::meter>>{0.0}, units::unit_t<units::inverse<units::squared<units::length::meter>>>{0.0}};
 
     RoadLaneWidths widthsMinus2{&widthMinus2};
     ON_CALL(laneMinus2, GetWidths()).WillByDefault(ReturnRef(emptyWidths));
@@ -94,25 +94,25 @@ TEST(GeometryConverter_UnitTests, CalculateJointOnlyRightLanesWithBorders)
     ON_CALL(section, GetLanes()).WillByDefault(ReturnRef(lanes));
 
     FakeRoadGeometry geometry;
-    ON_CALL(geometry, GetCoord(geometryOffset,_)).WillByDefault(Return(Common::Vector2d{101.0, 102.0}));
+    ON_CALL(geometry, GetCoord(geometryOffset,_)).WillByDefault(Return(Common::Vector2d<units::length::meter_t>{101.0_m, 102.0_m}));
 
     auto result = GeometryConverter::CalculateBorderPoints(&section, &road, &geometry, geometryOffset, roadOffset, roadSectionStart);
 
     ASSERT_THAT(result.s, Eq(roadOffset));
     ASSERT_THAT(result.points, SizeIs(3));
-    ASSERT_THAT(result.points.at(0).point, Eq(Common::Vector2d{101.0, 102.0}));
+    ASSERT_THAT(result.points.at(0).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 102.0_m}));
     ASSERT_THAT(result.points.at(0).lane, Eq(&lane0));
-    ASSERT_THAT(result.points.at(1).point, Eq(Common::Vector2d{101.0, 99.0}));
+    ASSERT_THAT(result.points.at(1).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 99.0_m}));
     ASSERT_THAT(result.points.at(1).lane, Eq(&laneMinus1));
-    ASSERT_THAT(result.points.at(2).point, Eq(Common::Vector2d{101.0, 95.0}));
+    ASSERT_THAT(result.points.at(2).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 95.0_m}));
     ASSERT_THAT(result.points.at(2).lane, Eq(&laneMinus2));
 }
 
 TEST(GeometryConverter_UnitTests, CalculateJointOnlyLeftLanes)
 {
-    constexpr double geometryOffset = 123.4;
-    constexpr double roadOffset = 12.3;
-    constexpr double roadSectionStart = 1.2;
+    constexpr units::length::meter_t geometryOffset{123.4};
+    constexpr units::length::meter_t roadOffset{12.3};
+    constexpr units::length::meter_t roadSectionStart{1.2};
 
     FakeRoadLaneSection section;
     FakeOdRoad road;
@@ -122,35 +122,35 @@ TEST(GeometryConverter_UnitTests, CalculateJointOnlyLeftLanes)
     FakeRoadLane lane0;
     FakeRoadLane lanePlus1;
     FakeRoadLane lanePlus2;
-    RoadLaneWidth widthPlus1{0, 3.0, 0.0, 0.0, 0.0};
+    RoadLaneWidth widthPlus1{0_m, 3.0_m, 0.0, units::unit_t<units::inverse<units::length::meter>>{0.0}, units::unit_t<units::inverse<units::squared<units::length::meter>>>{0.0}};
     RoadLaneWidths widthsPlus1{&widthPlus1};
     ON_CALL(lanePlus1, GetWidths()).WillByDefault(ReturnRef(widthsPlus1));
-    RoadLaneWidth widthPlus2{0, 4.0, 0.0, 0.0, 0.0};
+    RoadLaneWidth widthPlus2{0_m, 4.0_m, 0.0, units::unit_t<units::inverse<units::length::meter>>{0.0}, units::unit_t<units::inverse<units::squared<units::length::meter>>>{0.0}};
     RoadLaneWidths widthsPlus2{&widthPlus2};
     ON_CALL(lanePlus2, GetWidths()).WillByDefault(ReturnRef(widthsPlus2));
     std::map<int, RoadLaneInterface*> lanes{{0, &lane0}, {1, &lanePlus1}, {2, &lanePlus2}};
     ON_CALL(section, GetLanes()).WillByDefault(ReturnRef(lanes));
 
     FakeRoadGeometry geometry;
-    ON_CALL(geometry, GetCoord(geometryOffset,_)).WillByDefault(Return(Common::Vector2d{101.0, 102.0}));
+    ON_CALL(geometry, GetCoord(geometryOffset,_)).WillByDefault(Return(Common::Vector2d<units::length::meter_t>{101.0_m, 102.0_m}));
 
     auto result = GeometryConverter::CalculateBorderPoints(&section, &road, &geometry, geometryOffset, roadOffset, roadSectionStart);
 
     ASSERT_THAT(result.s, Eq(roadOffset));
     ASSERT_THAT(result.points, SizeIs(3));
-    ASSERT_THAT(result.points.at(0).point, Eq(Common::Vector2d{101.0, 109.0}));
+    ASSERT_THAT(result.points.at(0).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 109.0_m}));
     ASSERT_THAT(result.points.at(0).lane, Eq(&lanePlus2));
-    ASSERT_THAT(result.points.at(1).point, Eq(Common::Vector2d{101.0, 105.0}));
+    ASSERT_THAT(result.points.at(1).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 105.0_m}));
     ASSERT_THAT(result.points.at(1).lane, Eq(&lanePlus1));
-    ASSERT_THAT(result.points.at(2).point, Eq(Common::Vector2d{101.0, 102.0}));
+    ASSERT_THAT(result.points.at(2).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 102.0_m}));
     ASSERT_THAT(result.points.at(2).lane, Eq(&lane0));
 }
 
 TEST(GeometryConverter_UnitTests, CalculateJointLeftAndRightLanes)
 {
-    constexpr double geometryOffset = 123.4;
-    constexpr double roadOffset = 12.3;
-    constexpr double roadSectionStart = 1.2;
+    constexpr units::length::meter_t geometryOffset{123.4};
+    constexpr units::length::meter_t roadOffset{12.3};
+    constexpr units::length::meter_t roadSectionStart{1.2};
 
     FakeRoadLaneSection section;
     FakeOdRoad road;
@@ -160,27 +160,27 @@ TEST(GeometryConverter_UnitTests, CalculateJointLeftAndRightLanes)
     FakeRoadLane lane0;
     FakeRoadLane lanePlus1;
     FakeRoadLane laneMinus1;
-    RoadLaneWidth widthMinus1{0, 3.0, 0.0, 0.0, 0.0};
+    RoadLaneWidth widthMinus1{0_m, 3.0_m, 0.0, units::unit_t<units::inverse<units::length::meter>>{0.0}, units::unit_t<units::inverse<units::squared<units::length::meter>>>{0.0}};
     RoadLaneWidths widthsMinus1{&widthMinus1};
     ON_CALL(laneMinus1, GetWidths()).WillByDefault(ReturnRef(widthsMinus1));
-    RoadLaneWidth widthPlus1{0, 4.0, 0.0, 0.0, 0.0};
+    RoadLaneWidth widthPlus1{0_m, 4.0_m, 0.0, units::unit_t<units::inverse<units::length::meter>>{0.0}, units::unit_t<units::inverse<units::squared<units::length::meter>>>{0.0}};
     RoadLaneWidths widthsPlus1{&widthPlus1};
     ON_CALL(lanePlus1, GetWidths()).WillByDefault(ReturnRef(widthsPlus1));
     std::map<int, RoadLaneInterface*> lanes{{0, &lane0}, {-1, &laneMinus1}, {1, &lanePlus1}};
     ON_CALL(section, GetLanes()).WillByDefault(ReturnRef(lanes));
 
     FakeRoadGeometry geometry;
-    ON_CALL(geometry, GetCoord(geometryOffset,_)).WillByDefault(Return(Common::Vector2d{101.0, 102.0}));
+    ON_CALL(geometry, GetCoord(geometryOffset,_)).WillByDefault(Return(Common::Vector2d<units::length::meter_t>{101.0_m, 102.0_m}));
 
     auto result = GeometryConverter::CalculateBorderPoints(&section, &road, &geometry, geometryOffset, roadOffset, roadSectionStart);
 
     ASSERT_THAT(result.s, Eq(roadOffset));
     ASSERT_THAT(result.points, SizeIs(3));
-    ASSERT_THAT(result.points.at(0).point, Eq(Common::Vector2d{101.0, 106.0}));
+    ASSERT_THAT(result.points.at(0).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 106.0_m}));
     ASSERT_THAT(result.points.at(0).lane, Eq(&lanePlus1));
-    ASSERT_THAT(result.points.at(1).point, Eq(Common::Vector2d{101.0, 102.0}));
+    ASSERT_THAT(result.points.at(1).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 102.0_m}));
     ASSERT_THAT(result.points.at(1).lane, Eq(&lane0));
-    ASSERT_THAT(result.points.at(2).point, Eq(Common::Vector2d{101.0, 99.0}));
+    ASSERT_THAT(result.points.at(2).point, Eq(Common::Vector2d<units::length::meter_t>{101.0_m, 99.0_m}));
     ASSERT_THAT(result.points.at(2).lane, Eq(&laneMinus1));
 }
 
@@ -205,10 +205,10 @@ double GetErrorBetweenOriginalAndSimplified (const std::vector<BorderPoints>& or
                 for (size_t i = 0; i < originalJoint.points.size(); i++)
                 //for (const auto currentPoint : originalJoint.points)
                 {
-                    point_t currentPointBoost{originalJoint.points[i].point.x, originalJoint.points[i].point.y};
+                    point_t currentPointBoost{originalJoint.points[i].point.x.value(), originalJoint.points[i].point.y.value()};
                     bg::model::linestring<point_t> line;
-                    bg::append(line, point_t{joint->points[i].point.x, joint->points[i].point.y});
-                    bg::append(line, point_t{(joint + 1)->points[i].point.x, (joint + 1)->points[i].point.y});
+                    bg::append(line, point_t{joint->points[i].point.x.value(), joint->points[i].point.y.value()});
+                    bg::append(line, point_t{(joint + 1)->points[i].point.x.value(), (joint + 1)->points[i].point.y.value()});
                     auto error = bg::distance(currentPointBoost, line);
                     maxError = std::max(maxError, error);
                 }
@@ -220,12 +220,7 @@ double GetErrorBetweenOriginalAndSimplified (const std::vector<BorderPoints>& or
 
 bool operator== (const LaneJoint& first, const LaneJoint& second)
 {
-    return first.lane == second.lane
-            && first.left == second.left
-            && first.center == second.center
-            && first.right == second.right
-            && std::abs(first.heading - second.heading) < 0.001
-            && std::abs(first.curvature - second.curvature) < 0.0001;
+    return first.lane == second.lane && first.left == second.left && first.center == second.center && first.right == second.right && units::math::abs(first.heading - second.heading) < 0.001_rad && units::math::abs(first.curvature - second.curvature) < 0.0001_i_m;
 }
 
 std::ostream& operator<<(std::ostream& os, const LaneJoint& point)
@@ -253,15 +248,9 @@ TEST(JointsBuilder_UnitTests, CalculatePoints_CalculatesCorrectCenterAndOuterPoi
     FakeRoadLane laneMinus2;
     ON_CALL(laneMinus2, GetId()).WillByDefault(Return(-2));
 
-    BorderPoints firstJoint {0.0, {BorderPoint{{100,100}, &lane1},
-                                   BorderPoint{{120, 90}, &lane0},
-                                    BorderPoint{{130, 80}, &laneMinus1},
-                                    BorderPoint{{160, 60}, &laneMinus2}}};
-    BorderPoints secondJoint {1000.0, {BorderPoint{{1100,100}, &lane1},
-                                       BorderPoint{{1120, 90}, &lane0},
-                                       BorderPoint{{1130, 80}, &laneMinus1},
-                                       BorderPoint{{1160, 60}, &laneMinus2}}};
-    JointsBuilder jointsBuilder({std::vector<BorderPoints>{{firstJoint, secondJoint}},0,0});
+    BorderPoints firstJoint{0.0_m, {BorderPoint{{100_m, 100_m}, &lane1}, BorderPoint{{120_m, 90_m}, &lane0}, BorderPoint{{130_m, 80_m}, &laneMinus1}, BorderPoint{{160_m, 60_m}, &laneMinus2}}};
+    BorderPoints secondJoint{1000.0_m, {BorderPoint{{1100_m, 100_m}, &lane1}, BorderPoint{{1120_m, 90_m}, &lane0}, BorderPoint{{1130_m, 80_m}, &laneMinus1}, BorderPoint{{1160_m, 60_m}, &laneMinus2}}};
+    JointsBuilder jointsBuilder({std::vector<BorderPoints>{{firstJoint, secondJoint}},0_rad,0_rad});
 
     jointsBuilder.CalculatePoints();
 
@@ -269,29 +258,29 @@ TEST(JointsBuilder_UnitTests, CalculatePoints_CalculatesCorrectCenterAndOuterPoi
 
     ASSERT_THAT(result, SizeIs(2));
     auto& firstResult = result.at(0);
-    ASSERT_THAT(firstResult.s, Eq(0.0));
-    ASSERT_THAT(firstResult.laneJoints, ElementsAre(std::make_pair(-2, LaneJoint{&laneMinus2, {130, 80}, {145, 70}, {160, 60}, 0.0, 0.0}),
-                                                    std::make_pair(-1, LaneJoint{&laneMinus1, {120, 90}, {125, 85}, {130, 80}, 0.0, 0.0}),
-                                                    std::make_pair(0, LaneJoint{&lane0, {120, 90}, {120, 90}, {120, 90}, 0.0, 0.0}),
-                                                    std::make_pair(1, LaneJoint{&lane1, {100, 100}, {110, 95}, {120, 90}, 0.0, 0.0})));
+    ASSERT_THAT(firstResult.s.value(), Eq(0.0));
+    ASSERT_THAT(firstResult.laneJoints, ElementsAre(std::make_pair(-2, LaneJoint{&laneMinus2, {130_m, 80_m}, {145_m, 70_m}, {160_m, 60_m}, 0.0_rad, 0.0_i_m}),
+                                                    std::make_pair(-1, LaneJoint{&laneMinus1, {120_m, 90_m}, {125_m, 85_m}, {130_m, 80_m}, 0.0_rad, 0.0_i_m}),
+                                                    std::make_pair(0, LaneJoint{&lane0, {120_m, 90_m}, {120_m, 90_m}, {120_m, 90_m}, 0.0_rad, 0.0_i_m}),
+                                                    std::make_pair(1, LaneJoint{&lane1, {100_m, 100_m}, {110_m, 95_m}, {120_m, 90_m}, 0.0_rad, 0.0_i_m})));
     auto& secondResult = result.at(1);
-    ASSERT_THAT(secondResult.s, Eq(1000.0));
-    ASSERT_THAT(secondResult.laneJoints, ElementsAre(std::make_pair(-2, LaneJoint{&laneMinus2, {1130, 80}, {1145, 70}, {1160, 60}, 0.0, 0.0}),
-                                                     std::make_pair(-1, LaneJoint{&laneMinus1, {1120, 90}, {1125, 85}, {1130, 80}, 0.0, 0.0}),
-                                                     std::make_pair(0, LaneJoint{&lane0, {1120, 90}, {1120, 90}, {1120, 90}, 0.0, 0.0}),
-                                                     std::make_pair(1, LaneJoint{&lane1, {1100, 100}, {1110, 95}, {1120, 90}, 0.0, 0.0})));
+    ASSERT_THAT(secondResult.s.value(), Eq(1000.0));
+    ASSERT_THAT(secondResult.laneJoints, ElementsAre(std::make_pair(-2, LaneJoint{&laneMinus2, {1130_m, 80_m}, {1145_m, 70_m}, {1160_m, 60_m}, 0.0_rad, 0.0_i_m}),
+                                                     std::make_pair(-1, LaneJoint{&laneMinus1, {1120_m, 90_m}, {1125_m, 85_m}, {1130_m, 80_m}, 0.0_rad, 0.0_i_m}),
+                                                     std::make_pair(0, LaneJoint{&lane0, {1120_m, 90_m}, {1120_m, 90_m}, {1120_m, 90_m}, 0.0_rad, 0.0_i_m}),
+                                                     std::make_pair(1, LaneJoint{&lane1, {1100_m, 100_m}, {1110_m, 95_m}, {1120_m, 90_m}, 0.0_rad, 0.0_i_m})));
 }
 
 TEST(JointsBuilder_UnitTests, CalculateHeadings)
 {
-    Joint firstJoint{0.0, {{-1, LaneJoint{nullptr, {}, {0,10}, {}, 0.0, 0.0}},
-                           {0, LaneJoint{nullptr, {}, {0,0}, {}, 0.0, 0.0}}}};
-    Joint secondJoint{10.0, {{-1, LaneJoint{nullptr, {}, {10,10}, {}, 0.0, 0.0}},
-                           {0, LaneJoint{nullptr, {}, {10,0}, {}, 0.0, 0.0}}}};
-    Joint thirdJoint{20.0, {{-1, LaneJoint{nullptr, {}, {20,0}, {}, 0.0, 0.0}},
-                           {0, LaneJoint{nullptr, {}, {20,10}, {}, 0.0, 0.0}}}};
-    Joint forthJoint{30.0, {{-1, LaneJoint{nullptr, {}, {20,-10}, {}, 0.0, 0.0}},
-                           {0, LaneJoint{nullptr, {}, {10,20}, {}, 0.0, 0.0}}}};
+    Joint firstJoint{0.0_m, {{-1, LaneJoint{nullptr, {}, {0_m,10_m}, {}, 0.0_rad, 0.0_i_m}},
+                           {0, LaneJoint{nullptr, {}, {0_m,0_m}, {}, 0.0_rad, 0.0_i_m}}}};
+    Joint secondJoint{10.0_m, {{-1, LaneJoint{nullptr, {}, {10_m,10_m}, {}, 0.0_rad, 0.0_i_m}},
+                           {0, LaneJoint{nullptr, {}, {10_m,0_m}, {}, 0.0_rad, 0.0_i_m}}}};
+    Joint thirdJoint{20.0_m, {{-1, LaneJoint{nullptr, {}, {20_m,0_m}, {}, 0.0_rad, 0.0_i_m}},
+                           {0, LaneJoint{nullptr, {}, {20_m,10_m}, {}, 0.0_rad, 0.0_i_m}}}};
+    Joint forthJoint{30.0_m, {{-1, LaneJoint{nullptr, {}, {20_m,-10_m}, {}, 0.0_rad, 0.0_i_m}},
+                           {0, LaneJoint{nullptr, {}, {10_m,20_m}, {}, 0.0_rad, 0.0_i_m}}}};
 
     JointsBuilder jointsBuilder({}, Joints{firstJoint, secondJoint, thirdJoint, forthJoint});
 
@@ -301,31 +290,27 @@ TEST(JointsBuilder_UnitTests, CalculateHeadings)
 
     ASSERT_THAT(result, SizeIs(4));
     auto& firstResult = result.at(0);
-    ASSERT_THAT(firstResult.s, Eq(0.0));
-    ASSERT_THAT(firstResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {0, 10}, {}, 0.0, 0.0}),
-                                                    std::make_pair(0, LaneJoint{nullptr, {}, {0, 0}, {}, 0.0, 0.0})));
+    ASSERT_THAT(firstResult.s.value(), Eq(0.0));
+    ASSERT_THAT(firstResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {0_m, 10_m}, {}, 0.0_rad, 0.0_i_m}),
+                                                    std::make_pair(0, LaneJoint{nullptr, {}, {0_m, 0_m}, {}, 0.0_rad, 0.0_i_m})));
     auto& secondResult = result.at(1);
-    ASSERT_THAT(secondResult.s, Eq(10.0));
-    ASSERT_THAT(secondResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {10, 10}, {}, -M_PI_4, 0.0}),
-                                                    std::make_pair(0, LaneJoint{nullptr, {}, {10, 0}, {}, M_PI_4, 0.0})));
+    ASSERT_THAT(secondResult.s.value(), Eq(10.0));
+    ASSERT_THAT(secondResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {10_m, 10_m}, {}, -45_deg, 0.0_i_m}),
+                                                    std::make_pair(0, LaneJoint{nullptr, {}, {10_m, 0_m}, {}, 45_deg, 0.0_i_m})));
     auto& thirdResult = result.at(2);
-    ASSERT_THAT(thirdResult.s, Eq(20.0));
-    ASSERT_THAT(thirdResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {20, 0}, {}, -M_PI_2, 0.0}),
-                                                    std::make_pair(0, LaneJoint{nullptr, {}, {20, 10}, {}, 3 * M_PI_4, 0.0})));
+    ASSERT_THAT(thirdResult.s.value(), Eq(20.0));
+    ASSERT_THAT(thirdResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {20_m, 0_m}, {}, -90_deg, 0.0_i_m}),
+                                                    std::make_pair(0, LaneJoint{nullptr, {}, {20_m, 10_m}, {}, 135_deg, 0.0_i_m})));
 }
 
 TEST(JointsBuilder_UnitTests, CalculateCurvatures)
 {
-    Joint firstJoint{0.0, {{-1, LaneJoint{nullptr, {}, {0,0}, {}, 0.5, 0.0}},
-                           {0, LaneJoint{nullptr, {}, {0,10}, {}, 1.0, 0.0}}}};
-    Joint secondJoint{10.0, {{-1, LaneJoint{nullptr, {}, {10,0}, {}, 1.0, 0.0}},
-                           {0, LaneJoint{nullptr, {}, {10,10}, {}, 2.0, 0.0}}}};
-    Joint thirdJoint{20.0, {{-1, LaneJoint{nullptr, {}, {40,0}, {}, 0.0, 0.0}},
-                           {0, LaneJoint{nullptr, {}, {40,10}, {}, 1.0, 0.0}}}};
-    Joint forthJoint{30.0, {{-1, LaneJoint{nullptr, {}, {50,0}, {}, 0.0, 0.0}},
-                           {0, LaneJoint{nullptr, {}, {50,10}, {}, 0.0, 0.0}}}};
+    Joint firstJoint{0.0_m, {{-1, LaneJoint{nullptr, {}, {0_m, 0_m}, {}, 0.5_rad, 0.0_i_m}}, {0, LaneJoint{nullptr, {}, {0_m, 10_m}, {}, 1.0_rad, 0.0_i_m}}}};
+    Joint secondJoint{10.0_m, {{-1, LaneJoint{nullptr, {}, {10_m, 0_m}, {}, 1.0_rad, 0.0_i_m}}, {0, LaneJoint{nullptr, {}, {10_m, 10_m}, {}, 2.0_rad, 0.0_i_m}}}};
+    Joint thirdJoint{20.0_m, {{-1, LaneJoint{nullptr, {}, {40_m, 0_m}, {}, 0.0_rad, 0.0_i_m}}, {0, LaneJoint{nullptr, {}, {40_m, 10_m}, {}, 1.0_rad, 0.0_i_m}}}};
+    Joint forthJoint{30.0_m, {{-1, LaneJoint{nullptr, {}, {50_m, 0_m}, {}, 0.0_rad, 0.0_i_m}}, {0, LaneJoint{nullptr, {}, {50_m, 10_m}, {}, 0.0_rad, 0.0_i_m}}}};
 
-    JointsBuilder jointsBuilder({{}, 0.5, -0.5}, Joints{firstJoint, secondJoint, thirdJoint, forthJoint});
+    JointsBuilder jointsBuilder({{}, 0.5_rad, -0.5_rad}, Joints{firstJoint, secondJoint, thirdJoint, forthJoint});
 
     jointsBuilder.CalculateCurvatures();
 
@@ -333,38 +318,38 @@ TEST(JointsBuilder_UnitTests, CalculateCurvatures)
 
     ASSERT_THAT(result, SizeIs(4));
     auto& firstResult = result.at(0);
-    ASSERT_THAT(firstResult.s, Eq(0.0));
-    ASSERT_THAT(firstResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {0, 0}, {}, 0.5, 0.0}),
-                                                    std::make_pair(0, LaneJoint{nullptr, {}, {0, 10}, {}, 1.0, 0.1})));
+    ASSERT_THAT(firstResult.s.value(), Eq(0.0));
+    ASSERT_THAT(firstResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {0_m, 0_m}, {}, 0.5_rad, 0.0_i_m}),
+                                                    std::make_pair(0, LaneJoint{nullptr, {}, {0_m, 10_m}, {}, 1.0_rad, 0.1_i_m})));
     auto& secondResult = result.at(1);
-    ASSERT_THAT(secondResult.s, Eq(10.0));
-    ASSERT_THAT(secondResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {10, 0}, {}, 1.0, 0.025}),
-                                                    std::make_pair(0, LaneJoint{nullptr, {}, {10, 10}, {}, 2.0, 0.05})));
-    auto& thirdResult = result.at(2);
-    ASSERT_THAT(thirdResult.s, Eq(20.0));
-    ASSERT_THAT(thirdResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {40, 0}, {}, 0.0, -0.05}),
-                                                    std::make_pair(0, LaneJoint{nullptr, {}, {40, 10}, {}, 1.0, -0.05})));
-    auto& forthResult = result.at(3);
-    ASSERT_THAT(forthResult.s, Eq(30.0));
-    ASSERT_THAT(forthResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {50, 0}, {}, 0.0, -0.1}),
-                                                    std::make_pair(0, LaneJoint{nullptr, {}, {50, 10}, {}, 0.0, -0.3})));
+    ASSERT_THAT(secondResult.s.value(), Eq(10.0));
+    ASSERT_THAT(secondResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {10_m, 0_m}, {}, 1.0_rad, 0.025_i_m}),
+                                                     std::make_pair(0, LaneJoint{nullptr, {}, {10_m, 10_m}, {}, 2.0_rad, 0.05_i_m})));
+    auto &thirdResult = result.at(2);
+    ASSERT_THAT(thirdResult.s.value(), Eq(20.0));
+    ASSERT_THAT(thirdResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {40_m, 0_m}, {}, 0.0_rad, -0.05_i_m}),
+                                                    std::make_pair(0, LaneJoint{nullptr, {}, {40_m, 10_m}, {}, 1.0_rad, -0.05_i_m})));
+    auto &forthResult = result.at(3);
+    ASSERT_THAT(forthResult.s.value(), Eq(30.0));
+    ASSERT_THAT(forthResult.laneJoints, ElementsAre(std::make_pair(-1, LaneJoint{nullptr, {}, {50_m, 0_m}, {}, 0.0_rad, -0.1_i_m}),
+                                                    std::make_pair(0, LaneJoint{nullptr, {}, {50_m, 10_m}, {}, 0.0_rad, -0.3_i_m})));
 }
 
 TEST_P(RamerDouglasPeucker_UnitTests, Simplify)
 {
-    auto& input = GetParam().input;
+    auto &input = GetParam().input;
     auto result = RamerDouglasPeucker::Simplify<BorderPoints>(input);
 
     ASSERT_THAT(GetErrorBetweenOriginalAndSimplified(input, result), Le(RamerDouglasPeucker::ERROR_THRESHOLD));
 }
 
-BorderPoints joint0    {   0.0, {BorderPoint{{0,0},    nullptr}, BorderPoint{   {0,1},    nullptr}, BorderPoint{{0,3},    nullptr}}};
-BorderPoints joint1000 {1000.0, {BorderPoint{{1000,0}, nullptr}, BorderPoint{{1000,1},    nullptr}, BorderPoint{{1000,3}, nullptr}}};
-BorderPoints joint500a { 500.0, {BorderPoint{{500,0},  nullptr}, BorderPoint{ {500,1},    nullptr}, BorderPoint{{500,3},  nullptr}}};
-BorderPoints joint500b { 500.0, {BorderPoint{{500,1},  nullptr}, BorderPoint{ {500,2},    nullptr}, BorderPoint{{500,4},  nullptr}}};
-BorderPoints joint600b { 600.0, {BorderPoint{{600,1},  nullptr}, BorderPoint{ {600,1.99}, nullptr}, BorderPoint{{600,4},  nullptr}}};
-BorderPoints joint600c { 600.0, {BorderPoint{{600,1},  nullptr}, BorderPoint{ {600,2.5},  nullptr}, BorderPoint{{600,4},  nullptr}}};
-BorderPoints joint700b { 700.0, {BorderPoint{{700,1},  nullptr}, BorderPoint{ {700,2},    nullptr}, BorderPoint{{700,4},  nullptr}}};
+BorderPoints joint0{0.0_m, {BorderPoint{{0_m, 0_m}, nullptr}, BorderPoint{{0_m, 1_m}, nullptr}, BorderPoint{{0_m, 3_m}, nullptr}}};
+BorderPoints joint1000{1000.0_m, {BorderPoint{{1000_m, 0_m}, nullptr}, BorderPoint{{1000_m, 1_m}, nullptr}, BorderPoint{{1000_m, 3_m}, nullptr}}};
+BorderPoints joint500a{500.0_m, {BorderPoint{{500_m, 0_m}, nullptr}, BorderPoint{{500_m, 1_m}, nullptr}, BorderPoint{{500_m, 3_m}, nullptr}}};
+BorderPoints joint500b{500.0_m, {BorderPoint{{500_m, 1_m}, nullptr}, BorderPoint{{500_m, 2_m}, nullptr}, BorderPoint{{500_m, 4_m}, nullptr}}};
+BorderPoints joint600b{600.0_m, {BorderPoint{{600_m, 1_m}, nullptr}, BorderPoint{{600_m, 1.99_m}, nullptr}, BorderPoint{{600_m, 4_m}, nullptr}}};
+BorderPoints joint600c{600.0_m, {BorderPoint{{600_m, 1_m}, nullptr}, BorderPoint{{600_m, 2.5_m}, nullptr}, BorderPoint{{600_m, 4_m}, nullptr}}};
+BorderPoints joint700b{700.0_m, {BorderPoint{{700_m, 1_m}, nullptr}, BorderPoint{{700_m, 2_m}, nullptr}, BorderPoint{{700_m, 4_m}, nullptr}}};
 
 INSTANTIATE_TEST_CASE_P(RamerDouglasPeucker_UnitTests, RamerDouglasPeucker_UnitTests,
                         Values(
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/lane_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/lane_Tests.cpp
index 962694438c280c00efcbdd0ac04fbc0df1c70d8c..0bce0ff1499fd5517806240f5f609a2f2c6a529c 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/lane_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/lane_Tests.cpp
@@ -33,30 +33,30 @@ using ::testing::AllOf;
 /////////////////////////////////////////////////////////////////////////////
 TEST(GetNeighbouringJoints, DistanceBetweenTwoJoints_ReturnsJoints)
 {
-    const double length = 10.0;
+    const units::length::meter_t length{10.0};
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
-    0.0,           // width
+    { 0.0_m, 0.0_m },  // origin
+    0.0_m,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
 
     const OWL::Primitive::LaneGeometryJoint* prevJoint;
     const OWL::Primitive::LaneGeometryJoint* nextJoint;
@@ -66,136 +66,136 @@ TEST(GetNeighbouringJoints, DistanceBetweenTwoJoints_ReturnsJoints)
     ASSERT_NE(prevJoint, nullptr);
     ASSERT_NE(nextJoint, nullptr);
 
-    ASSERT_EQ(prevJoint->points.reference.x, 0.0);
+    ASSERT_EQ(prevJoint->points.reference.x.value(), 0.0);
     ASSERT_EQ(nextJoint->points.reference.x, length);
 }
 
 TEST(GetNeighbouringJoints, DistanceAtPrevJoint_ReturnsJoints)
 {
-    const double length = 10.0;
+    const units::length::meter_t length = 10.0_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
-    0.0,           // width
+    { 0.0_m, 0.0_m },  // origin
+    0.0_m,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
 
     const OWL::Primitive::LaneGeometryJoint* prevJoint;
     const OWL::Primitive::LaneGeometryJoint* nextJoint;
 
-    std::tie(prevJoint, nextJoint) = lane.GetNeighbouringJoints(0.0);
+    std::tie(prevJoint, nextJoint) = lane.GetNeighbouringJoints(0.0_m);
 
     ASSERT_NE(prevJoint, nullptr);
     ASSERT_NE(nextJoint, nullptr);
 
-    ASSERT_EQ(prevJoint->points.reference.x, 0.0);
+    ASSERT_EQ(prevJoint->points.reference.x.value(), 0.0);
     ASSERT_EQ(nextJoint->points.reference.x, length);
 }
 
 TEST(GetNeighbouringJoints, DistanceAtNextJoint_ReturnsPrevJointOnly)
 {
-    const double length = 10.0;
+    const units::length::meter_t length = 10.0_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
-    0.0,           // width
+    { 0.0_m, 0.0_m },  // origin
+    0.0_m,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
 
     const OWL::Primitive::LaneGeometryJoint* prevJoint;
     const OWL::Primitive::LaneGeometryJoint* nextJoint;
 
-    std::tie(prevJoint, nextJoint) = lane.GetNeighbouringJoints(10.0);
+    std::tie(prevJoint, nextJoint) = lane.GetNeighbouringJoints(10.0_m);
 
     ASSERT_NE(prevJoint, nullptr);
     ASSERT_EQ(nextJoint, nullptr);
 
-    ASSERT_EQ(prevJoint->points.reference.x, 10.0);
+    ASSERT_EQ(prevJoint->points.reference.x.value(), 10.0);
 }
 
 TEST(GetNeighbouringJoints, DistanceAtMiddleJoint_ReturnsJoints)
 {
-    const double length = 10.0;
+    const units::length::meter_t length = 10.0_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement1 =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
-    0.0,           // width
+    { 0.0_m, 0.0_m },  // origin
+    0.0_m,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     auto laneGeometryElement2 =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 10.0, 0.0 }, // origin
-    0.0,           // width
+    { 10.0_m, 0.0_m }, // origin
+    0.0_m,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement1.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement2.joints.current;
     const OWL::Primitive::LaneGeometryJoint& thirdJoint = laneGeometryElement2.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
-    Common::Vector2d leftPoint3 = thirdJoint.points.left;
-    Common::Vector2d referencePoint3 = thirdJoint.points.reference;
-    Common::Vector2d rightPoint3 = thirdJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint3 = thirdJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint3 = thirdJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint3 = thirdJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint3, referencePoint3, rightPoint3, 2.0 * length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint3, referencePoint3, rightPoint3, 2.0 * length, 0.0_i_m, 0.0_rad);
 
     const OWL::Primitive::LaneGeometryJoint* prevJoint;
     const OWL::Primitive::LaneGeometryJoint* nextJoint;
 
-    std::tie(prevJoint, nextJoint) = lane.GetNeighbouringJoints(10.0);
+    std::tie(prevJoint, nextJoint) = lane.GetNeighbouringJoints(10.0_m);
 
     ASSERT_NE(prevJoint, nullptr);
     ASSERT_NE(nextJoint, nullptr);
 
-    ASSERT_EQ(prevJoint->points.reference.x, 10.0);
-    ASSERT_EQ(nextJoint->points.reference.x, 20.0);
+    ASSERT_EQ(prevJoint->points.reference.x.value(), 10.0);
+    ASSERT_EQ(nextJoint->points.reference.x.value(), 20.0);
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -203,33 +203,33 @@ TEST(GetNeighbouringJoints, DistanceAtMiddleJoint_ReturnsJoints)
 
 TEST(GetInterpolatedPointsAtDistance, DistanceAtPrevJoint_ReturnsPrevJoint)
 {
-    const double length = 10.0;
-    const double width = 3.75;
+    const units::length::meter_t length = 10.0_m;
+    const units::length::meter_t width = 3.75_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
 
-    const OWL::Primitive::LaneGeometryJoint::Points ipPoints = lane.GetInterpolatedPointsAtDistance(0.0);
+    const OWL::Primitive::LaneGeometryJoint::Points ipPoints = lane.GetInterpolatedPointsAtDistance(0.0_m);
 
     ASSERT_NE(&firstJoint, &secondJoint);
     ASSERT_NE(&firstJoint, nullptr);
@@ -240,33 +240,33 @@ TEST(GetInterpolatedPointsAtDistance, DistanceAtPrevJoint_ReturnsPrevJoint)
 
 TEST(GetInterpolatedPointsAtDistance, DistanceAtNextJoint_ReturnsNextJoint)
 {
-    const double length = 10.0;
-    const double width = 3.75;
+    const units::length::meter_t length = 10.0_m;
+    const units::length::meter_t width = 3.75_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
 
-    const OWL::Primitive::LaneGeometryJoint::Points ipPoints = lane.GetInterpolatedPointsAtDistance(10.0);
+    const OWL::Primitive::LaneGeometryJoint::Points ipPoints = lane.GetInterpolatedPointsAtDistance(10.0_m);
 
     ASSERT_NE(&firstJoint, &secondJoint);
     ASSERT_NE(&firstJoint, nullptr);
@@ -277,35 +277,35 @@ TEST(GetInterpolatedPointsAtDistance, DistanceAtNextJoint_ReturnsNextJoint)
 
 TEST(GetInterpolatedPointsAtDistance, DistanceBetweenJoints_ReturnsInterpolatedPoint)
 {
-    const double length = 10.0;
-    const double width = 4.0;
-    const double distance = 5.0;
+    const units::length::meter_t length = 10.0_m;
+    const units::length::meter_t width = 4.0_m;
+    const units::length::meter_t distance = 5.0_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
 
     const OWL::Primitive::LaneGeometryJoint::Points ipPoints = lane.GetInterpolatedPointsAtDistance(distance);
-    const Common::Vector2d defaultValues;
+    const Common::Vector2d<units::length::meter_t> defaultValues;
 
     ASSERT_NE(&firstJoint, &secondJoint);
     ASSERT_NE(&firstJoint, nullptr);
@@ -313,7 +313,7 @@ TEST(GetInterpolatedPointsAtDistance, DistanceBetweenJoints_ReturnsInterpolatedP
     ASSERT_EQ(ipPoints.left.y, width/2);
 
     ASSERT_EQ(ipPoints.reference.x, distance);
-    ASSERT_EQ(ipPoints.reference.y, 0.0);
+    ASSERT_EQ(ipPoints.reference.y.value(), 0.0);
 
     ASSERT_EQ(ipPoints.right.x, distance);
     ASSERT_EQ(ipPoints.right.y, -width/2);
@@ -321,35 +321,35 @@ TEST(GetInterpolatedPointsAtDistance, DistanceBetweenJoints_ReturnsInterpolatedP
 
 TEST(GetInterpolatedPointsAtDistance, DistanceBetweenJointsWithHeading_ReturnsInterpolatedPoint)
 {
-    const double length = 10.0;
-    const double width = 4.0;
-    const double distance = 5.0;
+    const units::length::meter_t length = 10.0_m;
+    const units::length::meter_t width = 4.0_m;
+    const units::length::meter_t distance = 5.0_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,           // width
     length,
-    M_PI/4);          // heading
+    45_deg);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
 
     const OWL::Primitive::LaneGeometryJoint::Points ipPoints = lane.GetInterpolatedPointsAtDistance(distance);
-    const Common::Vector2d defaultValues;
+    const Common::Vector2d<units::length::meter_t> defaultValues;
 
     ASSERT_NE(&firstJoint, &secondJoint);
     ASSERT_NE(&firstJoint, nullptr);
@@ -367,16 +367,16 @@ TEST(GetInterpolatedPointsAtDistance, DistanceBetweenJointsWithHeading_ReturnsIn
 
 TEST(GetLaneWidth, LaneWidthQueryOnTriangularLane_ReturnsZeroWidthAtStartAndFullWidthAtEnd)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = 0.0;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 0.0_rad;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::TriangularLaneGeometryElement(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     heading);
@@ -384,33 +384,33 @@ TEST(GetLaneWidth, LaneWidthQueryOnTriangularLane_ReturnsZeroWidthAtStartAndFull
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, heading);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, heading);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetWidth(0.0), 0.0);
-    ASSERT_DOUBLE_EQ(lane.GetWidth(length), width);
+    ASSERT_DOUBLE_EQ(lane.GetWidth(0.0_m).value(), 0.0);
+    ASSERT_EQ(lane.GetWidth(length).value(), width.value());
 }
 
 TEST(GetLaneWidth, LaneWidthQueryOnTriangularLane_ReturnsCorrectlyInterpolatedWidth)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = 0.0;
-    const double queryPosition = 3.0;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 0.0_rad;
+    const units::length::meter_t queryPosition = 3.0_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::TriangularLaneGeometryElement(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     heading);
@@ -418,32 +418,32 @@ TEST(GetLaneWidth, LaneWidthQueryOnTriangularLane_ReturnsCorrectlyInterpolatedWi
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, heading);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, heading);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetWidth(queryPosition), width / length * queryPosition);
+    ASSERT_EQ(lane.GetWidth(queryPosition).value(), width.value() / length.value() * queryPosition.value());
 }
 
 TEST(GetLaneWidth, LaneWidthQueryOnRotatedTriangularLane_ReturnsCorrectlyInterpolatedWidth)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = M_PI / 6.0;
-    const double queryPosition = 3.0;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 30_deg;
+    const units::length::meter_t queryPosition = 3.0_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::TriangularLaneGeometryElement(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     heading);
@@ -451,31 +451,31 @@ TEST(GetLaneWidth, LaneWidthQueryOnRotatedTriangularLane_ReturnsCorrectlyInterpo
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, heading);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, heading);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetWidth(queryPosition), width / length * queryPosition);
+    ASSERT_EQ(lane.GetWidth(queryPosition).value(), width.value() / length.value() * queryPosition.value());
 }
 
 TEST(DISABLED_GetLaneWidth, LaneWidthQueryOnRectangularLane_ReturnsFullWidthAtStartAndEnd)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = 0.0;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 0.0_rad;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     heading);
@@ -483,36 +483,36 @@ TEST(DISABLED_GetLaneWidth, LaneWidthQueryOnRectangularLane_ReturnsFullWidthAtSt
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, heading);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, heading);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetWidth(0.0), width);
-    ASSERT_DOUBLE_EQ(lane.GetWidth(length), width);
+    ASSERT_EQ(lane.GetWidth(0.0_m), width);
+    ASSERT_EQ(lane.GetWidth(length), width);
 }
 
 /////////////////////////////////////////////////////////////////////////////
 
 TEST(GetLaneCurvature, LaneCurvatureQueryOnCurvedLane_ReturnsZeroCurvatureAtStartAndFullCurvatureAtEnd)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = 0.0;
-    const double curvatureStart = 0.2;
-    const double curvatureEnd = 0.5;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 0.0_rad;
+    const units::curvature::inverse_meter_t curvatureStart = 0.2_i_m;
+    const units::curvature::inverse_meter_t curvatureEnd = 0.5_i_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElementWithCurvature(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     curvatureStart,
@@ -522,38 +522,38 @@ TEST(GetLaneCurvature, LaneCurvatureQueryOnCurvedLane_ReturnsZeroCurvatureAtStar
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    double curvature1 = firstJoint.curvature;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
-    double curvature2 = secondJoint.curvature;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    units::curvature::inverse_meter_t curvature1 = firstJoint.curvature;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
+    units::curvature::inverse_meter_t curvature2 = secondJoint.curvature;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, curvature1, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, curvature1, heading);
     lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, curvature2, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetCurvature(0.0), curvatureStart);
-    ASSERT_DOUBLE_EQ(lane.GetCurvature(length), curvatureEnd);
+    ASSERT_EQ(lane.GetCurvature(0.0_m), curvatureStart);
+    ASSERT_EQ(lane.GetCurvature(length), curvatureEnd);
 }
 
 TEST(GetLaneCurvature, LaneCurvatureQueryOnCurvedLane_ReturnsCorrectlyInterpolatedCurvature)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = 0.0;
-    const double queryPosition = 3.0;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 0.0_rad;
+    const units::length::meter_t queryPosition = 3.0_m;
 
-    const double curvatureStart = 0.2;
-    const double curvatureEnd = 0.5;
+    const units::curvature::inverse_meter_t curvatureStart = 0.2_i_m;
+    const units::curvature::inverse_meter_t curvatureEnd = 0.5_i_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElementWithCurvature(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     curvatureStart,
@@ -563,38 +563,38 @@ TEST(GetLaneCurvature, LaneCurvatureQueryOnCurvedLane_ReturnsCorrectlyInterpolat
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    double curvature1 = firstJoint.curvature;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
-    double curvature2 = secondJoint.curvature;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    units::curvature::inverse_meter_t curvature1 = firstJoint.curvature;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
+    units::curvature::inverse_meter_t curvature2 = secondJoint.curvature;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, curvature1, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, curvature1, heading);
     lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, curvature2, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetCurvature(queryPosition),
+    ASSERT_EQ(lane.GetCurvature(queryPosition),
                      curvatureStart + (curvatureEnd - curvatureStart) / length * queryPosition);
 }
 
 TEST(GetLaneCurvature, LaneCurvatureQueryOnRotatedCurvedLane_ReturnsCorrectlyInterpolatedCurvature)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = M_PI / 6.0;
-    const double queryPosition = 3.0;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 30_deg;
+    const units::length::meter_t queryPosition = 3.0_m;
 
-    const double curvatureStart = 0.2;
-    const double curvatureEnd = 0.5;
+    const units::curvature::inverse_meter_t curvatureStart = 0.2_i_m;
+    const units::curvature::inverse_meter_t curvatureEnd = 0.5_i_m;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElementWithCurvature(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     curvatureStart,
@@ -604,34 +604,34 @@ TEST(GetLaneCurvature, LaneCurvatureQueryOnRotatedCurvedLane_ReturnsCorrectlyInt
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    double curvature1 = firstJoint.curvature;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
-    double curvature2 = secondJoint.curvature;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    units::curvature::inverse_meter_t curvature1 = firstJoint.curvature;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
+    units::curvature::inverse_meter_t curvature2 = secondJoint.curvature;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, curvature1, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, curvature1, heading);
     lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, curvature2, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetCurvature(queryPosition),
+    ASSERT_EQ(lane.GetCurvature(queryPosition),
                      curvatureStart + (curvatureEnd - curvatureStart) / length * queryPosition);
 }
 
 TEST(GetLaneCurvature, LaneCurvatureQueryOnStraightLane_ReturnsZeroCurvature)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = 0.0;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 0.0_rad;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     heading);
@@ -639,37 +639,37 @@ TEST(GetLaneCurvature, LaneCurvatureQueryOnStraightLane_ReturnsZeroCurvature)
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    double curvature1 = firstJoint.curvature;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
-    double curvature2 = secondJoint.curvature;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    units::curvature::inverse_meter_t curvature1 = firstJoint.curvature;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
+    units::curvature::inverse_meter_t curvature2 = secondJoint.curvature;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, curvature1, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, curvature1, heading);
     lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, curvature2, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetCurvature(0.0), 0.0);
-    ASSERT_DOUBLE_EQ(lane.GetCurvature(length / 2.0), 0.0);
-    ASSERT_DOUBLE_EQ(lane.GetCurvature(length), 0.0);
+    ASSERT_DOUBLE_EQ(lane.GetCurvature(0.0_m).value(), 0.0);
+    ASSERT_DOUBLE_EQ(lane.GetCurvature(length / 2.0).value(), 0.0);
+    ASSERT_DOUBLE_EQ(lane.GetCurvature(length).value(), 0.0);
 }
 
 /////////////////////////////////////////////////////////////////////////////
 
 TEST(GetLaneDirection, LaneWidthQueryOnRotatedStraightLane_ReturnsCorrectDirection)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = M_PI / 6.0;
+    const units::length::meter_t width = 3.75_m;
+    const units::length::meter_t length = 10_m;
+    const units::angle::radian_t heading = 30_deg;
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0},  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     heading);
@@ -677,35 +677,35 @@ TEST(GetLaneDirection, LaneWidthQueryOnRotatedStraightLane_ReturnsCorrectDirecti
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, heading);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, heading);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, heading);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetDirection(0.0), heading);
-    ASSERT_DOUBLE_EQ(lane.GetDirection(length / 2.0), heading);
-    ASSERT_DOUBLE_EQ(lane.GetDirection(length), heading);
+    ASSERT_EQ(lane.GetDirection(0.0_m), heading);
+    ASSERT_EQ(lane.GetDirection(length / 2.0), heading);
+    ASSERT_EQ(lane.GetDirection(length), heading);
 }
 
 TEST(GetLaneDirection, LaneWidthQueryOnRotatedConstantlyCurvedLane_ReturnsCorrectDirection)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = M_PI / 6.0;
-    const double curvatureStart = 0.2;
-    const double curvatureEnd = 0.2;
+    const units::length::meter_t width{3.75};
+    const units::length::meter_t length{10};
+    const units::angle::radian_t heading{30_deg};
+    const units::curvature::inverse_meter_t curvatureStart{0.2};
+    const units::curvature::inverse_meter_t curvatureEnd{0.2};
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElementWithCurvature(
-    { 0.0, 0.0 },  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     curvatureStart,
@@ -715,39 +715,39 @@ TEST(GetLaneDirection, LaneWidthQueryOnRotatedConstantlyCurvedLane_ReturnsCorrec
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    double curvature1 = firstJoint.curvature;
-    double direction1 = firstJoint.sHdg;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
-    double curvature2 = secondJoint.curvature;
-    double direction2 = firstJoint.sHdg;
-
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, curvature1, heading);
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    units::curvature::inverse_meter_t curvature1 = firstJoint.curvature;
+    units::angle::radian_t direction1 = firstJoint.sHdg;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
+    units::curvature::inverse_meter_t curvature2 = secondJoint.curvature;
+    units::angle::radian_t direction2 = firstJoint.sHdg;
+
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, curvature1, heading);
     lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, curvature2, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetDirection(0.0), direction1);
-    ASSERT_DOUBLE_EQ(lane.GetDirection(length / 2.0), direction1 + (direction2 - direction1) * length / 2.0);
-    ASSERT_DOUBLE_EQ(lane.GetDirection(length), direction2);
+    ASSERT_EQ(lane.GetDirection(0.0_m), direction1);
+    ASSERT_EQ(lane.GetDirection(length / 2.0), direction1 + (direction2 - direction1) * length / 2.0_m);
+    ASSERT_EQ(lane.GetDirection(length), direction2);
 }
 
 TEST(GetLaneDirection, LaneWidthQueryOnRotatedCurvedLane_ReturnsCorrectDirection)
 {
-    const double width = 3.75;
-    const double length = 10;
-    const double heading = M_PI / 6.0;
-    const double curvatureStart = 0.2;
-    const double curvatureEnd = 0.8;
+    const units::length::meter_t width{3.75};
+    const units::length::meter_t length{10};
+    const units::angle::radian_t heading{30_deg};
+    const units::curvature::inverse_meter_t curvatureStart{0.2};
+    const units::curvature::inverse_meter_t curvatureEnd{0.8};
 
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto elementUnderTest =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElementWithCurvature(
-    { 0.0, 0.0 },  // origin
+    { 0.0_m, 0.0_m },  // origin
     width,
     length,
     curvatureStart,
@@ -757,21 +757,21 @@ TEST(GetLaneDirection, LaneWidthQueryOnRotatedCurvedLane_ReturnsCorrectDirection
     const OWL::Primitive::LaneGeometryJoint& firstJoint = elementUnderTest.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = elementUnderTest.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    double curvature1 = firstJoint.curvature;
-    double direction1 = firstJoint.sHdg;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
-    double curvature2 = secondJoint.curvature;
-    double direction2 = firstJoint.sHdg;
-
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, curvature1, heading);
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    units::curvature::inverse_meter_t curvature1 = firstJoint.curvature;
+    units::angle::radian_t direction1 = firstJoint.sHdg;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
+    units::curvature::inverse_meter_t curvature2 = secondJoint.curvature;
+    units::angle::radian_t direction2 = firstJoint.sHdg;
+
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, curvature1, heading);
     lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, curvature2, heading);
 
-    ASSERT_DOUBLE_EQ(lane.GetDirection(0.0), direction1);
-    ASSERT_DOUBLE_EQ(lane.GetDirection(length / 2.0), direction1 + (direction2 - direction1) * length / 2.0);
-    ASSERT_DOUBLE_EQ(lane.GetDirection(length), direction2);
+    ASSERT_EQ(lane.GetDirection(0.0_m), direction1);
+    ASSERT_EQ(lane.GetDirection(length / 2.0), direction1 + (direction2 - direction1) * length / 2.0_m);
+    ASSERT_EQ(lane.GetDirection(length), direction2);
 }
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/locator_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/locator_Tests.cpp
index 3a6f82c5082a8fb66cd3c71fc889851a67ab5ffe..249916b7cda2477ab285c1a9133acc36bf5b5844 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/locator_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/locator_Tests.cpp
@@ -28,9 +28,11 @@ using ::testing::IsEmpty;
 using ::testing::UnorderedElementsAreArray;
 using ::testing::ElementsAre;
 
-std::vector<Common::Vector2d> GenerateRectangularPolygon(double x_min, double x_max, double y_min, double y_max)
+using namespace units::literals;
+
+std::vector<Common::Vector2d<units::length::meter_t>> GenerateRectangularPolygon(units::length::meter_t x_min, units::length::meter_t x_max, units::length::meter_t y_min, units::length::meter_t y_max)
 {
-    std::vector<Common::Vector2d> points;
+    std::vector<Common::Vector2d<units::length::meter_t>> points;
     points.emplace_back(x_min, y_max);
     points.emplace_back(x_max, y_max);
     points.emplace_back(x_max, y_min);
@@ -45,7 +47,7 @@ public:
     {
         ON_CALL(lane, GetId()).WillByDefault(Return(idLane));
         ON_CALL(lane, GetOdId()).WillByDefault(Return(-1));
-        ON_CALL(lane, GetWidth(_)).WillByDefault(Return(4));
+        ON_CALL(lane, GetWidth(_)).WillByDefault(Return(4_m));
         ON_CALL(road, GetId()).WillByDefault(ReturnRef(idRoad));
         ON_CALL(lane, GetRoad()).WillByDefault(ReturnRef(road));
     }
@@ -55,16 +57,16 @@ public:
     OWL::Id idLane{1};
     std::string idRoad{"Road"};
     OWL::Fakes::Road road;
-    OWL::Primitive::LaneGeometryElement laneGeometryElement{OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement({0.0,0.0}, 4.0, 4.0, 0.0, &lane)};
+    OWL::Primitive::LaneGeometryElement laneGeometryElement{OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement({0.0_m,0.0_m}, 4.0_m, 4.0_m, 0.0_rad, &lane)};
     World::Localization::LocalizationElement localizationElement{laneGeometryElement};
-    double yaw{0.0};
+    units::angle::radian_t yaw{0.0};
 };
 
 TEST_F(LocateOnGeometryElement, ObjectOutsideElement_DoesNotLocateObject)
 {
     World::Localization::LocatedObject locatedObject;
-    auto agentBoundary = GenerateRectangularPolygon(-1, 0, -1, 1);
-    Common::Vector2d referencePoint{-0.5,0};
+    auto agentBoundary = GenerateRectangularPolygon(-1_m, 0_m, -1_m, 1_m);
+    Common::Vector2d<units::length::meter_t> referencePoint{-0.5_m,0_m};
 
     const auto locateOnGeometryElement = World::Localization::LocateOnGeometryElement(worldData, agentBoundary, referencePoint, yaw, locatedObject);
     locateOnGeometryElement(std::make_pair(CoarseBoundingBox{}, &localizationElement));
@@ -76,25 +78,25 @@ TEST_F(LocateOnGeometryElement, ObjectOutsideElement_DoesNotLocateObject)
 TEST_F(LocateOnGeometryElement, ObjectPartiallyInsideGeometryElement_CorrectlyLocatesObjectOnElement)
 {
     World::Localization::LocatedObject locatedObject;
-    auto agentBoundary = GenerateRectangularPolygon(-1.0, 2.1, 1.0, 3.0);
-    Common::Vector2d referencePoint{-0.5,2.0};
+    auto agentBoundary = GenerateRectangularPolygon(-1.0_m, 2.1_m, 1.0_m, 3.0_m);
+    Common::Vector2d<units::length::meter_t> referencePoint{-0.5_m,2.0_m};
 
     const auto locateOnGeometryElement = World::Localization::LocateOnGeometryElement(worldData, agentBoundary, referencePoint, yaw, locatedObject);
     locateOnGeometryElement(std::make_pair(CoarseBoundingBox{}, &localizationElement));
 
     EXPECT_THAT(locatedObject.referencePoint, IsEmpty());
     ASSERT_THAT(locatedObject.laneOverlaps, SizeIs(1));
-    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).sMin.roadPosition.s, DoubleEq(0.0));
-    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).sMax.roadPosition.s, DoubleEq(2.1));
-    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).tMin.roadPosition.t, DoubleEq(1.0));
-    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).tMax.roadPosition.t, DoubleEq(2.0));
+    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).sMin.roadPosition.s.value(), DoubleEq(0.0));
+    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).sMax.roadPosition.s.value(), DoubleEq(2.1));
+    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).tMin.roadPosition.t.value(), DoubleEq(1.0));
+    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).tMax.roadPosition.t.value(), DoubleEq(2.0));
 }
 
 TEST_F(LocateOnGeometryElement, ObjectInsideGeometryElement_CorrectlyLocatesObjectOnElement)
 {
     World::Localization::LocatedObject locatedObject;
-    auto agentBoundary = GenerateRectangularPolygon(1.0, 2.1, -1.0, 1.0);
-    Common::Vector2d referencePoint{1.5,0.0};
+    auto agentBoundary = GenerateRectangularPolygon(1.0_m, 2.1_m, -1.0_m, 1.0_m);
+    Common::Vector2d<units::length::meter_t> referencePoint{1.5_m,0.0_m};
 
     const auto locateOnGeometryElement = World::Localization::LocateOnGeometryElement(worldData, agentBoundary, referencePoint, yaw, locatedObject);
     locateOnGeometryElement(std::make_pair(CoarseBoundingBox{}, &localizationElement));
@@ -102,13 +104,13 @@ TEST_F(LocateOnGeometryElement, ObjectInsideGeometryElement_CorrectlyLocatesObje
     ASSERT_THAT(locatedObject.referencePoint, SizeIs(1));
     EXPECT_THAT(locatedObject.referencePoint.at("Road").roadId, Eq("Road"));
     EXPECT_THAT(locatedObject.referencePoint.at("Road").laneId, Eq(-1));
-    EXPECT_THAT(locatedObject.referencePoint.at("Road").roadPosition.s, DoubleEq(1.5));
-    EXPECT_THAT(locatedObject.referencePoint.at("Road").roadPosition.t, DoubleEq(0.0));
+    EXPECT_THAT(locatedObject.referencePoint.at("Road").roadPosition.s.value(), DoubleEq(1.5));
+    EXPECT_THAT(locatedObject.referencePoint.at("Road").roadPosition.t.value(), DoubleEq(0.0));
     ASSERT_THAT(locatedObject.laneOverlaps, SizeIs(1));
-    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).sMin.roadPosition.s, DoubleEq(1.0));
-    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).sMax.roadPosition.s, DoubleEq(2.1));
-    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).tMin.roadPosition.t, DoubleEq(-1.0));
-    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).tMax.roadPosition.t, DoubleEq(1.0));
+    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).sMin.roadPosition.s.value(), DoubleEq(1.0));
+    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).sMax.roadPosition.s.value(), DoubleEq(2.1));
+    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).tMin.roadPosition.t.value(), DoubleEq(-1.0));
+    EXPECT_THAT(locatedObject.laneOverlaps.at(&lane).tMax.roadPosition.t.value(), DoubleEq(1.0));
 }
 
 class LocateTest : public ::testing::Test
@@ -118,17 +120,17 @@ public:
     {
         ON_CALL(lane1, GetId()).WillByDefault(Return(idLane1));
         ON_CALL(lane1, GetOdId()).WillByDefault(Return(-1));
-        ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4));
+        ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4_m));
         ON_CALL(lane1, GetRoad()).WillByDefault(ReturnRef(road1));
         ON_CALL(lane1, GetLaneGeometryElements()).WillByDefault(ReturnRef(elements1));
         ON_CALL(lane2, GetId()).WillByDefault(Return(idLane2));
         ON_CALL(lane2, GetOdId()).WillByDefault(Return(-2));
-        ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(4));
+        ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(4_m));
         ON_CALL(lane2, GetRoad()).WillByDefault(ReturnRef(road1));
         ON_CALL(lane2, GetLaneGeometryElements()).WillByDefault(ReturnRef(elements2));
         ON_CALL(lane3, GetId()).WillByDefault(Return(idLane3));
         ON_CALL(lane3, GetOdId()).WillByDefault(Return(-3));
-        ON_CALL(lane3, GetWidth(_)).WillByDefault(Return(4));
+        ON_CALL(lane3, GetWidth(_)).WillByDefault(Return(4_m));
         ON_CALL(lane3, GetRoad()).WillByDefault(ReturnRef(road2));
         ON_CALL(lane3, GetLaneGeometryElements()).WillByDefault(ReturnRef(elements3));
         ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
@@ -154,11 +156,11 @@ public:
     OWL::Fakes::Lane& lane3{*dynamic_cast<OWL::Fakes::Lane*>(lanes.at(idLane3).get())};
     OWL::Fakes::Road road1, road2;
     std::string idRoad1{"Road1"}, idRoad2{"Road2"};
-    OWL::Primitive::LaneGeometryElement laneGeometryElement1{OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement({0.0,0.0}, 4.0, 4.0, 0.0, &lane1)};
+    OWL::Primitive::LaneGeometryElement laneGeometryElement1{OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement({0.0_m,0.0_m}, 4.0_m, 4.0_m, 0.0_rad, &lane1)};
     OWL::Interfaces::LaneGeometryElements elements1{&laneGeometryElement1};
-    OWL::Primitive::LaneGeometryElement laneGeometryElement2{OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement({0.0,-4.0}, 4.0, 4.0, 0.0, &lane2)};
+    OWL::Primitive::LaneGeometryElement laneGeometryElement2{OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement({0.0_m,-4.0_m}, 4.0_m, 4.0_m, 0.0_rad, &lane2)};
     OWL::Interfaces::LaneGeometryElements elements2{&laneGeometryElement2};
-    OWL::Primitive::LaneGeometryElement laneGeometryElement3{OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement({2.0,-2.0}, 4.0, 4.0, M_PI_4, &lane3)};
+    OWL::Primitive::LaneGeometryElement laneGeometryElement3{OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement({2.0_m,-2.0_m}, 4.0_m, 4.0_m, 45_deg, &lane3)};
     OWL::Interfaces::LaneGeometryElements elements3{&laneGeometryElement3};
     World::Localization::Localizer localizer{worldData};
 };
@@ -166,14 +168,14 @@ public:
 TEST_F(LocateTest, WorldObject_OnRoute)
 {
     OWL::Fakes::MovingObject object;
-    OWL::Primitive::AbsPosition referencePoint;
-    referencePoint.x = 2;
-    referencePoint.y = 2;
-    OWL::Primitive::AbsOrientation orientation;
-    orientation.yaw = 0;
+    mantle_api::Vec3<units::length::meter_t> referencePoint;
+    referencePoint.x = 2_m;
+    referencePoint.y = 2_m;
+    mantle_api::Orientation3<units::angle::radian_t> orientation;
+    orientation.yaw = 0_rad;
     ON_CALL(object, GetReferencePointPosition()).WillByDefault(Return(referencePoint));
     ON_CALL(object, GetAbsOrientation()).WillByDefault(Return(orientation));
-    ON_CALL(object, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1));
+    ON_CALL(object, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1_m));
     polygon_t boundingBox{{{1,1},{1,3},{3,3},{3,1}}};
     const auto result = localizer.Locate(boundingBox, object);
 
@@ -185,14 +187,14 @@ TEST_F(LocateTest, WorldObject_OnRoute)
 TEST_F(LocateTest, WorldObject_OffRoute)
 {
     OWL::Fakes::MovingObject object;
-    OWL::Primitive::AbsPosition referencePoint;
-    referencePoint.x = 3.5;
-    referencePoint.y = 3.0;
-    OWL::Primitive::AbsOrientation orientation;
-    orientation.yaw = 0;
+    mantle_api::Vec3<units::length::meter_t> referencePoint;
+    referencePoint.x = 3.5_m;
+    referencePoint.y = 3.0_m;
+    mantle_api::Orientation3<units::angle::radian_t> orientation;
+    orientation.yaw = 0_rad;
     ON_CALL(object, GetReferencePointPosition()).WillByDefault(Return(referencePoint));
     ON_CALL(object, GetAbsOrientation()).WillByDefault(Return(orientation));
-    ON_CALL(object, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1));
+    ON_CALL(object, GetDistanceReferencePointToLeadingEdge()).WillByDefault(Return(1_m));
     polygon_t boundingBox{{{2.5,1},{2.5,3},{4.5,3},{4.5,1}}};
     const auto result = localizer.Locate(boundingBox, object);
 
@@ -202,22 +204,22 @@ TEST_F(LocateTest, WorldObject_OffRoute)
 
 TEST_F(LocateTest, Point_InsideTwoRoads)
 {
-    const auto result = localizer.Locate({2,0},0);
+    const auto result = localizer.Locate({2_m,0_m},0_rad);
 
-    ASSERT_THAT(result, ElementsAre(std::make_pair(idRoad1, GlobalRoadPosition{idRoad1, -1, 2, 0, 0}),
-                                    std::make_pair(idRoad2, GlobalRoadPosition{idRoad2, -3, M_SQRT2, M_SQRT2, -M_PI_4})));
+    ASSERT_THAT(result, ElementsAre(std::make_pair(idRoad1, GlobalRoadPosition{idRoad1, -1, 2_m, 0_m, 0_rad}),
+                                    std::make_pair(idRoad2, GlobalRoadPosition{idRoad2, -3, units::length::meter_t{M_SQRT2}, units::length::meter_t{M_SQRT2}, -45_deg})));
 }
 
 TEST_F(LocateTest, Point_InsideOneRoad)
 {
-    const auto result = localizer.Locate({2,-3},0);
+    const auto result = localizer.Locate({2_m,-3_m},0_rad);
 
-    ASSERT_THAT(result, ElementsAre(std::make_pair(idRoad1, GlobalRoadPosition{idRoad1, -2, 2, 1, 0})));
+    ASSERT_THAT(result, ElementsAre(std::make_pair(idRoad1, GlobalRoadPosition{idRoad1, -2, 2_m, 1_m, 0_rad})));
 }
 
 TEST_F(LocateTest, Point_TouchesOneRoad)
 {
-    const auto result = localizer.Locate({0,1},0);
+    const auto result = localizer.Locate({0_m,1_m},0_rad);
 
-    ASSERT_THAT(result, ElementsAre(std::make_pair(idRoad1, GlobalRoadPosition{idRoad1, -1, 0, 1, 0})));
+    ASSERT_THAT(result, ElementsAre(std::make_pair(idRoad1, GlobalRoadPosition{idRoad1, -1, 0_m, 1_m, 0_rad})));
 }
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/sceneryConverter_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/sceneryConverter_Tests.cpp
index f6b95339aa2d3d6b5937098a30b3b35985e58402..675b67d8fd9173aa9f2bf5ce7ca64f0a5e3c2ad5 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/sceneryConverter_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/sceneryConverter_Tests.cpp
@@ -48,30 +48,30 @@ public:
     MOCK_METHOD2(Register, openpass::type::EntityId (openpass::entity::EntityType entityType, openpass::type::EntityInfo));
 };
 
-std::tuple<const OWL::Primitive::LaneGeometryJoint*, const OWL::Primitive::LaneGeometryJoint*> CreateSectionPartJointsRect(double length)
+std::tuple<const OWL::Primitive::LaneGeometryJoint*, const OWL::Primitive::LaneGeometryJoint*> CreateSectionPartJointsRect(units::length::meter_t length)
 {
     osi3::Lane osiLane;
     OWL::Implementation::Lane lane(&osiLane, nullptr, -1);
 
     auto laneGeometryElement =
         OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
-    { 0.0, 0.0 },  // origin
-    0.0,           // width
+    { 0.0_m, 0.0_m },  // origin
+    0.0_m,           // width
     length,
-    0.0);          // heading
+    0.0_rad);          // heading
 
     const OWL::Primitive::LaneGeometryJoint& firstJoint = laneGeometryElement.joints.current;
     const OWL::Primitive::LaneGeometryJoint& secondJoint = laneGeometryElement.joints.next;
 
-    Common::Vector2d leftPoint1 = firstJoint.points.left;
-    Common::Vector2d referencePoint1 = firstJoint.points.reference;
-    Common::Vector2d rightPoint1 = firstJoint.points.right;
-    Common::Vector2d leftPoint2 = secondJoint.points.left;
-    Common::Vector2d referencePoint2 = secondJoint.points.reference;
-    Common::Vector2d rightPoint2 = secondJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint1 = firstJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint1 = firstJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint1 = firstJoint.points.right;
+    Common::Vector2d<units::length::meter_t> leftPoint2 = secondJoint.points.left;
+    Common::Vector2d<units::length::meter_t> referencePoint2 = secondJoint.points.reference;
+    Common::Vector2d<units::length::meter_t> rightPoint2 = secondJoint.points.right;
 
-    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0, 0.0, 0.0);
-    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0, 0.0);
+    lane.AddLaneGeometryJoint(leftPoint1, referencePoint1, rightPoint1, 0.0_m, 0.0_i_m, 0.0_rad);
+    lane.AddLaneGeometryJoint(leftPoint2, referencePoint2, rightPoint2, length, 0.0_i_m, 0.0_rad);
 
     return lane.GetNeighbouringJoints(length * 0.5);
 }
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/sensorView_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/sensorView_Tests.cpp
index 0c5c16f80b3da9a3ff44773fe3fd843f78e02aba..720db4c46299675df4e8a2c97f7f33e468fa7027 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/sensorView_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/sensorView_Tests.cpp
@@ -33,35 +33,35 @@ struct SensorViewTest_Data
 {
     struct Sensor
     {
-        Sensor(double x, double y, double angle_left_abs_degree, double angle_right_abs_degree, double radius)
-        : x{x},
-          y{y},
-          angle_left_abs_rad{angle_left_abs_degree * M_PI / 180.},
-          angle_right_abs_rad{angle_right_abs_degree * M_PI / 180.},
-          radius{radius}
+        Sensor(units::length::meter_t x, units::length::meter_t y, units::angle::degree_t angle_left_abs_degree, units::angle::degree_t angle_right_abs_degree, units::length::meter_t radius) :
+            x{x},
+            y{y},
+            angle_left_abs_rad{angle_left_abs_degree},
+            angle_right_abs_rad{angle_right_abs_degree},
+            radius{radius}
         {}
 
-        double  x;
-        double  y;
-        double  angle_left_abs_rad;
-        double angle_right_abs_rad;
-        double radius;
+        units::length::meter_t x;
+        units::length::meter_t y;
+        units::angle::radian_t angle_left_abs_rad;
+        units::angle::radian_t angle_right_abs_rad;
+        units::length::meter_t radius;
         friend std::ostream& operator<<(std::ostream& os, const Sensor& obj)
         {
             return os
             << "Position: "              << obj.x << ";" << obj.y
-            << " | Opening Angles (deg): " << (obj.angle_left_abs_rad * 180. / M_PI) << ";" << (obj.angle_right_abs_rad * 180. / M_PI)
+            << " | Opening Angles (rad): " << obj.angle_left_abs_rad << ";" << obj.angle_right_abs_rad
             << " | Radius: "               << obj.radius;
         }
     };
 
     struct Object
     {
-        double x;
-        double y;
-        double length;
-        double width;
-        double rotation;
+        units::length::meter_t x;
+        units::length::meter_t y;
+        units::length::meter_t length;
+        units::length::meter_t width;
+        units::angle::radian_t rotation;
         friend std::ostream& operator<<(std::ostream& os, const Object& obj)
         {
             return os
@@ -94,12 +94,12 @@ TEST_P(SensorViewTestObjectDetection, TestGenerator)
 {
     auto data = GetParam();
 
-    Primitive::AbsPosition sensorPosition = {data.sensor.x, data.sensor.y, 0};
+    mantle_api::Vec3<units::length::meter_t> sensorPosition = {data.sensor.x, data.sensor.y, 0_m};
 
     OWL::Fakes::MovingObject object;
-    Primitive::AbsPosition  objectPosition = {data.object.x, data.object.y, 0};
+    mantle_api::Vec3<units::length::meter_t> objectPosition = {data.object.x, data.object.y, 0_m};
     ON_CALL(object,  GetReferencePointPosition()).WillByDefault(Return(objectPosition));
-    Primitive::Dimension  objectDimension = {data.object.length, data.object.width, 0};
+    mantle_api::Dimension3 objectDimension = {data.object.length, data.object.width, 0_m};
     ON_CALL(object,  GetDimension()).WillByDefault(Return(objectDimension));
     std::vector<OWL::Interfaces::MovingObject*> fakeMovingObjects{&object};
 
@@ -107,56 +107,9 @@ TEST_P(SensorViewTestObjectDetection, TestGenerator)
     ASSERT_THAT(filteredMoving, SizeIs(1));
 }
 
-INSTANTIATE_TEST_SUITE_P(ObjectsTouchingSensorView, SensorViewTestObjectDetection, ::testing::Values(
-    SensorViewTest_Data{"Large object in backshadow or regular sensor",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, 45.0, -45.0, 10.0},
-                        SensorViewTest_Data::Object{-40.0, -0.50, 82.0, 2.0, 3.0}},
-    SensorViewTest_Data{"Small object in gap of pacman-style sensor",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, 170.0, -170.0, 10.0},
-                        SensorViewTest_Data::Object{-6.0, 0.50, 4.0, 0.50, -175.0}},
-    SensorViewTest_Data{"Medium object in 'negative' sensorconfig",
-                        SensorViewTest_Data::Sensor{-5.0, 3.0, -45.0, 20.0, 20.0},
-                        SensorViewTest_Data::Object{25.0, -8.0, 50.0, 5.0, -30.0}}
-));
-
-INSTANTIATE_TEST_SUITE_P(SimpleCasesWithSensor60Degree, SensorViewTestObjectDetection, ::testing::Values(
-    SensorViewTest_Data{"Small Object touches sensor looking north",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, 120.0, 60.0, 10.0},
-                        SensorViewTest_Data::Object{-2.0, 10.0, 2.0, 1.0, 90.0}},
-    SensorViewTest_Data{"Object on backshadow of sensor looking north",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, 120.0, 60.0, 10.0},
-                        SensorViewTest_Data::Object{2.0, 8.0, 2.0, 1.0, 175.0}},
-    SensorViewTest_Data{"Object within cone of sensor looking north",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, 120.0, 60.0, 10.0},
-                        SensorViewTest_Data::Object{-3.50, 4.0, 2.0, 1.0, -175.0}},
-    SensorViewTest_Data{"Object touches sensor looking south",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, -60.0, -120.0, 10.0},
-                        SensorViewTest_Data::Object{2.0, -10.0, 2.0, 1.0, -90.0}},
-    SensorViewTest_Data{"Object on backshadow of sensor looking south",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, -60.0, -120.0, 10.0},
-                        SensorViewTest_Data::Object{-2.0, -8.0, 2.0, 1.0, -175.0}},
-    SensorViewTest_Data{"Object within cone of sensor looking south",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, -60.0, -120.0, 10.0},
-                        SensorViewTest_Data::Object{3.50, -4.0, 2.0, 1.0, 175.0}},
-    SensorViewTest_Data{"Object touches sensor looking west",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, -150.0, 150.0, 10.0},
-                        SensorViewTest_Data::Object{-10.0, 2.0, 2.0, 1.0, 0.0}},
-    SensorViewTest_Data{"Object on backshadow of sensor looking west",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, -150.0, 150.0, 10.0},
-                        SensorViewTest_Data::Object{-8.0, -2.0, 2.0, 1.0, 85.0}},
-    SensorViewTest_Data{"Object within cone of sensor looking west",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, -150.0, 150.0, 10.0},
-                        SensorViewTest_Data::Object{-4.0, 3.50, 2.0, 1.0, -265.0}},
-    SensorViewTest_Data{"Object touches sensor looking east",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, 30.0, -30.0, 10.0},
-                        SensorViewTest_Data::Object{10.0, -2.0, 2.0, 1.0, 180.0}},
-    SensorViewTest_Data{"Object on backshadow of sensor looking east",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, 30.0, -30.0, 10.0},
-                        SensorViewTest_Data::Object{8.0, 2.0, 2.0, 1.0, 95.0}},
-    SensorViewTest_Data{"Object within cone of sensor looking east",
-                        SensorViewTest_Data::Sensor{0.0, 0.0, 30.0, -30.0, 10.0},
-                        SensorViewTest_Data::Object{4.0, -3.50, 2.0, 1.0, 445.0}}
-));
+INSTANTIATE_TEST_SUITE_P(ObjectsTouchingSensorView, SensorViewTestObjectDetection, ::testing::Values(SensorViewTest_Data{"Large object in backshadow or regular sensor", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, 45.0_deg, -45.0_deg, 10.0_m}, SensorViewTest_Data::Object{-40.0_m, -0.50_m, 82.0_m, 2.0_m, 3.0_deg}}, SensorViewTest_Data{"Small object in gap of pacman-style sensor", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, 170.0_deg, -170.0_deg, 10.0_m}, SensorViewTest_Data::Object{-6.0_m, 0.50_m, 4.0_m, 0.50_m, -175.0_deg}}, SensorViewTest_Data{"Medium object in 'negative' sensorconfig", SensorViewTest_Data::Sensor{-5.0_m, 3.0_m, -45.0_deg, 20.0_deg, 20.0_m}, SensorViewTest_Data::Object{25.0_m, -8.0_m, 50.0_m, 5.0_m, -30.0_deg}}));
+
+INSTANTIATE_TEST_SUITE_P(SimpleCasesWithSensor60Degree, SensorViewTestObjectDetection, ::testing::Values(SensorViewTest_Data{"Small Object touches sensor looking north", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, 120.0_deg, 60.0_deg, 10.0_m}, SensorViewTest_Data::Object{-2.0_m, 10.0_m, 2.0_m, 1.0_m, 90.0_deg}}, SensorViewTest_Data{"Object on backshadow of sensor looking north", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, 120.0_deg, 60.0_deg, 10.0_m}, SensorViewTest_Data::Object{2.0_m, 8.0_m, 2.0_m, 1.0_m, 175.0_deg}}, SensorViewTest_Data{"Object within cone of sensor looking north", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, 120.0_deg, 60.0_deg, 10.0_m}, SensorViewTest_Data::Object{-3.50_m, 4.0_m, 2.0_m, 1.0_m, -175.0_deg}}, SensorViewTest_Data{"Object touches sensor looking south", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, -60.0_deg, -120.0_deg, 10.0_m}, SensorViewTest_Data::Object{2.0_m, -10.0_m, 2.0_m, 1.0_m, -90.0_deg}}, SensorViewTest_Data{"Object on backshadow of sensor looking south", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, -60.0_deg, -120.0_deg, 10.0_m}, SensorViewTest_Data::Object{-2.0_m, -8.0_m, 2.0_m, 1.0_m, -175.0_deg}}, SensorViewTest_Data{"Object within cone of sensor looking south", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, -60.0_deg, -120.0_deg, 10.0_m}, SensorViewTest_Data::Object{3.50_m, -4.0_m, 2.0_m, 1.0_m, 175.0_deg}}, SensorViewTest_Data{"Object touches sensor looking west", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, -150.0_deg, 150.0_deg, 10.0_m}, SensorViewTest_Data::Object{-10.0_m, 2.0_m, 2.0_m, 1.0_m, 0.0_deg}}, SensorViewTest_Data{"Object on backshadow of sensor looking west", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, -150.0_deg, 150.0_deg, 10.0_m}, SensorViewTest_Data::Object{-8.0_m, -2.0_m, 2.0_m, 1.0_m, 85.0_deg}}, SensorViewTest_Data{"Object within cone of sensor looking west", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, -150.0_deg, 150.0_deg, 10.0_m}, SensorViewTest_Data::Object{-4.0_m, 3.50_m, 2.0_m, 1.0_m, -265.0_deg}}, SensorViewTest_Data{"Object touches sensor looking east", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, 30.0_deg, -30.0_deg, 10.0_m}, SensorViewTest_Data::Object{10.0_m, -2.0_m, 2.0_m, 1.0_m, 180.0_deg}}, SensorViewTest_Data{"Object on backshadow of sensor looking east", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, 30.0_deg, -30.0_deg, 10.0_m}, SensorViewTest_Data::Object{8.0_m, 2.0_m, 2.0_m, 1.0_m, 95.0_deg}}, SensorViewTest_Data{"Object within cone of sensor looking east", SensorViewTest_Data::Sensor{0.0_m, 0.0_m, 30.0_deg, -30.0_deg, 10.0_m}, SensorViewTest_Data::Object{4.0_m, -3.50_m, 2.0_m, 1.0_m, 445.0_deg}}));
 
 class TestWorldData : public OWL::WorldData
 {
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/stream_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/stream_Tests.cpp
index 550fc806e3e21633b6e59f9275b5d7b9ba9838eb..2e45e2286b0c2b84ea315078b509e6bba1aeaffb 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/stream_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/stream_Tests.cpp
@@ -31,8 +31,8 @@ using testing::ElementsAre;
 
 TEST(RoadStream_Tests, GetStreamPosition_FirstRoadInStreamDirection)
 {
-    constexpr double lengthRoad1 = 110;
-    constexpr double lengthRoad2 = 210;
+    constexpr units::length::meter_t lengthRoad1 = 110_m;
+    constexpr units::length::meter_t lengthRoad2 = 210_m;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
 
@@ -43,15 +43,15 @@ TEST(RoadStream_Tests, GetStreamPosition_FirstRoadInStreamDirection)
     ON_CALL(section1, Covers(_)).WillByDefault(Return(true));
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(-1));
-    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4.));
+    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4._m));
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(-2));
-    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5.));
+    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5._m));
     OWL::Interfaces::Lanes lanesSection1{&lane1, &lane2};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     OWL::Interfaces::Sections sectionsRoad1{&section1};
     ON_CALL(road1, GetSections()).WillByDefault(ReturnRef(sectionsRoad1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
 
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
@@ -60,16 +60,16 @@ TEST(RoadStream_Tests, GetStreamPosition_FirstRoadInStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.GetStreamPosition(GlobalRoadPosition{"Road1", -2, 30., 1., 0.});
+    const auto result = roadStream.GetStreamPosition(GlobalRoadPosition{"Road1", -2, 30._m, 1._m, 0._rad});
 
-    ASSERT_THAT(result.s, DoubleEq(30.));
-    ASSERT_THAT(result.t, DoubleEq(-5.5));
+    ASSERT_THAT(result.s.value(), DoubleEq(30.));
+    ASSERT_THAT(result.t.value(), DoubleEq(-5.5));
 }
 
 TEST(RoadStream_Tests, GetStreamPosition_FirstRoadAgainstStreamDirection)
 {
-    constexpr double lengthRoad1 = 110;
-    constexpr double lengthRoad2 = 210;
+    constexpr units::length::meter_t lengthRoad1 = 110_m;
+    constexpr units::length::meter_t lengthRoad2 = 210_m;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
 
@@ -80,10 +80,10 @@ TEST(RoadStream_Tests, GetStreamPosition_FirstRoadAgainstStreamDirection)
     ON_CALL(section1, Covers(_)).WillByDefault(Return(true));
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(-1));
-    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4.));
+    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4._m));
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(-2));
-    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5.));
+    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5._m));
     OWL::Interfaces::Lanes lanesSection1{&lane1, &lane2};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     OWL::Interfaces::Sections sectionsRoad1{&section1};
@@ -97,23 +97,23 @@ TEST(RoadStream_Tests, GetStreamPosition_FirstRoadAgainstStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.GetStreamPosition(GlobalRoadPosition{"Road1", -2, 30., 1., 0.});
+    const auto result = roadStream.GetStreamPosition(GlobalRoadPosition{"Road1", -2, 30._m, 1._m, 0._rad});
 
-    ASSERT_THAT(result.s, DoubleEq(80.));
-    ASSERT_THAT(result.t, DoubleEq(5.5));
+    ASSERT_THAT(result.s.value(), DoubleEq(80.));
+    ASSERT_THAT(result.t.value(), DoubleEq(5.5));
 }
 
 TEST(RoadStream_Tests, GetStreamPosition_SecondRoadInStreamDirection)
 {
-    constexpr double lengthRoad1 = 110;
-    constexpr double lengthRoad2 = 210;
+    constexpr units::length::meter_t lengthRoad1 = 110_m;
+    constexpr units::length::meter_t lengthRoad2 = 210_m;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
 
     OWL::Fakes::Road road1;
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     ON_CALL(road1, GetLength()).WillByDefault(Return(lengthRoad1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
 
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
@@ -122,10 +122,10 @@ TEST(RoadStream_Tests, GetStreamPosition_SecondRoadInStreamDirection)
     ON_CALL(section1, Covers(_)).WillByDefault(Return(true));
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(1));
-    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4.));
+    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4._m));
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(2));
-    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5.));
+    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5._m));
     OWL::Interfaces::Lanes lanesSection1{&lane1, &lane2};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     OWL::Interfaces::Sections sectionsRoad2{&section1};
@@ -134,23 +134,23 @@ TEST(RoadStream_Tests, GetStreamPosition_SecondRoadInStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.GetStreamPosition(GlobalRoadPosition{"Road2", 2, 30., -1., 0.});
+    const auto result = roadStream.GetStreamPosition(GlobalRoadPosition{"Road2", 2, 30._m, -1._m, 0._rad});
 
-    ASSERT_THAT(result.s, DoubleEq(140.));
-    ASSERT_THAT(result.t, DoubleEq(5.5));
+    ASSERT_THAT(result.s.value(), DoubleEq(140.));
+    ASSERT_THAT(result.t.value(), DoubleEq(5.5));
 }
 
 TEST(RoadStream_Tests, GetStreamPosition_SecondRoadAgainstStreamDirection)
 {
-    constexpr double lengthRoad1 = 110;
-    constexpr double lengthRoad2 = 210;
+    constexpr units::length::meter_t lengthRoad1 = 110_m;
+    constexpr units::length::meter_t lengthRoad2 = 210_m;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
 
     OWL::Fakes::Road road1;
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     ON_CALL(road1, GetLength()).WillByDefault(Return(lengthRoad1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
     ON_CALL(road2, GetLength()).WillByDefault(Return(lengthRoad2));
@@ -158,10 +158,10 @@ TEST(RoadStream_Tests, GetStreamPosition_SecondRoadAgainstStreamDirection)
     ON_CALL(section1, Covers(_)).WillByDefault(Return(true));
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(1));
-    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4.));
+    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4._m));
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(2));
-    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5.));
+    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5._m));
     OWL::Interfaces::Lanes lanesSection1{&lane1, &lane2};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     OWL::Interfaces::Sections sectionsRoad2{&section1};
@@ -170,16 +170,16 @@ TEST(RoadStream_Tests, GetStreamPosition_SecondRoadAgainstStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.GetStreamPosition(GlobalRoadPosition{"Road2", 2, 30., -1., 0.});
+    const auto result = roadStream.GetStreamPosition(GlobalRoadPosition{"Road2", 2, 30._m, -1._m, 0._rad});
 
-    ASSERT_THAT(result.s, DoubleEq(290.));
-    ASSERT_THAT(result.t, DoubleEq(-5.5));
+    ASSERT_THAT(result.s.value(), DoubleEq(290.));
+    ASSERT_THAT(result.t.value(), DoubleEq(-5.5));
 }
 
 TEST(RoadStream_Tests, GetRoadPosition_FirstRoadInStreamDirection)
 {
-    constexpr double lengthRoad1 = 110;
-    constexpr double lengthRoad2 = 210;
+    constexpr units::length::meter_t lengthRoad1 = 110_m;
+    constexpr units::length::meter_t lengthRoad2 = 210_m;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
 
@@ -190,15 +190,15 @@ TEST(RoadStream_Tests, GetRoadPosition_FirstRoadInStreamDirection)
     ON_CALL(section1, Covers(_)).WillByDefault(Return(true));
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(-1));
-    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4.));
+    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4._m));
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(-2));
-    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5.));
+    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5._m));
     OWL::Interfaces::Lanes lanesSection1{&lane1, &lane2};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     OWL::Interfaces::Sections sectionsRoad1{&section1};
     ON_CALL(road1, GetSections()).WillByDefault(ReturnRef(sectionsRoad1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
 
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
@@ -207,18 +207,18 @@ TEST(RoadStream_Tests, GetRoadPosition_FirstRoadInStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.GetRoadPosition(StreamPosition{30., -5.5});
+    const auto result = roadStream.GetRoadPosition(StreamPosition{30._m, -5.5_m});
 
     ASSERT_THAT(result.roadId, Eq(idRoad1));
     ASSERT_THAT(result.laneId, Eq(-2));
-    ASSERT_THAT(result.roadPosition.s, DoubleEq(30.));
-    ASSERT_THAT(result.roadPosition.t, DoubleEq(1.));
+    ASSERT_THAT(result.roadPosition.s.value(), DoubleEq(30.));
+    ASSERT_THAT(result.roadPosition.t.value(), DoubleEq(1.));
 }
 
 TEST(RoadStream_Tests, GetRoadPosition_FirstRoadAgainstStreamDirection)
 {
-    constexpr double lengthRoad1 = 110;
-    constexpr double lengthRoad2 = 210;
+    constexpr units::length::meter_t lengthRoad1 = 110_m;
+    constexpr units::length::meter_t lengthRoad2 = 210_m;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
 
@@ -229,10 +229,10 @@ TEST(RoadStream_Tests, GetRoadPosition_FirstRoadAgainstStreamDirection)
     ON_CALL(section1, Covers(_)).WillByDefault(Return(true));
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(-1));
-    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4.));
+    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4._m));
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(-2));
-    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5.));
+    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5._m));
     OWL::Interfaces::Lanes lanesSection1{&lane1, &lane2};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     OWL::Interfaces::Sections sectionsRoad1{&section1};
@@ -246,25 +246,25 @@ TEST(RoadStream_Tests, GetRoadPosition_FirstRoadAgainstStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.GetRoadPosition(StreamPosition{30., 5.5});
+    const auto result = roadStream.GetRoadPosition(StreamPosition{30._m, 5.5_m});
 
     ASSERT_THAT(result.roadId, Eq(idRoad1));
     ASSERT_THAT(result.laneId, Eq(-2));
-    ASSERT_THAT(result.roadPosition.s, DoubleEq(80.));
-    ASSERT_THAT(result.roadPosition.t, DoubleEq(1.));
+    ASSERT_THAT(result.roadPosition.s.value(), DoubleEq(80.));
+    ASSERT_THAT(result.roadPosition.t.value(), DoubleEq(1.));
 }
 
 TEST(RoadStream_Tests, GetRoadPosition_SecondRoadInStreamDirection)
 {
-    constexpr double lengthRoad1 = 110;
-    constexpr double lengthRoad2 = 210;
+    constexpr units::length::meter_t lengthRoad1 = 110_m;
+    constexpr units::length::meter_t lengthRoad2 = 210_m;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
 
     OWL::Fakes::Road road1;
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     ON_CALL(road1, GetLength()).WillByDefault(Return(lengthRoad1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
 
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
@@ -275,10 +275,10 @@ TEST(RoadStream_Tests, GetRoadPosition_SecondRoadInStreamDirection)
     ON_CALL(section1, Covers(_)).WillByDefault(Return(true));
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(1));
-    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4.));
+    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4._m));
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(2));
-    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5.));
+    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5._m));
     OWL::Interfaces::Lanes lanesSection1{&lane1, &lane2};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     OWL::Interfaces::Sections sectionsRoad2{&section1};
@@ -287,25 +287,25 @@ TEST(RoadStream_Tests, GetRoadPosition_SecondRoadInStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.GetRoadPosition(StreamPosition{130., 5.5});
+    const auto result = roadStream.GetRoadPosition(StreamPosition{130._m, 5.5_m});
 
     ASSERT_THAT(result.roadId, Eq(idRoad2));
     ASSERT_THAT(result.laneId, Eq(2));
-    ASSERT_THAT(result.roadPosition.s, DoubleEq(20.));
-    ASSERT_THAT(result.roadPosition.t, DoubleEq(-1.));
+    ASSERT_THAT(result.roadPosition.s.value(), DoubleEq(20.));
+    ASSERT_THAT(result.roadPosition.t.value(), DoubleEq(-1.));
 }
 
 TEST(RoadStream_Tests, GetRoadPosition_SecondRoadAgainstStreamDirection)
 {
-    constexpr double lengthRoad1 = 110;
-    constexpr double lengthRoad2 = 210;
+    constexpr units::length::meter_t lengthRoad1 = 110_m;
+    constexpr units::length::meter_t lengthRoad2 = 210_m;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
 
     OWL::Fakes::Road road1;
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     ON_CALL(road1, GetLength()).WillByDefault(Return(lengthRoad1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
 
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
@@ -316,10 +316,10 @@ TEST(RoadStream_Tests, GetRoadPosition_SecondRoadAgainstStreamDirection)
     ON_CALL(section1, Covers(_)).WillByDefault(Return(true));
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(1));
-    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4.));
+    ON_CALL(lane1, GetWidth(_)).WillByDefault(Return(4._m));
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(2));
-    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5.));
+    ON_CALL(lane2, GetWidth(_)).WillByDefault(Return(5._m));
     OWL::Interfaces::Lanes lanesSection1{&lane1, &lane2};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     OWL::Interfaces::Sections sectionsRoad2{&section1};
@@ -328,22 +328,22 @@ TEST(RoadStream_Tests, GetRoadPosition_SecondRoadAgainstStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.GetRoadPosition(StreamPosition{130., -5.5});
+    const auto result = roadStream.GetRoadPosition(StreamPosition{130._m, -5.5_m});
 
     ASSERT_THAT(result.roadId, Eq(idRoad2));
     ASSERT_THAT(result.laneId, Eq(2));
-    ASSERT_THAT(result.roadPosition.s, DoubleEq(190.));
-    ASSERT_THAT(result.roadPosition.t, DoubleEq(-1.));
+    ASSERT_THAT(result.roadPosition.s.value(), DoubleEq(190.));
+    ASSERT_THAT(result.roadPosition.t.value(), DoubleEq(-1.));
 }
 
 TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_InStreamDirection)
 {
-    constexpr double lengthSection1A = 40;
-    constexpr double lengthSection1B = 70;
-    constexpr double lengthRoad1 = lengthSection1A + lengthSection1B;
-    constexpr double lengthSection2A = 80;
-    constexpr double lengthSection2B = 130;
-    constexpr double lengthRoad2 = lengthSection2A + lengthSection2B;
+    constexpr units::length::meter_t lengthSection1A = 40_m;
+    constexpr units::length::meter_t lengthSection1B = 70_m;
+    constexpr units::length::meter_t lengthRoad1 = lengthSection1A + lengthSection1B;
+    constexpr units::length::meter_t lengthSection2A = 80_m;
+    constexpr units::length::meter_t lengthSection2B = 130_m;
+    constexpr units::length::meter_t lengthRoad2 = lengthSection2A + lengthSection2B;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
     constexpr OWL::Id idLane2AMinus1 = 1;
@@ -355,9 +355,9 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_InStreamDirection)
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     ON_CALL(road1, GetLength()).WillByDefault(Return(lengthRoad1));
     OWL::Fakes::Section section1A;
-    ON_CALL(section1A, Covers(_)).WillByDefault([&](const double& s){return s >= 0 && s <= lengthSection1A;});
+    ON_CALL(section1A, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthSection1A;});
     OWL::Fakes::Section section1B;
-    ON_CALL(section1B, Covers(_)).WillByDefault([&](const double& s){return s >= lengthSection1A && s <= lengthRoad1;});
+    ON_CALL(section1B, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthSection1A && s <= lengthRoad1;});
     OWL::Fakes::Lane lane1BMinus1;
     ON_CALL(lane1BMinus1, GetOdId()).WillByDefault(Return(-1));
     OWL::Fakes::Lane lane1BMinus2;
@@ -369,7 +369,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_InStreamDirection)
     ON_CALL(section1B, GetLanes()).WillByDefault(ReturnRef(lanesSection1B));
     std::vector<const OWL::Interfaces::Section*> sections1{&section1A, &section1B};
     ON_CALL(road1, GetSections()).WillByDefault(ReturnRef(sections1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
 
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
@@ -382,7 +382,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_InStreamDirection)
     OWL::Fakes::Lane lane2AMinus2;
     ON_CALL(lane2AMinus2, GetId()).WillByDefault(Return(idLane2AMinus2));
     ON_CALL(lane2AMinus2, GetOdId()).WillByDefault(Return(-2));
-    ON_CALL(lane2AMinus2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0));
+    ON_CALL(lane2AMinus2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0_m));
     std::vector<OWL::Id> successorsLane2AMinus2{idLane2BMinus1};
     ON_CALL(lane2AMinus2, GetNext()).WillByDefault(ReturnRef(successorsLane2AMinus2));
     OWL::Interfaces::Lanes lanesSection2A{&lane2AMinus1, &lane2AMinus2};
@@ -401,7 +401,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_InStreamDirection)
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.CreateLaneStream(StreamPosition{50., 0.}, -2);
+    const auto result = roadStream.CreateLaneStream(StreamPosition{50._m, 0._m}, -2);
     ASSERT_THAT(result, SizeIs(3));
     EXPECT_THAT(result.at(0).lane, Eq(&lane1BMinus2));
     EXPECT_THAT(result.at(0).inStreamDirection, Eq(true));
@@ -416,12 +416,12 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_InStreamDirection)
 
 TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_AgainstStreamDirection)
 {
-    constexpr double lengthSection1A = 40;
-    constexpr double lengthSection1B = 70;
-    constexpr double lengthRoad1 = lengthSection1A + lengthSection1B;
-    constexpr double lengthSection2A = 80;
-    constexpr double lengthSection2B = 130;
-    constexpr double lengthRoad2 = lengthSection2A + lengthSection2B;
+    constexpr units::length::meter_t lengthSection1A = 40_m;
+    constexpr units::length::meter_t lengthSection1B = 70_m;
+    constexpr units::length::meter_t lengthRoad1 = lengthSection1A + lengthSection1B;
+    constexpr units::length::meter_t lengthSection2A = 80_m;
+    constexpr units::length::meter_t lengthSection2B = 130_m;
+    constexpr units::length::meter_t lengthRoad2 = lengthSection2A + lengthSection2B;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
     constexpr OWL::Id idLane2AMinus1 = 1;
@@ -433,14 +433,14 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_AgainstStreamDirectio
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     ON_CALL(road1, GetLength()).WillByDefault(Return(lengthRoad1));
     OWL::Fakes::Section section1A;
-    ON_CALL(section1A, Covers(_)).WillByDefault([&](const double& s){return s >= 0 && s <= lengthSection1A;});
+    ON_CALL(section1A, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthSection1A;});
     OWL::Fakes::Section section1B;
-    ON_CALL(section1B, Covers(_)).WillByDefault([&](const double& s){return s >= lengthSection1A && s <= lengthRoad1;});
+    ON_CALL(section1B, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthSection1A && s <= lengthRoad1;});
     OWL::Fakes::Lane lane1AMinus1;
     ON_CALL(lane1AMinus1, GetOdId()).WillByDefault(Return(-1));
     OWL::Fakes::Lane lane1AMinus2;
     ON_CALL(lane1AMinus2, GetOdId()).WillByDefault(Return(-2));
-    ON_CALL(lane1AMinus2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(lane1AMinus2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     std::vector<OWL::Id> predecessorsLane1AMinus2{idOtherLane, idLane2BMinus1};
     ON_CALL(lane1AMinus2, GetPrevious()).WillByDefault(ReturnRef(predecessorsLane1AMinus2));
     OWL::Interfaces::Lanes lanesSection1A{&lane1AMinus1, &lane1AMinus2};
@@ -460,7 +460,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_AgainstStreamDirectio
     OWL::Fakes::Lane lane2AMinus2;
     ON_CALL(lane2AMinus2, GetId()).WillByDefault(Return(idLane2AMinus2));
     ON_CALL(lane2AMinus2, GetOdId()).WillByDefault(Return(-2));
-    ON_CALL(lane2AMinus2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0));
+    ON_CALL(lane2AMinus2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0_m));
     std::vector<OWL::Id> predecessorsLane2AMinus2{};
     ON_CALL(lane2AMinus2, GetPrevious()).WillByDefault(ReturnRef(predecessorsLane2AMinus2));
     OWL::Interfaces::Lanes lanesSection2A{&lane2AMinus1, &lane2AMinus2};
@@ -479,7 +479,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_AgainstStreamDirectio
 
     RoadStream roadStream{{element1, element2}};
 
-    const auto result = roadStream.CreateLaneStream(StreamPosition{90., 0.}, -2);
+    const auto result = roadStream.CreateLaneStream(StreamPosition{90._m, 0._m}, -2);
     ASSERT_THAT(result, SizeIs(3));
     EXPECT_THAT(result.at(0).lane, Eq(&lane1AMinus2));
     EXPECT_THAT(result.at(0).inStreamDirection, Eq(false));
@@ -494,12 +494,12 @@ TEST(RoadStream_Tests, CreateLaneStream_WithStreamPosition_AgainstStreamDirectio
 
 TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnFirstRoad)
 {
-    constexpr double lengthSection1A = 40;
-    constexpr double lengthSection1B = 70;
-    constexpr double lengthRoad1 = lengthSection1A + lengthSection1B;
-    constexpr double lengthSection2A = 80;
-    constexpr double lengthSection2B = 130;
-    constexpr double lengthRoad2 = lengthSection2A + lengthSection2B;
+    constexpr units::length::meter_t lengthSection1A = 40_m;
+    constexpr units::length::meter_t lengthSection1B = 70_m;
+    constexpr units::length::meter_t lengthRoad1 = lengthSection1A + lengthSection1B;
+    constexpr units::length::meter_t lengthSection2A = 80_m;
+    constexpr units::length::meter_t lengthSection2B = 130_m;
+    constexpr units::length::meter_t lengthRoad2 = lengthSection2A + lengthSection2B;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
     constexpr OWL::Id idLane2AMinus1 = 1;
@@ -512,9 +512,9 @@ TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnFirstRoad)
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     ON_CALL(road1, GetLength()).WillByDefault(Return(lengthRoad1));
     OWL::Fakes::Section section1A;
-    ON_CALL(section1A, Covers(_)).WillByDefault([&](const double& s){return s >= 0 && s <= lengthSection1A;});
+    ON_CALL(section1A, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthSection1A;});
     OWL::Fakes::Section section1B;
-    ON_CALL(section1B, Covers(_)).WillByDefault([&](const double& s){return s >= lengthSection1A && s <= lengthRoad1;});
+    ON_CALL(section1B, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthSection1A && s <= lengthRoad1;});
     OWL::Fakes::Lane lane1BMinus1;
     ON_CALL(lane1BMinus1, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(lane1BMinus1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(lengthSection1A));
@@ -526,7 +526,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnFirstRoad)
     ON_CALL(section1B, GetLanes()).WillByDefault(ReturnRef(lanesSection1B));
     std::vector<const OWL::Interfaces::Section*> sections1{&section1A, &section1B};
     ON_CALL(road1, GetSections()).WillByDefault(ReturnRef(sections1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
 
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
@@ -539,7 +539,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnFirstRoad)
     OWL::Fakes::Lane lane2APlus1;
     ON_CALL(lane2APlus1, GetId()).WillByDefault(Return(idLane2APlus1));
     ON_CALL(lane2APlus1, GetOdId()).WillByDefault(Return(1));
-    ON_CALL(lane2APlus1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0));
+    ON_CALL(lane2APlus1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0_m));
     std::vector<OWL::Id> successorsLane2APlus1{idLane2BPlus1};
     ON_CALL(lane2APlus1, GetNext()).WillByDefault(ReturnRef(successorsLane2APlus1));
     OWL::Fakes::Lane lane2APlus2;
@@ -561,7 +561,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnFirstRoad)
 
     RoadStream roadStream{{element1, element2}};
     
-    GlobalRoadPosition roadPosition{idRoad1, -1, lengthRoad1, 0, 0};
+    GlobalRoadPosition roadPosition{idRoad1, -1, lengthRoad1, 0_m, 0_rad};
 
     const auto result = roadStream.CreateLaneStream(roadPosition);
     ASSERT_THAT(result, SizeIs(3));
@@ -578,12 +578,12 @@ TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnFirstRoad)
 
 TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnSecondRoad)
 {
-    constexpr double lengthSection1A = 40;
-    constexpr double lengthSection1B = 70;
-    constexpr double lengthRoad1 = lengthSection1A + lengthSection1B;
-    constexpr double lengthSection2A = 80;
-    constexpr double lengthSection2B = 130;
-    constexpr double lengthRoad2 = lengthSection2A + lengthSection2B;
+    constexpr units::length::meter_t lengthSection1A = 40_m;
+    constexpr units::length::meter_t lengthSection1B = 70_m;
+    constexpr units::length::meter_t lengthRoad1 = lengthSection1A + lengthSection1B;
+    constexpr units::length::meter_t lengthSection2A = 80_m;
+    constexpr units::length::meter_t lengthSection2B = 130_m;
+    constexpr units::length::meter_t lengthRoad2 = lengthSection2A + lengthSection2B;
     const std::string idRoad1 = "Road1";
     const std::string idRoad2 = "Road2";
     constexpr OWL::Id idLane2AMinus1 = 1;
@@ -608,19 +608,19 @@ TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnSecondRoad)
     ON_CALL(section1B, GetLanes()).WillByDefault(ReturnRef(lanesSection1B));
     std::vector<const OWL::Interfaces::Section*> sections1{&section1A, &section1B};
     ON_CALL(road1, GetSections()).WillByDefault(ReturnRef(sections1));
-    RoadStreamElement element1 {&road1, 0., true};
+    RoadStreamElement element1 {&road1, 0._m, true};
 
     OWL::Fakes::Road road2;
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
     ON_CALL(road2, GetLength()).WillByDefault(Return(lengthRoad2));
     OWL::Fakes::Section section2A;
-    ON_CALL(section2A, Covers(_)).WillByDefault([&](const double& s){return s >= 0 && s <= lengthSection2A;});
+    ON_CALL(section2A, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthSection2A;});
     OWL::Fakes::Section section2B;
-    ON_CALL(section2B, Covers(_)).WillByDefault([&](const double& s){return s >= lengthSection2A && s <= lengthRoad2;});
+    ON_CALL(section2B, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthSection2A && s <= lengthRoad2;});
     OWL::Fakes::Lane lane2AMinus1;
     ON_CALL(lane2AMinus1, GetId()).WillByDefault(Return(idLane2AMinus1));
     ON_CALL(lane2AMinus1, GetOdId()).WillByDefault(Return(-1));
-    ON_CALL(lane2AMinus1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0));
+    ON_CALL(lane2AMinus1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0_m));
     std::vector<OWL::Id> successorsLane2AMinus1{};
     ON_CALL(lane2AMinus1, GetNext()).WillByDefault(ReturnRef(successorsLane2AMinus1));
     OWL::Fakes::Lane lane2APlus1;
@@ -642,7 +642,7 @@ TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnSecondRoad)
 
     RoadStream roadStream{{element1, element2}};
     
-    GlobalRoadPosition roadPosition{idRoad2, -1, 0, 0, 0};
+    GlobalRoadPosition roadPosition{idRoad2, -1, 0_m, 0_m, 0_rad};
 
     const auto result = roadStream.CreateLaneStream(roadPosition);
     ASSERT_THAT(result, SizeIs(1));
@@ -653,8 +653,8 @@ TEST(RoadStream_Tests, CreateLaneStream_WithGlobalRoadPosition_OnSecondRoad)
 
 TEST(RoadStream_Tests, GetAllLaneStreams_SingleRoadWithTwoSections)
 {
-    constexpr double lengthSection1 = 40;
-    constexpr double lengthSection2 = 70;
+    constexpr units::length::meter_t lengthSection1 = 40_m;
+    constexpr units::length::meter_t lengthSection2 = 70_m;
     constexpr OWL::Id idLane1A = 10;
     constexpr OWL::Id idLane1B = 11;
     constexpr OWL::Id idLane2A = 12;
@@ -664,17 +664,17 @@ TEST(RoadStream_Tests, GetAllLaneStreams_SingleRoadWithTwoSections)
     OWL::Fakes::Road road;
 
     OWL::Fakes::Section section1;
-    ON_CALL(section1, Covers(_)).WillByDefault([&](const double& s){return s >= 0 && s <= lengthSection1;});
+    ON_CALL(section1, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthSection1;});
     OWL::Fakes::Lane lane1A;
     ON_CALL(lane1A, GetId()).WillByDefault(Return(idLane1A));
     ON_CALL(lane1A, GetOdId()).WillByDefault(Return(-1));
-    ON_CALL(lane1A, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(lane1A, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     ON_CALL(lane1A, GetNext()).WillByDefault(ReturnRef(emptyIds));
     ON_CALL(lane1A, GetPrevious()).WillByDefault(ReturnRef(emptyIds));
     OWL::Fakes::Lane lane1B;
     ON_CALL(lane1B, GetId()).WillByDefault(Return(idLane1B));
     ON_CALL(lane1B, GetOdId()).WillByDefault(Return(-2));
-    ON_CALL(lane1B, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(lane1B, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     std::vector<OWL::Id> successorsLane1B{idLane2A};
     ON_CALL(lane1B, GetNext()).WillByDefault(ReturnRef(successorsLane1B));
     ON_CALL(lane1B, GetPrevious()).WillByDefault(ReturnRef(emptyIds));
@@ -682,7 +682,7 @@ TEST(RoadStream_Tests, GetAllLaneStreams_SingleRoadWithTwoSections)
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
 
     OWL::Fakes::Section section2;
-    ON_CALL(section2, Covers(_)).WillByDefault([&](const double& s){return s >= lengthSection1 && s <= lengthSection1 + lengthSection2;});
+    ON_CALL(section2, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthSection1 && s <= lengthSection1 + lengthSection2;});
     OWL::Fakes::Lane lane2A;
     ON_CALL(lane2A, GetId()).WillByDefault(Return(idLane2A));
     ON_CALL(lane2A, GetOdId()).WillByDefault(Return(-1));
@@ -701,7 +701,7 @@ TEST(RoadStream_Tests, GetAllLaneStreams_SingleRoadWithTwoSections)
 
     OWL::Interfaces::Sections sections{&section1, &section2};
     ON_CALL(road, GetSections()).WillByDefault(ReturnRef(sections));
-    RoadStreamElement element{&road, 0., true};
+    RoadStreamElement element{&road, 0._m, true};
 
     RoadStream roadStream{{element}};
 
@@ -712,13 +712,13 @@ TEST(RoadStream_Tests, GetAllLaneStreams_SingleRoadWithTwoSections)
 
 TEST(LaneStream_Tests, GetAgentsInRange_EmptyLanes)
 {
-    constexpr double lengthLane1 = 90;
-    constexpr double lengthLane2 = 120;
+    constexpr units::length::meter_t lengthLane1 = 90_m;
+    constexpr units::length::meter_t lengthLane2 = 120_m;
     OWL::Interfaces::LaneAssignments emptyObjects{};
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetLength()).WillByDefault(Return(lengthLane1));
     ON_CALL(lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyObjects));
-    LaneStreamElement element1{&lane1, 0, true};
+    LaneStreamElement element1{&lane1, 0_m, true};
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetLength()).WillByDefault(Return(lengthLane2));
     ON_CALL(lane2, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyObjects));
@@ -726,14 +726,14 @@ TEST(LaneStream_Tests, GetAgentsInRange_EmptyLanes)
 
     LaneStream laneStream{{element1, element2}};
 
-    auto result = laneStream.GetAgentsInRange({0,0}, {210,0});
+    auto result = laneStream.GetAgentsInRange({0_m,0_m}, {210_m,0_m});
     ASSERT_THAT(result, IsEmpty());
 }
 
 TEST(LaneStream_Tests, GetAgentsInRange_InStreamDirection)
 {
-    constexpr double lengthLane1 = 90;
-    constexpr double lengthLane2 = 120;
+    constexpr units::length::meter_t lengthLane1 = 90_m;
+    constexpr units::length::meter_t lengthLane2 = 120_m;
     OWL::Fakes::MovingObject moving1;
     OWL::Fakes::MovingObject moving2;
     OWL::Fakes::MovingObject moving3;
@@ -747,41 +747,41 @@ TEST(LaneStream_Tests, GetAgentsInRange_InStreamDirection)
     moving2.SetLinkedObjectForTesting(&agent2);
     moving3.SetLinkedObjectForTesting(&agent3);
     moving4.SetLinkedObjectForTesting(&agent4);
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,15,0,0},
-                              GlobalRoadPosition{"",0,12,0,0},
-                              GlobalRoadPosition{"",0,12,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,40,0,0},
-                              GlobalRoadPosition{"",0,45,0,0},
-                              GlobalRoadPosition{"",0,42,0,0},
-                              GlobalRoadPosition{"",0,42,0,0}};
-    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,60,0,0},
-                              GlobalRoadPosition{"",0,65,0,0},
-                              GlobalRoadPosition{"",0,62,0,0},
-                              GlobalRoadPosition{"",0,62,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,12_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,12_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,40_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,45_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,42_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,42_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,60_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,65_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,62_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,62_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments objectsLane1{{overlap1, &moving1},
                                                   {overlap2, &moving2},
                                                   {overlap3, &stationary}};
-    OWL::LaneOverlap overlap4{GlobalRoadPosition{"",0,100,0,0},
-                              GlobalRoadPosition{"",0,105,0,0},
-                              GlobalRoadPosition{"",0,102,0,0},
-                              GlobalRoadPosition{"",0,102,0,0}};
-    OWL::LaneOverlap overlap5{GlobalRoadPosition{"",0,130,0,0},
-                              GlobalRoadPosition{"",0,135,0,0},
-                              GlobalRoadPosition{"",0,132,0,0},
-                              GlobalRoadPosition{"",0,132,0,0}};
-    OWL::LaneOverlap overlap6{GlobalRoadPosition{"",0,150,0,0},
-                              GlobalRoadPosition{"",0,155,0,0},
-                              GlobalRoadPosition{"",0,152,0,0},
-                              GlobalRoadPosition{"",0,152,0,0}};
+    OWL::LaneOverlap overlap4{GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,105_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,102_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,102_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap5{GlobalRoadPosition{"",0,130_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,135_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,132_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,132_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap6{GlobalRoadPosition{"",0,150_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,155_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,152_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,152_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments objectsLane2{{overlap4, &moving2},
                                                   {overlap5, &moving3},
                                                   {overlap6, &moving4}};
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetLength()).WillByDefault(Return(lengthLane1));
-    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     ON_CALL(lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(objectsLane1));
-    LaneStreamElement element1{&lane1, 0, true};
+    LaneStreamElement element1{&lane1, 0_m, true};
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetLength()).WillByDefault(Return(lengthLane2));
     ON_CALL(lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(lengthLane1));
@@ -790,14 +790,14 @@ TEST(LaneStream_Tests, GetAgentsInRange_InStreamDirection)
 
     LaneStream laneStream{{element1, element2}};
 
-    auto result = laneStream.GetAgentsInRange({20,0}, {140,0});
+    auto result = laneStream.GetAgentsInRange({20_m,0_m}, {140_m,0_m});
     ASSERT_THAT(result, ElementsAre(&agent2, &agent3));
 }
 
 TEST(LaneStream_Tests, GetAgentsInRange_AgainstStreamDirection)
 {
-    constexpr double lengthLane1 = 90;
-    constexpr double lengthLane2 = 120;
+    constexpr units::length::meter_t lengthLane1 = 90_m;
+    constexpr units::length::meter_t lengthLane2 = 120_m;
     OWL::Fakes::MovingObject moving1;
     OWL::Fakes::MovingObject moving2;
     OWL::Fakes::MovingObject moving3;
@@ -811,39 +811,39 @@ TEST(LaneStream_Tests, GetAgentsInRange_AgainstStreamDirection)
     moving2.SetLinkedObjectForTesting(&agent2);
     moving3.SetLinkedObjectForTesting(&agent3);
     moving4.SetLinkedObjectForTesting(&agent4);
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,80,0,0},
-                              GlobalRoadPosition{"",0,85,0,0},
-                              GlobalRoadPosition{"",0,82,0,0},
-                              GlobalRoadPosition{"",0,82,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,60,0,0},
-                              GlobalRoadPosition{"",0,65,0,0},
-                              GlobalRoadPosition{"",0,62,0,0},
-                              GlobalRoadPosition{"",0,62,0,0}};
-    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,15,0,0},
-                              GlobalRoadPosition{"",0,12,0,0},
-                              GlobalRoadPosition{"",0,12,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,80_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,85_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,82_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,82_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,60_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,65_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,62_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,62_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,12_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,12_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments objectsLane1{{overlap1, &moving1},
                                                   {overlap2, &stationary},
                                                   {overlap3, &moving2}};
-    OWL::LaneOverlap overlap4{GlobalRoadPosition{"",0,170,0,0},
-                              GlobalRoadPosition{"",0,175,0,0},
-                              GlobalRoadPosition{"",0,172,0,0},
-                              GlobalRoadPosition{"",0,172,0,0}};
-    OWL::LaneOverlap overlap5{GlobalRoadPosition{"",0,130,0,0},
-                              GlobalRoadPosition{"",0,135,0,0},
-                              GlobalRoadPosition{"",0,132,0,0},
-                              GlobalRoadPosition{"",0,132,0,0}};
-    OWL::LaneOverlap overlap6{GlobalRoadPosition{"",0,100,0,0},
-                              GlobalRoadPosition{"",0,105,0,0},
-                              GlobalRoadPosition{"",0,102,0,0},
-                              GlobalRoadPosition{"",0,102,0,0}};
+    OWL::LaneOverlap overlap4{GlobalRoadPosition{"",0,170_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,175_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,172_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,172_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap5{GlobalRoadPosition{"",0,130_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,135_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,132_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,132_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap6{GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,105_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,102_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,102_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments objectsLane2{{overlap4, &moving2},
                                                   {overlap5, &moving3},
                                                   {overlap6, &moving4}};
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetLength()).WillByDefault(Return(lengthLane1));
-    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     ON_CALL(lane1, GetWorldObjects(false)).WillByDefault(ReturnRef(objectsLane1));
     LaneStreamElement element1{&lane1, lengthLane1, false};
     OWL::Fakes::Lane lane2;
@@ -854,15 +854,15 @@ TEST(LaneStream_Tests, GetAgentsInRange_AgainstStreamDirection)
 
     LaneStream laneStream{{element1, element2}};
 
-    auto result = laneStream.GetAgentsInRange({20,0}, {190,0});
+    auto result = laneStream.GetAgentsInRange({20_m,0_m}, {190_m,0_m});
     ASSERT_THAT(result, ElementsAre(&agent2, &agent3));
 }
 
 TEST(LaneStream_Tests, GetStreamDistanceWithAgent_SingleRoadWithThreeSections)
 {
-    constexpr double lengthLane1 = 90;
-    constexpr double lengthLane2 = 120;
-    constexpr double lengthLane3 = 210;
+    constexpr units::length::meter_t lengthLane1 = 90_m;
+    constexpr units::length::meter_t lengthLane2 = 120_m;
+    constexpr units::length::meter_t lengthLane3 = 210_m;
 
     OWL::Fakes::Road road;
     const std::string idRoad = "RoadB";
@@ -870,16 +870,16 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_SingleRoadWithThreeSections)
 
     OWL::Fakes::Lane lane1;
     OWL::Fakes::Section section1;
-    ON_CALL(section1, Covers(_)).WillByDefault([&](double s){return s >= 0 && s <= lengthLane1;});
-    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(section1, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthLane1;});
+    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     ON_CALL(lane1, GetSection()).WillByDefault(ReturnRef(section1));
     ON_CALL(lane1, GetRoad()).WillByDefault(ReturnRef(road));
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(-2));
-    LaneStreamElement element1{&lane1, 0, true};
+    LaneStreamElement element1{&lane1, 0_m, true};
 
     OWL::Fakes::Lane lane2;
     OWL::Fakes::Section section2;
-    ON_CALL(section2, Covers(_)).WillByDefault([&](double s){return s >= lengthLane1 && s <= lengthLane1 +  lengthLane2;});
+    ON_CALL(section2, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthLane1 && s <= lengthLane1 +  lengthLane2;});
     ON_CALL(lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(lengthLane1));
     ON_CALL(lane2, GetSection()).WillByDefault(ReturnRef(section2));
     ON_CALL(lane2, GetRoad()).WillByDefault(ReturnRef(road));
@@ -888,7 +888,7 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_SingleRoadWithThreeSections)
 
     OWL::Fakes::Lane lane3;
     OWL::Fakes::Section section3;
-    ON_CALL(section3, Covers(_)).WillByDefault([&](double s){return s >= lengthLane1 + lengthLane2 && s <= lengthLane1 + lengthLane2 + lengthLane3;});
+    ON_CALL(section3, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthLane1 + lengthLane2 && s <= lengthLane1 + lengthLane2 + lengthLane3;});
     ON_CALL(lane3, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(lengthLane1 + lengthLane2));
     ON_CALL(lane3, GetSection()).WillByDefault(ReturnRef(section3));
     ON_CALL(lane3, GetRoad()).WillByDefault(ReturnRef(road));
@@ -896,9 +896,9 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_SingleRoadWithThreeSections)
     LaneStreamElement element3{&lane3, lengthLane1 + lengthLane2, true};
 
     FakeAgent agent;
-    GlobalRoadPositions referencePoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 200., 1., 0.1}}};
-    GlobalRoadPositions mainLocatePoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 220., -1., 0.2}}};
-    GlobalRoadPositions rearPoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 190., -1., 0.3}}};
+    GlobalRoadPositions referencePoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 200._m, 1._m, 0.1_rad}}};
+    GlobalRoadPositions mainLocatePoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 220._m, -1._m, 0.2_rad}}};
+    GlobalRoadPositions rearPoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 190._m, -1._m, 0.3_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(mainLocatePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault(ReturnRef(rearPoint));
@@ -908,22 +908,22 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_SingleRoadWithThreeSections)
     auto front = laneStream.GetStreamPosition(&agent, ObjectPointPredefined::FrontCenter);
     auto rear = laneStream.GetStreamPosition(&agent, ObjectPointPredefined::RearCenter);
 
-    EXPECT_THAT(referencePointOnStream->s, DoubleEq(200.));
-    EXPECT_THAT(referencePointOnStream->t, DoubleEq(1.));
-    EXPECT_THAT(referencePointOnStream->hdg, DoubleNear(0.1, CommonHelper::EPSILON));
-    EXPECT_THAT(front->s, DoubleEq(220.));
-    EXPECT_THAT(front->t, DoubleEq(-1.));
-    EXPECT_THAT(front->hdg, DoubleNear(0.2, CommonHelper::EPSILON));
-    EXPECT_THAT(rear->s, DoubleEq(190.));
-    EXPECT_THAT(rear->t, DoubleEq(-1.));
-    EXPECT_THAT(rear->hdg, DoubleNear(0.3, CommonHelper::EPSILON));
+    EXPECT_THAT(referencePointOnStream->s.value(), DoubleEq(200.));
+    EXPECT_THAT(referencePointOnStream->t.value(), DoubleEq(1.));
+    EXPECT_THAT(referencePointOnStream->hdg.value(), DoubleNear(0.1, CommonHelper::EPSILON));
+    EXPECT_THAT(front->s.value(), DoubleEq(220.));
+    EXPECT_THAT(front->t.value(), DoubleEq(-1.));
+    EXPECT_THAT(front->hdg.value(), DoubleNear(0.2, CommonHelper::EPSILON));
+    EXPECT_THAT(rear->s.value(), DoubleEq(190.));
+    EXPECT_THAT(rear->t.value(), DoubleEq(-1.));
+    EXPECT_THAT(rear->hdg.value(), DoubleNear(0.3, CommonHelper::EPSILON));
 }
 
 TEST(LaneStream_Tests, GetStreamDistanceWithAgent_ThreeRoads)
 {
-    constexpr double lengthLane1 = 90;
-    constexpr double lengthLane2 = 120;
-    constexpr double lengthLane3 = 210;
+    constexpr units::length::meter_t lengthLane1 = 90_m;
+    constexpr units::length::meter_t lengthLane2 = 120_m;
+    constexpr units::length::meter_t lengthLane3 = 210_m;
 
     OWL::Fakes::Road road1;
     const std::string idRoad1 = "RoadA";
@@ -937,17 +937,17 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_ThreeRoads)
 
     OWL::Fakes::Lane lane1;
     OWL::Fakes::Section section1;
-    ON_CALL(section1, Covers(_)).WillByDefault([&](double s){return s >= 0 && s <= lengthLane1;});
-    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(section1, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthLane1;});
+    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     ON_CALL(lane1, GetSection()).WillByDefault(ReturnRef(section1));
     ON_CALL(lane1, GetRoad()).WillByDefault(ReturnRef(road1));
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(-2));
-    LaneStreamElement element1{&lane1, 0, true};
+    LaneStreamElement element1{&lane1, 0_m, true};
 
     OWL::Fakes::Lane lane2;
     OWL::Fakes::Section section2;
-    ON_CALL(section2, Covers(_)).WillByDefault([&](double s){return s >= 0 && s <= lengthLane2;});
-    ON_CALL(lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(section2, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthLane2;});
+    ON_CALL(lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     ON_CALL(lane2, GetSection()).WillByDefault(ReturnRef(section2));
     ON_CALL(lane2, GetRoad()).WillByDefault(ReturnRef(road2));
     ON_CALL(lane2, GetOdId()).WillByDefault(Return(-2));
@@ -955,17 +955,17 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_ThreeRoads)
 
     OWL::Fakes::Lane lane3;
     OWL::Fakes::Section section3;
-    ON_CALL(section3, Covers(_)).WillByDefault([&](double s){return s >= 0 && s <= lengthLane3;});
-    ON_CALL(lane3, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(section3, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthLane3;});
+    ON_CALL(lane3, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     ON_CALL(lane3, GetSection()).WillByDefault(ReturnRef(section3));
     ON_CALL(lane3, GetRoad()).WillByDefault(ReturnRef(road3));
     ON_CALL(lane3, GetOdId()).WillByDefault(Return(-2));
     LaneStreamElement element3{&lane3, lengthLane1 + lengthLane2, true};
 
     FakeAgent agent;
-    GlobalRoadPositions referencePoint = {{"RoadX", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 10., 1., 0.1}}};
-    GlobalRoadPositions mainLocatePoint = {{"RoadX", {}}, {"RoadC", GlobalRoadPosition{"RoadC", -2, 5., -1., 0.2}}};
-    GlobalRoadPositions rearPoint = {{"RoadX", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 0., -1., 0.3}}};
+    GlobalRoadPositions referencePoint = {{"RoadX", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 10._m, 1._m, 0.1_rad}}};
+    GlobalRoadPositions mainLocatePoint = {{"RoadX", {}}, {"RoadC", GlobalRoadPosition{"RoadC", -2, 5._m, -1._m, 0.2_rad}}};
+    GlobalRoadPositions rearPoint = {{"RoadX", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 0._m, -1._m, 0.3_rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(mainLocatePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault(ReturnRef(rearPoint));
@@ -975,22 +975,22 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_ThreeRoads)
     auto front = laneStream.GetStreamPosition(&agent, ObjectPointPredefined::FrontCenter);
     auto rear = laneStream.GetStreamPosition(&agent, ObjectPointPredefined::RearCenter);
 
-    EXPECT_THAT(referencePointOnStream->s, DoubleEq(200.));
-    EXPECT_THAT(referencePointOnStream->t, DoubleEq(-1.));
-    EXPECT_THAT(referencePointOnStream->hdg, DoubleNear(0.1 - M_PI, CommonHelper::EPSILON));
-    EXPECT_THAT(front->s, DoubleEq(215.));
-    EXPECT_THAT(front->t, DoubleEq(-1.));
-    EXPECT_THAT(front->hdg, DoubleNear(0.2, CommonHelper::EPSILON));
-    EXPECT_THAT(rear->s, DoubleEq(210.));
-    EXPECT_THAT(rear->t, DoubleEq(1.));
-    EXPECT_THAT(rear->hdg, DoubleNear(0.3 - M_PI, CommonHelper::EPSILON));
+    EXPECT_THAT(referencePointOnStream->s.value(), DoubleEq(200.));
+    EXPECT_THAT(referencePointOnStream->t.value(), DoubleEq(-1.));
+    EXPECT_THAT(referencePointOnStream->hdg.value(), DoubleNear(0.1 - M_PI, CommonHelper::EPSILON));
+    EXPECT_THAT(front->s.value(), DoubleEq(215.));
+    EXPECT_THAT(front->t.value(), DoubleEq(-1.));
+    EXPECT_THAT(front->hdg.value(), DoubleNear(0.2, CommonHelper::EPSILON));
+    EXPECT_THAT(rear->s.value(), DoubleEq(210.));
+    EXPECT_THAT(rear->t.value(), DoubleEq(1.));
+    EXPECT_THAT(rear->hdg.value(), DoubleNear(0.3 - M_PI, CommonHelper::EPSILON));
 }
 
 TEST(LaneStream_Tests, GetStreamDistanceWithAgent_AgentOffLane)
 {
-    constexpr double lengthLane1 = 90;
-    constexpr double lengthLane2 = 120;
-    constexpr double lengthLane3 = 210;
+    constexpr units::length::meter_t lengthLane1 = 90_m;
+    constexpr units::length::meter_t lengthLane2 = 120_m;
+    constexpr units::length::meter_t lengthLane3 = 210_m;
 
     OWL::Fakes::Road road;
     const std::string idRoad = "RoadB";
@@ -998,16 +998,16 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_AgentOffLane)
 
     OWL::Fakes::Lane lane1;
     OWL::Fakes::Section section1;
-    ON_CALL(section1, Covers(_)).WillByDefault([&](double s){return s >= 0 && s <= lengthLane1;});
-    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
+    ON_CALL(section1, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= 0_m && s <= lengthLane1;});
+    ON_CALL(lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
     ON_CALL(lane1, GetSection()).WillByDefault(ReturnRef(section1));
     ON_CALL(lane1, GetRoad()).WillByDefault(ReturnRef(road));
     ON_CALL(lane1, GetOdId()).WillByDefault(Return(-2));
-    LaneStreamElement element1{&lane1, 0, true};
+    LaneStreamElement element1{&lane1, 0_m, true};
 
     OWL::Fakes::Lane lane2;
     OWL::Fakes::Section section2;
-    ON_CALL(section2, Covers(_)).WillByDefault([&](double s){return s >= lengthLane1 && s <= lengthLane1 +  lengthLane2;});
+    ON_CALL(section2, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthLane1 && s <= lengthLane1 +  lengthLane2;});
     ON_CALL(lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(lengthLane1));
     ON_CALL(lane2, GetSection()).WillByDefault(ReturnRef(section2));
     ON_CALL(lane2, GetRoad()).WillByDefault(ReturnRef(road));
@@ -1016,7 +1016,7 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_AgentOffLane)
 
     OWL::Fakes::Lane lane3;
     OWL::Fakes::Section section3;
-    ON_CALL(section3, Covers(_)).WillByDefault([&](double s){return s >= lengthLane1 + lengthLane2 && s <= lengthLane1 + lengthLane2 + lengthLane3;});
+    ON_CALL(section3, Covers(_)).WillByDefault([&](units::length::meter_t s){return s >= lengthLane1 + lengthLane2 && s <= lengthLane1 + lengthLane2 + lengthLane3;});
     ON_CALL(lane3, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(lengthLane1 + lengthLane2));
     ON_CALL(lane3, GetSection()).WillByDefault(ReturnRef(section3));
     ON_CALL(lane3, GetRoad()).WillByDefault(ReturnRef(road));
@@ -1024,9 +1024,9 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_AgentOffLane)
     LaneStreamElement element3{&lane3, lengthLane1 + lengthLane2, true};
 
     FakeAgent agent;
-    GlobalRoadPositions referencePoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -3, 200., 1., 0.}}};
-    GlobalRoadPositions mainLocatePoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 220., -1., 0.}}};
-    GlobalRoadPositions rearPoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -3, 190., -1., 0.}}};
+    GlobalRoadPositions referencePoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -3, 200._m, 1._m, 0._rad}}};
+    GlobalRoadPositions mainLocatePoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -2, 220._m, -1._m, 0._rad}}};
+    GlobalRoadPositions rearPoint = {{"RoadA", {}}, {"RoadB", GlobalRoadPosition{"RoadB", -3, 190._m, -1._m, 0._rad}}};
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::Reference))).WillByDefault(ReturnRef(referencePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::FrontCenter))).WillByDefault(ReturnRef(mainLocatePoint));
     ON_CALL(agent, GetRoadPosition(VariantWith<ObjectPointPredefined>(ObjectPointPredefined::RearCenter))).WillByDefault(ReturnRef(rearPoint));
@@ -1043,15 +1043,15 @@ TEST(LaneStream_Tests, GetStreamDistanceWithAgent_AgentOffLane)
 
 TEST(LaneStream_Tests, GetLaneTypes_AllOfSameType)
 {
-    constexpr double lengthLane1 = 90;
-    constexpr double lengthLane2 = 120;
-    constexpr double lengthLane3 = 150;
+    constexpr units::length::meter_t lengthLane1 = 90_m;
+    constexpr units::length::meter_t lengthLane2 = 120_m;
+    constexpr units::length::meter_t lengthLane3 = 150_m;
     OWL::Interfaces::LaneAssignments emptyObjects{};
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetLength()).WillByDefault(Return(lengthLane1));
     ON_CALL(lane1, GetLaneType()).WillByDefault(Return(LaneType::Driving));
     ON_CALL(lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyObjects));
-    LaneStreamElement element1{&lane1, 0, true};
+    LaneStreamElement element1{&lane1, 0_m, true};
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetLength()).WillByDefault(Return(lengthLane2));
     ON_CALL(lane2, GetLaneType()).WillByDefault(Return(LaneType::Driving));
@@ -1067,20 +1067,20 @@ TEST(LaneStream_Tests, GetLaneTypes_AllOfSameType)
 
     auto result = laneStream.GetLaneTypes();
 
-    ASSERT_THAT(result, ElementsAre(std::make_pair(0, LaneType::Driving)));
+    ASSERT_THAT(result, ElementsAre(std::make_pair(0_m, LaneType::Driving)));
 }
 
 TEST(LaneStream_Tests, GetLaneTypes_MixedTypes)
 {
-    constexpr double lengthLane1 = 90;
-    constexpr double lengthLane2 = 120;
-    constexpr double lengthLane3 = 150;
+    constexpr units::length::meter_t lengthLane1 = 90_m;
+    constexpr units::length::meter_t lengthLane2 = 120_m;
+    constexpr units::length::meter_t lengthLane3 = 150_m;
     OWL::Interfaces::LaneAssignments emptyObjects{};
     OWL::Fakes::Lane lane1;
     ON_CALL(lane1, GetLength()).WillByDefault(Return(lengthLane1));
     ON_CALL(lane1, GetLaneType()).WillByDefault(Return(LaneType::Driving));
     ON_CALL(lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyObjects));
-    LaneStreamElement element1{&lane1, 0, true};
+    LaneStreamElement element1{&lane1, 0_m, true};
     OWL::Fakes::Lane lane2;
     ON_CALL(lane2, GetLength()).WillByDefault(Return(lengthLane2));
     ON_CALL(lane2, GetLaneType()).WillByDefault(Return(LaneType::Driving));
@@ -1096,6 +1096,6 @@ TEST(LaneStream_Tests, GetLaneTypes_MixedTypes)
 
     auto result = laneStream.GetLaneTypes();
 
-    ASSERT_THAT(result, ElementsAre(std::make_pair(0, LaneType::Driving),
+    ASSERT_THAT(result, ElementsAre(std::make_pair(0_m, LaneType::Driving),
                                     std::make_pair(lengthLane1 + lengthLane2, LaneType::None)));
 }
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldData_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldData_Tests.cpp
index e96fd212c9e2c139f354bc11b566a66c29ac5d11..0137ea5a84fa8af12cd98999416ee3fd79ff5384 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldData_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldData_Tests.cpp
@@ -21,7 +21,7 @@ using ::testing::HasSubstr;
 
 struct SetEnvironmentIllumination_Data
 {
-    double sunIntensity;
+    mantle_api::Illumination sunIntensity;
     osi3::EnvironmentalConditions_AmbientIllumination expectedLevel;
 };
 
@@ -31,29 +31,31 @@ class SetEnvironmentIlluminationTest : public::testing::TestWithParam<SetEnviron
 
 TEST_P(SetEnvironmentIlluminationTest, SetCorrectLevelInGroundtruth)
 {
-    openScenario::EnvironmentAction environmentAction;
-    environmentAction.weather.sun.intensity = GetParam().sunIntensity;
+    mantle_api::Weather weather;
+    weather.illumination = GetParam().sunIntensity;
     OWL::WorldData worldData{nullptr};
 
-    worldData.SetEnvironment(environmentAction);
+    worldData.SetEnvironment(weather);
 
     EXPECT_THAT(worldData.GetOsiGroundTruth().environmental_conditions().ambient_illumination(), Eq(GetParam().expectedLevel));
 }
 
 INSTANTIATE_TEST_SUITE_P(IlluminationTests, SetEnvironmentIlluminationTest, ::testing::Values(
-SetEnvironmentIllumination_Data{0.005, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL1},
-SetEnvironmentIllumination_Data{0.5, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL2},
-SetEnvironmentIllumination_Data{2.0, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL3},
-SetEnvironmentIllumination_Data{5.0, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL4},
-SetEnvironmentIllumination_Data{15.0, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL5},
-SetEnvironmentIllumination_Data{50.0, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL6},
-SetEnvironmentIllumination_Data{500.0, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL7},
-SetEnvironmentIllumination_Data{5000.0, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL8},
-SetEnvironmentIllumination_Data{2e5, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL9}));
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel1, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL1},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel2, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL2},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel3, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL3},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel4, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL4},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel5, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL5},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel6, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL6},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel7, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL7},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel8, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL8},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kLevel9, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_LEVEL9},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kOther, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_OTHER},
+SetEnvironmentIllumination_Data{mantle_api::Illumination::kUnknown, osi3::EnvironmentalConditions_AmbientIllumination_AMBIENT_ILLUMINATION_UNKNOWN}));
 
 struct SetEnvironmentFog_Data
 {
-    double visualRange;
+    mantle_api::Fog visualRange;
     osi3::EnvironmentalConditions_Fog expectedLevel;
 };
 
@@ -63,24 +65,58 @@ class SetEnvironmentFogTest : public::testing::TestWithParam<SetEnvironmentFog_D
 
 TEST_P(SetEnvironmentFogTest, SetCorrectLevelInGroundtruth)
 {
-    openScenario::EnvironmentAction environmentAction;
-    environmentAction.weather.fog.visualRange = GetParam().visualRange;
+    mantle_api::Weather weather;
+    weather.fog = GetParam().visualRange;
     OWL::WorldData worldData{nullptr};
 
-    worldData.SetEnvironment(environmentAction);
+    worldData.SetEnvironment(weather);
 
     EXPECT_THAT(worldData.GetOsiGroundTruth().environmental_conditions().fog(), Eq(GetParam().expectedLevel));
 }
 
 INSTANTIATE_TEST_SUITE_P(Fog, SetEnvironmentFogTest, ::testing::Values(
-SetEnvironmentFog_Data{10, osi3::EnvironmentalConditions_Fog_FOG_DENSE},
-SetEnvironmentFog_Data{100, osi3::EnvironmentalConditions_Fog_FOG_THICK},
-SetEnvironmentFog_Data{500, osi3::EnvironmentalConditions_Fog_FOG_LIGHT},
-SetEnvironmentFog_Data{1500, osi3::EnvironmentalConditions_Fog_FOG_MIST},
-SetEnvironmentFog_Data{3000, osi3::EnvironmentalConditions_Fog_FOG_POOR_VISIBILITY},
-SetEnvironmentFog_Data{6000, osi3::EnvironmentalConditions_Fog_FOG_MODERATE_VISIBILITY},
-SetEnvironmentFog_Data{2e4, osi3::EnvironmentalConditions_Fog_FOG_GOOD_VISIBILITY},
-SetEnvironmentFog_Data{5e4, osi3::EnvironmentalConditions_Fog_FOG_EXCELLENT_VISIBILITY}));
+SetEnvironmentFog_Data{mantle_api::Fog::kDense, osi3::EnvironmentalConditions_Fog_FOG_DENSE},
+SetEnvironmentFog_Data{mantle_api::Fog::kThick, osi3::EnvironmentalConditions_Fog_FOG_THICK},
+SetEnvironmentFog_Data{mantle_api::Fog::kLight, osi3::EnvironmentalConditions_Fog_FOG_LIGHT},
+SetEnvironmentFog_Data{mantle_api::Fog::kMist, osi3::EnvironmentalConditions_Fog_FOG_MIST},
+SetEnvironmentFog_Data{mantle_api::Fog::kPoorVisibility, osi3::EnvironmentalConditions_Fog_FOG_POOR_VISIBILITY},
+SetEnvironmentFog_Data{mantle_api::Fog::kModerateVisibility, osi3::EnvironmentalConditions_Fog_FOG_MODERATE_VISIBILITY},
+SetEnvironmentFog_Data{mantle_api::Fog::kGoodVisibility, osi3::EnvironmentalConditions_Fog_FOG_GOOD_VISIBILITY},
+SetEnvironmentFog_Data{mantle_api::Fog::kExcellentVisibility, osi3::EnvironmentalConditions_Fog_FOG_EXCELLENT_VISIBILITY},
+SetEnvironmentFog_Data{mantle_api::Fog::kOther, osi3::EnvironmentalConditions_Fog_FOG_OTHER},
+SetEnvironmentFog_Data{mantle_api::Fog::kUnknown, osi3::EnvironmentalConditions_Fog_FOG_UNKNOWN}));
+
+struct SetEnvironmentPrecipitation_Data
+{
+    mantle_api::Precipitation intensity;
+    osi3::EnvironmentalConditions_Precipitation expectedLevel;
+};
+
+class SetEnvironmentPrecipitationTest : public::testing::TestWithParam<SetEnvironmentPrecipitation_Data>
+{
+};
+
+TEST_P(SetEnvironmentPrecipitationTest, SetCorrectLevelInGroundtruth)
+{
+    mantle_api::Weather weather;
+    weather.precipitation = GetParam().intensity;
+    OWL::WorldData worldData{nullptr};
+
+    worldData.SetEnvironment(weather);
+
+    EXPECT_THAT(worldData.GetOsiGroundTruth().environmental_conditions().precipitation(), Eq(GetParam().expectedLevel));
+}
+
+INSTANTIATE_TEST_SUITE_P(Precipitation, SetEnvironmentPrecipitationTest, ::testing::Values(
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kUnknown, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_UNKNOWN},
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kOther, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_OTHER},
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kNone, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_NONE},
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kVeryLight, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_VERY_LIGHT},
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kLight, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_LIGHT},
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kModerate, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_MODERATE},
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kHeavy, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_HEAVY},
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kVeryHeavy, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_VERY_HEAVY},
+SetEnvironmentPrecipitation_Data{mantle_api::Precipitation::kExtreme, osi3::EnvironmentalConditions_Precipitation_PRECIPITATION_EXTREME}));
 
 TEST(TurningRateImport, NonExistingConnection_LogsWarning)
 {
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldQuery_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldQuery_Tests.cpp
index 40820e62b0d863bfb8a0dcc76fd1b4f345c6fc3a..a0bd95e275e7e27829d82ae607c52d5bea960357 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldQuery_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldQuery_Tests.cpp
@@ -72,11 +72,11 @@ public:
         return LaneMultiStream{root};
     }
 
-    std::pair<LaneMultiStream::Node*, Fakes::Lane*> AddRoot(double length, bool inStreamDirection)
+    std::pair<LaneMultiStream::Node*, Fakes::Lane*> AddRoot(units::length::meter_t length, bool inStreamDirection)
     {
         Fakes::Lane* lane = new Fakes::Lane;
         ON_CALL(*lane, GetLength()).WillByDefault(Return(length));
-        LaneStreamInfo laneInfo{lane, inStreamDirection ? 0 : length, inStreamDirection};
+        LaneStreamInfo laneInfo{lane, inStreamDirection ? 0_m : length, inStreamDirection};
         root = {laneInfo, std::vector<LaneMultiStream::Node>{}, vertexCount};
         vertexCount++;
         root.next.reserve(10);
@@ -84,11 +84,11 @@ public:
         return {&root, lane};
     }
 
-    std::pair<LaneMultiStream::Node*, Fakes::Lane*> AddLane(double length, bool inStreamDirection, LaneMultiStream::Node& predecessor)
+    std::pair<LaneMultiStream::Node*, Fakes::Lane*> AddLane(units::length::meter_t length, bool inStreamDirection, LaneMultiStream::Node& predecessor)
     {
         Fakes::Lane* lane = new Fakes::Lane;
         ON_CALL(*lane, GetLength()).WillByDefault(Return(length));
-        LaneStreamInfo laneInfo{lane, predecessor.element->EndS() + (inStreamDirection ? 0 : length), inStreamDirection};
+        LaneStreamInfo laneInfo{lane, predecessor.element->EndS() + (inStreamDirection ? 0_m : length), inStreamDirection};
         predecessor.next.push_back({laneInfo, std::vector<LaneMultiStream::Node>{}, vertexCount});
         vertexCount++;
         auto newNode = &predecessor.next.back();
@@ -123,11 +123,11 @@ public:
         return RoadMultiStream{root};
     }
 
-    std::pair<RoadMultiStream::Node*, Fakes::Road*> AddRoot(double length, bool inStreamDirection)
+    std::pair<RoadMultiStream::Node*, Fakes::Road*> AddRoot(units::length::meter_t length, bool inStreamDirection)
     {
         Fakes::Road* road = new Fakes::Road;
         ON_CALL(*road, GetLength()).WillByDefault(Return(length));
-        RoadStreamInfo roadInfo{road, inStreamDirection ? 0 : length, inStreamDirection};
+        RoadStreamInfo roadInfo{road, inStreamDirection ? 0_m : length, inStreamDirection};
         root = {roadInfo, std::vector<RoadMultiStream::Node>{}, vertexCount};
         vertexCount++;
         root.next.reserve(10);
@@ -135,11 +135,11 @@ public:
         return {&root, road};
     }
 
-    std::pair<RoadMultiStream::Node*, Fakes::Road*> AddRoad(double length, bool inStreamDirection, RoadMultiStream::Node& predecessor)
+    std::pair<RoadMultiStream::Node*, Fakes::Road*> AddRoad(units::length::meter_t length, bool inStreamDirection, RoadMultiStream::Node& predecessor)
     {
         Fakes::Road* road = new Fakes::Road;
         ON_CALL(*road, GetLength()).WillByDefault(Return(length));
-        RoadStreamInfo roadInfo{road, predecessor.element->EndS() + (inStreamDirection ? 0 : length), inStreamDirection};
+        RoadStreamInfo roadInfo{road, predecessor.element->EndS() + (inStreamDirection ? 0_m : length), inStreamDirection};
         predecessor.next.push_back({roadInfo, std::vector<RoadMultiStream::Node>{}, vertexCount});
         vertexCount++;
         auto newNode = &predecessor.next.back();
@@ -157,91 +157,91 @@ private:
 TEST(GetDistanceToEndOfLane, LinearTreeWithOneLanePerRoad)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     ON_CALL(*lane2, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node2);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node2);
     ON_CALL(*lane3, GetLaneType()).WillByDefault(Return(LaneType::Driving));
     Fakes::WorldData worldData;
 
     WorldDataQuery wdQuery(worldData);
-    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0, 1000.0, {LaneType::Driving});
-    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 60.0),
-                                             std::make_pair(node2->roadGraphVertex, 260.0),
-                                             std::make_pair(node3->roadGraphVertex, 560.0)));
+    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0_m, 1000.0_m, {LaneType::Driving});
+    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 60.0_m),
+                                             std::make_pair(node2->roadGraphVertex, 260.0_m),
+                                             std::make_pair(node3->roadGraphVertex, 560.0_m)));
 }
 
 TEST(GetDistanceToEndOfLane, LinearTreeWithMultipleLanesPerRoad)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, true, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, true, *node1);
     ON_CALL(*lane2, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node2);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node2);
     ON_CALL(*lane3, GetLaneType()).WillByDefault(Return(LaneType::Driving));
     node2->roadGraphVertex = node1->roadGraphVertex;
     node3->roadGraphVertex = node1->roadGraphVertex;
     Fakes::WorldData worldData;
 
     WorldDataQuery wdQuery(worldData);
-    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0, 1000.0, {LaneType::Driving});
-    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 560.0)));
+    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0_m, 1000.0_m, {LaneType::Driving});
+    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 560.0_m)));
 }
 
 TEST(GetDistanceToEndOfLane, LinearTreeWithLaneOfWrongType)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     ON_CALL(*lane2, GetLaneType()).WillByDefault(Return(LaneType::None));
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node2);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node2);
     ON_CALL(*lane3, GetLaneType()).WillByDefault(Return(LaneType::Driving));
     Fakes::WorldData worldData;
 
     WorldDataQuery wdQuery(worldData);
-    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0, 1000.0, {LaneType::Driving});
-    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 60.0),
-                                             std::make_pair(node2->roadGraphVertex, 60.0),
-                                             std::make_pair(node3->roadGraphVertex, 60.0)));
+    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0_m, 1000.0_m, {LaneType::Driving});
+    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 60.0_m),
+                                             std::make_pair(node2->roadGraphVertex, 60.0_m),
+                                             std::make_pair(node3->roadGraphVertex, 60.0_m)));
 }
 
 TEST(GetDistanceToEndOfLane, LinearTreeWithLengthBiggerSearchDistance)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     ON_CALL(*lane2, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node2);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node2);
     ON_CALL(*lane3, GetLaneType()).WillByDefault(Return(LaneType::Driving));
     Fakes::WorldData worldData;
 
     WorldDataQuery wdQuery(worldData);
-    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0, 200.0, {LaneType::Driving});
-    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 60.0),
-                                             std::make_pair(node2->roadGraphVertex, std::numeric_limits<double>::infinity()),
-                                             std::make_pair(node3->roadGraphVertex, std::numeric_limits<double>::infinity())));
+    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0_m, 200.0_m, {LaneType::Driving});
+    ASSERT_THAT(result.at(node1->roadGraphVertex), Eq(60.0_m));
+    ASSERT_THAT(result.at(node2->roadGraphVertex).value(), Eq(std::numeric_limits<double>::infinity()));
+    ASSERT_THAT(result.at(node3->roadGraphVertex).value(), Eq(std::numeric_limits<double>::infinity()));
 }
 
 TEST(GetDistanceToEndOfLane, BranchingTree)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     ON_CALL(*lane2, GetLaneType()).WillByDefault(Return(LaneType::Driving));
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node1);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node1);
     ON_CALL(*lane3, GetLaneType()).WillByDefault(Return(LaneType::Driving));
     Fakes::WorldData worldData;
 
     WorldDataQuery wdQuery(worldData);
-    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0, 1000.0, {LaneType::Driving});
-    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 60.0),
-                                             std::make_pair(node2->roadGraphVertex, 260.0),
-                                             std::make_pair(node3->roadGraphVertex, 360.0)));
+    auto result = wdQuery.GetDistanceToEndOfLane(laneMultiStream.Get(), 40.0_m, 1000.0_m, {LaneType::Driving});
+    ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, 60.0_m),
+                                             std::make_pair(node2->roadGraphVertex, 260.0_m),
+                                             std::make_pair(node3->roadGraphVertex, 360.0_m)));
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -253,25 +253,25 @@ TEST(GetObjectsOfTypeInRange, NoObjectstInRange_ReturnsEmptyVector)
     Fakes::Road road1;
     std::string idRoad1 = "Road1";
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetRoad()).WillByDefault(ReturnRef(road1));
     ON_CALL(*lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyObjectsList));
     Fakes::Road road2;
     std::string idRoad2 = "Road2";
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     ON_CALL(*lane2, GetWorldObjects(false)).WillByDefault(ReturnRef(emptyObjectsList));
     ON_CALL(*lane2, GetRoad()).WillByDefault(ReturnRef(road2));
     Fakes::Road road3;
     std::string idRoad3 = "Road3";
     ON_CALL(road3, GetId()).WillByDefault(ReturnRef(idRoad3));
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node1);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node1);
     ON_CALL(*lane3, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyObjectsList));
     ON_CALL(*lane3, GetRoad()).WillByDefault(ReturnRef(road3));
     Fakes::WorldData worldData;
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 0, 1000);
+    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 0_m, 1000_m);
     std::vector<const OWL::Interfaces::WorldObject*> emptyResult{};
     ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, emptyResult),
                                              std::make_pair(node2->roadGraphVertex, emptyResult),
@@ -281,18 +281,18 @@ TEST(GetObjectsOfTypeInRange, NoObjectstInRange_ReturnsEmptyVector)
 TEST(GetObjectsOfTypeInRange, OneObjectInEveryNode_ReturnsFirstObjectForAllNodes)
 {
     FakeLaneMultiStream laneMultiStream;
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,40,0,0},
-                              GlobalRoadPosition{"",0,55,0,0},
-                              GlobalRoadPosition{"",0,50,0,0},
-                              GlobalRoadPosition{"",0,50,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,95,0,0},
-                              GlobalRoadPosition{"",0,105,0,0},
-                              GlobalRoadPosition{"",0,100,0,0},
-                              GlobalRoadPosition{"",0,100,0,0}};
-    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,95,0,0},
-                              GlobalRoadPosition{"",0,105,0,0},
-                              GlobalRoadPosition{"",0,100,0,0},
-                              GlobalRoadPosition{"",0,100,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0, 40_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 55_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 50_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 50_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0, 95_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,105_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,100_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0, 95_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,105_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,100_m,0_m,0_rad}};
     Fakes::MovingObject object1;
     OWL::Interfaces::LaneAssignments objectsList1{{overlap1,&object1}};
     Fakes::MovingObject object2;
@@ -302,25 +302,25 @@ TEST(GetObjectsOfTypeInRange, OneObjectInEveryNode_ReturnsFirstObjectForAllNodes
     Fakes::Road road1;
     std::string idRoad1 = "Road1";
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetRoad()).WillByDefault(ReturnRef(road1));
     ON_CALL(*lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(objectsList1));
     Fakes::Road road2;
     std::string idRoad2 = "Road2";
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     ON_CALL(*lane2, GetWorldObjects(false)).WillByDefault(ReturnRef(objectsList2));
     ON_CALL(*lane2, GetRoad()).WillByDefault(ReturnRef(road2));
     Fakes::Road road3;
     std::string idRoad3 = "Road3";
     ON_CALL(road3, GetId()).WillByDefault(ReturnRef(idRoad3));
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node1);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node1);
     ON_CALL(*lane3, GetWorldObjects(true)).WillByDefault(ReturnRef(objectsList3));
     ON_CALL(*lane3, GetRoad()).WillByDefault(ReturnRef(road3));
     Fakes::WorldData worldData;
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 50, 200);
+    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 50_m, 200_m);
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult1{&object1};
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult2{&object1, &object2};
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult3{&object1, &object3};
@@ -333,28 +333,28 @@ TEST(GetObjectsOfTypeInRange, OneObjectInTwoNodes_ReturnsObjectOnlyOnce)
 {
     FakeLaneMultiStream laneMultiStream;
     Fakes::MovingObject object;
-    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,100,0,0},
-                             GlobalRoadPosition{"",0,100,0,0},
-                             GlobalRoadPosition{"",0,100,0,0},
-                             GlobalRoadPosition{"",0,100,0,0}};
+    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,100_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments objectsList1{{overlap,&object}};
     OWL::Interfaces::LaneAssignments objectsList2{{overlap,&object}};
     Fakes::Road road1;
     std::string idRoad1 = "Road1";
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetRoad()).WillByDefault(ReturnRef(road1));
     ON_CALL(*lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(objectsList1));
     Fakes::Road road2;
     std::string idRoad2 = "Road2";
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     ON_CALL(*lane2, GetWorldObjects(false)).WillByDefault(ReturnRef(objectsList2));
     ON_CALL(*lane2, GetRoad()).WillByDefault(ReturnRef(road2));
     Fakes::WorldData worldData;
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 0, 1000);
+    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 0_m, 1000_m);
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult{&object};
     ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, expectedResult),
                                              std::make_pair(node2->roadGraphVertex, expectedResult)));
@@ -363,18 +363,18 @@ TEST(GetObjectsOfTypeInRange, OneObjectInTwoNodes_ReturnsObjectOnlyOnce)
 TEST(GetObjectsOfTypeInRange, TwoObjectInTwoNodes_ReturnsObjectsInCorrectOrder)
 {
     FakeLaneMultiStream laneMultiStream;
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,10,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,100,0,0},
-                              GlobalRoadPosition{"",0,100,0,0},
-                              GlobalRoadPosition{"",0,100,0,0},
-                              GlobalRoadPosition{"",0,100,0,0}};
-    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,50,0,0},
-                              GlobalRoadPosition{"",0,50,0,0},
-                              GlobalRoadPosition{"",0,50,0,0},
-                              GlobalRoadPosition{"",0,50,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0, 10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 10_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,100_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,100_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0, 50_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 50_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 50_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 50_m,0_m,0_rad}};
     Fakes::MovingObject object1;
     OWL::Interfaces::LaneAssignments objectsList1{{overlap1,&object1}};
     Fakes::MovingObject object2;
@@ -383,19 +383,19 @@ TEST(GetObjectsOfTypeInRange, TwoObjectInTwoNodes_ReturnsObjectsInCorrectOrder)
     Fakes::Road road1;
     std::string idRoad1 = "Road1";
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetRoad()).WillByDefault(ReturnRef(road1));
     ON_CALL(*lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(objectsList1));
     Fakes::Road road2;
     std::string idRoad2 = "Road2";
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, true, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, true, *node1);
     ON_CALL(*lane2, GetWorldObjects(true)).WillByDefault(ReturnRef(objectsList2));
     ON_CALL(*lane2, GetRoad()).WillByDefault(ReturnRef(road2));
     Fakes::WorldData worldData;
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 0, 1000);
+    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 0_m, 1000_m);
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult1{&object1};
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult2{&object1, &object3, &object2};
     ASSERT_THAT(result, UnorderedElementsAre(std::make_pair(node1->roadGraphVertex, expectedResult1),
@@ -405,18 +405,18 @@ TEST(GetObjectsOfTypeInRange, TwoObjectInTwoNodes_ReturnsObjectsInCorrectOrder)
 TEST(GetObjectsOfTypeInRange, ObjectsOutsideRange_ReturnsOnlyObjectsInRange)
 {
     FakeLaneMultiStream laneMultiStream;
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,10,0,0},
-                              GlobalRoadPosition{"",0,10,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,110,0,0},
-                              GlobalRoadPosition{"",0,110,0,0},
-                              GlobalRoadPosition{"",0,110,0,0},
-                              GlobalRoadPosition{"",0,110,0,0}};
-    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,160,0,0},
-                              GlobalRoadPosition{"",0,160,0,0},
-                              GlobalRoadPosition{"",0,160,0,0},
-                              GlobalRoadPosition{"",0,160,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0, 10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 10_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0, 10_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,110_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,110_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,110_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,110_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap3{GlobalRoadPosition{"",0,160_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,160_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,160_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,160_m,0_m,0_rad}};
     Fakes::MovingObject object1;
     OWL::Interfaces::LaneAssignments objectsList1{{overlap1, &object1}};
     Fakes::MovingObject object2a;
@@ -428,25 +428,25 @@ TEST(GetObjectsOfTypeInRange, ObjectsOutsideRange_ReturnsOnlyObjectsInRange)
     Fakes::Road road1;
     std::string idRoad1 = "Road1";
     ON_CALL(road1, GetId()).WillByDefault(ReturnRef(idRoad1));
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     ON_CALL(*lane1, GetRoad()).WillByDefault(ReturnRef(road1));
     ON_CALL(*lane1, GetWorldObjects(true)).WillByDefault(ReturnRef(objectsList1));
     Fakes::Road road2;
     std::string idRoad2 = "Road2";
     ON_CALL(road2, GetId()).WillByDefault(ReturnRef(idRoad2));
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     ON_CALL(*lane2, GetWorldObjects(false)).WillByDefault(ReturnRef(objectsList2));
     ON_CALL(*lane2, GetRoad()).WillByDefault(ReturnRef(road2));
     Fakes::Road road3;
     std::string idRoad3 = "Road3";
     ON_CALL(road3, GetId()).WillByDefault(ReturnRef(idRoad3));
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node1);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node1);
     ON_CALL(*lane3, GetWorldObjects(true)).WillByDefault(ReturnRef(objectsList3));
     ON_CALL(*lane3, GetRoad()).WillByDefault(ReturnRef(road3));
     Fakes::WorldData worldData;
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 50, 250);
+    auto result = wdQuery.GetObjectsOfTypeInRange<OWL::Interfaces::WorldObject>(laneMultiStream.Get(), 50_m, 250_m);
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult1{};
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult2{&object2b};
     std::vector<const OWL::Interfaces::WorldObject*> expectedResult3{&object3a};
@@ -473,14 +473,14 @@ TEST(GetLanesOfLaneTypeAtDistance, NoLanesInWorld_ReturnsNoLanes)
 
     WorldDataQuery wdQuery(worldData);
 
-    OWL::CLanes lanes = wdQuery.GetLanesOfLaneTypeAtDistance("TestRoadId", 0.0, {LaneType::Driving});
+    OWL::CLanes lanes = wdQuery.GetLanesOfLaneTypeAtDistance("TestRoadId", 0.0_m, {LaneType::Driving});
 
     ASSERT_EQ(lanes.size(), 0);
 }
 
 TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectListForFirstSection)
 {
-    FakeLaneManager flm(3, 3, 3.0, {100, 100, 100}, "TestRoadId");
+    FakeLaneManager flm(3, 3, 3.0_m, {100_m, 100_m, 100_m}, "TestRoadId");
     Fakes::WorldData worldData;
 
     ON_CALL(worldData, GetRoads()).WillByDefault(ReturnRef(flm.GetRoads()));
@@ -497,7 +497,7 @@ TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectList
 
     WorldDataQuery wdQuery(worldData);
 
-    OWL::CLanes lanes = wdQuery.GetLanesOfLaneTypeAtDistance("TestRoadId", 50.0, {LaneType::Driving});
+    OWL::CLanes lanes = wdQuery.GetLanesOfLaneTypeAtDistance("TestRoadId", 50.0_m, {LaneType::Driving});
 
     ASSERT_EQ(lanes.size(), 3);
 
@@ -510,7 +510,7 @@ TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectList
 
 TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectListForSecondSection)
 {
-    FakeLaneManager flm(3, 3, 3.0, {100, 100, 100}, "TestRoadId");
+    FakeLaneManager flm(3, 3, 3.0_m, {100_m, 100_m, 100_m}, "TestRoadId");
     Fakes::WorldData worldData;
 
     ON_CALL(worldData, GetRoads()).WillByDefault(ReturnRef(flm.GetRoads()));
@@ -527,7 +527,7 @@ TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectList
 
     WorldDataQuery wdQuery(worldData);
 
-    OWL::CLanes lanes = wdQuery.GetLanesOfLaneTypeAtDistance("TestRoadId", 150.0, {LaneType::Driving});
+    OWL::CLanes lanes = wdQuery.GetLanesOfLaneTypeAtDistance("TestRoadId", 150.0_m, {LaneType::Driving});
 
     ASSERT_EQ(lanes.size(), 3);
 
@@ -540,7 +540,7 @@ TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectList
 
 TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectListForThirdSection)
 {
-    FakeLaneManager flm(3, 3, 3.0, {100, 100, 100}, "TestRoadId");
+    FakeLaneManager flm(3, 3, 3.0_m, {100_m, 100_m, 100_m}, "TestRoadId");
     Fakes::WorldData worldData;
 
     ON_CALL(worldData, GetRoads()).WillByDefault(ReturnRef(flm.GetRoads()));
@@ -557,7 +557,7 @@ TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectList
 
     WorldDataQuery wdQuery(worldData);
 
-    OWL::CLanes lanes = wdQuery.GetLanesOfLaneTypeAtDistance("TestRoadId", 250.0, {LaneType::Driving});
+    OWL::CLanes lanes = wdQuery.GetLanesOfLaneTypeAtDistance("TestRoadId", 250.0_m, {LaneType::Driving});
 
     ASSERT_EQ(lanes.size(), 1);
     ASSERT_EQ(lanes.front(), flm.lanes[2][1]);
@@ -567,7 +567,7 @@ TEST(GetLanesOfLaneTypeAtDistance, ThreeLanesOneLongerThanTwo_ReturnsCorrectList
 
 TEST(GetLaneByOdId, CheckFakeLaneManagerImplementation)
 {
-    FakeLaneManager flm(2, 2, 3.0, {100, 100}, "TestRoadId");
+    FakeLaneManager flm(2, 2, 3.0_m, {100_m, 100_m}, "TestRoadId");
 
     Fakes::WorldData worldData;
     ON_CALL(worldData, GetRoads()).WillByDefault(ReturnRef(flm.GetRoads()));
@@ -575,16 +575,16 @@ TEST(GetLaneByOdId, CheckFakeLaneManagerImplementation)
     WorldDataQuery wdQuery(worldData);
 
     EXPECT_THAT(flm.lanes[0][0]->Exists(), Eq(true));
-    ASSERT_EQ(flm.lanes[0][0], &(wdQuery.GetLaneByOdId("TestRoadId", -1, 50)));
+    ASSERT_EQ(flm.lanes[0][0], &(wdQuery.GetLaneByOdId("TestRoadId", -1, 50_m)));
 
     EXPECT_THAT(flm.lanes[1][0]->Exists(), Eq(true));
-    ASSERT_EQ(flm.lanes[1][0], &(wdQuery.GetLaneByOdId("TestRoadId", -1, 150)));
+    ASSERT_EQ(flm.lanes[1][0], &(wdQuery.GetLaneByOdId("TestRoadId", -1, 150_m)));
 
     EXPECT_THAT(flm.lanes[0][1]->Exists(), Eq(true));
-    ASSERT_EQ(flm.lanes[0][1], &(wdQuery.GetLaneByOdId("TestRoadId", -2, 50)));
+    ASSERT_EQ(flm.lanes[0][1], &(wdQuery.GetLaneByOdId("TestRoadId", -2, 50_m)));
 
     EXPECT_THAT(flm.lanes[1][1]->Exists(), Eq(true));
-    ASSERT_EQ(flm.lanes[1][1], &(wdQuery.GetLaneByOdId("TestRoadId", -2, 150)));
+    ASSERT_EQ(flm.lanes[1][1], &(wdQuery.GetLaneByOdId("TestRoadId", -2, 150_m)));
 }
 
 TEST(GetLaneByOdId, TwoSectionsWithVariableLanes_ReturnsCorrectLanes)
@@ -619,86 +619,86 @@ TEST(GetLaneByOdId, TwoSectionsWithVariableLanes_ReturnsCorrectLanes)
     const std::vector<const OWL::Interfaces::Lane*> lanesSection1 = {{&lane1_minus1, &lane1_minus2}} ;
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanesSection1));
     ON_CALL(section1, Covers(_)).WillByDefault(Return(false));
-    ON_CALL(section1, Covers(50)).WillByDefault(Return(true));
+    ON_CALL(section1, Covers(50_m)).WillByDefault(Return(true));
 
     const std::vector<const OWL::Interfaces::Lane*> lanesSection2 = {{&lane2_minus2}};
     ON_CALL(section2, GetLanes()).WillByDefault(ReturnRef(lanesSection2));
     ON_CALL(section2, Covers(_)).WillByDefault(Return(false));
-    ON_CALL(section2, Covers(150)).WillByDefault(Return(true));
+    ON_CALL(section2, Covers(150_m)).WillByDefault(Return(true));
 
     sections = {{&section1, &section2}};
 
-    ASSERT_EQ(wdQuery.GetLaneByOdId("TestRoadId", -1, 50).GetId(), 1);
-    ASSERT_EQ(wdQuery.GetLaneByOdId("TestRoadId", -2, 50).GetId(), 2);
-    ASSERT_FALSE(wdQuery.GetLaneByOdId("TestRoadId", -1, 150).Exists());
-    ASSERT_EQ(wdQuery.GetLaneByOdId("TestRoadId", -2, 150).GetId(), 3);
+    ASSERT_EQ(wdQuery.GetLaneByOdId("TestRoadId", -1, 50_m).GetId(), 1);
+    ASSERT_EQ(wdQuery.GetLaneByOdId("TestRoadId", -2, 50_m).GetId(), 2);
+    ASSERT_FALSE(wdQuery.GetLaneByOdId("TestRoadId", -1, 150_m).Exists());
+    ASSERT_EQ(wdQuery.GetLaneByOdId("TestRoadId", -2, 150_m).GetId(), 3);
 }
 
 TEST(GetLaneByOffset, ReturnsCorrectLaneAndOffset)
 {
-    FakeLaneManager flm(2, 2, 3.0, {100, 100}, "TestRoadId");
-    flm.SetWidth(0, 0, 5.0, 50.0);
-    flm.SetWidth(1, 0, 4.0, 150.0);
-    flm.SetWidth(0, 1, 4.0, 50.0);
-    flm.SetWidth(1, 1, 4.0, 150.0);
+    FakeLaneManager flm(2, 2, 3.0_m, {100_m, 100_m}, "TestRoadId");
+    flm.SetWidth(0, 0, 5.0_m, 50.0_m);
+    flm.SetWidth(1, 0, 4.0_m, 150.0_m);
+    flm.SetWidth(0, 1, 4.0_m, 50.0_m);
+    flm.SetWidth(1, 1, 4.0_m, 150.0_m);
 
     Fakes::WorldData worldData;
     ON_CALL(worldData, GetRoads()).WillByDefault(ReturnRef(flm.GetRoads()));
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result1 = wdQuery.GetLaneByOffset("TestRoadId", -2, 50);
+    auto result1 = wdQuery.GetLaneByOffset("TestRoadId", -2_m, 50_m);
     EXPECT_THAT(&result1.first, Eq(flm.lanes[0][0]));
-    EXPECT_THAT(result1.second, DoubleEq(0.5));
+    EXPECT_THAT(result1.second.value(), DoubleEq(0.5));
 
-    auto result2 = wdQuery.GetLaneByOffset("TestRoadId", -2, 150);
+    auto result2 = wdQuery.GetLaneByOffset("TestRoadId", -2_m, 150_m);
     EXPECT_THAT(&result2.first, Eq(flm.lanes[1][0]));
-    EXPECT_THAT(result2.second, DoubleEq(0.0));
+    EXPECT_THAT(result2.second.value(), DoubleEq(0.0));
 
-    auto result3 = wdQuery.GetLaneByOffset("TestRoadId", -6.5, 50);
+    auto result3 = wdQuery.GetLaneByOffset("TestRoadId", -6.5_m, 50_m);
     EXPECT_THAT(&result3.first, Eq(flm.lanes[0][1]));
-    EXPECT_THAT(result3.second, DoubleEq(0.5));
+    EXPECT_THAT(result3.second.value(), DoubleEq(0.5));
 
-    auto result4 = wdQuery.GetLaneByOffset("TestRoadId", -6.5, 150);
+    auto result4 = wdQuery.GetLaneByOffset("TestRoadId", -6.5_m, 150_m);
     EXPECT_THAT(&result4.first, Eq(flm.lanes[1][1]));
-    EXPECT_THAT(result4.second, DoubleEq(-0.5));
+    EXPECT_THAT(result4.second.value(), DoubleEq(-0.5));
 }
 /////////////////////////////////////////////////////////////////////////////
 
 TEST(GetValidSOnLane, CheckIfSIsValid_ReturnsTrue)
 {
-    FakeLaneManager laneManager(3, 1, 3.0, {100, 100, 100}, "TestRoadId");
+    FakeLaneManager laneManager(3, 1, 3.0_m, {100_m, 100_m, 100_m}, "TestRoadId");
 
     Fakes::WorldData worldData;
     ON_CALL(worldData, GetRoads()).WillByDefault(ReturnRef(laneManager.GetRoads()));
 
     WorldDataQuery wdQuery(worldData);
 
-    bool result = wdQuery.IsSValidOnLane("TestRoadId", -1, 50.0);
+    bool result = wdQuery.IsSValidOnLane("TestRoadId", -1, 50.0_m);
     ASSERT_TRUE(result);
 
-    result = wdQuery.IsSValidOnLane("TestRoadId", -1, 150.0);
+    result = wdQuery.IsSValidOnLane("TestRoadId", -1, 150.0_m);
     ASSERT_TRUE(result);
 
-    result = wdQuery.IsSValidOnLane("TestRoadId", -1, 250.0);
+    result = wdQuery.IsSValidOnLane("TestRoadId", -1, 250.0_m);
     ASSERT_TRUE(result);
 
-    result = wdQuery.IsSValidOnLane("TestRoadId", -1, 0.0);
+    result = wdQuery.IsSValidOnLane("TestRoadId", -1, 0.0_m);
     ASSERT_TRUE(result);
 
-    result = wdQuery.IsSValidOnLane("TestRoadId", -1, 300.0);
+    result = wdQuery.IsSValidOnLane("TestRoadId", -1, 300.0_m);
     ASSERT_TRUE(result);
 }
 
 TEST(GetValidSOnLane, CheckIfSIsValid_ReturnsFalse)
 {
-    FakeLaneManager laneManager(1, 2, 3.0, {100}, "TestRoadId");
+    FakeLaneManager laneManager(1, 2, 3.0_m, {100_m}, "TestRoadId");
 
     Fakes::WorldData worldData;
     ON_CALL(worldData, GetRoads()).WillByDefault(ReturnRef(laneManager.GetRoads()));
 
     WorldDataQuery wdQuery(worldData);
-    bool result = wdQuery.IsSValidOnLane("TestRoadId", -1, 100.1);
+    bool result = wdQuery.IsSValidOnLane("TestRoadId", -1, 100.1_m);
     ASSERT_FALSE(result);
 }
 
@@ -707,40 +707,40 @@ TEST(GetValidSOnLane, CheckIfSIsValid_ReturnsFalse)
 TEST(GetTrafficSignsInRange, ReturnsCorrectTrafficSigns)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     Fakes::TrafficSign fakeSign1a;
-    ON_CALL(fakeSign1a, GetS()).WillByDefault(Return(10.0));
+    ON_CALL(fakeSign1a, GetS()).WillByDefault(Return(10.0_m));
     Fakes::TrafficSign fakeSign1b;
-    CommonTrafficSign::Entity specificationSign1b{CommonTrafficSign::Type::Stop, CommonTrafficSign::Unit::None, 60.0, 10.0, 0.0, "", {}};
-    ON_CALL(fakeSign1b, GetS()).WillByDefault(Return(60.0));
-    ON_CALL(fakeSign1b, GetSpecification(DoubleEq(10.0))).WillByDefault(Return(specificationSign1b));
+    CommonTrafficSign::Entity specificationSign1b{CommonTrafficSign::Type::Stop, CommonTrafficSign::Unit::None, 60.0_m, 10.0_m, 0.0, "", {}};
+    ON_CALL(fakeSign1b, GetS()).WillByDefault(Return(60.0_m));
+    ON_CALL(fakeSign1b, GetSpecification(10.0_m)).WillByDefault(Return(specificationSign1b));
     OWL::Interfaces::TrafficSigns signsLane1{ {&fakeSign1a, &fakeSign1b} };
     ON_CALL(*lane1, GetTrafficSigns()).WillByDefault(ReturnRef(signsLane1));
 
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     Fakes::TrafficSign fakeSign2a;
-    ON_CALL(fakeSign2a, GetS()).WillByDefault(Return(110.0));
+    ON_CALL(fakeSign2a, GetS()).WillByDefault(Return(110.0_m));
     Fakes::TrafficSign fakeSign2b;
-    CommonTrafficSign::Entity specificationSign2b{CommonTrafficSign::Type::MaximumSpeedLimit, CommonTrafficSign::Unit::MeterPerSecond, 160.0, 90.0, 10.0, "", {}};
-    ON_CALL(fakeSign2b, GetS()).WillByDefault(Return(160.0));
-    ON_CALL(fakeSign2b, GetSpecification(DoubleEq(90.0))).WillByDefault(Return(specificationSign2b));
+    CommonTrafficSign::Entity specificationSign2b{CommonTrafficSign::Type::MaximumSpeedLimit, CommonTrafficSign::Unit::MeterPerSecond, 160.0_m, 90.0_m, 10.0, "", {}};
+    ON_CALL(fakeSign2b, GetS()).WillByDefault(Return(160.0_m));
+    ON_CALL(fakeSign2b, GetSpecification(90.0_m)).WillByDefault(Return(specificationSign2b));
     OWL::Interfaces::TrafficSigns signsLane2{ {&fakeSign2a, &fakeSign2b} };
     ON_CALL(*lane2, GetTrafficSigns()).WillByDefault(ReturnRef(signsLane2));
 
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node1);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node1);
     Fakes::TrafficSign fakeSign3a;
-    CommonTrafficSign::Entity specificationSign3a{CommonTrafficSign::Type::TownBegin, CommonTrafficSign::Unit::None, 10.0, 60.0, 0.0, "Town", {}};
-    ON_CALL(fakeSign3a, GetS()).WillByDefault(Return(10.0));
-    ON_CALL(fakeSign3a, GetSpecification(DoubleEq(60.0))).WillByDefault(Return(specificationSign3a));
+    CommonTrafficSign::Entity specificationSign3a{CommonTrafficSign::Type::TownBegin, CommonTrafficSign::Unit::None, 10.0_m, 60.0_m, 0.0, "Town", {}};
+    ON_CALL(fakeSign3a, GetS()).WillByDefault(Return(10.0_m));
+    ON_CALL(fakeSign3a, GetSpecification(60.0_m)).WillByDefault(Return(specificationSign3a));
     Fakes::TrafficSign fakeSign3b;
-    ON_CALL(fakeSign3b, GetS()).WillByDefault(Return(60.0));
+    ON_CALL(fakeSign3b, GetS()).WillByDefault(Return(60.0_m));
     OWL::Interfaces::TrafficSigns signsLane3{ {&fakeSign3a, &fakeSign3b} };
     ON_CALL(*lane3, GetTrafficSigns()).WillByDefault(ReturnRef(signsLane3));
 
     Fakes::WorldData worldData;
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetTrafficSignsInRange(laneMultiStream.Get(), 50.0, 100.0);
+    auto result = wdQuery.GetTrafficSignsInRange(laneMultiStream.Get(), 50.0_m, 100.0_m);
 
     ASSERT_THAT(result, SizeIs(3));
     auto& result1 = result[node1->roadGraphVertex];
@@ -771,38 +771,38 @@ TEST(GetTrafficSignsInRange, ReturnsCorrectTrafficSigns)
 TEST(GetTrafficSignsInRange, NegativeRange_ReturnsSignsBehind)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     Fakes::TrafficSign fakeSign1a;
-    ON_CALL(fakeSign1a, GetS()).WillByDefault(Return(10.0));
+    ON_CALL(fakeSign1a, GetS()).WillByDefault(Return(10.0_m));
     Fakes::TrafficSign fakeSign1b;
-    CommonTrafficSign::Entity specificationSign1b{CommonTrafficSign::Type::Stop, CommonTrafficSign::Unit::None, 60.0, -90.0, 0.0, "", {}};
-    ON_CALL(fakeSign1b, GetS()).WillByDefault(Return(60.0));
-    ON_CALL(fakeSign1b, GetSpecification(DoubleEq(-90.0))).WillByDefault(Return(specificationSign1b));
+    CommonTrafficSign::Entity specificationSign1b{CommonTrafficSign::Type::Stop, CommonTrafficSign::Unit::None, 60.0_m, -90.0_m, 0.0, "", {}};
+    ON_CALL(fakeSign1b, GetS()).WillByDefault(Return(60.0_m));
+    ON_CALL(fakeSign1b, GetSpecification(-90.0_m)).WillByDefault(Return(specificationSign1b));
     OWL::Interfaces::TrafficSigns signsLane1{ {&fakeSign1a, &fakeSign1b} };
     ON_CALL(*lane1, GetTrafficSigns()).WillByDefault(ReturnRef(signsLane1));
 
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     Fakes::TrafficSign fakeSign2a;
-    ON_CALL(fakeSign2a, GetS()).WillByDefault(Return(110.0));
+    ON_CALL(fakeSign2a, GetS()).WillByDefault(Return(110.0_m));
     Fakes::TrafficSign fakeSign2b;
-    CommonTrafficSign::Entity specificationSign2b{CommonTrafficSign::Type::MaximumSpeedLimit, CommonTrafficSign::Unit::MeterPerSecond, 160.0, -10.0, 10.0, "", {}};
-    ON_CALL(fakeSign2b, GetS()).WillByDefault(Return(160.0));
-    ON_CALL(fakeSign2b, GetSpecification(DoubleEq(-10.0))).WillByDefault(Return(specificationSign2b));
+    CommonTrafficSign::Entity specificationSign2b{CommonTrafficSign::Type::MaximumSpeedLimit, CommonTrafficSign::Unit::MeterPerSecond, 160.0_m, -10.0_m, 10.0, "", {}};
+    ON_CALL(fakeSign2b, GetS()).WillByDefault(Return(160.0_m));
+    ON_CALL(fakeSign2b, GetSpecification(-10.0_m)).WillByDefault(Return(specificationSign2b));
     OWL::Interfaces::TrafficSigns signsLane2{ {&fakeSign2a, &fakeSign2b} };
     ON_CALL(*lane2, GetTrafficSigns()).WillByDefault(ReturnRef(signsLane2));
 
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node1);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node1);
     Fakes::TrafficSign fakeSign3a;
-    ON_CALL(fakeSign3a, GetS()).WillByDefault(Return(10.0));
+    ON_CALL(fakeSign3a, GetS()).WillByDefault(Return(10.0_m));
     Fakes::TrafficSign fakeSign3b;
-    ON_CALL(fakeSign3b, GetS()).WillByDefault(Return(60.0));
+    ON_CALL(fakeSign3b, GetS()).WillByDefault(Return(60.0_m));
     OWL::Interfaces::TrafficSigns signsLane3{ {&fakeSign3a, &fakeSign3b} };
     ON_CALL(*lane3, GetTrafficSigns()).WillByDefault(ReturnRef(signsLane3));
 
     Fakes::WorldData worldData;
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetTrafficSignsInRange(laneMultiStream.Get(), 150.0, -100.0);
+    auto result = wdQuery.GetTrafficSignsInRange(laneMultiStream.Get(), 150.0_m, -100.0_m);
 
     ASSERT_THAT(result, SizeIs(3));
     auto& result1 = result[node1->roadGraphVertex];
@@ -824,40 +824,40 @@ TEST(GetTrafficSignsInRange, NegativeRange_ReturnsSignsBehind)
 TEST(GetRoadMarkingInRange, ReturnsCorrectRoadMarkings)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     Fakes::RoadMarking fakeMarking1a;
-    ON_CALL(fakeMarking1a, GetS()).WillByDefault(Return(10.0));
+    ON_CALL(fakeMarking1a, GetS()).WillByDefault(Return(10.0_m));
     Fakes::RoadMarking fakeMarking1b;
-    CommonTrafficSign::Entity specificationMarking1b{CommonTrafficSign::Type::Stop, CommonTrafficSign::Unit::None, 60.0, 10.0, 0.0, "", {}};
-    ON_CALL(fakeMarking1b, GetS()).WillByDefault(Return(60.0));
-    ON_CALL(fakeMarking1b, GetSpecification(DoubleEq(10.0))).WillByDefault(Return(specificationMarking1b));
+    CommonTrafficSign::Entity specificationMarking1b{CommonTrafficSign::Type::Stop, CommonTrafficSign::Unit::None, 60.0_m, 10.0_m, 0.0, "", {}};
+    ON_CALL(fakeMarking1b, GetS()).WillByDefault(Return(60.0_m));
+    ON_CALL(fakeMarking1b, GetSpecification(10.0_m)).WillByDefault(Return(specificationMarking1b));
     OWL::Interfaces::RoadMarkings markingsLane1{ {&fakeMarking1a, &fakeMarking1b} };
     ON_CALL(*lane1, GetRoadMarkings()).WillByDefault(ReturnRef(markingsLane1));
 
-    auto [node2, lane2] = laneMultiStream.AddLane(200, false, *node1);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, false, *node1);
     Fakes::RoadMarking fakeMarking2a;
-    ON_CALL(fakeMarking2a, GetS()).WillByDefault(Return(110.0));
+    ON_CALL(fakeMarking2a, GetS()).WillByDefault(Return(110.0_m));
     Fakes::RoadMarking fakeMarking2b;
-    CommonTrafficSign::Entity specificationMarking2b{CommonTrafficSign::Type::MaximumSpeedLimit, CommonTrafficSign::Unit::MeterPerSecond, 160.0, 90.0, 10.0, "", {}};
-    ON_CALL(fakeMarking2b, GetS()).WillByDefault(Return(160.0));
-    ON_CALL(fakeMarking2b, GetSpecification(DoubleEq(90.0))).WillByDefault(Return(specificationMarking2b));
+    CommonTrafficSign::Entity specificationMarking2b{CommonTrafficSign::Type::MaximumSpeedLimit, CommonTrafficSign::Unit::MeterPerSecond, 160.0_m, 90.0_m, 10.0, "", {}};
+    ON_CALL(fakeMarking2b, GetS()).WillByDefault(Return(160.0_m));
+    ON_CALL(fakeMarking2b, GetSpecification(90.0_m)).WillByDefault(Return(specificationMarking2b));
     OWL::Interfaces::RoadMarkings markingsLane2{ {&fakeMarking2a, &fakeMarking2b} };
     ON_CALL(*lane2, GetRoadMarkings()).WillByDefault(ReturnRef(markingsLane2));
 
-    auto [node3, lane3] = laneMultiStream.AddLane(300, true, *node1);
+    auto [node3, lane3] = laneMultiStream.AddLane(300_m, true, *node1);
     Fakes::RoadMarking fakeMarking3a;
-    CommonTrafficSign::Entity specificationMarking3a{CommonTrafficSign::Type::TownBegin, CommonTrafficSign::Unit::None, 10.0, 60.0, 0.0, "Town", {}};
-    ON_CALL(fakeMarking3a, GetS()).WillByDefault(Return(10.0));
-    ON_CALL(fakeMarking3a, GetSpecification(DoubleEq(60.0))).WillByDefault(Return(specificationMarking3a));
+    CommonTrafficSign::Entity specificationMarking3a{CommonTrafficSign::Type::TownBegin, CommonTrafficSign::Unit::None, 10.0_m, 60.0_m, 0.0, "Town", {}};
+    ON_CALL(fakeMarking3a, GetS()).WillByDefault(Return(10.0_m));
+    ON_CALL(fakeMarking3a, GetSpecification(60.0_m)).WillByDefault(Return(specificationMarking3a));
     Fakes::RoadMarking fakeMarking3b;
-    ON_CALL(fakeMarking3b, GetS()).WillByDefault(Return(60.0));
+    ON_CALL(fakeMarking3b, GetS()).WillByDefault(Return(60.0_m));
     OWL::Interfaces::RoadMarkings markingsLane3{ {&fakeMarking3a, &fakeMarking3b} };
     ON_CALL(*lane3, GetRoadMarkings()).WillByDefault(ReturnRef(markingsLane3));
 
     Fakes::WorldData worldData;
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetRoadMarkingsInRange(laneMultiStream.Get(), 50.0, 100.0);
+    auto result = wdQuery.GetRoadMarkingsInRange(laneMultiStream.Get(), 50.0_m, 100.0_m);
 
     ASSERT_THAT(result, SizeIs(3));
     auto& result1 = result[node1->roadGraphVertex];
@@ -888,7 +888,7 @@ TEST(GetRoadMarkingInRange, ReturnsCorrectRoadMarkings)
 TEST(GetLaneMarkings, OneLaneWithOnlyOneBoundaryPerSide)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     Fakes::WorldData worldData;
 
     std::vector<OWL::Id> leftLaneBoundaries {4};
@@ -897,17 +897,17 @@ TEST(GetLaneMarkings, OneLaneWithOnlyOneBoundaryPerSide)
     ON_CALL(*lane1, GetRightLaneBoundaries()).WillByDefault(Return(rightLaneBoundaries));
 
     Fakes::LaneBoundary fakeLeftLaneBoundary{};
-    ON_CALL(fakeLeftLaneBoundary, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(fakeLeftLaneBoundary, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(fakeLeftLaneBoundary, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(fakeLeftLaneBoundary, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(fakeLeftLaneBoundary, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(fakeLeftLaneBoundary, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(fakeLeftLaneBoundary, GetType()).WillByDefault(Return(LaneMarking::Type::Solid));
     ON_CALL(fakeLeftLaneBoundary, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(fakeLeftLaneBoundary, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Single));
 
     Fakes::LaneBoundary fakeRightLaneBoundary{};
-    ON_CALL(fakeRightLaneBoundary, GetWidth()).WillByDefault(Return(0.6));
-    ON_CALL(fakeRightLaneBoundary, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(fakeRightLaneBoundary, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(fakeRightLaneBoundary, GetWidth()).WillByDefault(Return(0.6_m));
+    ON_CALL(fakeRightLaneBoundary, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(fakeRightLaneBoundary, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(fakeRightLaneBoundary, GetType()).WillByDefault(Return(LaneMarking::Type::Broken));
     ON_CALL(fakeRightLaneBoundary, GetColor()).WillByDefault(Return(LaneMarking::Color::Blue));
     ON_CALL(fakeRightLaneBoundary, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Single));
@@ -917,44 +917,44 @@ TEST(GetLaneMarkings, OneLaneWithOnlyOneBoundaryPerSide)
 
     WorldDataQuery wdQuery(worldData);
 
-    auto resultLeft = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0, 100, Side::Left);
+    auto resultLeft = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0_m, 100_m, Side::Left);
     ASSERT_THAT(resultLeft.at(node1->roadGraphVertex), SizeIs(1));
     auto& resultLeftLaneMarking = resultLeft.at(node1->roadGraphVertex).at(0);
     ASSERT_THAT(resultLeftLaneMarking.type, Eq(LaneMarking::Type::Solid));
     ASSERT_THAT(resultLeftLaneMarking.color, Eq(LaneMarking::Color::Yellow));
-    ASSERT_THAT(resultLeftLaneMarking.relativeStartDistance, DoubleEq(0.0));
-    ASSERT_THAT(resultLeftLaneMarking.width, DoubleEq(0.5));
+    ASSERT_THAT(resultLeftLaneMarking.relativeStartDistance.value(), DoubleEq(0.0));
+    ASSERT_THAT(resultLeftLaneMarking.width.value(), DoubleEq(0.5));
 
-    auto resultRight = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0, 100, Side::Right);
+    auto resultRight = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0_m, 100_m, Side::Right);
     ASSERT_THAT(resultRight.at(node1->roadGraphVertex), SizeIs(1));
     auto& resultRightLaneMarking = resultRight.at(node1->roadGraphVertex).at(0);
     ASSERT_THAT(resultRightLaneMarking.type, Eq(LaneMarking::Type::Broken));
     ASSERT_THAT(resultRightLaneMarking.color, Eq(LaneMarking::Color::Blue));
-    ASSERT_THAT(resultRightLaneMarking.relativeStartDistance, DoubleEq(0.0));
-    ASSERT_THAT(resultRightLaneMarking.width, DoubleEq(0.6));
+    ASSERT_THAT(resultRightLaneMarking.relativeStartDistance.value(), DoubleEq(0.0));
+    ASSERT_THAT(resultRightLaneMarking.width.value(), DoubleEq(0.6));
 }
 
 TEST(GetLaneMarkings, OneLaneWithSolidBrokenBoundary)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     Fakes::WorldData worldData;
 
     std::vector<OWL::Id> leftLaneBoundaries { {4, 5} };
     ON_CALL(*lane1, GetLeftLaneBoundaries()).WillByDefault(Return(leftLaneBoundaries));
 
     Fakes::LaneBoundary leftLine{};
-    ON_CALL(leftLine, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(leftLine, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(leftLine, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(leftLine, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(leftLine, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(leftLine, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(leftLine, GetType()).WillByDefault(Return(LaneMarking::Type::Solid));
     ON_CALL(leftLine, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(leftLine, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Left));
 
     Fakes::LaneBoundary rightLine{};
-    ON_CALL(rightLine, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(rightLine, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(rightLine, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(rightLine, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(rightLine, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(rightLine, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(rightLine, GetType()).WillByDefault(Return(LaneMarking::Type::Broken));
     ON_CALL(rightLine, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(rightLine, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Right));
@@ -964,36 +964,36 @@ TEST(GetLaneMarkings, OneLaneWithSolidBrokenBoundary)
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0, 100, Side::Left);
+    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0_m, 100_m, Side::Left);
     ASSERT_THAT(result.at(node1->roadGraphVertex), SizeIs(1));
     auto& resultLaneMarking = result.at(node1->roadGraphVertex).at(0);
     ASSERT_THAT(resultLaneMarking.type, Eq(LaneMarking::Type::Solid_Broken));
     ASSERT_THAT(resultLaneMarking.color, Eq(LaneMarking::Color::Yellow));
-    ASSERT_THAT(resultLaneMarking.relativeStartDistance, DoubleEq(0.0));
-    ASSERT_THAT(resultLaneMarking.width, DoubleEq(0.5));
+    ASSERT_THAT(resultLaneMarking.relativeStartDistance.value(), DoubleEq(0.0));
+    ASSERT_THAT(resultLaneMarking.width.value(), DoubleEq(0.5));
 }
 
 TEST(GetLaneMarkings, OneLaneWithBrokenSolidBoundary)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     Fakes::WorldData worldData;
 
     std::vector<OWL::Id> leftLaneBoundaries { {4, 5} };
     ON_CALL(*lane1, GetLeftLaneBoundaries()).WillByDefault(Return(leftLaneBoundaries));
 
     Fakes::LaneBoundary leftLine{};
-    ON_CALL(leftLine, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(leftLine, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(leftLine, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(leftLine, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(leftLine, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(leftLine, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(leftLine, GetType()).WillByDefault(Return(LaneMarking::Type::Broken));
     ON_CALL(leftLine, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(leftLine, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Left));
 
     Fakes::LaneBoundary rightLine{};
-    ON_CALL(rightLine, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(rightLine, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(rightLine, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(rightLine, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(rightLine, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(rightLine, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(rightLine, GetType()).WillByDefault(Return(LaneMarking::Type::Solid));
     ON_CALL(rightLine, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(rightLine, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Right));
@@ -1003,36 +1003,36 @@ TEST(GetLaneMarkings, OneLaneWithBrokenSolidBoundary)
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0, 100, Side::Left);
+    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0_m, 100_m, Side::Left);
     ASSERT_THAT(result.at(node1->roadGraphVertex), SizeIs(1));
     auto& resultLaneMarking = result.at(node1->roadGraphVertex).at(0);
     ASSERT_THAT(resultLaneMarking.type, Eq(LaneMarking::Type::Broken_Solid));
     ASSERT_THAT(resultLaneMarking.color, Eq(LaneMarking::Color::Yellow));
-    ASSERT_THAT(resultLaneMarking.relativeStartDistance, DoubleEq(0.0));
-    ASSERT_THAT(resultLaneMarking.width, DoubleEq(0.5));
+    ASSERT_THAT(resultLaneMarking.relativeStartDistance.value(), DoubleEq(0.0));
+    ASSERT_THAT(resultLaneMarking.width.value(), DoubleEq(0.5));
 }
 
 TEST(GetLaneMarkings, OneLaneWithSolidSolidBoundary)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     Fakes::WorldData worldData;
 
     std::vector<OWL::Id> leftLaneBoundaries { {4, 5} };
     ON_CALL(*lane1, GetLeftLaneBoundaries()).WillByDefault(Return(leftLaneBoundaries));
 
     Fakes::LaneBoundary leftLine{};
-    ON_CALL(leftLine, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(leftLine, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(leftLine, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(leftLine, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(leftLine, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(leftLine, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(leftLine, GetType()).WillByDefault(Return(LaneMarking::Type::Solid));
     ON_CALL(leftLine, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(leftLine, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Left));
 
     Fakes::LaneBoundary rightLine{};
-    ON_CALL(rightLine, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(rightLine, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(rightLine, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(rightLine, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(rightLine, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(rightLine, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(rightLine, GetType()).WillByDefault(Return(LaneMarking::Type::Solid));
     ON_CALL(rightLine, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(rightLine, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Right));
@@ -1042,36 +1042,36 @@ TEST(GetLaneMarkings, OneLaneWithSolidSolidBoundary)
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0, 100, Side::Left);
+    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0_m, 100_m, Side::Left);
     ASSERT_THAT(result.at(node1->roadGraphVertex), SizeIs(1));
     auto& resultLaneMarking = result.at(node1->roadGraphVertex).at(0);
     ASSERT_THAT(resultLaneMarking.type, Eq(LaneMarking::Type::Solid_Solid));
     ASSERT_THAT(resultLaneMarking.color, Eq(LaneMarking::Color::Yellow));
-    ASSERT_THAT(resultLaneMarking.relativeStartDistance, DoubleEq(0.0));
-    ASSERT_THAT(resultLaneMarking.width, DoubleEq(0.5));
+    ASSERT_THAT(resultLaneMarking.relativeStartDistance.value(), DoubleEq(0.0));
+    ASSERT_THAT(resultLaneMarking.width.value(), DoubleEq(0.5));
 }
 
 TEST(GetLaneMarkings, OneLaneWithBrokenBrokenBoundary)
 {
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
     Fakes::WorldData worldData;
 
     std::vector<OWL::Id> leftLaneBoundaries { {4, 5} };
     ON_CALL(*lane1, GetLeftLaneBoundaries()).WillByDefault(Return(leftLaneBoundaries));
 
     Fakes::LaneBoundary leftLine{};
-    ON_CALL(leftLine, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(leftLine, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(leftLine, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(leftLine, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(leftLine, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(leftLine, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(leftLine, GetType()).WillByDefault(Return(LaneMarking::Type::Broken));
     ON_CALL(leftLine, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(leftLine, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Left));
 
     Fakes::LaneBoundary rightLine{};
-    ON_CALL(rightLine, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(rightLine, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(rightLine, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(rightLine, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(rightLine, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(rightLine, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(rightLine, GetType()).WillByDefault(Return(LaneMarking::Type::Broken));
     ON_CALL(rightLine, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(rightLine, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Right));
@@ -1081,66 +1081,66 @@ TEST(GetLaneMarkings, OneLaneWithBrokenBrokenBoundary)
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0, 100, Side::Left);
+    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 0_m, 100_m, Side::Left);
     ASSERT_THAT(result.at(node1->roadGraphVertex), SizeIs(1));
     auto& resultLaneMarking = result.at(node1->roadGraphVertex).at(0);
     ASSERT_THAT(resultLaneMarking.type, Eq(LaneMarking::Type::Broken_Broken));
     ASSERT_THAT(resultLaneMarking.color, Eq(LaneMarking::Color::Yellow));
-    ASSERT_THAT(resultLaneMarking.relativeStartDistance, DoubleEq(0.0));
-    ASSERT_THAT(resultLaneMarking.width, DoubleEq(0.5));
+    ASSERT_THAT(resultLaneMarking.relativeStartDistance.value(), DoubleEq(0.0));
+    ASSERT_THAT(resultLaneMarking.width.value(), DoubleEq(0.5));
 }
 
 TEST(GetLaneMarkings, TwoLanesWithMultipleBoundaries)
 {
 
     FakeLaneMultiStream laneMultiStream;
-    auto [node1, lane1] = laneMultiStream.AddRoot(100, true);
-    auto [node2, lane2] = laneMultiStream.AddLane(200, true, *node1);
+    auto [node1, lane1] = laneMultiStream.AddRoot(100_m, true);
+    auto [node2, lane2] = laneMultiStream.AddLane(200_m, true, *node1);
     Fakes::WorldData worldData;
 
     std::vector<OWL::Id> leftLane1Boundaries { {4, 5, 6} };
     ON_CALL(*lane1, GetLeftLaneBoundaries()).WillByDefault(Return(leftLane1Boundaries));
-    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.0));
+    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.0_m));
     std::vector<OWL::Id> leftLane2Boundaries { {10, 11} };
     ON_CALL(*lane2, GetLeftLaneBoundaries()).WillByDefault(Return(leftLane2Boundaries));
-    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(100.0));
+    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(100.0_m));
 
     Fakes::LaneBoundary fakeLaneBoundary4{};
-    ON_CALL(fakeLaneBoundary4, GetWidth()).WillByDefault(Return(0.5));
-    ON_CALL(fakeLaneBoundary4, GetSStart()).WillByDefault(Return(0));
-    ON_CALL(fakeLaneBoundary4, GetSEnd()).WillByDefault(Return(20));
+    ON_CALL(fakeLaneBoundary4, GetWidth()).WillByDefault(Return(0.5_m));
+    ON_CALL(fakeLaneBoundary4, GetSStart()).WillByDefault(Return(0_m));
+    ON_CALL(fakeLaneBoundary4, GetSEnd()).WillByDefault(Return(20_m));
     ON_CALL(fakeLaneBoundary4, GetType()).WillByDefault(Return(LaneMarking::Type::Solid));
     ON_CALL(fakeLaneBoundary4, GetColor()).WillByDefault(Return(LaneMarking::Color::Yellow));
     ON_CALL(fakeLaneBoundary4, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Single));
 
     Fakes::LaneBoundary fakeLaneBoundary5{};
-    ON_CALL(fakeLaneBoundary5, GetWidth()).WillByDefault(Return(0.6));
-    ON_CALL(fakeLaneBoundary5, GetSStart()).WillByDefault(Return(20));
-    ON_CALL(fakeLaneBoundary5, GetSEnd()).WillByDefault(Return(60));
+    ON_CALL(fakeLaneBoundary5, GetWidth()).WillByDefault(Return(0.6_m));
+    ON_CALL(fakeLaneBoundary5, GetSStart()).WillByDefault(Return(20_m));
+    ON_CALL(fakeLaneBoundary5, GetSEnd()).WillByDefault(Return(60_m));
     ON_CALL(fakeLaneBoundary5, GetType()).WillByDefault(Return(LaneMarking::Type::Broken));
     ON_CALL(fakeLaneBoundary5, GetColor()).WillByDefault(Return(LaneMarking::Color::Blue));
     ON_CALL(fakeLaneBoundary5, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Single));
 
     Fakes::LaneBoundary fakeLaneBoundary6{};
-    ON_CALL(fakeLaneBoundary6, GetWidth()).WillByDefault(Return(0.7));
-    ON_CALL(fakeLaneBoundary6, GetSStart()).WillByDefault(Return(60));
-    ON_CALL(fakeLaneBoundary6, GetSEnd()).WillByDefault(Return(100));
+    ON_CALL(fakeLaneBoundary6, GetWidth()).WillByDefault(Return(0.7_m));
+    ON_CALL(fakeLaneBoundary6, GetSStart()).WillByDefault(Return(60_m));
+    ON_CALL(fakeLaneBoundary6, GetSEnd()).WillByDefault(Return(100_m));
     ON_CALL(fakeLaneBoundary6, GetType()).WillByDefault(Return(LaneMarking::Type::Solid));
     ON_CALL(fakeLaneBoundary6, GetColor()).WillByDefault(Return(LaneMarking::Color::White));
     ON_CALL(fakeLaneBoundary6, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Single));
 
     Fakes::LaneBoundary fakeLaneBoundary10{};
-    ON_CALL(fakeLaneBoundary10, GetWidth()).WillByDefault(Return(0.8));
-    ON_CALL(fakeLaneBoundary10, GetSStart()).WillByDefault(Return(100));
-    ON_CALL(fakeLaneBoundary10, GetSEnd()).WillByDefault(Return(150));
+    ON_CALL(fakeLaneBoundary10, GetWidth()).WillByDefault(Return(0.8_m));
+    ON_CALL(fakeLaneBoundary10, GetSStart()).WillByDefault(Return(100_m));
+    ON_CALL(fakeLaneBoundary10, GetSEnd()).WillByDefault(Return(150_m));
     ON_CALL(fakeLaneBoundary10, GetType()).WillByDefault(Return(LaneMarking::Type::None));
     ON_CALL(fakeLaneBoundary10, GetColor()).WillByDefault(Return(LaneMarking::Color::White));
     ON_CALL(fakeLaneBoundary10, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Single));
 
     Fakes::LaneBoundary fakeLaneBoundary11{};
-    ON_CALL(fakeLaneBoundary11, GetWidth()).WillByDefault(Return(0.9));
-    ON_CALL(fakeLaneBoundary11, GetSStart()).WillByDefault(Return(150));
-    ON_CALL(fakeLaneBoundary11, GetSEnd()).WillByDefault(Return(200));
+    ON_CALL(fakeLaneBoundary11, GetWidth()).WillByDefault(Return(0.9_m));
+    ON_CALL(fakeLaneBoundary11, GetSStart()).WillByDefault(Return(150_m));
+    ON_CALL(fakeLaneBoundary11, GetSEnd()).WillByDefault(Return(200_m));
     ON_CALL(fakeLaneBoundary11, GetType()).WillByDefault(Return(LaneMarking::Type::Solid));
     ON_CALL(fakeLaneBoundary11, GetColor()).WillByDefault(Return(LaneMarking::Color::Green));
     ON_CALL(fakeLaneBoundary11, GetSide()).WillByDefault(Return(OWL::LaneMarkingSide::Single));
@@ -1153,46 +1153,46 @@ TEST(GetLaneMarkings, TwoLanesWithMultipleBoundaries)
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 50, 90, Side::Left);
+    auto result = wdQuery.GetLaneMarkings(laneMultiStream.Get(), 50_m, 90_m, Side::Left);
     const auto& result1 = result.at(node1->roadGraphVertex);
     ASSERT_THAT(result1, SizeIs(2));
     auto& result1LaneMarking0 = result1.at(0);
     ASSERT_THAT(result1LaneMarking0.type, Eq(LaneMarking::Type::Broken));
     ASSERT_THAT(result1LaneMarking0.color, Eq(LaneMarking::Color::Blue));
-    ASSERT_THAT(result1LaneMarking0.relativeStartDistance, DoubleEq(-30.0));
-    ASSERT_THAT(result1LaneMarking0.width, DoubleEq(0.6));
+    ASSERT_THAT(result1LaneMarking0.relativeStartDistance.value(), DoubleEq(-30.0));
+    ASSERT_THAT(result1LaneMarking0.width.value(), DoubleEq(0.6));
     auto& result1LaneMarking1 = result1.at(1);
     ASSERT_THAT(result1LaneMarking1.type, Eq(LaneMarking::Type::Solid));
     ASSERT_THAT(result1LaneMarking1.color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(result1LaneMarking1.relativeStartDistance, DoubleEq(10.0));
-    ASSERT_THAT(result1LaneMarking1.width, DoubleEq(0.7));
+    ASSERT_THAT(result1LaneMarking1.relativeStartDistance.value(), DoubleEq(10.0));
+    ASSERT_THAT(result1LaneMarking1.width.value(), DoubleEq(0.7));
 
     const auto& result2 = result.at(node2->roadGraphVertex);
     ASSERT_THAT(result2, SizeIs(3));
     auto& result2LaneMarking0 = result2.at(0);
     ASSERT_THAT(result2LaneMarking0.type, Eq(LaneMarking::Type::Broken));
     ASSERT_THAT(result2LaneMarking0.color, Eq(LaneMarking::Color::Blue));
-    ASSERT_THAT(result2LaneMarking0.relativeStartDistance, DoubleEq(-30.0));
-    ASSERT_THAT(result2LaneMarking0.width, DoubleEq(0.6));
+    ASSERT_THAT(result2LaneMarking0.relativeStartDistance.value(), DoubleEq(-30.0));
+    ASSERT_THAT(result2LaneMarking0.width.value(), DoubleEq(0.6));
     auto& result2LaneMarking1 = result2.at(1);
     ASSERT_THAT(result2LaneMarking1.type, Eq(LaneMarking::Type::Solid));
     ASSERT_THAT(result2LaneMarking1.color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(result2LaneMarking1.relativeStartDistance, DoubleEq(10.0));
-    ASSERT_THAT(result2LaneMarking1.width, DoubleEq(0.7));
+    ASSERT_THAT(result2LaneMarking1.relativeStartDistance.value(), DoubleEq(10.0));
+    ASSERT_THAT(result2LaneMarking1.width.value(), DoubleEq(0.7));
     auto& result2LaneMarking2 = result2.at(2);
     ASSERT_THAT(result2LaneMarking2.type, Eq(LaneMarking::Type::None));
     ASSERT_THAT(result2LaneMarking2.color, Eq(LaneMarking::Color::White));
-    ASSERT_THAT(result2LaneMarking2.relativeStartDistance, DoubleEq(50.0));
-    ASSERT_THAT(result2LaneMarking2.width, DoubleEq(0.8));
+    ASSERT_THAT(result2LaneMarking2.relativeStartDistance.value(), DoubleEq(50.0));
+    ASSERT_THAT(result2LaneMarking2.width.value(), DoubleEq(0.8));
 }
 /*
 TEST(CreateLaneStream, OnlyUniqueConnectionsInStreamDirection)
 {
-    FakeLaneManager fakelm1{2, 2, 3.0, {10.0, 11.0}, "Road1"};
+    FakeLaneManager fakelm1{2, 2, 3.0_m, {10.0_m, 11.0_m}, "Road1"};
     Fakes::Lane& startLane = fakelm1.GetLane(0, 0);
     auto road1 = fakelm1.GetRoads().cbegin()->second;
     auto& road1Id = fakelm1.GetRoads().cbegin()->first;
-    FakeLaneManager fakelm2{2, 2, 3.0, {12.0, 13.0}, "Road2"};
+    FakeLaneManager fakelm2{2, 2, 3.0_m, {12.0_m, 13.0_m}, "Road2"};
     auto road2 = fakelm2.GetRoads().cbegin()->second;
     auto& road2Id = fakelm2.GetRoads().cbegin()->first;
     std::vector<OWL::Id> successorsLanes1_1 {fakelm1.GetLane(1, 0).GetId()};
@@ -1233,11 +1233,11 @@ TEST(CreateLaneStream, OnlyUniqueConnectionsInStreamDirection)
 
 TEST(CreateLaneStream, SecondRoadAgainstStreamDirection)
 {
-    FakeLaneManager fakelm1{2, 2, 3.0, {10.0, 11.0}, "Road1"};
+    FakeLaneManager fakelm1{2, 2, 3.0_m, {10.0_m, 11.0_m}, "Road1"};
     Fakes::Lane& startLane = fakelm1.GetLane(0, 0);
     auto road1 = fakelm1.GetRoads().cbegin()->second;
     auto road1Id = fakelm1.GetRoads().cbegin()->first;
-    FakeLaneManager fakelm2{2, 2, 3.0, {12.0, 13.0}, "Road2"};
+    FakeLaneManager fakelm2{2, 2, 3.0_m, {12.0_m, 13.0_m}, "Road2"};
     auto road2 = fakelm2.GetRoads().cbegin()->second;
     auto road2Id = fakelm2.GetRoads().cbegin()->first;
     std::vector<OWL::Id> successorsLanes1_1 {fakelm1.GetLane(1, 0).GetId()};
@@ -1278,14 +1278,14 @@ TEST(CreateLaneStream, SecondRoadAgainstStreamDirection)
 
 TEST(CreateLaneStream, MultipleConnections)
 {
-    FakeLaneManager fakelm1{1, 2, 3.0, {10.0}, "Road1"};
+    FakeLaneManager fakelm1{1, 2, 3.0_m, {10.0_m}, "Road1"};
     Fakes::Lane& startLane = fakelm1.GetLane(0, 0);
     auto road1 = fakelm1.GetRoads().cbegin()->second;
     auto road1Id = fakelm1.GetRoads().cbegin()->first;
-    FakeLaneManager fakelm2{1, 2, 3.0, {11.0}, "Road2"};
+    FakeLaneManager fakelm2{1, 2, 3.0_m, {11.0_m}, "Road2"};
     auto road2 = fakelm2.GetRoads().cbegin()->second;
     auto road2Id = fakelm2.GetRoads().cbegin()->first;
-    FakeLaneManager fakelm3{1, 2, 3.0, {12.0}, "Road3"};
+    FakeLaneManager fakelm3{1, 2, 3.0_m, {12.0_m}, "Road3"};
     auto road3 = fakelm3.GetRoads().cbegin()->second;
     auto road3Id = fakelm3.GetRoads().cbegin()->first;
     std::vector<OWL::Id> successorsLanes1_1 {fakelm2.GetLane(0, 0).GetId(), fakelm3.GetLane(0, 0).GetId()};
@@ -1314,10 +1314,10 @@ TEST(CreateLaneStream, MultipleConnections)
 
 TEST(CreateLaneStream, StartOnSecondLane)
 {
-    FakeLaneManager fakelm1{2, 2, 3.0, {10.0, 11.0}, "Road1"};
+    FakeLaneManager fakelm1{2, 2, 3.0_m, {10.0_m, 11.0_m}, "Road1"};
     auto road1 = fakelm1.GetRoads().cbegin()->second;
     auto road1Id = fakelm1.GetRoads().cbegin()->first;
-    FakeLaneManager fakelm2{2, 2, 3.0, {12.0, 13.0}, "Road2"};
+    FakeLaneManager fakelm2{2, 2, 3.0_m, {12.0_m, 13.0_m}, "Road2"};
     auto road2 = fakelm2.GetRoads().cbegin()->second;
     auto road2Id = fakelm2.GetRoads().cbegin()->first;
     std::vector<OWL::Id> successorsLanes1_1 {fakelm1.GetLane(1, 0).GetId()};
@@ -1360,13 +1360,13 @@ TEST(CreateLaneStream, StartOnSecondLane)
 
 TEST(CreateLaneStream, StartOnSecondRoad)
 {
-    FakeLaneManager fakelm1{2, 2, 3.0, {10.0, 11.0}, "Road1"};
+    FakeLaneManager fakelm1{2, 2, 3.0_m, {10.0_m, 11.0_m}, "Road1"};
     auto road1 = fakelm1.GetRoads().cbegin()->second;
     auto road1Id = fakelm1.GetRoads().cbegin()->first;
-    FakeLaneManager fakelm2{2, 2, 3.0, {12.0, 13.0}, "Road2"};
+    FakeLaneManager fakelm2{2, 2, 3.0_m, {12.0_m, 13.0_m}, "Road2"};
     auto road2 = fakelm2.GetRoads().cbegin()->second;
     auto road2Id = fakelm2.GetRoads().cbegin()->first;
-    FakeLaneManager fakelm3{2, 2, 3.0, {14.0, 15.0}, "Road3"};
+    FakeLaneManager fakelm3{2, 2, 3.0_m, {14.0_m, 15.0_m}, "Road3"};
     auto road3 = fakelm2.GetRoads().cbegin()->second;
     auto road3Id = fakelm2.GetRoads().cbegin()->first;
     std::vector<OWL::Id> successorsLanes1_1 {fakelm1.GetLane(1, 0).GetId()};
@@ -1411,11 +1411,11 @@ TEST(CreateLaneStream, StartOnSecondRoad)
 
 TEST(CreateLaneStream, ExcessRoudsInRoute)
 {
-    FakeLaneManager fakelm1{2, 2, 3.0, {10.0, 11.0}, "Road1"};
+    FakeLaneManager fakelm1{2, 2, 3.0_m, {10.0_m, 11.0_m}, "Road1"};
     Fakes::Lane& startLane = fakelm1.GetLane(0, 0);
     auto road1 = fakelm1.GetRoads().cbegin()->second;
     auto road1Id = fakelm1.GetRoads().cbegin()->first;
-    FakeLaneManager fakelm2{2, 2, 3.0, {12.0, 13.0}, "Road2"};
+    FakeLaneManager fakelm2{2, 2, 3.0_m, {12.0_m, 13.0_m}, "Road2"};
     auto road2 = fakelm2.GetRoads().cbegin()->second;
     auto road2Id = fakelm2.GetRoads().cbegin()->first;
     std::vector<OWL::Id> successorsLanes1_1 {fakelm1.GetLane(1, 0).GetId()};
@@ -1481,7 +1481,7 @@ TEST(CreateLaneMultiStream, LinearGraphOneLanePerRoad)
     ON_CALL(laneA, GetId()).WillByDefault(Return(idLaneA));
     ON_CALL(laneA, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneA, GetRoad()).WillByDefault(ReturnRef(roadA));
-    ON_CALL(laneA, GetLength()).WillByDefault(Return(100));
+    ON_CALL(laneA, GetLength()).WillByDefault(Return(100_m));
     ON_CALL(laneA, Exists()).WillByDefault(Return(true));
     OWL::Interfaces::Sections sectionsA{&sectionA};
     ON_CALL(roadA, GetSections()).WillByDefault(ReturnRef(sectionsA));
@@ -1495,7 +1495,7 @@ TEST(CreateLaneMultiStream, LinearGraphOneLanePerRoad)
     ON_CALL(laneB, GetId()).WillByDefault(Return(idLaneB));
     ON_CALL(laneB, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneB, GetRoad()).WillByDefault(ReturnRef(roadB));
-    ON_CALL(laneB, GetLength()).WillByDefault(Return(150));
+    ON_CALL(laneB, GetLength()).WillByDefault(Return(150_m));
     Fakes::Road roadC;
     Fakes::Lane laneC;
     std::string idRoadC = "RoadC";
@@ -1503,7 +1503,7 @@ TEST(CreateLaneMultiStream, LinearGraphOneLanePerRoad)
     ON_CALL(laneC, GetId()).WillByDefault(Return(idLaneC));
     ON_CALL(laneC, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneC, GetRoad()).WillByDefault(ReturnRef(roadC));
-    ON_CALL(laneC, GetLength()).WillByDefault(Return(200));
+    ON_CALL(laneC, GetLength()).WillByDefault(Return(200_m));
 
     std::vector<OWL::Id> successorsLanesA {idLaneB};
     ON_CALL(laneA, GetNext()).WillByDefault(ReturnRef(successorsLanesA));
@@ -1521,23 +1521,23 @@ TEST(CreateLaneMultiStream, LinearGraphOneLanePerRoad)
     ON_CALL(worldData, GetRoadGraphVertexMapping()).WillByDefault(ReturnRef(vertexMapping));
     WorldDataQuery wdQuery(worldData);
 
-    auto laneMultiStream = wdQuery.CreateLaneMultiStream(roadGraph, vertexA, -1, 0.0);
+    auto laneMultiStream = wdQuery.CreateLaneMultiStream(roadGraph, vertexA, -1, 0.0_m);
     const auto& root = laneMultiStream->GetRoot();
     ASSERT_THAT(root.roadGraphVertex, Eq(vertexA));
     ASSERT_THAT(root.element->element, Eq(&laneA));
-    ASSERT_THAT(root.element->sOffset, DoubleEq(0.));
+    ASSERT_THAT(root.element->sOffset.value(), DoubleEq(0.));
     ASSERT_THAT(root.element->inStreamDirection, Eq(true));
     ASSERT_THAT(root.next, SizeIs(1));
     const auto& node1 = root.next.front();
     ASSERT_THAT(node1.roadGraphVertex, Eq(vertexB));
     ASSERT_THAT(node1.element->element, Eq(&laneB));
-    ASSERT_THAT(node1.element->sOffset, DoubleEq(250.));
+    ASSERT_THAT(node1.element->sOffset.value(), DoubleEq(250.));
     ASSERT_THAT(node1.element->inStreamDirection, Eq(false));
     ASSERT_THAT(node1.next, SizeIs(1));
     const auto& node2 = node1.next.front();
     ASSERT_THAT(node2.roadGraphVertex, Eq(vertexC));
     ASSERT_THAT(node2.element->element, Eq(&laneC));
-    ASSERT_THAT(node2.element->sOffset, DoubleEq(250.));
+    ASSERT_THAT(node2.element->sOffset.value(), DoubleEq(250.));
     ASSERT_THAT(node2.element->inStreamDirection, Eq(true));
     ASSERT_THAT(node2.next, IsEmpty());
 }
@@ -1560,7 +1560,7 @@ TEST(CreateLaneMultiStream, LinearGraphOneRoadWithThreeLanes)
     ON_CALL(laneA, GetId()).WillByDefault(Return(idLaneA));
     ON_CALL(laneA, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneA, GetRoad()).WillByDefault(ReturnRef(roadA));
-    ON_CALL(laneA, GetLength()).WillByDefault(Return(100));
+    ON_CALL(laneA, GetLength()).WillByDefault(Return(100_m));
     ON_CALL(laneA, Exists()).WillByDefault(Return(true));
     OWL::Interfaces::Sections sectionsA{&sectionA};
     ON_CALL(roadA, GetSections()).WillByDefault(ReturnRef(sectionsA));
@@ -1571,12 +1571,12 @@ TEST(CreateLaneMultiStream, LinearGraphOneRoadWithThreeLanes)
     ON_CALL(laneB, GetId()).WillByDefault(Return(idLaneB));
     ON_CALL(laneB, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneB, GetRoad()).WillByDefault(ReturnRef(roadA));
-    ON_CALL(laneB, GetLength()).WillByDefault(Return(150));
+    ON_CALL(laneB, GetLength()).WillByDefault(Return(150_m));
     Fakes::Lane laneC;
     ON_CALL(laneC, GetId()).WillByDefault(Return(idLaneC));
     ON_CALL(laneC, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneC, GetRoad()).WillByDefault(ReturnRef(roadA));
-    ON_CALL(laneC, GetLength()).WillByDefault(Return(200));
+    ON_CALL(laneC, GetLength()).WillByDefault(Return(200_m));
 
     std::vector<OWL::Id> successorsLanesA {idLaneB};
     ON_CALL(laneA, GetNext()).WillByDefault(ReturnRef(successorsLanesA));
@@ -1594,23 +1594,23 @@ TEST(CreateLaneMultiStream, LinearGraphOneRoadWithThreeLanes)
     ON_CALL(worldData, GetRoadGraphVertexMapping()).WillByDefault(ReturnRef(vertexMapping));
     WorldDataQuery wdQuery(worldData);
 
-    auto laneMultiStream = wdQuery.CreateLaneMultiStream(roadGraph, vertexA, -1, 0.0);
+    auto laneMultiStream = wdQuery.CreateLaneMultiStream(roadGraph, vertexA, -1, 0.0_m);
     const auto& root = laneMultiStream->GetRoot();
     ASSERT_THAT(root.roadGraphVertex, Eq(vertexA));
     ASSERT_THAT(root.element->element, Eq(&laneA));
-    ASSERT_THAT(root.element->sOffset, DoubleEq(0.));
+    ASSERT_THAT(root.element->sOffset.value(), DoubleEq(0.));
     ASSERT_THAT(root.element->inStreamDirection, Eq(true));
     ASSERT_THAT(root.next, SizeIs(1));
     const auto& node1 = root.next.front();
     ASSERT_THAT(node1.roadGraphVertex, Eq(vertexA));
     ASSERT_THAT(node1.element->element, Eq(&laneB));
-    ASSERT_THAT(node1.element->sOffset, DoubleEq(100.));
+    ASSERT_THAT(node1.element->sOffset.value(), DoubleEq(100.));
     ASSERT_THAT(node1.element->inStreamDirection, Eq(true));
     ASSERT_THAT(node1.next, SizeIs(1));
     const auto& node2 = node1.next.front();
     ASSERT_THAT(node2.roadGraphVertex, Eq(vertexA));
     ASSERT_THAT(node2.element->element, Eq(&laneC));
-    ASSERT_THAT(node2.element->sOffset, DoubleEq(250.));
+    ASSERT_THAT(node2.element->sOffset.value(), DoubleEq(250.));
     ASSERT_THAT(node2.element->inStreamDirection, Eq(true));
     ASSERT_THAT(node2.next, IsEmpty());
 }
@@ -1635,7 +1635,7 @@ TEST(CreateLaneMultiStream, LinearGraphLanesDontContinue)
     ON_CALL(laneA, GetId()).WillByDefault(Return(idLaneA));
     ON_CALL(laneA, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneA, GetRoad()).WillByDefault(ReturnRef(roadA));
-    ON_CALL(laneA, GetLength()).WillByDefault(Return(100));
+    ON_CALL(laneA, GetLength()).WillByDefault(Return(100_m));
     ON_CALL(laneA, Exists()).WillByDefault(Return(true));
     OWL::Interfaces::Sections sectionsA{&sectionA};
     ON_CALL(roadA, GetSections()).WillByDefault(ReturnRef(sectionsA));
@@ -1653,11 +1653,11 @@ TEST(CreateLaneMultiStream, LinearGraphLanesDontContinue)
     ON_CALL(worldData, GetRoadGraphVertexMapping()).WillByDefault(ReturnRef(vertexMapping));
     WorldDataQuery wdQuery(worldData);
 
-    auto laneMultiStream = wdQuery.CreateLaneMultiStream(roadGraph, vertexA, -1, 0.0);
+    auto laneMultiStream = wdQuery.CreateLaneMultiStream(roadGraph, vertexA, -1, 0.0_m);
     const auto& root = laneMultiStream->GetRoot();
     ASSERT_THAT(root.roadGraphVertex, Eq(vertexA));
     ASSERT_THAT(root.element->element, Eq(&laneA));
-    ASSERT_THAT(root.element->sOffset, DoubleEq(0.));
+    ASSERT_THAT(root.element->sOffset.value(), DoubleEq(0.));
     ASSERT_THAT(root.element->inStreamDirection, Eq(true));
     ASSERT_THAT(root.next, SizeIs(1));
     const auto& node1 = root.next.front();
@@ -1692,7 +1692,7 @@ TEST(CreateLaneMultiStream, BranchingGraphOneLanePerRoad)
     ON_CALL(laneA, GetId()).WillByDefault(Return(idLaneA));
     ON_CALL(laneA, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneA, GetRoad()).WillByDefault(ReturnRef(roadA));
-    ON_CALL(laneA, GetLength()).WillByDefault(Return(100));
+    ON_CALL(laneA, GetLength()).WillByDefault(Return(100_m));
     ON_CALL(laneA, Exists()).WillByDefault(Return(true));
     OWL::Interfaces::Sections sectionsA{&sectionA};
     ON_CALL(roadA, GetSections()).WillByDefault(ReturnRef(sectionsA));
@@ -1706,7 +1706,7 @@ TEST(CreateLaneMultiStream, BranchingGraphOneLanePerRoad)
     ON_CALL(laneB, GetId()).WillByDefault(Return(idLaneB));
     ON_CALL(laneB, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneB, GetRoad()).WillByDefault(ReturnRef(roadB));
-    ON_CALL(laneB, GetLength()).WillByDefault(Return(150));
+    ON_CALL(laneB, GetLength()).WillByDefault(Return(150_m));
     Fakes::Road roadC;
     Fakes::Lane laneC;
     std::string idRoadC = "RoadC";
@@ -1714,7 +1714,7 @@ TEST(CreateLaneMultiStream, BranchingGraphOneLanePerRoad)
     ON_CALL(laneC, GetId()).WillByDefault(Return(idLaneC));
     ON_CALL(laneC, GetOdId()).WillByDefault(Return(-1));
     ON_CALL(laneC, GetRoad()).WillByDefault(ReturnRef(roadC));
-    ON_CALL(laneC, GetLength()).WillByDefault(Return(200));
+    ON_CALL(laneC, GetLength()).WillByDefault(Return(200_m));
 
     std::vector<OWL::Id> successorsLanesA {idLaneB, idLaneC};
     ON_CALL(laneA, GetNext()).WillByDefault(ReturnRef(successorsLanesA));
@@ -1732,23 +1732,23 @@ TEST(CreateLaneMultiStream, BranchingGraphOneLanePerRoad)
     ON_CALL(worldData, GetRoadGraphVertexMapping()).WillByDefault(ReturnRef(vertexMapping));
     WorldDataQuery wdQuery(worldData);
 
-    auto laneMultiStream = wdQuery.CreateLaneMultiStream(roadGraph, vertexA, -1, 0.0);
+    auto laneMultiStream = wdQuery.CreateLaneMultiStream(roadGraph, vertexA, -1, 0.0_m);
     const auto& root = laneMultiStream->GetRoot();
     ASSERT_THAT(root.roadGraphVertex, Eq(vertexA));
     ASSERT_THAT(root.element->element, Eq(&laneA));
-    ASSERT_THAT(root.element->sOffset, DoubleEq(0.));
+    ASSERT_THAT(root.element->sOffset.value(), DoubleEq(0.));
     ASSERT_THAT(root.element->inStreamDirection, Eq(true));
     ASSERT_THAT(root.next, SizeIs(2));
     const auto& node1 = root.next.front();
     ASSERT_THAT(node1.roadGraphVertex, Eq(vertexB));
     ASSERT_THAT(node1.element->element, Eq(&laneB));
-    ASSERT_THAT(node1.element->sOffset, DoubleEq(250.));
+    ASSERT_THAT(node1.element->sOffset.value(), DoubleEq(250.));
     ASSERT_THAT(node1.element->inStreamDirection, Eq(false));
     ASSERT_THAT(node1.next, IsEmpty());
     const auto& node2 = root.next.back();
     ASSERT_THAT(node2.roadGraphVertex, Eq(vertexC));
     ASSERT_THAT(node2.element->element, Eq(&laneC));
-    ASSERT_THAT(node2.element->sOffset, DoubleEq(100.));
+    ASSERT_THAT(node2.element->sOffset.value(), DoubleEq(100.));
     ASSERT_THAT(node2.element->inStreamDirection, Eq(true));
     ASSERT_THAT(node2.next, IsEmpty());
 }
@@ -1888,24 +1888,24 @@ public:
         ON_CALL(connectingRoad, IsInStreamDirection()).WillByDefault(Return(true));
         ON_CALL(connectingRoad, GetPredecessor()).WillByDefault(ReturnRef(idIncomingRoad));
         ON_CALL(connectingRoad, GetSections()).WillByDefault(ReturnRef(connectingSections));
-        ON_CALL(connectingRoad, GetLength()).WillByDefault(Return(10.0));
+        ON_CALL(connectingRoad, GetLength()).WillByDefault(Return(10.0_m));
         ON_CALL(connectingSection, GetLanes()).WillByDefault(ReturnRef(connectingLanes));
         ON_CALL(connectingSection, Covers(_)).WillByDefault(Return(true));
         ON_CALL(connectingLane1, GetId()).WillByDefault(Return(idConnectingLane1));
         ON_CALL(connectingLane1, GetOdId()).WillByDefault(Return(-1));
         ON_CALL(connectingLane1, GetLaneType()).WillByDefault(Return(LaneType::Driving));
         ON_CALL(connectingLane1, GetRoad()).WillByDefault(ReturnRef(connectingRoad));
-        ON_CALL(connectingLane1, GetLength()).WillByDefault(Return(10.0));
-        ON_CALL(connectingLane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
-        ON_CALL(connectingLane1, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(10.));
+        ON_CALL(connectingLane1, GetLength()).WillByDefault(Return(10.0_m));
+        ON_CALL(connectingLane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
+        ON_CALL(connectingLane1, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(10._m));
         ON_CALL(connectingLane1, Exists()).WillByDefault(Return(true));
         ON_CALL(connectingLane2, GetId()).WillByDefault(Return(idConnectingLane2));
         ON_CALL(connectingLane2, GetOdId()).WillByDefault(Return(-2));
         ON_CALL(connectingLane2, GetLaneType()).WillByDefault(Return(LaneType::Driving));
         ON_CALL(connectingLane2, GetRoad()).WillByDefault(ReturnRef(connectingRoad));
-        ON_CALL(connectingLane2, GetLength()).WillByDefault(Return(10.0));
-        ON_CALL(connectingLane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
-        ON_CALL(connectingLane2, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(10.));
+        ON_CALL(connectingLane2, GetLength()).WillByDefault(Return(10.0_m));
+        ON_CALL(connectingLane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
+        ON_CALL(connectingLane2, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(10._m));
         ON_CALL(connectingLane2, Exists()).WillByDefault(Return(true));
         ON_CALL(incomingRoad, GetSections()).WillByDefault(ReturnRef(incomingSections));
         ON_CALL(incomingRoad, IsInStreamDirection()).WillByDefault(Return(true));
@@ -1919,9 +1919,9 @@ public:
         ON_CALL(incomingLane1, GetNext()).WillByDefault(ReturnRef(successorsIncomingLane1));
         ON_CALL(incomingLane1, GetPrevious()).WillByDefault(ReturnRef(emptyIds));
         ON_CALL(incomingLane1, GetRoad()).WillByDefault(ReturnRef(incomingRoad));
-        ON_CALL(incomingLane1, GetLength()).WillByDefault(Return(1000.0));
-        ON_CALL(incomingLane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
-        ON_CALL(incomingLane1, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1000.));
+        ON_CALL(incomingLane1, GetLength()).WillByDefault(Return(1000.0_m));
+        ON_CALL(incomingLane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
+        ON_CALL(incomingLane1, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1000._m));
         ON_CALL(incomingLane1, GetOdId()).WillByDefault(Return(-1));
         ON_CALL(incomingLane1, Exists()).WillByDefault(Return(true));
         ON_CALL(incomingLane2, GetId()).WillByDefault(Return(idIncomingLane2));
@@ -1930,9 +1930,9 @@ public:
         ON_CALL(incomingLane2, GetNext()).WillByDefault(ReturnRef(successorsIncomingLane2));
         ON_CALL(incomingLane2, GetPrevious()).WillByDefault(ReturnRef(emptyIds));
         ON_CALL(incomingLane2, GetRoad()).WillByDefault(ReturnRef(incomingRoad));
-        ON_CALL(incomingLane2, GetLength()).WillByDefault(Return(1000.0));
-        ON_CALL(incomingLane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0.));
-        ON_CALL(incomingLane2, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1000.));
+        ON_CALL(incomingLane2, GetLength()).WillByDefault(Return(1000.0_m));
+        ON_CALL(incomingLane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(0._m));
+        ON_CALL(incomingLane2, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1000._m));
         ON_CALL(incomingLane2, GetOdId()).WillByDefault(Return(-2));
         ON_CALL(incomingLane2, Exists()).WillByDefault(Return(true));
 
@@ -1978,7 +1978,7 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, NoAgents_ReturnsEmptyVector)
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0);
+    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0_m);
 
     ASSERT_THAT(result.empty(), Eq(true));
 }
@@ -1986,10 +1986,10 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, NoAgents_ReturnsEmptyVector)
 TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnConnector_ReturnsThisAgent)
 {
     OWL::Fakes::MovingObject object;
-    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0}};
+    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments worldObjectsOnConnector{{overlap,&object}};
     OWL::Interfaces::LaneAssignments emptyWorldObjects;
     ON_CALL(connectingLane1, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyWorldObjects));
@@ -1999,7 +1999,7 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnConnector_Returns
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0);
+    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0_m);
 
     ASSERT_THAT(result, SizeIs(1));
     ASSERT_THAT(result.at(0), Eq(&object));
@@ -2008,14 +2008,14 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnConnector_Returns
 TEST_F(GetMovingObjectsInRangeOfJunctionConnection, TwoAgentsOnInComingRoad_ReturnsAgentInRange)
 {
     OWL::Fakes::MovingObject objectInRange, objectOutsideRange;
-    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,950,0,0},
-                              GlobalRoadPosition{"",0,950,0,0},
-                              GlobalRoadPosition{"",0,950,0,0},
-                              GlobalRoadPosition{"",0,950,0,0}};
-    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,850,0,0},
-                              GlobalRoadPosition{"",0,850,0,0},
-                              GlobalRoadPosition{"",0,850,0,0},
-                              GlobalRoadPosition{"",0,850,0,0}};
+    OWL::LaneOverlap overlap1{GlobalRoadPosition{"",0,950_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,950_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,950_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,950_m,0_m,0_rad}};
+    OWL::LaneOverlap overlap2{GlobalRoadPosition{"",0,850_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,850_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,850_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,850_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments worldObjectsOnInComingRoad{{overlap1, &objectInRange}, {overlap2, &objectOutsideRange}};
     OWL::Interfaces::LaneAssignments emptyWorldObjects;
     ON_CALL(connectingLane1, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyWorldObjects));
@@ -2025,7 +2025,7 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, TwoAgentsOnInComingRoad_Retu
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0);
+    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0_m);
 
     ASSERT_THAT(result, SizeIs(1));
     ASSERT_THAT(result.at(0), Eq(&objectInRange));
@@ -2034,10 +2034,10 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, TwoAgentsOnInComingRoad_Retu
 TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnBothConnectors_ReturnsThisAgentOnlyOnce)
 {
     OWL::Fakes::MovingObject object;
-    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0}};
+    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments worldObjectsOnConnector{{overlap, &object}};
     OWL::Interfaces::LaneAssignments emptyWorldObjects;
     ON_CALL(connectingLane1, GetWorldObjects(true)).WillByDefault(ReturnRef(worldObjectsOnConnector));
@@ -2047,7 +2047,7 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnBothConnectors_Re
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0);
+    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0_m);
 
     ASSERT_THAT(result, SizeIs(1));
     ASSERT_THAT(result.at(0), Eq(&object));
@@ -2056,10 +2056,10 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnBothConnectors_Re
 TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnBothIncomingRoads_ReturnsThisAgentOnlyOnce)
 {
     OWL::Fakes::MovingObject object;
-    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,950,0,0},
-                             GlobalRoadPosition{"",0,950,0,0},
-                             GlobalRoadPosition{"",0,950,0,0},
-                             GlobalRoadPosition{"",0,950,0,0}};
+    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,950_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,950_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,950_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,950_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments worldObjectsOnInComingRoad{{overlap, &object}};
     OWL::Interfaces::LaneAssignments emptyWorldObjects;
     ON_CALL(connectingLane1, GetWorldObjects(true)).WillByDefault(ReturnRef(emptyWorldObjects));
@@ -2069,7 +2069,7 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnBothIncomingRoads
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0);
+    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0_m);
 
     ASSERT_THAT(result, SizeIs(1));
     ASSERT_THAT(result.at(0), Eq(&object));
@@ -2078,10 +2078,10 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnBothIncomingRoads
 TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnConnectorAndIncomingRoads_ReturnsThisAgentOnlyOnce)
 {
     OWL::Fakes::MovingObject object;
-    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0}};
+    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments worldObjectsOnConnector{{overlap, &object}};
     OWL::Interfaces::LaneAssignments emptyWorldObjects;
     ON_CALL(connectingLane1, GetWorldObjects(true)).WillByDefault(ReturnRef(worldObjectsOnConnector));
@@ -2091,7 +2091,7 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnConnectorAndIncom
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0);
+    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0_m);
 
     ASSERT_THAT(result, SizeIs(1));
     ASSERT_THAT(result.at(0), Eq(&object));
@@ -2100,10 +2100,10 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnConnectorAndIncom
 TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnEachConnector_ReturnsBoth)
 {
     OWL::Fakes::MovingObject object1, object2;
-    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0},
-                             GlobalRoadPosition{"",0,5,0,0}};
+    OWL::LaneOverlap overlap{GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad},
+                             GlobalRoadPosition{"",0,5_m,0_m,0_rad}};
     OWL::Interfaces::LaneAssignments worldObjectsOnConnector1{{overlap, &object1}};
     OWL::Interfaces::LaneAssignments worldObjectsOnConnector2{{overlap, &object2}};
     OWL::Interfaces::LaneAssignments emptyWorldObjects;
@@ -2114,7 +2114,7 @@ TEST_F(GetMovingObjectsInRangeOfJunctionConnection, OneAgentsOnEachConnector_Ret
 
     WorldDataQuery wdQuery(worldData);
 
-    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0);
+    auto result = wdQuery.GetMovingObjectsInRangeOfJunctionConnection("Connection", 100.0_m);
 
     ASSERT_THAT(result, SizeIs(2));
     ASSERT_THAT(result, UnorderedElementsAre(&object1, &object2));
@@ -2163,14 +2163,14 @@ TEST(GetDistanceUntilMovingObjectEntersConnector, DISABLED_ObjectOnConnector_Ret
     std::map<std::string, OWL::Interfaces::Junction*> junctions{ {idJunction, &junction} };
     ON_CALL(worldData, GetJunctions()).WillByDefault(ReturnRef(junctions));
     ON_CALL(worldData, GetLanes()).WillByDefault(ReturnRef(lanes));
-    IntersectionInfo intersection{idConnectorB, IntersectingConnectionRank::Undefined, { { {idLaneA, idLaneB}, {10.0, 15.0} } } };
+    IntersectionInfo intersection{idConnectorB, IntersectingConnectionRank::Undefined, { { {idLaneA, idLaneB}, {10.0_m, 15.0_m} } } };
     std::map<std::string, std::vector<IntersectionInfo>> intersections{ {"ConnectorA", {intersection} } };
     ON_CALL(junction, GetIntersections()).WillByDefault(ReturnRef(intersections));
 
     WorldDataQuery wdQuery(worldData);
 
     auto distance = wdQuery.GetDistanceUntilObjectEntersConnector("ConnectorA", -1, "ConnectorB");
-    ASSERT_THAT(distance, Eq(3.0));
+    ASSERT_THAT(distance.value(), Eq(3.0));
 }
 
 TEST(GetDistanceUntilMovingObjectEntersConnector, DISABLED_ObjectOnIncomingRoad_ReturnsCorrectDistance)
@@ -2221,7 +2221,7 @@ TEST(GetDistanceUntilMovingObjectEntersConnector, DISABLED_ObjectOnIncomingRoad_
     ON_CALL(incomingSection, Covers(_)).WillByDefault(Return(true));
     ON_CALL(*incomingLane, GetId()).WillByDefault(Return(idIncomingLane));
     ON_CALL(*incomingLane, GetOdId()).WillByDefault(Return(-1));
-    ON_CALL(*incomingLane, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(*incomingLane, GetLength()).WillByDefault(Return(100.0_m));
     std::vector<OWL::Id> successorsIncomingLane{idLaneB};
     ON_CALL(*incomingLane, GetNext()).WillByDefault(ReturnRef(successorsIncomingLane));
     ON_CALL(*incomingLane, GetRoad()).WillByDefault(ReturnRef(incomingRoad));
@@ -2234,14 +2234,14 @@ TEST(GetDistanceUntilMovingObjectEntersConnector, DISABLED_ObjectOnIncomingRoad_
     std::map<std::string, OWL::Interfaces::Junction*> junctions{ {idJunction, &junction} };
     ON_CALL(worldData, GetJunctions()).WillByDefault(ReturnRef(junctions));
     ON_CALL(worldData, GetLanes()).WillByDefault(ReturnRef(lanes));
-    IntersectionInfo intersection{idConnectorB, IntersectingConnectionRank::Undefined, { { {idLaneA, idLaneB}, {10.0, 15.0} } } };
+    IntersectionInfo intersection{idConnectorB, IntersectingConnectionRank::Undefined, { { {idLaneA, idLaneB}, {10.0_m, 15.0_m} } } };
     std::map<std::string, std::vector<IntersectionInfo>> intersections{ {"ConnectorA", {intersection} } };
     ON_CALL(junction, GetIntersections()).WillByDefault(ReturnRef(intersections));
 
     WorldDataQuery wdQuery(worldData);
 
     auto distance = wdQuery.GetDistanceUntilObjectEntersConnector("ConnectorA", -1, "ConnectorB");
-    ASSERT_THAT(distance, Eq(103.0));
+    ASSERT_THAT(distance.value(), Eq(103.0));
 }
 
 TEST(GetDistanceUntilMovingObjectLeavesConnector, DISABLED_ObjectOnConnector_ReturnsCorrectDistance)
@@ -2287,14 +2287,14 @@ TEST(GetDistanceUntilMovingObjectLeavesConnector, DISABLED_ObjectOnConnector_Ret
     std::map<std::string, OWL::Interfaces::Junction*> junctions{ {idJunction, &junction} };
     ON_CALL(worldData, GetJunctions()).WillByDefault(ReturnRef(junctions));
     ON_CALL(worldData, GetLanes()).WillByDefault(ReturnRef(lanes));
-    IntersectionInfo intersection{idConnectorB, IntersectingConnectionRank::Undefined, { { {idLaneA, idLaneB}, {10.0, 15.0} } } };
+    IntersectionInfo intersection{idConnectorB, IntersectingConnectionRank::Undefined, { { {idLaneA, idLaneB}, {10.0_m, 15.0_m} } } };
     std::map<std::string, std::vector<IntersectionInfo>> intersections{ {"ConnectorA", {intersection} } };
     ON_CALL(junction, GetIntersections()).WillByDefault(ReturnRef(intersections));
 
     WorldDataQuery wdQuery(worldData);
 
     auto distance = wdQuery.GetDistanceUntilObjectLeavesConnector("ConnectorA", -1, "ConnectorB");
-    ASSERT_THAT(distance, Eq(11.0));
+    ASSERT_THAT(distance.value(), Eq(11.0));
 }
 
 TEST(GetDistanceUntilMovingObjectLeavesConnector, DISABLED_ObjectOnIncomingRoad_ReturnsCorrectDistance)
@@ -2345,7 +2345,7 @@ TEST(GetDistanceUntilMovingObjectLeavesConnector, DISABLED_ObjectOnIncomingRoad_
     ON_CALL(incomingSection, Covers(_)).WillByDefault(Return(true));
     ON_CALL(*incomingLane, GetId()).WillByDefault(Return(idIncomingLane));
     ON_CALL(*incomingLane, GetOdId()).WillByDefault(Return(-1));
-    ON_CALL(*incomingLane, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(*incomingLane, GetLength()).WillByDefault(Return(100.0_m));
     std::vector<OWL::Id> successorsInComingLane{idLaneB};
     ON_CALL(*incomingLane, GetNext()).WillByDefault(ReturnRef(successorsInComingLane));
     ON_CALL(*incomingLane, GetRoad()).WillByDefault(ReturnRef(incomingRoad));
@@ -2358,7 +2358,7 @@ TEST(GetDistanceUntilMovingObjectLeavesConnector, DISABLED_ObjectOnIncomingRoad_
     std::map<std::string, OWL::Interfaces::Junction*> junctions{ {idJunction, &junction} };
     ON_CALL(worldData, GetJunctions()).WillByDefault(ReturnRef(junctions));
     ON_CALL(worldData, GetLanes()).WillByDefault(ReturnRef(lanes));
-    IntersectionInfo intersection{idConnectorB, IntersectingConnectionRank::Undefined, { { {idLaneA, idLaneB}, {10.0, 15.0} } } };
+    IntersectionInfo intersection{idConnectorB, IntersectingConnectionRank::Undefined, { { {idLaneA, idLaneB}, {10.0_m, 15.0_m} } } };
     std::map<std::string, std::vector<IntersectionInfo>> intersections{ {"ConnectorA", {intersection} } };
     ON_CALL(junction, GetIntersections()).WillByDefault(ReturnRef(intersections));
 
@@ -2366,15 +2366,15 @@ TEST(GetDistanceUntilMovingObjectLeavesConnector, DISABLED_ObjectOnIncomingRoad_
     WorldDataQuery wdQuery(worldData);
 
     auto distance = wdQuery.GetDistanceUntilObjectLeavesConnector("ConnectorA", -1, "ConnectorB");
-    ASSERT_THAT(distance, Eq(111.0));
+    ASSERT_THAT(distance.value(), Eq(111.0));
 }
 
 TEST(GetDistanceBetweenObjects, LinearStreamObjectOnSameRoad_ReturnsDistanceOnAllNode)
 {
     FakeRoadMultiStream roadStream;
-    auto [node1, road1] = roadStream.AddRoot(100, true);
-    auto [node2, road2] = roadStream.AddRoad(200, false, *node1);
-    auto [node3, road3] = roadStream.AddRoad(300, true, *node2);
+    auto [node1, road1] = roadStream.AddRoot(100_m, true);
+    auto [node2, road2] = roadStream.AddRoad(200_m, false, *node1);
+    auto [node3, road3] = roadStream.AddRoad(300_m, true, *node2);
     Fakes::WorldData worldData;
 
     std::string idRoad1 = "Road1";
@@ -2384,23 +2384,23 @@ TEST(GetDistanceBetweenObjects, LinearStreamObjectOnSameRoad_ReturnsDistanceOnAl
     std::string idRoad3 = "Road3";
     ON_CALL(*road3, GetId()).WillByDefault(ReturnRef(idRoad3));
 
-    GlobalRoadPositions target{{"Road1", {"Road1", 0, 20, 0, 0}}};
+    GlobalRoadPositions target{{"Road1", {"Road1", 0, 20_m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery(worldData);
 
-    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 11.0, target);
+    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 11.0_m, target);
 
-    ASSERT_THAT(distance, ElementsAre(std::make_pair(node1->roadGraphVertex, std::optional<double>{9}),
-                                      std::make_pair(node2->roadGraphVertex, std::optional<double>{9}),
-                                      std::make_pair(node3->roadGraphVertex, std::optional<double>{9})));
+    ASSERT_THAT(distance, ElementsAre(std::make_pair(node1->roadGraphVertex, std::optional<units::length::meter_t>{9}),
+                                      std::make_pair(node2->roadGraphVertex, std::optional<units::length::meter_t>{9}),
+                                      std::make_pair(node3->roadGraphVertex, std::optional<units::length::meter_t>{9})));
 };
 
 TEST(GetDistanceBetweenObjects, LinearStreamObjectOnNextRoad_ReturnsDistanceOnThisAndFollowingNodes)
 {
     FakeRoadMultiStream roadStream;
-    auto [node1, road1] = roadStream.AddRoot(100, true);
-    auto [node2, road2] = roadStream.AddRoad(200, false, *node1);
-    auto [node3, road3] = roadStream.AddRoad(300, true, *node2);
+    auto [node1, road1] = roadStream.AddRoot(100_m, true);
+    auto [node2, road2] = roadStream.AddRoad(200_m, false, *node1);
+    auto [node3, road3] = roadStream.AddRoad(300_m, true, *node2);
     Fakes::WorldData worldData;
 
     std::string idRoad1 = "Road1";
@@ -2410,23 +2410,23 @@ TEST(GetDistanceBetweenObjects, LinearStreamObjectOnNextRoad_ReturnsDistanceOnTh
     std::string idRoad3 = "Road3";
     ON_CALL(*road3, GetId()).WillByDefault(ReturnRef(idRoad3));
 
-    GlobalRoadPositions target{{"Road2", {"Road2", 0, 20, 0, 0}}};
+    GlobalRoadPositions target{{"Road2", {"Road2", 0, 20_m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery(worldData);
 
-    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 11.0, target);
+    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 11.0_m, target);
 
     ASSERT_THAT(distance, ElementsAre(std::make_pair(node1->roadGraphVertex, std::nullopt),
-                                      std::make_pair(node2->roadGraphVertex, std::optional<double>{269}),
-                                      std::make_pair(node3->roadGraphVertex, std::optional<double>{269})));
+                                      std::make_pair(node2->roadGraphVertex, std::optional<units::length::meter_t>{269}),
+                                      std::make_pair(node3->roadGraphVertex, std::optional<units::length::meter_t>{269})));
 };
 
 TEST(GetDistanceBetweenObjects, LinearStreamObjectBehind_ReturnsNegativeDistance)
 {
     FakeRoadMultiStream roadStream;
-    auto [node1, road1] = roadStream.AddRoot(100, true);
-    auto [node2, road2] = roadStream.AddRoad(200, false, *node1);
-    auto [node3, road3] = roadStream.AddRoad(300, true, *node2);
+    auto [node1, road1] = roadStream.AddRoot(100_m, true);
+    auto [node2, road2] = roadStream.AddRoad(200_m, false, *node1);
+    auto [node3, road3] = roadStream.AddRoad(300_m, true, *node2);
     Fakes::WorldData worldData;
 
     std::string idRoad1 = "Road1";
@@ -2436,23 +2436,23 @@ TEST(GetDistanceBetweenObjects, LinearStreamObjectBehind_ReturnsNegativeDistance
     std::string idRoad3 = "Road3";
     ON_CALL(*road3, GetId()).WillByDefault(ReturnRef(idRoad3));
 
-    GlobalRoadPositions target{{"Road1", {"Road1", 0, 20, 0, 0}}};
+    GlobalRoadPositions target{{"Road1", {"Road1", 0, 20_m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery(worldData);
 
-    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 51.0, target);
+    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 51.0_m, target);
 
-    ASSERT_THAT(distance, ElementsAre(std::make_pair(node1->roadGraphVertex, std::optional<double>{-31}),
-                                      std::make_pair(node2->roadGraphVertex, std::optional<double>{-31}),
-                                      std::make_pair(node3->roadGraphVertex, std::optional<double>{-31})));
+    ASSERT_THAT(distance, ElementsAre(std::make_pair(node1->roadGraphVertex, std::optional<units::length::meter_t>{-31}),
+                                      std::make_pair(node2->roadGraphVertex, std::optional<units::length::meter_t>{-31}),
+                                      std::make_pair(node3->roadGraphVertex, std::optional<units::length::meter_t>{-31})));
 };
 
 TEST(GetDistanceBetweenObjects, BranchingStreamObjectOneLeaf_ReturnsDistanceOnThisNode)
 {
     FakeRoadMultiStream roadStream;
-    auto [node1, road1] = roadStream.AddRoot(100, true);
-    auto [node2, road2] = roadStream.AddRoad(200, false, *node1);
-    auto [node3, road3] = roadStream.AddRoad(300, true, *node1);
+    auto [node1, road1] = roadStream.AddRoot(100_m, true);
+    auto [node2, road2] = roadStream.AddRoad(200_m, false, *node1);
+    auto [node3, road3] = roadStream.AddRoad(300_m, true, *node1);
     Fakes::WorldData worldData;
 
     std::string idRoad1 = "Road1";
@@ -2462,23 +2462,23 @@ TEST(GetDistanceBetweenObjects, BranchingStreamObjectOneLeaf_ReturnsDistanceOnTh
     std::string idRoad3 = "Road3";
     ON_CALL(*road3, GetId()).WillByDefault(ReturnRef(idRoad3));
 
-    GlobalRoadPositions target{{"Road2", {"Road2", 0, 20, 0, 0}}};
+    GlobalRoadPositions target{{"Road2", {"Road2", 0, 20_m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery(worldData);
 
-    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 11.0, target);
+    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 11.0_m, target);
 
     ASSERT_THAT(distance, ElementsAre(std::make_pair(node1->roadGraphVertex, std::nullopt),
-                                      std::make_pair(node2->roadGraphVertex, std::optional<double>{269}),
+                                      std::make_pair(node2->roadGraphVertex, std::optional<units::length::meter_t>{269}),
                                       std::make_pair(node3->roadGraphVertex, std::nullopt)));
 };
 
 TEST(GetDistanceBetweenObjects, BranchingStreamObjectTwoLeaf_ReturnsDistanceForBoth)
 {
     FakeRoadMultiStream roadStream;
-    auto [node1, road1] = roadStream.AddRoot(100, true);
-    auto [node2, road2] = roadStream.AddRoad(200, false, *node1);
-    auto [node3, road3] = roadStream.AddRoad(300, true, *node1);
+    auto [node1, road1] = roadStream.AddRoot(100_m, true);
+    auto [node2, road2] = roadStream.AddRoad(200_m, false, *node1);
+    auto [node3, road3] = roadStream.AddRoad(300_m, true, *node1);
     Fakes::WorldData worldData;
 
     std::string idRoad1 = "Road1";
@@ -2488,126 +2488,126 @@ TEST(GetDistanceBetweenObjects, BranchingStreamObjectTwoLeaf_ReturnsDistanceForB
     std::string idRoad3 = "Road3";
     ON_CALL(*road3, GetId()).WillByDefault(ReturnRef(idRoad3));
 
-    GlobalRoadPositions target{{"Road2", {"Road2", 0, 20, 0, 0}}, {"Road3", {"Road3", 0, 40, 0, 0}}};
+    GlobalRoadPositions target{{"Road2", {"Road2", 0, 20_m, 0_m, 0_rad}}, {"Road3", {"Road3", 0, 40_m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery(worldData);
 
-    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 11.0, target);
+    const auto distance = wdQuery.GetDistanceBetweenObjects(roadStream.Get(), 11.0_m, target);
 
     ASSERT_THAT(distance, ElementsAre(std::make_pair(node1->roadGraphVertex, std::nullopt),
-                                      std::make_pair(node2->roadGraphVertex, std::optional<double>{269}),
-                                      std::make_pair(node3->roadGraphVertex, std::optional<double>{129})));
+                                      std::make_pair(node2->roadGraphVertex, std::optional<units::length::meter_t>{269}),
+                                      std::make_pair(node3->roadGraphVertex, std::optional<units::length::meter_t>{129})));
 };
 
 TEST(GetObstruction, ObjectOnSameLane)
 {
     OWL::Fakes::WorldData worldData;
     FakeLaneMultiStream laneStream;
-    auto [node, lane] = laneStream.AddRoot(1000.0, true);
+    auto [node, lane] = laneStream.AddRoot(1000.0_m, true);
     OWL::Fakes::Road fakeRoad;
     std::string roadId{"Road"};
     ON_CALL(fakeRoad, GetId()).WillByDefault(ReturnRef(roadId));
-    ON_CALL(*lane, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(500.0));
-    ON_CALL(*lane, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1500.0));
+    ON_CALL(*lane, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(500.0_m));
+    ON_CALL(*lane, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1500.0_m));
     ON_CALL(*lane, GetRoad()).WillByDefault(ReturnRef(fakeRoad));
-    Primitive::LaneGeometryJoint::Points sStartPoints{{},{2000.,2002.},{}};
-    ON_CALL(*lane, GetInterpolatedPointsAtDistance(510)).WillByDefault(Return(sStartPoints));
-    Primitive::LaneGeometryJoint::Points sEndPoints{{},{2005.,2002.},{}};
-    ON_CALL(*lane, GetInterpolatedPointsAtDistance(515)).WillByDefault(Return(sEndPoints));
+    Primitive::LaneGeometryJoint::Points sStartPoints{{},{2000._m,2002._m},{}};
+    ON_CALL(*lane, GetInterpolatedPointsAtDistance(510_m)).WillByDefault(Return(sStartPoints));
+    Primitive::LaneGeometryJoint::Points sEndPoints{{},{2005._m,2002._m},{}};
+    ON_CALL(*lane, GetInterpolatedPointsAtDistance(515_m)).WillByDefault(Return(sEndPoints));
 
-    double tCoordinate{0.0};
+    units::length::meter_t tCoordinate{0.0};
     RoadInterval roadInterval{{},
-                              GlobalRoadPosition{"",0,510,0,0},
-                              GlobalRoadPosition{"",0,515,0,0},
-                              GlobalRoadPosition{"",0,510,0,0},
-                              GlobalRoadPosition{"",0,510,0,0}};
+                              GlobalRoadPosition{"",0,510_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,515_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,510_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,510_m,0_m,0_rad}};
     RoadIntervals touchedRoads{{"Road", roadInterval}};
-    std::map<ObjectPoint, Common::Vector2d> points{{ObjectPointRelative::Leftmost, {2000., 2005.}},
-                                                   {ObjectPointRelative::Rightmost, {2000., 2000.}},
-                                                   {ObjectPointPredefined::FrontCenter, {2005., 2002.5}}};
+    std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> points{{ObjectPointRelative::Leftmost,      {2000._m,  2005._m}},
+                                                                           {ObjectPointRelative::Rightmost,     {2000._m,  2000._m}},
+                                                                           {ObjectPointPredefined::FrontCenter, {2005._m, 2002.5_m}}};
 
     WorldDataQuery wdQuery{worldData};
     auto result = wdQuery.GetObstruction(laneStream.Get(), tCoordinate, points, touchedRoads).at(node->roadGraphVertex);
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Leftmost), Eq(3));
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Rightmost), Eq(-2));
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointPredefined::FrontCenter), Eq(0.5));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Leftmost).value(), Eq(3));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Rightmost).value(), Eq(-2));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointPredefined::FrontCenter).value(), Eq(0.5));
 }
 
 TEST(GetObstruction, ObjectOnNextLane)
 {
     OWL::Fakes::WorldData worldData;
     FakeLaneMultiStream laneStream;
-    auto [node1, lane1] = laneStream.AddRoot(1000.0, true);
-    auto [node2, lane2] = laneStream.AddLane(1000.0, true, *node1);
+    auto [node1, lane1] = laneStream.AddRoot(1000.0_m, true);
+    auto [node2, lane2] = laneStream.AddLane(1000.0_m, true, *node1);
     OWL::Fakes::Road fakeRoad;
     std::string roadId{"Road"};
     ON_CALL(fakeRoad, GetId()).WillByDefault(ReturnRef(roadId));
-    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(500.0));
-    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1500.0));
+    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(500.0_m));
+    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1500.0_m));
     ON_CALL(*lane1, GetRoad()).WillByDefault(ReturnRef(fakeRoad));
-    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(1500.0));
-    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(2500.0));
+    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(1500.0_m));
+    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(2500.0_m));
     ON_CALL(*lane2, GetRoad()).WillByDefault(ReturnRef(fakeRoad));
-    Primitive::LaneGeometryJoint::Points sStartPoints{{},{2000.,2002.},{}};
-    ON_CALL(*lane2, GetInterpolatedPointsAtDistance(1510)).WillByDefault(Return(sStartPoints));
-    Primitive::LaneGeometryJoint::Points sEndPoints{{},{2005.,2002.},{}};
-    ON_CALL(*lane2, GetInterpolatedPointsAtDistance(1515)).WillByDefault(Return(sEndPoints));
+    Primitive::LaneGeometryJoint::Points sStartPoints{{},{2000._m,2002._m},{}};
+    ON_CALL(*lane2, GetInterpolatedPointsAtDistance(1510_m)).WillByDefault(Return(sStartPoints));
+    Primitive::LaneGeometryJoint::Points sEndPoints{{},{2005._m,2002._m},{}};
+    ON_CALL(*lane2, GetInterpolatedPointsAtDistance(1515_m)).WillByDefault(Return(sEndPoints));
 
-    double tCoordinate{0.0};
+    units::length::meter_t tCoordinate{0.0};
     RoadInterval roadInterval{{},
-                              GlobalRoadPosition{"",0,1510,0,0},
-                              GlobalRoadPosition{"",0,1515,0,0},
-                              GlobalRoadPosition{"",0,1510,0,0},
-                              GlobalRoadPosition{"",0,1510,0,0}};
+                              GlobalRoadPosition{"",0,1510_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1515_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1510_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1510_m,0_m,0_rad}};
     RoadIntervals touchedRoads{{"Road", roadInterval}};
-    std::map<ObjectPoint, Common::Vector2d> points{{ObjectPointRelative::Leftmost, {2000., 2005.}},
-                                                   {ObjectPointRelative::Rightmost, {2000., 2000.}},
-                                                   {ObjectPointPredefined::FrontCenter, {2005., 2002.5}}};
+    std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> points{{ObjectPointRelative::Leftmost,      {2000._m,  2005._m}},
+                                                                           {ObjectPointRelative::Rightmost,     {2000._m,  2000._m}},
+                                                                           {ObjectPointPredefined::FrontCenter, {2005._m, 2002.5_m}}};
 
     WorldDataQuery wdQuery{worldData};
     auto result = wdQuery.GetObstruction(laneStream.Get(), tCoordinate, points, touchedRoads).at(node2->roadGraphVertex);
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Leftmost), Eq(3));
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Rightmost), Eq(-2));
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointPredefined::FrontCenter), Eq(0.5));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Leftmost).value(), Eq(3));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Rightmost).value(), Eq(-2));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointPredefined::FrontCenter).value(), Eq(0.5));
 }
 
 TEST(GetObstruction, ObjectOnTwoLanes)
 {
     OWL::Fakes::WorldData worldData;
     FakeLaneMultiStream laneStream;
-    auto [node1, lane1] = laneStream.AddRoot(1000.0, true);
-    auto [node2, lane2] = laneStream.AddLane(1000.0, true, *node1);
+    auto [node1, lane1] = laneStream.AddRoot(1000.0_m, true);
+    auto [node2, lane2] = laneStream.AddLane(1000.0_m, true, *node1);
     OWL::Fakes::Road fakeRoad;
     std::string roadId{"Road"};
     ON_CALL(fakeRoad, GetId()).WillByDefault(ReturnRef(roadId));
-    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(500.0));
-    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1500.0));
+    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(500.0_m));
+    ON_CALL(*lane1, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(1500.0_m));
     ON_CALL(*lane1, GetRoad()).WillByDefault(ReturnRef(fakeRoad));
-    Primitive::LaneGeometryJoint::Points sStartPoints{{},{2000.,2000.},{}};
-    ON_CALL(*lane1, GetInterpolatedPointsAtDistance(1490)).WillByDefault(Return(sStartPoints));
-    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(1500.0));
-    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(2500.0));
+    Primitive::LaneGeometryJoint::Points sStartPoints{{},{2000._m,2000._m},{}};
+    ON_CALL(*lane1, GetInterpolatedPointsAtDistance(1490_m)).WillByDefault(Return(sStartPoints));
+    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadStart)).WillByDefault(Return(1500.0_m));
+    ON_CALL(*lane2, GetDistance(OWL::MeasurementPoint::RoadEnd)).WillByDefault(Return(2500.0_m));
     ON_CALL(*lane2, GetRoad()).WillByDefault(ReturnRef(fakeRoad));
-    Primitive::LaneGeometryJoint::Points sEndPoints{{},{2020.,2000.},{}};
-    ON_CALL(*lane2, GetInterpolatedPointsAtDistance(1510)).WillByDefault(Return(sEndPoints));
+    Primitive::LaneGeometryJoint::Points sEndPoints{{},{2020._m,2000._m},{}};
+    ON_CALL(*lane2, GetInterpolatedPointsAtDistance(1510_m)).WillByDefault(Return(sEndPoints));
 
-    double tCoordinate{0.0};
+    units::length::meter_t tCoordinate{0.0};
 
     RoadInterval roadInterval{{},
-                              GlobalRoadPosition{"",0,1490,0,0},
-                              GlobalRoadPosition{"",0,1510,0,0},
-                              GlobalRoadPosition{"",0,1500,0,0},
-                              GlobalRoadPosition{"",0,1500,0,0}};
+                              GlobalRoadPosition{"",0,1490_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1510_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1500_m,0_m,0_rad},
+                              GlobalRoadPosition{"",0,1500_m,0_m,0_rad}};
     RoadIntervals touchedRoads{{"Road", roadInterval}};
-    std::map<ObjectPoint, Common::Vector2d> points{{ObjectPointRelative::Leftmost, {2010., 2010.}},
-                                                   {ObjectPointRelative::Rightmost, {2010., 1990.}},
-                                                   {ObjectPointPredefined::FrontCenter, {2005., 2005.}}};
+    std::map<ObjectPoint, Common::Vector2d<units::length::meter_t>> points{{ObjectPointRelative::Leftmost,      {2010._m, 2010._m}},
+                                                                           {ObjectPointRelative::Rightmost,     {2010._m, 1990._m}},
+                                                                           {ObjectPointPredefined::FrontCenter, {2005._m, 2005._m}}};
 
     WorldDataQuery wdQuery{worldData};
     auto result = wdQuery.GetObstruction(laneStream.Get(), tCoordinate, points, touchedRoads).at(node2->roadGraphVertex);
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Leftmost), Eq(10));
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Rightmost), Eq(-10));
-    EXPECT_THAT(result.lateralDistances.at(ObjectPointPredefined::FrontCenter), Eq(5));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Leftmost).value(), Eq(10));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointRelative::Rightmost).value(), Eq(-10));
+    EXPECT_THAT(result.lateralDistances.at(ObjectPointPredefined::FrontCenter).value(), Eq(5));
 }
 
 TEST(GetRelativeRoads, OnlyOneRouteNotInJunction_ReturnsOneElement)
@@ -2615,7 +2615,7 @@ TEST(GetRelativeRoads, OnlyOneRouteNotInJunction_ReturnsOneElement)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, roadA] = roadStream.AddRoot(100.0, true);
+    auto [node, roadA] = roadStream.AddRoot(100.0_m, true);
     std::string idRoadA = "RoadA";
     ON_CALL(*roadA, GetId()).WillByDefault(ReturnRef(idRoadA));
     std::unordered_map<std::string, OWL::Road*> roads{{idRoadA, roadA}};
@@ -2624,11 +2624,11 @@ TEST(GetRelativeRoads, OnlyOneRouteNotInJunction_ReturnsOneElement)
     ON_CALL(worldData, GetJunctions()).WillByDefault(ReturnRef(junctions));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeRoads(roadStream.Get(), 0.0, 100.0).at(node->roadGraphVertex);
+    auto result = wdQuery.GetRelativeRoads(roadStream.Get(), 0.0_m, 100.0_m).at(node->roadGraphVertex);
 
     EXPECT_THAT(result, SizeIs(1));
-    EXPECT_THAT(result.at(0).startS, Eq(0));
-    EXPECT_THAT(result.at(0).endS, Eq(100));
+    EXPECT_THAT(result.at(0).startS.value(), Eq(0));
+    EXPECT_THAT(result.at(0).endS.value(), Eq(100));
     EXPECT_THAT(result.at(0).roadId, Eq("RoadA"));
     EXPECT_THAT(result.at(0).junction, Eq(false));
     EXPECT_THAT(result.at(0).inOdDirection, Eq(true));
@@ -2639,7 +2639,7 @@ TEST(GetRelativeRoads, OnlyOneRouteInJunction_ReturnsOneElement)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, roadA] = roadStream.AddRoot(100.0, true);
+    auto [node, roadA] = roadStream.AddRoot(100.0_m, true);
     std::string idRoadA = "RoadA";
 
     OWL::Fakes::Junction junction;
@@ -2654,11 +2654,11 @@ TEST(GetRelativeRoads, OnlyOneRouteInJunction_ReturnsOneElement)
     ON_CALL(junction, GetConnectingRoads()).WillByDefault(ReturnRef(roadsOnJunction));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeRoads(roadStream.Get(), 0.0, 100.0).at(node->roadGraphVertex);
+    auto result = wdQuery.GetRelativeRoads(roadStream.Get(), 0.0_m, 100.0_m).at(node->roadGraphVertex);
 
     EXPECT_THAT(result, SizeIs(1));
-    EXPECT_THAT(result.at(0).startS, Eq(0));
-    EXPECT_THAT(result.at(0).endS, Eq(100));
+    EXPECT_THAT(result.at(0).startS.value(), Eq(0));
+    EXPECT_THAT(result.at(0).endS.value(), Eq(100));
     EXPECT_THAT(result.at(0).roadId, Eq("RoadA"));
     EXPECT_THAT(result.at(0).junction, Eq(true));
     EXPECT_THAT(result.at(0).inOdDirection, Eq(true));
@@ -2669,15 +2669,15 @@ TEST(GetRelativeRoads, ThreeRoadsInJunction_ReturnsThreeElements)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [nodeA, roadA] = roadStream.AddRoot(100.0, true);
+    auto [nodeA, roadA] = roadStream.AddRoot(100.0_m, true);
     std::string idRoadA = "RoadA";
-    auto [nodeB, roadB] = roadStream.AddRoad(150.0, true, *nodeA);
+    auto [nodeB, roadB] = roadStream.AddRoad(150.0_m, true, *nodeA);
     std::string idRoadB = "RoadB";
-    auto [nodeC, roadC] = roadStream.AddRoad(200.0, false, *nodeB);
+    auto [nodeC, roadC] = roadStream.AddRoad(200.0_m, false, *nodeB);
     std::string idRoadC = "RoadC";
-    auto [nodeD, roadD] = roadStream.AddRoad(250.0, true, *nodeC);
+    auto [nodeD, roadD] = roadStream.AddRoad(250.0_m, true, *nodeC);
     std::string idRoadD = "RoadD";
-    auto [nodeE, roadE] = roadStream.AddRoad(300.0, true, *nodeD);
+    auto [nodeE, roadE] = roadStream.AddRoad(300.0_m, true, *nodeD);
     std::string idRoadE = "RoadE";
 
     OWL::Fakes::Junction junctionA;
@@ -2699,21 +2699,21 @@ TEST(GetRelativeRoads, ThreeRoadsInJunction_ReturnsThreeElements)
     ON_CALL(junctionB, GetConnectingRoads()).WillByDefault(ReturnRef(roadsOnJunctionB));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeRoads(roadStream.Get(), 110.0, 500.0).at(nodeD->roadGraphVertex);
+    auto result = wdQuery.GetRelativeRoads(roadStream.Get(), 110.0_m, 500.0_m).at(nodeD->roadGraphVertex);
 
     EXPECT_THAT(result, SizeIs(3));
-    EXPECT_THAT(result.at(0).startS, Eq(-10));
-    EXPECT_THAT(result.at(0).endS, Eq(140));
+    EXPECT_THAT(result.at(0).startS.value(), Eq(-10));
+    EXPECT_THAT(result.at(0).endS.value(), Eq(140));
     EXPECT_THAT(result.at(0).roadId, Eq("RoadB"));
     EXPECT_THAT(result.at(0).junction, Eq(true));
     EXPECT_THAT(result.at(0).inOdDirection, Eq(true));
-    EXPECT_THAT(result.at(1).startS, Eq(140));
-    EXPECT_THAT(result.at(1).endS, Eq(340));
+    EXPECT_THAT(result.at(1).startS.value(), Eq(140));
+    EXPECT_THAT(result.at(1).endS.value(), Eq(340));
     EXPECT_THAT(result.at(1).roadId, Eq("RoadC"));
     EXPECT_THAT(result.at(1).junction, Eq(false));
     EXPECT_THAT(result.at(1).inOdDirection, Eq(false));
-    EXPECT_THAT(result.at(2).startS, Eq(340));
-    EXPECT_THAT(result.at(2).endS, Eq(590));
+    EXPECT_THAT(result.at(2).startS.value(), Eq(340));
+    EXPECT_THAT(result.at(2).endS.value(), Eq(590));
     EXPECT_THAT(result.at(2).roadId, Eq("RoadD"));
     EXPECT_THAT(result.at(2).junction, Eq(true));
     EXPECT_THAT(result.at(2).inOdDirection, Eq(true));
@@ -2724,7 +2724,7 @@ TEST(GetRelativeLanes, OnlySectionInDrivingDirection_ReturnsLanesOfThisSection)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, road] = roadStream.AddRoot(100.0, true);
+    auto [node, road] = roadStream.AddRoot(100.0_m, true);
     OWL::Fakes::Lane lane1;
     OWL::Fakes::Lane lane2;
     OWL::Fakes::Lane lane3;
@@ -2745,16 +2745,16 @@ TEST(GetRelativeLanes, OnlySectionInDrivingDirection_ReturnsLanesOfThisSection)
     OWL::Fakes::Section section;
     OWL::Interfaces::Lanes lanes{{&lane1, &lane2, &lane3}};
     ON_CALL(section, GetLanes()).WillByDefault(ReturnRef(lanes));
-    ON_CALL(section, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section, GetLength()).WillByDefault(Return(100.0_m));
     std::vector<const OWL::Interfaces::Section*> sections{&section};
     ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sections));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 10.0, -1, 300.0, true).at(node->roadGraphVertex);
+    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 10.0_m, -1, 300.0_m, true).at(node->roadGraphVertex);
 
     ASSERT_THAT(result, SizeIs(1));
-    EXPECT_THAT(result.at(0).startS, Eq(-10));
-    EXPECT_THAT(result.at(0).endS, Eq(90));
+    EXPECT_THAT(result.at(0).startS.value(), Eq(-10));
+    EXPECT_THAT(result.at(0).endS.value(), Eq(90));
     ASSERT_THAT(result.at(0).lanes, SizeIs(3));
     EXPECT_THAT(result.at(0).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result.at(0).lanes.at(0).inDrivingDirection, Eq(true));
@@ -2778,7 +2778,7 @@ TEST(GetRelativeLanes, IncludeOncomingFalse_IgnoresOncomingLanes)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, road] = roadStream.AddRoot(100.0, true);
+    auto [node, road] = roadStream.AddRoot(100.0_m, true);
     OWL::Fakes::Lane lane1;
     OWL::Fakes::Lane lane2;
     OWL::Fakes::Lane lane3;
@@ -2799,16 +2799,16 @@ TEST(GetRelativeLanes, IncludeOncomingFalse_IgnoresOncomingLanes)
     OWL::Fakes::Section section;
     OWL::Interfaces::Lanes lanes{{&lane1, &lane2, &lane3}};
     ON_CALL(section, GetLanes()).WillByDefault(ReturnRef(lanes));
-    ON_CALL(section, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section, GetLength()).WillByDefault(Return(100.0_m));
     std::vector<const OWL::Interfaces::Section*> sections{&section};
     ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sections));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 10.0, -1, 300.0, false).at(node->roadGraphVertex);
+    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 10.0_m, -1, 300.0_m, false).at(node->roadGraphVertex);
 
     ASSERT_THAT(result, SizeIs(1));
-    EXPECT_THAT(result.at(0).startS, Eq(-10));
-    EXPECT_THAT(result.at(0).endS, Eq(90));
+    EXPECT_THAT(result.at(0).startS.value(), Eq(-10));
+    EXPECT_THAT(result.at(0).endS.value(), Eq(90));
     ASSERT_THAT(result.at(0).lanes, SizeIs(2));
     EXPECT_THAT(result.at(0).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result.at(0).lanes.at(0).inDrivingDirection, Eq(true));
@@ -2827,7 +2827,7 @@ TEST(GetRelativeLanes, OnlySectionAgainstDrivingDirection_ReturnsLanesOfThisSect
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, road] = roadStream.AddRoot(100.0, false);
+    auto [node, road] = roadStream.AddRoot(100.0_m, false);
     OWL::Fakes::Lane lane1;
     OWL::Fakes::Lane lane2;
     OWL::Fakes::Lane lane3;
@@ -2851,16 +2851,16 @@ TEST(GetRelativeLanes, OnlySectionAgainstDrivingDirection_ReturnsLanesOfThisSect
     OWL::Fakes::Section section;
     OWL::Interfaces::Lanes lanes{{&lane1, &lane2, &lane3}};
     ON_CALL(section, GetLanes()).WillByDefault(ReturnRef(lanes));
-    ON_CALL(section, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section, GetLength()).WillByDefault(Return(100.0_m));
     std::vector<const OWL::Interfaces::Section*> sections{&section};
     ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sections));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 0.0, -1, 300.0, true).at(node->roadGraphVertex);
+    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 0.0_m, -1, 300.0_m, true).at(node->roadGraphVertex);
 
     ASSERT_THAT(result, SizeIs(1));
-    EXPECT_THAT(result.at(0).startS, Eq(0));
-    EXPECT_THAT(result.at(0).endS, Eq(100));
+    EXPECT_THAT(result.at(0).startS.value(), Eq(0));
+    EXPECT_THAT(result.at(0).endS.value(), Eq(100));
     ASSERT_THAT(result.at(0).lanes, SizeIs(3));
     EXPECT_THAT(result.at(0).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result.at(0).lanes.at(0).inDrivingDirection, Eq(false));
@@ -2884,7 +2884,7 @@ TEST(GetRelativeLanes, TwoSectionsOnSameRoad_ReturnsLanesOfBothSections)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, road] = roadStream.AddRoot(100.0, true);
+    auto [node, road] = roadStream.AddRoot(100.0_m, true);
     OWL::Fakes::Lane lane1_1;
     OWL::Fakes::Lane lane1_2;
     OWL::Id idLane1_1 = 1, idLane1_2 = 2;
@@ -2900,7 +2900,7 @@ TEST(GetRelativeLanes, TwoSectionsOnSameRoad_ReturnsLanesOfBothSections)
     OWL::Fakes::Section section1;
     OWL::Interfaces::Lanes lanes1{{&lane1_1, &lane1_2}};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanes1));
-    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0_m));
     OWL::Fakes::Lane lane2_1;
     OWL::Fakes::Lane lane2_2;
     OWL::Fakes::Lane lane2_3;
@@ -2922,17 +2922,17 @@ TEST(GetRelativeLanes, TwoSectionsOnSameRoad_ReturnsLanesOfBothSections)
     OWL::Fakes::Section section2;
     OWL::Interfaces::Lanes lanes2{{&lane2_1, &lane2_2, &lane2_3}};
     ON_CALL(section2, GetLanes()).WillByDefault(ReturnRef(lanes2));
-    ON_CALL(section2, GetSOffset()).WillByDefault(Return(100.0));
-    ON_CALL(section2, GetLength()).WillByDefault(Return(200.0));
+    ON_CALL(section2, GetSOffset()).WillByDefault(Return(100.0_m));
+    ON_CALL(section2, GetLength()).WillByDefault(Return(200.0_m));
     std::vector<const OWL::Interfaces::Section*> sections{&section1, &section2};
     ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sections));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 0.0, -1, 300.0, true).at(node->roadGraphVertex);
+    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 0.0_m, -1, 300.0_m, true).at(node->roadGraphVertex);
 
     ASSERT_THAT(result, SizeIs(2));
-    EXPECT_THAT(result.at(0).startS, Eq(0));
-    EXPECT_THAT(result.at(0).endS, Eq(100));
+    EXPECT_THAT(result.at(0).startS.value(), Eq(0));
+    EXPECT_THAT(result.at(0).endS.value(), Eq(100));
     ASSERT_THAT(result.at(0).lanes, SizeIs(2));
     EXPECT_THAT(result.at(0).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result.at(0).lanes.at(0).inDrivingDirection, Eq(true));
@@ -2944,8 +2944,8 @@ TEST(GetRelativeLanes, TwoSectionsOnSameRoad_ReturnsLanesOfBothSections)
     EXPECT_THAT(result.at(0).lanes.at(1).type, Eq(LaneType::Exit));
     EXPECT_THAT(result.at(0).lanes.at(1).predecessor, Eq(std::nullopt));
     EXPECT_THAT(result.at(0).lanes.at(1).successor.value(), Eq(-1));
-    EXPECT_THAT(result.at(1).startS, Eq(100));
-    EXPECT_THAT(result.at(1).endS, Eq(300));
+    EXPECT_THAT(result.at(1).startS.value(), Eq(100));
+    EXPECT_THAT(result.at(1).endS.value(), Eq(300));
     ASSERT_THAT(result.at(1).lanes, SizeIs(3));
     EXPECT_THAT(result.at(1).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result.at(1).lanes.at(0).inDrivingDirection, Eq(true));
@@ -2969,7 +2969,7 @@ TEST(GetRelativeLanes, IdOfEgoLaneChanges_ReturnsLanesWithCorrectRelativeId)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, road] = roadStream.AddRoot(100.0, true);
+    auto [node, road] = roadStream.AddRoot(100.0_m, true);
     OWL::Fakes::Lane lane1_1;
     OWL::Fakes::Lane lane1_2;
     OWL::Id idLane1_1 = 1, idLane1_2 = 2;
@@ -2985,7 +2985,7 @@ TEST(GetRelativeLanes, IdOfEgoLaneChanges_ReturnsLanesWithCorrectRelativeId)
     OWL::Fakes::Section section1;
     OWL::Interfaces::Lanes lanes1{{&lane1_1, &lane1_2}};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanes1));
-    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0_m));
     OWL::Fakes::Lane lane2_1;
     OWL::Fakes::Lane lane2_2;
     OWL::Fakes::Lane lane2_3;
@@ -3007,17 +3007,17 @@ TEST(GetRelativeLanes, IdOfEgoLaneChanges_ReturnsLanesWithCorrectRelativeId)
     OWL::Fakes::Section section2;
     OWL::Interfaces::Lanes lanes2{{&lane2_1, &lane2_2, &lane2_3}};
     ON_CALL(section2, GetLanes()).WillByDefault(ReturnRef(lanes2));
-    ON_CALL(section2, GetSOffset()).WillByDefault(Return(100.0));
-    ON_CALL(section2, GetLength()).WillByDefault(Return(200.0));
+    ON_CALL(section2, GetSOffset()).WillByDefault(Return(100.0_m));
+    ON_CALL(section2, GetLength()).WillByDefault(Return(200.0_m));
     std::vector<const OWL::Interfaces::Section*> sections{&section1, &section2};
     ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sections));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 0.0, -1, 300.0, true).at(node->roadGraphVertex);
+    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 0.0_m, -1, 300.0_m, true).at(node->roadGraphVertex);
 
     ASSERT_THAT(result, SizeIs(2));
-    EXPECT_THAT(result.at(0).startS, Eq(0));
-    EXPECT_THAT(result.at(0).endS, Eq(100));
+    EXPECT_THAT(result.at(0).startS.value(), Eq(0));
+    EXPECT_THAT(result.at(0).endS.value(), Eq(100));
     ASSERT_THAT(result.at(0).lanes, SizeIs(2));
     EXPECT_THAT(result.at(0).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result.at(0).lanes.at(0).inDrivingDirection, Eq(true));
@@ -3029,8 +3029,8 @@ TEST(GetRelativeLanes, IdOfEgoLaneChanges_ReturnsLanesWithCorrectRelativeId)
     EXPECT_THAT(result.at(0).lanes.at(1).type, Eq(LaneType::Exit));
     EXPECT_THAT(result.at(0).lanes.at(1).predecessor, Eq(std::nullopt));
     EXPECT_THAT(result.at(0).lanes.at(1).successor.value(), Eq(-1));
-    EXPECT_THAT(result.at(1).startS, Eq(100));
-    EXPECT_THAT(result.at(1).endS, Eq(300));
+    EXPECT_THAT(result.at(1).startS.value(), Eq(100));
+    EXPECT_THAT(result.at(1).endS.value(), Eq(300));
     ASSERT_THAT(result.at(1).lanes, SizeIs(3));
     EXPECT_THAT(result.at(1).lanes.at(0).relativeId, Eq(1));
     EXPECT_THAT(result.at(1).lanes.at(0).inDrivingDirection, Eq(true));
@@ -3054,9 +3054,9 @@ TEST(GetRelativeLane, BranchingTree_ReturnsLanesOfWayToNode)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node1, road1] = roadStream.AddRoot(100.0, true);
-    auto [node2, road2] = roadStream.AddRoad(150.0, true, *node1);
-    auto [node3, road3] = roadStream.AddRoad(200.0, false, *node1);
+    auto [node1, road1] = roadStream.AddRoot(100.0_m, true);
+    auto [node2, road2] = roadStream.AddRoad(150.0_m, true, *node1);
+    auto [node3, road3] = roadStream.AddRoad(200.0_m, false, *node1);
     OWL::Fakes::Lane lane1_1;
     OWL::Fakes::Lane lane1_2;
     OWL::Id idLane1_1 = 1, idLane1_2 = 2;
@@ -3072,7 +3072,7 @@ TEST(GetRelativeLane, BranchingTree_ReturnsLanesOfWayToNode)
     OWL::Fakes::Section section1;
     OWL::Interfaces::Lanes lanes1{{&lane1_1, &lane1_2}};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanes1));
-    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0_m));
     OWL::Fakes::Lane lane2_1;
     OWL::Fakes::Lane lane2_2;
     OWL::Id idLane2_1 = 3, idLane2_2 = 4;
@@ -3089,8 +3089,8 @@ TEST(GetRelativeLane, BranchingTree_ReturnsLanesOfWayToNode)
     OWL::Fakes::Section section2;
     OWL::Interfaces::Lanes lanes2{{&lane2_1, &lane2_2}};
     ON_CALL(section2, GetLanes()).WillByDefault(ReturnRef(lanes2));
-    ON_CALL(section2, GetSOffset()).WillByDefault(Return(0.0));
-    ON_CALL(section2, GetLength()).WillByDefault(Return(150.0));
+    ON_CALL(section2, GetSOffset()).WillByDefault(Return(0.0_m));
+    ON_CALL(section2, GetLength()).WillByDefault(Return(150.0_m));
     OWL::Fakes::Lane lane3_1;
     OWL::Fakes::Lane lane3_2;
     OWL::Id idLane3_1 = 5, idLane3_2 = 6;
@@ -3107,8 +3107,8 @@ TEST(GetRelativeLane, BranchingTree_ReturnsLanesOfWayToNode)
     OWL::Fakes::Section section3;
     OWL::Interfaces::Lanes lanes3{{&lane3_1, &lane3_2}};
     ON_CALL(section3, GetLanes()).WillByDefault(ReturnRef(lanes3));
-    ON_CALL(section3, GetSOffset()).WillByDefault(Return(0.0));
-    ON_CALL(section3, GetLength()).WillByDefault(Return(200.0));
+    ON_CALL(section3, GetSOffset()).WillByDefault(Return(0.0_m));
+    ON_CALL(section3, GetLength()).WillByDefault(Return(200.0_m));
     std::vector<const OWL::Interfaces::Section*> sections1{&section1};
     ON_CALL(*road1, GetSections()).WillByDefault(ReturnRef(sections1));
     std::vector<const OWL::Interfaces::Section*> sections2{&section2};
@@ -3117,13 +3117,13 @@ TEST(GetRelativeLane, BranchingTree_ReturnsLanesOfWayToNode)
     ON_CALL(*road3, GetSections()).WillByDefault(ReturnRef(sections3));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 0.0, -1, 300.0, true);
+    auto result = wdQuery.GetRelativeLanes(roadStream.Get(), 0.0_m, -1, 300.0_m, true);
     auto result2 = result.at(node2->roadGraphVertex);
     auto result3 = result.at(node3->roadGraphVertex);
 
     ASSERT_THAT(result2, SizeIs(2));
-    EXPECT_THAT(result2.at(0).startS, Eq(0));
-    EXPECT_THAT(result2.at(0).endS, Eq(100));
+    EXPECT_THAT(result2.at(0).startS.value(), Eq(0));
+    EXPECT_THAT(result2.at(0).endS.value(), Eq(100));
     ASSERT_THAT(result2.at(0).lanes, SizeIs(2));
     EXPECT_THAT(result2.at(0).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result2.at(0).lanes.at(0).inDrivingDirection, Eq(true));
@@ -3135,8 +3135,8 @@ TEST(GetRelativeLane, BranchingTree_ReturnsLanesOfWayToNode)
     EXPECT_THAT(result2.at(0).lanes.at(1).type, Eq(LaneType::Exit));
     EXPECT_THAT(result2.at(0).lanes.at(1).predecessor, Eq(std::nullopt));
     EXPECT_THAT(result2.at(0).lanes.at(1).successor.value(), Eq(-1));
-    EXPECT_THAT(result2.at(1).startS, Eq(100));
-    EXPECT_THAT(result2.at(1).endS, Eq(250));
+    EXPECT_THAT(result2.at(1).startS.value(), Eq(100));
+    EXPECT_THAT(result2.at(1).endS.value(), Eq(250));
     ASSERT_THAT(result2.at(1).lanes, SizeIs(2));
     EXPECT_THAT(result2.at(1).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result2.at(1).lanes.at(0).inDrivingDirection, Eq(true));
@@ -3150,8 +3150,8 @@ TEST(GetRelativeLane, BranchingTree_ReturnsLanesOfWayToNode)
     EXPECT_THAT(result2.at(1).lanes.at(1).successor, Eq(std::nullopt));
 
     ASSERT_THAT(result3, SizeIs(2));
-    EXPECT_THAT(result3.at(0).startS, Eq(0));
-    EXPECT_THAT(result3.at(0).endS, Eq(100));
+    EXPECT_THAT(result3.at(0).startS.value(), Eq(0));
+    EXPECT_THAT(result3.at(0).endS.value(), Eq(100));
     ASSERT_THAT(result3.at(0).lanes, SizeIs(2));
     EXPECT_THAT(result3.at(0).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result3.at(0).lanes.at(0).inDrivingDirection, Eq(true));
@@ -3163,8 +3163,8 @@ TEST(GetRelativeLane, BranchingTree_ReturnsLanesOfWayToNode)
     EXPECT_THAT(result3.at(0).lanes.at(1).type, Eq(LaneType::Exit));
     EXPECT_THAT(result3.at(0).lanes.at(1).predecessor, Eq(std::nullopt));
     EXPECT_THAT(result3.at(0).lanes.at(1).successor.value(), Eq(-1));
-    EXPECT_THAT(result3.at(1).startS, Eq(100));
-    EXPECT_THAT(result3.at(1).endS, Eq(300));
+    EXPECT_THAT(result3.at(1).startS.value(), Eq(100));
+    EXPECT_THAT(result3.at(1).endS.value(), Eq(300));
     ASSERT_THAT(result3.at(1).lanes, SizeIs(2));
     EXPECT_THAT(result3.at(1).lanes.at(0).relativeId, Eq(0));
     EXPECT_THAT(result3.at(1).lanes.at(0).inDrivingDirection, Eq(true));
@@ -3183,7 +3183,7 @@ TEST(GetRelativeLaneId, OnlySectionInDrivingDirection_ReturnsCorrectRelativeId)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, road] = roadStream.AddRoot(100.0, true);
+    auto [node, road] = roadStream.AddRoot(100.0_m, true);
     OWL::Fakes::Lane lane1;
     OWL::Fakes::Lane lane2;
     OWL::Fakes::Lane lane3;
@@ -3201,18 +3201,18 @@ TEST(GetRelativeLaneId, OnlySectionInDrivingDirection_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section;
     OWL::Interfaces::Lanes lanes{{&lane1, &lane2, &lane3}};
     ON_CALL(section, GetLanes()).WillByDefault(ReturnRef(lanes));
-    ON_CALL(section, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section, GetLength()).WillByDefault(Return(100.0_m));
     std::vector<const OWL::Interfaces::Section*> sections{&section};
     ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sections));
     std::string idRoad = "RoadA";
     ON_CALL(*road, GetId()).WillByDefault(ReturnRef(idRoad));
 
-    GlobalRoadPositions targetPosition1{{idRoad, {idRoad, 1, 15., 0, 0}}};
-    GlobalRoadPositions targetPosition2{{idRoad, {idRoad, -2, 15., 0, 0}}};
+    GlobalRoadPositions targetPosition1{{idRoad, {idRoad, 1, 15._m, 0_m, 0_rad}}};
+    GlobalRoadPositions targetPosition2{{idRoad, {idRoad, -2, 15._m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery{worldData};
-    auto result1 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0, -1, targetPosition1).at(node->roadGraphVertex);
-    auto result2 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0, -1, targetPosition2).at(node->roadGraphVertex);
+    auto result1 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0_m, -1, targetPosition1).at(node->roadGraphVertex);
+    auto result2 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0_m, -1, targetPosition2).at(node->roadGraphVertex);
 
     EXPECT_THAT(result1, Eq(1));
     EXPECT_THAT(result2, Eq(-1));
@@ -3223,7 +3223,7 @@ TEST(GetRelativeLaneId, IdOfEgoLaneChanges_ReturnsCorrectRelativeId)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, road] = roadStream.AddRoot(100.0, true);
+    auto [node, road] = roadStream.AddRoot(100.0_m, true);
     OWL::Fakes::Lane lane1_1;
     OWL::Fakes::Lane lane1_2;
     OWL::Id idLane1_1 = 1, idLane1_2 = 2;
@@ -3237,7 +3237,7 @@ TEST(GetRelativeLaneId, IdOfEgoLaneChanges_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section1;
     OWL::Interfaces::Lanes lanes1{{&lane1_1, &lane1_2}};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanes1));
-    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0_m));
     OWL::Fakes::Lane lane2_1;
     OWL::Fakes::Lane lane2_2;
     OWL::Fakes::Lane lane2_3;
@@ -3256,19 +3256,19 @@ TEST(GetRelativeLaneId, IdOfEgoLaneChanges_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section2;
     OWL::Interfaces::Lanes lanes2{{&lane2_1, &lane2_2, &lane2_3}};
     ON_CALL(section2, GetLanes()).WillByDefault(ReturnRef(lanes2));
-    ON_CALL(section2, GetSOffset()).WillByDefault(Return(100.0));
-    ON_CALL(section2, GetLength()).WillByDefault(Return(200.0));
+    ON_CALL(section2, GetSOffset()).WillByDefault(Return(100.0_m));
+    ON_CALL(section2, GetLength()).WillByDefault(Return(200.0_m));
     std::vector<const OWL::Interfaces::Section*> sections{&section1, &section2};
     ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sections));
     std::string idRoad = "RoadA";
     ON_CALL(*road, GetId()).WillByDefault(ReturnRef(idRoad));
 
-    GlobalRoadPositions targetPosition1{{idRoad, {idRoad, -1, 115., 0, 0}}};
-    GlobalRoadPositions targetPosition2{{idRoad, {idRoad, -2, 115., 0, 0}}};
+    GlobalRoadPositions targetPosition1{{idRoad, {idRoad, -1, 115._m, 0_m, 0_rad}}};
+    GlobalRoadPositions targetPosition2{{idRoad, {idRoad, -2, 115._m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery{worldData};
-    auto result1 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0, -1, targetPosition1).at(node->roadGraphVertex);
-    auto result2 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0, -1, targetPosition2).at(node->roadGraphVertex);
+    auto result1 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0_m, -1, targetPosition1).at(node->roadGraphVertex);
+    auto result2 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0_m, -1, targetPosition2).at(node->roadGraphVertex);
 
     EXPECT_THAT(result1, Eq(1));
     EXPECT_THAT(result2, Eq(0));
@@ -3279,9 +3279,9 @@ TEST(GetRelativeLaneId, BranchingTree_ReturnsCorrectRelativeId)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node1, road1] = roadStream.AddRoot(100.0, true);
-    auto [node2, road2] = roadStream.AddRoad(150.0, true, *node1);
-    auto [node3, road3] = roadStream.AddRoad(200.0, false, *node1);
+    auto [node1, road1] = roadStream.AddRoot(100.0_m, true);
+    auto [node2, road2] = roadStream.AddRoad(150.0_m, true, *node1);
+    auto [node3, road3] = roadStream.AddRoad(200.0_m, false, *node1);
     OWL::Fakes::Lane lane1_1;
     OWL::Fakes::Lane lane1_2;
     OWL::Id idLane1_1 = 1, idLane1_2 = 2;
@@ -3295,7 +3295,7 @@ TEST(GetRelativeLaneId, BranchingTree_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section1;
     OWL::Interfaces::Lanes lanes1{{&lane1_1, &lane1_2}};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanes1));
-    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0_m));
     OWL::Fakes::Lane lane2_1;
     OWL::Fakes::Lane lane2_2;
     OWL::Id idLane2_1 = 3, idLane2_2 = 4;
@@ -3310,8 +3310,8 @@ TEST(GetRelativeLaneId, BranchingTree_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section2;
     OWL::Interfaces::Lanes lanes2{{&lane2_1, &lane2_2}};
     ON_CALL(section2, GetLanes()).WillByDefault(ReturnRef(lanes2));
-    ON_CALL(section2, GetSOffset()).WillByDefault(Return(0.0));
-    ON_CALL(section2, GetLength()).WillByDefault(Return(150.0));
+    ON_CALL(section2, GetSOffset()).WillByDefault(Return(0.0_m));
+    ON_CALL(section2, GetLength()).WillByDefault(Return(150.0_m));
     OWL::Fakes::Lane lane3_1;
     OWL::Fakes::Lane lane3_2;
     OWL::Id idLane3_1 = 5, idLane3_2 = 6;
@@ -3326,8 +3326,8 @@ TEST(GetRelativeLaneId, BranchingTree_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section3;
     OWL::Interfaces::Lanes lanes3{{&lane3_1, &lane3_2}};
     ON_CALL(section3, GetLanes()).WillByDefault(ReturnRef(lanes3));
-    ON_CALL(section3, GetSOffset()).WillByDefault(Return(0.0));
-    ON_CALL(section3, GetLength()).WillByDefault(Return(200.0));
+    ON_CALL(section3, GetSOffset()).WillByDefault(Return(0.0_m));
+    ON_CALL(section3, GetLength()).WillByDefault(Return(200.0_m));
     std::vector<const OWL::Interfaces::Section*> sections1{&section1};
     ON_CALL(*road1, GetSections()).WillByDefault(ReturnRef(sections1));
     std::vector<const OWL::Interfaces::Section*> sections2{&section2};
@@ -3342,12 +3342,12 @@ TEST(GetRelativeLaneId, BranchingTree_ReturnsCorrectRelativeId)
     ON_CALL(*road2, GetId()).WillByDefault(ReturnRef(idRoad2));
     ON_CALL(*road3, GetId()).WillByDefault(ReturnRef(idRoad3));
 
-    GlobalRoadPositions targetPosition1{{idRoad2, {idRoad2, -1, 115., 0, 0}}, {idRoad3, {idRoad3, 1, 115., 0, 0}}};
-    GlobalRoadPositions targetPosition2{{idRoad2, {idRoad2, -2, 115., 0, 0}}, {idRoad3, {idRoad3, 2, 115., 0, 0}}};
+    GlobalRoadPositions targetPosition1{{idRoad2, {idRoad2, -1, 115._m, 0_m, 0_rad}}, {idRoad3, {idRoad3, 1, 115._m, 0_m, 0_rad}}};
+    GlobalRoadPositions targetPosition2{{idRoad2, {idRoad2, -2, 115._m, 0_m, 0_rad}}, {idRoad3, {idRoad3, 2, 115._m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery{worldData};
-    auto result1 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0, -1, targetPosition1).at(node3->roadGraphVertex);
-    auto result2 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0, -1, targetPosition2).at(node3->roadGraphVertex);
+    auto result1 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0_m, -1, targetPosition1).at(node3->roadGraphVertex);
+    auto result2 = wdQuery.GetRelativeLaneId(roadStream.Get(), 10.0_m, -1, targetPosition2).at(node3->roadGraphVertex);
 
     EXPECT_THAT(result1, Eq(0));
     EXPECT_THAT(result2, Eq(-1));
@@ -3358,7 +3358,7 @@ TEST(GetRelativeLaneId, TargetOnPreviousSection_ReturnsCorrectRelativeId)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node, road] = roadStream.AddRoot(100.0, true);
+    auto [node, road] = roadStream.AddRoot(100.0_m, true);
     OWL::Fakes::Lane lane1_1;
     OWL::Fakes::Lane lane1_2;
     OWL::Id idLane1_1 = 1, idLane1_2 = 2;
@@ -3372,7 +3372,7 @@ TEST(GetRelativeLaneId, TargetOnPreviousSection_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section1;
     OWL::Interfaces::Lanes lanes1{{&lane1_1, &lane1_2}};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanes1));
-    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0_m));
     OWL::Fakes::Lane lane2_1;
     OWL::Fakes::Lane lane2_2;
     OWL::Fakes::Lane lane2_3;
@@ -3391,19 +3391,19 @@ TEST(GetRelativeLaneId, TargetOnPreviousSection_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section2;
     OWL::Interfaces::Lanes lanes2{{&lane2_1, &lane2_2, &lane2_3}};
     ON_CALL(section2, GetLanes()).WillByDefault(ReturnRef(lanes2));
-    ON_CALL(section2, GetSOffset()).WillByDefault(Return(100.0));
-    ON_CALL(section2, GetLength()).WillByDefault(Return(200.0));
+    ON_CALL(section2, GetSOffset()).WillByDefault(Return(100.0_m));
+    ON_CALL(section2, GetLength()).WillByDefault(Return(200.0_m));
     std::vector<const OWL::Interfaces::Section*> sections{&section1, &section2};
     ON_CALL(*road, GetSections()).WillByDefault(ReturnRef(sections));
     std::string idRoad = "RoadA";
     ON_CALL(*road, GetId()).WillByDefault(ReturnRef(idRoad));
 
-    GlobalRoadPositions targetPosition1{{idRoad, {idRoad, -1, 15., 0, 0}}};
-    GlobalRoadPositions targetPosition2{{idRoad, {idRoad, -2, 15., 0, 0}}};
+    GlobalRoadPositions targetPosition1{{idRoad, {idRoad, -1, 15._m, 0_m, 0_rad}}};
+    GlobalRoadPositions targetPosition2{{idRoad, {idRoad, -2, 15._m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery{worldData};
-    auto result1 = wdQuery.GetRelativeLaneId(roadStream.Get(), 110.0, -2, targetPosition1).at(node->roadGraphVertex);
-    auto result2 = wdQuery.GetRelativeLaneId(roadStream.Get(), 110.0, -2, targetPosition2).at(node->roadGraphVertex);
+    auto result1 = wdQuery.GetRelativeLaneId(roadStream.Get(), 110.0_m, -2, targetPosition1).at(node->roadGraphVertex);
+    auto result2 = wdQuery.GetRelativeLaneId(roadStream.Get(), 110.0_m, -2, targetPosition2).at(node->roadGraphVertex);
 
     EXPECT_THAT(result1, Eq(0));
     EXPECT_THAT(result2, Eq(-1));
@@ -3415,8 +3415,8 @@ TEST(GetRelativeLaneId, TargetOnPreviousRoad_ReturnsCorrectRelativeId)
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
 
-    auto [node1, road1] = roadStream.AddRoot(100.0, true);
-    auto [node2, road2] = roadStream.AddRoad(150.0, true, *node1);
+    auto [node1, road1] = roadStream.AddRoot(100.0_m, true);
+    auto [node2, road2] = roadStream.AddRoad(150.0_m, true, *node1);
     OWL::Fakes::Lane lane1_1;
     OWL::Fakes::Lane lane1_2;
     OWL::Id idLane1_1 = 1, idLane1_2 = 2;
@@ -3430,7 +3430,7 @@ TEST(GetRelativeLaneId, TargetOnPreviousRoad_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section1;
     OWL::Interfaces::Lanes lanes1{{&lane1_1, &lane1_2}};
     ON_CALL(section1, GetLanes()).WillByDefault(ReturnRef(lanes1));
-    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0));
+    ON_CALL(section1, GetLength()).WillByDefault(Return(100.0_m));
     OWL::Fakes::Lane lane2_1;
     OWL::Fakes::Lane lane2_2;
     OWL::Id idLane2_1 = 3, idLane2_2 = 4;
@@ -3444,8 +3444,8 @@ TEST(GetRelativeLaneId, TargetOnPreviousRoad_ReturnsCorrectRelativeId)
     OWL::Fakes::Section section2;
     OWL::Interfaces::Lanes lanes2{{&lane2_1, &lane2_2}};
     ON_CALL(section2, GetLanes()).WillByDefault(ReturnRef(lanes2));
-    ON_CALL(section2, GetSOffset()).WillByDefault(Return(0.0));
-    ON_CALL(section2, GetLength()).WillByDefault(Return(150.0));
+    ON_CALL(section2, GetSOffset()).WillByDefault(Return(0.0_m));
+    ON_CALL(section2, GetLength()).WillByDefault(Return(150.0_m));
     std::vector<const OWL::Interfaces::Section*> sections1{&section1};
     ON_CALL(*road1, GetSections()).WillByDefault(ReturnRef(sections1));
     std::vector<const OWL::Interfaces::Section*> sections2{&section2};
@@ -3456,10 +3456,10 @@ TEST(GetRelativeLaneId, TargetOnPreviousRoad_ReturnsCorrectRelativeId)
     ON_CALL(*road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     ON_CALL(*road2, GetId()).WillByDefault(ReturnRef(idRoad2));
 
-    GlobalRoadPositions targetPosition{{idRoad1, {idRoad1, -1, 15., 0, 0}}};
+    GlobalRoadPositions targetPosition{{idRoad1, {idRoad1, -1, 15._m, 0_m, 0_rad}}};
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetRelativeLaneId(roadStream.Get(), 110.0, -2, targetPosition).at(node2->roadGraphVertex);
+    auto result = wdQuery.GetRelativeLaneId(roadStream.Get(), 110.0_m, -2, targetPosition).at(node2->roadGraphVertex);
 
     EXPECT_THAT(result, Eq(0));
 }
@@ -3468,54 +3468,54 @@ TEST(GetLaneCurvature, OnLaneStreamReturnsCorrectCurvature)
 {
     OWL::Fakes::WorldData worldData;
     FakeLaneMultiStream laneStream;
-    auto [node1, lane1] = laneStream.AddRoot(100.0, true);
-    auto [node2, lane2] = laneStream.AddLane(150.0, true, *node1);
-    auto [node3, lane3] = laneStream.AddLane(200.0, false, *node1);
+    auto [node1, lane1] = laneStream.AddRoot(100.0_m, true);
+    auto [node2, lane2] = laneStream.AddLane(150.0_m, true, *node1);
+    auto [node3, lane3] = laneStream.AddLane(200.0_m, false, *node1);
 
-    ON_CALL(*lane2, GetCurvature(DoubleEq(50.0))).WillByDefault(Return(0.1));
-    ON_CALL(*lane3, GetCurvature(DoubleEq(150.0))).WillByDefault(Return(0.2));
+    ON_CALL(*lane2, GetCurvature(50.0_m)).WillByDefault(Return(0.1_i_m));
+    ON_CALL(*lane3, GetCurvature(150.0_m)).WillByDefault(Return(0.2_i_m));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetLaneCurvature(laneStream.Get(), 150.0);
+    auto result = wdQuery.GetLaneCurvature(laneStream.Get(), 150.0_m);
 
-    EXPECT_THAT(result.at(node2->roadGraphVertex), Eq(0.1));
-    EXPECT_THAT(result.at(node3->roadGraphVertex), Eq(0.2));
+    EXPECT_THAT(result.at(node2->roadGraphVertex), Eq(0.1_i_m));
+    EXPECT_THAT(result.at(node3->roadGraphVertex), Eq(0.2_i_m));
 }
 
 TEST(GetLaneWidth, OnLaneStreamReturnsCorrectCurvature)
 {
     OWL::Fakes::WorldData worldData;
     FakeLaneMultiStream laneStream;
-    auto [node1, lane1] = laneStream.AddRoot(100.0, true);
-    auto [node2, lane2] = laneStream.AddLane(150.0, true, *node1);
-    auto [node3, lane3] = laneStream.AddLane(200.0, false, *node1);
+    auto [node1, lane1] = laneStream.AddRoot(100.0_m, true);
+    auto [node2, lane2] = laneStream.AddLane(150.0_m, true, *node1);
+    auto [node3, lane3] = laneStream.AddLane(200.0_m, false, *node1);
 
-    ON_CALL(*lane2, GetWidth(DoubleEq(50.0))).WillByDefault(Return(1.1));
-    ON_CALL(*lane3, GetWidth(DoubleEq(150.0))).WillByDefault(Return(2.2));
+    ON_CALL(*lane2, GetWidth(50.0_m)).WillByDefault(Return(1.1_m));
+    ON_CALL(*lane3, GetWidth(150.0_m)).WillByDefault(Return(2.2_m));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetLaneWidth(laneStream.Get(), 150.0);
+    auto result = wdQuery.GetLaneWidth(laneStream.Get(), 150.0_m);
 
-    EXPECT_THAT(result.at(node2->roadGraphVertex), Eq(1.1));
-    EXPECT_THAT(result.at(node3->roadGraphVertex), Eq(2.2));
+    EXPECT_THAT(result.at(node2->roadGraphVertex), Eq(1.1_m));
+    EXPECT_THAT(result.at(node3->roadGraphVertex), Eq(2.2_m));
 }
 
 TEST(GetLaneDirection, OnLaneStreamReturnsCorrectCurvature)
 {
     OWL::Fakes::WorldData worldData;
     FakeLaneMultiStream laneStream;
-    auto [node1, lane1] = laneStream.AddRoot(100.0, true);
-    auto [node2, lane2] = laneStream.AddLane(150.0, true, *node1);
-    auto [node3, lane3] = laneStream.AddLane(200.0, false, *node1);
+    auto [node1, lane1] = laneStream.AddRoot(100.0_m, true);
+    auto [node2, lane2] = laneStream.AddLane(150.0_m, true, *node1);
+    auto [node3, lane3] = laneStream.AddLane(200.0_m, false, *node1);
 
-    ON_CALL(*lane2, GetDirection(DoubleEq(50.0))).WillByDefault(Return(0.1));
-    ON_CALL(*lane3, GetDirection(DoubleEq(150.0))).WillByDefault(Return(0.2));
+    ON_CALL(*lane2, GetDirection(50.0_m)).WillByDefault(Return(0.1_rad));
+    ON_CALL(*lane3, GetDirection(150.0_m)).WillByDefault(Return(0.2_rad));
 
     WorldDataQuery wdQuery{worldData};
-    auto result = wdQuery.GetLaneDirection(laneStream.Get(), 150.0);
+    auto result = wdQuery.GetLaneDirection(laneStream.Get(), 150.0_m);
 
-    EXPECT_THAT(result.at(node2->roadGraphVertex), Eq(0.1));
-    EXPECT_THAT(result.at(node3->roadGraphVertex), Eq(0.2));
+    EXPECT_THAT(result.at(node2->roadGraphVertex), Eq(0.1_rad));
+    EXPECT_THAT(result.at(node3->roadGraphVertex), Eq(0.2_rad));
 }
 
 TEST(GetEdgeWeights, ReturnsMapWithCorrectRates)
@@ -3549,9 +3549,9 @@ TEST(ResolveRelativePoint, ObjectOnFirstRoad)
 {
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
-    auto [node1, road1] = roadStream.AddRoot(100, true);
-    auto [node2, road2] = roadStream.AddRoad(200, false, *node1);
-    auto [node3, road3] = roadStream.AddRoad(300, true, *node1);
+    auto [node1, road1] = roadStream.AddRoot(100_m, true);
+    auto [node2, road2] = roadStream.AddRoad(200_m, false, *node1);
+    auto [node3, road3] = roadStream.AddRoad(300_m, true, *node1);
     std::string idRoad1 = "Road1";
     ON_CALL(*road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     std::string idRoad2 = "Road2";
@@ -3560,10 +3560,10 @@ TEST(ResolveRelativePoint, ObjectOnFirstRoad)
     ON_CALL(*road3, GetId()).WillByDefault(ReturnRef(idRoad3));
 
     RoadInterval roadInterval{{},
-                              GlobalRoadPosition{"Road1",0,10,0,0},
-                              GlobalRoadPosition{"Road1",0,15,0,0},
-                              GlobalRoadPosition{"Road1",0,12,-1,0},
-                              GlobalRoadPosition{"Road1",0,12,2,0}};
+                              GlobalRoadPosition{"Road1",0,10_m,0_m,0_rad},
+                              GlobalRoadPosition{"Road1",0,15_m,0_m,0_rad},
+                              GlobalRoadPosition{"Road1",0,12_m,-1_m,0_rad},
+                              GlobalRoadPosition{"Road1",0,12_m,2_m,0_rad}};
     RoadIntervals touchedRoads{{"Road1", roadInterval}};
 
     WorldDataQuery wdQuery{worldData};
@@ -3572,30 +3572,30 @@ TEST(ResolveRelativePoint, ObjectOnFirstRoad)
     auto rightmost = wdQuery.ResolveRelativePoint(roadStream.Get(), ObjectPointRelative::Rightmost, touchedRoads);
     auto leftmost = wdQuery.ResolveRelativePoint(roadStream.Get(), ObjectPointRelative::Leftmost, touchedRoads);
 
-    ASSERT_THAT(rearmost.at(node1->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,10,0,0}));
-    ASSERT_THAT(rearmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,10,0,0}));
-    ASSERT_THAT(rearmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,10,0,0}));
+    ASSERT_THAT(rearmost.at(node1->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,10_m,0_m,0_rad}));
+    ASSERT_THAT(rearmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,10_m,0_m,0_rad}));
+    ASSERT_THAT(rearmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,10_m,0_m,0_rad}));
 
-    ASSERT_THAT(frontmost.at(node1->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,15,0,0}));
-    ASSERT_THAT(frontmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,15,0,0}));
-    ASSERT_THAT(frontmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,15,0,0}));
+    ASSERT_THAT(frontmost.at(node1->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,15_m,0_m,0_rad}));
+    ASSERT_THAT(frontmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,15_m,0_m,0_rad}));
+    ASSERT_THAT(frontmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,15_m,0_m,0_rad}));
 
-    ASSERT_THAT(rightmost.at(node1->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12,-1,0}));
-    ASSERT_THAT(rightmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12,-1,0}));
-    ASSERT_THAT(rightmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12,-1,0}));
+    ASSERT_THAT(rightmost.at(node1->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12_m,-1_m,0_rad}));
+    ASSERT_THAT(rightmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12_m,-1_m,0_rad}));
+    ASSERT_THAT(rightmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12_m,-1_m,0_rad}));
 
-    ASSERT_THAT(leftmost.at(node1->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12,2,0}));
-    ASSERT_THAT(leftmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12,2,0}));
-    ASSERT_THAT(leftmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12,2,0}));
+    ASSERT_THAT(leftmost.at(node1->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12_m,2_m,0_rad}));
+    ASSERT_THAT(leftmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12_m,2_m,0_rad}));
+    ASSERT_THAT(leftmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road1",0,12_m,2_m,0_rad}));
 }
 
 TEST(ResolveRelativePoint, ObjectOnSecondRoads)
 {
     OWL::Fakes::WorldData worldData;
     FakeRoadMultiStream roadStream;
-    auto [node1, road1] = roadStream.AddRoot(100, true);
-    auto [node2, road2] = roadStream.AddRoad(200, false, *node1);
-    auto [node3, road3] = roadStream.AddRoad(300, true, *node1);
+    auto [node1, road1] = roadStream.AddRoot(100_m, true);
+    auto [node2, road2] = roadStream.AddRoad(200_m, false, *node1);
+    auto [node3, road3] = roadStream.AddRoad(300_m, true, *node1);
     std::string idRoad1 = "Road1";
     ON_CALL(*road1, GetId()).WillByDefault(ReturnRef(idRoad1));
     std::string idRoad2 = "Road2";
@@ -3604,15 +3604,15 @@ TEST(ResolveRelativePoint, ObjectOnSecondRoads)
     ON_CALL(*road3, GetId()).WillByDefault(ReturnRef(idRoad3));
 
     RoadInterval roadInterval2{{},
-                              GlobalRoadPosition{"Road2",0,110,0,0},
-                              GlobalRoadPosition{"Road2",0,115,0,0},
-                              GlobalRoadPosition{"Road2",0,112,-1,0},
-                              GlobalRoadPosition{"Road2",0,112,2,0}};
+                              GlobalRoadPosition{"Road2",0,110_m, 0_m,0_rad},
+                              GlobalRoadPosition{"Road2",0,115_m, 0_m,0_rad},
+                              GlobalRoadPosition{"Road2",0,112_m,-1_m,0_rad},
+                              GlobalRoadPosition{"Road2",0,112_m, 2_m,0_rad}};
     RoadInterval roadInterval3{{},
-                              GlobalRoadPosition{"Road3",0,210,0,0},
-                              GlobalRoadPosition{"Road3",0,215,0,0},
-                              GlobalRoadPosition{"Road3",0,212,-1,0},
-                              GlobalRoadPosition{"Road3",0,212,2,0}};
+                              GlobalRoadPosition{"Road3",0,210_m, 0_m,0_rad},
+                              GlobalRoadPosition{"Road3",0,215_m, 0_m,0_rad},
+                              GlobalRoadPosition{"Road3",0,212_m,-1_m,0_rad},
+                              GlobalRoadPosition{"Road3",0,212_m, 2_m,0_rad}};
     RoadIntervals touchedRoads{{"Road2", roadInterval2}, {"Road3", roadInterval3}};
 
     WorldDataQuery wdQuery{worldData};
@@ -3622,18 +3622,18 @@ TEST(ResolveRelativePoint, ObjectOnSecondRoads)
     auto leftmost = wdQuery.ResolveRelativePoint(roadStream.Get(), ObjectPointRelative::Leftmost, touchedRoads);
 
     ASSERT_THAT(rearmost.at(node1->roadGraphVertex), std::nullopt);
-    ASSERT_THAT(rearmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road2",0,115,0,0}));
-    ASSERT_THAT(rearmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road3",0,210,0,0}));
+    ASSERT_THAT(rearmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road2",0,115_m,0_m,0_rad}));
+    ASSERT_THAT(rearmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road3",0,210_m,0_m,0_rad}));
 
     ASSERT_THAT(frontmost.at(node1->roadGraphVertex), std::nullopt);
-    ASSERT_THAT(frontmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road2",0,110,0,0}));
-    ASSERT_THAT(frontmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road3",0,215,0,0}));
+    ASSERT_THAT(frontmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road2",0,110_m,0_m,0_rad}));
+    ASSERT_THAT(frontmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road3",0,215_m,0_m,0_rad}));
 
     ASSERT_THAT(rightmost.at(node1->roadGraphVertex), std::nullopt);
-    ASSERT_THAT(rightmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road2",0,112,2,0}));
-    ASSERT_THAT(rightmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road3",0,212,-1,0}));
+    ASSERT_THAT(rightmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road2",0,112_m, 2_m,0_rad}));
+    ASSERT_THAT(rightmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road3",0,212_m,-1_m,0_rad}));
 
     ASSERT_THAT(leftmost.at(node1->roadGraphVertex), std::nullopt);
-    ASSERT_THAT(leftmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road2",0,112,-1,0}));
-    ASSERT_THAT(leftmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road3",0,212,2,0}));
+    ASSERT_THAT(leftmost.at(node2->roadGraphVertex), Eq(GlobalRoadPosition{"Road2",0,112_m,-1_m,0_rad}));
+    ASSERT_THAT(leftmost.at(node3->roadGraphVertex), Eq(GlobalRoadPosition{"Road3",0,212_m, 2_m,0_rad}));
 }
diff --git a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldToRoadCoordinateConverter_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldToRoadCoordinateConverter_Tests.cpp
index d869ca93afe1c4df6b62b580c90663f23feac906..aa139fc4a1bd9432bd0f14efbf12b03af044a056 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldToRoadCoordinateConverter_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/World_OSI/worldToRoadCoordinateConverter_Tests.cpp
@@ -27,14 +27,14 @@ struct WorldToRoadCoordinateConverterRectangular_Data
     // (see bottom of file)
 
     // data for generator
-    Common::Vector2d origin;
-    double width;
-    double length;
-    double hdg;
+    Common::Vector2d<units::length::meter_t> origin;
+    units::length::meter_t width;
+    units::length::meter_t length;
+    units::angle::radian_t hdg;
 
     // test point
-    Common::Vector2d point;
-    double pointHdg;
+    Common::Vector2d<units::length::meter_t> point;
+    units::angle::radian_t pointHdg;
 
     // expected values
     OWL::Primitive::RoadCoordinate expected;
@@ -67,15 +67,15 @@ struct WorldToRoadCoordinateConverterCurved_Data
     // (see bottom of file)
 
     // data for generator
-    Common::Vector2d origin;
-    double width;
-    double length;
-    double sDistance;
-    double radius;
+    Common::Vector2d<units::length::meter_t> origin;
+    units::length::meter_t width;
+    units::length::meter_t length;
+    units::length::meter_t sDistance;
+    units::length::meter_t radius;
 
     // test point
-    Common::Vector2d point;
-    double pointHdg;
+    Common::Vector2d<units::length::meter_t> point;
+    units::angle::radian_t pointHdg;
 
     // expected values
     OWL::Primitive::RoadCoordinate expected;
@@ -105,20 +105,20 @@ class WorldToRoadCoordinateConverterCurved_Test:
 /// \sa PointQuery
 TEST(WorldToRoadCoordinateConverter_Test, Point_IsOnlyMatchedIfInsideElement)
 {
-    Common::Vector2d origin{-5, 0};
-    double width = 5;
-    double length = 10;
-    double hdg = 0;
+    Common::Vector2d<units::length::meter_t> origin{-5_m, 0_m};
+    units::length::meter_t width = 5_m;
+    units::length::meter_t length = 10_m;
+    units::angle::radian_t hdg = 0_rad;
 
     auto laneGeometryElement = OWL::Testing::LaneGeometryElementGenerator::RectangularLaneGeometryElement(
                                    origin, width, length, hdg);
     LocalizationElement localizationElement{laneGeometryElement};
     WorldToRoadCoordinateConverter converter(localizationElement);
 
-    Common::Vector2d pointOutsideElement{1000, 1000};
+    Common::Vector2d<units::length::meter_t> pointOutsideElement{1000_m, 1000_m};
     ASSERT_THAT(converter.IsConvertible(pointOutsideElement), Eq(false));
 
-    Common::Vector2d pointWithinElement{0.1, -0.1};
+    Common::Vector2d<units::length::meter_t> pointWithinElement{0.1_m, -0.1_m};
     ASSERT_THAT(converter.IsConvertible(pointWithinElement), Eq(true));
 }
 
@@ -126,44 +126,44 @@ TEST(WorldToRoadCoordinateConverter_Test, Point_IsOnlyMatchedIfInsideElement)
 ///       geometric element fall together, and so the projection vector for t collapses
 TEST(WorldToRoadCoordinateConverter_Test, CurrentPointTrippleIsSingular_CalculatesPositiveTCoordinate)
 {
-    Common::Vector2d origin{-5, 0};
-    double width = 5;
-    double length = 10;
-    double hdg = 0;
+    Common::Vector2d<units::length::meter_t> origin{-5_m, 0_m};
+    units::length::meter_t width = 5_m;
+    units::length::meter_t length = 10_m;
+    units::angle::radian_t hdg = 0_rad;
 
     auto laneGeometryElement = OWL::Testing::LaneGeometryElementGenerator::TriangularLaneGeometryElement(
                                    origin, width, length, hdg);
     LocalizationElement localizationElement{laneGeometryElement};
     WorldToRoadCoordinateConverter converter(localizationElement);
 
-    Common::Vector2d pointWithinElement{0.0, 2.0};
-    auto roadCoordinate = converter.GetRoadCoordinate(pointWithinElement, 0.0);
+    Common::Vector2d<units::length::meter_t> pointWithinElement{0.0_m, 2.0_m};
+    auto roadCoordinate = converter.GetRoadCoordinate(pointWithinElement, 0.0_rad);
 
-    EXPECT_THAT(roadCoordinate.s,   DoubleNear(5, 1e-2));
-    EXPECT_THAT(roadCoordinate.t,   DoubleNear(2, 1e-2));
-    EXPECT_THAT(roadCoordinate.hdg, DoubleNear(0, 1e-2));
+    EXPECT_THAT(roadCoordinate.s.value(),   DoubleNear(5, 1e-2));
+    EXPECT_THAT(roadCoordinate.t.value(),   DoubleNear(2, 1e-2));
+    EXPECT_THAT(roadCoordinate.hdg.value(), DoubleNear(0, 1e-2));
 }
 
 /// \test Checks if a negative t coordinate is calculated, even if the first points of the
 ///       geometric element fall together, and so the projection vector for t collapses
 TEST(WorldToRoadCoordinateConverter_Test, CurrentPointTrippleIsSingular_CalculatesNegativeTCoordinate)
 {
-    Common::Vector2d origin{-5, 0};
-    double width = 5;
-    double length = 10;
-    double hdg = 0;
+    Common::Vector2d<units::length::meter_t> origin{-5_m, 0_m};
+    units::length::meter_t width = 5_m;
+    units::length::meter_t length = 10_m;
+    units::angle::radian_t hdg = 0_rad;
 
     auto laneGeometryElement = OWL::Testing::LaneGeometryElementGenerator::TriangularLaneGeometryElement(
                                    origin, width, length, hdg);
     LocalizationElement localizationElement{laneGeometryElement};
     WorldToRoadCoordinateConverter converter(localizationElement);
 
-    Common::Vector2d pointWithinElement{0.0, -2.0};
-    auto roadCoordinate = converter.GetRoadCoordinate(pointWithinElement, 0.0);
+    Common::Vector2d<units::length::meter_t> pointWithinElement{0.0_m, -2.0_m};
+    auto roadCoordinate = converter.GetRoadCoordinate(pointWithinElement, 0.0_rad);
 
-    EXPECT_THAT(roadCoordinate.s,   DoubleNear(5, 1e-2));
-    EXPECT_THAT(roadCoordinate.t,   DoubleNear(-2, 1e-2));
-    EXPECT_THAT(roadCoordinate.hdg, DoubleNear(0, 1e-2));
+    EXPECT_THAT(roadCoordinate.s.value(),   DoubleNear(5, 1e-2));
+    EXPECT_THAT(roadCoordinate.t.value(),   DoubleNear(-2, 1e-2));
+    EXPECT_THAT(roadCoordinate.hdg.value(), DoubleNear(0, 1e-2));
 }
 
 /// \test Checks if the road coordinates are calculated right
@@ -178,64 +178,64 @@ TEST_P(WorldToRoadCoordinateConverterRectangular_Test, PointWithinElement_Return
     WorldToRoadCoordinateConverter converter(localizationElement);
     auto roadCoordinate = converter.GetRoadCoordinate(data.point, data.pointHdg);
 
-    EXPECT_THAT(roadCoordinate.s,   DoubleNear(data.expected.s,   1e-2));
-    EXPECT_THAT(roadCoordinate.t,   DoubleNear(data.expected.t,   1e-2));
-    EXPECT_THAT(roadCoordinate.hdg, DoubleNear(data.expected.yaw, 1e-2));
+    EXPECT_THAT(roadCoordinate.s.value(),   DoubleNear(data.expected.s.value(),   1e-2));
+    EXPECT_THAT(roadCoordinate.t.value(),   DoubleNear(data.expected.t.value(),   1e-2));
+    EXPECT_THAT(roadCoordinate.hdg.value(), DoubleNear(data.expected.yaw.value(), 1e-2));
 }
 
 
 INSTANTIATE_TEST_CASE_P(sCoordinateTestSet, WorldToRoadCoordinateConverterRectangular_Test,
                         testing::Values(
-                                     /* origin width length hdg          point     pointHdg          expected      */
-                                      /*x y    /      /     /|         x       y      |         s       t      yaw */
-WorldToRoadCoordinateConverterRectangular_Data{{ -5,   0},   5,   10,   0.00, {  1.00,   0.00},  0.00, {   6.00,   0.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{ -4,   0},   5,   10,   0.00, {  1.00,   0.00},  0.00, {   5.00,   0.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{ -5,   0},   5,   10,   0.00, { -1.00,   0.00},  0.00, {   4.00,   0.00,   0.00}},
+                                                /*  origin       width length     hdg              point         pointHdg              expected              */
+                                                /*  x     y        /     /         |             x       y           |           s         t         yaw     */
+WorldToRoadCoordinateConverterRectangular_Data{{ -5_m,   0_m},   5_m,   10_m,   0.00_rad, {  1.00_m,   0.00_m},  0.00_rad, {   6.00_m,   0.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{ -4_m,   0_m},   5_m,   10_m,   0.00_rad, {  1.00_m,   0.00_m},  0.00_rad, {   5.00_m,   0.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{ -5_m,   0_m},   5_m,   10_m,   0.00_rad, { -1.00_m,   0.00_m},  0.00_rad, {   4.00_m,   0.00_m,   0.00_rad}},
 // 180°
-WorldToRoadCoordinateConverterRectangular_Data{{  5,   0},   5,   10,   M_PI, { -1.00,   0.00},  M_PI, {   6.00,   0.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{  4,   0},   5,   10,   M_PI, { -1.00,   0.00},  M_PI, {   5.00,   0.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{  5,   0},   5,   10,   M_PI, {  1.00,   0.00},  M_PI, {   4.00,   0.00,   0.00}},
+WorldToRoadCoordinateConverterRectangular_Data{{  5_m,   0_m},   5_m,   10_m,    180_deg, { -1.00_m,   0.00_m},   180_deg, {   6.00_m,   0.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{  4_m,   0_m},   5_m,   10_m,    180_deg, { -1.00_m,   0.00_m},   180_deg, {   5.00_m,   0.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{  5_m,   0_m},   5_m,   10_m,    180_deg, {  1.00_m,   0.00_m},   180_deg, {   4.00_m,   0.00_m,   0.00_rad}},
 // +/-45°
-WorldToRoadCoordinateConverterRectangular_Data{{  0,   0},   5,   10,  M_PI_4, { 1.41,   1.41},  M_PI_4, { 2.00,   0.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{  0,   0},   5,   10, -M_PI_4, { 1.41,  -1.41}, -M_PI_4, { 2.00,   0.00,   0.00}}
+WorldToRoadCoordinateConverterRectangular_Data{{  0_m,   0_m},   5_m,   10_m,     45_deg, {  1.41_m,   1.41_m},    45_deg, {   2.00_m,   0.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{  0_m,   0_m},   5_m,   10_m,    -45_deg, {  1.41_m,  -1.41_m},   -45_deg, {   2.00_m,   0.00_m,   0.00_rad}}
                         ));
 
 INSTANTIATE_TEST_CASE_P(tCoordinateTestSet, WorldToRoadCoordinateConverterRectangular_Test,
                         testing::Values(
-                            /*         origin    width length hdg          point     pointHdg          expected      */
-                            /*        x      y     |     |     |         x       y      |         s       t      yaw */
-WorldToRoadCoordinateConverterRectangular_Data{{   -5,     0},   5,   10,   0.00, {  0.00,   1.00},  0.00, {   5.00,   1.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{   -5,     0},   5,   10,   0.00, {  0.00,   0.00},  0.00, {   5.00,   0.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{   -5,     0},   5,   10,   0.00, {  0.00,  -1.00},  0.00, {   5.00,  -1.00,   0.00}},
+                                                /*  origin           width length     hdg              point         pointHdg              expected              */
+                                                /*   x         y       /     /         |             x       y           |           s         t         yaw     */
+WorldToRoadCoordinateConverterRectangular_Data{{   -5_m,     0_m},   5_m,   10_m,   0.00_rad, {  0.00_m,   1.00_m},  0.00_rad, {   5.00_m,   1.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{   -5_m,     0_m},   5_m,   10_m,   0.00_rad, {  0.00_m,   0.00_m},  0.00_rad, {   5.00_m,   0.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{   -5_m,     0_m},   5_m,   10_m,   0.00_rad, {  0.00_m,  -1.00_m},  0.00_rad, {   5.00_m,  -1.00_m,   0.00_rad}},
 // 180°
-WorldToRoadCoordinateConverterRectangular_Data{{    5,     0},   5,   10,   M_PI, {  0.00,  -1.00},  M_PI, {   5.00,   1.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{    5,     0},   5,   10,   M_PI, {  0.00,   0.00},  M_PI, {   5.00,   0.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{    5,     0},   5,   10,   M_PI, {  0.00,   1.00},  M_PI, {   5.00,  -1.00,   0.00}},
+WorldToRoadCoordinateConverterRectangular_Data{{    5_m,     0_m},   5_m,   10_m,    180_deg, {  0.00_m,  -1.00_m},   180_deg, {   5.00_m,   1.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{    5_m,     0_m},   5_m,   10_m,    180_deg, {  0.00_m,   0.00_m},   180_deg, {   5.00_m,   0.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{    5_m,     0_m},   5_m,   10_m,    180_deg, {  0.00_m,   1.00_m},   180_deg, {   5.00_m,  -1.00_m,   0.00_rad}},
 // +/-45°
-WorldToRoadCoordinateConverterRectangular_Data{{-1.41, -1.41},   5,   10,  M_PI_4, { -1.41,  1.41}, M_PI_4, {  2.00,   2.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{-1.41, -1.41},   5,   10,  M_PI_4, {  1.41, -1.41}, M_PI_4, {  2.00,  -2.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{-1.41,  1.41},   5,   10, -M_PI_4, {  1.41,  1.41}, -M_PI_4, {  2.00,   2.00,   0.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{-1.41,  1.41},   5,   10, -M_PI_4, { -1.41, -1.41}, -M_PI_4, {  2.00,  -2.00,   0.00}}
+WorldToRoadCoordinateConverterRectangular_Data{{-1.41_m, -1.41_m},   5_m,   10_m,     45_deg, { -1.41_m,  1.41_m},     45_deg, {   2.00_m,   2.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{-1.41_m, -1.41_m},   5_m,   10_m,     45_deg, {  1.41_m, -1.41_m},     45_deg, {   2.00_m,  -2.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{-1.41_m,  1.41_m},   5_m,   10_m,    -45_deg, {  1.41_m,  1.41_m},    -45_deg, {   2.00_m,   2.00_m,   0.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{-1.41_m,  1.41_m},   5_m,   10_m,    -45_deg, { -1.41_m, -1.41_m},    -45_deg, {   2.00_m,  -2.00_m,   0.00_rad}}
                         ));
 
 
 INSTANTIATE_TEST_CASE_P(yawTestSet, WorldToRoadCoordinateConverterRectangular_Test,
                         testing::Values(
-/*                                   origin   width length hdg          point     pointHdg          expected      */
-/*                                   x    y     |     |     |         x       y      |         s       t      yaw */
-WorldToRoadCoordinateConverterRectangular_Data{{ -5,   0},   5,   10,   0.00, {  0.00,   0.00},  0.10, {   5.00,   0.00,   0.10}},
-WorldToRoadCoordinateConverterRectangular_Data{{ -5,   0},   5,   10,   0.00, {  0.00,   0.00}, -0.10, {   5.00,   0.00,  -0.10}},
+/*                                                  origin       width length     hdg             point          pointHdg                 expected        */
+/*                                                  x     y        |     |         |            x        y           |            s        t          yaw */
+WorldToRoadCoordinateConverterRectangular_Data{{ -5_m,   0_m},   5_m,   10_m,   0.00_rad, {  0.00_m,   0.00_m},  0.10_rad, {   5.00_m,   0.00_m,   0.10_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{ -5_m,   0_m},   5_m,   10_m,   0.00_rad, {  0.00_m,   0.00_m}, -0.10_rad, {   5.00_m,   0.00_m,  -0.10_rad}},
 // 180°
-WorldToRoadCoordinateConverterRectangular_Data{{  5,   0},   5,   10,   M_PI, {  0.00,   0.00}, M_PI + .1, { 5.00,   0.00,   0.10}},
-WorldToRoadCoordinateConverterRectangular_Data{{  5,   0},   5,   10,   M_PI, {  0.00,   0.00}, M_PI - .1, { 5.00,   0.00,  -0.10}}
+WorldToRoadCoordinateConverterRectangular_Data{{  5_m,   0_m},   5_m,   10_m,   180_deg, {  0.00_m,   0.00_m}, 180_deg + .1_rad, { 5.00_m,   0.00_m,   0.10_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{  5_m,   0_m},   5_m,   10_m,   180_deg, {  0.00_m,   0.00_m}, 180_deg - .1_rad, { 5.00_m,   0.00_m,  -0.10_rad}}
                         ));
 
 INSTANTIATE_TEST_CASE_P(yawWithinPiTestSet, WorldToRoadCoordinateConverterRectangular_Test,
                         testing::Values(
-/*                                   origin   width length hdg         point     pointHdg              expected      */
-/*                                   x    y     |     |     |        x       y      |             s       t      yaw */
-WorldToRoadCoordinateConverterRectangular_Data{{ -5,   0},   5,   10,  0.00, {  0.00,   0.00},  M_PI + 1.0, {   5.00,   0.00,  -M_PI + 1.00}},
-WorldToRoadCoordinateConverterRectangular_Data{{ -5,   0},   5,   10,  0.00, {  0.00,   0.00}, -M_PI - 1.0, {   5.00,   0.00,  M_PI - 1.00}}
+/*                                                   origin       width length     hdg             point            pointHdg                        expected          */
+/*                                                  x     y        |     |         |            x        y             |                  s        t              yaw */
+WorldToRoadCoordinateConverterRectangular_Data{{ -5_m,   0_m},   5_m,   10_m,  0.00_deg, {  0.00_m,   0.00_m},  180_deg + 1.0_rad, {   5.00_m,   0.00_m,  -180_deg + 1.00_rad}},
+WorldToRoadCoordinateConverterRectangular_Data{{ -5_m,   0_m},   5_m,   10_m,  0.00_deg, {  0.00_m,   0.00_m}, -180_deg - 1.0_rad, {   5.00_m,   0.00_m,   180_deg - 1.00_rad}}
                         ));
 
 TEST_P(WorldToRoadCoordinateConverterCurved_Test, PointWithinElement_ReturnsExpectedRoadCoordinates)
@@ -248,20 +248,20 @@ TEST_P(WorldToRoadCoordinateConverterCurved_Test, PointWithinElement_ReturnsExpe
     WorldToRoadCoordinateConverter converter(localizationElement);
     auto roadCoordinate = converter.GetRoadCoordinate(data.point, data.pointHdg);
 
-    EXPECT_THAT(roadCoordinate.s,   DoubleNear(data.expected.s,   1e-2));
-    EXPECT_THAT(roadCoordinate.t,   DoubleNear(data.expected.t,   1e-2));
-    EXPECT_THAT(roadCoordinate.hdg, DoubleNear(data.expected.yaw, 1e-2));
+    EXPECT_THAT(roadCoordinate.s.value(),   DoubleNear(data.expected.s.value(),   1e-2));
+    EXPECT_THAT(roadCoordinate.t.value(),   DoubleNear(data.expected.t.value(),   1e-2));
+    EXPECT_THAT(roadCoordinate.hdg.value(), DoubleNear(data.expected.yaw.value(), 1e-2));
 }
 
 INSTANTIATE_TEST_CASE_P(curvedTestSet, WorldToRoadCoordinateConverterCurved_Test,
                         testing::Values(
-/*                           origin  width length sDistance radius    point     pointHdg   expected    */
-/*                             x   y    |    |      |       |      x       y       |     s     t   yaw */
-WorldToRoadCoordinateConverterCurved_Data{{ -5, 5},  4,   3,     3,  20.0, {  -5.0,       5.0}, 0.0, { 0.0, 0.0, 0.0}},
-WorldToRoadCoordinateConverterCurved_Data{{ -5, 5},  4,   3,     3,  20.0, {  -2.0112,  5.225}, 0.0, { 3.0, 0.0, 0.0}},
-WorldToRoadCoordinateConverterCurved_Data{{ -5, 5},  4,   3,     5,  20.0, {  -2.0112,  5.225}, 0.0, { 5.0, 0.0, 0.0}},
-WorldToRoadCoordinateConverterCurved_Data{{ -5, 5},  4,   3,     3,  20.0, {  -5,         3.0}, 0.0, { 0.0, -2.0, 0.0}},
-WorldToRoadCoordinateConverterCurved_Data{{ -5, 5},  4,   3,     5,  20.0, {  -2.3101, 7.2021}, 0.0, { 5.0, 2.0, 0.0}},
-WorldToRoadCoordinateConverterCurved_Data{{ -5, 5},  4,   3,     5,  20.0, {  -3.6551, 7.1011}, 0.0, { 2.5, 2.0, 0.0}},
-WorldToRoadCoordinateConverterCurved_Data{{ -5, 5},  4,   3,     5,   8.0, {  -2.0698, 5.5559}, 0.0, { 5.0, 0.0, 0.0}}
+/*                                            origin     width length  sDistance radius            point       pointHdg           expected       */
+/*                                            x    y       |     |        |       |             x        y         |         s       t       yaw */
+WorldToRoadCoordinateConverterCurved_Data{{ -5_m, 5_m},  4_m,   3_m,     3_m,  20.0_m, {     -5.0_m,    5.0_m}, 0.0_rad, { 0.0_m,  0.0_m, 0.0_rad}},
+WorldToRoadCoordinateConverterCurved_Data{{ -5_m, 5_m},  4_m,   3_m,     3_m,  20.0_m, {  -2.0112_m,  5.225_m}, 0.0_rad, { 3.0_m,  0.0_m, 0.0_rad}},
+WorldToRoadCoordinateConverterCurved_Data{{ -5_m, 5_m},  4_m,   3_m,     5_m,  20.0_m, {  -2.0112_m,  5.225_m}, 0.0_rad, { 5.0_m,  0.0_m, 0.0_rad}},
+WorldToRoadCoordinateConverterCurved_Data{{ -5_m, 5_m},  4_m,   3_m,     3_m,  20.0_m, {       -5_m,    3.0_m}, 0.0_rad, { 0.0_m, -2.0_m, 0.0_rad}},
+WorldToRoadCoordinateConverterCurved_Data{{ -5_m, 5_m},  4_m,   3_m,     5_m,  20.0_m, {  -2.3101_m, 7.2021_m}, 0.0_rad, { 5.0_m,  2.0_m, 0.0_rad}},
+WorldToRoadCoordinateConverterCurved_Data{{ -5_m, 5_m},  4_m,   3_m,     5_m,  20.0_m, {  -3.6551_m, 7.1011_m}, 0.0_rad, { 2.5_m,  2.0_m, 0.0_rad}},
+WorldToRoadCoordinateConverterCurved_Data{{ -5_m, 5_m},  4_m,   3_m,     5_m,   8.0_m, {  -2.0698_m, 5.5559_m}, 0.0_rad, { 5.0_m,  0.0_m, 0.0_rad}}
                         ));
diff --git a/sim/tests/unitTests/core/opSimulation/opSimulation_Tests.pro b/sim/tests/unitTests/core/opSimulation/opSimulation_Tests.pro
new file mode 100644
index 0000000000000000000000000000000000000000..9fb96a1fb1856fa112ac05ac2cdf84e53f52ef29
--- /dev/null
+++ b/sim/tests/unitTests/core/opSimulation/opSimulation_Tests.pro
@@ -0,0 +1,137 @@
+################################################################################
+# Copyright (c) 2017-2020 in-tech GmbH
+#               2021 ITK Engineering GmbH
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# SPDX-License-Identifier: EPL-2.0
+################################################################################
+QT += xml
+
+CONFIG += OPENPASS_GTEST \
+          OPENPASS_GTEST_DEFAULT_MAIN
+
+include(../../../testing.pri)
+
+win32:QMAKE_CXXFLAGS += -Wa,-mbig-obj
+
+UNIT_UNDER_TEST = $$OPEN_SRC/core/opSimulation
+
+INCLUDEPATH += \
+            $$OPEN_SRC/core \
+            $$OPEN_SRC/core/common/cephes \
+            $$OPEN_SRC \
+            $$OPEN_SRC/.. \
+            $$OPEN_SRC/../.. \
+            $$UNIT_UNDER_TEST \
+            $$UNIT_UNDER_TEST/framework \
+            $$UNIT_UNDER_TEST/importer \
+            $$UNIT_UNDER_TEST/modelElements \
+            $$UNIT_UNDER_TEST/modelInterface \
+            $$OPEN_PASS_SIMULATION/manipulatorInterface \
+            $$OPEN_PASS_SIMULATION/eventDetectorInterface \
+            $$OPEN_PASS_SIMULATION/spawnPointInterface
+
+DEPENDENCIES = \
+    $$OPEN_SRC/common/eventDetectorDefinitions.cpp \
+    $$OPEN_SRC/common/stochasticDefinitions.h \
+    $$OPEN_SRC/core/common/cephes/fresnl.c \
+    $$OPEN_SRC/core/common/cephes/polevl.c \
+    $$OPEN_SRC/core/common/cephes/const.c \
+    $$OPEN_SRC/core/common/log.cpp \
+    $$OPEN_SRC/common/xmlParser.cpp \
+
+AGENTSAMPLER_TESTS = \
+    $$UNIT_UNDER_TEST/framework/dynamicProfileSampler.h \
+    $$UNIT_UNDER_TEST/framework/dynamicProfileSampler.cpp \
+    $$UNIT_UNDER_TEST/framework/dynamicParametersSampler.cpp \
+    $$UNIT_UNDER_TEST/framework/dynamicAgentTypeGenerator.cpp \
+    $$UNIT_UNDER_TEST/modelElements/componentType.cpp \
+    $$UNIT_UNDER_TEST/modelElements/agentType.cpp \
+    $$UNIT_UNDER_TEST/modelElements/parameters.cpp \
+    $$UNIT_UNDER_TEST/importer/systemConfig.cpp \
+    \
+    agentSampler_Tests.cpp
+
+SYSTEMCONFIGIMPORTER_TESTS = \
+    $$UNIT_UNDER_TEST/importer/systemConfigImporter.cpp \
+    \
+    systemConfigImporter_Tests.cpp
+
+SIMULATIONCONFIGIMPORTER_TESTS = \
+    $$UNIT_UNDER_TEST/importer/simulationConfig.cpp \
+    $$UNIT_UNDER_TEST/importer/simulationConfigImporter.cpp \
+    \
+    simulationConfigImporter_Tests.cpp
+
+PROFILESIMPORTER_TESTS = \
+    $$UNIT_UNDER_TEST/importer/profiles.cpp \
+    $$UNIT_UNDER_TEST/importer/profilesImporter.cpp \
+    $$UNIT_UNDER_TEST/importer/importerCommon.cpp \
+    \
+    profilesImporter_Tests.cpp
+
+VEHICLEMODELIMPORTER_TESTS = \
+    $$UNIT_UNDER_TEST/importer/vehicleModelsImporter.cpp \
+    \
+    vehicleModelsImporter_Tests.cpp
+
+EVENTDETECTOR_TESTS = \
+    $$UNIT_UNDER_TEST/framework/eventNetwork.cpp \
+    $$UNIT_UNDER_TEST/../common/coreDataPublisher.cpp \
+    \
+    eventNetwork_Tests.cpp
+
+PARAMETERIMPORTER_TESTS = \
+    $$UNIT_UNDER_TEST/importer/parameterImporter.cpp \
+    \
+    parameterImporter_Tests.cpp
+
+SAMPLER_TESTS = \
+    $$UNIT_UNDER_TEST/framework/sampler.cpp \
+    \
+    sampler_Tests.cpp
+
+SCENERYIMPORTER_TESTS = \
+    $$UNIT_UNDER_TEST/importer/sceneryImporter.cpp \
+    $$UNIT_UNDER_TEST/importer/road.cpp \
+    $$UNIT_UNDER_TEST/importer/junction.cpp \
+    $$UNIT_UNDER_TEST/importer/connection.cpp \
+    $$UNIT_UNDER_TEST/importer/road/roadSignal.cpp \
+    $$UNIT_UNDER_TEST/importer/road/roadObject.cpp \
+    \
+    roadGeometry_Tests.cpp \
+    sceneryImporter_Tests.cpp
+
+COMMANDLINERPARSER_TESTS = \
+    $$UNIT_UNDER_TEST/framework/commandLineParser.cpp \
+    \
+    commandLineParser_Tests.cpp \
+
+DIRECTORIES_TESTS = \
+    $$UNIT_UNDER_TEST/framework/directories.cpp \
+    \
+    directories_Tests.cpp \
+
+PUBLISHER_TESTS = \
+    $$UNIT_UNDER_TEST/framework/agentDataPublisher.cpp \
+    \
+    agentDataPublisher_Tests.cpp
+
+SOURCES += \
+    $$DEPENDENCIES \
+    $$SIMULATIONCONFIGIMPORTER_TESTS \
+    $$SYSTEMCONFIGIMPORTER_TESTS \
+    $$PROFILESIMPORTER_TESTS \
+    $$EVENTDETECTOR_TESTS \
+    $$PARAMETERIMPORTER_TESTS \
+    $$SAMPLER_TESTS \
+    $$SCENERYIMPORTER_TESTS \
+    $$INVOCATIONCONTROL_TESTS \
+    $$VEHICLEMODELIMPORTER_TESTS \
+    $$DIRECTORIES_TESTS \
+    $$COMMANDLINERPARSER_TESTS \
+    $$AGENTSAMPLER_TESTS \
+    $$PUBLISHER_TESTS
diff --git a/sim/tests/unitTests/core/opSimulation/profilesImporter_Tests.cpp b/sim/tests/unitTests/core/opSimulation/profilesImporter_Tests.cpp
index 325e2ab40d2539a8f71df3337c5b1eb5b454dc12..e32a21a91ed36991eb3727cc2da24fd69a1e524a 100644
--- a/sim/tests/unitTests/core/opSimulation/profilesImporter_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/profilesImporter_Tests.cpp
@@ -21,7 +21,7 @@ using ::testing::UnorderedElementsAre;
 
 using namespace Importer;
 
-TEST(ProfilesImporter_ImportAllVehicleComponentsOfVehicleProfile, GivenValidXml_ImportsValues)
+TEST(ProfilesImporter_ImportAllVehicleComponentsOfSystemProfile, GivenValidXml_ImportsValues)
 {
     QDomElement validXml = documentRootFromString(
                 "<root>"
@@ -41,9 +41,9 @@ TEST(ProfilesImporter_ImportAllVehicleComponentsOfVehicleProfile, GivenValidXml_
                 "</root>"
                 );
 
-    VehicleProfile profiles;
+    SystemProfile profiles;
 
-    EXPECT_NO_THROW(ProfilesImporter::ImportAllVehicleComponentsOfVehicleProfile(validXml, profiles));
+    EXPECT_NO_THROW(ProfilesImporter::ImportAllVehicleComponentsOfSystemProfile(validXml, profiles));
 
     ASSERT_EQ(profiles.vehicleComponents.size(), (size_t )1);
 
@@ -53,7 +53,7 @@ TEST(ProfilesImporter_ImportAllVehicleComponentsOfVehicleProfile, GivenValidXml_
     ASSERT_EQ (resultVehicleComponent.sensorLinks.size(), (size_t) 3);
 }
 
-TEST(ProfilesImporter_ImportAllVehicleComponentsOfVehicleProfile, WithMissingComponentsTag_Throws)
+TEST(ProfilesImporter_ImportAllVehicleComponentsOfSystemProfile, WithMissingComponentsTag_Throws)
 {
     QDomElement missingComponentsTag = documentRootFromString(
                 "<root>"
@@ -71,11 +71,11 @@ TEST(ProfilesImporter_ImportAllVehicleComponentsOfVehicleProfile, WithMissingCom
                 "</root>"
                 );
 
-    VehicleProfile profiles;
-    EXPECT_THROW(ProfilesImporter::ImportAllVehicleComponentsOfVehicleProfile(missingComponentsTag, profiles), std::runtime_error);
+    SystemProfile profiles;
+    EXPECT_THROW(ProfilesImporter::ImportAllVehicleComponentsOfSystemProfile(missingComponentsTag, profiles), std::runtime_error);
 }
 
-TEST(ProfilesImporter_ImportAllVehicleComponentsOfVehicleProfile, SumOfProbabilityGreatherOne_Throws)
+TEST(ProfilesImporter_ImportAllVehicleComponentsOfSystemProfile, SumOfProbabilityGreatherOne_Throws)
 {
     QDomElement sumOfProbabilityGreatherOne = documentRootFromString(
                 "<root>"
@@ -95,69 +95,57 @@ TEST(ProfilesImporter_ImportAllVehicleComponentsOfVehicleProfile, SumOfProbabili
                 "</root>"
                 );
 
-    VehicleProfile profiles;
-    EXPECT_THROW(ProfilesImporter::ImportAllVehicleComponentsOfVehicleProfile(sumOfProbabilityGreatherOne, profiles), std::runtime_error);
+    SystemProfile profiles;
+    EXPECT_THROW(ProfilesImporter::ImportAllVehicleComponentsOfSystemProfile(sumOfProbabilityGreatherOne, profiles), std::runtime_error);
 }
 
-TEST(ProfilesImporter_ImportAllSensorsOfVehicleProfile, GivenValidXml_ImportsValues)
+TEST(ProfilesImporter_ImportAllSensorsOfSystemProfile, GivenValidXml_ImportsValues)
 {
     QDomElement validXml = documentRootFromString(
                 "<root>"
                     "<Sensors>"
-                        "<Sensor Id=\"0\">"
-                            "<Position Name=\"Somewhere\" Longitudinal=\"1.0\" Lateral=\"2.0\" Height=\"3.0\" Pitch=\"4.0\" Yaw=\"5.0\" Roll=\"6.0\"/>"
+                        "<Sensor Id=\"0\" Position=\"PositionA\">"
                             "<Profile Type=\"Geometric2D\" Name=\"Camera\"/>"
                         "</Sensor>"
-                        "<Sensor Id=\"1\">"
-                            "<Position Name=\"Somewhere\" Longitudinal=\"0.0\" Lateral=\"0.0\" Height=\"0.5\" Pitch=\"0.0\" Yaw=\"0.0\" Roll=\"0.0\"/>"
+                        "<Sensor Id=\"1\" Position=\"PositionB\">"
                             "<Profile Type=\"OtherSensor\" Name=\"Camera\"/>"
                         "</Sensor>"
                     "</Sensors>"
                 "</root>"
                 );
 
-    VehicleProfile profiles;
-    EXPECT_NO_THROW(ProfilesImporter::ImportAllSensorsOfVehicleProfile(validXml, profiles));
+    SystemProfile profiles;
+    EXPECT_NO_THROW(ProfilesImporter::ImportAllSensorsOfSystemProfile(validXml, profiles));
 
     openpass::sensors::Parameters resultSensors = profiles.sensors;
 
     ASSERT_EQ(resultSensors.size(), (size_t ) 2);
 
     openpass::sensors::Parameter resultSensorParameter = resultSensors.front();
-    openpass::sensors::Position resultSensorPosition = resultSensorParameter.position;
     openpass::sensors::Profile resultSensorProfile = resultSensorParameter.profile;
 
-    ASSERT_EQ (resultSensorPosition.name, "Somewhere");
-    ASSERT_EQ (resultSensorPosition.longitudinal, 1.0);
-    ASSERT_EQ (resultSensorPosition.lateral, 2.0);
-    ASSERT_EQ (resultSensorPosition.height, 3.0);
-    ASSERT_EQ (resultSensorPosition.pitch, 4.0);
-    ASSERT_EQ (resultSensorPosition.yaw, 5.0);
-    ASSERT_EQ (resultSensorPosition.roll, 6.0);
-
+    ASSERT_EQ (resultSensorParameter.positionName, "PositionA");
     ASSERT_EQ (resultSensorProfile.type, "Geometric2D");
     ASSERT_EQ (resultSensorProfile.name, "Camera");
 }
 
-TEST(ProfilesImporter_ImportAllSensorsOfVehicleProfile, SensorsTagMissing_Throws)
+TEST(ProfilesImporter_ImportAllSensorsOfSystemProfile, SensorsTagMissing_Throws)
 {
     QDomElement sensorsTagMissing = documentRootFromString(
                 "<root>"
-                        "<Sensor Id=\"0\">"
-                            "<Position Name=\"Somewhere\" Longitudinal=\"1.0\" Lateral=\"2.0\" Height=\"3.0\" Pitch=\"4.0\" Yaw=\"5.0\" Roll=\"6.0\"/>"
+                        "<Sensor Id=\"0\" Position=\"PositionA\">"
                             "<Profile Type=\"Geometric2D\" Name=\"Camera\"/>"
                         "</Sensor>"
-                        "<Sensor Id=\"1\">"
-                            "<Position Name=\"Somewhere\" Longitudinal=\"0.0\" Lateral=\"0.0\" Height=\"0.5\" Pitch=\"0.0\" Yaw=\"0.0\" Roll=\"0.0\"/>"
+                        "<Sensor Id=\"1\" Position=\"PositionB\">"
                             "<Profile Type=\"OtherSensor\" Name=\"Camera\"/>"
                         "</Sensor>"
                 "</root>"
                 );
-    VehicleProfile profiles;
-    EXPECT_THROW(ProfilesImporter::ImportAllSensorsOfVehicleProfile(sensorsTagMissing, profiles), std::runtime_error);
+    SystemProfile profiles;
+    EXPECT_THROW(ProfilesImporter::ImportAllSensorsOfSystemProfile(sensorsTagMissing, profiles), std::runtime_error);
 }
 
-TEST(ProfilesImporter_ImportAllSensorsOfVehicleProfile, PositionTagMissing_Throws)
+TEST(ProfilesImporter_ImportAllSensorsOfSystemProfile, PositionElementMissing_Throws)
 {
     QDomElement positionTagMissing = documentRootFromString(
                 "<root>"
@@ -168,23 +156,22 @@ TEST(ProfilesImporter_ImportAllSensorsOfVehicleProfile, PositionTagMissing_Throw
                     "</Sensors>"
                 "</root>"
                 );
-    VehicleProfile profiles;
-    EXPECT_THROW(ProfilesImporter::ImportAllSensorsOfVehicleProfile(positionTagMissing, profiles), std::runtime_error);
+    SystemProfile profiles;
+    EXPECT_THROW(ProfilesImporter::ImportAllSensorsOfSystemProfile(positionTagMissing, profiles), std::runtime_error);
 }
 
-TEST(ProfilesImporter_ImportAllSensorsOfVehicleProfile, ProfileTagMissing_Throws)
+TEST(ProfilesImporter_ImportAllSensorsOfSystemProfile, ProfileTagMissing_Throws)
 {
     QDomElement profileTagMissing = documentRootFromString(
                 "<root>"
                     "<Sensors>"
-                        "<Sensor Id=\"0\">"
-                            "<Position Name=\"Somewhere\" Longitudinal=\"1.0\" Lateral=\"2.0\" Height=\"3.0\" Pitch=\"4.0\" Yaw=\"5.0\" Roll=\"6.0\"/>"
+                        "<Sensor Id=\"0\" Position=\"PositionA\">"
                         "</Sensor>"
                     "</Sensors>"
                 "</root>"
                 );
-    VehicleProfile profiles;
-    EXPECT_THROW(ProfilesImporter::ImportAllSensorsOfVehicleProfile(profileTagMissing, profiles), std::runtime_error);
+    SystemProfile profiles;
+    EXPECT_THROW(ProfilesImporter::ImportAllSensorsOfSystemProfile(profileTagMissing, profiles), std::runtime_error);
 }
 
 TEST(ProfilesImporter_ImportAgentProfiles, MissingAtLeastOneElement_Throws)
diff --git a/sim/tests/unitTests/core/opSimulation/roadGeometry_Tests.cpp b/sim/tests/unitTests/core/opSimulation/roadGeometry_Tests.cpp
index 3da85771abcd958833e1f68b8cd0801f9feb5ad7..37444ae04e4f755c2a57c5ccbf574fc2dde4c86d 100644
--- a/sim/tests/unitTests/core/opSimulation/roadGeometry_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/roadGeometry_Tests.cpp
@@ -21,15 +21,15 @@ constexpr double MAX_GEOMETRY_ERROR = 0.001;
 
 struct GeometrySpiral_Data
 {
-    double x;              //!< geometry origin x
-    double y;              //!< geometry origin y
-    double hdg;            //!< geometry origin heading
-    double length;         //!< lenth of spiral between curvature start and end
-    double curvStart;      //!< curvature at s = 0
-    double curvEnd;        //!< curvature at s = length
+    units::length::meter_t x;              //!< geometry origin x
+    units::length::meter_t y;              //!< geometry origin y
+    units::angle::radian_t hdg;            //!< geometry origin heading
+    units::length::meter_t length;         //!< lenth of spiral between curvature start and end
+    units::curvature::inverse_meter_t curvStart;      //!< curvature at s = 0
+    units::curvature::inverse_meter_t curvEnd;        //!< curvature at s = length
 
-    double s;              //!< query s coordinate
-    double t;              //!< query t coordinate
+    units::length::meter_t s;              //!< query s coordinate
+    units::length::meter_t t;              //!< query t coordinate
 
     double expected_x;     //!< expected x coordinate for query
     double expected_y;     //!< expected y coordinate for query
@@ -65,203 +65,203 @@ TEST_P(RoadGeometries_Spiral, GetCoordAndGetDir_ReturnCorrectValues)
 {
     GeometrySpiral_Data data = GetParam();
 
-    const RoadGeometrySpiral rgs{0, data.x, data.y, data.hdg, data.length, data.curvStart, data.curvEnd};
+    const RoadGeometrySpiral rgs{0_m, data.x, data.y, data.hdg, data.length, data.curvStart, data.curvEnd};
     const auto res = rgs.GetCoord(data.s, data.t);
     const auto hdg = rgs.GetDir(data.s);
 
-    EXPECT_THAT(res.x, DoubleNear(data.expected_x, MAX_GEOMETRY_ERROR));
-    EXPECT_THAT(res.y, DoubleNear(data.expected_y, MAX_GEOMETRY_ERROR));
-    EXPECT_THAT(hdg, DoubleNear(data.expected_hdg, MAX_GEOMETRY_ERROR));
+    EXPECT_THAT(res.x.value(), DoubleNear(data.expected_x, MAX_GEOMETRY_ERROR));
+    EXPECT_THAT(res.y.value(), DoubleNear(data.expected_y, MAX_GEOMETRY_ERROR));
+    EXPECT_THAT(hdg.value(), DoubleNear(data.expected_hdg, MAX_GEOMETRY_ERROR));
 }
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndZeroTAndZeroOrigin, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.00,  0.00, 100.0,  0.0, 100.000,   0.000,  0.0000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.00,  0.01, 100.0,  0.0,  97.529,  16.371,  0.5000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.00, -0.01, 100.0,  0.0,  97.529, -16.371, -0.5000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.01,  0.00, 100.0,  0.0,  93.438,  32.391,  0.5000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0, -0.01,  0.00, 100.0,  0.0,  93.438, -32.391, -0.5000 }
+    //                   |       origin          |     spirial definition      |    query pos   |   expected result        |
+    //                   | x     y           hdg | len       c_start     c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  0.0_m,  0.0_m, 0.0_rad, 100.0_m,  0.00_i_m,  0.00_i_m, 100.0_m,  0.0_m, 100.000,   0.000,  0.0000 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, 0.0_rad, 100.0_m,  0.00_i_m,  0.01_i_m, 100.0_m,  0.0_m,  97.529,  16.371,  0.5000 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, 0.0_rad, 100.0_m,  0.00_i_m, -0.01_i_m, 100.0_m,  0.0_m,  97.529, -16.371, -0.5000 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, 0.0_rad, 100.0_m,  0.01_i_m,  0.00_i_m, 100.0_m,  0.0_m,  93.438,  32.391,  0.5000 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, 0.0_rad, 100.0_m, -0.01_i_m,  0.00_i_m, 100.0_m,  0.0_m,  93.438, -32.391, -0.5000 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndZeroTAndNonzeroOrigin, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  1.0,  1.0,         0.0, 100.0,  0.00,  0.00, 100.0,  0.0, 101.000,   1.000,  0.0000 },
-    GeometrySpiral_Data{ -1.0, -1.0,         0.0, 100.0,  0.00,  0.00, 100.0,  0.0,  99.000,  -1.000,  0.0000 },
-    GeometrySpiral_Data{ -1.0,  1.0,         0.0, 100.0,  0.00,  0.00, 100.0,  0.0,  99.000,   1.000,  0.0000 },
-    GeometrySpiral_Data{  1.0, -1.0,         0.0, 100.0,  0.00,  0.00, 100.0,  0.0, 101.000,  -1.000,  0.0000},
-
-    GeometrySpiral_Data{  1.0,  1.0,         0.0, 100.0,  0.00,  0.01, 100.0,  0.0,  98.529,  17.371,  0.5000 },
-    GeometrySpiral_Data{ -1.0, -1.0,         0.0, 100.0,  0.00,  0.01, 100.0,  0.0,  96.529,  15.371,  0.5000 },
-    GeometrySpiral_Data{ -1.0,  1.0,         0.0, 100.0,  0.00,  0.01, 100.0,  0.0,  96.529,  17.371,  0.5000 },
-    GeometrySpiral_Data{  1.0, -1.0,         0.0, 100.0,  0.00,  0.01, 100.0,  0.0,  98.529,  15.371,  0.5000 }
+    //                   |       origin          |    spirial definition     |    query pos   |   expected result        |
+    //                   | x     y           hdg | len      c_start    c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  1.0_m,  1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m, 101.000,   1.000,  0.0000 },
+    GeometrySpiral_Data{ -1.0_m, -1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m,  99.000,  -1.000,  0.0000 },
+    GeometrySpiral_Data{ -1.0_m,  1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m,  99.000,   1.000,  0.0000 },
+    GeometrySpiral_Data{  1.0_m, -1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m, 101.000,  -1.000,  0.0000},
+
+    GeometrySpiral_Data{  1.0_m,  1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m,  98.529,  17.371,  0.5000 },
+    GeometrySpiral_Data{ -1.0_m, -1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m,  96.529,  15.371,  0.5000 },
+    GeometrySpiral_Data{ -1.0_m,  1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m,  96.529,  17.371,  0.5000 },
+    GeometrySpiral_Data{  1.0_m, -1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m,  98.529,  15.371,  0.5000 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndNonzeroTAndNonzeroOrigin, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  1.0,  1.0,         0.0, 100.0,  0.00,  0.01, 100.0,  1.0,  98.049,  18.249,  0.5000 },
-    GeometrySpiral_Data{ -1.0, -1.0,         0.0, 100.0,  0.00,  0.01, 100.0,  1.0,  96.049,  16.249,  0.5000 },
-    GeometrySpiral_Data{ -1.0,  1.0,         0.0, 100.0,  0.00,  0.01, 100.0,  1.0,  96.049,  18.249,  0.5000 },
-    GeometrySpiral_Data{  1.0, -1.0,         0.0, 100.0,  0.00,  0.01, 100.0,  1.0,  98.049,  16.249,  0.5000 },
-    GeometrySpiral_Data{  1.0,  1.0,         0.0, 100.0,  0.00,  0.01, 100.0, -1.0,  99.008,  16.494,  0.5000 },
-    GeometrySpiral_Data{ -1.0, -1.0,         0.0, 100.0,  0.00,  0.01, 100.0, -1.0,  97.008,  14.494,  0.5000 },
-    GeometrySpiral_Data{ -1.0,  1.0,         0.0, 100.0,  0.00,  0.01, 100.0, -1.0,  97.008,  16.494,  0.5000 },
-    GeometrySpiral_Data{  1.0, -1.0,         0.0, 100.0,  0.00,  0.01, 100.0, -1.0,  99.008,  14.494,  0.5000 }
+    //                   |       origin          |    spirial definition     |    query pos   |   expected result        |
+    //                   | x     y           hdg | len      c_start    c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  1.0_m,  1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m,  1.0_m,  98.049,  18.249,  0.5000 },
+    GeometrySpiral_Data{ -1.0_m, -1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m,  1.0_m,  96.049,  16.249,  0.5000 },
+    GeometrySpiral_Data{ -1.0_m,  1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m,  1.0_m,  96.049,  18.249,  0.5000 },
+    GeometrySpiral_Data{  1.0_m, -1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m,  1.0_m,  98.049,  16.249,  0.5000 },
+    GeometrySpiral_Data{  1.0_m,  1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, -1.0_m,  99.008,  16.494,  0.5000 },
+    GeometrySpiral_Data{ -1.0_m, -1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, -1.0_m,  97.008,  14.494,  0.5000 },
+    GeometrySpiral_Data{ -1.0_m,  1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, -1.0_m,  97.008,  16.494,  0.5000 },
+    GeometrySpiral_Data{  1.0_m, -1.0_m, 0.0_rad, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, -1.0_m,  99.008,  14.494,  0.5000 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndZeroTAndNonzeroOriginHeading, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  0.0,  0.0,      M_PI_4, 100.0,  0.00,  0.00, 100.0,  0.0,  70.711,  70.711,  0.7854 },
-    GeometrySpiral_Data{  0.0,  0.0,  3 * M_PI_4, 100.0,  0.00,  0.00, 100.0,  0.0, -70.711,  70.711,  2.3570 },
-    GeometrySpiral_Data{  0.0,  0.0, -3 * M_PI_4, 100.0,  0.00,  0.00, 100.0,  0.0, -70.711, -70.711, -2.3570 },
-    GeometrySpiral_Data{  0.0,  0.0,  5 * M_PI_4, 100.0,  0.00,  0.00, 100.0,  0.0, -70.711, -70.711,  3.9270 },
-    GeometrySpiral_Data{  0.0,  0.0,     -M_PI_4, 100.0,  0.00,  0.00, 100.0,  0.0,  70.711, -70.711, -0.7854 },
-    GeometrySpiral_Data{  0.0,  0.0,  7 * M_PI_4, 100.0,  0.00,  0.00, 100.0,  0.0,  70.711, -70.711,  5.4978 },
-
-    GeometrySpiral_Data{  0.0,  0.0,      M_PI_4, 100.0,  0.00,  0.01, 100.0,  0.0,  57.387,  80.540,  1.2854 },
-    GeometrySpiral_Data{  0.0,  0.0,  3 * M_PI_4, 100.0,  0.00,  0.01, 100.0,  0.0, -80.540,  57.387,  2.8562 },
-    GeometrySpiral_Data{  0.0,  0.0, -3 * M_PI_4, 100.0,  0.00,  0.01, 100.0,  0.0, -57.387, -80.540, -1.8562 },
-    GeometrySpiral_Data{  0.0,  0.0,  5 * M_PI_4, 100.0,  0.00,  0.01, 100.0,  0.0, -57.387, -80.540,  4.4270 },
-    GeometrySpiral_Data{  0.0,  0.0,     -M_PI_4, 100.0,  0.00,  0.01, 100.0,  0.0,  80.540, -57.387, -0.2854 },
-    GeometrySpiral_Data{  0.0,  0.0,  7 * M_PI_4, 100.0,  0.00,  0.01, 100.0,  0.0,  80.540, -57.387,  5.9978 }
+    //                   |       origin          |    spirial definition     |    query pos   |   expected result        |
+    //                   | x     y           hdg | len      c_start    c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  0.0_m,  0.0_m,   45_deg, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m,  70.711,  70.711,  0.7854 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  135_deg, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m, -70.711,  70.711,  2.3570 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, -135_deg, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m, -70.711, -70.711, -2.3570 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  225_deg, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m, -70.711, -70.711,  3.9270 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  -45_deg, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m,  70.711, -70.711, -0.7854 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  315_deg, 100.0_m, 0.00_i_m, 0.00_i_m, 100.0_m, 0.0_m,  70.711, -70.711,  5.4978 },
+
+    GeometrySpiral_Data{  0.0_m,  0.0_m,   45_deg, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m,  57.387,  80.540,  1.2854 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  135_deg, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m, -80.540,  57.387,  2.8562 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, -135_deg, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m, -57.387, -80.540, -1.8562 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  225_deg, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m, -57.387, -80.540,  4.4270 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  -45_deg, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m,  80.540, -57.387, -0.2854 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  315_deg, 100.0_m, 0.00_i_m, 0.01_i_m, 100.0_m, 0.0_m,  80.540, -57.387,  5.9978 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndZeroTAndNonzeroOriginAndHeading, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  1.0,  1.0,      M_PI_4, 100.0,  0.00,  0.01, 100.0,  0.0,  58.387,  81.540,  1.2854 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0,  0.00,  0.01, 100.0,  0.0,  81.540, -56.387, -0.2854 },
-    GeometrySpiral_Data{ -1.0, -1.0,  3 * M_PI_4, 100.0,  0.00, -0.01, 100.0,  0.0, -58.387,  79.540,  1.8562 },
-    GeometrySpiral_Data{ -1.0,  1.0, -3 * M_PI_4, 100.0,  0.00, -0.01, 100.0,  0.0, -81.540, -56.387, -2.8562 },
-    GeometrySpiral_Data{  1.0, -1.0,  5 * M_PI_4, 100.0,  0.00, -0.01, 100.0,  0.0, -79.540, -58.387,  3.4270 }
+    //                   |       origin          |      spirial definition     |    query pos   |   expected result        |
+    //                   | x     y           hdg | len      c_start      c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  1.0_m,  1.0_m,   45_deg, 100.0_m, 0.00_i_m,  0.01_i_m, 100.0_m, 0.0_m,  58.387,  81.540,  1.2854 },
+    GeometrySpiral_Data{  1.0_m,  1.0_m,  -45_deg, 100.0_m, 0.00_i_m,  0.01_i_m, 100.0_m, 0.0_m,  81.540, -56.387, -0.2854 },
+    GeometrySpiral_Data{ -1.0_m, -1.0_m,  135_deg, 100.0_m, 0.00_i_m, -0.01_i_m, 100.0_m, 0.0_m, -58.387,  79.540,  1.8562 },
+    GeometrySpiral_Data{ -1.0_m,  1.0_m, -135_deg, 100.0_m, 0.00_i_m, -0.01_i_m, 100.0_m, 0.0_m, -81.540, -56.387, -2.8562 },
+    GeometrySpiral_Data{  1.0_m, -1.0_m,  225_deg, 100.0_m, 0.00_i_m, -0.01_i_m, 100.0_m, 0.0_m, -79.540, -58.387,  3.4270 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndZeroTWithNonzeroStartAndEndCurvature, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.01,  0.02, 100.0,  0.0,  71.564,  55.928,  1.5    },
-    GeometrySpiral_Data{  0.0,  0.0,      M_PI_4, 100.0,  0.01,  0.02, 100.0,  0.0,  11.057,  90.151,  2.2854 },
-    GeometrySpiral_Data{  0.0,  0.0,     -M_PI_4, 100.0,  0.01,  0.02, 100.0,  0.0,  90.151, -11.057,  0.7146 },
-    GeometrySpiral_Data{  0.0,  0.0,  3 * M_PI_4, 100.0,  0.01,  0.02, 100.0,  0.0, -90.151,  11.057,  3.8562 },
-    GeometrySpiral_Data{  0.0,  0.0, -3 * M_PI_4, 100.0,  0.01,  0.02, 100.0,  0.0, -11.057, -90.151, -0.8562 },
-
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0, -0.01, -0.02, 100.0,  0.0,  71.564, -55.928, -1.5    },
-    GeometrySpiral_Data{  0.0,  0.0,      M_PI_4, 100.0, -0.01, -0.02, 100.0,  0.0,  90.151,  11.057, -0.7146 },
-    GeometrySpiral_Data{  0.0,  0.0,     -M_PI_4, 100.0, -0.01, -0.02, 100.0,  0.0,  11.057, -90.151, -2.2854 },
-    GeometrySpiral_Data{  0.0,  0.0,  3 * M_PI_4, 100.0, -0.01, -0.02, 100.0,  0.0, -11.057,  90.151,  0.8562 },
-    GeometrySpiral_Data{  0.0,  0.0, -3 * M_PI_4, 100.0, -0.01, -0.02, 100.0,  0.0, -90.151, -11.057, -3.8562 },
-
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.02,  0.01, 100.0,  0.0,  60.850,  67.429,  1.5    },
-    GeometrySpiral_Data{  0.0,  0.0,      M_PI_4, 100.0,  0.02,  0.01, 100.0,  0.0,  -4.652,  90.707,  2.2854 },
-    GeometrySpiral_Data{  0.0,  0.0,     -M_PI_4, 100.0,  0.02,  0.01, 100.0,  0.0,  90.707,   4.652,  0.7146 },
-    GeometrySpiral_Data{  0.0,  0.0,  3 * M_PI_4, 100.0,  0.02,  0.01, 100.0,  0.0, -90.707,  -4.652,  3.8562 },
-    GeometrySpiral_Data{  0.0,  0.0, -3 * M_PI_4, 100.0,  0.02,  0.01, 100.0,  0.0,   4.652, -90.707, -0.8562 },
-
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0, -0.02, -0.01, 100.0,  0.0,  60.850, -67.429, -1.5    },
-    GeometrySpiral_Data{  0.0,  0.0,      M_PI_4, 100.0, -0.02, -0.01, 100.0,  0.0,  90.707,  -4.652, -0.7146 },
-    GeometrySpiral_Data{  0.0,  0.0,     -M_PI_4, 100.0, -0.02, -0.01, 100.0,  0.0,  -4.652, -90.707, -2.2854 },
-    GeometrySpiral_Data{  0.0,  0.0,  3 * M_PI_4, 100.0, -0.02, -0.01, 100.0,  0.0,   4.652,  90.707,  0.8562 },
-    GeometrySpiral_Data{  0.0,  0.0, -3 * M_PI_4, 100.0, -0.02, -0.01, 100.0,  0.0, -90.707,   4.652, -3.8562 }
+    //                   |       origin          |      spirial definition     |    query pos   |   expected result        |
+    //                   | x     y           hdg | len      c_start      c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  0.0_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m, 0.0_m,  71.564,  55.928,  1.5    },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,   45_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m, 0.0_m,  11.057,  90.151,  2.2854 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  -45_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m, 0.0_m,  90.151, -11.057,  0.7146 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  135_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m, 0.0_m, -90.151,  11.057,  3.8562 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, -135_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m, 0.0_m, -11.057, -90.151, -0.8562 },
+
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  0.0_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m, 0.0_m,  71.564, -55.928, -1.5    },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,   45_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m, 0.0_m,  90.151,  11.057, -0.7146 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  -45_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m, 0.0_m,  11.057, -90.151, -2.2854 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  135_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m, 0.0_m, -11.057,  90.151,  0.8562 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, -135_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m, 0.0_m, -90.151, -11.057, -3.8562 },
+
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  0.0_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m, 0.0_m,  60.850,  67.429,  1.5    },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,   45_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m, 0.0_m,  -4.652,  90.707,  2.2854 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  -45_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m, 0.0_m,  90.707,   4.652,  0.7146 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  135_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m, 0.0_m, -90.707,  -4.652,  3.8562 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, -135_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m, 0.0_m,   4.652, -90.707, -0.8562 },
+
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  0.0_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m, 0.0_m,  60.850, -67.429, -1.5    },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,   45_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m, 0.0_m,  90.707,  -4.652, -0.7146 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  -45_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m, 0.0_m,  -4.652, -90.707, -2.2854 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m,  135_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m, 0.0_m,   4.652,  90.707,  0.8562 },
+    GeometrySpiral_Data{  0.0_m,  0.0_m, -135_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m, 0.0_m, -90.707,   4.652, -3.8562 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndZeroTWithNonzeroStartAndEndCurvatureAndNonzeroOrigin, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0,  0.01,  0.02, 100.0,  0.0,  71.564,  56.928,  1.5    },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0,  0.01,  0.02, 100.0,  0.0,  12.057,  90.151,  2.2854 },
-    GeometrySpiral_Data{  1.0,  0.0,     -M_PI_4, 100.0,  0.01,  0.02, 100.0,  0.0,  91.151, -11.057,  0.7146 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0,  0.01,  0.02, 100.0,  0.0, -89.151,  11.057,  3.8562 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0,  0.01,  0.02, 100.0,  0.0, -11.057, -89.151, -0.8562 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0, -0.01, -0.02, 100.0,  0.0,  71.564, -54.928, -1.5    },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0, -0.01, -0.02, 100.0,  0.0,  91.151,  11.057, -0.7146 },
-    GeometrySpiral_Data{  1.0,  0.0,     -M_PI_4, 100.0, -0.01, -0.02, 100.0,  0.0,  12.057, -90.151, -2.2854 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0, -0.01, -0.02, 100.0,  0.0, -10.057,  90.151,  0.8562 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0, -0.01, -0.02, 100.0,  0.0, -90.151, -10.057, -3.8562 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0,  0.02,  0.01, 100.0,  0.0,  60.850,  68.429,  1.5    },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0,  0.02,  0.01, 100.0,  0.0,  -3.652,  90.707,  2.2854 },
-    GeometrySpiral_Data{  1.0,  0.0,     -M_PI_4, 100.0,  0.02,  0.01, 100.0,  0.0,  91.707,   4.652,  0.7146 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0,  0.02,  0.01, 100.0,  0.0, -89.707,  -4.652,  3.8562 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0,  0.02,  0.01, 100.0,  0.0,   4.652, -89.707, -0.8562 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0, -0.02, -0.01, 100.0,  0.0,  60.850, -66.429, -1.5    },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0, -0.02, -0.01, 100.0,  0.0,  91.707,  -4.652, -0.7146 },
-    GeometrySpiral_Data{  1.0,  0.0,     -M_PI_4, 100.0, -0.02, -0.01, 100.0,  0.0,  -3.652, -90.707, -2.2854 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0, -0.02, -0.01, 100.0,  0.0,   5.652,  90.707,  0.8562 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0, -0.02, -0.01, 100.0,  0.0, -90.707,   5.652, -3.8562 }
+    //                   |       origin          |      spirial definition     |    query pos   |   expected result        |
+    //                   | x     y           hdg | len      c_start      c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m,  0.0_m,  71.564,  56.928,  1.5    },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m,  0.0_m,  12.057,  90.151,  2.2854 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  -45_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m,  0.0_m,  91.151, -11.057,  0.7146 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m,  0.0_m, -89.151,  11.057,  3.8562 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m,  0.0_m, -11.057, -89.151, -0.8562 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m,  0.0_m,  71.564, -54.928, -1.5    },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m,  0.0_m,  91.151,  11.057, -0.7146 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  -45_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m,  0.0_m,  12.057, -90.151, -2.2854 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m,  0.0_m, -10.057,  90.151,  0.8562 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m,  0.0_m, -90.151, -10.057, -3.8562 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m,  0.0_m,  60.850,  68.429,  1.5    },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m,  0.0_m,  -3.652,  90.707,  2.2854 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  -45_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m,  0.0_m,  91.707,   4.652,  0.7146 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m,  0.0_m, -89.707,  -4.652,  3.8562 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m,  0.0_m,   4.652, -89.707, -0.8562 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m,  0.0_m,  60.850, -66.429, -1.5    },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m,  0.0_m,  91.707,  -4.652, -0.7146 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  -45_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m,  0.0_m,  -3.652, -90.707, -2.2854 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m,  0.0_m,   5.652,  90.707,  0.8562 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m,  0.0_m, -90.707,   5.652, -3.8562 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndNonzeroTWithNonzeroStartAndEndCurvatureAndNonzeroOrigin, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0,  0.01,  0.02, 100.0,  2.0,  69.569,  57.069,  1.5    },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0,  0.01,  0.02, 100.0, -2.0,  13.568,  91.461,  2.2854 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0,  0.01,  0.02, 100.0,  2.0,  89.840,  -8.546,  0.7146 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0,  0.01,  0.02, 100.0, -2.0, -90.461,  12.568,  3.8562 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0,  0.01,  0.02, 100.0,  2.0,  -9.546, -87.840, -0.8562 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0, -0.01, -0.02, 100.0, -2.0,  69.569, -55.069, -1.5    },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0, -0.01, -0.02, 100.0,  2.0,  92.461,  12.568, -0.7146 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0, -0.01, -0.02, 100.0, -2.0,  10.546, -87.840, -2.2854 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0, -0.01, -0.02, 100.0,  2.0, -11.568,  91.461,  0.8562 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0, -0.01, -0.02, 100.0, -2.0, -88.840,  -8.546, -3.8562 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0,  0.02,  0.01, 100.0,  2.0,  58.855,  68.570,  1.5    },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0,  0.02,  0.01, 100.0,  2.0,  -5.163,  89.396,  2.2854 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0,  0.02,  0.01, 100.0, -2.0,  93.017,   4.141,  0.7146 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0,  0.02,  0.01, 100.0, -2.0, -91.017,  -3.141,  3.8562 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0,  0.02,  0.01, 100.0, -2.0,   3.141, -91.017, -0.8562 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0, -0.02, -0.01, 100.0, -2.0,  58.855, -66.570, -1.5    },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0, -0.02, -0.01, 100.0, -2.0,  90.396,  -6.163, -0.7146 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0, -0.02, -0.01, 100.0, -2.0,  -5.163, -88.396, -2.2854 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0, -0.02, -0.01, 100.0,  2.0,   4.141,  92.017,  0.8562 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0, -0.02, -0.01, 100.0,  2.0, -92.017,   4.141, -3.8562 }
+    //                   |       origin          |      spirial definition     |    query pos   |   expected result        |
+    //                   | x     y           hdg | len      c_start      c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m,  2.0_m,  69.569,  57.069,  1.5    },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m, -2.0_m,  13.568,  91.461,  2.2854 },
+    GeometrySpiral_Data{  1.0_m, 1.0_m,  -45_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m,  2.0_m,  89.840,  -8.546,  0.7146 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m, -2.0_m, -90.461,  12.568,  3.8562 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m,  0.01_i_m,  0.02_i_m, 100.0_m,  2.0_m,  -9.546, -87.840, -0.8562 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m, -2.0_m,  69.569, -55.069, -1.5    },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m,  2.0_m,  92.461,  12.568, -0.7146 },
+    GeometrySpiral_Data{  1.0_m, 1.0_m,  -45_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m, -2.0_m,  10.546, -87.840, -2.2854 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m,  2.0_m, -11.568,  91.461,  0.8562 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m, -0.01_i_m, -0.02_i_m, 100.0_m, -2.0_m, -88.840,  -8.546, -3.8562 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m,  2.0_m,  58.855,  68.570,  1.5    },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m,  2.0_m,  -5.163,  89.396,  2.2854 },
+    GeometrySpiral_Data{  1.0_m, 1.0_m,  -45_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m, -2.0_m,  93.017,   4.141,  0.7146 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m, -2.0_m, -91.017,  -3.141,  3.8562 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m,  0.02_i_m,  0.01_i_m, 100.0_m, -2.0_m,   3.141, -91.017, -0.8562 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m, -2.0_m,  58.855, -66.570, -1.5    },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m, -2.0_m,  90.396,  -6.163, -0.7146 },
+    GeometrySpiral_Data{  1.0_m, 1.0_m,  -45_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m, -2.0_m,  -5.163, -88.396, -2.2854 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m,  2.0_m,   4.141,  92.017,  0.8562 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m, -0.02_i_m, -0.01_i_m, 100.0_m,  2.0_m, -92.017,   4.141, -3.8562 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtCenterOfGeometryAndNonzeroTWithNonzeroStartAndEndCurvatureAndNonzeroOrigin, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0,  0.01,  0.02,  50.0,  2.0,  45.942,  16.759,  0.6250 },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0,  0.01,  0.02,  50.0, -2.0,  26.291,  42.991,  1.4104 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0,  0.01,  0.02,  50.0,  2.0,  44.630, -20.343, -0.1604 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0,  0.01,  0.02,  50.0, -2.0, -41.991,  25.291,  2.9812 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0,  0.01,  0.02,  50.0,  2.0, -21.343, -42.630, -1.7312 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0, -0.01, -0.02,  50.0,  2.0,  48.283, -11.516, -0.6250 },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0, -0.01, -0.02,  50.0, -2.0,  44.630,  21.343,  0.1604 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0, -0.01, -0.02,  50.0,  2.0,  26.291, -41.991, -1.4104 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0, -0.01, -0.02,  50.0, -2.0, -20.343,  43.630,  1.7312 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0, -0.01, -0.02,  50.0,  2.0, -42.991, -24.291, -2.9812 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0,  0.02,  0.01,  50.0,  2.0,  41.880,  23.716,  0.8750 },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0,  0.02,  0.01,  50.0,  2.0,  14.551,  45.677,  1.6604 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0,  0.02,  0.01,  50.0, -2.0,  47.035, -16.535,  0.0896 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0,  0.02,  0.01,  50.0, -2.0, -45.035,  17.535,  3.2312 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0,  0.02,  0.01,  50.0, -2.0, -17.535, -45.035, -1.4812 },
-
-    GeometrySpiral_Data{  0.0,  1.0,         0.0, 100.0, -0.02, -0.01,  50.0, -2.0,  41.880, -21.716, -0.8750 },
-    GeometrySpiral_Data{  1.0,  0.0,      M_PI_4, 100.0, -0.02, -0.01,  50.0, -2.0,  46.677,  13.551, -0.0896 },
-    GeometrySpiral_Data{  1.0,  1.0,     -M_PI_4, 100.0, -0.02, -0.01,  50.0, -2.0,  14.551, -44.677, -1.6604 },
-    GeometrySpiral_Data{  1.0,  0.0,  3 * M_PI_4, 100.0, -0.02, -0.01,  50.0,  2.0, -16.535,  46.035,  1.4812 },
-    GeometrySpiral_Data{  0.0,  1.0, -3 * M_PI_4, 100.0, -0.02, -0.01,  50.0,  2.0, -46.035, -16.535, -3.2312 }
+    //                   |       origin          |      spirial definition     |    query pos   |   expected result        |
+    //                   | x     y           hdg | len      c_start      c_end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m,  0.01_i_m,  0.02_i_m,  50.0_m,  2.0_m,  45.942,  16.759,  0.6250 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m,  0.01_i_m,  0.02_i_m,  50.0_m, -2.0_m,  26.291,  42.991,  1.4104 },
+    GeometrySpiral_Data{  1.0_m, 1.0_m,  -45_deg, 100.0_m,  0.01_i_m,  0.02_i_m,  50.0_m,  2.0_m,  44.630, -20.343, -0.1604 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m,  0.01_i_m,  0.02_i_m,  50.0_m, -2.0_m, -41.991,  25.291,  2.9812 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m,  0.01_i_m,  0.02_i_m,  50.0_m,  2.0_m, -21.343, -42.630, -1.7312 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m, -0.01_i_m, -0.02_i_m,  50.0_m,  2.0_m,  48.283, -11.516, -0.6250 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m, -0.01_i_m, -0.02_i_m,  50.0_m, -2.0_m,  44.630,  21.343,  0.1604 },
+    GeometrySpiral_Data{  1.0_m, 1.0_m,  -45_deg, 100.0_m, -0.01_i_m, -0.02_i_m,  50.0_m,  2.0_m,  26.291, -41.991, -1.4104 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m, -0.01_i_m, -0.02_i_m,  50.0_m, -2.0_m, -20.343,  43.630,  1.7312 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m, -0.01_i_m, -0.02_i_m,  50.0_m,  2.0_m, -42.991, -24.291, -2.9812 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m,  0.02_i_m,  0.01_i_m,  50.0_m,  2.0_m,  41.880,  23.716,  0.8750 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m,  0.02_i_m,  0.01_i_m,  50.0_m,  2.0_m,  14.551,  45.677,  1.6604 },
+    GeometrySpiral_Data{  1.0_m, 1.0_m,  -45_deg, 100.0_m,  0.02_i_m,  0.01_i_m,  50.0_m, -2.0_m,  47.035, -16.535,  0.0896 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m,  0.02_i_m,  0.01_i_m,  50.0_m, -2.0_m, -45.035,  17.535,  3.2312 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m,  0.02_i_m,  0.01_i_m,  50.0_m, -2.0_m, -17.535, -45.035, -1.4812 },
+
+    GeometrySpiral_Data{  0.0_m, 1.0_m,  0.0_deg, 100.0_m, -0.02_i_m, -0.01_i_m,  50.0_m, -2.0_m,  41.880, -21.716, -0.8750 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,   45_deg, 100.0_m, -0.02_i_m, -0.01_i_m,  50.0_m, -2.0_m,  46.677,  13.551, -0.0896 },
+    GeometrySpiral_Data{  1.0_m, 1.0_m,  -45_deg, 100.0_m, -0.02_i_m, -0.01_i_m,  50.0_m, -2.0_m,  14.551, -44.677, -1.6604 },
+    GeometrySpiral_Data{  1.0_m, 0.0_m,  135_deg, 100.0_m, -0.02_i_m, -0.01_i_m,  50.0_m,  2.0_m, -16.535,  46.035,  1.4812 },
+    GeometrySpiral_Data{  0.0_m, 1.0_m, -135_deg, 100.0_m, -0.02_i_m, -0.01_i_m,  50.0_m,  2.0_m, -46.035, -16.535, -3.2312 }
 ));
 
 INSTANTIATE_TEST_SUITE_P(AtEndOfGeometryAndZeroTWithAlternatingCurvatureSign, RoadGeometries_Spiral, ::testing::Values(
-    //                   |       origin          | spirial definition | query pos |   expected result        |
-    //                   | x     y           hdg | len c_start  c_end |   s     t |    x        y      hdg   |
-    GeometrySpiral_Data{ -49.688, -4.148,   0.25, 100.0, -0.01,  0.01,  50.0,  0.0,   0.000,   0.000,  0.0000 },
-    GeometrySpiral_Data{ -49.688,  4.148,  -0.25, 100.0,  0.01, -0.01,  50.0,  0.0,   0.000,   0.000,  0.0000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0, -0.01,  0.01,  50.0,  0.0,  49.170,  -8.274, -0.2500 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0, -0.01,  0.01, 100.0,  0.0,  98.340, -16.548,  0.0000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.01, -0.01,  50.0,  0.0,  49.170,   8.274,  0.2500 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.01, -0.01, 100.0,  0.0,  98.340,  16.548,  0.0000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0, -0.02,  0.01, 100.0,  0.0,  86.252, -47.254, -0.5000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0, -0.02,  0.01,  50.0,  0.0,  45.747, -18.029, -0.6250 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.02, -0.01, 100.0,  0.0,  86.252,  47.254,  0.5000 },
-    GeometrySpiral_Data{  0.0,  0.0,         0.0, 100.0,  0.02, -0.01,  50.0,  0.0,  45.747,  18.029,  0.6250 }
+    //                  |           origin            |      spirial definition      |    query pos   |   expected result        |
+    //                  |      x      y           hdg | len      c_start      c _end |    s         t |    x        y      hdg   |
+    GeometrySpiral_Data{ -49.688_m,-4.148_m,  0.25_rad, 100.0_m, -0.01_i_m,  0.01_i_m,  50.0_m, 0.0_m,   0.000,   0.000,  0.0000 },
+    GeometrySpiral_Data{ -49.688_m, 4.148_m, -0.25_rad, 100.0_m,  0.01_i_m, -0.01_i_m,  50.0_m, 0.0_m,   0.000,   0.000,  0.0000 },
+    GeometrySpiral_Data{     0.0_m,   0.0_m,   0.0_deg, 100.0_m, -0.01_i_m,  0.01_i_m,  50.0_m, 0.0_m,  49.170,  -8.274, -0.2500 },
+    GeometrySpiral_Data{     0.0_m,   0.0_m,   0.0_deg, 100.0_m, -0.01_i_m,  0.01_i_m, 100.0_m, 0.0_m,  98.340, -16.548,  0.0000 },
+    GeometrySpiral_Data{     0.0_m,   0.0_m,   0.0_deg, 100.0_m,  0.01_i_m, -0.01_i_m,  50.0_m, 0.0_m,  49.170,   8.274,  0.2500 },
+    GeometrySpiral_Data{     0.0_m,   0.0_m,   0.0_deg, 100.0_m,  0.01_i_m, -0.01_i_m, 100.0_m, 0.0_m,  98.340,  16.548,  0.0000 },
+    GeometrySpiral_Data{     0.0_m,   0.0_m,   0.0_deg, 100.0_m, -0.02_i_m,  0.01_i_m, 100.0_m, 0.0_m,  86.252, -47.254, -0.5000 },
+    GeometrySpiral_Data{     0.0_m,   0.0_m,   0.0_deg, 100.0_m, -0.02_i_m,  0.01_i_m,  50.0_m, 0.0_m,  45.747, -18.029, -0.6250 },
+    GeometrySpiral_Data{     0.0_m,   0.0_m,   0.0_deg, 100.0_m,  0.02_i_m, -0.01_i_m, 100.0_m, 0.0_m,  86.252,  47.254,  0.5000 },
+    GeometrySpiral_Data{     0.0_m,   0.0_m,   0.0_deg, 100.0_m,  0.02_i_m, -0.01_i_m,  50.0_m, 0.0_m,  45.747,  18.029,  0.6250 }
 ));
diff --git a/sim/tests/unitTests/core/opSimulation/scenarioImporter_Tests.cpp b/sim/tests/unitTests/core/opSimulation/scenarioImporter_Tests.cpp
deleted file mode 100644
index 90122dc502a465d0b484bf167888e6bffefe12fe..0000000000000000000000000000000000000000
--- a/sim/tests/unitTests/core/opSimulation/scenarioImporter_Tests.cpp
+++ /dev/null
@@ -1,698 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019-2021 in-tech GmbH
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-#include "gtest/gtest.h"
-#include "gmock/gmock.h"
-
-#include "common/gtest/dontCare.h"
-#include "common/helper/importerHelper.h"
-#include "scenario.h"
-#include "scenarioImporter.h"
-#include "scenarioImporterHelper.h"
-#include "fakeScenario.h"
-
-using namespace Configuration;
-using namespace Importer;
-
-using ::testing::Eq;
-using ::testing::DoubleEq;
-using ::testing::StrEq;
-using ::testing::DontCare;
-using ::testing::ElementsAre;
-using ::testing::SizeIs;
-using ::testing::_;
-
-TEST(ScenarioImporter_UnitTests, ImportEntity)
-{
-    QDomElement entityElement = documentRootFromString(
-        "<Object name=\"Ego\">"
-          "<CatalogReference catalogName=\"ProfilesCatalog.xml\" entryName=\"EgoAgent\">"
-              "<ParameterAssignments>"
-                  "<ParameterAssignment parameterRef=\"TestParameter\" value=\"6\" />"
-              "</ParameterAssignments>"
-          "</CatalogReference>"
-        "</Object>"
-    );
-
-    ScenarioEntity scenarioEntity;
-    openScenario::Parameters parameters;
-
-    EXPECT_NO_THROW(ScenarioImporter::ImportEntity(entityElement, scenarioEntity, parameters));
-
-    ASSERT_THAT(scenarioEntity.name, Eq("Ego"));
-    ASSERT_THAT(scenarioEntity.catalogReference.catalogName, Eq("ProfilesCatalog.xml"));
-    ASSERT_THAT(scenarioEntity.catalogReference.entryName, Eq("EgoAgent"));
-    ASSERT_THAT(scenarioEntity.assignedParameters, SizeIs(1));
-    ASSERT_THAT(std::get<std::string>(scenarioEntity.assignedParameters.at("TestParameter")), Eq("6"));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportPositionElementLaneWithStochastics)
-{
-    QDomElement rootElement = documentRootFromString(
-                                      "<root>"
-                                          "<Position>"
-                                                "<LanePosition roadId=\"RoadId1\" s=\"1470.0\" laneId=\"-4\" offset=\"0.5\" > "
-                                                    "<Stochastics value=\"s\"  stdDeviation =\"5\" lowerBound = \"95\" upperBound=\"105\"/>"
-                                                    "<Stochastics value=\"offset\" stdDeviation =\"4\" lowerBound = \"44\" upperBound=\"54\"/>"
-                                                "</LanePosition>"
-                                           "</Position>"
-                                      "</root>"
-              );
-
-    openScenario::Parameters parameters;
-
-    openScenario::LanePosition lanePosition;
-    EXPECT_NO_THROW(lanePosition = std::get<openScenario::LanePosition>(openScenario::ScenarioImporterHelper::ImportPosition(rootElement, parameters)));
-
-    ASSERT_EQ(lanePosition.laneId,-4);
-
-    ASSERT_DOUBLE_EQ(lanePosition.s,1470.0);
-    ASSERT_TRUE(lanePosition.stochasticS.has_value());
-
-    const auto &stochasticS = lanePosition.stochasticS.value();
-    ASSERT_DOUBLE_EQ(stochasticS.mean,1470.0);
-    ASSERT_DOUBLE_EQ(stochasticS.lowerBoundary,95);
-    ASSERT_DOUBLE_EQ(stochasticS.upperBoundary,105);
-    ASSERT_DOUBLE_EQ(stochasticS.stdDeviation,5);
-
-    ASSERT_DOUBLE_EQ(lanePosition.offset.value(),0.5);
-    ASSERT_TRUE(lanePosition.stochasticOffset.has_value());
-
-    const auto &stochasticOffset = lanePosition.stochasticOffset.value();
-    ASSERT_DOUBLE_EQ(stochasticOffset.mean,0.5);
-    ASSERT_DOUBLE_EQ(stochasticOffset.lowerBoundary,44);
-    ASSERT_DOUBLE_EQ(stochasticOffset.upperBoundary,54);
-    ASSERT_DOUBLE_EQ(stochasticOffset.stdDeviation,4);
-}
-
-TEST(ScenarioImporter_UnitTests, ImportPositionElementLaneWithOrientation)
-{
-    QDomElement rootElement = documentRootFromString(
-                                      "<root>"
-                                          "<Position>"
-                                             "<LanePosition roadId=\"RoadId1\" s=\"1470.0\" laneId=\"-4\" offset=\"0.5\" > "
-                                                "<Orientation type=\"relative\" h=\"1.57\"/>"
-                                             "</LanePosition>"
-                                          "</Position>"
-                                      "</root>"
-              );
-
-    openScenario::Parameters parameters;
-
-    openScenario::LanePosition lanePosition;
-    EXPECT_NO_THROW(lanePosition = std::get<openScenario::LanePosition>(openScenario::ScenarioImporterHelper::ImportPosition(rootElement, parameters)));
-
-    ASSERT_DOUBLE_EQ(lanePosition.s, 1470.0);
-    ASSERT_EQ(lanePosition.laneId, -4);
-    ASSERT_DOUBLE_EQ(lanePosition.offset.value(),0.5);
-
-    ASSERT_DOUBLE_EQ(lanePosition.orientation.value().h.value(), 1.57);
-}
-
-
-TEST(ScenarioImporter_UnitTests, ImportPositionElementWorld)
-{
-    QDomElement rootElement = documentRootFromString(
-                                      "<root>"
-                                          "<Position>"
-                                                "<WorldPosition x=\"10.0\" y=\"-4.0\" h=\"0.5\" /> "
-                                          "</Position>"
-                                      "</root>"
-              );
-    QDomElement positionElement = documentRootFromString(
-              "<Position>"
-                    "<World x=\"10.0\" y=\"-4.0\" h=\"0.5\" /> "
-               "</Position>"
-              );
-
-    openScenario::Parameters parameters;
-
-    openScenario::WorldPosition worldPosition;
-    EXPECT_NO_THROW(worldPosition = std::get<openScenario::WorldPosition>(openScenario::ScenarioImporterHelper::ImportPosition(rootElement, parameters)));
-
-    ASSERT_THAT(worldPosition.x, Eq(10.0));
-    ASSERT_THAT(worldPosition.y, Eq(-4));
-    ASSERT_THAT(worldPosition.h.has_value(), Eq(true));
-    ASSERT_THAT(worldPosition.h.value(), Eq(0.5));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportPositionElementRelativeWorldPosition)
-{
-    QDomElement rootElement = documentRootFromString(
-        R"(<root><Position><RelativeWorldPosition dx="10.0" dy="-4.0" entityRef="ref"><Orientation type="relative" h="1.57"></RelativeWorldPosition></Position></root>)");
-
-    openScenario::Parameters parameters;
-
-    openScenario::RelativeWorldPosition relativeWorldPosition;
-    EXPECT_NO_THROW(relativeWorldPosition = std::get<openScenario::RelativeWorldPosition>(openScenario::ScenarioImporterHelper::ImportPosition(rootElement, parameters)));
-    ASSERT_EQ(relativeWorldPosition.entityRef, "ref");
-    ASSERT_EQ(relativeWorldPosition.dx, 10.0);
-    ASSERT_EQ(relativeWorldPosition.dy, -4);
-    ASSERT_FALSE(relativeWorldPosition.dz.has_value());
-    ASSERT_TRUE(relativeWorldPosition.orientation.has_value());
-}
-
-TEST(ScenarioImporter_UnitTests, ImportPositionElementRelativeObjectPosition)
-{
-    QDomElement rootElement = documentRootFromString(
-        R"(<root><Position><RelativeObjectPosition dx="10.0" dy="-4.0" entityRef="ref"><Orientation type="relative" h="1.57"></RelativeObjectPosition></Position></root>)");
-
-    openScenario::Parameters parameters;
-
-    openScenario::RelativeObjectPosition relativeObjectPosition;
-    EXPECT_NO_THROW(relativeObjectPosition = std::get<openScenario::RelativeObjectPosition>(openScenario::ScenarioImporterHelper::ImportPosition(rootElement, parameters)));
-    ASSERT_EQ(relativeObjectPosition.entityRef, "ref");
-    ASSERT_EQ(relativeObjectPosition.dx, 10.0);
-    ASSERT_EQ(relativeObjectPosition.dy, -4);
-    ASSERT_FALSE(relativeObjectPosition.dz.has_value());
-    ASSERT_TRUE(relativeObjectPosition.orientation.has_value());
-}
-
-TEST(ScenarioImporter_UnitTests, ImportSpeedAction)
-{
-    QDomElement rootElement = documentRootFromString(
-                                "<root>"
-                                        "<LongitudinalAction>"
-                                            "<SpeedAction>"
-                                                "<SpeedActionDynamics value=\"10.0\" dynamicsDimension=\"rate\" dynamicsShape=\"linear\" />"
-                                                "<SpeedActionTarget>"
-                                                    "<AbsoluteTargetSpeed value=\"27.7\" />"
-                                                "</SpeedActionTarget>"
-                                            "</SpeedAction>"
-                                        "</Longitudinal>"
-                                "</root>"
-    );
-
-    openScenario::Parameters parameters;
-
-    openScenario::Action action;
-    EXPECT_NO_THROW(action = openScenario::ScenarioImporterHelper::ImportPrivateAction(rootElement, parameters));
-    openScenario::SpeedAction speedAction;
-    EXPECT_NO_THROW(speedAction = std::get<openScenario::SpeedAction>(std::get<openScenario::LongitudinalAction>(std::get<openScenario::PrivateAction>(action))));
-
-    ASSERT_THAT(speedAction.stochasticValue.has_value(), Eq(false));
-    ASSERT_THAT(std::get<openScenario::AbsoluteTargetSpeed>(speedAction.target).value, DoubleEq(27.7));
-
-    ASSERT_THAT(speedAction.stochasticDynamics.has_value(), Eq(false));
-    ASSERT_THAT(speedAction.transitionDynamics.value, DoubleEq(10.0));
-    ASSERT_THAT(speedAction.transitionDynamics.shape, Eq(openScenario::Shape::Linear));
-    ASSERT_THAT(speedAction.transitionDynamics.dimension, Eq("rate"));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportLongitudinalActionWithStochastics)
-{
-    QDomElement rootElement = documentRootFromString(
-                                "<root>"
-                                        "<LongitudinalAction>"
-                                            "<SpeedAction>"
-                                                "<SpeedActionDynamics value=\"10.0\" dynamicsDimension=\"rate\" dynamicsShape=\"linear\" />"
-                                                "<SpeedActionTarget>"
-                                                    "<AbsoluteTargetSpeed value=\"27.7\" />"
-                                                "</SpeedActionTarget>"
-                                                "<Stochastics value=\"velocity\"  stdDeviation =\"3\" lowerBound = \"12\" upperBound=\"40.0\"/>"
-                                                "<Stochastics value=\"rate\" stdDeviation =\"4\" lowerBound = \"0\" upperBound=\"4\"/>"
-                                            "</SpeedAction>"
-                                        "</Longitudinal>"
-                                "</root>"
-    );
-
-    openScenario::Parameters parameters;
-
-    openScenario::Action action;
-    EXPECT_NO_THROW(action = openScenario::ScenarioImporterHelper::ImportPrivateAction(rootElement, parameters));
-    openScenario::SpeedAction speedAction;
-    EXPECT_NO_THROW(speedAction = std::get<openScenario::SpeedAction>(std::get<openScenario::LongitudinalAction>(std::get<openScenario::PrivateAction>(action))));
-
-    ASSERT_THAT(speedAction.stochasticValue.has_value(), Eq(true));
-    const auto& velocityAttribute = speedAction.stochasticValue.value();
-    ASSERT_DOUBLE_EQ(velocityAttribute.mean, 27.7);
-    ASSERT_DOUBLE_EQ(velocityAttribute.stdDeviation, 3.0);
-    ASSERT_DOUBLE_EQ(velocityAttribute.lowerBoundary, 12.0);
-    ASSERT_DOUBLE_EQ(velocityAttribute.upperBoundary, 40.0);
-
-    ASSERT_THAT(speedAction.stochasticDynamics.has_value(), Eq(true));
-    const auto& rateAttribute = speedAction.stochasticDynamics.value();
-    ASSERT_DOUBLE_EQ(rateAttribute.mean, 10.0);
-    ASSERT_DOUBLE_EQ(rateAttribute.stdDeviation, 4.0);
-    ASSERT_DOUBLE_EQ(rateAttribute.lowerBoundary, 0.0);
-    ASSERT_DOUBLE_EQ(rateAttribute.upperBoundary, 4.0);
-
-}
-
-TEST(ScenarioImporter_UnitTests, ImportLongitudinalWithParameterDeclaration)
-{
-    QDomElement rootElement = documentRootFromString(
-                                "<root>"
-                                        "<LongitudinalAction>"
-                                            "<SpeedAction>"
-                                                "<SpeedActionDynamics value=\"$Rate\" dynamicsDimension=\"rate\" dynamicsShape=\"linear\" />"
-                                                "<SpeedActionTarget>"
-                                                    "<AbsoluteTargetSpeed value=\"$Velocity\" />"
-                                                "</SpeedActionTarget>"
-                                            "</SpeedAction>"
-                                        "</Longitudinal>"
-                                "</root>"
-    );
-
-    openScenario::Parameters parameters{{"Rate", 10.0}, {"Velocity", 27.7}};
-
-    EXPECT_NO_THROW(openScenario::ScenarioImporterHelper::ImportPrivateAction(rootElement, parameters));
-
-    openScenario::Action action;
-    EXPECT_NO_THROW(action = openScenario::ScenarioImporterHelper::ImportPrivateAction(rootElement, parameters));
-    openScenario::SpeedAction speedAction;
-    EXPECT_NO_THROW(speedAction = std::get<openScenario::SpeedAction>(std::get<openScenario::LongitudinalAction>(std::get<openScenario::PrivateAction>(action))));
-
-    ASSERT_THAT(speedAction.stochasticValue.has_value(), Eq(false));
-    ASSERT_THAT(std::get<openScenario::AbsoluteTargetSpeed>(speedAction.target).value, DoubleEq(27.7));
-
-    ASSERT_THAT(speedAction.stochasticDynamics.has_value(), Eq(false));
-    ASSERT_THAT(speedAction.transitionDynamics.value, DoubleEq(10.0));
-    ASSERT_THAT(speedAction.transitionDynamics.shape, Eq(openScenario::Shape::Linear));
-    ASSERT_THAT(speedAction.transitionDynamics.dimension, Eq("rate"));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportAssignRoutingAction)
-{
-    QDomElement rootElement = documentRootFromString(
-                                     "<root>"
-                                          "<RoutingAction>"
-                                                "<AssignRouteAction>"
-                                                    "<Route>"
-                                                        "<Waypoint>"
-                                                            "<Position>"
-                                                                "<RoadPosition roadId=\"RoadId1\" s=\"0\" t=\"-1.0\" />"
-                                                            "</Position>"
-                                                        "</Waypoint>"
-                                                        "<Waypoint>"
-                                                            "<Position>"
-                                                                "<RoadPosition roadId=\"RoadId2\" s=\"0\" t=\"1.0\" />"
-                                                            "</Position>"
-                                                        "</Waypoint>"
-                                                        "<Waypoint>"
-                                                            "<Position>"
-                                                                "<RoadPosition roadId=\"RoadId3\" s=\"0\" t=\"-1.0\" />"
-                                                            "</Position>"
-                                                        "</Waypoint>"
-                                                   "</Route>"
-                                                "</AssignRouteAction>"
-                                           "</RoutingAction>"
-                                     "</root>"
-              );
-
-    openScenario::Parameters parameters;
-
-    EXPECT_NO_THROW(openScenario::ScenarioImporterHelper::ImportPrivateAction(rootElement, parameters));
-
-    openScenario::Action action;
-    EXPECT_NO_THROW(action = openScenario::ScenarioImporterHelper::ImportPrivateAction(rootElement, parameters));
-    openScenario::AssignRouteAction assignRouteAction;
-    EXPECT_NO_THROW(assignRouteAction = std::get<openScenario::AssignRouteAction>(std::get<openScenario::RoutingAction>(std::get<openScenario::PrivateAction>(action))));
-
-    ASSERT_THAT(assignRouteAction, SizeIs(3));
-    ASSERT_THAT(assignRouteAction[0].roadId, Eq("RoadId1"));
-    ASSERT_THAT(assignRouteAction[0].t, DoubleEq(-1));
-    ASSERT_THAT(assignRouteAction[1].roadId, Eq("RoadId2"));
-    ASSERT_THAT(assignRouteAction[1].t, DoubleEq(1));
-    ASSERT_THAT(assignRouteAction[2].roadId, Eq("RoadId3"));
-    ASSERT_THAT(assignRouteAction[2].t, DoubleEq(-1));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportAcquirePositionAction)
-{
-    QDomElement rootElement = documentRootFromString(
-        R"(<root><RoutingAction><AcquirePositionAction><Position><WorldPosition x="76.17" y="5.625" z="0" h="0.0" p="0" r="0"/></Position></AcquirePositionAction></RoutingAction></root>)");
-
-    openScenario::Parameters parameters;
-
-    openScenario::Action action;
-    EXPECT_NO_THROW(action = openScenario::ScenarioImporterHelper::ImportPrivateAction(rootElement, parameters));
-    EXPECT_NO_THROW(
-        std::get<openScenario::AcquirePositionAction>(
-            std::get<openScenario::RoutingAction>(
-                std::get<openScenario::PrivateAction>(action))));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportVehicleCatalog_ReturnsSuccess)
-{
-    std::string catalogPath{};
-
-    QDomElement catalogsElement = documentRootFromString(
-              "<Catalogs>"
-                    "<VehicleCatalog name=\"vcat\">"
-                        "<Directory path=\"vpath\"/>"
-                    "</VehicleCatalog>"
-                    "<PedestrianCatalog name=\"pcat\">"
-                        "<Directory path=\"ppath\"/>"
-                    "</PedestrianCatalog>"
-              "</Catalogs>"
-              );
-
-    openScenario::Parameters parameters;
-
-    ASSERT_NO_THROW(catalogPath = ScenarioImporter::ImportCatalog("VehicleCatalog", catalogsElement, parameters));
-    EXPECT_THAT(catalogPath, StrEq("vpath"));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportPedestrianCatalog_ReturnsSuccess)
-{
-    std::string catalogPath{};
-
-    QDomElement catalogsElement = documentRootFromString(
-              "<Catalogs>"
-                    "<VehicleCatalog name=\"vcat\">"
-                        "<Directory path=\"vpath\"/>"
-                    "</VehicleCatalog>"
-                    "<PedestrianCatalog name=\"pcat\">"
-                        "<Directory path=\"ppath\"/>"
-                    "</PedestrianCatalog>"
-              "</Catalogs>"
-              );
-
-    openScenario::Parameters parameters;
-
-    ASSERT_NO_THROW(catalogPath = ScenarioImporter::ImportCatalog("PedestrianCatalog", catalogsElement, parameters));
-    EXPECT_THAT(catalogPath, StrEq("ppath"));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportStoryboardWithoutEndCondition_Throws)
-{
-    QDomElement storyboardRootElement = documentRootFromString(
-                "<root>"
-                "	<Storyboard>"
-                "		<Init>"
-                "			<Actions>"
-                "			</Actions>"
-                "		</Init>"
-                "	</Storyboard>"
-                "</root>"
-    );
-    std::vector<ScenarioEntity> entities;
-    FakeScenario mockScenario;
-    openScenario::Parameters parameters;
-
-    EXPECT_THROW(ScenarioImporter::ImportStoryboard(storyboardRootElement, entities, &mockScenario, parameters), std::runtime_error);
-}
-
-TEST(ScenarioImporter_UnitTests, ImportStoryboardWithEndCondition_SetsScenarioEndTime)
-{
-    QDomElement storyboardRootElement = documentRootFromString(
-                "<root>"
-                "	<Storyboard>"
-                "		<Init>"
-                "			<Actions>"
-                "			</Actions>"
-                "		</Init>"
-                "		<StopTrigger>"
-                "			<ConditionGroup>"
-                "				<Condition name=\"TestCondition\" delay=\"0.0\" conditionEdge=\"rising\">"
-                "					<ByValueCondition>"
-                "						<SimulationTimeCondition value=\"3.000\" rule=\"greaterThan\" />"
-                "					</ByValueCondition>"
-                "				</Condition>"
-                "			</ConditionGroup>"
-                "		</StopTrigger>"
-                "	</Storyboard>"
-                "</root>"
-    );
-    std::vector<ScenarioEntity> entities;
-    FakeScenario mockScenario;
-    EXPECT_CALL(mockScenario, SetEndTime(3.000)).Times(1);
-    openScenario::Parameters parameters;
-
-    EXPECT_NO_THROW(ScenarioImporter::ImportStoryboard(storyboardRootElement, entities, &mockScenario, parameters));
-}
-
-TEST(ScenarioImporter_UnitTests, ImportStoryboardWithInvalidEndCondition_Throws)
-{
-    QDomElement storyboardRootElementConditionMissingName = documentRootFromString(
-                "<root>"
-                "	<Storyboard>"
-                "		<Init>"
-                "			<Actions>"
-                "			</Actions>"
-                "		</Init>"
-                "		<StopTrigger>"
-                "			<ConditionGroup>"
-                "				<Condition delay=\"0.0\" edge=\"conditionEdge\">"
-                "					<ByValueCondition>"
-                "						<SimulationTimeCondition value=\"3.000\" rule=\"greaterThan\" />"
-                "					</ByValueCondition>"
-                "				</Condition>"
-                "			</ConditionGroup>"
-                "		</StopTrigger>"
-                "	</Storyboard>"
-                "</root>"
-    );
-
-    QDomElement storyboardRootElementConditionMissingDelay = documentRootFromString(
-                "<root>"
-                "	<Storyboard>"
-                "		<Init>"
-                "			<Actions>"
-                "			</Actions>"
-                "		</Init>"
-                "		<StopTrigger>"
-                "			<ConditionGroup>"
-                "				<Condition name=\"\" edge=\"rising\">"
-                "					<ByValueCondition>"
-                "						<SimulationTimeCondition value=\"3.000\" rule=\"greaterThan\" />"
-                "					</ByValueCondition>"
-                "				</Condition>"
-                "			</ConditionGroup>"
-                "		</StopTrigger>"
-                "	</Storyboard>"
-                "</root>"
-    );
-
-    QDomElement storyboardRootElementConditionMissingEdge = documentRootFromString(
-                "<root>"
-                "	<Storyboard>"
-                "		<Init>"
-                "			<Actions>"
-                "			</Actions>"
-                "		</Init>"
-                "		<StopTrigger>"
-                "			<ConditionGroup>"
-                "				<Condition name=\"\" delay=\"0.0\">"
-                "					<ByValueCondition>"
-                "						<SimulationTimeCondition value=\"3.000\" rule=\"greaterThan\" />"
-                "					</ByValueCondition>"
-                "				</Condition>"
-                "			</ConditionGroup>"
-                "		</StopTrigger>"
-                "	</Storyboard>"
-                "</root>"
-    );
-
-    QDomElement storyboardRootElementConditionDelayNegative = documentRootFromString(
-                "<root>"
-                "	<Storyboard>"
-                "		<Init>"
-                "			<Actions>"
-                "			</Actions>"
-                "		</Init>"
-                "		<StopTrigger>"
-                "			<ConditionGroup>"
-                "				<Condition name=\"\" delay=\"-1.0\" edge=\"rising\">"
-                "					<ByValueCondition>"
-                "						<SimulationTimeCondition value=\"3.000\" rule=\"greaterThan\" />"
-                "					</ByValueCondition>"
-                "				</Condition>"
-                "			</ConditionGroup>"
-                "		</StopTrigger>"
-                "	</Storyboard>"
-                "</root>"
-    );
-
-    std::vector<ScenarioEntity> entities;
-    FakeScenario mockScenario;
-    openScenario::Parameters parameters;
-
-    EXPECT_THROW(ScenarioImporter::ImportStoryboard(storyboardRootElementConditionMissingName, entities, &mockScenario, parameters), std::runtime_error);
-    EXPECT_THROW(ScenarioImporter::ImportStoryboard(storyboardRootElementConditionMissingDelay, entities, &mockScenario, parameters), std::runtime_error);
-    EXPECT_THROW(ScenarioImporter::ImportStoryboard(storyboardRootElementConditionMissingEdge, entities, &mockScenario, parameters), std::runtime_error);
-    EXPECT_THROW(ScenarioImporter::ImportStoryboard(storyboardRootElementConditionDelayNegative, entities, &mockScenario, parameters), std::runtime_error);
-}
-
-TEST(ScenarioImporter_UnitTests, ImportParameterDeclarationElement)
-{
-    QDomElement parameterDeclarationElement = documentRootFromString(
-              "<ParameterDeclarations>"
-                "<ParameterDeclaration name=\"Parameter1\" parameterType=\"string\" value=\"TestString\" />"
-                "<ParameterDeclaration name=\"Parameter2\" parameterType=\"double\" value=\"10.0\" />"
-                "<ParameterDeclaration name=\"Parameter3\" parameterType=\"integer\" value=\"2\" />"
-              "</ParameterDeclarations>"
-              );
-
-    openScenario::Parameters parameters;
-
-    ASSERT_NO_THROW(Importer::ImportParameterDeclarationElement(parameterDeclarationElement, parameters));
-    EXPECT_THAT(parameters, SizeIs(3));
-    EXPECT_THAT(std::get<std::string>(parameters.at("Parameter1")), Eq("TestString"));
-    EXPECT_THAT(std::get<double>(parameters.at("Parameter2")), Eq(10.0));
-    EXPECT_THAT(std::get<int>(parameters.at("Parameter3")), Eq(2));
-}
-
-TEST(ScenarioImporter_UnitTests, ParseAttributeWithPlainValue)
-{
-    QDomElement element = documentRootFromString(
-                "<Element valueString=\"TestString\" valueDouble=\"10.0\" valueInt=\"5\" />"
-              );
-
-    openScenario::Parameters parameters;
-
-    std::string valueString;
-    double valueDouble;
-    int valueInt;
-
-    ASSERT_NO_THROW(valueString = ParseAttribute<std::string>(element, "valueString", parameters));
-    ASSERT_THAT(valueString, Eq("TestString"));
-    ASSERT_NO_THROW(valueDouble = ParseAttribute<double>(element, "valueDouble", parameters));
-    ASSERT_THAT(valueDouble, Eq(10.0));
-    ASSERT_NO_THROW(valueInt = ParseAttribute<int>(element, "valueInt", parameters));
-    ASSERT_THAT(valueInt, Eq(5));
-}
-
-TEST(ScenarioImporter_UnitTests, ParseAttributeWithParameter)
-{
-    QDomElement element = documentRootFromString(
-                 "<Element valueString=\"$ParameterString\" valueDouble=\"$ParameterDouble\" valueInt=\"$ParameterInt\" />"
-              );
-
-    std::string parameterString{"TestString"};
-    double parameterDouble{10.0};
-    int parameterInt{5};
-
-    openScenario::Parameters parameters{{"ParameterString", parameterString}, {"ParameterDouble", parameterDouble}, {"ParameterInt", parameterInt}};
-
-    std::string valueString;
-    double valueDouble;
-    int valueInt;
-
-    ASSERT_NO_THROW(valueString = ParseAttribute<std::string>(element, "valueString", parameters));
-    ASSERT_THAT(valueString, Eq(parameterString));
-    ASSERT_NO_THROW(valueDouble = ParseAttribute<double>(element, "valueDouble", parameters));
-    ASSERT_THAT(valueDouble, Eq(parameterDouble));
-    ASSERT_NO_THROW(valueInt = ParseAttribute<int>(element, "valueInt", parameters));
-    ASSERT_THAT(valueInt, Eq(parameterInt));
-}
-
-TEST(ScenarioImporter_UnitTests, ParseAttributeWithUndefinedAttribute_Throws)
-{
-    QDomElement element = documentRootFromString(
-                 "<Element valueString=\"$ParameterString\" valueDouble=\"$ParameterDouble\" valueInt=\"$ParameterInt\" />"
-              );
-
-    openScenario::Parameters parameters{};
-
-    ASSERT_THROW(ParseAttribute<double>(element, "valueUndefined", parameters), std::runtime_error);
-}
-
-TEST(ScenarioImporter_UnitTests, ParseAttributeWithUndefinedParameter_Throws)
-{
-    QDomElement element = documentRootFromString(
-                 "<Element valueString=\"$ParameterString\" valueDouble=\"$ParameterDouble\" valueInt=\"$ParameterInt\" />"
-              );
-
-    openScenario::Parameters parameters{};
-
-    ASSERT_THROW(ParseAttribute<double>(element, "valueString", parameters), std::runtime_error);
-}
-
-TEST(ScenarioImporter_UnitTests, ParseAttributeWithParameterWrongType_Throws)
-{
-    QDomElement element = documentRootFromString(
-                 "<Element valueString=\"$ParameterString\" valueDouble=\"$ParameterDouble\" valueInt=\"$ParameterInt\" />"
-              );
-
-    std::string parameterString{"TestString"};
-    double parameterDouble{10.0};
-    int parameterInt{5};
-
-    openScenario::Parameters parameters{{"ParameterString", parameterString}, {"ParameterDouble", parameterDouble}, {"ParameterInt", parameterInt}};
-
-    ASSERT_THROW(ParseAttribute<double>(element, "valueString", parameters), std::runtime_error);
-}
-
-TEST(ScenarioImporter_UnitTests, ImportRoadNetworkWithTrafficLSignalController)
-{
-    QDomElement entityElement = documentRootFromString(
-        "<root>"
-         "<RoadNetwork>"
-            "<LogicFile filepath=\"SceneryConfiguration.xodr\"/>"
-            "<SceneGraphFile filepath=\"\"/>"
-            "<TrafficSignals>"
-                "<TrafficSignalController name=\"ControllerA\" delay=\"1.0\">"
-                    "<Phase name=\"Phase1\" duration=\"20\">"
-                        "<TrafficSignalState trafficSignalId=\"100\" state=\"red\"/>"
-                        "<TrafficSignalState trafficSignalId=\"101\" state=\"green\"/>"
-                    "</Phase>"
-                    "<Phase name=\"Phase2\" duration=\"3\">"
-                        "<TrafficSignalState trafficSignalId=\"100\" state=\"red yellow\"/>"
-                        "<TrafficSignalState trafficSignalId=\"101\" state=\"yellow\"/>"
-                    "</Phase>"
-                "</TrafficSignalController>"
-            "</TrafficSignals>"
-          "</RoadNetwork>"
-        "</root>"
-    );
-
-    FakeScenario scenario;
-    EXPECT_CALL(scenario, SetSceneryPath("SceneryConfiguration.xodr"));
-    std::vector<openScenario::TrafficSignalController> controllers;
-    ON_CALL(scenario, AddTrafficSignalController(_)).WillByDefault(
-                [&](const openScenario::TrafficSignalController& controller){controllers.push_back(controller);});
-
-    openScenario::Parameters parameters;
-
-    EXPECT_NO_THROW(ScenarioImporter::ImportRoadNetwork(entityElement, &scenario, parameters));
-
-    EXPECT_THAT(controllers, SizeIs(1));
-    const auto controller = controllers.front();
-    EXPECT_THAT(controller.name, Eq("ControllerA"));
-    EXPECT_THAT(controller.delay, Eq(1));
-    EXPECT_THAT(controller.phases, SizeIs(2));
-    EXPECT_THAT(controller.phases[0].name, Eq("Phase1"));
-    EXPECT_THAT(controller.phases[0].duration, Eq(20));
-    EXPECT_THAT(controller.phases[0].states, ElementsAre(std::make_pair("100", "red"), std::make_pair("101", "green")));
-    EXPECT_THAT(controller.phases[1].name, Eq("Phase2"));
-    EXPECT_THAT(controller.phases[1].duration, Eq(3));
-    EXPECT_THAT(controller.phases[1].states, ElementsAre(std::make_pair("100", "red yellow"), std::make_pair("101", "yellow")));
-}
-
-
-TEST(ScenarioImporter_UnitTests, ImportEnvironmentAction)
-{
-    QDomElement element = documentRootFromString(
-                "<root>"
-                 "<EnvironmentAction>"
-                    "<Environment>"
-                        "<Weather cloudState=\"free\">"
-                            "<Sun intensity=\"1.0\" azimuth=\"1.1\" elevation=\"1.3\" />"
-                            "<Fog visualRange=\"20.0\" />"
-                            "<Precipitation intensity=\"0.5\" precipitationType=\"rain\" />"
-                        "</Weather>"
-                    "</Environment>"
-                 "</EnvironmentAction>"
-                "</root>"
-              );
-
-    openScenario::Parameters parameters;
-
-    openScenario::EnvironmentAction result;
-    EXPECT_NO_THROW(result = std::get<openScenario::EnvironmentAction>(openScenario::ScenarioImporterHelper::ImportGlobalAction(element, parameters)));
-    EXPECT_THAT(result.weather.cloudState, Eq(openScenario::Weather::CloudState::free));
-    EXPECT_THAT(result.weather.sun.intensity, Eq(1.0));
-    EXPECT_THAT(result.weather.sun.azimuth, Eq(1.1));
-    EXPECT_THAT(result.weather.sun.elevation, Eq(1.3));
-    EXPECT_THAT(result.weather.fog.visualRange, Eq(20.0));
-    EXPECT_THAT(result.weather.precipitation.intensity, Eq(0.5));
-    EXPECT_THAT(result.weather.precipitation.type, Eq(openScenario::Precipitation::Type::rain));
-}
diff --git a/sim/tests/unitTests/core/opSimulation/sceneryImporter_Tests.cpp b/sim/tests/unitTests/core/opSimulation/sceneryImporter_Tests.cpp
index 5a188e24e7b55d881a1007da0dcfa37a0174c5a1..f349f93b55e74199bdc89e1cdf4bc6ddb9d38578 100644
--- a/sim/tests/unitTests/core/opSimulation/sceneryImporter_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/sceneryImporter_Tests.cpp
@@ -115,22 +115,22 @@ TEST(SceneryImporter_UnitTests, ParseSignalsWithValidSignal_ReturnsCorrectValues
 
     ASSERT_NO_THROW(SceneryImporter::ParseSignals(documentRoot, &mockRoad));
 
-    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.s, 100.1);
-    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.t, 1.1);
+    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.s.value(), 100.1);
+    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.t.value(), 1.1);
     EXPECT_EQ(SignalInterceptor::signal.id, "id0");
     EXPECT_EQ(SignalInterceptor::signal.name, "n0");
     EXPECT_EQ(SignalInterceptor::signal.orientation, "-");
-    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.zOffset, 0.1);
+    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.zOffset.value(), 0.1);
     EXPECT_EQ(SignalInterceptor::signal.country, "c1");
     EXPECT_EQ(SignalInterceptor::signal.type, "none");
     EXPECT_EQ(SignalInterceptor::signal.subtype, "none");
     EXPECT_DOUBLE_EQ(SignalInterceptor::signal.value, 0.123);
     EXPECT_EQ(SignalInterceptor::signal.unit, RoadSignalUnit::Undefined);
-    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.height, 1.01);
-    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.width, 0.11);
+    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.height.value(), 1.01);
+    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.width.value(), 0.11);
     EXPECT_EQ(SignalInterceptor::signal.text, "t1");
-    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.hOffset, 1e-3);
-    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.pitch, 1e-2);
+    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.hOffset.value(), 1e-3);
+    EXPECT_DOUBLE_EQ(SignalInterceptor::signal.pitch.value(), 1e-2);
     EXPECT_EQ(SignalInterceptor::signal.validity.lanes[0], -3);
     EXPECT_EQ(SignalInterceptor::signal.validity.lanes[1], -2);
 }
@@ -282,18 +282,18 @@ TEST(SceneryImporter_UnitTests, ParseObjectsWithValidObject_ReturnsCorrectValues
     EXPECT_EQ(ObjectInterceptor::object.type, RoadObjectType::barrier);
     EXPECT_EQ(ObjectInterceptor::object.name, "obstacle");
     EXPECT_EQ(ObjectInterceptor::object.id, "b03");
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.s, 120);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.t, 2);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.zOffset, 0);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.validLength, 0);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.s.value(), 120);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.t.value(), 2);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.zOffset.value(), 0);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.validLength.value(), 0);
     EXPECT_EQ(ObjectInterceptor::object.orientation, RoadElementOrientation::positive);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.width, 4);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.length, 12);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.radius, 0);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.height, 2);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.hdg, 0);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.pitch, 0);
-    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.roll, 0);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.width.value(), 4);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.length.value(), 12);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.radius.value(), 0);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.height.value(), 2);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.hdg.value(), 0);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.pitch.value(), 0);
+    EXPECT_DOUBLE_EQ(ObjectInterceptor::object.roll.value(), 0);
 }
 
 TEST(SceneryImporter_UnitTests, ParseObjectsWithMissingField_ThrowsException)
@@ -379,29 +379,29 @@ TEST(SceneryImporter_UnitTests, ParseRepeatWithNoOverridingOfOptionalParameters)
     object.type = RoadObjectType::obstacle;
     object.name = "Leitplanke";
     object.id = "";
-    object.s = 0;
-    object.t = 1;
-    object.zOffset = 0;
-    object.validLength = 0;
+    object.s = 0_m;
+    object.t = 1_m;
+    object.zOffset = 0_m;
+    object.validLength = 0_m;
     object.orientation = RoadElementOrientation::negative;
-    object.length = 2.0;
-    object.width = 1.0;
-    object.height = 0;
-    object.hdg = 0;
-    object.pitch = 0;
-    object.roll = 0;
-    object.radius = 0;
+    object.length = 2.0_m;
+    object.width = 1.0_m;
+    object.height = 0_m;
+    object.hdg = 0_rad;
+    object.pitch = 0_rad;
+    object.roll = 0_rad;
+    object.radius = 0_m;
     std::vector<RoadObjectSpecification> objectRepitions;
 
     objectRepitions = SceneryImporter::ParseObjectRepeat(documentRoot, object);
 
     for(auto object : objectRepitions)
     {
-      ASSERT_EQ(object.t, 1);
-      ASSERT_EQ(object.length, 2.0);
-      ASSERT_EQ(object.width, 1.0);
-      ASSERT_EQ(object.height, 0);
-      ASSERT_EQ(object.zOffset, 0);
+      ASSERT_EQ(object.t.value(), 1);
+      ASSERT_EQ(object.length.value(), 2.0);
+      ASSERT_EQ(object.width.value(), 1.0);
+      ASSERT_EQ(object.height.value(), 0);
+      ASSERT_EQ(object.zOffset.value(), 0);
       ASSERT_EQ(object.continuous, false);
     }
 }
@@ -414,10 +414,10 @@ TEST(SceneryImporter_UnitTests, ParseRepeatTestOverridingOfObjectRepeat)
     "</root>");
 
     RoadObjectSpecification object;
-    object.s = 0;
-    object.radius = 0;
-    object.length = 2.0;
-    object.width = 1.0;
+    object.s = 0_m;
+    object.radius = 0_m;
+    object.length = 2.0_m;
+    object.width = 1.0_m;
     std::vector<RoadObjectSpecification> objectRepitions;
 
     objectRepitions = SceneryImporter::ParseObjectRepeat(documentRoot, object);
@@ -427,7 +427,7 @@ TEST(SceneryImporter_UnitTests, ParseRepeatTestOverridingOfObjectRepeat)
     int count = 0;
     for(auto object : objectRepitions)
     {
-      ASSERT_EQ(object.s, (sStart + count++ * distance));
+      ASSERT_EQ(object.s.value(), (sStart + count++ * distance));
     }
 }
 
@@ -442,32 +442,32 @@ TEST(SceneryImporter_UnitTests, ParseRepeatOverridesAllOptionalParameters)
     object.type = RoadObjectType::obstacle;
     object.name = "Leitplanke";
     object.id = "";
-    object.s = 0;
-    object.t = 1;
-    object.zOffset = 0.1;
-    object.validLength = 0;
+    object.s = 0_m;
+    object.t = 1_m;
+    object.zOffset = 0.1_m;
+    object.validLength = 0_m;
     object.orientation = RoadElementOrientation::negative;
-    object.length = 5;
-    object.width = 5;
-    object.height = 5;
-    object.hdg = 0;
-    object.pitch = 0;
-    object.roll = 0;
-    object.radius = 0;
+    object.length = 5_m;
+    object.width = 5_m;
+    object.height = 5_m;
+    object.hdg = 0_rad;
+    object.pitch = 0_rad;
+    object.roll = 0_rad;
+    object.radius = 0_m;
     std::vector<RoadObjectSpecification> objectRepitions;
 
     objectRepitions = SceneryImporter::ParseObjectRepeat(documentRoot, object);
 
     RoadObjectSpecification firstObject = objectRepitions.front();
-    EXPECT_NEAR(firstObject.t, 1.5, 1e-4);
-    EXPECT_NEAR(firstObject.s, 100, 1e-4);
-    EXPECT_NEAR(firstObject.width, 2, 1e-4);
-    EXPECT_NEAR(firstObject.height, 1, 1e-4);
-    EXPECT_NEAR(firstObject.zOffset, 0, 1e-4);
+    EXPECT_NEAR(firstObject.t.value(), 1.5, 1e-4);
+    EXPECT_NEAR(firstObject.s.value(), 100, 1e-4);
+    EXPECT_NEAR(firstObject.width.value(), 2, 1e-4);
+    EXPECT_NEAR(firstObject.height.value(), 1, 1e-4);
+    EXPECT_NEAR(firstObject.zOffset.value(), 0, 1e-4);
 
     ASSERT_EQ(firstObject.type, RoadObjectType::obstacle);
-    ASSERT_EQ(firstObject.length, 5);
-    ASSERT_EQ(firstObject.hdg, 0);
+    ASSERT_EQ(firstObject.length.value(), 5);
+    ASSERT_EQ(firstObject.hdg.value(), 0);
     ASSERT_EQ(firstObject.continuous, false);
 }
 
@@ -482,18 +482,18 @@ TEST(SceneryImporter_UnitTests, ParseRepeatWithDistanceZero)
     object.type = RoadObjectType::obstacle;
     object.name = "Leitplanke";
     object.id = "";
-    object.s = 0;
-    object.t = 1;
-    object.zOffset = 0;
-    object.validLength = 0;
+    object.s = 0_m;
+    object.t = 1_m;
+    object.zOffset = 0_m;
+    object.validLength = 0_m;
     object.orientation = RoadElementOrientation::negative;
-    object.length = 2.0;
-    object.width = 1.0;
-    object.height = 0;
-    object.hdg = 0;
-    object.pitch = 0;
-    object.roll = 0;
-    object.radius = 0;
+    object.length = 2.0_m;
+    object.width = 1.0_m;
+    object.height = 0_m;
+    object.hdg = 0_rad;
+    object.pitch = 0_rad;
+    object.roll = 0_rad;
+    object.radius = 0_m;
     std::vector<RoadObjectSpecification> objectRepitions;
 
     objectRepitions = SceneryImporter::ParseObjectRepeat(documentRoot, object);
@@ -503,6 +503,6 @@ TEST(SceneryImporter_UnitTests, ParseRepeatWithDistanceZero)
     RoadObjectSpecification firstObject = objectRepitions.front();
 
     ASSERT_EQ(firstObject.type, RoadObjectType::obstacle);
-    ASSERT_EQ(firstObject.length, 200);
+    ASSERT_EQ(firstObject.length.value(), 200);
     ASSERT_EQ(firstObject.continuous, true);
 }
diff --git a/sim/tests/unitTests/core/opSimulation/vehicleModelsImporter_Tests.cpp b/sim/tests/unitTests/core/opSimulation/vehicleModelsImporter_Tests.cpp
index 65c36668663ac42d7a8ab6f9288a065af82845bd..afa03b6b9cf86114824569c64ad794dcfdb9e246 100644
--- a/sim/tests/unitTests/core/opSimulation/vehicleModelsImporter_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/vehicleModelsImporter_Tests.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2020 in-tech GmbH
+ *               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -25,7 +26,7 @@ using ::testing::Eq;
 using namespace Importer;
 
 const std::string validVehicleString{
-    "<Vehicle name=\"validCar\" vehicleCategory=\"car\">"
+    "<Vehicle mass=\"24.0\" name=\"validCar\" vehicleCategory=\"car\">"
         "<Properties>"
             "<Property name=\"AirDragCoefficient\" value=\"1.0\"/>"
             "<Property name=\"AxleRatio\" value=\"2.0\"/>"
@@ -35,7 +36,6 @@ const std::string validVehicleString{
             "<Property name=\"GearRatio1\" value=\"6.0\"/>"
             "<Property name=\"GearRatio2\" value=\"6.1\"/>"
             "<Property name=\"GearRatio3\" value=\"6.2\"/>"
-            "<Property name=\"Mass\" value=\"24.0\"/>"
             "<Property name=\"MinimumEngineTorque\" value=\"7.0\"/>"
             "<Property name=\"MaximumEngineTorque\" value=\"8.0\"/>"
             "<Property name=\"MinimumEngineSpeed\" value=\"9.0\"/>"
@@ -59,7 +59,7 @@ const std::string validVehicleString{
 };
 
 const std::string parametrizedVehicleString{
-    "<Vehicle name=\"validCar\" vehicleCategory=\"car\">"
+    "<Vehicle mass=\"24.0\" name=\"validCar\" vehicleCategory=\"car\">"
         "<Properties>"
             "<Property name=\"AirDragCoefficient\" value=\"1.0\"/>"
             "<Property name=\"AxleRatio\" value=\"2.0\"/>"
@@ -69,7 +69,6 @@ const std::string parametrizedVehicleString{
             "<Property name=\"GearRatio1\" value=\"6.0\"/>"
             "<Property name=\"GearRatio2\" value=\"6.1\"/>"
             "<Property name=\"GearRatio3\" value=\"6.2\"/>"
-            "<Property name=\"Mass\" value=\"24.0\"/>"
             "<Property name=\"MinimumEngineTorque\" value=\"7.0\"/>"
             "<Property name=\"MaximumEngineTorque\" value=\"8.0\"/>"
             "<Property name=\"MinimumEngineSpeed\" value=\"9.0\"/>"
@@ -130,14 +129,14 @@ TEST(VehicleModelsImporter, GivenValidVehicle_ImportsCorrectGeometry)
     QDomElement fakeVehicleRoot = documentRootFromString(validVehicleString);
 
     Configuration::VehicleModels vehicleModels;
-    VehicleModelParameters vehicleModelParameters;
+    mantle_api::VehicleProperties vehicleModelParameters;
 
     ASSERT_NO_THROW(VehicleModelsImporter::ImportVehicleModel(fakeVehicleRoot, vehicleModels));
     ASSERT_NO_THROW(vehicleModelParameters = vehicleModels.GetVehicleModel("validCar", EMPTY_PARAMETERS));
 
-    EXPECT_THAT(vehicleModelParameters.boundingBoxDimensions.length, DoubleEq(2.0));
-    EXPECT_THAT(vehicleModelParameters.boundingBoxDimensions.width, DoubleEq(1.9));
-    EXPECT_THAT(vehicleModelParameters.boundingBoxDimensions.height, DoubleEq(2.1));
+    EXPECT_THAT(vehicleModelParameters.bounding_box.dimension.length, DoubleEq(2.0));
+    EXPECT_THAT(vehicleModelParameters.bounding_box.dimension.width, DoubleEq(1.9));
+    EXPECT_THAT(vehicleModelParameters.bounding_box.dimension.height, DoubleEq(2.1));
     EXPECT_THAT(vehicleModelParameters.boundingBoxCenter.x, DoubleEq(1.6));
     EXPECT_THAT(vehicleModelParameters.boundingBoxCenter.y, DoubleEq(1.7));
     EXPECT_THAT(vehicleModelParameters.boundingBoxCenter.z, DoubleEq(1.8));
@@ -146,12 +145,12 @@ TEST(VehicleModelsImporter, GivenValidVehicle_ImportsCorrectGeometry)
     EXPECT_THAT(vehicleModelParameters.frontAxle.maxSteering, DoubleEq(1.1));
     EXPECT_THAT(vehicleModelParameters.frontAxle.wheelDiameter, DoubleEq(26.0));
     EXPECT_THAT(vehicleModelParameters.frontAxle.trackWidth, DoubleEq(27.));
-    EXPECT_THAT(vehicleModelParameters.frontAxle.positionX, DoubleEq(28.));
+    EXPECT_THAT(vehicleModelParameters.front_axle.bb_center_to_axle_center.x, DoubleEq(28.));
     EXPECT_THAT(vehicleModelParameters.frontAxle.positionZ, DoubleEq(29.));
     EXPECT_THAT(vehicleModelParameters.rearAxle.maxSteering, DoubleEq(0.0));
     EXPECT_THAT(vehicleModelParameters.rearAxle.wheelDiameter, DoubleEq(31.0));
     EXPECT_THAT(vehicleModelParameters.rearAxle.trackWidth, DoubleEq(32.));
-    EXPECT_THAT(vehicleModelParameters.rearAxle.positionX, DoubleEq(0.));
+    EXPECT_THAT(vehicleModelParameters.rear_axle.bb_center_to_axle_center.x, DoubleEq(0.));
     EXPECT_THAT(vehicleModelParameters.rearAxle.positionZ, DoubleEq(34.));
 }
 
@@ -160,7 +159,7 @@ TEST(VehicleModelsImporter, GivenValidVehicle_ImportsCorrectEngineParameters)
     QDomElement fakeVehicleRoot = documentRootFromString(validVehicleString);
 
     Configuration::VehicleModels vehicleModels;
-    VehicleModelParameters vehicleModelParameters;
+    mantle_api::VehicleProperties vehicleModelParameters;
 
     ASSERT_NO_THROW(VehicleModelsImporter::ImportVehicleModel(fakeVehicleRoot, vehicleModels));
     ASSERT_NO_THROW(vehicleModelParameters = vehicleModels.GetVehicleModel("validCar", EMPTY_PARAMETERS));
@@ -177,17 +176,17 @@ TEST(VehicleModelsImporter, GivenValidGeometry_ImportsCorrectDynamics)
     QDomElement fakeVehicleRoot = documentRootFromString(validVehicleString);
 
     Configuration::VehicleModels vehicleModels;
-    VehicleModelParameters vehicleModelParameters;
+    mantle_api::VehicleProperties vehicleModelParameters;
 
     ASSERT_NO_THROW(VehicleModelsImporter::ImportVehicleModel(fakeVehicleRoot, vehicleModels));
     ASSERT_NO_THROW(vehicleModelParameters = vehicleModels.GetVehicleModel("validCar", EMPTY_PARAMETERS));
 
+    EXPECT_THAT(vehicleModelParameters.mass, DoubleEq(24.0));
     EXPECT_THAT(vehicleModelParameters.properties.at("SteeringRatio"), DoubleEq(15.0));
     EXPECT_THAT(vehicleModelParameters.properties.at("AxleRatio"), DoubleEq(2.0));
     EXPECT_THAT(vehicleModelParameters.properties.at("AirDragCoefficient"), DoubleEq(1.0));
     EXPECT_THAT(vehicleModelParameters.properties.at("FrictionCoefficient"), DoubleEq(4.0));
     EXPECT_THAT(vehicleModelParameters.properties.at("FrontSurface"), DoubleEq(5.0));
-    EXPECT_THAT(vehicleModelParameters.properties.at("Mass"), DoubleEq(24.0));
     EXPECT_THAT(vehicleModelParameters.properties.at("MomentInertiaRoll"), DoubleEq(11.0));
     EXPECT_THAT(vehicleModelParameters.properties.at("MomentInertiaPitch"), DoubleEq(12.0));
     EXPECT_THAT(vehicleModelParameters.properties.at("MomentInertiaYaw"), DoubleEq(13.0));
@@ -198,7 +197,7 @@ TEST(VehicleModelsImporter, GivenValidVehicle_ImportsCorrectGearing)
     QDomElement fakeVehicleRoot = documentRootFromString(validVehicleString);
 
     Configuration::VehicleModels vehicleModels;
-    VehicleModelParameters vehicleModelParameters;
+    mantle_api::VehicleProperties vehicleModelParameters;
 
     ASSERT_NO_THROW(VehicleModelsImporter::ImportVehicleModel(fakeVehicleRoot, vehicleModels));
     ASSERT_NO_THROW(vehicleModelParameters = vehicleModels.GetVehicleModel("validCar", EMPTY_PARAMETERS));
@@ -220,8 +219,8 @@ TEST(VehicleModelsImporter, GivenParametrizedVehicle_ImportsCorrectParameters)
     ASSERT_NO_THROW(vehicleModelParameters = vehicleModels.GetVehicleModelMap().at("validCar"));
 
 
-    EXPECT_THAT(vehicleModelParameters.boundingBoxDimensions.length.name, Eq("CustomLength"));
-    EXPECT_THAT(vehicleModelParameters.boundingBoxDimensions.length.defaultValue, DoubleEq(3.0));
+    EXPECT_THAT(vehicleModelParameters.bounding_box.dimension.length.name, Eq("CustomLength"));
+    EXPECT_THAT(vehicleModelParameters.bounding_box.dimension.length.defaultValue, DoubleEq(3.0));
     EXPECT_THAT(vehicleModelParameters.performance.maxSpeed.name, Eq("CustomSpeed"));
     EXPECT_THAT(vehicleModelParameters.performance.maxSpeed.defaultValue, DoubleEq(30.0));
     EXPECT_THAT(vehicleModelParameters.frontAxle.trackWidth.name, Eq("CustomFrontTrackWidth"));
@@ -238,7 +237,7 @@ TEST(VehicleModelsImporter, GivenValidVehicle_SetsCorrectType)
     ASSERT_NO_THROW(VehicleModelsImporter::ImportVehicleModel(fakeVehicleRoot, vehicleModels));
     ASSERT_NO_THROW(vehicleModelParameters = vehicleModels.GetVehicleModelMap().at("validCar"));
 
-    EXPECT_THAT(vehicleModelParameters.vehicleType, Eq(AgentVehicleType::Car));
+    EXPECT_THAT(vehicleModelParameters.vehicleType, Eq(mantle_api::VehicleClass::kMedium_car));
 }
 
 TEST(VehicleModelsImporter, GivenUnknwonVehicleType_DoesNotImport)
@@ -255,13 +254,15 @@ TEST(VehicleModelsImporter, GivenValidPedestrian_ImportsCorrectValues)
     QDomElement fakePedestrianRoot = documentRootFromString(validPedestrianString);
 
     Configuration::VehicleModels vehicleModels;
-    VehicleModelParameters vehicleModelParameters;
+    mantle_api::VehicleProperties vehicleModelParameters;
 
     ASSERT_NO_THROW(VehicleModelsImporter::ImportPedestrianModel(fakePedestrianRoot, vehicleModels));
     ASSERT_NO_THROW(vehicleModelParameters = vehicleModels.GetVehicleModel("pedestrian_name", EMPTY_PARAMETERS));
 
-    EXPECT_THAT(vehicleModelParameters.vehicleType, Eq(AgentVehicleType::Pedestrian));
-    EXPECT_THAT(vehicleModelParameters.boundingBoxDimensions.width, DoubleEq(4.0));
-    EXPECT_THAT(vehicleModelParameters.boundingBoxDimensions.length, DoubleEq(5.0));
-    EXPECT_THAT(vehicleModelParameters.boundingBoxDimensions.height, DoubleEq(6.0));
+    // workaround for ground truth not being able to handle pedestrians
+    //EXPECT_THAT(vehicleModelParameters.vehicleType, Eq(AgentVehicleType::Pedestrian));
+    EXPECT_THAT(vehicleModelParameters.vehicleType, Eq(mantle_api::VehicleClass::kMedium_car));
+    EXPECT_THAT(vehicleModelParameters.bounding_box.dimension.width, DoubleEq(4.0));
+    EXPECT_THAT(vehicleModelParameters.bounding_box.dimension.length, DoubleEq(5.0));
+    EXPECT_THAT(vehicleModelParameters.bounding_box.dimension.height, DoubleEq(6.0));
 }