diff --git a/.clang-tidy b/.clang-tidy
index 1a615184abd132e73be818e0217ac1bd56cee469..0589bb5ad01fe3f3734915b30bd048b4400455ec 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -42,7 +42,7 @@ CheckOptions:
   - key: readability-identifier-naming.FunctionCase
     value: CamelCase
   - key: readability-identifier-naming.FunctionIgnoredRegexp
-    value: 'OpenPASS_GetVersion|OpenPASS_CreateInstance|OpenPASS_DestroyInstance|OpenPASS_UpdateInput|OpenPASS_UpdateOutput|OpenPASS_Trigger|OpenPASS_OpSimulationManagerPreHook|OpenPASS_OpSimulationManagerPostHook|OpenPASS_OpSimulationPreHook|OpenPASS_OpSimulationPreRunHook|OpenPASS_OpSimulationUpdateHook|OpenPASS_OpSimulationPostRunHook|OpenPASS_OpSimulationPostHook|OpenPASS_OpSimulationResultFile'
+    value: 'OpenPASS_GetVersion|OpenPASS_CreateInstance|OpenPASS_DestroyInstance|OpenPASS_UpdateInput|OpenPASS_UpdateOutput|OpenPASS_Trigger|OpenPASS_OpSimulationPreHook|OpenPASS_OpSimulationPreRunHook|OpenPASS_OpSimulationUpdateHook|OpenPASS_OpSimulationPostRunHook|OpenPASS_OpSimulationPostHook'
   - key: readability-identifier-naming.GlobalVariableCase
     value: camelBack
   - key: readability-identifier-naming.GlobalVariablePrefix 
diff --git a/.gitattributes b/.gitattributes
index 032c1bd1cbde2ac0f40eba4c9967d47242e99792..176a458f94e0ea5272ce67c36bf30b6be9caf623 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,2 +1 @@
 * text=auto
-
diff --git a/.gitignore b/.gitignore
index e9a8968c499496975dc8562f5d8adf636c4954ee..d53cf893d3a34d8f5f71f51e9949db76e0618fec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,32 +1,15 @@
-Thumbs.db
-# qt artifact
-**/build-*
-/.project
-*.autosave
-*.orig
-*.rej
-*.user
-.directory
 .vscode
-DoxyGen/Function/doxy_build/*
-Doxygen
-doxyoutput
 build
-*.bak
-Doxygen.log
+Doxygen
 DoxygenWarningLog.txt
 .devcontainer
 
 # autogenerated by cmake
 doc/source/version.txt
 
-# autogenerated by sphinx
-doc/source/api.rst
-
 # third party references
 deps/*
 sim/deps/*
-deps/*
 
 # clangd cache
 .cache
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 84ea5c3863cbc64beffb6af167ffc8dc3327775c..cf4a36d67064f2422a29de7ad9dfa79464ba413a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -104,6 +104,7 @@ if(INSTALL_EXAMPLES)
   install(
     DIRECTORY sim/contrib/examples/
     DESTINATION ${SUBDIR_EXAMPLES}
+    MESSAGE_NEVER
   )
 endif()
 
diff --git a/Doxyfile b/Doxyfile
index 2c291841daeef3b47104211918c7b53bef68b3a6..2f889bcf63e0123a2f4efdafe885a9c7bd55ee5b 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -328,7 +328,7 @@ OPTIMIZE_OUTPUT_SLICE  = NO
 #
 # Note see also the list of default file extension mappings.
 
-EXTENSION_MAPPING      = 
+EXTENSION_MAPPING      =
 
 # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
 # according to the Markdown format, which allows for more readable
@@ -866,6 +866,7 @@ WARN_LOGFILE           = "DoxygenWarningLog.txt"
 
 INPUT                  =  \
                           sim/src \
+                          ../deps/direct_deploy/mantleapi/include \
                           sim/include \
 
 # This tag can be used to specify the character encoding of the source files
@@ -957,27 +958,6 @@ RECURSIVE              = YES
 EXCLUDE                = \
                          sim/deps/thirdParty \
                          sim/src/core/opSimulation/modules/World_OSI/OWL/fakes \
-                         \
-                         sim/src/core/opSimulation/framework/vehicle.h \
-                         sim/src/core/opSimulation/framework/pedestrian.h \
-                         sim/src/core/opSimulation/framework/environment.h \
-                         sim/src/core/opSimulation/framework/entity.h \
-                         sim/src/core/opSimulation/framework/entityRepository.h \
-                         sim/src/core/opSimulation/framework/controller.h \
-                         sim/src/core/opSimulation/framework/controllerRepository.h \
-                         sim/src/core/opSimulation/framework/coordConverter.h \
-                         sim/src/core/opSimulation/framework/geometryHelper.h \
-                         sim/src/core/opSimulation/framework/geometryHelper.cpp \
-                         sim/src/core/opSimulation/framework/laneLocationQueryService.h \
-                         sim/src/core/opSimulation/framework/laneLocationQueryService.cpp \
-                         sim/src/core/opSimulation/framework/logger.h \
-                         sim/src/core/opSimulation/framework/trafficSwarmService.h \
-                         sim/src/core/opSimulation/framework/vehicle.cpp \
-                         sim/src/core/opSimulation/framework/pedestrian.cpp \
-                         sim/src/core/opSimulation/framework/environment.cpp \
-                         sim/src/core/opSimulation/framework/entity.cpp \
-                         sim/src/core/opSimulation/framework/entityRepository.cpp \
-                         sim/src/core/opSimulation/framework/controllerRepository.cpp \
 
 # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
 # directories that are symbolic links (a Unix file system feature) are excluded
@@ -2310,7 +2290,6 @@ PREDEFINED             = \
     SENSOR_DRIVER_SHARED_EXPORT=, \
     SENSOR_FUSION_SHARED_EXPORT=, \
     SENSOR_OSI_SHARED_EXPORT=, \
-    SENSOR_RECORD_STATE_SHARED_EXPORT=, \
     SIGNAL_PRIORITIZER_SHARED_EXPORT=, \
     SPAWNPOINT_SHARED_EXPORT=, \
     STOCHASTICS_SHARED_EXPORT=, \
diff --git a/NOTICE.md b/NOTICE.md
index 2050932a8ceff9094a73e07ff870284c7232ed12..b9e0ef5cc5029c3e2d324c1b890dd58312fa43be 100644
--- a/NOTICE.md
+++ b/NOTICE.md
@@ -4,11 +4,12 @@ This content is produced and maintained by the Eclipse openPASS project.
 
  * Project home: https://projects.eclipse.org/projects/automotive.openpass
 
+[TOC]
+
 ## Copyright
 
 All content is the property of the respective authors or their employers.
-For more information regarding authorship of content, please consult the
-listed source code repository logs.
+For more information regarding authorship of content, please consult the listed source code repository logs.
 
 ## Declared Project Licenses
 
@@ -27,33 +28,57 @@ The project maintains the following source code repositories:
 
 ## Third-party Content
 
-Open Simulation Interface
-
- * License: MPL-2.0
- * Source: https://github.com/OpenSimulationInterface/open-simulation-interface
-
-Google Protobuf
-
- * License: New BSD License
- * Source: https://github.com/protocolbuffers/protobuf
-
-Boost library
-
- * License: Boost Software License
- * Project: https://www.boost.org/
- * Source: https://www.boost.org/users/download/
-
-Google Test
-
- * License: New BSD License
- * Source: https://github.com/google/googletest
-
-Modelon FMILibrary
-
- * License: New BSD License
- * Source: https://github.com/modelon-community/fmi-library
-
-The more detailed list of requisites are mentioned [here](doc/source/installation_guide/20_install_prerequisites.rst)
+### Required Dependencies
+
+The listed versions are confirmed working versions, not minimum requirements:
+
+| Name                      | Purpose                                                                          | License                                                   | Version | Source                                                                                                                                                                                                                                                          |
+| ------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| antlr4                    | Parser generator                                                                 | [New BSD](https://opensource.org/license/bsd-3-clause)    | 4.8.0   | [Homepage](https://www.antlr.org/), [GitHub](https://github.com/antlr/antlr4)                                                                                                                                                                                   |
+| boost                     | C++ development libraries                                                        | [BSL-1.0](https://opensource.org/license/bsl-1-0)         | 1.85.0  | [Homepage](https://www.boost.org/), [GitHub](https://github.com/boostorg/boost)                                                                                                                                                                                 |
+| bzip2                     | Data compressor                                                                  | [bzip2-1.0.6](https://spdx.org/licenses/bzip2-1.0.6.html) | 1.0.8   | [Homepage](https://sourceware.org/bzip2/), [GitLab](https://gitlab.com/federicomenaquintero/bzip2)                                                                                                                                                              |
+| CMake                     | Build system generator                                                           | [New BSD](https://opensource.org/license/bsd-3-clause)    | 3.28.1  | [Homepage](https://cmake.org/), [GitLab](https://gitlab.kitware.com/cmake/cmake)                                                                                                                                                                                |
+| fmilibrary                | FMU importer                                                                     | [New BSD](https://opensource.org/license/bsd-3-clause)    | 2.0.3   | [GitHub](https://github.com/modelon-community/fmi-library)                                                                                                                                                                                                      |
+| libiconv                  | Character set conversion                                                         | [LGPL-2.0](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.de.html)         | 1.17.0  | [Homepage](https://www.gnu.org/software/libiconv/), [GitHub](https://github.com/bnoordhuis/libiconv)                                                                                                                                                            |
+| libxml2                   | XML toolkit                                                                      | [MIT](https://opensource.org/license/mit)                 | 2.12.5  | [GitLab](https://gitlab.gnome.org/GNOME/libxml2), [Documentation](https://gitlab.gnome.org/GNOME/libxml2/-/wikis/home)                                                                                                                                          |
+| mantleapi                 | Interface between scenario engine & environment simulator                        | [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)         | 5.1.0   | [GitLab](https://gitlab.eclipse.org/eclipse/openpass/mantle-api)                                                                                                                                                                                                |
+| minizip                   | .zip file unpacker                                                               | [zlib](https://www.zlib.net/zlib_license.html)            | 1.2.13  | See zlib                                                                                                                                                                                                                                                        |
+| open-simulation-interface | Simulation data interface                                                        | [MPL-2.0](https://www.mozilla.org/en-US/MPL/2.0/)         | 3.5.0   | [Homepage](https://www.asam.net/standards/detail/osi/), [GitHub](https://github.com/OpenSimulationInterface/open-simulation-interface), [Documentation](https://opensimulationinterface.github.io/osi-antora-generator/asamosi/latest/specification/index.html) |
+| openscenario_api          | [ASAM OpenSCENARIO](https://www.asam.net/standards/detail/openscenario/) library | [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) | 1.3.1   | [GitHub](https://github.com/RA-Consulting-GmbH/openscenario.api.test)                                                                                                                                                                                           |
+| protobuf(-shared)         | Data serialization interface                                                     | [New BSD](https://opensource.org/license/bsd-3-clause)    | 3.20.0  | [GitHub](https://github.com/protocolbuffers/protobuf), [Documentation](https://protobuf.dev/)                                                                                                                                                                   |
+| units                     | Dimensional analysis library                                                     | [MIT](https://opensource.org/license/mit)                 | 2.3.3   | [GitHub](https://github.com/nholthaus/units), [Documentation](https://nholthaus.github.io/units/)                                                                                                                                                               |
+| yase                      | Vehicle simulation engine                                                        | [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)         | 0.1     | [GitLab](https://gitlab.eclipse.org/eclipse/openpass/yase)                                                                                                                                                                                                      |
+| zlib                      | File decompression                                                               | [zlib](https://www.zlib.net/zlib_license.html)            | 1.3.1   | [Homepage](https://www.zlib.net/), [GitHub](https://github.com/madler/zlib)                                                                                                                                                                                     |
+
+For more information, please refer to the [openPASS Documentation](https://eclipse.dev/openpass), section `Installing Prerequisites`.
+
+### Optional Dependencies
+
+These dependencies are for optional features for continuous development such as package management, documentation generation and test execution.
+
+The listed versions are confirmed working versions, not minimum requirements:
+
+| Name                   | Purpose                              | License                                                                   | Version | Source                                                                                                                          |
+| ---------------------- | ------------------------------------ | ------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------- |
+| breathe                | Sphinx plugin for Doxygen            | [New BSD](https://opensource.org/license/bsd-3-clause)                    | 4.35.0  | [Homepage](https://www.breathe-doc.org/), [GitHub](https://github.com/breathe-doc/breathe)                                      |
+| conan                  | Package management                   | [MIT](https://opensource.org/license/mit)                                 | 2.9.3   | [Homepage](https://conan.io/), [GitHub](https://github.com/conan-io/conan)                                                      |
+| ctcache                | Cache for clang-tidy results         | [BSL-1.0](https://opensource.org/license/bsl-1-0)                         | 1.1.0   | [GitHub](https://github.com/matus-chochlik/ctcache)                                                                             |
+| doxygen                | C++ doc generator                    | [GPL-2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html#SEC1) | 1.10.0  | [Homepage](https://www.doxygen.nl/), [GitHub](https://github.com/doxygen/doxygen)                                               |
+| exhale                 | C++ API doc generator                | [New BSD](https://opensource.org/license/bsd-3-clause)                    | 0.3.7   | [Github](https://github.com/svenevs/exhale), [Documentation](https://exhale.readthedocs.io/en/latest/)                          |
+| filelock               | File lock for Python                 | [Unlicense](https://unlicense.org/)                                       | 3.12.3  | [GitHub](https://github.com/tox-dev/filelock), [Documentation](https://py-filelock.readthedocs.io/en/latest/index.html)         |
+| gtest                  | C++ test framework                   | [New BSD](https://opensource.org/license/bsd-3-clause)                    | 1.14.0  | [GitHub](https://github.com/google/googletest), [Documentation](https://google.github.io/googletest/)                           |
+| junitparser            | XML unit test result parser          | [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0)                 | 3.1.0   | [GitHub](https://github.com/weiwei/junitparser), [Documentation](https://junitparser.readthedocs.io/en/latest/)                 |
+| lxml                   | Python binding of libxml2            | [New BSD](https://opensource.org/license/bsd-3-clause)                    | 4.9.3   | [Homepage](https://lxml.de/), [GitHub](https://github.com/lxml/lxml)                                                            |
+| myst-parser            | Markdown extensions for Sphinx       | [MIT](https://opensource.org/license/mit)                                 | 4.0.0   | [GitHub](https://github.com/executablebooks/MyST-Parser), [Documentation](https://myst-parser.readthedocs.io/en/latest/)        |
+| pandas                 | Python data analysis library         | [New BSD](https://opensource.org/license/bsd-3-clause)                    | 2.2.2   | [Homepage](https://pandas.pydata.org/), [GitHub](https://github.com/pandas-dev/pandas)                                          |
+| pip                    | Python package installer             | [MIT](https://opensource.org/license/mit)                                 | 24.3.1  | [GitHub](https://github.com/pypa/pip), [Documentation](https://pip.pypa.io/en/stable/)                                          |
+| pytest                 | Python test framework                | [MIT](https://opensource.org/license/mit)                                 | 7.4.2   | [GitHub](https://github.com/pytest-dev/pytest), [Documentation](https://docs.pytest.org/en/stable/)                             |
+| pyYAML                 | YAML framework for merging CSV files | [MIT](https://opensource.org/license/mit)                                 | 6.0.2   | [Homepage](https://pyyaml.org/), [GitHub](https://github.com/yaml/pyyaml)                                                       |
+| psutil                 | Profiling library                    | [New BSD](https://opensource.org/license/bsd-3-clause)                    | 5.9.5   | [GitHub](https://github.com/giampaolo/psutil), [Documentation](https://psutil.readthedocs.io/en/latest/)                        |
+| sphinx                 | HTML doc generator                   | [FreeBSD](https://www.freebsd.org/copyright/freebsd-license/)             | 7.2.6   | [Homepage](https://www.sphinx-doc.org/en/master/), [GitHub](https://github.com/sphinx-doc/sphinx)                               |
+| sphinx-rtd-theme       | ReadTheDocs theme                    | [MIT](https://opensource.org/license/mit)                                 | 2.0.0   | [GitHub](https://github.com/readthedocs/sphinx_rtd_theme), [Documentation](https://sphinx-rtd-theme.readthedocs.io/en/stable/)  |
+| sphinx-tabs            | Adds tabs to HTML doc                | [MIT](https://opensource.org/license/mit)                                 | 3.4.7   | [GitHub](https://github.com/executablebooks/sphinx-tabs), [Documentation](https://sphinx-tabs.readthedocs.io/en/latest/)        |
+| sphinxcontrib-spelling | Spell-checker for Sphinx             | [FreeBSD](https://www.freebsd.org/copyright/freebsd-license/)             | 8.0.0   | [GitHub](https://github.com/sphinx-contrib/spelling), [Documentation](https://sphinxcontrib-spelling.readthedocs.io/en/latest/) |
 
 ## Cryptography
 
diff --git a/cmake/HelperMacros.cmake b/cmake/HelperMacros.cmake
index 3ab303f74b224322de2bbccbd4238cf61f3551e0..ede532857bc9083b26a5576a4283cdc4d893450c 100644
--- a/cmake/HelperMacros.cmake
+++ b/cmake/HelperMacros.cmake
@@ -1,6 +1,7 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 #               2020 HLRS, University of Stuttgart
+#               2024 Volkswagen 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,7 +81,7 @@ endif()
 #                         [HEADERS <headerfiles>]
 #                         [INCDIRS <include-directories>]
 #                         [LIBRARIES <libraries>]
-#                         [UIS <qt_uis>]
+#                         [GUIXML <guixmlfiles>]
 #                         [FOLDER <category>]
 #                         [COMPONENT <sim|core|bin|module>])
 #
@@ -91,7 +92,7 @@ endif()
 #                         [HEADERS <headerfiles>]
 #                         [INCDIRS <include-directories>]
 #                         [LIBRARIES <libraries>]
-#                         [UIS <qt_uis>]
+#                         [GUIXML <guixmlfiles>]
 #                         [FOLDER <category>]
 #                         [COMPONENT <sim|core|bin|module>])
 #
@@ -101,7 +102,7 @@ endif()
 #                         [HEADERS <headerfiles>]
 #                         [INCDIRS <include-directories>]
 #                         [LIBRARIES <libraries>]
-#                         [UIS <qt_uis>]
+#                         [GUIXML <guixmlfiles>]
 #                         [DEFAULT_MAIN]
 #                         [SIMCORE_DEPS <dependencies>]
 #                         [RESOURCES <directories>]
@@ -113,7 +114,7 @@ endif()
 # LINKAGE        Specifies static or shared linkage for library targets
 # SOURCES        Source files
 # HEADERS        Header files
-# UIS            Qt UI files
+# GUIXML         xml files for GUI system editor
 # INCDIRS        Additional private include directories
 # LIBRARIES      Additional libraries to link
 # DEFAULT_MAIN   Links a simple main() implementation for running GTest
@@ -135,7 +136,7 @@ endif()
 #    - Target property DEBUG_POSTFIX is set to CMAKE_DEBUG_POSTFIX
 ##
 function(add_openpass_target)
-  cmake_parse_arguments(PARSED_ARG "DEFAULT_MAIN" "NAME;TYPE;LINKAGE" "HEADERS;SOURCES;INCDIRS;LIBRARIES;UIS;SIMCORE_DEPS;RESOURCES;FOLDER;COMPONENT" ${ARGN})
+  cmake_parse_arguments(PARSED_ARG "DEFAULT_MAIN" "NAME;TYPE;LINKAGE" "HEADERS;SOURCES;INCDIRS;LIBRARIES;GUIXML;SIMCORE_DEPS;RESOURCES;FOLDER;COMPONENT" ${ARGN})
 
   if(TARGET ${PARSED_ARG_NAME})
     message(STATUS "Target '${PARSED_ARG_NAME}' already defined. Skipping.")
@@ -165,7 +166,7 @@ function(add_openpass_target)
         string(TOUPPER "${PARSED_ARG_LINKAGE}" PARSED_ARG_LINKAGE)
       endif()
 
-      add_library(${PARSED_ARG_NAME} ${PARSED_ARG_LINKAGE} ${PARSED_ARG_HEADERS} ${PARSED_ARG_SOURCES} ${PARSED_ARG_UIS})
+      add_library(${PARSED_ARG_NAME} ${PARSED_ARG_LINKAGE} ${PARSED_ARG_HEADERS} ${PARSED_ARG_SOURCES})
       set_target_properties(${PARSED_ARG_NAME} PROPERTIES INSTALL_RPATH "\$ORIGIN:\$ORIGIN/../${SUBDIR_LIB_EXTERNAL}:\$ORIGIN/../../${SUBDIR_LIB_EXTERNAL}:\$ORIGIN/../${SUBDIR_LIB_COMMON}:\$ORIGIN/../../${SUBDIR_LIB_COMMON}")
 
       if("${PARSED_ARG_LINKAGE}" STREQUAL "SHARED")
@@ -193,7 +194,7 @@ function(add_openpass_target)
         message(WARNING "LINKAGE parameter isn't used by target type 'executable'")
       endif()
 
-      add_executable(${PARSED_ARG_NAME} ${PARSED_ARG_HEADERS} ${PARSED_ARG_SOURCES} ${PARSED_ARG_UIS})
+      add_executable(${PARSED_ARG_NAME} ${PARSED_ARG_HEADERS} ${PARSED_ARG_SOURCES})
       set_target_properties(${PARSED_ARG_NAME} PROPERTIES INSTALL_RPATH "\$ORIGIN/${SUBDIR_LIB_EXTERNAL}:\$ORIGIN/${SUBDIR_LIB_COMMON}")
       install(TARGETS ${PARSED_ARG_NAME} RUNTIME DESTINATION "${DESTDIR}")
       add_to_global_target_list(exe_target_list ${PARSED_ARG_NAME})
@@ -223,7 +224,7 @@ function(add_openpass_target)
         )
       endif()
 
-      add_executable(${PARSED_ARG_NAME} EXCLUDE_FROM_ALL ${PARSED_ARG_HEADERS} ${PARSED_ARG_SOURCES} ${PARSED_ARG_UIS})
+      add_executable(${PARSED_ARG_NAME} EXCLUDE_FROM_ALL ${PARSED_ARG_HEADERS} ${PARSED_ARG_SOURCES})
 
       target_include_directories(${PARSED_ARG_NAME} PRIVATE
         ${MANTLE_TEST_INCLUDE_DIR}
@@ -441,6 +442,14 @@ function(add_openpass_target)
         message(WARNING "RESOURCES only used for 'test' openpass targets")
       endif()
     endif()
+
+    if(DEFINED PARSED_ARG_GUIXML)
+      if("${PARSED_ARG_TYPE}" STREQUAL "library")
+        foreach(XML IN LISTS PARSED_ARG_GUIXML)
+          install(FILES ${XML} DESTINATION "${SUBDIR_XML_COMPONENTS}")
+      endforeach()
+      endif()
+    endif()
   endif()
 endfunction()
 
diff --git a/cmake/global.cmake b/cmake/global.cmake
index 5e10cfa27a3ce671c8b3ca99fc3ea45ee335efc8..1a1ea7963a04d737e501d185c2b6fa5abd29170b 100644
--- a/cmake/global.cmake
+++ b/cmake/global.cmake
@@ -30,6 +30,9 @@ option(INSTALL_SYSTEM_RUNTIME_DEPS "Copy detected system runtime dependencies to
 option(INSTALL_EXTRA_RUNTIME_DEPS "Copy detected third party runtime dependencies to install directory (i.e. required shared libraries found in specified CMAKE_PREFIX_PATH)" OFF)
 option(INSTALL_EXAMPLES "Install configuration examples" ON)
 
+option(WITH_ADDRESS_SANITIZER "Build with AddressSanitizer" OFF)
+option(WITH_MEMORY_SANITIZER "Build with MemorySanitizer" OFF)
+
 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 
 # NOTE: undocumented feature of cmake
@@ -57,8 +60,8 @@ if(USE_CCACHE)
 endif()
 
 if(NOT WIN32 OR (WIN32 AND CMAKE_CROSSCOMPILING))
-  set(CMAKE_C_FLAGS_DEBUG "-g -O0")
-  set(CMAKE_CXX_FLAGS_DEBUG "-g -g -O0")
+  set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O0")
+  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
 endif()
 
 if(MINGW)
@@ -72,11 +75,6 @@ if(MINGW)
   add_compile_options(-Wa,-mbig-obj)
 endif()
 
-if(NOT CMAKE_CROSSCOMPILING)
-  set(CMAKE_AUTOMOC ON)
-  #set(CMAKE_AUTOUIC ON)
-endif()
-
 set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "generated")
 
 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
@@ -88,11 +86,10 @@ if(WITH_SIMCORE OR WITH_TESTS)
   find_package(Open-simulation-interface REQUIRED)
 
   set(Boost_USE_STATIC_LIBS OFF)
-  find_package(Boost COMPONENTS filesystem program_options REQUIRED CONFIG)
-  find_package(Qt5 COMPONENTS Concurrent Core Widgets Xml XmlPatterns Test REQUIRED)
+  find_package(Boost 1.85.0 COMPONENTS Headers filesystem program_options REQUIRED CONFIG)
   find_package(Iconv REQUIRED)
   set(LIBXML2_WITH_ICONV ON)
-  find_package(LibXml2 REQUIRED)
+  find_package(LibXml2 REQUIRED CONFIG)
   find_package(FMILibrary)
 
   if(WITH_PROTOBUF_ARENA)
diff --git a/cmake/install_deps.cmake b/cmake/install_deps.cmake
index fa12c69dc4e41de11e8b1fa2b09a5e4ddd81082a..73e705c27f8743dcf3488efb27e176fcc20496b3 100644
--- a/cmake/install_deps.cmake
+++ b/cmake/install_deps.cmake
@@ -78,11 +78,15 @@ install(CODE
   "
   message(STATUS \"Resolving runtime dependencies...\")
 
+  if(EXE_TARGET_LIST)
+    set(EXE_TARGET_LIST_ARG \"EXECUTABLES \${EXE_TARGET_LIST}\")
+  endif()
+
   file(GET_RUNTIME_DEPENDENCIES
        RESOLVED_DEPENDENCIES_VAR resolved_deps
        UNRESOLVED_DEPENDENCIES_VAR unresolved_deps
        DIRECTORIES ${RT_LIB_DIRS}
-       EXECUTABLES ${EXE_TARGET_LIST}
+       ${EXE_TARGET_LIST_ARG}
        LIBRARIES ${LIB_TARGET_LIST}
        POST_EXCLUDE_REGEXES \"^${CMAKE_BINARY_DIR}\"
        )
diff --git a/cmake/install_xmlSchemas.cmake b/cmake/install_xmlSchemas.cmake
index 67f00894f402257e8421a88e5404f65b5677e0df..0c73abfcb96d65268930a6486e67f37331861aad 100644
--- a/cmake/install_xmlSchemas.cmake
+++ b/cmake/install_xmlSchemas.cmake
@@ -9,5 +9,5 @@
 ################################################################################
 
 # sets install command to copy xml Schema files from repository to installation directory
-install(DIRECTORY ${CMAKE_SOURCE_DIR}/schemas DESTINATION .)
+install(DIRECTORY ${CMAKE_SOURCE_DIR}/schemas DESTINATION . MESSAGE_NEVER)
 message("-- xml schema file will be installed in the schema folder of the installation directory")
diff --git a/conanfile.py b/conanfile.py
deleted file mode 100644
index 07fe30a42424ccac4ed8278e6fe5c46f8ef4b561..0000000000000000000000000000000000000000
--- a/conanfile.py
+++ /dev/null
@@ -1,127 +0,0 @@
-################################################################################
-# Copyright (c) 2024 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
-################################################################################
-
-################################################################################
-# conanfile for building opsimulation with Conan
-################################################################################
-
-from conan import ConanFile
-from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
-from conan.tools.files import update_conandata
-from conan.tools.scm import Git
-import os
-
-required_conan_version = ">=1.53"
-
-class opsimulationConan(ConanFile):
-    name = "opsimulation"
-    version= "0.0.1"
-    settings = "os", "arch", "compiler", "build_type"
-    options = {
-        "shared": [True, False],
-        "fPIC": [True, False],
-    }
-    default_options = {
-        "shared": False,
-        "fPIC": True,
-    }
-    short_paths = Truegenerators = ['CMakeDeps', 'VirtualBuildEnv']
-
-
-    def config_options(self):
-        if self.settings.os == "Windows":
-            del self.options.fPIC
-
-    def requirements(self):
-        self.requires("b2/4.10.1", options={"toolset":"gcc"})
-        self.requires("boost/1.72.0", options={"shared":True,
-                                       "without_atomic":True,
-                                       "without_chrono":True,
-                                       "without_container":True,
-                                       "without_context":True,
-                                       "without_contract":True,
-                                       "without_coroutine":True,
-                                       "without_date_time":True,
-                                       "without_exception":True,
-                                       "without_fiber":True,
-                                       "without_graph":True,
-                                       "without_graph_parallel":True,
-                                       "without_iostreams":True,
-                                       "without_locale":True,
-                                       "without_log":True,
-                                       "without_math":True,
-                                       "without_mpi":True,
-                                       "without_python":True,
-                                       "without_random":True,
-                                       "without_regex":True,
-                                       "without_serialization":True,
-                                       "without_stacktrace":True,
-                                       "without_test":True,
-                                       "without_thread":True,
-                                       "without_timer":True,
-                                       "without_type_erasure":True,
-                                       "without_wave":True })
-        self.requires("msys2/cci.latest", options={"no_kill":True})
-        self.requires("qt/5.15.7", options={"with_pq":False,
-                                            "with_libpng":False,
-                                            "openssl":False,
-                                            "opengl":"no",
-                                            "qtxmlpatterns":True})
-        self.requires("zlib/1.2.12@")
-        self.requires("minizip/1.2.13@")
-        # self.requires("gtest/1.14.0@")
-        self.requires("fmilibrary/2.0.3@openpass/testing")
-        self.requires("protobuf/3.20.0@", options={"shared":True})
-        self.requires("units/2.3.3@openpass/testing")
-        self.requires("open-simulation-interface/3.5.0@openpass/testing")
-        self.requires("mantleapi/0.0.4@openpass/testing")
-        # self.requires("yase/d0c0e58d17358044cc9018c74308b45f6097ecfb@openpass/testing")
-        self.requires("openscenario_api/v1.3.1@openpass/testing")
-        self.requires("openscenario_engine/82e2c1c349ee69d28cd301abfb520e8b210aee7b@openpass/testing", options={
-            'MantleAPI_version': "0.0.4",
-            'Yase_version': "d0c0e58d17358044cc9018c74308b45f6097ecfb"
-        }
-)
-
-    def export(self):
-        git = Git(self, self.recipe_folder)
-        scm_url, scm_commit = git.get_url_and_commit()
-        update_conandata(
-            self, {"sources": {"commit": scm_commit, "url": scm_url}})
-
-    def generate(self):
-        _cmake_prefix_paths = []
-        for _, dependency in self.dependencies.items():
-            _cmake_prefix_paths.append(dependency.package_folder)
-        _cmake_prefix_paths = ';'.join(str(_cmake_prefix_path) for _cmake_prefix_path in _cmake_prefix_paths)
-        tc = CMakeToolchain(self)
-        tc.cache_variables["CMAKE_PREFIX_PATH"] = _cmake_prefix_paths
-        tc.generate()
-
-    def source(self):
-        git = Git(self)
-        sources = self.conan_data["sources"]
-        git.clone(url=sources["url"], target=".")
-        git.checkout(commit=sources["commit"])
-
-    def layout(self):
-        cmake_layout(self)
-        self.cpp.build.libdirs.append("src")
-
-    def build(self):
-        cmake = CMake(self)
-        cmake.configure()
-        cmake.build()
-        cmake.test()
-
-    def package(self):
-        cmake = CMake(self)
-        cmake.install()
-        rmdir(self, os.path.join(self.package_folder, "cmake"))
\ No newline at end of file
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 11a353fc1bd25dfe97d3a4b5c402bcd0f6be4467..17872cb494904d666bdd50af526c994724a23205 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -26,7 +26,7 @@ if(WITH_DOC)
             -W --keep-going                     # treat warnings as errors but keep-going
             -n # https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-nitpicky
             COMMENT "Build Sphinx documentation"
-        COMMAND ${CMAKE_COMMAND} 
+        COMMAND ${CMAKE_COMMAND}
           -E cmake_echo_color --green
           "The HTML pages are in ${CMAKE_BINARY_DIR}/doc/html/index.html")
 
@@ -35,6 +35,7 @@ if(WITH_DOC)
 
     # make HTML doc available on install
     install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/html/
-            DESTINATION ${CMAKE_INSTALL_PREFIX}/doc)
+            DESTINATION ${CMAKE_INSTALL_PREFIX}/doc
+            MESSAGE_NEVER)
   endif()
 endif()
diff --git a/doc/source/advanced_topics/simulator/scenario_actions.rst b/doc/source/advanced_topics/simulator/scenario_actions.rst
index eca9d17dc34cfacc42b17434e36bb451ed2f159f..8c74d21a79e22f408e6484d37c98e2f02ff2fbdd 100644
--- a/doc/source/advanced_topics/simulator/scenario_actions.rst
+++ b/doc/source/advanced_topics/simulator/scenario_actions.rst
@@ -1,6 +1,6 @@
 ..
   *******************************************************************************
-  Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+  Copyright (c) 2023-2024 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
@@ -12,26 +12,26 @@
 .. _mapping_scenario_actions:
 
 Mapping of OpenSCENARIO Actions
-================================
+===============================
 
 .. table::
    :class: tight-table
-   
+
    =================== =============
-   Layer/Component	    API/Datatype
+   Layer/Component     API/Datatype
    =================== =============
                        OpenSCENARIO
    OpenScenarioEngine  mantle_api
-   opSimualtion	       openPASS
-   FMU Interface	   osi3
+   opSimualtion        openPASS
+   FMU Interface       osi3
    =================== =============
 
 AcquirePositionAction
-----------------------
+---------------------
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -41,7 +41,7 @@ AcquirePositionAction
    |              | Entity::GetPosition()                                                                                 |
    |              | GeometryHelper::TranslateGlobalPositionLocally()                                                      |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | SpawnParameter                                                                                        |
+   | openPASS     | SpawnParameter                                                                                        |
    |              | AgentInterface::GetPositionX()                                                                        |
    |              | AgentInterface::GetPositionY()                                                                        |
    |              | AgentInterface::GetYaw()                                                                              |
@@ -53,11 +53,11 @@ AcquirePositionAction
    +--------------+-------------------------------------------------------------------------------------------------------+
 
 AssignRouteAction
-------------------
+-----------------
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -65,18 +65,18 @@ AssignRouteAction
    +--------------+-------------------------------------------------------------------------------------------------------+
    | mantle_api   | Entity::AssignRoute(UniqueId, RouteDefinition)                                                        |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | RouteSamplerInterface::CalculateRouteFromWaypoints(std::vector<mantle_api::RouteWaypoint>)            |
+   | openPASS     | RouteSamplerInterface::CalculateRouteFromWaypoints(std::vector<mantle_api::RouteWaypoint>)            |
    |              | EgoAgentInterface::SetRoadGraph(RoadGraph, RoadGraphVertex, RoadGraphVertex)                          |
    +--------------+-------------------------------------------------------------------------------------------------------+
    | osi3         | x -- not relevant                                                                                     |
    +--------------+-------------------------------------------------------------------------------------------------------+
 
 CustomCommandAction
---------------------
+-------------------
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -84,7 +84,7 @@ CustomCommandAction
    +--------------+-------------------------------------------------------------------------------------------------------+
    | mantle_api   | ExecuteCustomCommand(actors, type, command)                                                           |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | AddCustomCommand(command)                                                                             |
+   | openPASS     | AddCustomCommand(command)                                                                             |
    |              | GetCustomCommands()                                                                                   |
    |              | ComponentControllerImplementation::Trigger(time)                                                      |
    |              | TrajectoryFollowerCommonBase::Trigger(time)                                                           |
@@ -95,11 +95,11 @@ CustomCommandAction
    +--------------+-------------------------------------------------------------------------------------------------------+
 
 FollowTrajectoryAction
------------------------
+----------------------
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -110,7 +110,7 @@ FollowTrajectoryAction
    |              | GeometryHelper::TranslateGlobalPositionLocally(PolyLine)                                              |
    |              | MovementDomain::kBoth                                                                                 |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | SetStrategies(MovementDomain::kBoth, ControlStrategyType::kFollowTrajectory)                          |
+   | openPASS     | SetStrategies(MovementDomain::kBoth, ControlStrategyType::kFollowTrajectory)                          |
    |              | Algorithm_Routecontrol_Implementation::ReadWayPointData()                                             |
    |              | DynamicsScenarioImplementation::ReadWayPointData()                                                    |
    |              | TrajectoryFollowerImplementation::Trigger(time)                                                       |
@@ -132,7 +132,7 @@ LaneChangeAction
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -158,19 +158,39 @@ LaneChangeAction
    |              |                                                                                                       |
    |              | LaneLocationQueryService::GetRelativeLaneId()                                                         |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | SetStrategies(MovementDomain::kLateral, ControlStrategyType::kPerformLaneChange)                      |
+   | openPASS     | SetStrategies(MovementDomain::kLateral, ControlStrategyType::kPerformLaneChange)                      |
    |              | DynamicsScenarioImplementation::CalculateSinusiodalLaneChange(PerformLaneChangeControlStrategy)       |
    |              | DynamicsScenarioImplementation::ReadWayPointData()                                                    |
    +--------------+-------------------------------------------------------------------------------------------------------+
    | osi3         | x -- not implemented                                                                                  |
    +--------------+-------------------------------------------------------------------------------------------------------+
 
-SpeedAction
----------------
+LightStateAction
+----------------
 
 .. table::
    :class: tight-table
    
+   +--------------+-------------------------------------------------------------------------------------------------------+
+   | API/Datatype | Used Methods/Classes/API                                                                              |
+   +==============+=======================================================================================================+
+   | OpenSCENARIO | **LightStateAction**                                                                                  |
+   +--------------+-------------------------------------------------------------------------------------------------------+
+   | mantle_api   | UpdateControlStrategies(FollowVelocitySplineControlStrategy)                                          |
+   +--------------+-------------------------------------------------------------------------------------------------------+
+   | openPASS     | SetStrategies(std::vector<std::shared_ptr<mantle_api::ControlStrategy>>)                              |
+   +--------------+-------------------------------------------------------------------------------------------------------+
+   | osi3         | osi3::TrafficAction::CustomAction                                                                     |
+   |              | CustomAction::command_type("UpdateLightState <LightType>")                                            |
+   |              | CustomAction::command("<LightState>")                                                                 |
+   +--------------+-------------------------------------------------------------------------------------------------------+
+
+SpeedAction
+-----------
+
+.. table::
+   :class: tight-table
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -182,7 +202,7 @@ SpeedAction
    |              | SetSpeed(IEntity, units::velocity::meters_per_second_t)                                               |
    |              | MovementDomain::kLongitudinal                                                                         |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | SetStrategies(MovementDomain::kLongitudinal, ControlStrategyType::kFollowVelocitySpline)              |
+   | openPASS     | SetStrategies(MovementDomain::kLongitudinal, ControlStrategyType::kFollowVelocitySpline)              |
    |              | ControlStrategies::HasNewLongitudinalStrategy()                                                       |
    |              | DynamicsScenarioImplementation::GetVelocityFromSplines()                                              |
    +--------------+-------------------------------------------------------------------------------------------------------+
@@ -192,11 +212,11 @@ SpeedAction
    +--------------+-------------------------------------------------------------------------------------------------------+
 
 TeleportAction
----------------
+--------------
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -209,7 +229,7 @@ TeleportAction
    |              | LaneLocationQueryService::GetUpwardsShiftedLanePosition(...)                                          |
    |              | LaneLocationQueryService::GetLaneIdsAtPosition(…)                                                     |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | RouteSampler::Sample(mantle_api::Vec3<units::length::meter_t>, units::angle::radian_t)                |
+   | openPASS     | RouteSampler::Sample(mantle_api::Vec3<units::length::meter_t>, units::angle::radian_t)                |
    |              | AgentInterface::SetPositionX(units::length::meter_t)                                                  |
    |              | AgentInterface::SetPositionY(units::length::meter_t)                                                  |
    |              | AgentInterface:SetYaw(units::angle::radian_t)                                                         |
@@ -218,11 +238,11 @@ TeleportAction
    +--------------+-------------------------------------------------------------------------------------------------------+
 
 TrafficSignalAction
---------------------
+-------------------
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -230,7 +250,7 @@ TrafficSignalAction
    +--------------+-------------------------------------------------------------------------------------------------------+
    | mantle_api   | SetTrafficSignalState(std::string name, std::string state)                                            |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | WorldData::GetTrafficSignIdMapping()                                                                  |
+   | openPASS     | WorldData::GetTrafficSignIdMapping()                                                                  |
    |              | WorldData::GetSignalType(Id)                                                                          |
    |              | WorldData::GetTrafficLight(Id)                                                                        |
    |              | ThreeSignalsTrafficLight::SetState(CommonTrafficLight::State)                                         |
@@ -242,11 +262,11 @@ TrafficSignalAction
    +--------------+-------------------------------------------------------------------------------------------------------+
 
 TrafficSignalStateAction
--------------------------
+------------------------
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -254,7 +274,7 @@ TrafficSignalStateAction
    +--------------+-------------------------------------------------------------------------------------------------------+
    | mantle_api   | SetTrafficSignalState(std::string name, std::string state)                                            |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | WorldData::GetTrafficSignIdMapping()                                                                  |
+   | openPASS     | WorldData::GetTrafficSignIdMapping()                                                                  |
    |              | WorldData::GetSignalType(Id)                                                                          |
    |              | WorldData::GetTrafficLight(Id)                                                                        |
    |              | ThreeSignalsTrafficLight::SetState(CommonTrafficLight::State)                                         |
@@ -266,11 +286,11 @@ TrafficSignalStateAction
    +--------------+-------------------------------------------------------------------------------------------------------+
 
 TrafficSinkAction
---------------------
+-----------------
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -281,7 +301,7 @@ TrafficSinkAction
    | mantle_api   | Entity::GetPosition()                                                                                 |
    |              | GeometryHelper::TranslateGlobalPositionLocally()                                                      |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | SpawnParameter                                                                                        |
+   | openPASS     | SpawnParameter                                                                                        |
    |              +-------------------------------------------------------------------------------------------------------+
    |              | AgentInterface::GetPositionX()                                                                        |
    |              | AgentInterface::GetPositionY()                                                                        |
@@ -295,7 +315,7 @@ VisibilityAction
 
 .. table::
    :class: tight-table
-   
+
    +--------------+-------------------------------------------------------------------------------------------------------+
    | API/Datatype | Used Methods/Classes/API                                                                              |
    +==============+=======================================================================================================+
@@ -303,7 +323,31 @@ VisibilityAction
    +--------------+-------------------------------------------------------------------------------------------------------+
    | mantle_api   | SetVisibility(EntityVisibilityConfig)                                                                 |
    +--------------+-------------------------------------------------------------------------------------------------------+
-   | openPASS	  | x -- not implemented                                                                                  |
+   | openPASS     | x -- not implemented                                                                                  |
    +--------------+-------------------------------------------------------------------------------------------------------+
    | osi3         | x -- not implemented                                                                                  |
    +--------------+-------------------------------------------------------------------------------------------------------+
+
+LightStateAction
+----------------
+
+.. table::
+   :class: tight-table
+
+   +--------------+-------------------------------------------------------------------------------------------------------+
+   | API/Datatype | Used Methods/Classes/API                                                                              |
+   +==============+=======================================================================================================+
+   | OpenSCENARIO | **LightStateAction**                                                                                  |
+   +--------------+-------------------------------------------------------------------------------------------------------+
+   | mantle_api   | UpdateControlStrategies(VehicleLightStatesControlStrategy)                                            |
+   |              | MovementDomain::kNone                                                                                 |
+   +--------------+-------------------------------------------------------------------------------------------------------+
+   | openPASS     | Entity::SetVehicleLightState(mantle_api::LightState, mantle_api::LightType)                           |
+   +--------------+-------------------------------------------------------------------------------------------------------+
+   | osi3         | osi3::TrafficAction_CustomAction                                                                      |
+   +--------------+-------------------------------------------------------------------------------------------------------+
+
+.. note::
+
+   Currently only indicatorLeft, indicatorRight and warningLights of OpenSCENARIO VehicleLightType are supported in openPASS.
+   OpenSCENARIO LightStateAction attribute, transitionTime is not received from the OSE
diff --git a/doc/source/advanced_topics/simulator/simulation.rst b/doc/source/advanced_topics/simulator/simulation.rst
index f7b0015facaf00b728783a071d6cc888cecf6335..beeaa7486da5ce1234238af470c9a07d7ea0a612 100644
--- a/doc/source/advanced_topics/simulator/simulation.rst
+++ b/doc/source/advanced_topics/simulator/simulation.rst
@@ -1,6 +1,7 @@
 ..
   *******************************************************************************
   Copyright (c) 2021 in-tech GmbH
+                2024 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
@@ -24,6 +25,8 @@ Unspecified arguments will be defaulted (*default values in []*).
 
 The simulation supports the following arguments:
 
+* *-\-clearResultsPath*: [false] :
+  If set, the results path will be cleared before the simulation starts.
 * *-\-logLevel* [0] :
   Logging level between 0 (minimum) and 5 (maximum - debug core)
 * *-\-logFile* [opSimulation.log]* :
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 9d563098d67442341b5667c642e3d075142badfd..2c83d9e7ac7317c2f2349bbb753cb63268e1958d 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -85,7 +85,6 @@ rst_epilog = """
 .. |zlib_version| replace:: v1.2.12
 .. |gtest_version| replace:: 1.14.0
 .. |boost_version| replace:: 1.72.0
-.. |qt_version| replace:: 5.15.3
 .. |doxygen_version| replace:: 1.9.6
 .. |gcc_version| replace:: 13.2.0
 .. |gdb_version| replace:: 13.2.0
diff --git a/doc/source/developer_information/30_coding_conventions.rst b/doc/source/developer_information/30_coding_conventions.rst
index e2689e6171e43d901eabea849b2320f1a538b2c6..565f581e4f9d6cd4b50bf66067e37db2d801d31a 100644
--- a/doc/source/developer_information/30_coding_conventions.rst
+++ b/doc/source/developer_information/30_coding_conventions.rst
@@ -1,6 +1,6 @@
 ..
   *******************************************************************************
-  Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+  Copyright (c) 2023-2024 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
@@ -133,7 +133,7 @@ Concise summarized Naming Conventions
 
  #. Autogenerated code does not need to follow the coding conventions
 
-    Example:: Signals/Slots (QT): ``void on_button_clicked();``
+    Example:: osi3: ``::osi3::DetectedEntityHeader* mutable_moving_object_header()``
 
 **Documentation**
 
@@ -260,7 +260,7 @@ Supported Version: 14.0.6
 
 To ensure code quality and adherence to coding standards, ClangTidy is recommended.
 
-The used checks are located in the :download:`.clang-tidy <@OP_REL_ROOT@/.clang-tidy>` file, where lines starting with ``-`` are checks that have been deactivated. 
+The used checks are located in the :download:`.clang-tidy <@OP_REL_ROOT@/.clang-tidy>` file, where lines starting with ``-`` are checks that have been deactivated.
 For more details, visit the `ClangTidy official page <https://clang.llvm.org/extra/clang-tidy/#using-clang-tidy>`_.
 
 Commit Message Guidelines
@@ -335,5 +335,5 @@ If the header files are from dependencies that are part of the `CMAKE_PREFIX_PAT
 If the header files are from project's repository then, use double quotes (`" ""`).
 
    .. code-block::
-      
+
       #include "my_component/header.h"
diff --git a/doc/source/developer_information/_static/custom_doc/CMakeLists_doc.cmake b/doc/source/developer_information/_static/custom_doc/CMakeLists_doc.cmake
index ec4f7f91e04b8d0a7b44e80ee3b29556c706cb0c..3675000b2b9dd56be36fc4775a4ed6daae1e18f1 100644
--- a/doc/source/developer_information/_static/custom_doc/CMakeLists_doc.cmake
+++ b/doc/source/developer_information/_static/custom_doc/CMakeLists_doc.cmake
@@ -28,7 +28,7 @@ if(WITH_DOC)
           ${CMAKE_BINARY_DIR}/doc             # destination path
           -DWITH_API_DOC=${WITH_API_DOC}      # turn exhale ON/OFF
           COMMENT "Build sphinx documentation"
-      COMMAND ${CMAKE_COMMAND} 
+      COMMAND ${CMAKE_COMMAND}
           -E cmake_echo_color --green
           "The HTML pages are in ${CMAKE_BINARY_DIR}/doc/html.")
 
@@ -37,5 +37,6 @@ if(WITH_DOC)
 
   # make HTML doc available on install
   install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/html/
-      DESTINATION ${CMAKE_INSTALL_PREFIX}/doc) 
+      DESTINATION ${CMAKE_INSTALL_PREFIX}/doc
+      MESSAGE_NEVER)
 endif()
diff --git a/doc/source/developer_information/ide_support/_static/vscode/config/linux/settings.json b/doc/source/developer_information/ide_support/_static/vscode/config/linux/settings.json
index f1d64241265fab1b27fb076c09a1bff583449022..6b65773aaadde949b237470865db3c480ca90a87 100644
--- a/doc/source/developer_information/ide_support/_static/vscode/config/linux/settings.json
+++ b/doc/source/developer_information/ide_support/_static/vscode/config/linux/settings.json
@@ -8,7 +8,6 @@
     "cmake.configureSettings": {
         // Adjust paths depending on your system
         "CMAKE_PREFIX_PATH": [
-            "/usr/lib/qt5/bin",
             "${workspaceFolder}/deps/thirdParty/linux64/Yase",
             "${workspaceFolder}/deps/scmThirdParty/linux64/stochastics",
             "${workspaceFolder}/deps/thirdParty/linux64/MantleAPI",
diff --git a/doc/source/index.rst b/doc/source/index.rst
index a5f2e82ea184e1e1152d56a7e26bb6525a20705d..8274eb7c280b171538fe308c9bf1acb99a3ff7bc 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -17,7 +17,7 @@ The openPASS (Open Platform for Assessment of Safety Systems) tool is a develope
 The simulation is based on a specific situation configuration and can contain several simulation runs, which differ due to random parameters.
 
 The software suite of openPASS started as a set of stand-alone applications, which can be installed and configured individually.
-Over time, especially the graphical user interface evolved to a single entry point, enabling the average user to use openPASS as a "monolithic" tool.
+In the future, the graphical user interface opGUI will evolve to a single entry point, enabling the average user to use openPASS as a "monolithic" tool.
 
 This guide contains information about installation, configuration and usage of all tools in the |Op| environment.
 
@@ -28,11 +28,6 @@ This guide contains information about installation, configuration and usage of a
 
    installation_guide/*
 
-.. TODO:: Update section for new react GUI.
-
-The GUI lets the user configure the simulation and generate configuration files from all set parameters.
-Based on these the simulation core calculates different simulation runs and compiles trace files for further processing.
-
 .. toctree::
    :caption: User Guides
    :glob:
diff --git a/doc/source/installation_guide/20_install_prerequisites.rst b/doc/source/installation_guide/20_install_prerequisites.rst
index 52e0e0049131d42b2c545b8c3d125225085841af..724c836fda267a5de56a2f814b67a51a1a12404e 100644
--- a/doc/source/installation_guide/20_install_prerequisites.rst
+++ b/doc/source/installation_guide/20_install_prerequisites.rst
@@ -54,7 +54,11 @@ Installing the Build Environment
       #. Install MSYS2
 
          Run the downloaded executable and adjust suggested settings to your needs (defaults are fine).
-         In the following, it is assumed that MSYS2 is installed under ``C:\msys64``.
+
+         .. admonition:: Installation Path
+
+            It is assumed that MSYS2 is installed in the directory ``C:\op\msys64``, as our CI scripts depend on this specific path.
+            If you choose to install MSYS2 in a different location, please ensure that you update any related configurations to reflect the new installation path, such as the conan profiles mentioned below."
 
       #. Understand the Build Environment
 
@@ -161,10 +165,7 @@ The first set of dependencies we need to install in order to successfully compil
             apt -y install googletest
             apt -y install graphviz
             apt -y install libboost-filesystem-dev
-            apt -y install libgmock-dev
-            apt -y install libgtest-dev
             apt -y install libprotobuf-dev
-            apt -y install libqt5xmlpatterns5-dev
             apt -y install libantlr4-runtime4.9
             apt -y install libantlr4-runtime-java
             apt -y install libantlr4-runtime-dev
@@ -174,11 +175,10 @@ The first set of dependencies we need to install in order to successfully compil
             apt -y install python3
             apt -y install python3-distutils
             apt -y install python3-pip
-            apt -y install qtbase5-dev
             apt -y install uuid-dev
 
             # python packages
-            pip3 install "approvaltests==3.1.0" empty-files "conan>2.0" watchdog 
+            pip3 install "approvaltests==3.1.0" empty-files "conan>2.0" watchdog
             pip3 install breathe exhale myst-parser "sphinx==7.2.6" sphinx-rtd-theme sphinx-tabs sphinxcontrib-spelling
 
 **EndToEnd Test Framework**
@@ -216,8 +216,8 @@ If you strictly follow the recommended paths of this guide, no command modificat
       - Recommended checkout path of |op| repository: ``~/openpass``
       - Dependency directory within the |op| repository: ``~/deps``
       - Recommended installation directory of |op|: ``/usr/local/openPASS/bin/core``
- 
-The above directory structure will be created by following the instructions of this guide. 
+
+The above directory structure will be created by following the instructions of this guide.
 
 #. Clone |Op| repository
 
@@ -228,8 +228,8 @@ The above directory structure will be created by following the instructions of t
       .. tab:: Windows
 
          Start |mingw_shell|
-         
-         .. code-block:: 
+
+         .. code-block::
 
             cd /C/
             git clone https://gitlab.eclipse.org/eclipse/openpass/opSimulation.git openpass
@@ -245,14 +245,14 @@ The above directory structure will be created by following the instructions of t
 
          Start ``Bash`` shell
 
-         .. code-block:: 
-         
+         .. code-block::
+
             cd ~
             git clone https://gitlab.eclipse.org/eclipse/openpass/opSimulation.git openpass
 
 #. Navigate into repository and checkout main branch
 
-   .. code-block:: 
+   .. code-block::
 
       cd openpass
       git checkout main
@@ -271,8 +271,11 @@ The above directory structure will be created by following the instructions of t
          conan remote list
          conan remote enable conancenter
 
-#. There are two Conan profiles ``conanprofile_linux`` and ``conanprofile_windows`` available in the ``utils/ci/conan/recipe`` folder.
-   The compiler version and the path to the MSYS installation in these profiles can be adjusted to suit your specific environment, if necessary.
+#. There are two Conan profiles ``conanprofile_linux`` and ``conanprofile_windows`` available in the ``utils/ci/conan/recipe`` folder, which will be automatically used in the next step.
+
+   .. admonition:: Adjustments
+
+      Check and adjust the compiler version and the path to the MSYS installation in these profiles before running the prepare scripts.
 
    .. note::
 
@@ -286,35 +289,42 @@ The above directory structure will be created by following the instructions of t
 
          #. One of the dependencies of |Op| is OpenScenarioEngine which requires OpenSCENARIO API and it in turn requires JAVA executable to build.
             If Java executable is not available on your machine, download the java from `here <https://cdn.azul.com/zulu/bin/zulu11.50.19-ca-jdk11.0.12-win_x64.zip>`_ and extract the zip file
-         
+
          #. If ``C:\Downloads\zulu`` is the extracted path, then add the variable JAVA_HOME to the environmental variable, and append the java executable path to the PATH environmental variable as below
-         
-            .. code-block:: 
+
+            .. code-block::
 
                export JAVA_HOME=/c/Downloads/zulu/
                export PATH=$PATH:/c/Downloads/zulu/bin
-         
-         #. The script ``15_prepare_thirdParty.sh`` also requires the variable PYTHON_WINDOWS_EXE set. This variable refers to the path of the python installation (For ex: It could be either on native Windows or on MSYS).
-            If the python is installed on MSYS then set the variable with the following command. 
 
-            .. code-block:: 
+         #. The script ``15_prepare_thirdParty.sh`` also requires the variable PYTHON_EXECUTABLE set. This variable refers to the path of the python installation (For example: It could be either on native Windows or on MSYS).
+            If the python is installed on MSYS then set the variable with the following command.
+
+            .. code-block::
 
-               export PYTHON_WINDOWS_EXE=python3
+               export PYTHON_EXECUTABLE=python3
 
          #. Execute the script ``15_prepare_thirdParty.sh`` on MSYS
 
-            .. code-block:: 
+            .. code-block::
 
                cd utils/ci/scripts
                ./15_prepare_thirdParty.sh
 
       .. tab:: Linux
 
+         #. The script ``15_prepare_thirdParty.sh`` also requires the variable PYTHON_EXECUTABLE set. This variable refers to the path of the python installation.
+
+            .. code-block::
+
+               export PYTHON_EXECUTABLE=python3
+
+
          #. Execute the script
 
-            .. code-block:: 
+            .. code-block::
 
                cd utils/ci/scripts
                ./15_prepare_thirdParty.sh
 
-#. Upon successful execution of the script, the dependencies will be installed under ``C:\deps`` on Windows and  ``~/deps`` on Linux.
\ No newline at end of file
+#. Upon successful execution of the script, the dependencies will be installed under ``C:\deps`` on Windows and  ``~/deps`` on Linux.
diff --git a/doc/source/installation_guide/30_install_openpass.rst b/doc/source/installation_guide/30_install_openpass.rst
index cc937ccc459ac6f1255eb3caa202372012f08f76..2930afb30c8edec8d751598b310c8c604c2c118c 100644
--- a/doc/source/installation_guide/30_install_openpass.rst
+++ b/doc/source/installation_guide/30_install_openpass.rst
@@ -16,12 +16,12 @@ Installing openPASS
 ===================
 
 This section describes how to compile and run |op|. Please make sure that all prerequisites have been properly installed according to section :ref:`Prerequisites`.
-If you have strictly followed the instructions, the installed dependencies should be located on your machine under 
-``C:\deps`` on **Windows** and ``~/deps`` on **Linux**. If there is a path deviation, 
+If you have strictly followed the instructions, the installed dependencies should be located on your machine under
+``C:\deps`` on **Windows** and ``~/deps`` on **Linux**. If there is a path deviation,
 the following commands must be adjusted.
 
 .. note::
-   
+
    If you are unfamiliar to ``CMake`` or working within a |mingw_shell|, Section :ref:`cmake` and :ref:`MSYS2 <msys2>` might give you a short introduction on these topics in the scope of building |op| itself.
 
 #. Navigate back into repository
@@ -30,37 +30,37 @@ the following commands must be adjusted.
 
       .. tab:: Windows
 
-         .. code-block:: 
+         .. code-block::
 
             cd /C/openpass
 
       .. tab:: Linux
 
-         .. code-block:: 
-      
+         .. code-block::
+
             cd ~/openpass
 
 #. Create build directory and navigate into it
 
-   .. code-block:: 
-      
+   .. code-block::
+
       mkdir build
       cd build
 
 #. Prepare build
 
-   |Op| links against shared libraries, which are located in the paths specified by ``CMAKE_PREFIX_PATH``. 
-   To be able to install |Op| with resolved dependencies, all libraries found under the paths have to be copied right next to the executable during the installation step. 
-   This is done by setting ``INSTALL_EXTRA_RUNTIME_DEPS=ON``. If you have followed the instructions strictly, no changes are necessary. 
+   |Op| links against shared libraries, which are located in the paths specified by ``CMAKE_PREFIX_PATH``.
+   To be able to install |Op| with resolved dependencies, all libraries found under the paths have to be copied right next to the executable during the installation step.
+   This is done by setting ``INSTALL_EXTRA_RUNTIME_DEPS=ON``. If you have followed the instructions strictly, no changes are necessary.
 
    .. tabs::
 
       .. tab:: Windows
 
-         .. code-block:: 
+         .. code-block::
 
             cmake -G "MSYS Makefiles" \
-            -D CMAKE_PREFIX_PATH="C:/deps/direct_deploy/fmilibrary;C:/deps/direct_deploy/open-simulation-interface;C:/deps/direct_deploy/protobuf;C:/deps/direct_deploy/protobuf-shared;C:/deps/direct_deploy/units;C:/deps/direct_deploy/mantleapi;C:/deps/direct_deploy/yase;C:/deps/direct_deploy/openscenario_api;C:/deps/direct_deploy/openscenario_engine;C:/deps/direct_deploy/gtest;C:/deps/direct_deploy/boost;C:/deps/direct_deploy/qt;C:/deps/direct_deploy/minizip;C:/deps;C:/msys64/mingw64/bin;" \
+            -D CMAKE_PREFIX_PATH="C:/deps/direct_deploy/fmilibrary;C:/deps/direct_deploy/open-simulation-interface;C:/deps/direct_deploy/protobuf;C:/deps/direct_deploy/protobuf-shared;C:/deps/direct_deploy/units;C:/deps/direct_deploy/mantleapi;C:/deps/direct_deploy/yase;C:/deps/direct_deploy/openscenario_api;C:/deps/direct_deploy/openscenario_engine;C:/deps/direct_deploy/gtest;C:/deps/direct_deploy/boost;C:/deps/direct_deploy/minizip;C:/deps;C:/msys64/mingw64/bin;" \
             -D CMAKE_INSTALL_PREFIX=C:/openPASS/bin/core \
             -D CMAKE_BUILD_TYPE=Release \
             -D USE_CCACHE=ON \
@@ -76,9 +76,9 @@ the following commands must be adjusted.
 
       .. tab:: Linux
 
-         .. code-block:: 
+         .. code-block::
 
-            cmake -D CMAKE_PREFIX_PATH="$HOME/deps/fmilibrary;$HOME/deps/open-simulation-interface;$HOME/deps/protobuf;$HOME/deps/protobuf-shared;$HOME/deps/units;$HOME/deps/mantleapi;$HOME/deps/yase;$HOME/deps/openscenario_api;$HOME/deps/openscenario_engine;$HOME/deps/gtest;$HOME/deps/boost;$HOME/deps/qt;$HOME/deps/minizip;C:/deps" \
+            cmake -D CMAKE_PREFIX_PATH="$HOME/deps/fmilibrary;$HOME/deps/open-simulation-interface;$HOME/deps/protobuf;$HOME/deps/protobuf-shared;$HOME/deps/units;$HOME/deps/mantleapi;$HOME/deps/yase;$HOME/deps/openscenario_api;$HOME/deps/openscenario_engine;$HOME/deps/gtest;$HOME/deps/boost;$HOME/deps/minizip;C:/deps" \
             -D CMAKE_INSTALL_PREFIX=/usr/local/openPASS/bin/core \
             -D CMAKE_BUILD_TYPE=Release \
             -D USE_CCACHE=ON \
@@ -87,22 +87,22 @@ the following commands must be adjusted.
             -D INSTALL_EXTRA_RUNTIME_DEPS=ON \
             ..
 
-         .. note:: 
-         
+         .. note::
+
           - To install in the mentioned CMAKE_INSTALL_PREFIX path, create ``openPASS`` folder under ``/usr/local`` using ``sudo mkdir /usr/local/openPASS``
             And for the user to access the folder, modify the permissions using ``sudo chown <uesrname>:<username> /usr/local/openPASS``
           - By specifying ``INSTALL_EXTRA_RUNTIME_DEPS=ON``, runtime dependencies will be copied to the installation directory when running ``make install``. This applies to all dependencies located in the paths specified in ``CMAKE_PREFIX_PATH``.
           - If you need to adjust paths and options based on your system and needs, you need to pay attention on quotations ``" "``, when using it in console (see :ref:`Cmake_prefix_path`).
             And also you need to be careful with it when you configuring it under VSCode (see :ref:`vscode`).
-   
+
    .. note:: For a build that goes beyond the default settings, see :ref:`Cmake` for more available variables and options that can be set.
-             
+
 
 #. Optional: Build and execute unit tests
 
    Starting from ``openpass/build``:
 
-   .. code-block:: 
+   .. code-block::
 
       make test ARGS="--output-on-failure -j3"
 
@@ -115,7 +115,7 @@ the following commands must be adjusted.
 
    Starting from ``openpass/build``:
 
-   .. code-block:: 
+   .. code-block::
 
       make doc
 
@@ -125,7 +125,7 @@ the following commands must be adjusted.
 
    Starting from ``openpass/build``:
 
-   .. code-block:: 
+   .. code-block::
 
       make -j3 install
 
diff --git a/doc/source/installation_guide/60_conan.rst b/doc/source/installation_guide/60_conan.rst
index 1caf8fdf428ce60e5f5ef94fe884fd93c7e8b7e7..10a81809561e391500e9aa219f954e4a1d4f0433 100644
--- a/doc/source/installation_guide/60_conan.rst
+++ b/doc/source/installation_guide/60_conan.rst
@@ -35,13 +35,13 @@ To be able to work with Conan it is necessary to add additional packages.
 
       .. code-block:: bash
 
-         pip install "conan>2.0"
+         pip install "conan>=2.2.0"
 
    .. tab:: Linux (Debian Bookworm)
 
       .. code-block:: bash
 
-         apt install "conan>2.0"
+         apt install "conan>=2.2.0"
 
    pip install "conan>2.0"
 
diff --git a/doc/source/installation_guide/_static/msys2_packages.txt b/doc/source/installation_guide/_static/msys2_packages.txt
index b2f33143e0a5ac7967d3f90f52562c9050b7a41e..f08ba5d326f0ef4a0d7f294b86d2328e599f7342 100644
--- a/doc/source/installation_guide/_static/msys2_packages.txt
+++ b/doc/source/installation_guide/_static/msys2_packages.txt
@@ -1,16 +1,14 @@
 pacman -S  \
-    `# for simulator` \
-    mingw-w64-x86_64-boost \
+    `# for building and running the simulator` \
+    make \
     mingw-w64-x86_64-ccache \
     mingw-w64-x86_64-cmake \
     mingw-w64-x86_64-doxygen \
     mingw-w64-x86_64-gcc \
     mingw-w64-x86_64-gdb \
     mingw-w64-x86_64-graphviz \
-    mingw-w64-x86_64-gtest \
     mingw-w64-x86_64-make \
-    mingw-w64-x86_64-qt5-base \
-    mingw-w64-x86_64-qt5-xmlpatterns \
+    patch \
     `# for documentation` \
     mingw-w64-x86_64-python \
     mingw-w64-x86_64-python-pip \
diff --git a/doc/source/other_information/10_external_dependencies.rst b/doc/source/other_information/10_external_dependencies.rst
index c2399da1754fd4b5593bf2110dca3b245a30b6ad..2a32b894225186947f3942e0a34f6b21a59a51cd 100644
--- a/doc/source/other_information/10_external_dependencies.rst
+++ b/doc/source/other_information/10_external_dependencies.rst
@@ -1,6 +1,6 @@
 ..
   *******************************************************************************
-  Copyright (c) 2021-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+  Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
                 2023 Mercedes-Benz Tech Innovation GmbH
 
   This program and the accompanying materials are made available under the
@@ -82,18 +82,6 @@ Documentation is created using `Doxygen <https://www.doxygen.nl/index.html>`_.
    - Doxygen introduced support for Markdown with 1.8, which is still in use.
       Don't use older versions.
 
-Qt Framework
-~~~~~~~~~~~~
-
-Version (officially supported): |qt_version|
-
-|Op| uses some features from the `Qt <https://www.qt.io/>`_ framework.
-A previous version of the GUI of |op| relied on Qt. |Op| itself tries to stick to the C++ standard framework as far as possible, but still uses the Qt framework for some tasks, e.g. xml parsing.
-
-.. admonition:: Note on Versions
-
-   | Versions starting from 5.4 should generally work, but are not officially supported anymore/yet.
-
 Boost C++ Libraries
 ~~~~~~~~~~~~~~~~~~~
 
diff --git a/doc/source/requirements.txt b/doc/source/requirements.txt
index e25cb60a20d3c026231f7fea31e44d8d7566b74c..4f0cfcdb54bde4dc5d7942b58b925a4e4d53ea80 100644
--- a/doc/source/requirements.txt
+++ b/doc/source/requirements.txt
@@ -1,6 +1,6 @@
 breathe
 exhale
 sphinx==7.2.6
-sphinx-rtd-theme
+sphinx-rtd-theme<3
 sphinx-tabs
-sphinxcontrib-spelling
\ No newline at end of file
+sphinxcontrib-spelling
diff --git a/doc/source/user_guide/10_overview.rst b/doc/source/user_guide/10_overview.rst
index 666221b1274c26d74227b8c96d5576e122f5c66e..51c01a09f7e3e3e6bd689af1161bd67b64c46d4b 100644
--- a/doc/source/user_guide/10_overview.rst
+++ b/doc/source/user_guide/10_overview.rst
@@ -25,8 +25,8 @@ Let’s have a look at what that means:
 
 1. PCM Simulations: “Crash re-simulations”
 
-  * PCM of GIDAS: PreCrash Matrix from the database of the German In-Depth Accident Study
-  * Re simulate real crashes from the past, but with cars having ADAS or AD functions and asses if the tested technology would have improved the safety.
+  * PCM of GIDAS: PreCrash Matrix with trajectories from the database of the German In-Depth Accident Study
+  * Re-simulate real crashes from the past, but with cars having ADAS or AD functions and assess if the tested technology would have improved the safety.
 
 2. (Traffic-)scenario based simulations
 
diff --git a/doc/source/user_guide/outputs/observation_log.rst b/doc/source/user_guide/outputs/observation_log.rst
index 48c2021da9f1e4b4d27abd6021a07a6b3315d766..cc1afc5270972461097a379ae7efac254ebd39b5 100644
--- a/doc/source/user_guide/outputs/observation_log.rst
+++ b/doc/source/user_guide/outputs/observation_log.rst
@@ -57,7 +57,7 @@ The world publishes the following cyclics (see source of ``AgentNetwork.cpp``):
                                                Longitudinal refers to the angle of the vehicle regardless of the curvature of the road it is on.
    YawAngle               Double         rad   Yaw angle w.r.t. x-axis
    YawRate                Double         rad/s Yaw rate of the agent
-   SteeringAngle          Double         rad   Steering wheel angle
+   SteeringWheelAngle     Double         rad   Steering wheel angle
    TotalDistanceTraveled  Double         m     Total traveled distance of all agents
    PositionRoute\*        Double         m     Position of the agent's front center in **road's** s coordinate
                                                (distance to the start of the road)
@@ -100,12 +100,12 @@ The component AgentUpdater publishes the following cyclics (see source of ``agen
 
 The component Dynamics_RegularDriving publishes the following cyclics (see source of ``regularDriving.cpp``):
 
-   ============= ====== ==== ===========================
+   ============= ====== ==== ==============================
    Cyclics       Type   Unit Description
-   ============= ====== ==== ===========================
+   ============= ====== ==== ==============================
    EngineMoment  Double Nm   Torque of the engine
-   SteeringAngle Double rad  Angle of the steering wheel
-   ============= ====== ==== ===========================
+   SteeringAngle Double rad  Steering angle of front wheels
+   ============= ====== ==== ==============================
 
 The component Sensor_Driver publishes the following cyclics (see source of ``sensor_driverImpl.cpp``):
 
@@ -146,17 +146,17 @@ SimulationOutput
 
 Every successful run (single experiment) generates a single file, normally called ``simulationOutput.xml`` (see :ref:'observationlog_parameterization').
 The output can contain multiple invocations of the same configuration with different random seeds.
-For each invocation a RunResult is stored, which contains information about the agents and their parameters.
+For each invocation a RunResult is stored, which contains information about the random seed, run id, the agents and their parameters.
 As well as run specific events and parameters.
 
 .. code-block:: xml
 
    <SimulationOutput>
        <RunResults>
-           <RunResult RunId="0">
+           <RunResult RunId="0" RandomSeed="5673465">
                ...
            </RunResult>
-           <RunResult RunId="1">
+           <RunResult RunId="1" RandomSeed="2634474">
                ...
            </RunResult>
        </RunResults>
@@ -164,34 +164,10 @@ As well as run specific events and parameters.
 
 The RunResult consist out of the following parts:
 
-- :ref:`observationlog_runstatistics`
 - :ref:`observationlog_events`
 - :ref:`observationlog_agents`
 - :ref:`observationlog_cyclics`
 
-.. _observationlog_runstatistics:
-
-RunStatistics
--------------
-
-This section contains the RandomSeed and general statistics of the invocation.
-
-.. table::
-   :class: tight-table
-
-   ======================= ==================================================================
-   Tag                     Description
-   ======================= ==================================================================
-   RandomSeed              Random seed used for this invocation
-   VisibilityDistance      Visibility distance of the world
-   StopReason              Displays the reason why the simulation stopped.
-                           Currently only due to time out.
-   StopTime                Currently not used and set to -1
-   EgoAccident             Flag which shows whether the ego agent was involved in an accident
-   TotalDistanceTraveled   Total traveled distance of all agents
-   EgoDistanceTraveled     Total traveled distance of ego vehicle only
-   ======================= ==================================================================
-
 .. _observationlog_events:
 
 Events
diff --git a/doc/source/user_guide/sim_user_guide/components/vehicle.rst b/doc/source/user_guide/sim_user_guide/components/vehicle.rst
index 2d2f6e6c29cf7777574d1015d6f9e9aafd893224..9c77b8cec14e13723d7311afffdf2db77622c0cf 100644
--- a/doc/source/user_guide/sim_user_guide/components/vehicle.rst
+++ b/doc/source/user_guide/sim_user_guide/components/vehicle.rst
@@ -223,6 +223,9 @@ The allowed special simulation values are as follows:
                                                                 This directory is not necessarily created by the FmuWrapper, depending on the setting of
                                                                 `CsvOutput` and `Logging` parameters (see `FmuWrapper basic configuration`_).
    MaxSteering                               Real               The `max_steering` property of an agent's front axle as defined in OpenSCENARIO (catalog).
+   AxleRatio                                 Real               The axle ratio of the vehicle model.
+                                                                Has to be defined in the properties of the Entity in the OpenSCENARIO catalog with the name
+                                                                ``AxleRatio`` and the value has to be a valid floating point expression.
    SteeringRatio                             Real               The steering ratio of the vehicle model.
                                                                 Has to be defined in the properties of the Entity in the OpenSCENARIO catalog with the name
                                                                 ``SteeringRatio`` and the value has to be a valid floating point expression.
@@ -599,7 +602,7 @@ Components of this group can be used to model the vehicle dynamics. The vehicle
    ================================  ==================================================================================================================================================================
    :ref:`components_steeringsystem`  The steering model transfers the driver's input into the vehicle's wheel angle
    :ref:`components_powertrain`      The powertrain model converts the accelerator pedal position into wheel drive torques, under consideration of the selected gear
-   :ref:`components_brakesystem`     The brake model converts the brake pedal position into wheel brake torques 
+   :ref:`components_brakesystem`     The brake model converts the brake pedal position into wheel brake torques
    :ref:`components_tiremodel`       The tire model converts the predetermined drive and braking torques of the tires into tire longitudinal and lateral forces, under consideration of the wheel angles
    :ref:`components_motionmodel`     The motion model calculates the translational and rotational vehicle movement with the calculated tire forces
    :ref:`components_chassismodel`    The chassis model determines the dynamic wheel loads via the vehicle's longitudinal and lateral acceleration
@@ -619,7 +622,7 @@ The following figure gives an overview of the driving dynamics components and th
 ActionSteeringSystem
 ^^^^^^^^^^^^^^^^^^^^
 
-The steering model obtains the "SteeringRatio" property from the :ref:`scenario_vehiclemodels` and uses it to calculate the steering angle of the front wheels. 
+The steering model obtains the "SteeringRatio" property from the :ref:`scenario_vehiclemodels` and uses it to calculate the steering angle of the front wheels.
 Both wheels are turned at the same angle. The following parameter can be used to set a static toe and the steering elasticity:
 
 .. table::
@@ -697,7 +700,7 @@ The model considers a response time [ms] and linear factors [m/s³] for the incr
    ============================ ====== ==== ==============================================================================================================
 
 
-The maximum braking force of the system is determined from the maximum possible deceleration and the mass of the vehicle and is scaled by the brake pedal position (Input). 
+The maximum braking force of the system is determined from the maximum possible deceleration and the mass of the vehicle and is scaled by the brake pedal position (Input).
 The maximum possible deceleration and the vehicle mass are obtained from the :ref:`scenario_vehiclemodels` ("maxDeceleration" & "mass").
 
 .. math::
@@ -726,7 +729,7 @@ The chassis model determines the vertical forces of the four wheels from the lon
    Attribute                    Type         Unit Description
    ============================ ============ ==== ==============================================================================================================
    SpringCoefficient            VectorDouble N/m  Constant spring coefficient for each axis
-   DamperCoefficient            VectorDouble Ns/m Constant damper coefficient for each axis 
+   DamperCoefficient            VectorDouble Ns/m Constant damper coefficient for each axis
    ============================ ============ ==== ==============================================================================================================
 
 .. _components_tiremodel:
@@ -771,15 +774,15 @@ The tire model is freely configurable and includes a degressive behaviour. The t
 The normalized factors refer to the reference vertical force or to the double reference vertical force
 The input variables used by the model are tire drive and braking torques as well as the wheel angles and vertical wheel forces. All data is provided as vectors.
 The model determines tire forces in the longitudinal and lateral directions as well as the wheel self aligning torques. The wheel self aligning torque is formed from the product of the tire side force and the pneumatic trail.
-A linear interpolation is performed between the values for the reference force and the double reference force. If no degressive tire behavior is desired, the parameters for the double reference force must be set identically to the values for the reference force. 
+A linear interpolation is performed between the values for the reference force and the double reference force. If no degressive tire behavior is desired, the parameters for the double reference force must be set identically to the values for the reference force.
 
 All forces are scaled with the coefficient of friction from the :ref:`scenario_vehiclemodels` ("FrictionCoefficient").
 
 All further information about the model can be found in the following sources:
 
-https://www.tmeasy.de/ 
+https://www.tmeasy.de/
 
-Rill, Georg. (2013). TMeasy -- A Handling Tire Model based on a three-dimensional slip approach. 
+Rill, Georg. (2013). TMeasy -- A Handling Tire Model based on a three-dimensional slip approach.
 
 
 .. _components_motionmodel:
@@ -791,4 +794,4 @@ which indicates the distance of the center of gravity to the center of the rear
 
 For the equations of motion, see relevant vehicle dynamics books such as:
 
-Kücükay, Ferit (2022), "Grundlagen der Fahrzeugtechnik", page 1067 ff
\ No newline at end of file
+Kücükay, Ferit (2022), "Grundlagen der Fahrzeugtechnik", page 1067 ff
diff --git a/doc/source/user_guide/tutorials/10_scenario_simulation.rst b/doc/source/user_guide/tutorials/10_scenario_simulation.rst
index ce3c8b850da9d1f90bf4b557a3352a0643ea2bc7..14b2f2dd11303f472f1918eb243b9a6f0e41d88b 100644
--- a/doc/source/user_guide/tutorials/10_scenario_simulation.rst
+++ b/doc/source/user_guide/tutorials/10_scenario_simulation.rst
@@ -24,9 +24,7 @@ The ego vehicle is equipped with an AEB system (the system under test).
 The scenario agent performs a cut-in and triggers as a result the AEB system of the ego agent. 
 To force this exact maneuver, the scenario agent is set up to follow a predefined trajectory.
 
-.. TODO:: Update this paragraph for the new react GUI.
-
-The GUI is not yet capable of configuring and executing a scenario based simulation as this is currently work in progress. 
+The opGUI is not yet capable of configuring and executing a scenario based simulation as this is currently work in progress. 
 Thus, an existing simulation configuration is used and the simulation is started manually.
 
 **Step-by-step instructions**
@@ -69,7 +67,7 @@ Thus, an existing simulation configuration is used and the simulation is started
                 
         ii. Navigate to the directory ``examples/Configurations``. Here, all folders contain special pre-configured simulations (which either can be used as demo cases or as end-to-end test cases primarily used for development). 
 
-        iii. Copy all files from the directory specifying the specific scenario you want to simulate (in our case all files from directory ``examples/Configurations/AEB_CutIn``) to the directory ``configs``. Overwrite existing files when prompted. 
+        iii. Copy all files from the directory specifying the specific scenario you want to simulate (in our case all files from directory ``examples/Configurations/AEB_CutIn``) to the directory ``configs``. Overwrite existing files when prompted. The catalogs for vehicles or pedestrian parameters must be stored in a child folder ``Vehicles``.
 
     .. note::
 
@@ -82,13 +80,14 @@ Thus, an existing simulation configuration is used and the simulation is started
     ::
 
         configs
-        ├── PedestrianModelsCatalog.xosc
+        ├── Vehicles
+        │   ├── VehicleModelsCatalog.xosc
+        │   └── PedestrianModelsCatalog.xosc
         ├── ProfilesCatalog.xml
         ├── Scenario.xosc
         ├── SceneryConfiguration.xodr
         ├── simulationConfig.xml
-        ├── systemConfigBlueprint.xml
-        └── VehicleModelsCatalog.xosc
+        └── systemConfigBlueprint.xml
 
 
    As an example, modifications of the configuration files that describe an AEB cut-in scenario are given.
diff --git a/doc/source/user_guide/tutorials/20_pcm_simulation.rst b/doc/source/user_guide/tutorials/20_pcm_simulation.rst
index 4b4b060eb7d960ae3929f9f604acde2a543a6198..63d18196bc4dc802ee274157be8100c2fecdd8e7 100644
--- a/doc/source/user_guide/tutorials/20_pcm_simulation.rst
+++ b/doc/source/user_guide/tutorials/20_pcm_simulation.rst
@@ -15,4 +15,4 @@ PCM Simulation
 ==============
 
 .. todo::
-   Write tutorial for PCM simulation
\ No newline at end of file
+   Include link and explaination to opGUI documentation how to run PCM simulations
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 7a2efa83bbb6575dddefb3febfd9906e583cd311..1351624bb4b8660515e542bad3b2ec959a95c6bf 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-conan>2.0
+conan>=2.2.0
 
 # Install doc requirements
 -r doc/source/requirements.txt
diff --git a/scenario_api_support.md b/scenario_api_support.md
index 645029175b14578339fe1cfabee1b1b2431a4612..3948e459f7be2060204637022b5243950b3b15ef 100644
--- a/scenario_api_support.md
+++ b/scenario_api_support.md
@@ -30,6 +30,8 @@
 | ExecuteCustomCommand              | ✔️ Implemented                                      |
 | SetUserDefinedValue               | ❌ Not yet implemented                              |
 | GetUserDefinedValue               | ❌ Not yet implemented (always returns nullopt)     |
+| SetVariable                       | ❌ Not yet implemented                             |
+| GetVariable                       | ❌ Not yet implemented (always returns nullopt)    |
 | ----------------------------------| ---------------------------------------------------|
 
 # ICoordConverter
diff --git a/schemas/simulationOutput.xsd b/schemas/simulationOutput.xsd
index 8a65d47fb47582d6790eb28e0d074d2910f0563f..4ec08eb6687ecb6fbbf17b63fbc76d013e82e451 100644
--- a/schemas/simulationOutput.xsd
+++ b/schemas/simulationOutput.xsd
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
     <xs:element name="SimulationOutput">
         <xs:complexType>
             <xs:sequence>
@@ -21,34 +21,14 @@
     <xs:element name="RunResult">
         <xs:complexType>
             <xs:all>
-                <xs:element ref="RunStatistics"/>
                 <xs:element ref="Events"/>
                 <xs:element ref="Agents"/>
                 <xs:element ref="Cyclics"/>
             </xs:all>
             <xs:attribute type="xs:nonNegativeInteger" name="RunId"/>
+            <xs:attribute type="xs:nonNegativeInteger" name="RandomSeed"/>
         </xs:complexType>
     </xs:element>
-    <xs:element name="RunStatistics">
-        <xs:complexType>
-            <xs:all>
-                <xs:element ref="RandomSeed"/>
-                <xs:element ref="VisibilityDistance"/>
-                <xs:element ref="StopReason"/>
-                <xs:element ref="StopTime"/>
-                <xs:element ref="EgoAccident"/>
-                <xs:element ref="TotalDistanceTraveled"/>
-                <xs:element ref="EgoDistanceTraveled"/>
-            </xs:all>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="RandomSeed" type="xs:integer"/>
-    <xs:element name="VisibilityDistance" type="xs:double"/>
-    <xs:element name="StopReason" type="xs:string"/>
-    <xs:element name="StopTime" type="xs:integer"/>
-    <xs:element name="EgoAccident" type="xs:string"/>
-    <xs:element name="TotalDistanceTraveled" type="xs:double"/>
-    <xs:element name="EgoDistanceTraveled" type="xs:double"/>
     <xs:element name="Events">
         <xs:complexType>
             <xs:sequence>
diff --git a/sim/contrib/examples/Common/systemConfigBlueprint.xml b/sim/contrib/examples/Common/systemConfigBlueprint.xml
index 4916d86c6e958bb6297899b687e2c49c79f4e8be..496552ed1898b4a07431732d821d4b381bb2b493 100755
--- a/sim/contrib/examples/Common/systemConfigBlueprint.xml
+++ b/sim/contrib/examples/Common/systemConfigBlueprint.xml
@@ -332,6 +332,24 @@
                         <unit/>
                         <value>0</value>
                     </parameter>
+                    <parameter>
+                        <id>1</id>
+                        <type>int</type>
+                        <unit/>
+                        <value>1</value>
+                    </parameter>
+                    <parameter>
+                        <id>2</id>
+                        <type>int</type>
+                        <unit/>
+                        <value>2</value>
+                    </parameter>
+                    <parameter>
+                        <id>3</id>
+                        <type>int</type>
+                        <unit/>
+                        <value>3</value>
+                    </parameter>
                 </parameters>
             </component>
             <component>
@@ -748,6 +766,17 @@
                     <input>0</input>
                 </target>
             </connection>
+            <connection>
+                <id>7119</id>
+                <source>
+                    <component>FMU1</component>
+                    <output>5</output>
+                </source>
+                <target>
+                    <component>PrioritizerTurningIndicator</component>
+                    <input>1</input>
+                </target>
+            </connection>
             <connection>
                 <id>7201</id>
                 <source>
@@ -781,6 +810,17 @@
                     <input>1</input>
                 </target>
             </connection>
+            <connection>
+                <id>7219</id>
+                <source>
+                    <component>FMU2</component>
+                    <output>5</output>
+                </source>
+                <target>
+                    <component>PrioritizerTurningIndicator</component>
+                    <input>2</input>
+                </target>
+            </connection>
             <connection>
                 <id>7301</id>
                 <source>
@@ -814,6 +854,17 @@
                     <input>2</input>
                 </target>
             </connection>
+            <connection>
+                <id>7319</id>
+                <source>
+                    <component>FMU3</component>
+                    <output>5</output>
+                </source>
+                <target>
+                    <component>PrioritizerTurningIndicator</component>
+                    <input>3</input>
+                </target>
+            </connection>
             <connection>
                 <id>7401</id>
                 <source>
diff --git a/sim/contrib/examples/Configurations/ADAS_Static_AEB_PreventingCollisionWithObstacle/Agent_AEB.xml b/sim/contrib/examples/Configurations/ADAS_Static_AEB_PreventingCollisionWithObstacle/Agent_AEB.xml
index e5ef7252555c767a26cd542c75af19c1f3af5278..db22a88a8df78517e86b5d9e0d26c163898c4da7 100644
--- a/sim/contrib/examples/Configurations/ADAS_Static_AEB_PreventingCollisionWithObstacle/Agent_AEB.xml
+++ b/sim/contrib/examples/Configurations/ADAS_Static_AEB_PreventingCollisionWithObstacle/Agent_AEB.xml
@@ -266,28 +266,28 @@
         <parameters>
           <parameter>
             <!--parameter's title: CollisionDetectionLongitudinalBoundary-->
-            <id>0</id>
+            <id>CollisionDetectionLongitudinalBoundary</id>
             <type>double</type>
             <unit>m</unit>
             <value>4</value>
           </parameter>
           <parameter>
             <!--parameter's title: CollisionDetectionLateralBoundary-->
-            <id>1</id>
+            <id>CollisionDetectionLateralBoundary</id>
             <type>double</type>
             <unit>m</unit>
             <value>1.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: TTC-->
-            <id>2</id>
+            <id>TTC</id>
             <type>double</type>
             <unit>s</unit>
             <value>1.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Acceleration-->
-            <id>3</id>
+            <id>Acceleration</id>
             <type>double</type>
             <unit>m/s^2</unit>
             <value>-8</value>
@@ -364,9 +364,7 @@
 		  <type>double</type>
 		  <!-- <title>Latency</title> -->
 		  <unit>s</unit>
-		  <value>
-		   0
-		  </value>
+		  <value>0</value>
 		 </parameter>
           <parameter>
             <!--parameter's title: OpeningAngleH-->
diff --git a/sim/contrib/examples/Configurations/LightStateAction/Scenario.xosc b/sim/contrib/examples/Configurations/LightStateAction/Scenario.xosc
new file mode 100644
index 0000000000000000000000000000000000000000..973936592f4617b2279057d3dee03ecdfb940073
--- /dev/null
+++ b/sim/contrib/examples/Configurations/LightStateAction/Scenario.xosc
@@ -0,0 +1,155 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<OpenSCENARIO>
+  <FileHeader revMajor="1" revMinor="1" date="2020-06-26T00:17:00" description="openPASS default scenario" author="in-tech GmbH"/>
+  <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="Ego">
+      <CatalogReference catalogName="VehicleCatalog" entryName="car_mini_cooper"/>
+      <ObjectController>
+        <Controller name="Ego">
+          <Properties>
+            <Property name="AgentProfile" value="MiddleClassCarAgent"/>
+          </Properties>
+        </Controller>
+      </ObjectController>
+    </ScenarioObject>
+  </Entities>
+  <Storyboard>
+    <Init>
+      <Actions>
+        <Private entityRef="Ego">
+          <PrivateAction>
+            <TeleportAction>
+              <Position>
+                <LanePosition roadId="1" laneId="-1" offset="0.0" s="0.0">
+                  <Orientation type="relative"/>
+                </LanePosition>
+              </Position>
+            </TeleportAction>
+          </PrivateAction>
+          <PrivateAction>
+            <LongitudinalAction>
+              <SpeedAction>
+                <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/>
+                <SpeedActionTarget>
+                  <AbsoluteTargetSpeed value="43.5"/>
+                </SpeedActionTarget>
+              </SpeedAction>
+            </LongitudinalAction>
+          </PrivateAction>
+          <PrivateAction>
+            <ControllerAction>
+              <ActivateControllerAction controllerRef="Ego" lateral="true" longitudinal="true" />
+            </ControllerAction>
+          </PrivateAction>
+        </Private>
+      </Actions>
+    </Init>
+    <Story name="Indicator Change">
+      <Act name="Act1">
+        <ManeuverGroup maximumExecutionCount="1" name="IndicatorChangeSequence">
+          <Actors selectTriggeringEntities="false">
+            <EntityRef entityRef="Ego"/>
+          </Actors>
+          <Maneuver name="LightStateChangeManeuverA">
+            <Event name="LightStateChangeEventA" priority="override">
+              <Action name="LightStateChange">
+                <PrivateAction>
+                  <AppearanceAction>
+                    <LightStateAction>
+                      <LightType>
+                        <VehicleLight vehicleLightType="indicatorLeft"/>
+                      </LightType>
+                      <LightState mode="on"/>
+                    </LightStateAction>
+                  </AppearanceAction>
+                </PrivateAction>
+              </Action>
+              <StartTrigger>
+                <ConditionGroup>
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
+                    <ByValueCondition>
+                      <SimulationTimeCondition value="3.0" rule="greaterThan"/>
+                    </ByValueCondition>
+                  </Condition>
+                </ConditionGroup>
+              </StartTrigger>
+            </Event>
+          </Maneuver>
+          <Maneuver name="LightStateChangeManeuverB">
+            <Event name="LightStateChangeEventB" priority="override">
+              <Action name="LightStateChange">
+                <PrivateAction>
+                  <AppearanceAction>
+                    <LightStateAction>
+                      <LightType>
+                        <VehicleLight vehicleLightType="indicatorLeft"/>
+                      </LightType>
+                      <LightState mode="off"/>
+                    </LightStateAction>
+                  </AppearanceAction>
+                </PrivateAction>
+              </Action>
+              <StartTrigger>
+                <ConditionGroup>
+                  <Condition name="Conditional" delay="0" conditionEdge="rising">
+                    <ByValueCondition>
+                      <SimulationTimeCondition value="6.0" rule="greaterThan"/>
+                    </ByValueCondition>
+                  </Condition>
+                </ConditionGroup>
+              </StartTrigger>
+            </Event>
+          </Maneuver>
+        </ManeuverGroup>
+        <StartTrigger>
+          <ConditionGroup>
+            <Condition name="StartTime" delay="0" conditionEdge="rising">
+              <ByValueCondition>
+                <SimulationTimeCondition value="0.0" rule="greaterOrEqual"/>
+              </ByValueCondition>
+            </Condition>
+          </ConditionGroup>
+        </StartTrigger>
+      </Act>
+    </Story>
+    <StopTrigger>
+      <ConditionGroup>
+        <Condition name="EndTime" delay="0" conditionEdge="rising">
+          <ByValueCondition>
+            <SimulationTimeCondition value="10.0" rule="greaterThan"/>
+          </ByValueCondition>
+        </Condition>
+      </ConditionGroup>
+    </StopTrigger>
+  </Storyboard>
+</OpenSCENARIO>
diff --git a/sim/contrib/examples/Configurations/PCM/Agent_Follow.xml b/sim/contrib/examples/Configurations/PCM/Agent_Follow.xml
index 575353e013d0967695ff1f9bf26abfbe23cf4248..b5878526219d5e0f446910c74c959395b1b930eb 100644
--- a/sim/contrib/examples/Configurations/PCM/Agent_Follow.xml
+++ b/sim/contrib/examples/Configurations/PCM/Agent_Follow.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <systems>
   <system>
     <id>0</id>
@@ -17,63 +18,49 @@
         <parameters>
           <parameter>
             <!--parameter's title: Driver aggressiveness-->
-            <id>0</id>
+            <id>DrivingAggressiveness</id>
             <type>double</type>
             <unit></unit>
             <value>1</value>
           </parameter>
-          <parameter>
-            <!--parameter's title: Max. engine power-->
-            <id>1</id>
-            <type>double</type>
-            <unit>W</unit>
-            <value>200000</value>
-          </parameter>
-          <parameter>
-            <!--parameter's title: Min. brake torque-->
-            <id>2</id>
-            <type>double</type>
-            <unit>Nm</unit>
-            <value>-10000</value>
-          </parameter>
           <parameter>
             <!--parameter's title: Kp of the pedals PID control-->
-            <id>3</id>
+            <id>PedalsKp</id>
             <type>double</type>
             <unit></unit>
             <value>15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Ki of the pedals PID control-->
-            <id>4</id>
+            <id>PedalsKi</id>
             <type>double</type>
             <unit></unit>
             <value>-70</value>
           </parameter>
           <parameter>
             <!--parameter's title: Kd of the pedals PID control-->
-            <id>5</id>
+            <id>PedalsKd</id>
             <type>double</type>
             <unit></unit>
             <value>0.0</value>
           </parameter>
           <parameter>
             <!--parameter's title: Kp of the steering PID control-->
-            <id>6</id>
+            <id>SteeringKp</id>
             <type>double</type>
             <unit></unit>
             <value>-18</value>
           </parameter>
           <parameter>
             <!--parameter's title: Ki of the steering PID control-->
-            <id>7</id>
+            <id>SteeringKi</id>
             <type>double</type>
             <unit></unit>
             <value>-0.6</value>
           </parameter>
           <parameter>
             <!--parameter's title: Kd of the steering PID control-->
-            <id>8</id>
+            <id>SteeringKd</id>
             <type>double</type>
             <unit></unit>
             <value>0.0</value>
@@ -97,28 +84,28 @@
         <parameters>
           <parameter>
             <!--parameter's title: FrontAxlePercentage-->
-            <id>0</id>
+            <id>FrontAxlePercentage</id>
             <type>double</type>
             <unit/>
             <value>0.6</value>
           </parameter>
           <parameter>
             <!--parameter's title: BrakeDecelerationInclineRate-->
-            <id>1</id>
+            <id>BrakeDecelerationInclineRate</id>
             <type>double</type>
             <unit>m/s^3</unit>
             <value>70</value>
           </parameter>
           <parameter>
             <!--parameter's title: BrakeDecelerationDeclineRate-->
-            <id>2</id>
+            <id>BrakeDecelerationDeclineRate</id>
             <type>double</type>
             <unit>m/s^3</unit>
             <value>70</value>
           </parameter>
           <parameter>
             <!--parameter's title: BrakeResponseTimeMs-->
-            <id>3</id>
+            <id>BrakeResponseTimeMs</id>
             <type>double</type>
             <unit>ms</unit>
             <value>0</value>
@@ -142,14 +129,14 @@
         <parameters>
           <parameter>
             <!--parameter's title: TypeDrivetrain-->
-            <id>1</id>
+            <id>TypeDrivetrain</id>
             <type>string</type>
             <unit/>
             <value>FWD</value>
           </parameter>
           <parameter>
             <!--parameter's title: FrontRatioAWD-->
-            <id>2</id>
+            <id>FrontRatioAWD</id>
             <type>double</type>
             <unit/>
             <value>0.5</value>
@@ -173,21 +160,21 @@
         <parameters>
           <parameter>
             <!--parameter's title: Tire's toe-->
-            <id>0</id>
+            <id>Toe</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.0,0.0</value>
           </parameter>
 		  <parameter>
             <!--parameter's title: Elasticity-->
-            <id>1</id>
+            <id>Elasticity</id>
             <type>doubleVector</type>
             <unit/>
             <value>20000</value>
           </parameter>
 		  <parameter>
             <!--parameter's title: Overall caster-->
-            <id>2</id>
+            <id>Caster</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.05</value>
@@ -211,168 +198,168 @@
         <parameters>
           <parameter>
             <!--parameter's title: Tire's long. max. mu at reference Force -->
-            <id>1</id>
+            <id>MuTireMaxXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.1,1.1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. max. mu at 2*reference Force -->
-            <id>2</id>
+            <id>MuTireMaxX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.1,1.1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. slide mu at reference Force-->
-            <id>3</id>
+            <id>MuTireSlideXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.0,1.0</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. slide mu at 2*reference Force-->
-            <id>4</id>
+            <id>MuTireSlideX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.0,1.0</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. max slip at reference Force-->
-            <id>5</id>
+            <id>SlipTireMaxXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.21,0.21</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. max slip at 2*reference Force-->
-            <id>6</id>
+            <id>SlipTireMaxX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.21,0.21</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. slide slip at reference Force-->
-            <id>7</id>
+            <id>SlipTireSlideXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.5,0.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. slide slip at 2*reference Force-->
-            <id>8</id>
+            <id>SlipTireSlideX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.5,0.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Initial long inclination at reference Force-->
-            <id>9</id>
+            <id>F0pXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>15,15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Initial long inclination at 2*reference Force-->
-            <id>10</id>
+            <id>F0pX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>15,15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. max. mu at reference Force-->
-            <id>11</id>
+            <id>MuTireMaxYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.1,1.1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. max. mu at 2*reference Force-->
-            <id>12</id>
+            <id>MuTireMaxY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.1,1.1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. slide mu at reference Force-->
-            <id>13</id>
+            <id>MuTireSlideYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1,1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. slide mu at 2*reference Force-->
-            <id>14</id>
+            <id>MuTireSlideY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1,1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. max slip at reference Force-->
-            <id>15</id>
+            <id>SlipTireMaxYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.21,0.21</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. max slip at 2*reference Force-->
-            <id>16</id>
+            <id>SlipTireMaxY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.21,0.21</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. slide slip at reference Force-->
-            <id>17</id>
+            <id>SlipTireSlideYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.5,0.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. slide slip at 2*reference Force-->
-            <id>18</id>
+            <id>SlipTireSlideY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.5,0.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Initial lat. inclination at reference Force-->
-            <id>19</id>
+            <id>F0pYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>15,15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Initial lat. inclination at 2*reference Force-->
-            <id>20</id>
+            <id>F0pY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>15,15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Vertical reference Force-->
-            <id>21</id>
+            <id>FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1,1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Vertical reference Force Normalized-->
-            <id>22</id>
+            <id>FRefNormalized</id>
             <type>boolVector</type>
             <unit/>
             <value>1,1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Inertia-->
-            <id>23</id>
+            <id>Inertia</id>
             <type>doubleVector</type>
             <unit>kgm²</unit>
             <value>2,2</value>
           </parameter>
           <parameter>
             <!--parameter's title: Pneumatic trail-->
-            <id>24</id>
+            <id>PneumaticTrail</id>
             <type>doubleVector</type>
             <unit>m</unit>
             <value>0.03,0.03</value>
@@ -412,14 +399,14 @@
         <parameters>
           <parameter>
             <!--parameter's title: Spring coefficient-->
-            <id>0</id>
+            <id>SpringCoefficient</id>
             <type>doubleVector</type>
             <unit/>
             <value>1600000,1600000</value>
           </parameter>
           <parameter>
             <!--parameter's title: Damper coefficient-->
-            <id>1</id>
+            <id>DamperCoefficient</id>
             <type>doubleVector</type>
             <unit/>
             <value>18000,18000</value>
@@ -443,7 +430,7 @@
 		<parameters>
 		 <parameter>
 		  <!--parameter's title: penetrationTime_ms-->
-		  <id>0</id>
+		  <id>penetrationTime</id>
 		  <type>int</type>
 		  <unit>ms</unit>
 		  <value>30</value>
@@ -485,7 +472,7 @@
 		 <x>663</x>
 		 <y>587</y>
 		</position>
-	  </component> 
+	  </component>
     </components>
     <connections>
       <connection>
@@ -715,4 +702,4 @@
       </connection>
     </connections>
   </system>
-</systems>
\ No newline at end of file
+</systems>
diff --git a/sim/contrib/examples/Configurations/StaticAgentCollision/SystemConfig.xml b/sim/contrib/examples/Configurations/StaticAgentCollision/SystemConfig.xml
index 437716a37efa4276c638a676478c2f52082e3bdf..8fd97e31b60c346a30f6abeb9efe33ae88d0aac4 100644
--- a/sim/contrib/examples/Configurations/StaticAgentCollision/SystemConfig.xml
+++ b/sim/contrib/examples/Configurations/StaticAgentCollision/SystemConfig.xml
@@ -34,42 +34,42 @@
         <parameters>
           <parameter>
             <!--parameter's title: VelocityWish-->
-            <id>0</id>
+            <id>VelocityWish</id>
             <type>double</type>
             <unit>m/s</unit>
             <value>15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Delta-->
-            <id>1</id>
+            <id>Delta</id>
             <type>double</type>
             <unit></unit>
             <value>4</value>
           </parameter>
           <parameter>
-            <!--parameter's title: TGabWish-->
-            <id>2</id>
+            <!--parameter's title: TGapWish-->
+            <id>TGapWish</id>
             <type>double</type>
             <unit>s</unit>
             <value>1.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: MinDistance-->
-            <id>3</id>
+            <id>MinDistance</id>
             <type>double</type>
             <unit>m</unit>
             <value>2</value>
           </parameter>
           <parameter>
             <!--parameter's title: MaxAcceleration-->
-            <id>4</id>
+            <id>MaxAcceleration</id>
             <type>double</type>
             <unit>m/s^2</unit>
             <value>2</value>
           </parameter>
           <parameter>
             <!--parameter's title: MaxDeceleration-->
-            <id>5</id>
+            <id>MaxDeceleration</id>
             <type>double</type>
             <unit>m/s^2</unit>
             <value>2</value>
@@ -141,28 +141,28 @@
         <parameters>
           <parameter>
             <!--parameter's title: FrontAxlePercentage-->
-            <id>0</id>
+            <id>FrontAxlePercentage</id>
             <type>double</type>
             <unit/>
             <value>0.6</value>
           </parameter>
           <parameter>
             <!--parameter's title: BrakeDecelerationInclineRate-->
-            <id>1</id>
+            <id>BrakeDecelerationInclineRate</id>
             <type>double</type>
             <unit>m/s^3</unit>
             <value>70</value>
           </parameter>
           <parameter>
             <!--parameter's title: BrakeDecelerationDeclineRate-->
-            <id>2</id>
+            <id>BrakeDecelerationDeclineRate</id>
             <type>double</type>
             <unit>m/s^3</unit>
             <value>70</value>
           </parameter>
           <parameter>
             <!--parameter's title: BrakeResponseTimeMs-->
-            <id>3</id>
+            <id>BrakeResponseTimeMs</id>
             <type>double</type>
             <unit>ms</unit>
             <value>25</value>
@@ -186,14 +186,14 @@
         <parameters>
           <parameter>
             <!--parameter's title: TypeDrivetrain-->
-            <id>1</id>
+            <id>TypeDrivetrain</id>
             <type>string</type>
             <unit/>
             <value>FWD</value>
           </parameter>
           <parameter>
             <!--parameter's title: FrontRatioAWD-->
-            <id>2</id>
+            <id>FrontRatioAWD</id>
             <type>double</type>
             <unit/>
             <value>0.5</value>
@@ -217,10 +217,24 @@
         <parameters>
           <parameter>
             <!--parameter's title: Tire's toe-->
-            <id>0</id>
+            <id>Toe</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.0,0.0</value>
+          </parameter>
+		  <parameter>
+            <!--parameter's title: Elasticity-->
+            <id>Elasticity</id>
+            <type>doubleVector</type>
+            <unit/>
+            <value>20000</value>
+          </parameter>
+		  <parameter>
+            <!--parameter's title: Overall caster-->
+            <id>Caster</id>
+            <type>doubleVector</type>
+            <unit/>
+            <value>0.05</value>
           </parameter>
         </parameters>
         <position>
@@ -238,171 +252,171 @@
           <cycle>1</cycle>
           <response>0</response>
         </schedule>
-        <parameters>
+       <parameters>
           <parameter>
             <!--parameter's title: Tire's long. max. mu at reference Force -->
-            <id>1</id>
+            <id>MuTireMaxXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.1,1.1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. max. mu at 2*reference Force -->
-            <id>2</id>
+            <id>MuTireMaxX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.1,1.1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. slide mu at reference Force-->
-            <id>3</id>
+            <id>MuTireSlideXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.0,1.0</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. slide mu at 2*reference Force-->
-            <id>4</id>
+            <id>MuTireSlideX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.0,1.0</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. max slip at reference Force-->
-            <id>5</id>
+            <id>SlipTireMaxXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.21,0.21</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. max slip at 2*reference Force-->
-            <id>6</id>
+            <id>SlipTireMaxX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.21,0.21</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. slide slip at reference Force-->
-            <id>7</id>
+            <id>SlipTireSlideXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.5,0.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's long. slide slip at 2*reference Force-->
-            <id>8</id>
+            <id>SlipTireSlideX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.5,0.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Initial long inclination at reference Force-->
-            <id>9</id>
+            <id>F0pXFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>15,15</value>
           </parameter>
           <parameter>
-            <!--parameter's title: Initial long inclination at 2*reference Force-->
-            <id>10</id>
+            <!--parameter's title: Initial long inclination at reference Force-->
+            <id>F0pX2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>15,15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. max. mu at reference Force-->
-            <id>11</id>
+            <id>MuTireMaxYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.1,1.1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. max. mu at 2*reference Force-->
-            <id>12</id>
+            <id>MuTireMaxY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1.1,1.1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. slide mu at reference Force-->
-            <id>13</id>
+            <id>MuTireSlideYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1,1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. slide mu at 2*reference Force-->
-            <id>14</id>
+            <id>MuTireSlideY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1,1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. max slip at reference Force-->
-            <id>15</id>
+            <id>SlipTireMaxYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.21,0.21</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. max slip at 2*reference Force-->
-            <id>16</id>
+            <id>SlipTireMaxY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.21,0.21</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. slide slip at reference Force-->
-            <id>17</id>
+            <id>SlipTireSlideYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.5,0.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Tire's lat. slide slip at 2*reference Force-->
-            <id>18</id>
+            <id>SlipTireSlideY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>0.5,0.5</value>
           </parameter>
           <parameter>
             <!--parameter's title: Initial lat. inclination at reference Force-->
-            <id>19</id>
+            <id>F0pYFRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>15,15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Initial lat. inclination at 2*reference Force-->
-            <id>20</id>
+            <id>F0pY2FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>15,15</value>
           </parameter>
           <parameter>
             <!--parameter's title: Vertical reference Force-->
-            <id>21</id>
+            <id>FRef</id>
             <type>doubleVector</type>
             <unit/>
             <value>1,1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Vertical reference Force Normalized-->
-            <id>22</id>
+            <id>FRefNormalized</id>
             <type>boolVector</type>
             <unit/>
             <value>1,1</value>
           </parameter>
           <parameter>
             <!--parameter's title: Inertia-->
-            <id>23</id>
+            <id>Inertia</id>
             <type>doubleVector</type>
             <unit>kgm²</unit>
             <value>2,2</value>
           </parameter>
           <parameter>
             <!--parameter's title: Pneumatic trail-->
-            <id>24</id>
+            <id>PneumaticTrail</id>
             <type>doubleVector</type>
             <unit>m</unit>
             <value>0.3,0.3</value>
@@ -442,14 +456,14 @@
         <parameters>
           <parameter>
             <!--parameter's title: Spring coefficient-->
-            <id>0</id>
+            <id>SpringCoefficient</id>
             <type>doubleVector</type>
             <unit/>
             <value>1600000,1600000</value>
           </parameter>
           <parameter>
             <!--parameter's title: Damper coefficient-->
-            <id>1</id>
+            <id>DamperCoefficient</id>
             <type>doubleVector</type>
             <unit/>
             <value>18000,18000</value>
diff --git a/sim/contrib/examples/opSimulationManager.xml b/sim/contrib/examples/opSimulationManager.xml
deleted file mode 100644
index 757d9a89cf300ed01898319b73aeec91eb01d95c..0000000000000000000000000000000000000000
--- a/sim/contrib/examples/opSimulationManager.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<opSimulationManager>
-  <logLevel>0</logLevel>
-  <logFileSimulationManager>opSimulationManager.log</logFileSimulationManager>
-  <simulation>opSimulation</simulation>
-  <libraries>modules</libraries>
-  <simulationConfigs>
-    <simulationConfig>
-      <logFileSimulation>opSimulation.log</logFileSimulation>
-      <configurations>configs</configurations>
-      <results>results</results>
-    </simulationConfig>
-  </simulationConfigs>
-</opSimulationManager>
diff --git a/sim/contrib/fmus/CMakeLists.txt b/sim/contrib/fmus/CMakeLists.txt
index 1e65fcdd8e0757f5c24fa8c71dba6cd5b37bdb6b..7619be303bd19b4dc1a96260bdb83fc11e3b8ff8 100755
--- a/sim/contrib/fmus/CMakeLists.txt
+++ b/sim/contrib/fmus/CMakeLists.txt
@@ -14,6 +14,7 @@ set(DUMMY_FMUS
   DummyFmuObjectsList
   DummyFmuOutputTest
   DummyFmuParameter
+  DummyFmuSecondaryDriverTasksSignal
   DummyFmuSSPTest
   DummyFmuStaticActuator
 )
diff --git a/sim/contrib/fmus/DummyFmuOutputTest/FMI1.in.xml b/sim/contrib/fmus/DummyFmuOutputTest/FMI1.in.xml
index 8053c2a6dbf96a6b6c375f88e8bdd33a5e45000b..fd9b526e9fad6b837c27c556eec0e3ef7ef14278 100755
--- a/sim/contrib/fmus/DummyFmuOutputTest/FMI1.in.xml
+++ b/sim/contrib/fmus/DummyFmuOutputTest/FMI1.in.xml
@@ -22,9 +22,8 @@
   </TypeDefinitions>
 
   <DefaultExperiment startTime="0" stopTime="3"/>
-    
+
   <ModelVariables>
-    
         <ScalarVariable name="output_1" valueReference="0" variability="discrete" causality="output">
             <Enumeration declaredType="ComponentState" />
         </ScalarVariable>
@@ -61,13 +60,11 @@
         <ScalarVariable name="output_12" valueReference="1" variability="discrete" causality="output">
             <Integer  />
         </ScalarVariable>
-        
-</ModelVariables>
-
-  <Implementation>
-    <CoSimulation_StandAlone>
-      <Capabilities canHandleVariableCommunicationStepSize="true" canHandleEvents="true"/>
-    </CoSimulation_StandAlone>
-  </Implementation>
+    </ModelVariables>
 
+    <Implementation>
+        <CoSimulation_StandAlone>
+            <Capabilities canHandleVariableCommunicationStepSize="true" canHandleEvents="true"/>
+        </CoSimulation_StandAlone>
+    </Implementation>
 </fmiModelDescription>
diff --git a/sim/contrib/fmus/DummyFmuOutputTest/model.c b/sim/contrib/fmus/DummyFmuOutputTest/model.c
index bbc4d3d8302a9b986e121a5083a7438a82217449..03585a1bfef958cd280ac9051261f00bb4b1ea77 100755
--- a/sim/contrib/fmus/DummyFmuOutputTest/model.c
+++ b/sim/contrib/fmus/DummyFmuOutputTest/model.c
@@ -53,7 +53,6 @@ by QTronic, both released under the 2-Clause BSD License.
 #define V_MIN (0.1)
 #define EVENT_EPSILON (1e-10)
 
-
 void setStartValues(ModelInstance *comp) {
     UNUSED(comp);
 }
diff --git a/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/FMI1.in.xml b/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/FMI1.in.xml
new file mode 100755
index 0000000000000000000000000000000000000000..6d37f0f5918ac36044a023eedc662ba5e00e03b4
--- /dev/null
+++ b/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/FMI1.in.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<fmiModelDescription
+    fmiVersion="1.0"
+    modelName="@DUMMY_FMU_NAME@"
+    modelIdentifier="@DUMMY_FMU_NAME@"
+    description="Dummy FMU for testing of openPASS SecondaryDriverTasksSignal"
+    guid="@FMUGUID@"
+    generationDateAndTime="@FMUTIMESTAMP@"
+    numberOfContinuousStates="2"
+    numberOfEventIndicators="1">
+
+    <TypeDefinitions>
+    </TypeDefinitions>
+
+    <DefaultExperiment startTime="0" stopTime="100"/>
+
+    <ModelVariables>
+        <ScalarVariable name="IndicatorState" valueReference="0" variability="discrete" causality="output">
+            <Integer  />
+        </ScalarVariable>
+        <ScalarVariable name="HornSwitch" valueReference="0" variability="discrete" causality="output">
+            <Boolean  />
+        </ScalarVariable>
+        <ScalarVariable name="HeadLightSwitch" valueReference="1" variability="discrete" causality="output">
+            <Boolean  />
+        </ScalarVariable>
+        <ScalarVariable name="HighBeamLightSwitch" valueReference="2" variability="discrete" causality="output">
+            <Boolean  />
+        </ScalarVariable>
+        <ScalarVariable name="FlasherSwitch" valueReference="3" variability="discrete" causality="output">
+            <Boolean  />
+        </ScalarVariable>
+    </ModelVariables>
+
+    <Implementation>
+        <CoSimulation_StandAlone>
+            <Capabilities canHandleVariableCommunicationStepSize="true" canHandleEvents="true"/>
+        </CoSimulation_StandAlone>
+    </Implementation>
+</fmiModelDescription>
diff --git a/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/FMI2.in.xml b/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/FMI2.in.xml
new file mode 100755
index 0000000000000000000000000000000000000000..29bbe2c4c6b9f7ad6b4bdebc184dfc64efb785d0
--- /dev/null
+++ b/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/FMI2.in.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<fmiModelDescription
+    fmiVersion="2.0"
+    modelName="@DUMMY_FMU_NAME@"
+    description="Dummy FMU for testing of openPASS SecondaryDriverTasksSignal"
+    generationTool=""
+    guid="@FMUGUID@"
+    generationDateAndTime="@FMUTIMESTAMP@"
+    numberOfEventIndicators="1">
+
+    <CoSimulation
+        modelIdentifier="@DUMMY_FMU_NAME@"
+        canHandleVariableCommunicationStepSize="true"
+        canNotUseMemoryManagementFunctions="true"
+        canGetAndSetFMUstate="true"
+        canSerializeFMUstate="true">
+    </CoSimulation>
+
+    <TypeDefinitions>
+    </TypeDefinitions>
+
+    <LogCategories>
+        <Category name="logEvents" description="Log events"/>
+        <Category name="logStatusError" description="Log error messages"/>
+    </LogCategories>
+
+    <DefaultExperiment startTime="0" stopTime="100" stepSize="1e-2"/>
+
+    <ModelVariables>
+        <ScalarVariable name="IndicatorState" valueReference="0" variability="discrete" causality="output">
+            <Integer  />
+        </ScalarVariable>
+        <ScalarVariable name="HornSwitch" valueReference="0" variability="discrete" causality="output">
+            <Boolean  />
+        </ScalarVariable>
+        <ScalarVariable name="HeadLightSwitch" valueReference="1" variability="discrete" causality="output">
+            <Boolean  />
+        </ScalarVariable>
+        <ScalarVariable name="HighBeamLightSwitch" valueReference="2" variability="discrete" causality="output">
+            <Boolean  />
+        </ScalarVariable>
+        <ScalarVariable name="FlasherSwitch" valueReference="3" variability="discrete" causality="output">
+            <Boolean  />
+        </ScalarVariable>
+    </ModelVariables>
+
+    <ModelStructure>
+    </ModelStructure>
+</fmiModelDescription>
diff --git a/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/config.in.h b/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/config.in.h
new file mode 100755
index 0000000000000000000000000000000000000000..c6a27d0fe94cd99548a037bd24e36e8bb9a45c3a
--- /dev/null
+++ b/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/config.in.h
@@ -0,0 +1,79 @@
+/********************************************************************************
+ * Copyright (c) 2023-2024 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
+ ********************************************************************************/
+
+/*
+Based on Modelica Reference FMU sources:
+
+Copyright (c) 2023, Modelica Association Project "FMI".
+All rights reserved.
+
+The Reference FMUs and FMUSim are released under the 2-Clause BSD license:
+
+--------------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDi
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------------
+
+The Reference FMUs are a fork of the Test FMUs (https://github.com/CATIA-Systems/Test-FMUs)
+by Dassault Systemes, which are a fork of the FMU SDK (https://github.com/qtronic/fmusdk)
+by QTronic, both released under the 2-Clause BSD License.
+*/
+
+#pragma once
+
+#include <stdbool.h>
+#include <string.h>
+
+// define class name and unique id
+// clang-format off
+#define MODEL_IDENTIFIER @DUMMY_FMU_NAME@
+// clang-format on
+#define INSTANTIATION_TOKEN "@FMUGUID@"
+
+#define CO_SIMULATION
+
+// define model size
+#define NX 0
+#define NZ 1
+
+#define GET_INT32
+#define SET_INT32
+#define GET_BOOLEAN
+#define SET_BOOLEAN
+#define SET_FLOAT64
+#define EVENT_UPDATE
+
+#define FIXED_SOLVER_STEP 1e-1
+#define DEFAULT_STOP_TIME 100
+
+typedef unsigned int ValueReference;
+
+typedef struct
+{
+  int time;
+} ModelData;
diff --git a/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/model.c b/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/model.c
new file mode 100755
index 0000000000000000000000000000000000000000..31594c3bd2f1eb2b4e5dbdd1464f47258c56dcc1
--- /dev/null
+++ b/sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/model.c
@@ -0,0 +1,143 @@
+/********************************************************************************
+ * Copyright (c) 2023-2024 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
+ ********************************************************************************/
+
+/*
+Based on Modelica Reference FMU sources:
+
+Copyright (c) 2023, Modelica Association Project "FMI".
+All rights reserved.
+
+The Reference FMUs and FMUSim are released under the 2-Clause BSD license:
+
+--------------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDi
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------------
+
+The Reference FMUs are a fork of the Test FMUs (https://github.com/CATIA-Systems/Test-FMUs)
+by Dassault Systemes, which are a fork of the FMU SDK (https://github.com/qtronic/fmusdk)
+by QTronic, both released under the 2-Clause BSD License.
+*/
+
+#include <string.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "config.h"
+#include "model.h"
+
+#define V_MIN (0.1)
+#define EVENT_EPSILON (1e-10)
+
+
+void setStartValues(ModelInstance *comp) {
+    UNUSED(comp);
+    M(time) = -1;
+    comp->z[0] = 1;
+}
+
+Status calculateValues(ModelInstance *comp) {
+    UNUSED(comp);
+    return OK;
+}
+
+void getEventIndicators(ModelInstance *comp, double z[], size_t nz) {
+    UNUSED(nz);
+    z[0] = -1 * comp->z[0];
+}
+
+void eventUpdate(ModelInstance *comp) {
+    UNUSED(comp);
+    ++M(time);
+}
+
+Status getInt32(ModelInstance* comp, ValueReference vr, int32_t values[], size_t nValues, size_t* index) {
+
+    ASSERT_NVALUES(1);
+
+    if (vr == 0)
+    {
+        values[(*index)++] = M(time) * 1000;
+        return OK;
+    }
+    else
+    {
+        logError(comp, "Unexpected value reference: %u.", vr);
+        return Error;
+    }
+}
+
+Status setInt32(ModelInstance* comp, ValueReference vr, const int32_t values[], size_t nValues, size_t* index) {
+    UNUSED(comp);
+    UNUSED(vr);
+    UNUSED(values);
+    UNUSED(nValues);
+    UNUSED(index);
+    return OK;
+}
+
+// For testing purposes, the value shall only be true when the time matches its value reference
+Status getBoolean(ModelInstance* comp, ValueReference vr, bool values[], size_t nValues, size_t *index) {
+
+    ASSERT_NVALUES(1);
+    if (vr >= 0 && vr <= 3)
+    {
+        values[(*index)++] = (M(time) == vr);
+        return OK;
+    }
+    else
+    {
+        logError(comp, "Unexpected value reference: %u.", vr);
+        return Error;
+    }
+}
+
+Status setBoolean(ModelInstance* comp, ValueReference vr, const bool values[], size_t nValues, size_t *index) {
+    UNUSED(comp);
+    UNUSED(vr);
+    UNUSED(values);
+    UNUSED(nValues);
+    UNUSED(index);
+    return OK;
+}
+
+Status getFloat64(ModelInstance* comp, ValueReference vr, double values[], size_t nValues, size_t* index) {
+    UNUSED(nValues);
+    UNUSED(index);
+    logError(comp, "Unexpected value reference: %u.", vr);
+    return Error;
+}
+
+Status setFloat64(ModelInstance* comp, ValueReference vr, const double values[], size_t nValues, size_t* index) {
+    UNUSED(comp);
+    UNUSED(vr);
+    UNUSED(values);
+    UNUSED(nValues);
+    UNUSED(index);
+    return OK;
+}
\ No newline at end of file
diff --git a/sim/contrib/templates/Algorithm_Comp1/algorithm_Comp1.cpp b/sim/contrib/templates/Algorithm_Comp1/algorithm_Comp1.cpp
index efa262c54e8026f4346971a33fe331f1170c6cc0..b5efe1f7bc65b9f98f4fb2be03c2371680b5c902 100644
--- a/sim/contrib/templates/Algorithm_Comp1/algorithm_Comp1.cpp
+++ b/sim/contrib/templates/Algorithm_Comp1/algorithm_Comp1.cpp
@@ -57,7 +57,7 @@ extern "C" ALGORITHM_COMP1_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance
                                                                                 callbacks,
                                                                                 agent->GetAgentId()));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -91,7 +91,7 @@ extern "C" ALGORITHM_COMP1_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterfac
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -122,7 +122,7 @@ extern "C" ALGORITHM_COMP1_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterfa
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -150,7 +150,7 @@ extern "C" ALGORITHM_COMP1_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *i
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/contrib/templates/Dynamics_Comp2/dynamics_Comp2.cpp b/sim/contrib/templates/Dynamics_Comp2/dynamics_Comp2.cpp
index 7379443f5c2993dc227260422c534e5d3973286d..1803fd0d70479084134f07677140911ea79317c9 100644
--- a/sim/contrib/templates/Dynamics_Comp2/dynamics_Comp2.cpp
+++ b/sim/contrib/templates/Dynamics_Comp2/dynamics_Comp2.cpp
@@ -58,7 +58,7 @@ extern "C" DYNAMICS_COMP2_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance(
                                                                                   callbacks,
                                                                                   agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -92,7 +92,7 @@ extern "C" DYNAMICS_COMP2_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterface
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -123,7 +123,7 @@ extern "C" DYNAMICS_COMP2_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterfac
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -151,7 +151,7 @@ extern "C" DYNAMICS_COMP2_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *im
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/include/agentBlueprintInterface.h b/sim/include/agentBlueprintInterface.h
index bf039aadcc76685761bcfd131e3376e3af0ffc53..d015bab54d55fe24802f6511741ff514cdcc00d4 100644
--- a/sim/include/agentBlueprintInterface.h
+++ b/sim/include/agentBlueprintInterface.h
@@ -1,7 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2016 ITK Engineering GmbH
  *               2017-2020 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 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
@@ -58,6 +58,8 @@ struct SpawnParameter
   Route route{};
   /// Route in MantleAPI definition
   mantle_api::RouteDefinition routeDefinition{};
+  /// Indicator State of the agent
+  IndicatorState indicatorState = IndicatorState::IndicatorState_Off;
 };
 
 /// systems of an agent
diff --git a/sim/include/fmuHandlerInterface.h b/sim/include/fmuHandlerInterface.h
index b1a94b6e9f5a3c1d41f753f12b6c025b4e8d33e8..9efa917b2daef3703d3af9b9ba73dcb350aaec76 100644
--- a/sim/include/fmuHandlerInterface.h
+++ b/sim/include/fmuHandlerInterface.h
@@ -77,19 +77,26 @@ struct FmuVariable1
 {
   int valueReference;                  ///< Value of the reference
   VariableType variableType;           ///< Type of the variable
+  std::string declaredType;            ///< Declared type of the variables
   fmi1_causality_enu_t causality;      ///< Causality property for variables
   fmi1_variability_enu_t variability;  ///< variability property for variables
 
   /// @brief Create a fmu variable2 type
   /// @param valueReference Value of the reference
   /// @param variableType   Type of the variable
+  /// @param declaredType   Declared type of the variables
   /// @param causality      Causality property for variables
   /// @param variability    variability property for variables
   FmuVariable1(int valueReference,
                VariableType variableType,
+               std::string declaredType,
                fmi1_causality_enu_t causality,
                fmi1_variability_enu_t variability)
-      : valueReference(valueReference), variableType(variableType), causality(causality), variability(variability)
+      : valueReference(valueReference),
+        variableType(variableType),
+        declaredType(declaredType),
+        causality(causality),
+        variability(variability)
   {
   }
 
@@ -170,19 +177,26 @@ struct FmuVariable2
 {
   int valueReference;                  ///< Value of the reference
   VariableType variableType;           ///< Type of the variable
+  std::string declaredType;            ///< Declared type of the variables
   fmi2_causality_enu_t causality;      ///< Causality property for variables
   fmi2_variability_enu_t variability;  ///< variability property for variables
 
   /// @brief Create a fmu variable2 type
   /// @param valueReference Value of the reference
   /// @param variableType   Type of the variable
+  /// @param declaredType   Declared type of the variables
   /// @param causality      Causality property for variables
   /// @param variability    variability property for variables
   FmuVariable2(int valueReference,
                VariableType variableType,
+               std::string declaredType,
                fmi2_causality_enu_t causality,
                fmi2_variability_enu_t variability)
-      : valueReference(valueReference), variableType(variableType), causality(causality), variability(variability)
+      : valueReference(valueReference),
+        variableType(variableType),
+        declaredType(declaredType),
+        causality(causality),
+        variability(variability)
   {
   }
 
diff --git a/sim/include/observationInterface.h b/sim/include/observationInterface.h
index a0a5f557de743ef777a574e09f580887b806fc1b..70fb222ec409db0eb5c5d16fcca0e5cc5645c2ab 100644
--- a/sim/include/observationInterface.h
+++ b/sim/include/observationInterface.h
@@ -1,7 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2016-2018 ITK Engineering GmbH
  *               2017-2021 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 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
@@ -64,18 +64,6 @@ public:
   ObservationInterface& operator=(ObservationInterface&&) = delete;
   virtual ~ObservationInterface() = default;
 
-  //-----------------------------------------------------------------------------
-  //! Called by framework in opSimulationManager before each simulation run starts
-  //-----------------------------------------------------------------------------
-  virtual void OpSimulationManagerPreHook() = 0;  // currently not implemented
-
-  //-----------------------------------------------------------------------------
-  //! Called by framework in opSimulationManager after each simulation run ends
-  //!
-  //! @param[in]     filename      Name of file containing the simulation run results from the simulation
-  //-----------------------------------------------------------------------------
-  virtual void OpSimulationManagerPostHook(const std::string& filename) = 0;  // currently not implemented
-
   //-----------------------------------------------------------------------------
   //! Called by framework in simulation before all simulation runs start
   //!
@@ -109,14 +97,6 @@ public:
   //-----------------------------------------------------------------------------
   virtual void OpSimulationPostHook() = 0;
 
-  //-----------------------------------------------------------------------------
-  //! Called by framework in simulation after all simulation runs end to transfer
-  //! the observation module results to the opSimulationManager.
-  //!
-  //! @return                      File to be transferred
-  //-----------------------------------------------------------------------------
-  virtual const std::string OpSimulationResultFile() = 0;
-
 protected:
   //-----------------------------------------------------------------------------
   //! Retrieves the stochastics functionality
diff --git a/sim/include/observationNetworkInterface.h b/sim/include/observationNetworkInterface.h
index 324ddf029f64528bd53c33fc5100bb0e3e0c81b6..baf975cafa677a647546d27b2f75c7d72eb66de6 100644
--- a/sim/include/observationNetworkInterface.h
+++ b/sim/include/observationNetworkInterface.h
@@ -107,7 +107,7 @@ public:
   virtual bool FinalizeRun(const RunResult& result) = 0;
 
   //-----------------------------------------------------------------------------
-  //! Finalizes the observation network by calling the OpSimulationManagerPostHook
+  //! Finalizes the observation network by calling the SimulationPostHook
   //! pointer of the observation library with each observation module instance
   //! (and its ID) in each network simulation.
   //!
diff --git a/sim/src/common/globalDefinitions.h b/sim/src/common/globalDefinitions.h
index bd7c040573814e929035acd11c69163ed07142c8..28002d2d5aa8da17b46ccc9a5a94be12b5154bb7 100644
--- a/sim/src/common/globalDefinitions.h
+++ b/sim/src/common/globalDefinitions.h
@@ -700,10 +700,10 @@ struct DynamicsInformation
   units::acceleration::meters_per_second_squared_t accelerationY{NAN};  //!< Acceleration of the agent in y direction
   units::velocity::meters_per_second_t velocityX{0.0};                  //!< Velocity of the agent in x direction
   units::velocity::meters_per_second_t velocityY{0.0};                  //!< Velocity of the agent in y direction
-  units::length::meter_t positionX{0.0};                                           //!< x-position of agent
-  units::length::meter_t positionY{0.0};                                           //!< y-position of agent
-  units::angle::radian_t yaw{0.0};                                                 //!< Yaw angle of agent
-  units::angular_velocity::radians_per_second_t yawRate{0.0};                      //!< Yaw rate of the agent
+  units::length::meter_t positionX{0.0};                                //!< x-position of agent
+  units::length::meter_t positionY{0.0};                                //!< y-position of agent
+  units::angle::radian_t yaw{0.0};                                      //!< Yaw angle of agent
+  units::angular_velocity::radians_per_second_t yawRate{0.0};           //!< Yaw rate of the agent
   units::angular_acceleration::radians_per_second_squared_t yawAcceleration{0.0};  //!< Yaw acceleration of the agent
   units::angle::radian_t roll{0.0};                                                //!< Roll angle of agent
   units::angle::radian_t pitch{0.0};                                               //!< Pitch angle of agent
diff --git a/sim/src/common/vector2d.h b/sim/src/common/vector2d.h
index 472dacae44c89d35d074ec1d392c4fe0e5f5bec5..c3abf825d1fc26452a4779d5943e2c00f3cb2a44 100644
--- a/sim/src/common/vector2d.h
+++ b/sim/src/common/vector2d.h
@@ -2,7 +2,7 @@
  * Copyright (c) 2020 HLRS, University of Stuttgart
  *               2017-2021 ITK Engineering GmbH
  *               2018-2020 in-tech GmbH
- *               2021-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2021-2024 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
@@ -35,6 +35,9 @@ class OPENPASSCOMMONEXPORT Vector2d final
 public:
   static T constexpr EPSILON{1e-9};  //!< set epsilon
 
+  /// unit type of an area in the coordinate space of this vector
+  using SquaredUnit = decltype(std::declval<T>() * std::declval<T>());
+
   /// x dimension
   T x;
   /// y dimension
@@ -145,32 +148,46 @@ public:
     return x * in.y - y * in.x;
   }
 
-  //! @brief Method which checks whether the vector has a length
-  //!
-  //! @return true if the vector has no length
-  bool HasNoLength() { return units::math::abs(Length()) < EPSILON; }
-
   /*!
-   * Normalizes the 2d vector
+   * Returns whether the vector has a squared length of nearly zero.
    *
-   * Each component of the vector is devided by the length of the vector.
+   * \return true if the vector has no length
+   */
+  inline bool HasNoLength() const noexcept { return units::math::abs(Dot(*this)) < Vector2d<SquaredUnit>::EPSILON; }
+
+  /*!
+   * Returns the norm of this 2d vector.
    *
-   * In case of a vector with length 0, the vector cannot be normalized and false is returned.
+   * In case of a vector with length 0, the vector cannot be normalized and a zero vector is returned.
    *
-   * \return returns true if vector could be normalized, false otherwise
+   * \return vector scaled to unit length if it has non-zero length. Otherwise returns a zero length vector.
    */
-  Vector2d<units::dimensionless::scalar_t> Norm()
+  Vector2d<units::dimensionless::scalar_t> Norm() const
   {
-    auto length = Length();
-
-    if (HasNoLength())
+    const auto length{Length()};
+    if (length < EPSILON)
     {
-      throw std::runtime_error("Can't normalize Vector2d with length of 0.0");
+      return {};
     }
-
     return Vector2d<units::dimensionless::scalar_t>(x / length, y / length);
   }
 
+  /*!
+   * Normalizes this vector if its length is greater than the given epsilon.
+   * If not, no change is made to this vector.
+   *
+   * \param epsilon Tolerance threshold to account for rounding errors
+   */
+  void Normalize(SquaredUnit epsilon = Common::Vector2d<SquaredUnit>::EPSILON) noexcept
+  {
+    if (const SquaredUnit squaredLength{this->Dot(*this)}; squaredLength > epsilon)
+    {
+      const units::dimensionless::scalar_t length{units::math::sqrt(squaredLength).template to<double>()};
+      x /= length;
+      y /= length;
+    }
+  }
+
   /*!
    * returns length of the vector
    *
diff --git a/sim/src/common/version.cpp.in b/sim/src/common/version.cpp.in
index d56cdba4da816c8ab32bbbbe0cee60bcf4d37f63..3014792da57fe0f426970817e1bfd7aaec99889a 100644
--- a/sim/src/common/version.cpp.in
+++ b/sim/src/common/version.cpp.in
@@ -13,4 +13,4 @@
 namespace openpass::common::Version {
   /// version of openPASS
   const Version framework{@OPENPASS_VERSION@};
-} // namespace openpass::common::Version
+}  //namespace openpass::common::Version
diff --git a/sim/src/components/Action_BrakeSystem/Action_BrakeSystem.xml b/sim/src/components/Action_BrakeSystem/Action_BrakeSystem.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f812824100237b369a4384f32588fa7c6504a21e
--- /dev/null
+++ b/sim/src/components/Action_BrakeSystem/Action_BrakeSystem.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>Action_BrakeSystem</title>
+  <library>Action_BrakeSystem</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+	  <parameter>
+      <id>FrontAxlePercentage</id>
+      <type>double</type>
+		  <title>FrontAxlePercentage</title>
+      <unit/>
+      <value>0.6</value>
+    </parameter>
+	  <parameter>
+      <id>BrakeDecelerationInclineRate</id>
+      <type>double</type>
+		  <title>BrakeDecelerationInclineRate</title>
+      <unit>m/s^3</unit>
+      <value>70</value>
+    </parameter>
+    <parameter>
+      <id>BrakeDecelerationDeclineRate</id>
+      <type>double</type>
+		  <title>BrakeDecelerationDeclineRate</title>
+      <unit>m/s^3</unit>
+      <value>70</value>
+    </parameter>
+	  <parameter>
+      <id>BrakeResponseTimeMs</id>
+      <type>double</type>
+		  <title>BrakeResponseTimeMs</title>
+      <unit>ms</unit>
+      <value>25</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>bool</type>
+      <title>Request Prefill</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>1</id>
+      <type>LongitudinalSignal</type>
+      <title>Longitudinal Control</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Tire Brake Torque</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Action_BrakeSystem/CMakeLists.txt b/sim/src/components/Action_BrakeSystem/CMakeLists.txt
index 7931e411fa9360b64a5b249bc259c8cf927959f1..c86d429171e9efb82e89bc898a79168795fe8baa 100644
--- a/sim/src/components/Action_BrakeSystem/CMakeLists.txt
+++ b/sim/src/components/Action_BrakeSystem/CMakeLists.txt
@@ -25,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+    
+  GUIXML 
+    Action_BrakeSystem.xml  	  
 )
diff --git a/sim/src/components/Action_BrakeSystem/action_brakesystem.cpp b/sim/src/components/Action_BrakeSystem/action_brakesystem.cpp
index 68603026328e67cd83adb72cc022c7e4377c3bf5..72460ed27da597180b7173c3583a8dec18307ba8 100644
--- a/sim/src/components/Action_BrakeSystem/action_brakesystem.cpp
+++ b/sim/src/components/Action_BrakeSystem/action_brakesystem.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2023-2024 Volkswagen AG
+ *               2023 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
@@ -18,6 +19,7 @@
 
 #include "src/brakesystem.h"
 
+//! Version of this component
 const std::string VERSION = "0.0.1";
 static const CallbackInterface *Callbacks = nullptr;  // NOLINT[cppcoreguidelines-avoid-non-const-global-variables]
 
@@ -71,7 +73,7 @@ extern "C" ACTION_BRAKESYSTEM_SHARED_EXPORT ModelInterface *OpenPASS_CreateInsta
                                                                    callbacks,
                                                                    agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -108,7 +110,7 @@ extern "C" ACTION_BRAKESYSTEM_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -139,7 +141,7 @@ extern "C" ACTION_BRAKESYSTEM_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInte
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -167,7 +169,7 @@ extern "C" ACTION_BRAKESYSTEM_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Action_BrakeSystem/action_brakesystem.h b/sim/src/components/Action_BrakeSystem/action_brakesystem.h
index 15d61e620e3c57acac0e2085d43c92bca47f7ed0..b19de18dd270346538a9649cd944b6a6aa84bd86 100644
--- a/sim/src/components/Action_BrakeSystem/action_brakesystem.h
+++ b/sim/src/components/Action_BrakeSystem/action_brakesystem.h
@@ -24,4 +24,4 @@
 #define ACTION_BRAKESYSTEM_SHARED_EXPORT OPIMPORT  //!< Import of the dll-functions
 #endif
 
-#include "include/modelInterface.h"
\ No newline at end of file
+#include "include/modelInterface.h"
diff --git a/sim/src/components/Action_BrakeSystem/src/brakesystem.cpp b/sim/src/components/Action_BrakeSystem/src/brakesystem.cpp
index 56fccdd3d2d5bfc93c686cfb357e8f59ce1860ab..741e7e9be3bbc5291ede8c5767c91acd797c3662 100644
--- a/sim/src/components/Action_BrakeSystem/src/brakesystem.cpp
+++ b/sim/src/components/Action_BrakeSystem/src/brakesystem.cpp
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2023-2024 Volkswagen AG
+ *               2023 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
@@ -57,22 +58,14 @@ ActionBrakeSystem::ActionBrakeSystem(std::string componentName,
 
 void ActionBrakeSystem::ParseParameters(const ParameterInterface *parameters)
 {
-  frontAxlePercentage = parameters->GetParametersDouble().count("FrontAxlePercentage") == 1
-                          ? parameters->GetParametersDouble().at("FrontAxlePercentage")
-                          : parameters->GetParametersDouble().at("0");
+  frontAxlePercentage = parameters->GetParametersDouble().at("FrontAxlePercentage");
   if (frontAxlePercentage < 0.0 || frontAxlePercentage > 1.0)
   {
     throw std::runtime_error("FrontAxlePercentage out of range [0, 1]");
   }
-  brakeInclineRate = parameters->GetParametersDouble().count("BrakeDecelerationInclineRate") == 1
-                       ? parameters->GetParametersDouble().at("BrakeDecelerationInclineRate")
-                       : parameters->GetParametersDouble().at("1");
-  brakeDeclineRate = parameters->GetParametersDouble().count("BrakeDecelerationDeclineRate") == 1
-                       ? parameters->GetParametersDouble().at("BrakeDecelerationDeclineRate")
-                       : parameters->GetParametersDouble().at("2");
-  brakeResponseTimeMs = parameters->GetParametersDouble().count("BrakeResponseTimeMs") == 1
-                          ? parameters->GetParametersDouble().at("BrakeResponseTimeMs")
-                          : parameters->GetParametersDouble().at("3");
+  brakeInclineRate = parameters->GetParametersDouble().at("BrakeDecelerationInclineRate");
+  brakeDeclineRate = parameters->GetParametersDouble().at("BrakeDecelerationDeclineRate");
+  brakeResponseTimeMs = parameters->GetParametersDouble().at("BrakeResponseTimeMs");
 }
 
 void ActionBrakeSystem::UpdateInput(int localLinkId,
@@ -234,4 +227,4 @@ void ActionBrakeSystem::SetWheelBrakeTorque(units::acceleration::meters_per_seco
   wheelBrakeTorque.push_back(0.5 * frontAxleTorque.value());  // Front Right; 50% of front axle distribution
   wheelBrakeTorque.push_back(0.5 * rearAxleTorque.value());   // Rear Left; 50% of rear axle distribution
   wheelBrakeTorque.push_back(0.5 * rearAxleTorque.value());   // Rear Right; 50% of rear axle distribution
-}
\ No newline at end of file
+}
diff --git a/sim/src/components/Action_BrakeSystem/src/brakesystem.h b/sim/src/components/Action_BrakeSystem/src/brakesystem.h
index 95d47f2a58cd73013dbb1759a3d5e1337f484d95..176f34fec50e092c33254da898002d0c42c9980f 100644
--- a/sim/src/components/Action_BrakeSystem/src/brakesystem.h
+++ b/sim/src/components/Action_BrakeSystem/src/brakesystem.h
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2023-2024 Volkswagen AG
+ *               2023-2024 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
@@ -33,8 +34,6 @@
 #ifndef BRAKESYSTEM_H
 #define BRAKESYSTEM_H
 
-#include <common/vectorSignals.h>
-
 #include "common/longitudinalSignal.h"
 #include "common/primitiveSignals.h"
 #include "common/vectorSignals.h"
@@ -48,6 +47,7 @@
 class ActionBrakeSystem : public ActionInterface
 {
 public:
+  /// COMPONENT NAME
   const std::string componentname = "Action_BrakeSystem";
 
   /**
@@ -158,8 +158,8 @@ private:
   void ReduceResponseTime();
   void IncreaseResponseTime();
 
-  double cycleTimeMs;                  //!< Cycle time of component  [ms]
-  double currentResponseTimeMs{};      //!< response time of brake in current state  [ms]
+  double cycleTimeMs;              //!< Cycle time of component  [ms]
+  double currentResponseTimeMs{};  //!< response time of brake in current state  [ms]
   units::acceleration::meters_per_second_squared_t currentBrakeDeceleration{};  //!< braking deceleration  [m/s^2]
   double BrakePositionLastCycle{};
 
@@ -170,8 +170,8 @@ private:
   double brakeResponseTimeMs{};  //!< brake response time [ms]
 
   // Inputs:
-  bool reqPrefill = false;     //!< input signal for requesting a prefill
-  double BrakePosition{};      //!< input signal of the brake pedal position
+  bool reqPrefill = false;  //!< input signal for requesting a prefill
+  double BrakePosition{};   //!< input signal of the brake pedal position
 
   // Vehicle Parameters
   units::acceleration::meters_per_second_squared_t maxBrakeDeceleration{};  //!< maximum deceleration of vehicle
diff --git a/sim/src/components/Action_LongitudinalDriver/Action_LongitudinalDriver.xml b/sim/src/components/Action_LongitudinalDriver/Action_LongitudinalDriver.xml
new file mode 100644
index 0000000000000000000000000000000000000000..03a09ee4dabeb4792a0df42120902166b19d76e9
--- /dev/null
+++ b/sim/src/components/Action_LongitudinalDriver/Action_LongitudinalDriver.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>Action_LongitudinalDriver</title>
+  <library>Action_LongitudinalDriver</library>    
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>LongitudinalSignal</type>
+      <title>Longitudinal Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs/>
+</component>
diff --git a/sim/src/components/Action_LongitudinalDriver/CMakeLists.txt b/sim/src/components/Action_LongitudinalDriver/CMakeLists.txt
index b82b24b6e50d9e83979e7347c5d0b0e6f838b533..8354a4c24ea21f30ea6d2ef78919e331e1974b4f 100644
--- a/sim/src/components/Action_LongitudinalDriver/CMakeLists.txt
+++ b/sim/src/components/Action_LongitudinalDriver/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -24,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+	
+  GUIXML 
+    Action_LongitudinalDriver.xml     									  
 )
diff --git a/sim/src/components/Action_LongitudinalDriver/action_longitudinalDriver.cpp b/sim/src/components/Action_LongitudinalDriver/action_longitudinalDriver.cpp
index 0cdc2288a9bc5f0c988a7d3f4a60d7f39d4e9f58..0fc835fc6c9a3470f32436cd42f71d2b323b4596 100644
--- a/sim/src/components/Action_LongitudinalDriver/action_longitudinalDriver.cpp
+++ b/sim/src/components/Action_LongitudinalDriver/action_longitudinalDriver.cpp
@@ -93,7 +93,7 @@ extern "C" ACTION_LONGITUDINAL_DRIVER_SHARED_EXPORT ModelInterface *OpenPASS_Cre
                                                                                         callbacks,
                                                                                         agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -135,7 +135,7 @@ extern "C" ACTION_LONGITUDINAL_DRIVER_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -170,7 +170,7 @@ extern "C" ACTION_LONGITUDINAL_DRIVER_SHARED_EXPORT bool OpenPASS_UpdateOutput(
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -202,7 +202,7 @@ extern "C" ACTION_LONGITUDINAL_DRIVER_SHARED_EXPORT bool OpenPASS_Trigger(ModelI
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Action_Powertrain/Action_Powertrain.xml b/sim/src/components/Action_Powertrain/Action_Powertrain.xml
new file mode 100644
index 0000000000000000000000000000000000000000..81337ac1b38dcb5fdc5e22135628c6df71899ac6
--- /dev/null
+++ b/sim/src/components/Action_Powertrain/Action_Powertrain.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>Action_Powertrain</title>
+  <library>Action_Powertrain</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+	  <parameter>
+      <id>TypeDrivetrain</id>
+      <type>string</type>
+		  <title>TypeDrivetrain</title>
+      <unit/>
+      <value>FWD</value>
+    </parameter>
+	  <parameter>
+      <id>FrontRatioAWD</id>
+      <type>string</type>
+		  <title>FrontRatioAWD</title>
+      <unit/>
+      <value>0.6</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>LongitudinalSignal</type>
+      <title>Longitudinal Control</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>1</id>
+      <type>doubleVector</type>
+      <title>Wheel Rotation Rate</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Tire Drive Torque</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Action_Powertrain/CMakeLists.txt b/sim/src/components/Action_Powertrain/CMakeLists.txt
index 3a3f7c9024c426afb69816bb335ba07823b6c01a..f6963b6a09a9d2f070fb4db99bcadbae989a108a 100644
--- a/sim/src/components/Action_Powertrain/CMakeLists.txt
+++ b/sim/src/components/Action_Powertrain/CMakeLists.txt
@@ -29,4 +29,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+	
+  GUIXML
+    Action_Powertrain.xml
 )
diff --git a/sim/src/components/Action_Powertrain/action_powertrain.cpp b/sim/src/components/Action_Powertrain/action_powertrain.cpp
index d4d3f14e4b69a6db8a4d052eee5a51167783f23a..c22ae04ffe1acacc14d2f6b56f594742172ddcb4 100644
--- a/sim/src/components/Action_Powertrain/action_powertrain.cpp
+++ b/sim/src/components/Action_Powertrain/action_powertrain.cpp
@@ -1,6 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2023-2024 Volkswagen AG
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 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,6 +19,7 @@
 
 #include "src/powertrain.h"
 
+//! Version of this component
 const std::string VERSION = "0.0.1";
 static const CallbackInterface *Callbacks = nullptr;  // NOLINT[cppcoreguidelines-avoid-non-const-global-variables]
 
@@ -41,7 +42,6 @@ extern "C" ACTION_POWERTRAIN_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstan
     AgentInterface *agent,
     const CallbackInterface *callbacks)
 {
-
   Callbacks = callbacks;
 
   try
@@ -58,7 +58,7 @@ extern "C" ACTION_POWERTRAIN_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstan
                                                                   callbacks,
                                                                   agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -92,7 +92,7 @@ extern "C" ACTION_POWERTRAIN_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterf
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -123,7 +123,7 @@ extern "C" ACTION_POWERTRAIN_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInter
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -151,7 +151,7 @@ extern "C" ACTION_POWERTRAIN_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Action_Powertrain/src/engine.cpp b/sim/src/components/Action_Powertrain/src/engine.cpp
index 5ceb9aa1f2e3d3e9b6ba983ac74a153aed4b88c8..6ec5799e1b8c2b9c15e6198cb0baafbfb6e92d54 100644
--- a/sim/src/components/Action_Powertrain/src/engine.cpp
+++ b/sim/src/components/Action_Powertrain/src/engine.cpp
@@ -45,4 +45,4 @@ void Engine::CalculateDriveTorque(double throttlePosition, units::frequency::her
 units::torque::newton_meter_t Engine::GetDriveTorque()
 {
   return driveTorque;
-}
\ No newline at end of file
+}
diff --git a/sim/src/components/Action_Powertrain/src/powertrain.cpp b/sim/src/components/Action_Powertrain/src/powertrain.cpp
index c878e03dfc168208e0af4a4049945e69b6e2d053..cf8f8d6492a98c2ac296402e5ac0ba647ae44da2 100644
--- a/sim/src/components/Action_Powertrain/src/powertrain.cpp
+++ b/sim/src/components/Action_Powertrain/src/powertrain.cpp
@@ -88,12 +88,8 @@ ActionPowertrain::ActionPowertrain(std::string componentName,
     wheelRotationRate[static_cast<int>(2 * i + 1)] = rotationVelocityTire;
   }
   transmission = std::make_unique<Transmission>(gearRatioVector, std::stod(axleRatio.value()));
-  TypeDrivetrain = parameters->GetParametersString().count("TypeDrivetrain") == 1
-                     ? parameters->GetParametersString().at("TypeDrivetrain")
-                     : parameters->GetParametersString().at("1");
-  FrontRatioAWD = parameters->GetParametersDouble().count("FrontRatioAWD") == 1
-                    ? parameters->GetParametersDouble().at("FrontRatioAWD")
-                    : parameters->GetParametersDouble().at("2");
+  TypeDrivetrain = parameters->GetParametersString().at("TypeDrivetrain");
+  FrontRatioAWD = parameters->GetParametersDouble().at("FrontRatioAWD");
 }
 
 ActionPowertrain::~ActionPowertrain()
@@ -102,7 +98,9 @@ ActionPowertrain::~ActionPowertrain()
   transmission.reset();
 }
 
-void ActionPowertrain::UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, [[maybe_unused]] int time)
+void ActionPowertrain::UpdateInput(int localLinkId,
+                                   const std::shared_ptr<SignalInterface const> &data,
+                                   [[maybe_unused]] int time)
 {
   std::stringstream log;
   log << componentname << " (component " << GetComponentName() << ", agent " << std::to_string(GetAgent()->GetId())
@@ -141,9 +139,10 @@ void ActionPowertrain::UpdateInput(int localLinkId, const std::shared_ptr<Signal
   }
 }
 
-void ActionPowertrain::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const> &signal, [[maybe_unused]] int time)
+void ActionPowertrain::UpdateOutput(int localLinkId,
+                                    std::shared_ptr<SignalInterface const> &signal,
+                                    [[maybe_unused]] int time)
 {
-
   std::stringstream log;
   log << componentname << " UpdateOutput";
   LOG(CbkLogLevel::Debug, log.str());
@@ -215,4 +214,4 @@ void ActionPowertrain::Trigger([[maybe_unused]] int time)
   }
 
   DriveTorqueTires.SetValue(torque);
-}
\ No newline at end of file
+}
diff --git a/sim/src/components/Action_Powertrain/src/powertrain.h b/sim/src/components/Action_Powertrain/src/powertrain.h
index 8de685d0e1b7ef006024319694cbd7bf56eb1e60..d30ce990e51200627ba2fcae55404fdffed73c97 100644
--- a/sim/src/components/Action_Powertrain/src/powertrain.h
+++ b/sim/src/components/Action_Powertrain/src/powertrain.h
@@ -75,7 +75,6 @@ public:
    * @param [in] agent           This interface provides access to agent parameters, properties, attributes and dynamic
    * states
    */
-
   ActionPowertrain(std::string componentName,
                    bool isInit,
                    int priority,
@@ -92,16 +91,18 @@ public:
   /*!
    * \brief Holds the signal if there are other with higher priority.
    *
-   * @param[in]    signal     Signal.
-   * @param[in]     time       Timestamp in milliseconds.
+   * @param[in]    localLinkId    Input local link id.
+   * @param[in]    data           Signal.
+   * @param[in]    time           Timestamp in milliseconds.
    */
   void UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, int time) override;
 
   /*!
    * \brief Changes the signal to a signal on hold if there is still on on hold in the current time step.
    *
-   * @param[in]    signal     Signal.
-   * @param[in]     time       Timestamp in milliseconds.
+   * @param[in]    localLinkId    Input local link id.
+   * @param[in]    signal         Signal.
+   * @param[in]    time           Timestamp in milliseconds.
    */
   void UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const> &signal, int time) override;
 
@@ -117,7 +118,7 @@ private:
   std::string TypeDrivetrain;  //!< type of drivetrain
   double FrontRatioAWD;        //!< torque ratio AWD
 
-  LongitudinalSignal longitudinalSignal;                     //!< input for acceleration pedal position
+  LongitudinalSignal longitudinalSignal;  //!< input for acceleration pedal position
   std::vector<units::angular_velocity::radians_per_second_t> wheelRotationRate;  //!< input for wheel rotation rate
 
   std::map<int, ComponentPort *> outputPorts;  //!< map for all OutputPort
@@ -129,4 +130,4 @@ private:
   std::unique_ptr<Transmission> transmission;  //!< Transmission submodule
 };
 
-#endif
\ No newline at end of file
+#endif
diff --git a/sim/src/components/Action_Powertrain/src/transmission.cpp b/sim/src/components/Action_Powertrain/src/transmission.cpp
index a95f6672340182256d38fd3fea15fa1553b12b26..ddea5436527e46d660a2d9e28d8a0727e1eadaf2 100644
--- a/sim/src/components/Action_Powertrain/src/transmission.cpp
+++ b/sim/src/components/Action_Powertrain/src/transmission.cpp
@@ -22,7 +22,7 @@ double Transmission::GetGearRatio(int gear)
     return gearRatio[gear - 1] * axleRatio;
   }
 
-    return 0;
+  return 0;
 }
 
 units::frequency::hertz_t Transmission::GetEngineSpeed(units::frequency::hertz_t speedtransmission, int gear)
@@ -32,5 +32,5 @@ units::frequency::hertz_t Transmission::GetEngineSpeed(units::frequency::hertz_t
     return gearRatio[gear - 1] * axleRatio * speedtransmission;
   }
 
-    return 0_Hz;
-}
\ No newline at end of file
+  return 0_Hz;
+}
diff --git a/sim/src/components/Action_SecondaryDriverTasks/Action_SecondaryDriverTasks.xml b/sim/src/components/Action_SecondaryDriverTasks/Action_SecondaryDriverTasks.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f9b88725531be0a0a0af25d46c370487b09fb9ea
--- /dev/null
+++ b/sim/src/components/Action_SecondaryDriverTasks/Action_SecondaryDriverTasks.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>Action_SecondaryDriverTasks</title>
+  <library>Action_SecondaryDriverTasks</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>SecondaryDriverTasksSignal</type>
+      <title>Secondary Driver Tasks</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs/>
+</component>
diff --git a/sim/src/components/Action_SecondaryDriverTasks/CMakeLists.txt b/sim/src/components/Action_SecondaryDriverTasks/CMakeLists.txt
index 0a24b6e71b84c46358396a42664bd18e2f124fd6..ce42607e4564c199855bb39b732c7c53008e7721 100644
--- a/sim/src/components/Action_SecondaryDriverTasks/CMakeLists.txt
+++ b/sim/src/components/Action_SecondaryDriverTasks/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -24,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Action_SecondaryDriverTasks.xml								   
 )
diff --git a/sim/src/components/Action_SecondaryDriverTasks/action_secondaryDriverTasks.cpp b/sim/src/components/Action_SecondaryDriverTasks/action_secondaryDriverTasks.cpp
index 2f849dbeb7206c2417258893d42596b3ccf66ad6..242fe5479fd1723abd0483a77c511cff70ac2a35 100644
--- a/sim/src/components/Action_SecondaryDriverTasks/action_secondaryDriverTasks.cpp
+++ b/sim/src/components/Action_SecondaryDriverTasks/action_secondaryDriverTasks.cpp
@@ -93,7 +93,7 @@ extern "C" ACTION_SECONDARY_DRIVER_TASKS_SHARED_EXPORT ModelInterface *OpenPASS_
                                                                                           callbacks,
                                                                                           agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -129,7 +129,7 @@ extern "C" ACTION_SECONDARY_DRIVER_TASKS_SHARED_EXPORT bool OpenPASS_UpdateInput
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -158,7 +158,7 @@ extern "C" ACTION_SECONDARY_DRIVER_TASKS_SHARED_EXPORT bool OpenPASS_UpdateOutpu
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -186,7 +186,7 @@ extern "C" ACTION_SECONDARY_DRIVER_TASKS_SHARED_EXPORT bool OpenPASS_Trigger(Mod
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Action_SteeringSystem/Action_SteeringSystem.xml b/sim/src/components/Action_SteeringSystem/Action_SteeringSystem.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f10ba40d87ed008f6dc4bacba3436311eb4a80b0
--- /dev/null
+++ b/sim/src/components/Action_SteeringSystem/Action_SteeringSystem.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>Action_SteeringSystem</title>
+  <library>Action_SteeringSystem</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+	  <parameter>
+      <id>Toe</id>
+      <type>doubleVector</type>
+	    <title>Toe</title>
+      <unit/>
+      <value>0.0,0.0</value>
+	  </parameter>
+	  <parameter>
+      <id>Elasticity</id>
+      <type>doubleVector</type>
+	    <title>Elasticity</title>
+      <unit/>
+      <value>20000</value>
+	  </parameter>
+	  <parameter>
+      <id>Caster</id>
+      <type>doubleVector</type>
+	    <title>Caster</title>
+      <unit/>
+      <value>0.05</value>
+    </parameter>		
+	</parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>SteeringSignal</type>
+      <title>Steering Wheel Angle</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>1</id>
+      <type>SignalVectorDouble</type>
+      <title>Lateral Tire Force</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>		
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Wheel Angle</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Action_SteeringSystem/CMakeLists.txt b/sim/src/components/Action_SteeringSystem/CMakeLists.txt
index d0a64d5d4374c0e5e4c075e2c3b8508e006c30ce..189224ee61c23314c370c256737221fd4518a38c 100644
--- a/sim/src/components/Action_SteeringSystem/CMakeLists.txt
+++ b/sim/src/components/Action_SteeringSystem/CMakeLists.txt
@@ -1,6 +1,6 @@
 ################################################################################
-
 # Copyright (c) 2023-2024 Volkswagen AG
+#               2023 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,7 +22,10 @@ add_openpass_target(
   SOURCES
     action_steeringsystem.cpp
     src/steeringsystem.cpp
-    
+
   LIBRARIES
 	  MantleAPI::MantleAPI
+  
+  GUIXML
+    Action_SteeringSystem.xml  							   
 )
diff --git a/sim/src/components/Action_SteeringSystem/action_steeringsystem.cpp b/sim/src/components/Action_SteeringSystem/action_steeringsystem.cpp
index 39d08119c85628ffbdbf15d0fadc752648aeef42..31864f5a8e86fb07e1fc4641860d4c22f2534e07 100644
--- a/sim/src/components/Action_SteeringSystem/action_steeringsystem.cpp
+++ b/sim/src/components/Action_SteeringSystem/action_steeringsystem.cpp
@@ -19,6 +19,7 @@
 
 #include "src/steeringsystem.h"
 
+//! Version of this component
 const std::string VERSION = "0.0.1";
 static const CallbackInterface *Callbacks = nullptr;  // NOLINT[cppcoreguidelines-avoid-non-const-global-variables]
 
@@ -72,7 +73,7 @@ extern "C" ACTION_STEERINGSYSTEM_SHARED_EXPORT ModelInterface *OpenPASS_CreateIn
                                                                       callbacks,
                                                                       agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -109,7 +110,7 @@ extern "C" ACTION_STEERINGSYSTEM_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -140,7 +141,7 @@ extern "C" ACTION_STEERINGSYSTEM_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelI
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -168,7 +169,7 @@ extern "C" ACTION_STEERINGSYSTEM_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterf
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Action_SteeringSystem/src/steeringsystem.cpp b/sim/src/components/Action_SteeringSystem/src/steeringsystem.cpp
index 9f4cb93359b97ba15ec0b02c9b215383d49e0cfe..a6915aeaee0816adfb49116c5d11336bd0e0eda0 100644
--- a/sim/src/components/Action_SteeringSystem/src/steeringsystem.cpp
+++ b/sim/src/components/Action_SteeringSystem/src/steeringsystem.cpp
@@ -58,24 +58,18 @@ ActionSteeringSystem::ActionSteeringSystem(std::string componentName,
 
 void ActionSteeringSystem::ParseParameters(const ParameterInterface *parameters)
 {
-  std::vector<double> toeTemp = parameters->GetParametersDoubleVector().count("Toe") == 1
-                                  ? parameters->GetParametersDoubleVector().at("Toe")
-                                  : parameters->GetParametersDoubleVector().at("0");
-
+  std::vector<double> toeTemp = parameters->GetParametersDoubleVector().at("Toe");
   toe = std::vector<units::angle::radian_t>(toeTemp.begin(), toeTemp.end());
 
-  steeringElasticity = parameters->GetParametersDoubleVector().count("Elasticity") == 1
-                         ? parameters->GetParametersDoubleVector().at("Elasticity")
-                         : parameters->GetParametersDoubleVector().at("1");
-
-  std::vector<double> casterTemp = parameters->GetParametersDoubleVector().count("Caster") == 1
-                                     ? parameters->GetParametersDoubleVector().at("Caster")
-                                     : parameters->GetParametersDoubleVector().at("2");
+  steeringElasticity = parameters->GetParametersDoubleVector().at("Elasticity");
 
+  std::vector<double> casterTemp = parameters->GetParametersDoubleVector().at("Caster");
   caster = std::vector<units::length::meter_t>(casterTemp.begin(), casterTemp.end());
 }
 
-void ActionSteeringSystem::UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, [[maybe_unused]] int time)
+void ActionSteeringSystem::UpdateInput(int localLinkId,
+                                       const std::shared_ptr<SignalInterface const> &data,
+                                       [[maybe_unused]] int time)
 {
   std::stringstream log;
   log << componentname << " (component " << GetComponentName() << ", agent " << std::to_string(GetAgent()->GetId())
@@ -107,9 +101,10 @@ void ActionSteeringSystem::UpdateInput(int localLinkId, const std::shared_ptr<Si
   }
 }
 
-void ActionSteeringSystem::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const> &data, [[maybe_unused]] int time)
+void ActionSteeringSystem::UpdateOutput(int localLinkId,
+                                        std::shared_ptr<SignalInterface const> &data,
+                                        [[maybe_unused]] int time)
 {
-
   std::stringstream log;
   log << componentname << " UpdateOutput";
   LOG(CbkLogLevel::Debug, log.str());
@@ -160,10 +155,10 @@ void ActionSteeringSystem::CalculateWheelAngle()
   WheelAngle.SetValue(wheelAngle);
 }
 
-void ActionSteeringSystem::Trigger( [[maybe_unused]] int time)
+void ActionSteeringSystem::Trigger([[maybe_unused]] int time)
 {
   // Set OSI steering wheel angle
   GetAgent()->SetSteeringWheelAngle(SteeringWheelAngle);
   // calculate wheel angle
   CalculateWheelAngle();
-}
\ No newline at end of file
+}
diff --git a/sim/src/components/Action_SteeringSystem/src/steeringsystem.h b/sim/src/components/Action_SteeringSystem/src/steeringsystem.h
index 58b1cd63ddd2ad23d252e6d88f8f195a335ade89..8d6a4498ebf6e81f1fb8ffc9e10f2317839b1183 100644
--- a/sim/src/components/Action_SteeringSystem/src/steeringsystem.h
+++ b/sim/src/components/Action_SteeringSystem/src/steeringsystem.h
@@ -49,7 +49,7 @@
 class ActionSteeringSystem : public ActionInterface
 {
 public:
-  // Component Name
+  /// Component Name
   const std::string componentname = "Action_SteeringSystem";
 
   /**
@@ -90,7 +90,7 @@ public:
    * Refer to module description for input channels and input ids.
    *
    * \param[in]     localLinkId    Corresponds to "id" of "ComponentInput"
-   * \param[in]     signal         Referenced signal (copied by sending component)
+   * \param[in]     data           Referenced signal (copied by sending component)
    * \param[in]     time           Current scheduling time
    */
   void UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, int time) override;
@@ -104,7 +104,7 @@ public:
    * Refer to module description for output channels and output ids.
    *
    * \param[in]     localLinkId    Corresponds to "id" of "ComponentOutput"
-   * \param[out]    signal         Referenced signal (copied by this component)
+   * \param[out]    data           Referenced signal (copied by this component)
    * \param[in]     time           Current scheduling time
    */
   void UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const> &data, int time) override;
@@ -148,7 +148,7 @@ private:
   std::vector<double> steeringElasticity{};      //!< constant steering elasticity of steering system
   std::vector<units::angle::radian_t> toe{};     //!< static toe of each tire
   std::vector<units::length::meter_t> caster{};  //!< total caster of steering system
-  double SteeringRatio{};                   //!< constant steering ratio of steering system
+  double SteeringRatio{};                        //!< constant steering ratio of steering system
 };
 
 #endif
diff --git a/sim/src/components/AgentUpdater/AgentUpdater.xml b/sim/src/components/AgentUpdater/AgentUpdater.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b348f90771ccb127b4a73332d9fad2b1372a97b5
--- /dev/null
+++ b/sim/src/components/AgentUpdater/AgentUpdater.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>AgentUpdater</title>
+  <library>AgentUpdater</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>DynamicsSignal</type>
+      <title>Dynamics Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs/>
+</component>
diff --git a/sim/src/components/AgentUpdater/CMakeLists.txt b/sim/src/components/AgentUpdater/CMakeLists.txt
index 84d5d6a3289ee57d64c420f156debf7c13b41984..e983cecacd227425e3a773988f89bbf61c81b51a 100644
--- a/sim/src/components/AgentUpdater/CMakeLists.txt
+++ b/sim/src/components/AgentUpdater/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,4 +26,7 @@ add_openpass_target(
   LIBRARIES
     Common
     MantleAPI::MantleAPI
+  
+  GUIXML 
+    AgentUpdater.xml				  
 )
diff --git a/sim/src/components/AgentUpdater/agentUpdater.cpp b/sim/src/components/AgentUpdater/agentUpdater.cpp
index 15f35cb61a32d693987647c7b71049bcaa9d323c..5e439069164ccebd51280fdc34f7732916fbea71 100644
--- a/sim/src/components/AgentUpdater/agentUpdater.cpp
+++ b/sim/src/components/AgentUpdater/agentUpdater.cpp
@@ -89,7 +89,7 @@ extern "C" AGENT_UPDATER_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance(s
                                                                             callbacks,
                                                                             agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -133,7 +133,7 @@ extern "C" AGENT_UPDATER_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterface
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -170,7 +170,7 @@ extern "C" AGENT_UPDATER_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterface
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -202,7 +202,7 @@ extern "C" AGENT_UPDATER_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *imp
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/AlgorithmAFDM/AlgorithmAFDM.cpp b/sim/src/components/AlgorithmAFDM/AlgorithmAFDM.cpp
index 1953555f2794ec53937ef9664a4023302d5d3055..4e76d8a19ffa6a4b1e047ada4f868e161ba4fd22 100644
--- a/sim/src/components/AlgorithmAFDM/AlgorithmAFDM.cpp
+++ b/sim/src/components/AlgorithmAFDM/AlgorithmAFDM.cpp
@@ -3,7 +3,7 @@
  *               2020 HLRS, University of Stuttgart
  *               2016-2018 ITK Engineering GmbH
  *               2017-2019 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 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,7 +95,7 @@ extern "C" ALGORITHM_AGENTFOLLOWINGDRIVERMODEL_SHARED_EXPORT ModelInterface *Ope
                                                                                    callbacks,
                                                                                    agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -132,7 +132,7 @@ extern "C" ALGORITHM_AGENTFOLLOWINGDRIVERMODEL_SHARED_EXPORT bool OpenPASS_Updat
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -161,7 +161,7 @@ extern "C" ALGORITHM_AGENTFOLLOWINGDRIVERMODEL_SHARED_EXPORT bool OpenPASS_Updat
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -190,7 +190,7 @@ extern "C" ALGORITHM_AGENTFOLLOWINGDRIVERMODEL_SHARED_EXPORT bool OpenPASS_Trigg
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -199,15 +199,6 @@ extern "C" ALGORITHM_AGENTFOLLOWINGDRIVERMODEL_SHARED_EXPORT bool OpenPASS_Trigg
 
     return false;
   }
-  catch (const std::exception &exstd)
-  {
-    if (Callbacks != nullptr)
-    {
-      Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, exstd.what());
-    }
-
-    return false;
-  }
   catch (...)
   {
     if (Callbacks != nullptr)
diff --git a/sim/src/components/AlgorithmAFDM/Algorithm_AgentFollowingDriverModel.xml b/sim/src/components/AlgorithmAFDM/Algorithm_AgentFollowingDriverModel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c1abefe12a5e74ae6cdfe9ccfeb7e813b2966f41
--- /dev/null
+++ b/sim/src/components/AlgorithmAFDM/Algorithm_AgentFollowingDriverModel.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Algorithm_AgentFollowingDriverModel</title>
+  <library>AlgorithmAgentFollowingDriverModel</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>VelocityWish</id>
+      <type>double</type>
+      <title>VelocityWish</title>
+      <unit>m/s</unit>
+      <value>15.0</value>
+    </parameter>
+    <parameter>
+      <id>Delta</id>
+      <type>double</type>
+      <title>Delta</title>
+      <unit></unit>
+      <value>4.0</value>
+    </parameter>
+    <parameter>
+      <id>TGapWish</id>
+      <type>double</type>
+      <title>TGapWish</title>
+      <unit>s</unit>
+      <value>1.5</value>
+    </parameter>
+    <parameter>
+      <id>MinDistance</id>
+      <type>double</type>
+      <title>MinDistance</title>
+      <unit>m</unit>
+      <value>2</value>
+    </parameter>
+    <parameter>
+      <id>MaxAcceleration</id>
+      <type>double</type>
+      <title>MaxAcceleration</title>
+      <unit>m/s^2</unit>
+      <value>2</value>
+    </parameter>
+    <parameter>
+      <id>MaxDeceleration</id>
+      <type>double</type>
+      <title>MaxDeceleration</title>
+      <unit>m/s^2</unit>
+      <value>2</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>SensorDriverSignal</type>
+      <title>Driver Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>LateralSignal</type>
+      <title>Lateral Signal</title>
+      <unit></unit>
+    </output>
+    <output>
+      <id>1</id>
+      <type>SecondaryDriverTasksSignal</type>
+      <title>Secondary Driver Tasks</title>
+      <unit></unit>
+    </output>
+    <output>
+      <id>2</id>
+      <type>AccelerationSignal</type>
+      <title>Acceleration Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/AlgorithmAFDM/CMakeLists.txt b/sim/src/components/AlgorithmAFDM/CMakeLists.txt
index 0f60a9e2fcdaa7f0c784004a0ca6c59004b7e358..42bbfc128d64e0c3203b6e96dab7e7a51be2ef35 100644
--- a/sim/src/components/AlgorithmAFDM/CMakeLists.txt
+++ b/sim/src/components/AlgorithmAFDM/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,4 +26,7 @@ add_openpass_target(
   LIBRARIES
     Common
     MantleAPI::MantleAPI
+  
+  GUIXML 
+    Algorithm_AgentFollowingDriverModel.xml 											 
 )
diff --git a/sim/src/components/AlgorithmAFDM/src/followingDriverModel.cpp b/sim/src/components/AlgorithmAFDM/src/followingDriverModel.cpp
index cacda57b362af789ad0a941393a5734ecf6be03f..8dd9e46d395f337650dfb05c19274988557fa28c 100644
--- a/sim/src/components/AlgorithmAFDM/src/followingDriverModel.cpp
+++ b/sim/src/components/AlgorithmAFDM/src/followingDriverModel.cpp
@@ -2,7 +2,7 @@
  * Copyright (c) 2018-2019 AMFD GmbH
  *               2018-2019 in-tech GmbH
  *               2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *               2023 Volkswagen AG
+ *               2023-2024 Volkswagen AG
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -60,57 +60,28 @@ AlgorithmAgentFollowingDriverModelImplementation::AlgorithmAgentFollowingDriverM
   {
     vWish = units::velocity::meters_per_second_t(parameters->GetParametersDouble().at("VelocityWish"));
   }
-  else if (parameters->GetParametersDouble().count("0"))
-  {
-    vWish = units::velocity::meters_per_second_t(parameters->GetParametersDouble().at("0"));
-  }
-
   if (parameters->GetParametersDouble().count("Delta") > 0)
   {
     delta = parameters->GetParametersDouble().at("Delta");
   }
-  else if (parameters->GetParametersDouble().count("1"))
-  {
-    delta = parameters->GetParametersDouble().at("1");
-  }
-
   if (parameters->GetParametersDouble().count("TGapWish") > 0)
   {
     tGapWish = units::time::second_t(parameters->GetParametersDouble().at("TGapWish"));
   }
-  else if (parameters->GetParametersDouble().count("2"))
-  {
-    tGapWish = units::time::second_t(parameters->GetParametersDouble().at("2"));
-  }
-
   if (parameters->GetParametersDouble().count("MinDistance") > 0)
   {
     minDistance = units::length::meter_t(parameters->GetParametersDouble().at("MinDistance"));
   }
-  else if (parameters->GetParametersDouble().count("3"))
-  {
-    minDistance = units::length::meter_t(parameters->GetParametersDouble().at("3"));
-  }
-
   if (parameters->GetParametersDouble().count("MaxAcceleration") > 0)
   {
     maxAcceleration
         = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().at("MaxAcceleration"));
   }
-  else if (parameters->GetParametersDouble().count("4"))
-  {
-    maxAcceleration = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().at("4"));
-  }
-
   if (parameters->GetParametersDouble().count("MaxDeceleration") > 0)
   {
     decelerationWish
         = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().at("MaxDeceleration"));
   }
-  else if (parameters->GetParametersDouble().count("5"))
-  {
-    decelerationWish = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().at("5"));
-  }
 }
 
 AlgorithmAgentFollowingDriverModelImplementation::~AlgorithmAgentFollowingDriverModelImplementation() = default;
@@ -163,8 +134,12 @@ void AlgorithmAgentFollowingDriverModelImplementation::UpdateOutput(int localLin
   {
     try
     {
-      data = std::make_shared<SecondaryDriverTasksSignal const>(
-          out_indicatorState, out_hornSwitch, out_headLight, out_highBeamLight, out_flasher, componentState);
+      data = std::make_shared<SecondaryDriverTasksSignal const>(static_cast<int>(GetAgent()->GetIndicatorState()),
+                                                                out_hornSwitch,
+                                                                out_headLight,
+                                                                out_highBeamLight,
+                                                                out_flasher,
+                                                                componentState);
     }
     catch (const std::bad_alloc &)
     {
diff --git a/sim/src/components/AlgorithmCar2XSender/AlgorithmCar2XSender.cpp b/sim/src/components/AlgorithmCar2XSender/AlgorithmCar2XSender.cpp
index c031c6102330b00f237b1c182eae5c39db0a6dc4..f674b07272b201840994b226492aade8236ef49d 100644
--- a/sim/src/components/AlgorithmCar2XSender/AlgorithmCar2XSender.cpp
+++ b/sim/src/components/AlgorithmCar2XSender/AlgorithmCar2XSender.cpp
@@ -92,7 +92,7 @@ extern "C" ALGORITHM_CAR_TO_X_SENDER_SHARED_EXPORT ModelInterface *OpenPASS_Crea
                                                                                     callbacks,
                                                                                     agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -135,7 +135,7 @@ extern "C" ALGORITHM_CAR_TO_X_SENDER_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -170,7 +170,7 @@ extern "C" ALGORITHM_CAR_TO_X_SENDER_SHARED_EXPORT bool OpenPASS_UpdateOutput(
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -202,7 +202,7 @@ extern "C" ALGORITHM_CAR_TO_X_SENDER_SHARED_EXPORT bool OpenPASS_Trigger(ModelIn
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/AlgorithmCar2XSender/Algorithm_Car2XSender.xml b/sim/src/components/AlgorithmCar2XSender/Algorithm_Car2XSender.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c42c2cf655c0f917fef99b5437afd5efaa0ec32b
--- /dev/null
+++ b/sim/src/components/AlgorithmCar2XSender/Algorithm_Car2XSender.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Algorithm_Car2XSender</title>
+  <library>AlgorithmCar2XSender</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>SignalStrength</id>
+      <type>double</type>
+      <title>SignalStrength</title>
+      <unit></unit>
+      <value>0</value>
+    </parameter>
+    <parameter>
+      <id>SendPositionXEnabled</id>
+      <type>bool</type>
+      <title>SendPositionXEnabled</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <id>SendPositionYEnabled</id>
+      <type>bool</type>
+      <title>SendPositionYEnabled</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <id>SendVelocityEnabled</id>
+      <type>bool</type>
+      <title>SendVelocityEnabled</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <id>SendAccelerationEnabled</id>
+      <type>bool</type>
+      <title>SendAccelerationEnabled</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <id>SendYawEnabled</id>
+      <type>bool</type>
+      <title>SendYawEnabled</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>	
+  </parameters>
+  <inputs/>
+  <outputs/>
+</component>
diff --git a/sim/src/components/AlgorithmCar2XSender/CMakeLists.txt b/sim/src/components/AlgorithmCar2XSender/CMakeLists.txt
index 8afb45a42c5ce69c1b076dd2f7cc8b8affedd787..4d848a15d6400ac4e2961045fb0402918f844e61 100644
--- a/sim/src/components/AlgorithmCar2XSender/CMakeLists.txt
+++ b/sim/src/components/AlgorithmCar2XSender/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -26,4 +27,7 @@ add_openpass_target(
   LIBRARIES
     open_simulation_interface::open_simulation_interface_shared
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Algorithm_Car2XSender.xml							 
 )
diff --git a/sim/src/components/Algorithm_AEB/Algorithm_AEB.xml b/sim/src/components/Algorithm_AEB/Algorithm_AEB.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eb1992978c49cf9276143a33babc07c2aa762f6a
--- /dev/null
+++ b/sim/src/components/Algorithm_AEB/Algorithm_AEB.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>AEB</title>
+  <library>Algorithm_AEB</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>CollisionDetectionLongitudinalBoundary</id>
+      <type>double</type>
+      <title>CollisionDetectionLongitudinalBoundary</title>
+      <unit>m</unit>
+      <value>4.0</value>
+    </parameter>
+    <parameter>
+      <id>CollisionDetectionLateralBoundary</id>
+      <type>double</type>
+      <title>CollisionDetectionLateralBoundary</title>
+      <unit>m</unit>
+      <value>1.5</value>
+    </parameter>
+    <parameter>
+      <id>TTC</id>
+      <type>double</type>
+      <title>TTC</title>
+      <unit>s</unit>
+      <value>2</value>
+    </parameter>
+    <parameter>
+      <id>Acceleration</id>
+      <type>double</type>
+      <title>Acceleration</title>
+      <unit>m/s^2</unit>
+      <value>-3.0</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>SensorDataSignal</type>
+      <title>Camera</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>AccelerationSignal</type>
+      <title>Acceleration Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Algorithm_AEB/CMakeLists.txt b/sim/src/components/Algorithm_AEB/CMakeLists.txt
index 126cf1a539e33529469f997d742918cd8a0109e6..d25a6dab3e02ba02cf2f9814ed043bb00f940086 100644
--- a/sim/src/components/Algorithm_AEB/CMakeLists.txt
+++ b/sim/src/components/Algorithm_AEB/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -29,4 +30,7 @@ add_openpass_target(
     Boost::headers
     Common
     MantleAPI::MantleAPI
+  
+  GUIXML 
+    Algorithm_AEB.xml					 
 )
diff --git a/sim/src/components/Algorithm_AEB/algorithm_autonomousEmergencyBraking.cpp b/sim/src/components/Algorithm_AEB/algorithm_autonomousEmergencyBraking.cpp
index a0c42f4b450938b0adc4bd512666358b6178be78..3f6d95cef4ba81683caa9e2037303e167e677c18 100644
--- a/sim/src/components/Algorithm_AEB/algorithm_autonomousEmergencyBraking.cpp
+++ b/sim/src/components/Algorithm_AEB/algorithm_autonomousEmergencyBraking.cpp
@@ -84,7 +84,7 @@ extern "C" ALGORITHM_AEB_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance(s
                                                                                     callbacks,
                                                                                     agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -128,7 +128,7 @@ extern "C" ALGORITHM_AEB_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterface
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -165,7 +165,7 @@ extern "C" ALGORITHM_AEB_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterface
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -197,7 +197,7 @@ extern "C" ALGORITHM_AEB_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *imp
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.cpp b/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.cpp
index d062cd9548dd4047778c3084c28b8a9271ddaa6f..b91b223ed3baa12efb26022cd08f1b7880896182 100644
--- a/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.cpp
+++ b/sim/src/components/Algorithm_AEB/src/autonomousEmergencyBraking.cpp
@@ -2,6 +2,7 @@
  * Copyright (c) 2019-2020 in-tech GmbH
  *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *               2022-2023 Hexad GmbH
+ *               2024 Volkswagen 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,20 +96,12 @@ AlgorithmAutonomousEmergencyBrakingImplementation::AlgorithmAutonomousEmergencyB
 void AlgorithmAutonomousEmergencyBrakingImplementation::ParseParameters(const ParameterInterface *parameters)
 {
   collisionDetectionLongitudinalBoundary
-      = units::length::meter_t(parameters->GetParametersDouble().count("CollisionDetectionLongitudinalBoundary") == 1
-                                   ? parameters->GetParametersDouble().at("CollisionDetectionLongitudinalBoundary")
-                                   : parameters->GetParametersDouble().at("0"));
+      = units::length::meter_t(parameters->GetParametersDouble().at("CollisionDetectionLongitudinalBoundary"));
   collisionDetectionLateralBoundary
-      = units::length::meter_t(parameters->GetParametersDouble().count("CollisionDetectionLateralBoundary") == 1
-                                   ? parameters->GetParametersDouble().at("CollisionDetectionLateralBoundary")
-                                   : parameters->GetParametersDouble().at("1"));
-  ttcBrake = units::time::second_t(parameters->GetParametersDouble().count("TTC") == 1
-                                       ? parameters->GetParametersDouble().at("TTC")
-                                       : parameters->GetParametersDouble().at("2"));
+      = units::length::meter_t(parameters->GetParametersDouble().at("CollisionDetectionLateralBoundary"));
+  ttcBrake = units::time::second_t(parameters->GetParametersDouble().at("TTC"));
   brakingAcceleration
-      = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().count("Acceleration") == 1
-                                                             ? parameters->GetParametersDouble().at("Acceleration")
-                                                             : parameters->GetParametersDouble().at("3"));
+      = units::acceleration::meters_per_second_squared_t(parameters->GetParametersDouble().at("Acceleration"));
 
   if (parameters->GetParameterLists().count("SensorLinks") != 0)
   {
diff --git a/sim/src/components/Algorithm_ECU/Algorithm_ECU.xml b/sim/src/components/Algorithm_ECU/Algorithm_ECU.xml
new file mode 100644
index 0000000000000000000000000000000000000000..895466e3677b3e5bd85a7c8e839cc76dabde4a9e
--- /dev/null
+++ b/sim/src/components/Algorithm_ECU/Algorithm_ECU.xml
@@ -0,0 +1,49 @@
+<component>
+  <type>Algorithm</type>
+  <title>Algorithm_ECU</title>
+  <library>Algorithm_ECU</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>10</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters />
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>bool</type>
+      <title>collisionOccurred</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>1</id>
+      <type>bool</type>
+      <title>prio1AssistActivity</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>2</id>
+      <type>bool</type>
+      <title>prio2AssistActivity</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>3</id>
+      <type>bool</type>
+      <title>prio3AssistActivity</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>int</type>
+      <title>index</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Algorithm_ECU/CMakeLists.txt b/sim/src/components/Algorithm_ECU/CMakeLists.txt
index 4344c554d184dc4dd2ffcf69068849a591fd3655..18b3f2eadf0b6adb3659017aeba3e056a964b808 100644
--- a/sim/src/components/Algorithm_ECU/CMakeLists.txt
+++ b/sim/src/components/Algorithm_ECU/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,4 +28,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Algorithm_ECU.xml				   
 )
diff --git a/sim/src/components/Algorithm_ECU/algorithm_ECU.cpp b/sim/src/components/Algorithm_ECU/algorithm_ECU.cpp
index 0af0a3a3364b8c3cb560af0d8880b7147006efc5..22a45a00faf85a5166e2f98b2f5ad075e6a84cb0 100644
--- a/sim/src/components/Algorithm_ECU/algorithm_ECU.cpp
+++ b/sim/src/components/Algorithm_ECU/algorithm_ECU.cpp
@@ -100,7 +100,7 @@ extern "C" ALGORITHM_ECU_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance(s
                                                                               callbacks,
                                                                               agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -145,7 +145,7 @@ extern "C" ALGORITHM_ECU_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterface
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -182,7 +182,7 @@ extern "C" ALGORITHM_ECU_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterface
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -214,7 +214,7 @@ extern "C" ALGORITHM_ECU_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *imp
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Algorithm_FmuWrapper/AlgorithmFmuWrapper.cpp b/sim/src/components/Algorithm_FmuWrapper/AlgorithmFmuWrapper.cpp
index ae5eb6671df3f8b439edff8885082d2893487956..99cfcd39856114433c153ad6af25432dd2ac65e9 100644
--- a/sim/src/components/Algorithm_FmuWrapper/AlgorithmFmuWrapper.cpp
+++ b/sim/src/components/Algorithm_FmuWrapper/AlgorithmFmuWrapper.cpp
@@ -23,7 +23,7 @@ const std::string &OpenPASS_GetVersion()
   return Version;
 }
 
-/// @brief Create an instance of lateral algorithm
+/// @brief Create an instance of fmu wrapper algorithm
 /// @param componentName      Name of the component
 /// @param isInit             If instance initialzed
 /// @param priority           Priority of the instance
@@ -69,7 +69,7 @@ ModelInterface *OpenPASS_CreateInstance(std::string componentName,
                                                                                agent,
                                                                                std::move(scenarioControl)));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -108,7 +108,7 @@ bool OpenPASS_UpdateInput(ModelInterface *implementation,
     implementation->UpdateInput(localLinkId, data, time);
   }
 
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -141,7 +141,7 @@ bool OpenPASS_UpdateOutput(ModelInterface *implementation,
     implementation->UpdateOutput(localLinkId, data, time);
   }
 
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -171,7 +171,7 @@ bool OpenPASS_Trigger(ModelInterface *implementation, int time)
     implementation->Trigger(time);
   }
 
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Algorithm_FmuWrapper/AlgorithmFmuWrapper.h b/sim/src/components/Algorithm_FmuWrapper/AlgorithmFmuWrapper.h
index 9ae0ba71021dc1e632ae45e51ba194141a51cc4b..f42d2bc453de2e2897dfcae3c7e2fdef64a688a8 100644
--- a/sim/src/components/Algorithm_FmuWrapper/AlgorithmFmuWrapper.h
+++ b/sim/src/components/Algorithm_FmuWrapper/AlgorithmFmuWrapper.h
@@ -24,7 +24,7 @@ extern "C"
 {
   ALGORITHM_FMUWRAPPER_SHARED_EXPORT const std::string &OpenPASS_GetVersion();
 
-  /// @brief Create an instance of lateral algorithm
+  /// @brief Create an instance of fmu wrapper algorithm
   /// @param componentName      Name of the component
   /// @param isInit             If instance initialzed
   /// @param priority           Priority of the instance
diff --git a/sim/src/components/Algorithm_FmuWrapper/Algorithm_FmuWrapper.xml b/sim/src/components/Algorithm_FmuWrapper/Algorithm_FmuWrapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6336f595d12ffd76f2ef98c69b9475aeb4cf46af
--- /dev/null
+++ b/sim/src/components/Algorithm_FmuWrapper/Algorithm_FmuWrapper.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>SensorData2TrafficUpdate_FMU</title>
+  <library>Algorithm_FmuWrapper</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>FmuPath</id>
+      <type>string</type>
+      <title>FmuPath</title>
+      <unit></unit>
+      <value>OSMPSDToTUS.fmu</value>
+    </parameter>
+    <parameter>
+      <id>Logging</id>
+      <type>bool</type>
+      <title>Logging</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <id>CsvOutput</id>
+      <type>bool</type>
+      <title>CsvOutput</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>
+    <parameter>
+	  <id>Input_OSMPSensorDataIn</id>
+	  <type>string</type>
+      <title>Input_OSMPSensorDataIn</title>	  
+	  <unit/>
+	  <value>SensorData</value>
+	  </parameter>
+	<parameter>
+	  <id>WriteJson_SensorData</id>
+	  <type>bool</type>
+      <title>WriteJson_SensorData</title>		  
+	  <unit/>
+	  <value>false</value>
+	  </parameter>
+	<parameter>
+	  <id>Output_OSMPTrafficUpdateOut</id>
+	  <type>string</type>
+	  <title>Output_OSMPTrafficUpdateOut</title>	  
+	  <unit/>
+	  <value>TrafficUpdate</value>
+	</parameter>
+	<parameter>
+	  <id>WriteJson_TrafficUpdate</id>
+	  <type>bool</type>
+	  <title>WriteJson_TrafficUpdate</title>	  
+	  <unit/>
+	  <value>false</value>
+	</parameter>	
+  </parameters>
+  <inputs>
+    <input>
+      <id>2</id>
+      <type>signal_in</type>
+      <title>signal_in</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>signal_out</type>
+      <title>signal_out</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
\ No newline at end of file
diff --git a/sim/src/components/Algorithm_FmuWrapper/CMakeLists.txt b/sim/src/components/Algorithm_FmuWrapper/CMakeLists.txt
index f4748ab05f0dfeb8c9586fb904822a7016ff5d1f..45c5a215dabbe88fd6213c0b72638f46a7f7d120 100644
--- a/sim/src/components/Algorithm_FmuWrapper/CMakeLists.txt
+++ b/sim/src/components/Algorithm_FmuWrapper/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -83,4 +84,7 @@ add_openpass_target(
     Common
     CoreCommon
     MantleAPI::MantleAPI
+  
+  GUIXML 
+    Algorithm_FmuWrapper.xml							
 )
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/ChannelDefinitionParser.h b/sim/src/components/Algorithm_FmuWrapper/src/ChannelDefinitionParser.h
index 5d55a0219adadd101ebd8424407323955861d8e2..5ae2adff9c06babaea8c32b939b1cdfc9faf5fa4 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/ChannelDefinitionParser.h
+++ b/sim/src/components/Algorithm_FmuWrapper/src/ChannelDefinitionParser.h
@@ -1,5 +1,5 @@
 /********************************************************************************
- * Copyright (c) 2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2022-2024 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
@@ -77,20 +77,26 @@ enum class FmuInputType
   SensorFusionVelocity,
   SensorFusionVelocityX,
   SensorFusionVelocityY,
-  SensorFusionYaw
+  SensorFusionYaw,
+  IndicatorState,
+  HornSwitch,
+  HeadLightSwitch,
+  HighBeamLightSwitch,
+  FlasherSwitch
 };
 
 //! Type of output signal
 enum class SignalType
 {
-  LateralSignal,
   AccelerationSignal,
-  LongitudinalSignal,
-  SteeringSignal,
-  DynamicsSignal,
   CompCtrlSignal,
   CompCtrlSignalWarningDirection,
-  SensorDataSignal
+  DynamicsSignal,
+  LateralSignal,
+  LongitudinalSignal,
+  SecondaryDriverTasksSignal,
+  SensorDataSignal,
+  SteeringSignal
 };
 
 //! Value in an output signal
@@ -117,7 +123,12 @@ enum class SignalValue
   CompCtrlSignal_WarningLevel,
   CompCtrlSignal_WarningType,
   CompCtrlSignal_WarningIntensity,
-  CompCtrlSignal_WarningDirection
+  CompCtrlSignal_WarningDirection,
+  SecondaryDriverTasksSignal_IndicatorState,
+  SecondaryDriverTasksSignal_HornSwitch,
+  SecondaryDriverTasksSignal_HeadLightSwitch,
+  SecondaryDriverTasksSignal_HighBeamLightSwitch,
+  SecondaryDriverTasksSignal_FlasherSwitch
 };
 
 //! Assignment of a FMU input variable to a value / method of calculation in openPASS
@@ -246,7 +257,12 @@ static std::map<std::string, std::pair<FmuInputType, VariableType>> stringToFmuT
     {"SensorFusionVelocity", {FmuInputType::SensorFusionVelocity, VariableType::Double}},
     {"SensorFusionVelocityX", {FmuInputType::SensorFusionVelocityX, VariableType::Double}},
     {"SensorFusionVelocityY", {FmuInputType::SensorFusionVelocityY, VariableType::Double}},
-    {"SensorFusionYaw", {FmuInputType::SensorFusionYaw, VariableType::Double}}};
+    {"SensorFusionYaw", {FmuInputType::SensorFusionYaw, VariableType::Double}},
+    {"IndicatorState", {FmuInputType::IndicatorState, VariableType::Enum}},
+    {"HornSwitch", {FmuInputType::HornSwitch, VariableType::Bool}},
+    {"HeadLightSwitch", {FmuInputType::HeadLightSwitch, VariableType::Bool}},
+    {"HighBeamLightSwitch", {FmuInputType::HighBeamLightSwitch, VariableType::Bool}},
+    {"FlasherSwitch", {FmuInputType::FlasherSwitch, VariableType::Bool}}};
 
 //! maps the string of the parameter to the enum value for the output types
 static std::map<std::string, std::pair<SignalValue, VariableType>> stringToSignalValueMap{
@@ -272,10 +288,19 @@ static std::map<std::string, std::pair<SignalValue, VariableType>> stringToSigna
     {"CompCtrlSignal_WarningLevel", {SignalValue::CompCtrlSignal_WarningLevel, VariableType::Enum}},
     {"CompCtrlSignal_WarningType", {SignalValue::CompCtrlSignal_WarningType, VariableType::Enum}},
     {"CompCtrlSignal_WarningIntensity", {SignalValue::CompCtrlSignal_WarningIntensity, VariableType::Enum}},
-    {"CompCtrlSignal_WarningDirection", {SignalValue::CompCtrlSignal_WarningDirection, VariableType::Enum}}};
+    {"CompCtrlSignal_WarningDirection", {SignalValue::CompCtrlSignal_WarningDirection, VariableType::Enum}},
+    {"SecondaryDriverTasksSignal_IndicatorState",
+     {SignalValue::SecondaryDriverTasksSignal_IndicatorState, VariableType::Int}},
+    {"SecondaryDriverTasksSignal_HornSwitch", {SignalValue::SecondaryDriverTasksSignal_HornSwitch, VariableType::Bool}},
+    {"SecondaryDriverTasksSignal_HeadLightSwitch",
+     {SignalValue::SecondaryDriverTasksSignal_HeadLightSwitch, VariableType::Bool}},
+    {"SecondaryDriverTasksSignal_HighBeamLightSwitch",
+     {SignalValue::SecondaryDriverTasksSignal_HighBeamLightSwitch, VariableType::Bool}},
+    {"SecondaryDriverTasksSignal_FlasherSwitch",
+     {SignalValue::SecondaryDriverTasksSignal_FlasherSwitch, VariableType::Bool}}};
 
 //! defines which values are needed for each signal
-static std::map<SignalType, std::vector<SignalValue>> valuesOfSignalType{
+static const std::map<SignalType, std::vector<SignalValue>> valuesOfSignalType{
     {SignalType::AccelerationSignal, {SignalValue::AccelerationSignal_Acceleration}},
     {SignalType::LongitudinalSignal,
      {SignalValue::LongitudinalSignal_AccPedalPos,
@@ -299,7 +324,13 @@ static std::map<SignalType, std::vector<SignalValue>> valuesOfSignalType{
       SignalValue::CompCtrlSignal_WarningLevel,
       SignalValue::CompCtrlSignal_WarningType,
       SignalValue::CompCtrlSignal_WarningIntensity}},
-    {SignalType::CompCtrlSignalWarningDirection, {SignalValue::CompCtrlSignal_WarningDirection}}};
+    {SignalType::CompCtrlSignalWarningDirection, {SignalValue::CompCtrlSignal_WarningDirection}},
+    {SignalType::SecondaryDriverTasksSignal,
+     {SignalValue::SecondaryDriverTasksSignal_IndicatorState,
+      SignalValue::SecondaryDriverTasksSignal_HornSwitch,
+      SignalValue::SecondaryDriverTasksSignal_HeadLightSwitch,
+      SignalValue::SecondaryDriverTasksSignal_HighBeamLightSwitch,
+      SignalValue::SecondaryDriverTasksSignal_FlasherSwitch}}};
 
 //! This struct gives the mapping of integer values to enumeration values as defined by the fmu
 struct FmuEnumerations
@@ -313,35 +344,36 @@ struct FmuEnumerations
 };
 
 //! maps the string to the enum value for the component states
-static std::map<std::string, ComponentState> stringToComponentState{{"Undefined", ComponentState::Undefined},
-                                                                    {"Disabled", ComponentState::Disabled},
-                                                                    {"Armed", ComponentState::Armed},
-                                                                    {"Acting", ComponentState::Acting}};
+static const std::map<std::string, ComponentState> stringToComponentState{{"Undefined", ComponentState::Undefined},
+                                                                          {"Disabled", ComponentState::Disabled},
+                                                                          {"Armed", ComponentState::Armed},
+                                                                          {"Acting", ComponentState::Acting}};
 
 //! maps the string to the enum value for the movement domains
-static std::map<std::string, MovementDomain> stringToMovementDomain{{"Undefined", MovementDomain::Undefined},
-                                                                    {"Lateral", MovementDomain::Lateral},
-                                                                    {"Longitudinal", MovementDomain::Longitudinal},
-                                                                    {"Both", MovementDomain::Both}};
+static const std::map<std::string, MovementDomain> stringToMovementDomain{
+    {"Undefined", MovementDomain::Undefined},
+    {"Lateral", MovementDomain::Lateral},
+    {"Longitudinal", MovementDomain::Longitudinal},
+    {"Both", MovementDomain::Both}};
 
 //! maps the string to the enum value for the component warning levels
-static std::map<std::string, ComponentWarningLevel> stringToComponentWarningLevel{
+static const std::map<std::string, ComponentWarningLevel> stringToComponentWarningLevel{
     {"Info", ComponentWarningLevel::INFO}, {"Warning", ComponentWarningLevel::WARNING}};
 
 //! maps the string to the enum value for the component warning types
-static std::map<std::string, ComponentWarningType> stringToComponentWarningType{
+static const std::map<std::string, ComponentWarningType> stringToComponentWarningType{
     {"Optic", ComponentWarningType::OPTIC},
     {"Acoustic", ComponentWarningType::ACOUSTIC},
     {"Haptic", ComponentWarningType::HAPTIC}};
 
 //! maps the string to the enum value for the component warning intensities
-static std::map<std::string, ComponentWarningIntensity> stringToComponentWarningIntensity{
+static const std::map<std::string, ComponentWarningIntensity> stringToComponentWarningIntensity{
     {"Low", ComponentWarningIntensity::LOW},
     {"Medium", ComponentWarningIntensity::MEDIUM},
     {"High", ComponentWarningIntensity::HIGH}};
 
 //! maps the string to the enum value for the component warning directions
-static std::map<std::string, AreaOfInterest> stringToWarningDirection{
+static const std::map<std::string, AreaOfInterest> stringToWarningDirection{
     {"LEFT_FRONT", AreaOfInterest::LEFT_FRONT},
     {"LEFT_FRONT_FAR", AreaOfInterest::LEFT_FRONT_FAR},
     {"RIGHT_FRONT", AreaOfInterest::RIGHT_FRONT},
@@ -426,7 +458,7 @@ public:
       LOGERRORANDTHROW("Unable to add parameter: Variable <" + variableName + "> not defined in FMU");
     }
 
-    const auto& [valueReference, variableType, casuality, variablility] = unmappedVariableItem->second;
+    const auto& [valueReference, variableType, declaredType, causality, variability] = unmappedVariableItem->second;
 
     if constexpr (std::is_same_v<T, std::string>)
     {
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/ChannelDefinitionParser.tpp b/sim/src/components/Algorithm_FmuWrapper/src/ChannelDefinitionParser.tpp
index f7f1f4e29b1aca8a918ed7ed23198ad8f71cd43e..f9afc75de5fdfe85fd0cf74f8ff99385a4fea480 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/ChannelDefinitionParser.tpp
+++ b/sim/src/components/Algorithm_FmuWrapper/src/ChannelDefinitionParser.tpp
@@ -1,5 +1,5 @@
 /********************************************************************************
- * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2023-2024 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
@@ -45,7 +45,7 @@ void ChannelDefinitionParser<FMI>::AddOutputChannel(const std::string& outputTyp
         LOGERRORANDTHROW("Unable to add output channel: Output type <" + outputType + "> not defined in FMU");
     }
 
-    const auto& [valueReference, variableTypeInFmu, casuality, variablility] = unmappedVariableItem->second;
+    const auto& [valueReference, variableTypeInFmu, declaredType, causality, variability] = unmappedVariableItem->second;
     const auto& [fmuOutputType, variableTypeInWrapper] = fmuOutput->second;
 
     if (variableTypeInFmu != variableTypeInWrapper)
@@ -55,13 +55,11 @@ void ChannelDefinitionParser<FMI>::AddOutputChannel(const std::string& outputTyp
 
     std::get<FMI>(fmuOutputs)[fmuOutputType] = valueReference;
 
-    std::get<FMI>(unmappedFmuVariables).erase(unmappedVariableItem);
-
     if (variableTypeInFmu == VariableType::Enum)
     {
-        if (fmuTypeDefinitions.find(outputType) != fmuTypeDefinitions.cend())
+        if (fmuTypeDefinitions.find(declaredType) != fmuTypeDefinitions.cend())
         {
-            for (auto enumItem : fmuTypeDefinitions.at(outputType))
+            for (auto enumItem : fmuTypeDefinitions.at(declaredType))
             {
                 if (fmuOutputType == SignalValue::ComponentState)
                 {
@@ -70,7 +68,7 @@ void ChannelDefinitionParser<FMI>::AddOutputChannel(const std::string& outputTyp
                         LOGERRORANDTHROW("Unable to add output channel: Enumeration value <" + enumItem.second + "> not a valid value for ComponentState");
                     }
                     fmuEnumerations.componentStates.insert(std::make_pair(enumItem.first, stringToComponentState.at(enumItem.second)));
-                }  
+                }
                 else if (fmuOutputType == SignalValue::CompCtrlSignal_MovementDomain)
                 {
                     if (stringToMovementDomain.find(enumItem.second) == stringToMovementDomain.cend())
@@ -78,7 +76,7 @@ void ChannelDefinitionParser<FMI>::AddOutputChannel(const std::string& outputTyp
                         LOGERRORANDTHROW("Unable to add output channel: Enumeration value <" + enumItem.second + "> not a valid value for CompCtrlSignal_MovementDomain");
                     }
                     fmuEnumerations.movementDomains.insert(std::make_pair(enumItem.first, stringToMovementDomain.at(enumItem.second)));
-                } 
+                }
                 else if (fmuOutputType == SignalValue::CompCtrlSignal_WarningLevel)
                 {
                     if (stringToComponentWarningLevel.find(enumItem.second) == stringToComponentWarningLevel.cend())
@@ -115,9 +113,11 @@ void ChannelDefinitionParser<FMI>::AddOutputChannel(const std::string& outputTyp
         }
         else
         {
-            LOGERRORANDTHROW("Unable to add output channel:: Enumeration is not (correctly) defined in FMU for output type <" + outputType + ">");
+            LOGERRORANDTHROW("Unable to add output channel: Enumeration is not (correctly) defined in FMU for declared type <" + declaredType + ">");
         }
     }
+
+    std::get<FMI>(unmappedFmuVariables).erase(unmappedVariableItem);
 }
 
 template <size_t FMI>
@@ -151,7 +151,7 @@ void ChannelDefinitionParser<FMI>::AddInputChannel(const std::string& inputType,
         LOGERRORANDTHROW("Unable to add input channel: Input type <" + inputType + "> not defined in FMU");
     }
 
-    const auto& [valueReference, variableTypeInFmu, casuality, variablility] = unmappedVariableItem->second;
+    const auto& [valueReference, variableTypeInFmu, declaredType, causality, variability] = unmappedVariableItem->second;
     const auto& [fmuInputType, variableTypeInWrapper] = fmuInput->second;
 
     if (variableTypeInFmu != variableTypeInWrapper)
@@ -163,7 +163,7 @@ void ChannelDefinitionParser<FMI>::AddInputChannel(const std::string& inputType,
     {
         std::get<FMI>(fmuRealInputs).emplace_back(fmuInputType, additionalParameter, valueReference);
     }
-    else if (variableTypeInFmu == VariableType::Int)
+    else if (variableTypeInFmu == VariableType::Int || variableTypeInFmu == VariableType::Enum)
     {
         std::get<FMI>(fmuIntegerInputs).emplace_back(fmuInputType, additionalParameter, valueReference);
     }
@@ -282,4 +282,4 @@ void ChannelDefinitionParser<FMI>::Log(CbkLogLevel logLevel, const char *file, i
     {
         callbacks->Log(logLevel, file, line, message);
     }
-}
\ No newline at end of file
+}
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/FmiImporter/src/Common/fmuChecker.c b/sim/src/components/Algorithm_FmuWrapper/src/FmiImporter/src/Common/fmuChecker.c
index 0cb1dca7177c009b8861787492ec32dce222b3c4..671dc8b179b059d6bf217d543fdcaf73682f6d16 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/FmiImporter/src/Common/fmuChecker.c
+++ b/sim/src/components/Algorithm_FmuWrapper/src/FmiImporter/src/Common/fmuChecker.c
@@ -1,7 +1,7 @@
 /*
     Copyright (C) 2012 Modelon AB <http://www.modelon.com>
                   2020, 2021 in-tech GmbH
-                  2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+                  2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 
     You should have received a copy of the LICENCE-FMUChecker.txt
     along with this program. If not, contact Modelon AB.
@@ -21,11 +21,12 @@
 #if (defined(_WIN32) || defined(WIN32)) && !defined(CROSS_COMPILING)
 #include <Shlwapi.h>
 #include <wchar.h>
+#elif defined(__clang__)
+#include <wchar.h>
 #endif
 
 #ifdef CROSS_COMPILING
-#include <shlwapi.h> 
-#include <wchar.h>
+#include <shlwapi.h>
 #endif
 
 // #include <config_test.h>
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/FmuCommunication.tpp b/sim/src/components/Algorithm_FmuWrapper/src/FmuCommunication.tpp
index c6be257b0ec4b186f4ef1a503afeef9d9c25643a..3563f6d9e167e6fba677aacb07323c29dc269205 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/FmuCommunication.tpp
+++ b/sim/src/components/Algorithm_FmuWrapper/src/FmuCommunication.tpp
@@ -446,9 +446,12 @@ FmuVariables FmuCommunication<FMI>::GetFmuVariables()
             const fmi1_value_reference_t fmuValueReference = fmi1_import_get_variable_vr(fmuVar);
             const fmi1_base_type_enu_t fmuVarType = fmi1_import_get_variable_base_type(fmuVar);
             const VariableType variableType = FmiTypeToCType(fmuVarType);
+            fmi1_import_variable_typedef_t *fmuDeclaredType = fmi1_import_get_variable_declared_type(fmuVar);
+            std::string declaredType = "";
+            if(fmuDeclaredType) declaredType = fmi1_import_get_type_name(fmuDeclaredType);
             const fmi1_causality_enu_t causality = fmi1_import_get_causality(fmuVar);
             const fmi1_variability_enu_t variability = fmi1_import_get_variability(fmuVar);
-            fmuVariables1.push_back(std::make_pair(fmuVarName, *std::make_shared<FmuVariable1>(fmuValueReference, variableType, causality, variability)));
+            fmuVariables1.push_back(std::make_pair(fmuVarName, *std::make_shared<FmuVariable1>(fmuValueReference, variableType, declaredType, causality, variability)));
         }
         fmuVariables = std::unordered_map<std::string, FmuVariable1>(fmuVariables1.begin(), fmuVariables1.end());
         fmi1_import_free_variable_list(fmuVariableList);
@@ -467,10 +470,13 @@ FmuVariables FmuCommunication<FMI>::GetFmuVariables()
             const fmi2_value_reference_t fmuValueReference = fmi2_import_get_variable_vr(fmuVar);
             const fmi2_base_type_enu_t fmuVarType = fmi2_import_get_variable_base_type(fmuVar);
             const VariableType variableType = FmiTypeToCType(fmuVarType);
+            fmi2_import_variable_typedef_t *fmuDeclaredType = fmi2_import_get_variable_declared_type(fmuVar);
+            std::string declaredType = "";
+            if(fmuDeclaredType) declaredType = fmi2_import_get_type_name(fmuDeclaredType);
             const fmi2_causality_enu_t causality = fmi2_import_get_causality(fmuVar);
             const fmi2_variability_enu_t variability = fmi2_import_get_variability(fmuVar);
 
-            fmuVariables2.push_back(std::make_pair(fmuVarName, *std::make_shared<FmuVariable2>(fmuValueReference, variableType, causality, variability)));
+            fmuVariables2.push_back(std::make_pair(fmuVarName, *std::make_shared<FmuVariable2>(fmuValueReference, variableType, declaredType, causality, variability)));
         }
         fmuVariables = std::unordered_map<std::string, FmuVariable2>(fmuVariables2.begin(), fmuVariables2.end());
         fmi2_import_free_variable_list(fmuVariableList);
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.cpp b/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.cpp
index fb34ec15e8e01a1b61c5274f46dddfa2cb1abdcc..fdf2e38df12b4e9204e21fff67afd8926cb3aacf 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.cpp
+++ b/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.cpp
@@ -1 +1,11 @@
-#include "FmuHandler.h"
\ No newline at end of file
+/*******************************************************************************
+ * Copyright (c) 2024 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 "FmuHandler.h"
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.h b/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.h
index 4deb4eee478a1eae0cbe107164849b89c79965e7..346732485998b9316a67b1620ddf39a2f0c71e37 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.h
+++ b/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.h
@@ -169,6 +169,7 @@ private:
       {"ConfigPath", [this]() { return parameters->GetRuntimeInformation().directories.configuration; }},
       {"OutputPath", [this]() { return outputBaseDir.string(); }},
       {"MaxSteering", [this]() { return GetVehicleProperties()->front_axle.max_steering.template to<double>(); }},
+      {"AxleRatio", [this]() { return ValueFromEntityProperty<double>("AxleRatio"); }},
       {"SteeringRatio", [this]() { return ValueFromEntityProperty<double>("SteeringRatio"); }},
       {"NumberOfGears", [this]() { return ValueFromEntityProperty<int>("NumberOfGears"); }},
       {"GearRatio",
@@ -502,6 +503,7 @@ private:
                                        {2, SignalType::LongitudinalSignal},
                                        {3, SignalType::SteeringSignal},
                                        {4, SignalType::CompCtrlSignal},
+                                       {5, SignalType::SecondaryDriverTasksSignal},
                                        {6, SignalType::SensorDataSignal}};
 
   //! defines the osi message used for calculating the output of each output link
@@ -511,6 +513,7 @@ private:
                                            {2, std::monostate{}},
                                            {3, std::monostate{}},
                                            {4, std::monostate{}},
+                                           {5, std::monostate{}},
                                            {6, std::monostate{}}};
 };
 
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.tpp b/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.tpp
index e5d9f20844032079c60c4c11bcccd5cb5d099483..d0297cc4c51dcf820952ed3805b32e1673e1b6aa 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.tpp
+++ b/sim/src/components/Algorithm_FmuWrapper/src/FmuHandler.tpp
@@ -9,6 +9,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
+#include <MantleAPI/Traffic/vehicle_light_properties.h>
 #include <exception>
 #include <numeric>
 #include <stdexcept>
@@ -401,6 +402,106 @@ void FmuHandler<FMI>::UpdateOutput(int localLinkId,
   LOGDEBUG("UpdateOutput finished");
 }
 
+template <typename Input>
+std::string as_string(Input&& value)
+{
+  if constexpr (std::is_same_v<std::decay_t<Input>, std::string>)
+  {
+    return std::forward<Input>(value);
+  }
+  else
+  {
+    using std::to_string;
+    return to_string(std::forward<Input>(value));
+  }
+}
+
+namespace mantle_api
+{
+namespace details
+{
+constexpr std::array<std::string_view, 14> vehicle_light_type_to_string_view{"Undefined",
+                                                                             "BrakeLights",
+                                                                             "DaytimeRunningLights",
+                                                                             "FogLights",
+                                                                             "FogLightsFront",
+                                                                             "FogLightsRear",
+                                                                             "HighBeam",
+                                                                             "IndicatorLeft",
+                                                                             "IndicatorRight",
+                                                                             "LicensePlateIllumination",
+                                                                             "LowBeam",
+                                                                             "ReversingLights",
+                                                                             "SpecialPurposeLights",
+                                                                             "WarningLights"};
+}  // namespace details
+
+/// Converts a VehicleLightType to a std::string_view
+constexpr std::string_view to_string_view(VehicleLightType value)
+{
+  return details::vehicle_light_type_to_string_view.at(static_cast<size_t>(value));
+}
+
+// Converts a string view to a VehicleLightType
+template <typename StringView>
+VehicleLightType to_vehicle_light_type(StringView value)
+{
+  if (const auto match{std::find(
+          details::vehicle_light_type_to_string_view.begin(), details::vehicle_light_type_to_string_view.end(), value)};
+      match != details::vehicle_light_type_to_string_view.end())
+  {
+    return VehicleLightType{static_cast<std::underlying_type_t<VehicleLightType>>(
+        std::distance(details::vehicle_light_type_to_string_view.begin(), match))};
+  }
+  return VehicleLightType::kUndefined;
+}
+
+namespace details
+{
+constexpr std::array<std::string_view, 4> light_mode_to_string_view{"Undefined", "Flashing", "Off", "On"};
+}  // namespace details
+
+/// Converts a LightMode to a std::string_view
+constexpr std::string_view to_string_view(LightMode value)
+{
+  return details::light_mode_to_string_view.at(static_cast<size_t>(value));
+}
+
+// Converts a string view to a LightMode
+template <typename StringView>
+LightMode to_light_mode(StringView value)
+{
+  if (const auto match{
+          std::find(details::light_mode_to_string_view.begin(), details::light_mode_to_string_view.end(), value)};
+      match != details::light_mode_to_string_view.end())
+  {
+    return LightMode{static_cast<std::underlying_type_t<LightMode>>(
+        std::distance(details::light_mode_to_string_view.begin(), match))};
+  }
+  return LightMode::kUndefined;
+}
+
+/// Converts a LightState to a std::string_view
+constexpr std::string_view to_string_view(LightState value)
+{
+  return to_string_view(value.light_mode);
+}
+
+// Converts a string view to a LightState
+template <typename StringView>
+LightState to_light_state(StringView value)
+{
+  return {to_light_mode(value)};
+}
+
+/// Converts any type for which to_string_view is overloaded to a std::string
+template <typename Input>
+auto to_string(Input&& value) -> decltype(to_string_view(std::forward<Input>(value)), std::string{})
+{
+  return std::string{to_string_view(std::forward<Input>(value))};
+}
+}  //namespace mantle_api
+
 template <size_t FMI>
 void FmuHandler<FMI>::PreStep([[maybe_unused]] int time)
 {
@@ -639,6 +740,9 @@ void FmuHandler<FMI>::PreStep([[maybe_unused]] int time)
                       ? 0
                       : sensorFusionInfo[std::get<size_t>(fmuInput.additionalParameter)].lane;
         break;
+      case FmuInputType::IndicatorState:
+        dataToAdd = static_cast<int>(agent->GetIndicatorState());
+        break;
       default:
         LOGERRORANDTHROW("Input can not be mapped to variable of type Integer");
     }
@@ -665,6 +769,18 @@ void FmuHandler<FMI>::PreStep([[maybe_unused]] int time)
       case FmuInputType::ExistenceFrontFront:
         dataToAdd = static_cast<bool>(frontfrontObject);
         break;
+      case FmuInputType::HornSwitch:
+        dataToAdd = agent->GetHorn();
+        break;
+      case FmuInputType::HeadLightSwitch:
+        dataToAdd = agent->GetHeadLight();
+        break;
+      case FmuInputType::HighBeamLightSwitch:
+        dataToAdd = agent->GetHighBeamLight();
+        break;
+      case FmuInputType::FlasherSwitch:
+        dataToAdd = agent->GetFlasher();
+        break;
       default:
         LOGERRORANDTHROW("Only ExistenceFront and ExistenceFrontFront can be mapped to variable of type Boolean");
     }
@@ -731,6 +847,17 @@ void FmuHandler<FMI>::PreStep([[maybe_unused]] int time)
         FmuHelper::AddTrafficCommandActionFromOpenScenarioTrajectory(trafficCommand.add_action(), trajectory);
       }
     }
+    for (auto input : scenarioControl->GetStrategies(mantle_api::ControlStrategyType::kUpdateVehicleLightStates))
+    {
+      auto strategy{std::dynamic_pointer_cast<mantle_api::VehicleLightStatesControlStrategy>(input)};
+      if (strategy != nullptr)
+      {
+        auto& action{*trafficCommand.add_action()->mutable_custom_action()};
+        std::visit([&action](auto&& value) { action.set_command_type("UpdateLightState " + as_string(value)); },
+                   strategy->light_type);
+        action.set_command(to_string(strategy->light_state));
+      }
+    }
     if (scenarioControl->HasNewLongitudinalStrategy())
     {
       for (auto strategy : scenarioControl->GetStrategies(mantle_api::ControlStrategyType::kFollowVelocitySpline))
@@ -962,7 +1089,7 @@ void FmuHandler<FMI>::ParseFmuParametersStochastic(const ParameterInterface* par
       if (unmappedVariableItem->second.variableType != VariableType::Double)
         LOGERRORANDTHROW(FmuHelper::log_prefix(agentIdString) + "Variable \"" + channelType
                          + "\" has different type in FMU");
-      const auto& [valueReference, variableType, causality, variablility] = unmappedVariableItem->second;
+      const auto& [valueReference, variableType, declaredType, causality, variability] = unmappedVariableItem->second;
       auto sampledValue = Sampler::RollForStochasticAttribute(paramValue, stochastics);
       std::get<FMI>(fmuDoubleParameters).emplace_back(sampledValue, valueReference);
     }
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/DynamicsSignalParser.cpp b/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/DynamicsSignalParser.cpp
index d93fa9053b3dee191f9fac55bd483aada94d5fe3..ae46f541c5b61af51e29cfcd16fb4419cc8b7297 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/DynamicsSignalParser.cpp
+++ b/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/DynamicsSignalParser.cpp
@@ -60,4 +60,4 @@ std::shared_ptr<const SignalInterface> DynamicsSignalParser::Translate(
   }
   return std::make_shared<DynamicsSignal const>(
       ComponentState::Disabled, DynamicsInformation{}, componentName, componentName);
-}
\ No newline at end of file
+}
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalMessageVisitor.cpp b/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalMessageVisitor.cpp
index cd1da9aebc63820d4707d4e6877de17ef7ed9360..4f80a85830b7220915dfb8276a8de9372d187f57 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalMessageVisitor.cpp
+++ b/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalMessageVisitor.cpp
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2023-2024 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
@@ -10,7 +10,7 @@
 
 #include "SignalMessageVisitor.h"
 
-#include <utility>
+#include "common/secondaryDriverTasksSignal.h"
 
 namespace SignalMessage
 {
@@ -83,4 +83,28 @@ std::shared_ptr<const SignalInterface> Parse<SignalType::CompCtrlSignal>(
   return CompCtrlSignalParser::Translate(outputSignals, componentState, fmuEnumerations, getFmuSignalValue);
 }
 
+template <>
+std::shared_ptr<const SignalInterface> Parse<SignalType::SecondaryDriverTasksSignal>(
+    const std::set<SignalType> &signals,
+    ComponentState componentState,
+    const FmuEnumerations &,
+    const std::function<FmuValue &(SignalValue, VariableType)> &getFmuSignalValue)
+{
+  if (std::find(signals.cbegin(), signals.cend(), SignalType::SecondaryDriverTasksSignal) == signals.cend())
+  {
+    return std::make_shared<const SecondaryDriverTasksSignal>(0, false, false, false, false, componentState);
+  }
+  return std::make_shared<const SecondaryDriverTasksSignal>(
+      getFmuSignalValue(SignalValue::SecondaryDriverTasksSignal_IndicatorState, VariableType::Int)
+          .intValue,  // NOLINT(cppcoreguidelines-pro-type-union-access)
+      getFmuSignalValue(SignalValue::SecondaryDriverTasksSignal_HornSwitch, VariableType::Bool)
+          .boolValue,  // NOLINT(cppcoreguidelines-pro-type-union-access)
+      getFmuSignalValue(SignalValue::SecondaryDriverTasksSignal_HeadLightSwitch, VariableType::Bool)
+          .boolValue,  // NOLINT(cppcoreguidelines-pro-type-union-access)
+      getFmuSignalValue(SignalValue::SecondaryDriverTasksSignal_HighBeamLightSwitch, VariableType::Bool)
+          .boolValue,  // NOLINT(cppcoreguidelines-pro-type-union-access)
+      getFmuSignalValue(SignalValue::SecondaryDriverTasksSignal_FlasherSwitch, VariableType::Bool)
+          .boolValue,  // NOLINT(cppcoreguidelines-pro-type-union-access)
+      componentState);
+}
 }  // namespace SignalMessage
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalMessageVisitor.h b/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalMessageVisitor.h
index da0a25739dd63c59318dd7ca6f90d01d6b127425..0eb5ebd0dcf31f1b0d74b48aeb03cd126bdcf82d 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalMessageVisitor.h
+++ b/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalMessageVisitor.h
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2023-2024 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
@@ -106,4 +106,11 @@ std::shared_ptr<const SignalInterface> Parse<SignalType::CompCtrlSignal>(
     const FmuEnumerations &fmuEnumerations,
     const std::function<FmuValue &(SignalValue, VariableType)> &getFmuSignalValue);
 
-}  // namespace SignalMessage
\ No newline at end of file
+template <>
+std::shared_ptr<const SignalInterface> Parse<SignalType::SecondaryDriverTasksSignal>(
+    const std::set<SignalType> &outputSignals,
+    ComponentState componentState,
+    const FmuEnumerations &,
+    const std::function<FmuValue &(SignalValue, VariableType)> &getFmuSignalValue);
+
+}  // namespace SignalMessage
diff --git a/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalTranslator.h b/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalTranslator.h
index fa9f55fde77c45c3b92113119dd35bc48d267ef3..f4032265071c98890da47a293fe7f21fb9644edf 100644
--- a/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalTranslator.h
+++ b/sim/src/components/Algorithm_FmuWrapper/src/SignalInterface/SignalTranslator.h
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2021-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2021-2024 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
@@ -131,6 +131,9 @@ struct OutputSignalVisitor
         case (SignalType::CompCtrlSignal):
           return SignalMessage::Parse<SignalType::CompCtrlSignal>(
               outputSignals, componentState, fmuEnumerations, getFmuSignalValue);
+        case (SignalType::SecondaryDriverTasksSignal):
+          return SignalMessage::Parse<SignalType::SecondaryDriverTasksSignal>(
+              outputSignals, componentState, fmuEnumerations, getFmuSignalValue);
         default:
           throw std::runtime_error("SignalTranslator: Unsupported SignalType "
                                    + std::to_string(static_cast<int>(outputType)));
diff --git a/sim/src/components/Algorithm_Lateral/Algorithm_Lateral.xml b/sim/src/components/Algorithm_Lateral/Algorithm_Lateral.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eb6a2e27c4ef1f9bf72a8faf22f0c403d05a5dce
--- /dev/null
+++ b/sim/src/components/Algorithm_Lateral/Algorithm_Lateral.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Algorithm_Lateral</title>
+  <library>Algorithm_Lateral</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>LateralSignal</type>
+      <title>Lateral Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>100</id>
+      <type>ParametersVehicleSignal</type>
+      <title>Vehicle Parameters</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>101</id>
+      <type>SensorDriverSignal</type>
+      <title>Driver Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>SteeringSignal</type>
+      <title>Steering Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Algorithm_Lateral/CMakeLists.txt b/sim/src/components/Algorithm_Lateral/CMakeLists.txt
index 254d6e79df0516731d0e027436ca8e1fceccd4ca..cbcfeec20830b7e87641df59d6b83d46e6c56682 100644
--- a/sim/src/components/Algorithm_Lateral/CMakeLists.txt
+++ b/sim/src/components/Algorithm_Lateral/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,5 +28,8 @@ add_openpass_target(
   LIBRARIES
     Common
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Algorithm_Lateral.xml						   
 )
 
diff --git a/sim/src/components/Algorithm_Lateral/algorithm_lateral.cpp b/sim/src/components/Algorithm_Lateral/algorithm_lateral.cpp
index 6782290c8885af78d60a6ba2adb118f1897a7163..dbd08b112bc2bc15294d56b0431940b99b5921a1 100644
--- a/sim/src/components/Algorithm_Lateral/algorithm_lateral.cpp
+++ b/sim/src/components/Algorithm_Lateral/algorithm_lateral.cpp
@@ -92,7 +92,7 @@ extern "C" ALGORITHM_LATERAL_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstan
                                                                                 callbacks,
                                                                                 agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -136,7 +136,7 @@ extern "C" ALGORITHM_LATERAL_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterf
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -173,7 +173,7 @@ extern "C" ALGORITHM_LATERAL_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInter
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -205,7 +205,7 @@ extern "C" ALGORITHM_LATERAL_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Algorithm_Longitudinal/Algorithm_Longitudinal.xml b/sim/src/components/Algorithm_Longitudinal/Algorithm_Longitudinal.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e516448f81a8d616a44ad64565fc9375c7f09e5c
--- /dev/null
+++ b/sim/src/components/Algorithm_Longitudinal/Algorithm_Longitudinal.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Algorithm_Longitudinal</title>
+  <library>Algorithm_Longitudinal</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>AccelerationSignal</type>
+      <title>Acceleration Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>1</id>
+      <type>ParametersVehicleSignal</type>
+      <title>Vehicle Parameters</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>3</id>
+      <type>SensorDriverSignal</type>
+      <title>Driver Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>LongitudinalSignal</type>
+      <title>Longitudinal Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Algorithm_Longitudinal/CMakeLists.txt b/sim/src/components/Algorithm_Longitudinal/CMakeLists.txt
index 82370cc81e78a82c1525a476000e9175534c4dd4..8b252526859a40e6051c9dbb4bea6265b0130504 100644
--- a/sim/src/components/Algorithm_Longitudinal/CMakeLists.txt
+++ b/sim/src/components/Algorithm_Longitudinal/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -26,4 +27,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Algorithm_Longitudinal.xml	 						  
 )
diff --git a/sim/src/components/Algorithm_Longitudinal/algorithm_longitudinal.cpp b/sim/src/components/Algorithm_Longitudinal/algorithm_longitudinal.cpp
index 3ec4e583a5d5d7833734c7a74cf034034c5733cc..8e366998d8a81f9b5873c9f7bde57283be425ae5 100644
--- a/sim/src/components/Algorithm_Longitudinal/algorithm_longitudinal.cpp
+++ b/sim/src/components/Algorithm_Longitudinal/algorithm_longitudinal.cpp
@@ -48,7 +48,7 @@ extern "C" ALGORITHM_LONGITUDINAL_SHARED_EXPORT const std::string &OpenPASS_GetV
   return Version;
 }
 
-/// @brief Create an instance of lateral algorithm
+/// @brief Create an instance of longitudinal algorithm
 /// @param componentName    Name of the component
 /// @param isInit           If instance initialzed
 /// @param priority         Priority of the instance
@@ -92,7 +92,7 @@ extern "C" ALGORITHM_LONGITUDINAL_SHARED_EXPORT ModelInterface *OpenPASS_CreateI
                                                                                      callbacks,
                                                                                      agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -135,7 +135,7 @@ extern "C" ALGORITHM_LONGITUDINAL_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -172,7 +172,7 @@ extern "C" ALGORITHM_LONGITUDINAL_SHARED_EXPORT bool OpenPASS_UpdateOutput(Model
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -204,7 +204,7 @@ extern "C" ALGORITHM_LONGITUDINAL_SHARED_EXPORT bool OpenPASS_Trigger(ModelInter
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Algorithm_Routecontrol/Algorithm_RouteControl.xml b/sim/src/components/Algorithm_Routecontrol/Algorithm_RouteControl.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a660ad195a410478e69d6c8e04de76e807ef08e2
--- /dev/null
+++ b/sim/src/components/Algorithm_Routecontrol/Algorithm_RouteControl.xml
@@ -0,0 +1,84 @@
+<component>
+  <type>Algorithm</type>
+  <title>Algorithm_RouteControl</title>
+  <library>Algorithm_RouteControl</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>10</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>DrivingAggressiveness</id>
+      <type>double</type>
+      <title>Driver aggressiveness</title>
+      <unit></unit>
+      <value>1.0</value>
+    </parameter>
+    <parameter>
+      <id>PedalsKp</id>
+      <type>double</type>
+      <title>Kp of the pedals PID control</title>
+      <unit></unit>
+      <value>-0.5</value>
+    </parameter>
+    <parameter>
+      <id>PedalsKi</id>
+      <type>double</type>
+      <title>Ki of the pedals PID control</title>
+      <unit></unit>
+      <value>-0.4</value>
+    </parameter>
+    <parameter>
+      <id>PedalsKd</id>
+      <type>double</type>
+      <title>Kd of the pedals PID control</title>
+      <unit></unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>SteeringKp</id>
+      <type>double</type>
+      <title>Kp of the steering PID control</title>
+      <unit></unit>
+      <value>-18.0</value>
+    </parameter>
+    <parameter>
+      <id>SteeringKi</id>
+      <type>double</type>
+      <title>Ki of the steering PID control</title>
+      <unit></unit>
+      <value>-0.6</value>
+    </parameter>
+    <parameter>
+      <id>SteeringKd</id>
+      <type>double</type>
+      <title>Kd of the steering PID control</title>
+      <unit></unit>
+      <value>0.0</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>TrajectoryEvent</type>
+      <title>Desired trajectory</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>ControlData</type>
+      <title>LongitudinalSignal</title>
+      <unit></unit>
+    </output>
+    <output>
+      <id>1</id>
+      <type>ControlData</type>
+      <title>SteeringSignal</title>
+      <unit></unit>
+    </output>    
+  </outputs>
+</component>
diff --git a/sim/src/components/Algorithm_Routecontrol/CMakeLists.txt b/sim/src/components/Algorithm_Routecontrol/CMakeLists.txt
index b1b92e638356082d85d341e6c0e538f4fb7d08c9..b3501fd534992d3416105cb20848a15fda045d0f 100644
--- a/sim/src/components/Algorithm_Routecontrol/CMakeLists.txt
+++ b/sim/src/components/Algorithm_Routecontrol/CMakeLists.txt
@@ -20,7 +20,6 @@ add_openpass_target(
     algorithm_RouteControl_implementation.h
     algorithm_RouteControl_global.h
     routeControl.h
-  
 
   SOURCES
     algorithm_RouteControl.cpp
@@ -30,4 +29,7 @@ add_openpass_target(
   LIBRARIES
     Common
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Algorithm_RouteControl.xml							  
 )
diff --git a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl.cpp b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl.cpp
index b6408c92b8625f9e9f175ddec4978beaf5565e33..ae772a3ddd1c8db9daaf3723ac0c6b36fdc014d6 100644
--- a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl.cpp
+++ b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl.cpp
@@ -109,7 +109,7 @@ extern "C" ALGORITHM_ROUTECONTROL_SHARED_EXPORT ModelInterface *OpenPASS_CreateI
                                                                                        agent,
                                                                                        std::move(scenarioControl)));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -152,7 +152,7 @@ extern "C" ALGORITHM_ROUTECONTROL_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -189,7 +189,7 @@ extern "C" ALGORITHM_ROUTECONTROL_SHARED_EXPORT bool OpenPASS_UpdateOutput(Model
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -221,7 +221,7 @@ extern "C" ALGORITHM_ROUTECONTROL_SHARED_EXPORT bool OpenPASS_Trigger(ModelInter
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.cpp b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.cpp
index 9140d5162c737f953fa3b84b01799bbcccb74a6e..5d423a92e7dd7c873000e5e0ff41868179bcb8a6 100644
--- a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.cpp
+++ b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.cpp
@@ -13,7 +13,7 @@
 /**
  * @defgroup module_rc Route Control
  * image html @cond RC_00_Overview.png @endcond "RouteControl function overview"
- * This algorithm receives a trajectory in two dimensions (x- and y-values in cartzesian coordinates with corresponding
+ * This algorithm receives a trajectory in two dimensions (x- and y-values in cartesian coordinates with corresponding
  * velocities and time steps). Thus, the actual position and velocity of the agent are analyzed and the deviation to the
  * desired values is obtained. In order to correct vehicle's position and velocity, following outputs are generated:
  * - throttle pedal state [0; 1]
@@ -23,10 +23,9 @@
 
 /**
  * @addtogroup module_rc
- * Furthermore, different driver types are considered. The driver type is described by an aggressivity parameter (a
- * scaling factor between "0" and "1"). Lower aggressivity introduces scaled bounds to the three outputs decribed above
- * image @cond html RC_30_Driver.png @endcond "RouteControl driver types"
- * Abbreviations:
+ * Furthermore, different driver types are considered. The driver type is described by an aggressiveness parameter (a
+ * scaling factor between "0" and "1"). Lower aggressiveness introduces scaled bounds to the three outputs decribed
+ * above image @cond html RC_30_Driver.png @endcond "RouteControl driver types" Abbreviations:
  * - CS = coordinate system
  */
 
@@ -123,12 +122,13 @@ Algorithm_Routecontrol_Implementation::Algorithm_Routecontrol_Implementation(
 
   try
   {
-    auto parameterMapDoubleExternal = GetParameters()->GetParametersDouble();
-    for (auto &pair : parameterMapDouble)
-    {
-      std::string const &idx = pair.first;
-      pair.second->SetValue(parameterMapDoubleExternal.at(idx));
-    }
+    drivingAggressiveness = parameters->GetParametersDouble().at("DrivingAggressiveness");
+    pedalsKp = parameters->GetParametersDouble().at("PedalsKp");
+    pedalsKi = parameters->GetParametersDouble().at("PedalsKi");
+    pedalsKd = parameters->GetParametersDouble().at("PedalsKd");
+    steeringKp = parameters->GetParametersDouble().at("SteeringKp");
+    steeringKi = parameters->GetParametersDouble().at("SteeringKi");
+    steeringKd = parameters->GetParametersDouble().at("SteeringKd");
   }
   catch (...)
   {
@@ -140,6 +140,12 @@ Algorithm_Routecontrol_Implementation::Algorithm_Routecontrol_Implementation(
   LOGDEBUG("Construction of " + COMPONENTNAME + " successful");
 }
 
+Algorithm_Routecontrol_Implementation::~Algorithm_Routecontrol_Implementation()
+{
+  waypoints.reset();
+  routeControl.reset();
+}
+
 void Algorithm_Routecontrol_Implementation::UpdateInput(
     [[maybe_unused]] int localLinkId,
     [[maybe_unused]] const std::shared_ptr<SignalInterface const> &data,
@@ -205,22 +211,25 @@ void Algorithm_Routecontrol_Implementation::Trigger(int timeMs)
      *  - total vehicle mass
      *  - engine power
      *  - maximum brake torque
-     *  - driver aggressivity
+     *  - driver aggressiveness
      */
+    std::shared_ptr<const mantle_api::VehicleProperties> vehicleProperties
+        = std::dynamic_pointer_cast<const mantle_api::VehicleProperties>(GetAgent()->GetVehicleModelParameters());
 
     auto weight = GetAgent()->GetVehicleModelParameters()->mass;
 
+    auto maxpower = helper::map::query(vehicleProperties->properties, "MaximumEnginePower");
+    THROWIFFALSE(maxpower.has_value(), "MaximumEnginePower was not defined in VehicleCatalog");
+
+    auto mintorque = helper::map::query(vehicleProperties->properties, "MinimumEngineTorque");
+    THROWIFFALSE(mintorque.has_value(), "MinimumEngineTorque was not defined in VehicleCatalog");
+
     routeControl->SetVehicleProperties(weight,
-                                       maxpower.GetValue(),
-                                       units::torque::newton_meter_t(mintorque.GetValue()),
-                                       drivingAgressivity.GetValue());
-
-    routeControl->SetPIDParameters(pedalsKp.GetValue(),
-                                   pedalsKi.GetValue(),
-                                   pedalsKd.GetValue(),
-                                   steeringKp.GetValue(),
-                                   steeringKi.GetValue(),
-                                   steeringKd.GetValue());
+                                       std::stod(maxpower.value()),
+                                       units::torque::newton_meter_t(std::stod(mintorque.value())),
+                                       drivingAggressiveness);
+
+    routeControl->SetPIDParameters(pedalsKp, pedalsKi, pedalsKd, steeringKp, steeringKi, steeringKd);
   }
 
   if (!waypoints)  // only allocate once
diff --git a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.h b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.h
index 0a0390e0019b20a0792294c1f28bfe6544afda1e..581007e8779470d9d5fddaaeadf0387375a54a2f 100644
--- a/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.h
+++ b/sim/src/components/Algorithm_Routecontrol/algorithm_RouteControl_implementation.h
@@ -52,9 +52,9 @@ using namespace Common;
  * which describes the desired trajectory,
  * that the vehicle should follow.
  *
- * \details Depending on the "agressivity" Parameter,
+ * \details Depending on the "aggressiveness" Parameter,
  * the algorithm will drive along a route, simulating
- * how a driver with that level of agressivity would
+ * how a driver with that level of aggressiveness would
  * follow that trajectory.
  *
  * @}
@@ -102,6 +102,7 @@ public:
   Algorithm_Routecontrol_Implementation(Algorithm_Routecontrol_Implementation &&) = delete;
   Algorithm_Routecontrol_Implementation &operator=(const Algorithm_Routecontrol_Implementation &) = delete;
   Algorithm_Routecontrol_Implementation &operator=(Algorithm_Routecontrol_Implementation &&) = delete;
+  ~Algorithm_Routecontrol_Implementation() override;
 
   void UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, int time) override;
   void UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const> &data, int time) override;
@@ -136,23 +137,20 @@ private:
    *  @}
    */
 
-  std::map<std::string, externalParameter<double> *> parameterMapDouble;
   /** \ingroup Algorithm_RouteControl
    *  @{
    *      \name External Parameter
    *      Parameter which are set externally in agentConfiguration file.
    *      @{
    */
-  externalParameter<double> drivingAgressivity{
-      0, &parameterMapDouble};  //!< indicates the level of driving agressivity of the driver
-  externalParameter<double> maxpower{1, &parameterMapDouble};    //!< maximum power of engine's agent []
-  externalParameter<double> mintorque{2, &parameterMapDouble};   //!< minimal braque torque of the agent []
-  externalParameter<double> pedalsKp{3, &parameterMapDouble};    //!< Kp parameter of the pedals PID control
-  externalParameter<double> pedalsKi{4, &parameterMapDouble};    //!< Ki parameter of the pedals PID control
-  externalParameter<double> pedalsKd{5, &parameterMapDouble};    //!< Kd parameter of the pedals PID control
-  externalParameter<double> steeringKp{6, &parameterMapDouble};  //!< Kp parameter of the steering PID control
-  externalParameter<double> steeringKi{7, &parameterMapDouble};  //!< Ki parameter of the steering PID control
-  externalParameter<double> steeringKd{8, &parameterMapDouble};  //!< Kd parameter of the steering PID control
+  units::mass::kilogram_t weight{0.0};
+  double drivingAggressiveness;  //!< indicates the level of driving aggressiveness of the driver
+  double pedalsKp;               //!< Kp parameter of the pedals PID control
+  double pedalsKi;               //!< Ki parameter of the pedals PID control
+  double pedalsKd;               //!< Kd parameter of the pedals PID control
+  double steeringKp;             //!< Kp parameter of the steering PID control
+  double steeringKi;             //!< Ki parameter of the steering PID control
+  double steeringKd;             //!< Kd parameter of the steering PID control
   /**
    *      @}
    *  @}
diff --git a/sim/src/components/Algorithm_SspWrapper/AlgorithmSspWrapper.cpp b/sim/src/components/Algorithm_SspWrapper/AlgorithmSspWrapper.cpp
index 6bea04f92c61d02d5b12a6e9ca3542edf7cf756a..c49a454ac7ba379133afbdb10611ff832f2abdc1 100644
--- a/sim/src/components/Algorithm_SspWrapper/AlgorithmSspWrapper.cpp
+++ b/sim/src/components/Algorithm_SspWrapper/AlgorithmSspWrapper.cpp
@@ -75,7 +75,7 @@ ModelInterface *OpenPASS_CreateInstance(std::string componentName,  // NOLINT(pe
                                                                 callbacks,
                                                                 std::move(scenarioControl));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -112,7 +112,7 @@ bool OpenPASS_UpdateInput(ModelInterface *implementation,
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -143,7 +143,7 @@ bool OpenPASS_UpdateOutput(ModelInterface *implementation,
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -171,7 +171,7 @@ bool OpenPASS_Trigger(ModelInterface *implementation, int time)
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Algorithm_SspWrapper/Algorithm_SspWrapper.xml b/sim/src/components/Algorithm_SspWrapper/Algorithm_SspWrapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1ede78910df5bc6b08530013552c0fecf36dfa78
--- /dev/null
+++ b/sim/src/components/Algorithm_SspWrapper/Algorithm_SspWrapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Algorithm_SspWrapper</title>
+  <library>Algorithm_SspWrapper</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>SspPath</id>
+      <type>string</type>
+      <title>SspPath</title>
+      <unit></unit>
+      <value>ConnectionTest.ssp</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>2</id>
+      <type>signal_in</type>
+      <title>signal_in</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>signal_out</type>
+      <title>signal_out</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
\ No newline at end of file
diff --git a/sim/src/components/Algorithm_SspWrapper/CMakeLists.txt b/sim/src/components/Algorithm_SspWrapper/CMakeLists.txt
index 5069c24869057be86cee0ccaf1b9ea855b63b055..44696b94fc989f623db0e8a48600a2e0e7efb053 100644
--- a/sim/src/components/Algorithm_SspWrapper/CMakeLists.txt
+++ b/sim/src/components/Algorithm_SspWrapper/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#				2024 Volkswagen AG
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -191,6 +192,9 @@ add_openpass_target(NAME ${COMPONENT_NAME} TYPE library LINKAGE shared COMPONENT
         minizip::minizip
         Common
         MantleAPI::MantleAPI
+
+        GUIXML 
+        Algorithm_SspWrapper.xml
         )
 
 include(${CMAKE_CURRENT_SOURCE_DIR}/../Algorithm_FmuWrapper/CMakeLists.txt)
diff --git a/sim/src/components/Algorithm_SspWrapper/Importer/SsdFileImporter.cpp b/sim/src/components/Algorithm_SspWrapper/Importer/SsdFileImporter.cpp
index 4c42a1c74cf09a85ffaf920484c6240e888a3504..60987b76bb278066e5224d071176fa184ef8fc66 100644
--- a/sim/src/components/Algorithm_SspWrapper/Importer/SsdFileImporter.cpp
+++ b/sim/src/components/Algorithm_SspWrapper/Importer/SsdFileImporter.cpp
@@ -642,10 +642,11 @@ xmlDocPtr SsdFileImporter::ImportSsdFileContent(const std::filesystem::path &fil
                                          filename.string().c_str(),
                                          nullptr,
                                          XML_PARSE_NOBLANKS);
-  // xmlErrorPtr error = xmlCtxtGetLastError(parser);
+  const auto *error = xmlCtxtGetLastError(parser);
   if (document == nullptr)
   {
-    LOGERRORANDTHROW("SSP Importer: invalid xml file format of file " + filename.string());
+    LOGERRORANDTHROW("SSP Importer: invalid xml file format of file " + filename.string() + " in line "
+                     + std::to_string(error->line) + " : " + toString(toXmlChar(error->message)));
   }
 
   xmlFreeParserCtxt(parser);
diff --git a/sim/src/components/Algorithm_Switch/Algorithm_Switch.xml b/sim/src/components/Algorithm_Switch/Algorithm_Switch.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d6b43e9296c7fe0d82be2309c0f76988508c64d0
--- /dev/null
+++ b/sim/src/components/Algorithm_Switch/Algorithm_Switch.xml
@@ -0,0 +1,56 @@
+<component>
+  <type>Algorithm</type>
+  <title>Algorithm_Switch</title>
+  <library>Algorithm_Switch</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>10</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters />
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>int</type>
+      <title>Index</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>1</id>
+      <type>ControlData</type>
+      <title>DriverControl</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>2</id>
+      <type>ControlData</type>
+      <title>Prio1Control</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>3</id>
+      <type>ControlData</type>
+      <title>Prio2Control</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>4</id>
+      <type>ControlData</type>
+      <title>Prio3Control</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+	<output>
+      <id>0</id>
+      <type>ControlData</type>
+      <title>Control</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Algorithm_Switch/CMakeLists.txt b/sim/src/components/Algorithm_Switch/CMakeLists.txt
index c8a195b65453e69e6304d52316af4f1d3571d7a9..c623fe4e65f1a17a205b24faefd462ed05c268d8 100644
--- a/sim/src/components/Algorithm_Switch/CMakeLists.txt
+++ b/sim/src/components/Algorithm_Switch/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,4 +33,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Algorithm_Switch.xml 						  
 )
diff --git a/sim/src/components/Algorithm_Switch/algorithm_Switch.cpp b/sim/src/components/Algorithm_Switch/algorithm_Switch.cpp
index 01ff02d8b1dbfc0413a71fd89bac609809093d94..76804a796f136202c84b05f619ff6327efb2a562 100644
--- a/sim/src/components/Algorithm_Switch/algorithm_Switch.cpp
+++ b/sim/src/components/Algorithm_Switch/algorithm_Switch.cpp
@@ -99,7 +99,7 @@ extern "C" ALGORITHM_SWITCH_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstanc
                                                                                  callbacks,
                                                                                  agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -143,7 +143,7 @@ extern "C" ALGORITHM_SWITCH_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterfa
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -180,7 +180,7 @@ extern "C" ALGORITHM_SWITCH_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterf
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -212,7 +212,7 @@ extern "C" ALGORITHM_SWITCH_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/ComponentController/CMakeLists.txt b/sim/src/components/ComponentController/CMakeLists.txt
index 75dffcd72dc6b7c4866c38b1b43e4d44ba3030f5..5fc180a7f8679d73a742532b190508f0fb883b43 100644
--- a/sim/src/components/ComponentController/CMakeLists.txt
+++ b/sim/src/components/ComponentController/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,4 +32,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    ComponentController.xml							 
 )
diff --git a/sim/src/components/ComponentController/ComponentController.xml b/sim/src/components/ComponentController/ComponentController.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9de26562e88d64c3f159ab8b99b1f292a9386cef
--- /dev/null
+++ b/sim/src/components/ComponentController/ComponentController.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>ComponentController</title>
+  <library>ComponentController</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>AgentCompToCompCtrlSignal</type>
+      <title>AgentCompToCompCtrlSignal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>CompCtrlToAgentCompSignal</type>
+      <title>CompCtrlToAgentCompSignal</title>
+      <unit></unit>
+    </output>
+    <output>
+      <id>1</id>
+      <type>CompCtrlToDriverCompSignal</type>
+      <title>CompCtrlToDriverCompSignal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/ComponentController/componentController.cpp b/sim/src/components/ComponentController/componentController.cpp
index 37a2302beeb41b2d79bf955d3f8ccc5731a1aea6..6ca4953f986e5998428126c3d857f02748da2200 100644
--- a/sim/src/components/ComponentController/componentController.cpp
+++ b/sim/src/components/ComponentController/componentController.cpp
@@ -95,7 +95,7 @@ extern "C" COMPONENT_CONTROLLER_SHARED_EXPORT ModelInterface *OpenPASS_CreateIns
                                                                                    agent,
                                                                                    std::move(scenarioControl)));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -138,7 +138,7 @@ extern "C" COMPONENT_CONTROLLER_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -175,7 +175,7 @@ extern "C" COMPONENT_CONTROLLER_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelIn
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -207,7 +207,7 @@ extern "C" COMPONENT_CONTROLLER_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterfa
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/ControllerSwitch/CMakeLists.txt b/sim/src/components/ControllerSwitch/CMakeLists.txt
index 0a5114385e8096c2129aa864ea51e7a6b5c81f50..fb353c63d4a3acef7a59fd44ad37166e1dca6493 100644
--- a/sim/src/components/ControllerSwitch/CMakeLists.txt
+++ b/sim/src/components/ControllerSwitch/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -24,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    ControllerSwitch.xml						  
 )
diff --git a/sim/src/components/ControllerSwitch/ControllerSwitch.xml b/sim/src/components/ControllerSwitch/ControllerSwitch.xml
new file mode 100644
index 0000000000000000000000000000000000000000..45c6a7d0ad99f2d571300034134998254e5f37ec
--- /dev/null
+++ b/sim/src/components/ControllerSwitch/ControllerSwitch.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>ControllerSwitch</title>
+  <library>ControllerSwitch</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>defaultControllerSignal</type>
+      <title>defaultControllerSignal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>1</id>
+      <type>customControllerSignal</type>
+      <title>defaultControllerSignal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>	
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>signal</type>
+      <title>Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/ControllerSwitch/controllerSwitch.cpp b/sim/src/components/ControllerSwitch/controllerSwitch.cpp
index 7b2c5305b14cdcf457944755945b27e7f19623a1..27059ad35a8a8d31dbe2bb0610ff28a410db7081 100644
--- a/sim/src/components/ControllerSwitch/controllerSwitch.cpp
+++ b/sim/src/components/ControllerSwitch/controllerSwitch.cpp
@@ -74,7 +74,7 @@ extern "C" CONTROLLER_SWITCH_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstan
                                                                                 agent,
                                                                                 std::move(scenarioControl)));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -111,7 +111,7 @@ extern "C" CONTROLLER_SWITCH_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterf
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -142,7 +142,7 @@ extern "C" CONTROLLER_SWITCH_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInter
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -170,7 +170,7 @@ extern "C" CONTROLLER_SWITCH_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_Chassis/CMakeLists.txt b/sim/src/components/Dynamics_Chassis/CMakeLists.txt
index d3a9b1cfa0bed9ce9031115a06d7982c047d0763..1d1723fa457036bcdd3b47648bb6e1bf4004530a 100644
--- a/sim/src/components/Dynamics_Chassis/CMakeLists.txt
+++ b/sim/src/components/Dynamics_Chassis/CMakeLists.txt
@@ -1,5 +1,4 @@
 ################################################################################
-
 # Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 #               2024 Volkswagen AG
 #
@@ -28,8 +27,10 @@ add_openpass_target(
     dynamics_Chassis_implementation.cpp
 	ForceWheelZ.cpp
 	WheelOscillation.cpp
-    
-  LIBRARIES	
+
+  LIBRARIES
 	  MantleAPI::MantleAPI
 
+  GUIXML
+    Dynamics_Chassis.xml  						  
 )
diff --git a/sim/src/components/Dynamics_Chassis/Dynamics_Chassis.xml b/sim/src/components/Dynamics_Chassis/Dynamics_Chassis.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f712494417b91fe4b210ba1c45cfd428ed98c918
--- /dev/null
+++ b/sim/src/components/Dynamics_Chassis/Dynamics_Chassis.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Dynamics</type>
+  <title>Dynamics_Chassis</title>
+  <library>Dynamics_Chassis</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+	  <parameter>
+      <id>SpringCoefficient</id>
+      <type>doubleVector</type>
+		  <title>Spring Coefficient</title>
+      <unit/>
+      <value>1600000,1600000</value>
+    </parameter>
+    <parameter>
+      <id>DamperCoefficient</id>
+      <type>doubleVector</type>
+		  <title>Damper Coefficient</title>
+      <unit/>
+      <value>18000,18000</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Inertia Force</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Tire Vertical Force</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Dynamics_Chassis/ForceWheelZ.h b/sim/src/components/Dynamics_Chassis/ForceWheelZ.h
index 5de6f570d7801e8acd10ba3a48d6357fc67f780e..62aa6494c9e503e8347f93045e3bff96f37132c4 100644
--- a/sim/src/components/Dynamics_Chassis/ForceWheelZ.h
+++ b/sim/src/components/Dynamics_Chassis/ForceWheelZ.h
@@ -1,6 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2020-2021 ITK Engineering GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *               2024 Volkswagen AG
  *
  * This program and the accompanying materials are made available under the
@@ -18,10 +18,9 @@
 #include "VehicleBasics.h"
 #include "common/globalDefinitions.h"
 
-//! Wheel force perpendicular.
-
 namespace units::literals
 {
+//! @brief Wheel force perpendicular.
 class ForceWheelZ
 {
 public:
@@ -52,7 +51,7 @@ public:
   /**
    * @brief Get the Force object
    *
-   * @param i     TODO
+   * @param idx     TODO
    * @return double
    */
   [[nodiscard]] units::force::newton_t GetForce(const int idx) const { return forces.at(idx); }
diff --git a/sim/src/components/Dynamics_Chassis/VehicleBasics.h b/sim/src/components/Dynamics_Chassis/VehicleBasics.h
index f4df5675da953ff77e016b85a0158fb3fb2c3396..46188ff5e64ab940f66ebdf4ac4e5be741839185 100644
--- a/sim/src/components/Dynamics_Chassis/VehicleBasics.h
+++ b/sim/src/components/Dynamics_Chassis/VehicleBasics.h
@@ -20,7 +20,9 @@
 
 namespace units::literals
 {
+/// @brief Number of Wheels
 constexpr int NUMBER_WHEELS = 4;
+/// @brief Acceleration due to gravity
 const units::acceleration::meters_per_second_squared_t GRAVITY_ACC{9.81};
 
 /// @brief Class representing basics of the vehicle
@@ -134,7 +136,7 @@ public:
   /**
    * @brief Get the Wheel Mass object
    *
-   * @param i  The number of the wheel
+   * @param idx  The number of the wheel
    * @return wheelMass
    */
   units::mass::kilogram_t GetWheelMass(int idx) { return wheelMass.at(idx); }
diff --git a/sim/src/components/Dynamics_Chassis/WheelOscillation.h b/sim/src/components/Dynamics_Chassis/WheelOscillation.h
index daa59210c398833135eacf9619011c4c80e791b4..3b42ca8eed40456b6cd38b11ea6f26dcf4b5c9de 100644
--- a/sim/src/components/Dynamics_Chassis/WheelOscillation.h
+++ b/sim/src/components/Dynamics_Chassis/WheelOscillation.h
@@ -22,9 +22,9 @@ public:
   /**
    * @brief Construct a new Wheel Oscillation object
    *
-   * @param wid TODO
-   * @param k
-   * @param q
+   * @param wid           TODO
+   * @param coeffSpringK
+   * @param coeffDampQ
    */
   WheelOscillation(int wid, double coeffSpringK, double coeffDampQ);
   WheelOscillation(const WheelOscillation &) = delete;
diff --git a/sim/src/components/Dynamics_Chassis/dynamics_Chassis.cpp b/sim/src/components/Dynamics_Chassis/dynamics_Chassis.cpp
index 118061c0118d08d3c0358e3d479a5b76f720672a..4f3cdcd19019e6c78cf2776a8c058c41b2dd1b5e 100644
--- a/sim/src/components/Dynamics_Chassis/dynamics_Chassis.cpp
+++ b/sim/src/components/Dynamics_Chassis/dynamics_Chassis.cpp
@@ -100,7 +100,7 @@ extern "C" DYNAMICS_CHASSIS_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstanc
                                                                                   callbacks,
                                                                                   agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -144,7 +144,7 @@ extern "C" DYNAMICS_CHASSIS_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterfa
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -181,7 +181,7 @@ extern "C" DYNAMICS_CHASSIS_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterf
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -213,7 +213,7 @@ extern "C" DYNAMICS_CHASSIS_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.cpp b/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.cpp
index 4b3f7c1051e64a584b1d095d4e8e45ef4af07e70..612a25d17374dd970d686ac3b1cd0618ac91ffec 100644
--- a/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.cpp
+++ b/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.cpp
@@ -45,12 +45,11 @@
 #include <stdexcept>
 #include <utility>
 
+#include "common/commonTools.h"
 #include "components/Dynamics_Chassis/ForceWheelZ.h"
 #include "components/Dynamics_Chassis/VehicleBasics.h"
 #include "components/Dynamics_Chassis/WheelOscillation.h"
 #include "components/common/vehicleProperties.h"
-
-#include "common/commonTools.h"
 #include "include/agentInterface.h"
 #include "include/callbackInterface.h"
 #include "include/parameterInterface.h"
@@ -95,11 +94,8 @@ DynamicsChassisImplementation::DynamicsChassisImplementation(std::string compone
   /** @addtogroup init_3dc
    * Get predefined parameters from the component's XML file.
    */
-  auto parameterMapDoubleExternal = GetParameters()->GetParametersDoubleVector();
-  for (auto &pair : parameterMapDouble) {
-      std::string const &idx = pair.first;
-      pair.second->SetValue(parameterMapDoubleExternal.at(idx));
-  }
+  springCoefficient = parameters->GetParametersDoubleVector().at("SpringCoefficient");
+  damperCoefficient = parameters->GetParametersDoubleVector().at("DamperCoefficient");
 
   /** @addtogroup init_3dc
    * Get basic parameters of the ego vehicle.
@@ -172,8 +168,8 @@ DynamicsChassisImplementation::DynamicsChassisImplementation(std::string compone
   {
     oscillations.at(i).Init(i,
                             GetCycleTime() * 0.001,
-                            springCoefficient.GetValue()[static_cast<int>(floor(i / 2))],
-                            damperCoefficient.GetValue()[static_cast<int>(floor(i / 2))]);
+                            springCoefficient[static_cast<int>(floor(i / 2))],
+                            damperCoefficient[static_cast<int>(floor(i / 2))]);
   }
 
   LOGDEBUG((boost::format("Chassis: agent info: DistanceCOGtoFrontAxle %.2f, DistanceCOGtoRearAxle %.2f, trackWidth "
diff --git a/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.h b/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.h
index 6231970aa73c4b9cb65c397a08ffa73fbcf55d03..1d2151c30c94197c4f7501963499d655ca776b3c 100644
--- a/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.h
+++ b/sim/src/components/Dynamics_Chassis/dynamics_Chassis_implementation.h
@@ -161,17 +161,15 @@ private:
    *  @}
    */
 
-  std::map<std::string, externalParameter<std::vector<double>> *> parameterMapDouble;
   /** \ingroup Dynamics_Chassis
    *  @{
    *      \name External Parameter
    *      Parameter which are set externally in agentConfiguration file.
    *      @{
    */
-  externalParameter<std::vector<double>> springCoefficient{
-      0, &parameterMapDouble};  //!< Spring coefficient of the suspension system
-  externalParameter<std::vector<double>> damperCoefficient{
-      1, &parameterMapDouble};  //!< Damper coefficient of the suspension system
+  std::vector<double> springCoefficient;  //!< Spring coefficient of the suspension system
+  std::vector<double> damperCoefficient;  //!< Damper coefficient of the suspension system
+
   /**
    *      @}
    *  @}
diff --git a/sim/src/components/Dynamics_Collision/CMakeLists.txt b/sim/src/components/Dynamics_Collision/CMakeLists.txt
index acd03e22917228c1b681d11c03b4a261f96fe9b6..1ddbc64bb3f32890fddcb18fc526e60754be3fd9 100644
--- a/sim/src/components/Dynamics_Collision/CMakeLists.txt
+++ b/sim/src/components/Dynamics_Collision/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -24,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Dynamics_Collision.xml 							
 )
diff --git a/sim/src/components/Dynamics_Collision/Dynamics_Collision.xml b/sim/src/components/Dynamics_Collision/Dynamics_Collision.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2eddd22a65998ac14826e8b11597067acb0f5f47
--- /dev/null
+++ b/sim/src/components/Dynamics_Collision/Dynamics_Collision.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Dynamics_Collision</title>
+  <library>Dynamics_Collision</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs/>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>DynamicsSignal</type>
+      <title>Dynamics Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Dynamics_Collision/dynamics_collision.cpp b/sim/src/components/Dynamics_Collision/dynamics_collision.cpp
index 47821cf9ea6f2a6c49eddc21ae508016bbd9a87d..9f3575a7673b4e16010dc5155260bfa4d2cc341e 100644
--- a/sim/src/components/Dynamics_Collision/dynamics_collision.cpp
+++ b/sim/src/components/Dynamics_Collision/dynamics_collision.cpp
@@ -92,7 +92,7 @@ extern "C" DYNAMICS_COLLISION_SHARED_EXPORT ModelInterface *OpenPASS_CreateInsta
                                                                                  callbacks,
                                                                                  agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -134,7 +134,7 @@ extern "C" DYNAMICS_COLLISION_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -171,7 +171,7 @@ extern "C" DYNAMICS_COLLISION_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInte
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -203,7 +203,7 @@ extern "C" DYNAMICS_COLLISION_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_CollisionPCM/CMakeLists.txt b/sim/src/components/Dynamics_CollisionPCM/CMakeLists.txt
index 317cf82596cbd9f621969c17030283fc3f684d75..bdf7879fee5729058228ac7be215ccf10e4a816a 100644
--- a/sim/src/components/Dynamics_CollisionPCM/CMakeLists.txt
+++ b/sim/src/components/Dynamics_CollisionPCM/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,4 +28,6 @@ add_openpass_target(
 	  Common
     MantleAPI::MantleAPI
   
+  GUIXML 
+    Dynamics_CollisionPCM.xml							 
 )
diff --git a/sim/src/components/Dynamics_CollisionPCM/Dynamics_CollisionPCM.xml b/sim/src/components/Dynamics_CollisionPCM/Dynamics_CollisionPCM.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4cfc3bd4caa8f0b3bc7767915b83d7eb4fae7d05
--- /dev/null
+++ b/sim/src/components/Dynamics_CollisionPCM/Dynamics_CollisionPCM.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>Dynamics_CollisionPCM</title>
+  <library>Dynamics_CollisionPCM</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>10</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>bool</type>
+      <title>CollisionOccured</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs/>
+</component>
diff --git a/sim/src/components/Dynamics_CollisionPCM/dynamics_collision.cpp b/sim/src/components/Dynamics_CollisionPCM/dynamics_collision.cpp
index 0178284dfd77c39aef372af4e24a1274bad169fa..b2f2542f8ad3ee3f92d173fd66b0d6d4603e3723 100644
--- a/sim/src/components/Dynamics_CollisionPCM/dynamics_collision.cpp
+++ b/sim/src/components/Dynamics_CollisionPCM/dynamics_collision.cpp
@@ -127,7 +127,7 @@ extern "C" DYNAMICS_COLLISIONSHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterf
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -164,7 +164,7 @@ extern "C" DYNAMICS_COLLISIONSHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInter
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -196,7 +196,7 @@ extern "C" DYNAMICS_COLLISIONSHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_CollisionPostCrash/CMakeLists.txt b/sim/src/components/Dynamics_CollisionPostCrash/CMakeLists.txt
index 3d9d8f6abc69e1ab365b7e3623f3adf9cc495673..a0aa24f780f759a7127344e01cbab530a3d37bf0 100644
--- a/sim/src/components/Dynamics_CollisionPostCrash/CMakeLists.txt
+++ b/sim/src/components/Dynamics_CollisionPostCrash/CMakeLists.txt
@@ -2,6 +2,7 @@
 # Copyright (c) 2020 ITK Engineering GmbH
 #               2020 in-tech GmbH
 #               2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -29,4 +30,6 @@ add_openpass_target(
     Common
     MantleAPI::MantleAPI
   
+  GUIXML
+    Dynamics_CollisionPostCrash.xml   
 )
diff --git a/sim/src/components/Dynamics_CollisionPostCrash/Dynamics_CollisionPostCrash.xml b/sim/src/components/Dynamics_CollisionPostCrash/Dynamics_CollisionPostCrash.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cc07d3f0d160b83ebd8daa294c7f3ca0d9d32914
--- /dev/null
+++ b/sim/src/components/Dynamics_CollisionPostCrash/Dynamics_CollisionPostCrash.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Dynamics_CollisionPostCrash</title>
+  <library>Dynamics_CollisionPostCrash</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs/>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>DynamicsSignal</type>
+      <title>Dynamics Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Dynamics_CollisionPostCrash/dynamics_collisionPostCrash.cpp b/sim/src/components/Dynamics_CollisionPostCrash/dynamics_collisionPostCrash.cpp
index 72c7d5e9fa94c4d0205a78e98e3dcb850835c6c0..72bc8a11314ab4d51dadac65489697dcc3039917 100644
--- a/sim/src/components/Dynamics_CollisionPostCrash/dynamics_collisionPostCrash.cpp
+++ b/sim/src/components/Dynamics_CollisionPostCrash/dynamics_collisionPostCrash.cpp
@@ -92,7 +92,7 @@ extern "C" DYNAMICS_COLLISIONPOSTCRASH_SHARED_EXPORT ModelInterface *OpenPASS_Cr
                                                                                  callbacks,
                                                                                  agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -135,7 +135,7 @@ extern "C" DYNAMICS_COLLISIONPOSTCRASH_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -170,7 +170,7 @@ extern "C" DYNAMICS_COLLISIONPOSTCRASH_SHARED_EXPORT bool OpenPASS_UpdateOutput(
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -202,7 +202,7 @@ extern "C" DYNAMICS_COLLISIONPOSTCRASH_SHARED_EXPORT bool OpenPASS_Trigger(Model
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_CopyTrajectory/CMakeLists.txt b/sim/src/components/Dynamics_CopyTrajectory/CMakeLists.txt
index 78c2defeeac734f337b5337de092af77657b5611..4b41fb203bc8e060d8cd7c1ff55b5c43ef84b90a 100644
--- a/sim/src/components/Dynamics_CopyTrajectory/CMakeLists.txt
+++ b/sim/src/components/Dynamics_CopyTrajectory/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,4 +26,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Dynamics_CopyTrajectory.xml 								 
 )
diff --git a/sim/src/components/Dynamics_CopyTrajectory/Dynamics_CopyTrajectory.xml b/sim/src/components/Dynamics_CopyTrajectory/Dynamics_CopyTrajectory.xml
new file mode 100644
index 0000000000000000000000000000000000000000..17b31265cbaa8489631d5d6eaf8d3672df4b30b2
--- /dev/null
+++ b/sim/src/components/Dynamics_CopyTrajectory/Dynamics_CopyTrajectory.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>Dynamics_CopyTrajectory</title>
+  <library>Dynamics_CopyTrajectory</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>10</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+  	<input>
+      <id>0</id>
+      <type>TrajectoryEvent</type>
+      <title>Desired trajectory</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs/>
+</component>
diff --git a/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory.cpp b/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory.cpp
index e079d67de0da84d04c0eaefc2e2bb2f5e508a8f7..63f5c8dbc4443eb5b65dbbfde0c733f826f83f8a 100644
--- a/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory.cpp
+++ b/sim/src/components/Dynamics_CopyTrajectory/dynamics_copyTrajectory.cpp
@@ -104,7 +104,7 @@ extern "C" DYNAMICS_COPYTRAJECTORYSHARED_EXPORT DynamicsInterface *OpenPASS_Crea
                                                                                            callbacks,
                                                                                            agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -147,7 +147,7 @@ extern "C" DYNAMICS_COPYTRAJECTORYSHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -184,7 +184,7 @@ extern "C" DYNAMICS_COPYTRAJECTORYSHARED_EXPORT bool OpenPASS_UpdateOutput(Model
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -216,7 +216,7 @@ extern "C" DYNAMICS_COPYTRAJECTORYSHARED_EXPORT bool OpenPASS_Trigger(ModelInter
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_MotionModel/CMakeLists.txt b/sim/src/components/Dynamics_MotionModel/CMakeLists.txt
index 052513dfb67291fe2d4c9be9ce8ca3b5c30ad83c..a73e97ecfc9c575e309b504e1192f18a7ddabcef 100644
--- a/sim/src/components/Dynamics_MotionModel/CMakeLists.txt
+++ b/sim/src/components/Dynamics_MotionModel/CMakeLists.txt
@@ -1,5 +1,4 @@
 ################################################################################
-
 # Copyright (c) 2023-2024 Volkswagen AG
 #               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 #
@@ -28,5 +27,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Dynamics_MotionModel.xml 							 
 )
-
diff --git a/sim/src/components/Dynamics_MotionModel/Dynamics_MotionModel.xml b/sim/src/components/Dynamics_MotionModel/Dynamics_MotionModel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..85da24f122fced6b7611cd550880dbdff9dc35cf
--- /dev/null
+++ b/sim/src/components/Dynamics_MotionModel/Dynamics_MotionModel.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Dynamics</type>
+  <title>Dynamics_MotionModel</title>
+  <library>Dynamics_MotionModel</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Longitudinal Tire Force</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>1</id>
+      <type>doubleVector</type>
+      <title>Lateral Tire Force</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>2</id>
+      <type>doubleVector</type>
+      <title>Wheel Angle</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>3</id>
+      <type>doubleVector</type>
+      <title>Wheel Self Aligning Torque</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Inertia Force</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Dynamics_MotionModel/dynamics_motionmodel.cpp b/sim/src/components/Dynamics_MotionModel/dynamics_motionmodel.cpp
index ae96589ea9847b6dc7ab1044aa26c699870c8367..42aeb011f6ce773eb986474624385dbfc1f60b5a 100644
--- a/sim/src/components/Dynamics_MotionModel/dynamics_motionmodel.cpp
+++ b/sim/src/components/Dynamics_MotionModel/dynamics_motionmodel.cpp
@@ -21,6 +21,7 @@
 
 #include "src/motionmodel.h"
 
+//! Version of this component
 const std::string VERSION = "1.0.0";
 static const CallbackInterface *Callbacks = nullptr;  // NOLINT[cppcoreguidelines-avoid-non-const-global-variables]
 
@@ -89,15 +90,14 @@ extern "C" DYNAMICS_MOTIONMODEL_SHARED_EXPORT ModelInterface *OpenPASS_CreateIns
                                                                                    callbacks,
                                                                                    agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
-        Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
+      Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
     }
 
     return nullptr;
-
   }
   catch (...)
   {
@@ -127,7 +127,7 @@ extern "C" DYNAMICS_MOTIONMODEL_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -158,7 +158,7 @@ extern "C" DYNAMICS_MOTIONMODEL_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelIn
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -186,7 +186,7 @@ extern "C" DYNAMICS_MOTIONMODEL_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterfa
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_MotionModel/src/motionmodel.cpp b/sim/src/components/Dynamics_MotionModel/src/motionmodel.cpp
index 02d159ba723d477bfde80b8a0f745f82f22bcee0..37d4d654fbe899c627f4476d9cb79100a872484a 100644
--- a/sim/src/components/Dynamics_MotionModel/src/motionmodel.cpp
+++ b/sim/src/components/Dynamics_MotionModel/src/motionmodel.cpp
@@ -143,8 +143,8 @@ DynamicsMotionModelImplementation::~DynamicsMotionModelImplementation()
 }
 
 void DynamicsMotionModelImplementation::UpdateInput(int localLinkId,
-                                                      const std::shared_ptr<SignalInterface const> &data,
-                                                      [[maybe_unused]] int time)
+                                                    const std::shared_ptr<SignalInterface const> &data,
+                                                    [[maybe_unused]] int time)
 {
   std::stringstream log;
   log << componentname << " UpdateInput";
@@ -180,8 +180,8 @@ void DynamicsMotionModelImplementation::UpdateInput(int localLinkId,
 }
 
 void DynamicsMotionModelImplementation::UpdateOutput(int localLinkId,
-                                                       std::shared_ptr<SignalInterface const> &data,
-                                                       [[maybe_unused]] int time)
+                                                     std::shared_ptr<SignalInterface const> &data,
+                                                     [[maybe_unused]] int time)
 {
   if (localLinkId == 0)
   {
diff --git a/sim/src/components/Dynamics_MotionModel/src/motionmodel.h b/sim/src/components/Dynamics_MotionModel/src/motionmodel.h
index 41cc2f782e98b116f213bc3744fc23169a945660..21099ed06098274e5497754abc38ccd8b47c4824 100644
--- a/sim/src/components/Dynamics_MotionModel/src/motionmodel.h
+++ b/sim/src/components/Dynamics_MotionModel/src/motionmodel.h
@@ -57,6 +57,7 @@
 class DynamicsMotionModelImplementation : public UnrestrictedModelInterface
 {
 public:
+  /// @brief Component name
   const std::string componentname = "Dynamics_MotionModel_TwoTrack";
 
   //! Constructor
@@ -130,11 +131,11 @@ private:
   InputPort<SignalVectorDouble, std::vector<double>> lateralTireForces{1, &inputPorts};       //!< Wheel brake torque
   InputPort<SignalVectorDouble, std::vector<double>> wheelAngle{2, &inputPorts};  //!< Steering Angle of the wheels
   InputPort<SignalVectorDouble, std::vector<double>> wheelSelfAligningTorque{
-      3, &inputPorts};  //!< Wheel self aligning torque
+      3, &inputPorts};                                                                   //!< Wheel self aligning torque
   InputPort<SignalVectorDouble, std::vector<double>> wheelRotationRate{4, &inputPorts};  //!< wheel rotation rate
   units::angle::radian_t steeringWheelAngle{};                                           //!< steeringWheelAngle
   /**
-   *      @}
+   *    @}
    *  @}
    */
 
@@ -148,7 +149,7 @@ private:
       forceGlobalInertia;         //!< inertia force on vehicle's Center of Gravity (Input for Dynamics Chassis)
   DynamicsSignal dynamicsSignal;  //!< agents dynamics information
                                   /**
-                                   *      @}
+                                   *    @}
                                    *  @}
                                    */
 
diff --git a/sim/src/components/Dynamics_MotionModel/src/twotrackmodel.h b/sim/src/components/Dynamics_MotionModel/src/twotrackmodel.h
index 5b85bba59f9bdcff598159bb2467d78722cda048..3d874f9359757882ecbf3f718a4b454462add5c2 100644
--- a/sim/src/components/Dynamics_MotionModel/src/twotrackmodel.h
+++ b/sim/src/components/Dynamics_MotionModel/src/twotrackmodel.h
@@ -46,13 +46,13 @@ public:
   /*!
    * \brief Initialize vehicle properties
    *
-   * @param[in]    axles     axles of vehicle
-   * @param[in]    xCog     X Position of Center of Gravity
-   * @param[in]    yCog     Y Position of Center of Gravity
+   * @param[in]    axles      axles of vehicle
+   * @param[in]    xCog       X Position of Center of Gravity
+   * @param[in]    yCog       Y Position of Center of Gravity
    * @param[in]    weight     weight
    * @param[in]    coeffDrag  coefficient of drag
    * @param[in]    areaFace   area vehicle front
-   * @param[in]    bbcenter  bounding box center
+   * @param[in]    bbCenter   bounding box center
    */
   void InitVehicleProperties(std::vector<mantle_api::Axle> axles,
                              units::length::meter_t xCog,
diff --git a/sim/src/components/Dynamics_RegularDriving/CMakeLists.txt b/sim/src/components/Dynamics_RegularDriving/CMakeLists.txt
index 052268981118846ea471ea14169c7ac1c06b86f6..b81cd00d55a253243fcf2311c9836fc4f06df748 100644
--- a/sim/src/components/Dynamics_RegularDriving/CMakeLists.txt
+++ b/sim/src/components/Dynamics_RegularDriving/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -24,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML 
+    Dynamics_RegularDriving.xml 								 
 )
diff --git a/sim/src/components/Dynamics_RegularDriving/Dynamics_RegularDriving.xml b/sim/src/components/Dynamics_RegularDriving/Dynamics_RegularDriving.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3db57d6c3ab6b436e359bf470ae65f934b680ef5
--- /dev/null
+++ b/sim/src/components/Dynamics_RegularDriving/Dynamics_RegularDriving.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Dynamics_RegularDriving</title>
+  <library>Dynamics_RegularDriving</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>LongitudinalSignal</type>
+      <title>Longitudinal Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>1</id>
+      <type>SteeringSignal</type>
+      <title>Steering Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>2</id>
+      <type>RollSignal</type>
+      <title>Roll Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>    
+    <input>
+      <id>100</id>
+      <type>ParametersVehicleSignal</type>
+      <title>Vehicle Parameters</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>DynamicsSignal</type>
+      <title>Dynamics Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Dynamics_RegularDriving/dynamics_regularDriving.cpp b/sim/src/components/Dynamics_RegularDriving/dynamics_regularDriving.cpp
index e65a834027c348e46ad7de551d6fa7bf596b3ec2..d90a38616efa66d5c746f3f264f293047daa5d5c 100644
--- a/sim/src/components/Dynamics_RegularDriving/dynamics_regularDriving.cpp
+++ b/sim/src/components/Dynamics_RegularDriving/dynamics_regularDriving.cpp
@@ -96,7 +96,7 @@ extern "C" DYNAMICS_REGULAR_DRIVING_SHARED_EXPORT ModelInterface *OpenPASS_Creat
                                                                                       callbacks,
                                                                                       agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -138,7 +138,7 @@ extern "C" DYNAMICS_REGULAR_DRIVING_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -173,7 +173,7 @@ extern "C" DYNAMICS_REGULAR_DRIVING_SHARED_EXPORT bool OpenPASS_UpdateOutput(
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -205,7 +205,7 @@ extern "C" DYNAMICS_REGULAR_DRIVING_SHARED_EXPORT bool OpenPASS_Trigger(ModelInt
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_Scenario/CMakeLists.txt b/sim/src/components/Dynamics_Scenario/CMakeLists.txt
index cc4271cad99610904fc59ed312804a79cbf83f63..28256cd595098cf494e6ec85e5cc8a6e6ac99586 100644
--- a/sim/src/components/Dynamics_Scenario/CMakeLists.txt
+++ b/sim/src/components/Dynamics_Scenario/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -24,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Dynamics_Scenario.xml 						   
 )
diff --git a/sim/src/components/Dynamics_Scenario/Dynamics_Scenario.xml b/sim/src/components/Dynamics_Scenario/Dynamics_Scenario.xml
new file mode 100644
index 0000000000000000000000000000000000000000..545cd4d81f6b789b9cbf9eb15034143fac3651b5
--- /dev/null
+++ b/sim/src/components/Dynamics_Scenario/Dynamics_Scenario.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Action</type>
+  <title>Dynamics_Scenario</title>
+  <library>Dynamics_Scenario</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs/>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>DynamicsSignal</type>
+      <title>Dynamics Signal</title>
+      <unit></unit>
+    </output>
+  </outputs> 
+</component>
diff --git a/sim/src/components/Dynamics_Scenario/dynamics_scenario.cpp b/sim/src/components/Dynamics_Scenario/dynamics_scenario.cpp
index 05f5da007f77293244aa88e7b5fd92c78e913a7b..a9975494591a50386e5317503e33c5594800f70a 100644
--- a/sim/src/components/Dynamics_Scenario/dynamics_scenario.cpp
+++ b/sim/src/components/Dynamics_Scenario/dynamics_scenario.cpp
@@ -74,7 +74,7 @@ extern "C" DYNAMICS_SCENARIO_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstan
                                                                                 agent,
                                                                                 std::move(scenarioControl)));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -111,7 +111,7 @@ extern "C" DYNAMICS_SCENARIO_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterf
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -142,7 +142,7 @@ extern "C" DYNAMICS_SCENARIO_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInter
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -170,7 +170,7 @@ extern "C" DYNAMICS_SCENARIO_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_Scenario/src/dynamics_scenario_implementation.cpp b/sim/src/components/Dynamics_Scenario/src/dynamics_scenario_implementation.cpp
index a6bcc025872c1c8feff03ae9b1a871ebdf183354..e5995313bffceb66094c2e6d8e13f9bbcf0972bc 100644
--- a/sim/src/components/Dynamics_Scenario/src/dynamics_scenario_implementation.cpp
+++ b/sim/src/components/Dynamics_Scenario/src/dynamics_scenario_implementation.cpp
@@ -323,6 +323,10 @@ DynamicsInformation DynamicsScenarioImplementation::ReadWayPointData()
 
   for (auto iterCurr = trajectory.begin(); iterCurr != trajectory.end(); ++iterCurr)
   {
+    if (!iterCurr->time.has_value())
+    {
+      LOGERRORANDTHROW("Time is not set")
+    }
     if (iterCurr->time.value() >= timeLateralStrategy - TIME_EPSILON)
     {
       auto iterPrev = std::prev(iterCurr);
@@ -426,4 +430,4 @@ DynamicsInformation DynamicsScenarioImplementation::CalculateTrajectoryWithExter
   info.centripetalAcceleration = units::inverse_radian(1) * info.yawRate * velocity;
 
   return info;
-}
\ No newline at end of file
+}
diff --git a/sim/src/components/Dynamics_TF/CMakeLists.txt b/sim/src/components/Dynamics_TF/CMakeLists.txt
index b2086ce9972faa5cfd25959df09b92f3585127cb..991f5efef33ea930bb9135c2f3d4f419073e3b24 100644
--- a/sim/src/components/Dynamics_TF/CMakeLists.txt
+++ b/sim/src/components/Dynamics_TF/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -26,4 +27,7 @@ add_openpass_target(
     Common
     CoreCommon
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Dynamics_TrajectoryFollower.xml  									 
 )
diff --git a/sim/src/components/Dynamics_TF/Dynamics_TrajectoryFollower.xml b/sim/src/components/Dynamics_TF/Dynamics_TrajectoryFollower.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9a86eac0e445abe39014acac9ca4123c875be49d
--- /dev/null
+++ b/sim/src/components/Dynamics_TF/Dynamics_TrajectoryFollower.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Dynamics_TrajectoryFollower</title>
+  <library>Dynamics_TrajectoryFollower</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>AutomaticDeactivation</id>
+      <type>bool</type>
+      <title>AutomaticDeactivation</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <id>EnforceTrajectory</id>
+      <type>bool</type>
+      <title>EnforceTrajectory</title>
+      <unit></unit>
+      <value>true</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>SteeringSignal</type>
+      <title>Steering Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>1</id>
+      <type>AccelerationSignal</type>
+      <title>Acceleration Signal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>DynamicsSignal</type>
+      <title>Dynamics Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Dynamics_TF/dynamics_tf.cpp b/sim/src/components/Dynamics_TF/dynamics_tf.cpp
index ee8050bc3ee60d1745a9be9ca46ecc8314e388f1..bd6b5faba20e8ce47f73568a5c91a9f9b0032692 100644
--- a/sim/src/components/Dynamics_TF/dynamics_tf.cpp
+++ b/sim/src/components/Dynamics_TF/dynamics_tf.cpp
@@ -98,7 +98,7 @@ extern "C" DYNAMICS_TRAJECTORY_FOLLOWER_SHARED_EXPORT ModelInterface *OpenPASS_C
                                                                                   agent,
                                                                                   std::move(scenarioControl)));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -140,7 +140,7 @@ extern "C" DYNAMICS_TRAJECTORY_FOLLOWER_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -175,7 +175,7 @@ extern "C" DYNAMICS_TRAJECTORY_FOLLOWER_SHARED_EXPORT bool OpenPASS_UpdateOutput
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -207,7 +207,7 @@ extern "C" DYNAMICS_TRAJECTORY_FOLLOWER_SHARED_EXPORT bool OpenPASS_Trigger(Mode
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_TF/src/tfImplementation.cpp b/sim/src/components/Dynamics_TF/src/tfImplementation.cpp
index be10f2dd8c55b7d31a3ac74e6c6345813c491406..acddabb6be8d56e9e2fce82f3621121ae4014f41 100644
--- a/sim/src/components/Dynamics_TF/src/tfImplementation.cpp
+++ b/sim/src/components/Dynamics_TF/src/tfImplementation.cpp
@@ -481,7 +481,9 @@ void TrajectoryFollowerImplementation::UpdateDynamics(const PolyLinePoint &previ
   dynamicsOutputSignal.dynamicsInformation.yaw = previousPosition.pose.orientation.yaw + deltaYawAngle;
 
   dynamicsOutputSignal.dynamicsInformation.yawRate
-      = (dynamicsOutputSignal.dynamicsInformation.yaw - lastWorldPosition.pose.orientation.yaw) / cycleTimeInSeconds;
+      = CommonHelper::SetAngleToValidRange(dynamicsOutputSignal.dynamicsInformation.yaw
+                                           - lastWorldPosition.pose.orientation.yaw)
+      / cycleTimeInSeconds;
   dynamicsOutputSignal.dynamicsInformation.yawAcceleration
       = (dynamicsOutputSignal.dynamicsInformation.yawRate - lastYawVelocity) / cycleTimeInSeconds;
 
diff --git a/sim/src/components/Dynamics_TireModel/CMakeLists.txt b/sim/src/components/Dynamics_TireModel/CMakeLists.txt
index 4c8ff3e95041b1b570f27a629d99ffdd3f7300bf..4936a6e3914f9a058da99b16c8908cfb877146b3 100644
--- a/sim/src/components/Dynamics_TireModel/CMakeLists.txt
+++ b/sim/src/components/Dynamics_TireModel/CMakeLists.txt
@@ -1,7 +1,6 @@
 ################################################################################
 # Copyright (c) 2023-2024 Volkswagen AG
 #               2023 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,4 +27,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
-)
\ No newline at end of file
+
+  GUIXML
+    Dynamics_TireModel.xml
+)
diff --git a/sim/src/components/Dynamics_TireModel/Dynamics_TireModel.xml b/sim/src/components/Dynamics_TireModel/Dynamics_TireModel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..da4cd2efdb781a740ada9f2327b8575ed836e90d
--- /dev/null
+++ b/sim/src/components/Dynamics_TireModel/Dynamics_TireModel.xml
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Dynamics</type>
+  <title>Dynamics_TireModel</title>
+  <library>Dynamics_TireModel</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+	<parameter>
+        <id>MuTireMaxXFRef</id>
+        <type>doubleVector</type>
+		<title>Tire's long. max. mu at reference Force</title>
+        <unit/>
+        <value>1.1,1.1</value>
+    </parameter>
+	<parameter>
+        <id>MuTireMaxX2FRef</id>
+        <type>doubleVector</type>
+		<title>Tire's long. max. mu at 2*reference Force</title>
+        <unit/>
+        <value>1.1,1.1</value>
+    </parameter>
+	<parameter>
+        <id>MuTireSlideXFRef</id>
+        <type>doubleVector</type>
+		<title>Tire's long. slide mu at reference Force</title>
+        <unit/>
+        <value>1.0,1.0</value>
+    </parameter>
+	<parameter>
+        <id>MuTireSlideX2FRef</id>
+        <type>doubleVector</type>
+		<title>Tire's long. slide mu at 2*reference Force</title>
+        <unit/>
+        <value>1.0,1.0</value>
+    </parameter>
+	<parameter>
+        <id>SlipTireMaxXFRef</id>
+        <type>doubleVector</type>
+		<title>Tire's long. max slip at reference Force</title>
+        <unit/>
+        <value>0.21,0.21</value>
+    </parameter>
+	<parameter>
+        <id>SlipTireMaxX2FRef</id>
+        <type>doubleVector</type>
+		<title>Tire's long. max slip at 2*reference Force</title>
+        <unit/>
+        <value>0.21,0.21</value>
+    </parameter>
+	<parameter>
+        <id>SlipTireSlideXFRef</id>
+        <type>doubleVector</type>
+		<title>Tire's long. slide slip at reference Force</title>
+        <unit/>
+        <value>0.5,0.5</value>
+    </parameter>
+	<parameter>
+        <id>SlipTireSlideX2FRef</id>
+        <type>doubleVector</type>
+		<title>Tire's long. slide slip at 2*reference Force</title>
+        <unit/>
+        <value>0.5,0.5</value>
+    </parameter>
+	<parameter>
+        <id>F0pXFRef</id>
+        <type>doubleVector</type>
+		<title>Initial long. inclination at reference Force</title>
+        <unit/>
+        <value>15,15</value>
+    </parameter>
+	<parameter>
+        <id>F0pX2FRef</id>
+        <type>doubleVector</type>
+		<title>Initial long. inclination at 2*reference Force</title>
+        <unit/>
+        <value>15,15</value>
+    </parameter>
+	<parameter>
+        <id>MuTireMaxYFRef</id>
+        <type>doubleVector</type>
+		<title>Tire's lat. max. mu at reference Force</title>
+        <unit/>
+        <value>1.1,1.1</value>
+    </parameter>
+	<parameter>
+        <id>MuTireMaxY2FRef</id>
+        <type>doubleVector</type>
+		<title>Tire's lat. max. mu at 2*reference Force</title>
+        <unit/>
+        <value>1.1,1.1</value>
+    </parameter>
+	<parameter>
+        <id>MuTireSlideYFRef</id>
+        <type>doubleVector</type>
+		<title>Tire's lat. slide mu at reference Force</title>
+        <unit/>
+        <value>1,1</value>
+    </parameter>
+	<parameter>
+        <id>MuTireSlideY2FRef</id>
+        <type>doubleVector</type>
+		<title>Tire's lat. slide mu at 2*reference Force</title>
+        <unit/>
+        <value>1,1</value>
+    </parameter>
+	<parameter>
+        <id>SlipTireMaxYFRef</id>
+        <type>doubleVector</type>
+		<title>Tire's lat. max slip at reference Force</title>
+        <unit/>
+        <value>0.21,0.21</value>
+    </parameter>
+	<parameter>
+        <id>SlipTireMaxY2FRef</id>
+        <type>doubleVector</type>
+		<title>Tire's lat. max slip at 2*reference Force</title>
+        <unit/>
+        <value>0.21,0.21</value>
+    </parameter>
+	<parameter>
+        <id>SlipTireSlideYFRef</id>
+        <type>doubleVector</type>
+		<title>Tire's lat. slide slip at reference Force</title>
+        <unit/>
+        <value>0.5,0.5</value>
+    </parameter>
+	<parameter>
+        <id>SlipTireSlideY2FRef</id>
+        <type>doubleVector</type>
+		<title>Tire's lat. slide slip at 2*reference Force</title>
+        <unit/>
+        <value>0.5,0.5</value>
+    </parameter>
+	<parameter>
+        <id>F0pYFRef</id>
+        <type>doubleVector</type>
+		<title>Initial lat. inclination at reference Force</title>
+        <unit/>
+        <value>15,15</value>
+    </parameter>
+	<parameter>
+        <id>F0pY2FRef</id>
+        <type>doubleVector</type>
+		<title>Initial lat. inclination at 2*reference Force</title>
+        <unit/>
+        <value>15,15</value>
+    </parameter>
+	<parameter>
+        <id>FRef</id>
+        <type>doubleVector</type>
+		<title>Vertical reference Force</title>
+        <unit/>
+        <value>1,1</value>
+    </parameter>
+	<parameter>
+        <id>FRefNormalized</id>
+        <type>boolVector</type>
+		<title>Vertical reference Force Normalized</title>
+        <unit/>
+        <value>1,1</value>
+    </parameter>
+	<parameter>
+        <id>Inertia</id>
+        <type>doubleVector</type>
+		<title>Inertia</title>
+        <unit>kgm²</unit>
+        <value>2,2</value>
+    </parameter>
+	<parameter>
+        <id>PneumaticTrail</id>
+        <type>doubleVector</type>
+		<title>Pneumatic Trail</title>
+        <unit>m</unit>
+        <value>0.3,0.3</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Tire Drive Torque</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>1</id>
+      <type>doubleVector</type>
+      <title>Tire Brake Torque</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>2</id>
+      <type>doubleVector</type>
+      <title>Wheel Angle</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>3</id>
+      <type>doubleVector</type>
+      <title>Force Wheel Vertical</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>doubleVector</type>
+      <title>Longitudinal Tire Force</title>
+      <unit></unit>
+    </output>
+	<output>
+      <id>1</id>
+      <type>doubleVector</type>
+      <title>Lateral Tire Force</title>
+      <unit></unit>
+    </output>
+	<output>
+      <id>2</id>
+      <type>doubleVector</type>
+      <title>Wheel Self Aligning Torque</title>
+      <unit></unit>
+    </output>
+	<output>
+      <id>3</id>
+      <type>doubleVector</type>
+      <title>Wheel Rotation Rate</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Dynamics_TireModel/dynamics_tiremodel.cpp b/sim/src/components/Dynamics_TireModel/dynamics_tiremodel.cpp
index ef552caea3a4c0ee19bbf18c07ef25593301230e..e2dc337b0b18b9b18292a34d24414d53de45a47a 100644
--- a/sim/src/components/Dynamics_TireModel/dynamics_tiremodel.cpp
+++ b/sim/src/components/Dynamics_TireModel/dynamics_tiremodel.cpp
@@ -21,8 +21,9 @@
 
 #include "src/tiremodel.h"
 
+//! Version of this component
 const std::string VERSION = "1.0.0";
-static const CallbackInterface *Callbacks = nullptr; // NOLINT[cppcoreguidelines-avoid-non-const-global-variables]
+static const CallbackInterface *Callbacks = nullptr;  // NOLINT[cppcoreguidelines-avoid-non-const-global-variables]
 
 //-----------------------------------------------------------------------------
 //! dll-function to obtain the version of the current module
@@ -88,7 +89,7 @@ extern "C" DYNAMICS_TIREMODELSHARED_EXPORT ModelInterface *OpenPASS_CreateInstan
                                                                    callbacks,
                                                                    agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -138,7 +139,7 @@ extern "C" DYNAMICS_TIREMODELSHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterf
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -169,7 +170,7 @@ extern "C" DYNAMICS_TIREMODELSHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInter
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -197,7 +198,7 @@ extern "C" DYNAMICS_TIREMODELSHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Dynamics_TireModel/dynamics_tiremodel.h b/sim/src/components/Dynamics_TireModel/dynamics_tiremodel.h
index f666652837546075122c74b2acf2e77cbdb20aa9..45d7373fc1a66b1b4a68b8ecf2685e879310a9b9 100644
--- a/sim/src/components/Dynamics_TireModel/dynamics_tiremodel.h
+++ b/sim/src/components/Dynamics_TireModel/dynamics_tiremodel.h
@@ -14,9 +14,8 @@
 //! @brief contains DLL export declarations
 //-----------------------------------------------------------------------------
 
-#include "sim/src/common/opExport.h"
-
 #include "include/modelInterface.h"
+#include "sim/src/common/opExport.h"
 
 #if defined(DYNAMICS_TIREMODEL_LIBRARY)
 #define DYNAMICS_TIREMODELSHARED_EXPORT OPEXPORT  //!< Export of the dll-functions
diff --git a/sim/src/components/Dynamics_TireModel/src/tiremodel.cpp b/sim/src/components/Dynamics_TireModel/src/tiremodel.cpp
index d1bb1e104b0a64afdef02fc54e3e5aaac3e1d7d7..ee4f33b19c06e1cb4a339325faba36f17f4c02f4 100644
--- a/sim/src/components/Dynamics_TireModel/src/tiremodel.cpp
+++ b/sim/src/components/Dynamics_TireModel/src/tiremodel.cpp
@@ -174,88 +174,42 @@ DynamicsTireModel::DynamicsTireModel(std::string componentName,
 void DynamicsTireModel::ParseParameters(const ParameterInterface *parameters)
 {
   // Read external parameters
-  muTireMaxXFRef = parameters->GetParametersDoubleVector().count("MuTireMaxXFRef") == 1
-                     ? parameters->GetParametersDoubleVector().at("MuTireMaxXFRef")
-                     : parameters->GetParametersDoubleVector().at("1");
-  muTireMaxX2FRef = parameters->GetParametersDoubleVector().count("MuTireMaxX2FRef") == 1
-                      ? parameters->GetParametersDoubleVector().at("MuTireMaxX2FRef")
-                      : parameters->GetParametersDoubleVector().at("2");
-
-  muTireSlideXFRef = parameters->GetParametersDoubleVector().count("MuTireSlideXFRef") == 1
-                       ? parameters->GetParametersDoubleVector().at("MuTireSlideXFRef")
-                       : parameters->GetParametersDoubleVector().at("3");
-  muTireSlideX2FRef = parameters->GetParametersDoubleVector().count("MuTireSlideX2FRef") == 1
-                        ? parameters->GetParametersDoubleVector().at("MuTireSlideX2FRef")
-                        : parameters->GetParametersDoubleVector().at("4");
-
-  slipTireMaxXFRef = parameters->GetParametersDoubleVector().count("SlipTireMaxXFRef") == 1
-                       ? parameters->GetParametersDoubleVector().at("SlipTireMaxXFRef")
-                       : parameters->GetParametersDoubleVector().at("5");
-  slipTireMaxX2FRef = parameters->GetParametersDoubleVector().count("SlipTireMaxX2FRef") == 1
-                        ? parameters->GetParametersDoubleVector().at("SlipTireMaxX2FRef")
-                        : parameters->GetParametersDoubleVector().at("6");
-
-  slipTireSlideXFRef = parameters->GetParametersDoubleVector().count("SlipTireSlideXFRef") == 1
-                         ? parameters->GetParametersDoubleVector().at("SlipTireSlideXFRef")
-                         : parameters->GetParametersDoubleVector().at("7");
-  slipTireSlideX2FRef = parameters->GetParametersDoubleVector().count("SlipTireSlideX2FRef") == 1
-                          ? parameters->GetParametersDoubleVector().at("SlipTireSlideX2FRef")
-                          : parameters->GetParametersDoubleVector().at("8");
-
-  F0pXFRef = parameters->GetParametersDoubleVector().count("F0pXFRef") == 1
-               ? parameters->GetParametersDoubleVector().at("F0pXFRef")
-               : parameters->GetParametersDoubleVector().at("9");
-  F0pX2FRef = parameters->GetParametersDoubleVector().count("F0pX2FRef") == 1
-                ? parameters->GetParametersDoubleVector().at("F0pX2FRef")
-                : parameters->GetParametersDoubleVector().at("10");
-
-  muTireMaxYFRef = parameters->GetParametersDoubleVector().count("MuTireMaxYFRef") == 1
-                     ? parameters->GetParametersDoubleVector().at("MuTireMaxYFRef")
-                     : parameters->GetParametersDoubleVector().at("11");
-  muTireMaxY2FRef = parameters->GetParametersDoubleVector().count("MuTireMaxY2FRef") == 1
-                      ? parameters->GetParametersDoubleVector().at("MuTireMaxY2FRef")
-                      : parameters->GetParametersDoubleVector().at("12");
-
-  muTireSlideYFRef = parameters->GetParametersDoubleVector().count("MuTireSlideYFRef") == 1
-                       ? parameters->GetParametersDoubleVector().at("MuTireSlideYFRef")
-                       : parameters->GetParametersDoubleVector().at("13");
-  muTireSlideY2FRef = parameters->GetParametersDoubleVector().count("MuTireSlideY2FRef") == 1
-                        ? parameters->GetParametersDoubleVector().at("MuTireSlideY2FRef")
-                        : parameters->GetParametersDoubleVector().at("14");
-
-  slipTireMaxYFRef = parameters->GetParametersDoubleVector().count("SlipTireMaxYFRef") == 1
-                       ? parameters->GetParametersDoubleVector().at("SlipTireMaxYFRef")
-                       : parameters->GetParametersDoubleVector().at("15");
-  slipTireMaxY2FRef = parameters->GetParametersDoubleVector().count("SlipTireMaxY2FRef") == 1
-                        ? parameters->GetParametersDoubleVector().at("SlipTireMaxY2FRef")
-                        : parameters->GetParametersDoubleVector().at("16");
-
-  slipTireSlideYFRef = parameters->GetParametersDoubleVector().count("SlipTireSlideYFRef") == 1
-                         ? parameters->GetParametersDoubleVector().at("SlipTireSlideYFRef")
-                         : parameters->GetParametersDoubleVector().at("17");
-  slipTireSlideY2FRef = parameters->GetParametersDoubleVector().count("SlipTireSlideY2FRef") == 1
-                          ? parameters->GetParametersDoubleVector().at("SlipTireSlideY2FRef")
-                          : parameters->GetParametersDoubleVector().at("18");
-
-  F0pYFRef = parameters->GetParametersDoubleVector().count("F0pYFRef") == 1
-               ? parameters->GetParametersDoubleVector().at("F0pYFRef")
-               : parameters->GetParametersDoubleVector().at("19");
-  F0pY2FRef = parameters->GetParametersDoubleVector().count("F0pY2FRef") == 1
-                ? parameters->GetParametersDoubleVector().at("F0pY2FRef")
-                : parameters->GetParametersDoubleVector().at("20");
-
-  FRef = parameters->GetParametersDoubleVector().count("FRef") == 1 ? parameters->GetParametersDoubleVector().at("FRef")
-                                                                    : parameters->GetParametersDoubleVector().at("21");
-  FRefNormalized = parameters->GetParametersBoolVector().count("FRefNormalized") == 1
-                     ? parameters->GetParametersBoolVector().at("FRefNormalized")
-                     : parameters->GetParametersBoolVector().at("22");
-
-  inertia = parameters->GetParametersDoubleVector().count("Inertia") == 1
-              ? parameters->GetParametersDoubleVector().at("Inertia")
-              : parameters->GetParametersDoubleVector().at("23");
-  pneumaticTrail = parameters->GetParametersDoubleVector().count("PneumaticTrail") == 1
-                     ? parameters->GetParametersDoubleVector().at("PneumaticTrail")
-                     : parameters->GetParametersDoubleVector().at("24");
+  muTireMaxXFRef = parameters->GetParametersDoubleVector().at("MuTireMaxXFRef");
+  muTireMaxX2FRef = parameters->GetParametersDoubleVector().at("MuTireMaxX2FRef");
+
+  muTireSlideXFRef = parameters->GetParametersDoubleVector().at("MuTireSlideXFRef");
+  muTireSlideX2FRef = parameters->GetParametersDoubleVector().at("MuTireSlideX2FRef");
+
+  slipTireMaxXFRef = parameters->GetParametersDoubleVector().at("SlipTireMaxXFRef");
+  slipTireMaxX2FRef = parameters->GetParametersDoubleVector().at("SlipTireMaxX2FRef");
+
+  slipTireSlideXFRef = parameters->GetParametersDoubleVector().at("SlipTireSlideXFRef");
+  slipTireSlideX2FRef = parameters->GetParametersDoubleVector().at("SlipTireSlideX2FRef");
+
+  F0pXFRef = parameters->GetParametersDoubleVector().at("F0pXFRef");
+  F0pX2FRef = parameters->GetParametersDoubleVector().at("F0pX2FRef");
+
+  muTireMaxYFRef = parameters->GetParametersDoubleVector().at("MuTireMaxYFRef");
+  muTireMaxY2FRef = parameters->GetParametersDoubleVector().at("MuTireMaxY2FRef");
+
+  muTireSlideYFRef = parameters->GetParametersDoubleVector().at("MuTireSlideYFRef");
+  muTireSlideY2FRef = parameters->GetParametersDoubleVector().at("MuTireSlideY2FRef");
+
+  slipTireMaxYFRef = parameters->GetParametersDoubleVector().at("SlipTireMaxYFRef");
+  slipTireMaxY2FRef = parameters->GetParametersDoubleVector().at("SlipTireMaxY2FRef");
+
+  slipTireSlideYFRef = parameters->GetParametersDoubleVector().at("SlipTireSlideYFRef");
+  slipTireSlideY2FRef = parameters->GetParametersDoubleVector().at("SlipTireSlideY2FRef");
+
+  F0pYFRef = parameters->GetParametersDoubleVector().at("F0pYFRef");
+  F0pY2FRef = parameters->GetParametersDoubleVector().at("F0pY2FRef");
+
+  FRef = parameters->GetParametersDoubleVector().at("FRef");
+  FRefNormalized = parameters->GetParametersBoolVector().at("FRefNormalized");
+
+  inertia = parameters->GetParametersDoubleVector().at("Inertia");
+
+  pneumaticTrail = parameters->GetParametersDoubleVector().at("PneumaticTrail");
 }
 
 DynamicsTireModel::~DynamicsTireModel()
@@ -266,9 +220,10 @@ DynamicsTireModel::~DynamicsTireModel()
   }
 }
 
-void DynamicsTireModel::UpdateInput(int localLinkId, const std::shared_ptr<SignalInterface const> &data, [[maybe_unused]] int time)
+void DynamicsTireModel::UpdateInput(int localLinkId,
+                                    const std::shared_ptr<SignalInterface const> &data,
+                                    [[maybe_unused]] int time)
 {
-
   std::stringstream log;
   log << componentname << " UpdateInput";
   LOG(CbkLogLevel::Debug, log.str());
@@ -288,9 +243,10 @@ void DynamicsTireModel::UpdateInput(int localLinkId, const std::shared_ptr<Signa
   }
 }
 
-void DynamicsTireModel::UpdateOutput(int localLinkId, std::shared_ptr<SignalInterface const> &data, [[maybe_unused]] int time)
+void DynamicsTireModel::UpdateOutput(int localLinkId,
+                                     std::shared_ptr<SignalInterface const> &data,
+                                     [[maybe_unused]] int time)
 {
-
   std::stringstream log;
   log << componentname << " UpdateOutput";
   LOG(CbkLogLevel::Debug, log.str());
diff --git a/sim/src/components/Dynamics_TireModel/src/tiremodel.h b/sim/src/components/Dynamics_TireModel/src/tiremodel.h
index dcedbb39f07c01feae0c7a2d7d497888e8f6a795..466366dd0f0b65a79ace17298d237377f602dd86 100644
--- a/sim/src/components/Dynamics_TireModel/src/tiremodel.h
+++ b/sim/src/components/Dynamics_TireModel/src/tiremodel.h
@@ -38,6 +38,7 @@
 class DynamicsTireModel : public UnrestrictedModelInterface
 {
 public:
+  /// @brief Component name
   const std::string componentname = "Dynamics_TMeasyTireModel";
 
   //! Constructor
diff --git a/sim/src/components/Dynamics_TireModel/src/tmeasytire.cpp b/sim/src/components/Dynamics_TireModel/src/tmeasytire.cpp
index 9983377ac99fe281d27a761a9face378442b3c64..b864590fe87026d00045d50f151d36f28ff81b40 100644
--- a/sim/src/components/Dynamics_TireModel/src/tmeasytire.cpp
+++ b/sim/src/components/Dynamics_TireModel/src/tmeasytire.cpp
@@ -99,7 +99,7 @@ void Tire::CalcTireForce()  // Calculate tire longitudinal and lateral force
     force = slipAbsNorm * slipM * dF0 / (1 + slipAbsNorm * (slipAbsNorm + dF0 * slipM / forceM - 2));
   }
   else if (slipAbs < slipG)  //(slipAbs < slipSat)
-  {                        // adhesion/sliding
+  {                          // adhesion/sliding
 
     double const sigma = (slipAbs - slipM) / (slipG - slipM);
 
@@ -254,4 +254,4 @@ void Tire::SetRotationVelocity(
     units::angular_velocity::radians_per_second_t rotVelocity)  // Set tire rotational velocity
 {
   rotationVelocity = rotVelocity;
-};
\ No newline at end of file
+};
diff --git a/sim/src/components/Dynamics_TireModel/src/tmeasytire.h b/sim/src/components/Dynamics_TireModel/src/tmeasytire.h
index 8375fea98623a95e945eead6d57439a65d564398..5818215f267dfd63aee427324ffd75830824ad8f 100644
--- a/sim/src/components/Dynamics_TireModel/src/tmeasytire.h
+++ b/sim/src/components/Dynamics_TireModel/src/tmeasytire.h
@@ -40,23 +40,23 @@ class Tire
 public:
   //! Constructor
   //!
-  //! @param[in] F_ref            Tire reference vertical force
-  //! @param[in] mu_tire_max      Friction coefficient at maximum tire force at reference vertical force
-  //! @param[in] mu_tire_slide    Friction coefficient at saturation tire force at reference vertical force
-  //! @param[in] s_max            Slip at maximum force at reference vertical force
-  //! @param[in] mu_tire_max2     Friction coefficient at maximum tire force at double reference vertical force
-  //! @param[in] mu_tire_slide2   Friction coefficient at saturation tire force at double reference vertical force
-  //! @param[in] s_max2           Slip at maximum force at double reference vertical force
-  //! @param[in] r                Tire radius [m]
-  //! @param[in] mu_scale         Scaling factor applied to the friction coefficient
-  //! @param[in] s_slide          Saturation slip at reference vertical force
-  //! @param[in] s_slide2         Saturation slip at double reference vertical force
-  //! @param[in] F0p              Initial slope at current vertical force
-  //! @param[in] F0p2             Initial slope at double vertical force
+  //! @param[in] fRef             Tire reference vertical force
+  //! @param[in] muTireMax        Friction coefficient at maximum tire force at reference vertical force
+  //! @param[in] muTireSlide      Friction coefficient at saturation tire force at reference vertical force
+  //! @param[in] sMax             Slip at maximum force at reference vertical force
+  //! @param[in] muTireMax2       Friction coefficient at maximum tire force at double reference vertical force
+  //! @param[in] muTireSlide2     Friction coefficient at saturation tire force at double reference vertical force
+  //! @param[in] sMax2            Slip at maximum force at double reference vertical force
+  //! @param[in] radius           Tire radius [m]
+  //! @param[in] muScale          Scaling factor applied to the friction coefficient
+  //! @param[in] sSlide           Saturation slip at reference vertical force
+  //! @param[in] sSlide2          Saturation slip at double reference vertical force
+  //! @param[in] f0p              Initial slope at current vertical force
+  //! @param[in] f0p2             Initial slope at double vertical force
   //! @param[in] positiontire     Tire positions in car CS (Reference: Center of Gravity) [m]
   //! @param[in] rotationVelocity Tire rotation velocity [1/s]
-  //! @param[in] Inertia          Tire inertia [kgm2]
-  //! @param[in] PneumaticTrail   Tire pneumatic trail [m]
+  //! @param[in] inertia          Tire inertia [kgm2]
+  //! @param[in] pneumaticTrail   Tire pneumatic trail [m]
   Tire(units::force::newton_t fRef,
        Common::Vector2d<double> muTireMax,
        Common::Vector2d<double> muTireSlide,
@@ -90,14 +90,14 @@ public:
   units::force::newton_t GetRollFriction();
   //! Update tire parameters depending on the tire vertical force
   //!
-  //! @param[in]     foreZ_update           Current vertical tire force
+  //! @param[in]     forceZUpdate           Current vertical tire force
   void Rescale(units::force::newton_t forceZUpdate);
   //! Calculation of tire rotation acceleration dependung on tire torque and inertia
   //!
   void CalcRotAcc();
   //! Calculation of tire rotation speed depending on tire acceleration and timestep
   //!
-  //! @param[in]     dt           integration timestep
+  //! @param[in]     deltaT           integration timestep
   void CalcRotVel(units::time::second_t deltaT);
   //! Calculate tire velocity in tire coordinate system depending on vehicle velocity, yaw velocity and tire position
   //!
@@ -190,11 +190,11 @@ private:
 
   units::force::newton_t FRef;  //! tire reference vertical force
 
-  units::length::meter_t radius;                                   //!< tire radius [m]
-  units::inertia inertia;                                          //!< tire inertia [kgm2]
-  units::length::meter_t pneumaticTrail;                           //!< tire pneumatic trail [m]
-  double frictionRoll = 0.01;                                      //!< tire friction roll coefficient
-  units::velocity::meters_per_second_t velocityLimit{0.27};        //!< tire velocity limit [m/s]
+  units::length::meter_t radius;                             //!< tire radius [m]
+  units::inertia inertia;                                    //!< tire inertia [kgm2]
+  units::length::meter_t pneumaticTrail;                     //!< tire pneumatic trail [m]
+  double frictionRoll = 0.01;                                //!< tire friction roll coefficient
+  units::velocity::meters_per_second_t velocityLimit{0.27};  //!< tire velocity limit [m/s]
 
   units::angular_velocity::radians_per_second_t rotationVelocity;       //!< tire rotation velocity [1/s]
   Common::Vector2d<units::velocity::meters_per_second_t> velocityTire;  //!< tire velocity [m/s]
diff --git a/sim/src/components/LimiterAccVehComp/CMakeLists.txt b/sim/src/components/LimiterAccVehComp/CMakeLists.txt
index 7aeccd5356003716da18a99d2ab94a52fb6e18b4..aad79abcd1775aa998969a3ce0c7c0705cfce438 100644
--- a/sim/src/components/LimiterAccVehComp/CMakeLists.txt
+++ b/sim/src/components/LimiterAccVehComp/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen 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,4 +26,7 @@ add_openpass_target(
   LIBRARIES
     Common
     MantleAPI::MantleAPI
+  
+  GUIXML
+    LimiterAccelerationVehicleComponents.xml 						   
 )
diff --git a/sim/src/components/LimiterAccVehComp/LimiterAccelerationVehicleComponents.xml b/sim/src/components/LimiterAccVehComp/LimiterAccelerationVehicleComponents.xml
new file mode 100644
index 0000000000000000000000000000000000000000..61870577e4353cf58452efee818946e036df1dd4
--- /dev/null
+++ b/sim/src/components/LimiterAccVehComp/LimiterAccelerationVehicleComponents.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>LimiterAccelerationVehicleComponents</title>
+  <library>LimiterAccelerationVehicleComponents</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>AccelerationSignal</type>
+      <title>AccelerationSignal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+	<input>
+      <id>100</id>
+      <type>ParametersVehicleSignal</type>
+      <title>ParametersVehicleSignal</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>AccelerationSignal</type>
+      <title>AccelerationSignal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/LimiterAccVehComp/limiterAccVehComp.cpp b/sim/src/components/LimiterAccVehComp/limiterAccVehComp.cpp
index 6edfd8caaaf1410dd28d8f2a1f61fb56e2e46f62..b05574c4d72979f3a5b894675ddfff4ab00db9ab 100644
--- a/sim/src/components/LimiterAccVehComp/limiterAccVehComp.cpp
+++ b/sim/src/components/LimiterAccVehComp/limiterAccVehComp.cpp
@@ -96,7 +96,7 @@ extern "C" LIMITER_ACCELERATION_VEHICLE_COMPONENTS_SHARED_EXPORT ModelInterface
                                                                                      callbacks,
                                                                                      agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -139,7 +139,7 @@ extern "C" LIMITER_ACCELERATION_VEHICLE_COMPONENTS_SHARED_EXPORT bool OpenPASS_U
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -174,7 +174,7 @@ extern "C" LIMITER_ACCELERATION_VEHICLE_COMPONENTS_SHARED_EXPORT bool OpenPASS_U
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -207,7 +207,7 @@ extern "C" LIMITER_ACCELERATION_VEHICLE_COMPONENTS_SHARED_EXPORT bool OpenPASS_T
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Parameters_Vehicle/CMakeLists.txt b/sim/src/components/Parameters_Vehicle/CMakeLists.txt
index fb71668f22203eaff9094717712f8d8cc8805ae3..aa983d689c04cc6dbf8ec898cd20ee0fcec0166b 100644
--- a/sim/src/components/Parameters_Vehicle/CMakeLists.txt
+++ b/sim/src/components/Parameters_Vehicle/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -24,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Parameters_Vehicle.xml  							
 )
diff --git a/sim/src/components/Parameters_Vehicle/Parameters_Vehicle.xml b/sim/src/components/Parameters_Vehicle/Parameters_Vehicle.xml
new file mode 100644
index 0000000000000000000000000000000000000000..825115450b3b4391262ba3b9d5bf05bda3d10073
--- /dev/null
+++ b/sim/src/components/Parameters_Vehicle/Parameters_Vehicle.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Sensor</type>
+  <title>Parameters_Vehicle</title>
+  <library>Parameters_Vehicle</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs/>
+  <outputs>
+    <output>
+      <id>1</id>
+      <type>ParametersVehicleSignal</type>
+      <title>Vehicle Parameters</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Parameters_Vehicle/parameters_vehicle.cpp b/sim/src/components/Parameters_Vehicle/parameters_vehicle.cpp
index 6cc34b971523ccb9eb61fbaf22ff3e57927dd482..82ca8f7346492d8b20252d88bad080f4bc3c355a 100644
--- a/sim/src/components/Parameters_Vehicle/parameters_vehicle.cpp
+++ b/sim/src/components/Parameters_Vehicle/parameters_vehicle.cpp
@@ -98,7 +98,7 @@ extern "C" PARAMETERS_VEHICLE_SHARED_EXPORT ModelInterface *OpenPASS_CreateInsta
                                                                                  callbacks,
                                                                                  agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -141,7 +141,7 @@ extern "C" PARAMETERS_VEHICLE_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -178,7 +178,7 @@ extern "C" PARAMETERS_VEHICLE_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInte
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -210,7 +210,7 @@ extern "C" PARAMETERS_VEHICLE_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/SensorAggregation_OSI/CMakeLists.txt b/sim/src/components/SensorAggregation_OSI/CMakeLists.txt
index 03f9f620f5ae77195db85422ebcac6d4097dfa56..68040e768466165d275e886bd9bc8794c2387538 100644
--- a/sim/src/components/SensorAggregation_OSI/CMakeLists.txt
+++ b/sim/src/components/SensorAggregation_OSI/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -26,4 +27,7 @@ add_openpass_target(
     open_simulation_interface::open_simulation_interface_shared
     Common
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Sensor_Aggregation_OSI.xml							  
 )
diff --git a/sim/src/components/SensorAggregation_OSI/Sensor_Aggregation_OSI.xml b/sim/src/components/SensorAggregation_OSI/Sensor_Aggregation_OSI.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7779738a082b426da0104637e63aa7528f3ec691
--- /dev/null
+++ b/sim/src/components/SensorAggregation_OSI/Sensor_Aggregation_OSI.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Sensor</type>
+  <title>Sensor_Aggregation_OSI</title>
+  <library>SensorAggregation_OSI</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>SensorDataSignal</type>
+      <title>sensor signals</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>SensorDataSignal</type>
+      <title>Sensor Aggregation Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/SensorAggregation_OSI/sensorAggregation.cpp b/sim/src/components/SensorAggregation_OSI/sensorAggregation.cpp
index 20a93e03f021b0d6b18e05b434cdba5710b166ee..7457d98253d3f89e044073a7a28bc449b189102d 100644
--- a/sim/src/components/SensorAggregation_OSI/sensorAggregation.cpp
+++ b/sim/src/components/SensorAggregation_OSI/sensorAggregation.cpp
@@ -94,7 +94,7 @@ extern "C" SENSOR_AGGREGATION_SHARED_EXPORT ModelInterface *OpenPASS_CreateInsta
                                                                                  callbacks,
                                                                                  agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -137,7 +137,7 @@ extern "C" SENSOR_AGGREGATION_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -174,7 +174,7 @@ extern "C" SENSOR_AGGREGATION_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInte
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -206,7 +206,7 @@ extern "C" SENSOR_AGGREGATION_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/SensorFusionErrorless_OSI/CMakeLists.txt b/sim/src/components/SensorFusionErrorless_OSI/CMakeLists.txt
index 80dc5a0458c017bf8025377546798e16c73f93e1..69fbdfdd1ef955630f3a9fda6b95d7b443da823c 100644
--- a/sim/src/components/SensorFusionErrorless_OSI/CMakeLists.txt
+++ b/sim/src/components/SensorFusionErrorless_OSI/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -26,4 +27,7 @@ add_openpass_target(
     open_simulation_interface::open_simulation_interface_shared
     Common
     MantleAPI::MantleAPI
+  
+  GUIXML
+    Sensor_Fusion_OSI.xml						 
 )
diff --git a/sim/src/components/SensorFusionErrorless_OSI/Sensor_Fusion_OSI.xml b/sim/src/components/SensorFusionErrorless_OSI/Sensor_Fusion_OSI.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4e74c7333fcb3f048ea3a294a746b0551703be6b
--- /dev/null
+++ b/sim/src/components/SensorFusionErrorless_OSI/Sensor_Fusion_OSI.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Sensor</type>
+  <title>Sensor_Fusion_OSI</title>
+  <library>SensorFusionErrorless_OSI</library> 
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>SensorDataSignal</type>
+      <title>sensor signals</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>SensorDataSignal</type>
+      <title>Sensor Fusion Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/SensorFusionErrorless_OSI/sensorFusionErrorless_OSI.cpp b/sim/src/components/SensorFusionErrorless_OSI/sensorFusionErrorless_OSI.cpp
index 633dbb7bdf7ceb6562af6cb8592004313256461d..addd606d42a7549cd98c0222ece084079416c8d8 100644
--- a/sim/src/components/SensorFusionErrorless_OSI/sensorFusionErrorless_OSI.cpp
+++ b/sim/src/components/SensorFusionErrorless_OSI/sensorFusionErrorless_OSI.cpp
@@ -93,7 +93,7 @@ extern "C" SENSOR_FUSION_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance(s
                                                                                      callbacks,
                                                                                      agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -138,7 +138,7 @@ extern "C" SENSOR_FUSION_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterface
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -175,7 +175,7 @@ extern "C" SENSOR_FUSION_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterface
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -207,7 +207,7 @@ extern "C" SENSOR_FUSION_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *imp
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Sensor_Collision/CMakeLists.txt b/sim/src/components/Sensor_Collision/CMakeLists.txt
index 555ada8a208393269d327d92e11b5597b1af2d59..35080e52f26c65d8f6a4b99f4b2ea861efbae0c9 100644
--- a/sim/src/components/Sensor_Collision/CMakeLists.txt
+++ b/sim/src/components/Sensor_Collision/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -26,4 +27,6 @@ add_openpass_target(
   LIBRARIES
     MantleAPI::MantleAPI
   
+  GUIXML
+    Sensor_Collision.xml  						  
 )
diff --git a/sim/src/components/Sensor_Collision/Sensor_Collision.xml b/sim/src/components/Sensor_Collision/Sensor_Collision.xml
new file mode 100644
index 0000000000000000000000000000000000000000..205404bb5a46e66ce2d7bb0e2e4018600f893796
--- /dev/null
+++ b/sim/src/components/Sensor_Collision/Sensor_Collision.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Sensor</type>
+  <title>Sensor_Collision</title>
+  <library>Sensor_Collision</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>10</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>penetrationTime</id>
+      <type>int</type>
+      <title>penetrationTime</title>
+      <unit>ms</unit>
+      <value>30</value>
+    </parameter>
+  </parameters>
+  <inputs/>
+  <outputs>
+	<output>
+      <id>0</id>
+      <type>bool</type>
+      <title>CollisionOccured</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Sensor_Collision/sensor_collision.cpp b/sim/src/components/Sensor_Collision/sensor_collision.cpp
index 5bad78aa82d394b9e3568167a33ca270651497d3..e56a22c99b7419d5fa825bccea94f75f234ac921 100644
--- a/sim/src/components/Sensor_Collision/sensor_collision.cpp
+++ b/sim/src/components/Sensor_Collision/sensor_collision.cpp
@@ -102,7 +102,7 @@ extern "C" SENSOR_COLLISION_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstanc
                                                                                  callbacks,
                                                                                  agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -147,7 +147,7 @@ extern "C" SENSOR_COLLISION_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterfa
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -184,7 +184,7 @@ extern "C" SENSOR_COLLISION_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterf
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -216,7 +216,7 @@ extern "C" SENSOR_COLLISION_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Sensor_Collision/sensor_collision_implementation.cpp b/sim/src/components/Sensor_Collision/sensor_collision_implementation.cpp
index 1b3cd801f23e51602280230941fa07e967d98988..d435f3599575e981a9f9d825707e3c28dfea1222 100644
--- a/sim/src/components/Sensor_Collision/sensor_collision_implementation.cpp
+++ b/sim/src/components/Sensor_Collision/sensor_collision_implementation.cpp
@@ -1,6 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2020-2021 ITK Engineering GmbH
  *               2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2024 Volkswagen AG
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -52,7 +53,7 @@ Sensor_Collision_Implementation::Sensor_Collision_Implementation(std::string com
                       agent)
 {
   LOGINFO("Constructing Sensor_Collision");
-  penetrationTime = parameters->GetParametersInt().at("0");
+  penetrationTime = parameters->GetParametersInt().at("penetrationTime");
   LOGINFO("Constructing Sensor_Collision successful with t_hold = " + std::to_string(penetrationTime) + " ms");
 }
 
diff --git a/sim/src/components/Sensor_Driver/CMakeLists.txt b/sim/src/components/Sensor_Driver/CMakeLists.txt
index c21e67bf5fce93fa472fba970ce590fe896e6573..9830b5853462b9c8739f3e9269164491c100156c 100644
--- a/sim/src/components/Sensor_Driver/CMakeLists.txt
+++ b/sim/src/components/Sensor_Driver/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -33,4 +34,6 @@ add_openpass_target(
   LIBRARIES
     MantleAPI::MantleAPI
   
+  GUIXML
+    Sensor_Driver.xml 					   
 )
diff --git a/sim/src/components/Sensor_Driver/Sensor_Driver.xml b/sim/src/components/Sensor_Driver/Sensor_Driver.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c73f263b3062f7e74f8df79d7d90b60ea82e197b
--- /dev/null
+++ b/sim/src/components/Sensor_Driver/Sensor_Driver.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Sensor</type>
+  <title>Sensor_Driver</title>
+  <library>Sensor_Driver</library>  
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters/>
+  <inputs/>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>SensorDriverSignal</type>
+      <title>Driver Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Sensor_Driver/sensor_driver.cpp b/sim/src/components/Sensor_Driver/sensor_driver.cpp
index 3bff96b0346374b76638c079272cd5cdce9bce42..ddc142df7b0f9ed8d6286132d14bf60d157109b8 100644
--- a/sim/src/components/Sensor_Driver/sensor_driver.cpp
+++ b/sim/src/components/Sensor_Driver/sensor_driver.cpp
@@ -94,7 +94,7 @@ extern "C" SENSOR_DRIVER_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance(s
                                                                             callbacks,
                                                                             agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -139,7 +139,7 @@ extern "C" SENSOR_DRIVER_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterface
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -176,7 +176,7 @@ extern "C" SENSOR_DRIVER_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterface
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -208,7 +208,7 @@ extern "C" SENSOR_DRIVER_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *imp
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/Sensor_OSI/CMakeLists.txt b/sim/src/components/Sensor_OSI/CMakeLists.txt
index e2eadf1d6d6c79616ebb789bd463e012975675fe..f0a5084d0975b5a708a773d55e620fc768c82bc8 100644
--- a/sim/src/components/Sensor_OSI/CMakeLists.txt
+++ b/sim/src/components/Sensor_OSI/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG								  
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -34,4 +35,6 @@ add_openpass_target(
     Common
     MantleAPI::MantleAPI
   
+  GUIXML
+    Sensor_OSI.xml				  
 )
diff --git a/sim/src/components/Sensor_OSI/Sensor_OSI.xml b/sim/src/components/Sensor_OSI/Sensor_OSI.xml
new file mode 100644
index 0000000000000000000000000000000000000000..17a5e56f7ac59967da78fc55bb764bf40ec18364
--- /dev/null
+++ b/sim/src/components/Sensor_OSI/Sensor_OSI.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Sensor</type>
+  <title>Sensor_OSI</title>
+  <library>Sensor_OSI</library>   
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>Type</id>
+      <type>string</type>
+      <title>Type</title>
+      <unit></unit>
+      <value>Geometric2D</value>
+      <!--value>ReceiverCar2X</value-->      
+    </parameter>
+    <parameter>
+      <id>Id</id>
+      <type>int</type>
+      <title>Id</title>
+      <unit></unit>
+      <value>1</value>
+    </parameter>      
+    <parameter>
+      <id>Longitudinal</id>
+      <type>double</type>
+      <title>Longitudinal</title>
+      <unit>m</unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>Lateral</id>
+      <type>double</type>
+      <title>Lateral</title>
+      <unit>m</unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>Height</id>
+      <type>double</type>
+      <title>Height</title>
+      <unit>m</unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>Pitch</id>
+      <type>double</type>
+      <title>Pitch</title>
+      <unit>rad</unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>Yaw</id>
+      <type>double</type>
+      <title>Yaw</title>
+      <unit>rad</unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>Roll</id>
+      <type>double</type>
+      <title>Roll</title>
+      <unit>rad</unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>FailureProbability</id>
+      <type>double</type>
+      <title>FailureProbability</title>
+      <unit></unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>Latency</id>
+      <type>double</type>
+      <title>Latency</title>
+      <unit>s</unit>
+      <value>0</value>
+    </parameter>
+    <parameter>
+      <id>OpeningAngleH</id>
+      <type>double</type>
+      <title>OpeningAngleH</title>
+      <unit>rad</unit>
+      <value>0.35</value>
+    </parameter>
+    <parameter>
+      <id>EnableVisualObstruction</id>
+      <type>bool</type>
+      <title>EnableVisualObstruction</title>
+      <unit></unit>
+      <value>false</value>
+    </parameter>
+    <parameter>
+      <id>DetectionRange</id>
+      <type>double</type>
+      <title>DetectionRange</title>
+      <unit>m</unit>
+      <value>300</value>
+    </parameter>
+    <parameter>
+      <id>RequiredPercentageOfVisibileArea</id>
+      <type>double</type>
+      <title>RequiredPercentageOfVisibileArea</title>
+      <unit></unit>
+      <value>0.001</value>
+    </parameter>
+    <parameter>
+      <id>DetectionDelayTime</id>
+      <type>double</type>
+      <title>DetectionDelayTime</title>
+      <unit></unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>MaxDropOutTime</id>
+      <type>double</type>
+      <title>MaxDropOutTime</title>
+      <unit></unit>
+      <value>0.0</value>
+    </parameter>
+    <parameter>
+      <id>Sensitivity</id>
+      <type>double</type>
+      <title>Sensitivity</title>
+      <unit></unit>
+      <value>1e-5</value>
+    </parameter>	
+  </parameters>
+  <inputs/>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>SensorDataSignal</type>
+      <title>Sensor Data</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/Sensor_OSI/sensorOSI.cpp b/sim/src/components/Sensor_OSI/sensorOSI.cpp
index 7459b3bbbc9b4d15e7adc657e6dff0c6585f38f6..f5ed2f4dbe78ce9b0cc406affac753ee3540a2a0 100644
--- a/sim/src/components/Sensor_OSI/sensorOSI.cpp
+++ b/sim/src/components/Sensor_OSI/sensorOSI.cpp
@@ -114,7 +114,7 @@ extern "C" SENSOR_OSI_SHARED_EXPORT ModelInterface *OpenPASS_CreateInstance(std:
     }
     return nullptr;
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -153,7 +153,7 @@ extern "C" SENSOR_OSI_SHARED_EXPORT bool OpenPASS_UpdateInput(ModelInterface *im
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -184,7 +184,7 @@ extern "C" SENSOR_OSI_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInterface *i
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -212,7 +212,7 @@ extern "C" SENSOR_OSI_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface *implem
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/components/SignalPrioritizer/CMakeLists.txt b/sim/src/components/SignalPrioritizer/CMakeLists.txt
index 376da468e1be29e20bb11bc9341a99f751c53695..21956bb1325baef7487c544ff4ddaee232a937cd 100644
--- a/sim/src/components/SignalPrioritizer/CMakeLists.txt
+++ b/sim/src/components/SignalPrioritizer/CMakeLists.txt
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -24,4 +25,7 @@ add_openpass_target(
 
   LIBRARIES
     MantleAPI::MantleAPI
+  
+  GUIXML
+    SignalPrioritizer.xml 	
 )
diff --git a/sim/src/components/SignalPrioritizer/SignalPrioritizer.xml b/sim/src/components/SignalPrioritizer/SignalPrioritizer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8adf954e05184457c2a7d4229e1ec48cf460f31c
--- /dev/null
+++ b/sim/src/components/SignalPrioritizer/SignalPrioritizer.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <type>Algorithm</type>
+  <title>Signal_Prioritizer</title>
+  <library>SignalPrioritizer</library> 
+  <schedule>
+    <offset>0</offset>
+    <cycle>1</cycle>
+    <response>0</response>
+  </schedule>
+  <parameters>
+    <parameter>
+      <id>0</id>
+      <type>int</type>
+      <title>Priority Input 1</title>
+      <unit></unit>
+      <value>1</value>
+    </parameter>
+    <parameter>
+      <id>1</id>
+      <type>int</type>
+      <title>Priority Input 2</title>
+      <unit></unit>
+      <value>2</value>
+    </parameter>
+    <parameter>
+      <id>2</id>
+      <type>int</type>
+      <title>Priority Input 3</title>
+      <unit></unit>
+      <value>3</value>
+    </parameter>
+    <parameter>
+      <id>3</id>
+      <type>int</type>
+      <title>Priority Input 4</title>
+      <unit></unit>
+      <value>4</value>
+    </parameter>
+  </parameters>
+  <inputs>
+    <input>
+      <id>0</id>
+      <type>any</type>
+      <title>Input 1</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>1</id>
+      <type>any</type>
+      <title>Input 2</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>2</id>
+      <type>any</type>
+      <title>Input 3</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+    <input>
+      <id>3</id>
+      <type>any</type>
+      <title>Input 4</title>
+      <unit></unit>
+      <cardinality>1</cardinality>
+    </input>
+  </inputs>
+  <outputs>
+    <output>
+      <id>0</id>
+      <type>any</type>
+      <title>Prioritized Signal</title>
+      <unit></unit>
+    </output>
+  </outputs>
+</component>
diff --git a/sim/src/components/SignalPrioritizer/signalPrioritizer.cpp b/sim/src/components/SignalPrioritizer/signalPrioritizer.cpp
index ec5ab2e88a97749a538c945a216a493683fc5c98..2527209e550c7a91f5e226eead061a8d8bbee3dd 100644
--- a/sim/src/components/SignalPrioritizer/signalPrioritizer.cpp
+++ b/sim/src/components/SignalPrioritizer/signalPrioritizer.cpp
@@ -92,7 +92,7 @@ extern "C" SIGNAL_PRIORITIZER_SHARED_EXPORT ModelInterface *OpenPASS_CreateInsta
                                                                                  callbacks,
                                                                                  agent));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -135,7 +135,7 @@ extern "C" SIGNAL_PRIORITIZER_SHARED_EXPORT bool OpenPASS_UpdateInput(
   {
     implementation->UpdateInput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -172,7 +172,7 @@ extern "C" SIGNAL_PRIORITIZER_SHARED_EXPORT bool OpenPASS_UpdateOutput(ModelInte
   {
     implementation->UpdateOutput(localLinkId, data, time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -204,7 +204,7 @@ extern "C" SIGNAL_PRIORITIZER_SHARED_EXPORT bool OpenPASS_Trigger(ModelInterface
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/core/CMakeLists.txt b/sim/src/core/CMakeLists.txt
index d764b9ec5438cfbf354d63a0482cba62f1f447af..1e7b47e962760207d1e88667c58d08f4e418d628 100644
--- a/sim/src/core/CMakeLists.txt
+++ b/sim/src/core/CMakeLists.txt
@@ -1,6 +1,7 @@
 ################################################################################
 # Copyright (c) 2020 HLRS, University of Stuttgart
 #               2020 in-tech GmbH
+#               2024 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
@@ -14,5 +15,4 @@ set(FOLDER "core")
 include_directories(${CMAKE_CURRENT_LIST_DIR})
 
 add_subdirectory(common)
-add_subdirectory(opsimulationmanager)
 add_subdirectory(opSimulation)
diff --git a/sim/src/core/opSimulation/bindings/observationLibrary.cpp b/sim/src/core/opSimulation/bindings/observationLibrary.cpp
index 4c1891ace895ac1feb47813265c385feaeb9741e..2f18469fd27d5dacc970dd52a7291cb85b58506e 100644
--- a/sim/src/core/opSimulation/bindings/observationLibrary.cpp
+++ b/sim/src/core/opSimulation/bindings/observationLibrary.cpp
@@ -75,24 +75,6 @@ bool ObservationLibrary::Init()
     return false;
   }
 
-  opSimulationManagerPreHookFunc
-      = library.get<ObservationInterface_OpSimulationManagerPreHook>(DllOpSimulationManagerPreHookId);
-  if (!opSimulationManagerPreHookFunc)
-  {
-    LOG_INTERN(LogLevel::Warning) << "Unable to resolve the symbol " << DllOpSimulationManagerPreHookId
-                                  << " within the DLL located at " << libraryPath + suffix;
-    return false;
-  }
-
-  opSimulationManagerPostHookFunc
-      = library.get<ObservationInterface_OpSimulationManagerPostHook>(DllOpSimulationManagerPostHookId);
-  if (!opSimulationManagerPostHookFunc)
-  {
-    LOG_INTERN(LogLevel::Warning) << "Unable to resolve the symbol " << DllOpSimulationManagerPostHookId
-                                  << " within the DLL located at " << libraryPath + suffix;
-    return false;
-  }
-
   simulationPreHookFunc = library.get<ObservationInterface_OpSimulationPreHook>(DllOpSimulationPreHookId);
   if (!simulationPreHookFunc)
   {
@@ -133,14 +115,6 @@ bool ObservationLibrary::Init()
     return false;
   }
 
-  simulationResultFileFunc = library.get<ObservationInterface_OpSimulationResultFile>(DllOpSimulationResultFileId);
-  if (!simulationResultFileFunc)
-  {
-    LOG_INTERN(LogLevel::Warning) << "Unable to resolve the symbol " << DllOpSimulationResultFileId
-                                  << " within the DLL located at " << libraryPath + suffix;
-    return false;
-  }
-
   try
   {
     LOG_INTERN(LogLevel::DebugCore) << "Loaded observation library " << library.location().filename().string()
diff --git a/sim/src/core/opSimulation/bindings/observationLibrary.h b/sim/src/core/opSimulation/bindings/observationLibrary.h
index 1e97199485012483ab26c743c913ad4214fcbce1..efde84b33e9963e820dbb1c9ed297227afd148e4 100644
--- a/sim/src/core/opSimulation/bindings/observationLibrary.h
+++ b/sim/src/core/opSimulation/bindings/observationLibrary.h
@@ -63,12 +63,6 @@ public:
   //! Type representing the signature of a dll-function to destroy/delete an instance of the module
   using ObservationInterface_DestroyInstanceType = void(ObservationInterface* implementation);
 
-  //! Type representing the signature of a dll-function to manage prehook of the simulation
-  using ObservationInterface_OpSimulationManagerPreHook = bool(ObservationInterface* implementation);
-  //! Type representing the signature of a dll-function to manage posthook of the simulation
-  using ObservationInterface_OpSimulationManagerPostHook
-      = bool(ObservationInterface* implementation, const std::string& filename);
-
   //! Type representing the signature of a dll-function to manage prehook of the simulation
   using ObservationInterface_OpSimulationPreHook = bool(ObservationInterface* implementation);
 
@@ -86,9 +80,6 @@ public:
   //! Type representing the signature of a dll-function to manage post hook of the simulation
   using ObservationInterface_OpSimulationPostHook = bool(ObservationInterface* implementation);
 
-  //! Type representing the signature of a dll-function to manage results file of the simulation
-  using ObservationInterface_OpSimulationResultFile = const std::string(ObservationInterface* implementation);
-
   /**
    * @brief ObservationLibrary constructor
    *
@@ -176,26 +167,15 @@ public:
   /// @return True, when posthook is successfull
   bool SimulationPostHook(ObservationInterface* implementation) { return simulationPostHookFunc(implementation); }
 
-  /// @brief Returns the name of the simulation result file
-  /// @param implementation Pointer to the observation interface
-  /// @return name of the simulation result file
-  const std::string SimulationResultFile(ObservationInterface* implementation)
-  {
-    return simulationResultFileFunc(implementation);
-  }
-
 private:
   const std::string DllGetVersionId = "OpenPASS_GetVersion";
   const std::string DllCreateInstanceId = "OpenPASS_CreateInstance";
   const std::string DllDestroyInstanceId = "OpenPASS_DestroyInstance";
-  const std::string DllOpSimulationManagerPreHookId = "OpenPASS_OpSimulationPreHook";
-  const std::string DllOpSimulationManagerPostHookId = "OpenPASS_OpSimulationPostHook";
   const std::string DllOpSimulationPreHookId = "OpenPASS_OpSimulationPreHook";
   const std::string DllOpSimulationPreRunHookId = "OpenPASS_OpSimulationPreRunHook";
   const std::string DllOpSimulationUpdateHookId = "OpenPASS_OpSimulationUpdateHook";
   const std::string DllOpSimulationPostRunHookId = "OpenPASS_OpSimulationPostRunHook";
   const std::string DllOpSimulationPostHookId = "OpenPASS_OpSimulationPostHook";
-  const std::string DllOpSimulationResultFileId = "OpenPASS_OpSimulationResultFile";
 
   const std::string libraryPath;
 
@@ -211,14 +191,11 @@ private:
   boost::function<ObservationInterface_GetVersionType> getVersionFunc;
   boost::function<ObservationInterface_CreateInstanceType> createInstanceFunc;
   boost::function<ObservationInterface_DestroyInstanceType> destroyInstanceFunc;
-  boost::function<ObservationInterface_OpSimulationManagerPreHook> opSimulationManagerPreHookFunc;
-  boost::function<ObservationInterface_OpSimulationManagerPostHook> opSimulationManagerPostHookFunc;
   boost::function<ObservationInterface_OpSimulationPreHook> simulationPreHookFunc;
   boost::function<ObservationInterface_OpSimulationPreRunHook> simulationPreRunHookFunc;
   boost::function<ObservationInterface_OpSimulationUpdateHook> simulationUpdateHookFunc;
   boost::function<ObservationInterface_OpSimulationPostRunHook> simulationPostRunHookFunc;
   boost::function<ObservationInterface_OpSimulationPostHook> simulationPostHookFunc;
-  boost::function<ObservationInterface_OpSimulationResultFile> simulationResultFileFunc;
 };
 
 }  // namespace core
diff --git a/sim/src/core/opSimulation/framework/commandLineParser.cpp b/sim/src/core/opSimulation/framework/commandLineParser.cpp
index 56013ff249ebcff7eeb6db4e6a93bb5d1c674af7..a44deb02f64f7470fc0732f54017a771d9480e6f 100644
--- a/sim/src/core/opSimulation/framework/commandLineParser.cpp
+++ b/sim/src/core/opSimulation/framework/commandLineParser.cpp
@@ -28,6 +28,9 @@ CommandLineArguments CommandLineParser::Parse(
           "Print help message")(
         "version,v",
           "Show version information")(
+        "clearResultsPath",
+          po::bool_switch(&arguments.clearResultsPath),
+          "Clear results path before simulation if set")(
         "logLevel",
           po::value<int>(&arguments.logLevel)->default_value(arguments.logLevel),
           "Log Level (0 - 5)")(
diff --git a/sim/src/core/opSimulation/framework/commandLineParser.h b/sim/src/core/opSimulation/framework/commandLineParser.h
index b7c859a3a5119617a3b357a4e3ed7a4a1bb49b82..66ef3d31cc356bb50bb0c21e70631862922e26e9 100644
--- a/sim/src/core/opSimulation/framework/commandLineParser.h
+++ b/sim/src/core/opSimulation/framework/commandLineParser.h
@@ -1,7 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2020 HLRS, University of Stuttgart
  *               2017-2019 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *
  *
  * This program and the accompanying materials are made available under the
@@ -24,6 +24,7 @@ namespace po = boost::program_options;
 /// Information about command line arguments
 struct SIMULATIONCOREEXPORT CommandLineArguments
 {
+  bool clearResultsPath{false};             ///< Clear results path
   int logLevel{0};                          ///< Level of log
   std::string libPath{SUBDIR_LIB_MODULES};  ///< Path to the simulator libraries
   std::string logFile{"opSimulation.log"};  ///< Name of log file
diff --git a/sim/src/core/opSimulation/framework/controller.h b/sim/src/core/opSimulation/framework/controller.h
index ffebff47ff4e366c5666dea3b66319cc37c137a2..2b18d4c8cbf8cc9d20e9f133ca640f02bb06525d 100644
--- a/sim/src/core/opSimulation/framework/controller.h
+++ b/sim/src/core/opSimulation/framework/controller.h
@@ -1,6 +1,6 @@
 /*******************************************************************************
  * Copyright (c) 2021 in-tech GmbH
- *               2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2022-2024 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
@@ -45,6 +45,9 @@ public:
   //! @return System of an agent
   const System& GetSystem() const { return system; }
 
+  //! @brief Adds an entity to the controller
+  //!
+  //! @param entity The entity to be manipulated by the controller
   void AddEntity(Entity* entity)
   {
     entity->SetSystem(system);
diff --git a/sim/src/core/opSimulation/framework/coordConverter.h b/sim/src/core/opSimulation/framework/coordConverter.h
index 36a09a0503026b997ba714d85a442a37aa644585..838469ecc481b8a0ae20bae2ea724193297c165a 100644
--- a/sim/src/core/opSimulation/framework/coordConverter.h
+++ b/sim/src/core/opSimulation/framework/coordConverter.h
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2022-2024 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
@@ -25,6 +25,9 @@ namespace core
 class SIMULATIONCOREEXPORT CoordConverter final : public mantle_api::ICoordConverter
 {
 public:
+  //! CoordConverter constructor
+  //!
+  //! @param[in] callbacks  Callback interface
   CoordConverter(const CallbackInterface *callbacks) : callbacks(callbacks) {}
 
   ~CoordConverter() = default;
@@ -34,6 +37,12 @@ public:
   //! @param[in] world    Pointer to the world
   void Init(WorldInterface *world) { this->world = world; }
 
+  //! @brief Converts a given mantle_api::Position into world coordinates
+  //!
+  //! @param position The mantle_api::Position to be converted. This can be either an OpenDriveLanePosition or an
+  //! OpenDriveRoadPosition
+  //! @return world coordinates corresponding to the given position
+  //! @throws std::runtime_error if the conversion fails due to invalid lane or road data
   mantle_api::Vec3<units::length::meter_t> Convert(mantle_api::Position position) const final
   {
     if (std::holds_alternative<mantle_api::OpenDriveLanePosition>(position))
diff --git a/sim/src/core/opSimulation/framework/entity.cpp b/sim/src/core/opSimulation/framework/entity.cpp
index 620e313ac3527163b3849b43f94a6492c5b61e4f..bf14b9cb5aa7567415202aae91eb94a9c3b2b108 100644
--- a/sim/src/core/opSimulation/framework/entity.cpp
+++ b/sim/src/core/opSimulation/framework/entity.cpp
@@ -15,7 +15,9 @@
 #include <MantleAPI/Traffic/entity_properties.h>
 #include <MantleAPI/Traffic/i_entity.h>
 #include <utility>
+#include <variant>
 
+#include "common/log.h"
 #include "common/vector2d.h"
 #include "framework/geometryHelper.h"
 #include "framework/routeSampler.h"
@@ -270,4 +272,49 @@ bool Entity::IsAgentInWorld()
   }
   return agent->IsAgentInWorld();
 }
+
+void Entity::SetVehicleLightState(const mantle_api::LightState &lightState, const mantle_api::LightType &lightType)
+{
+  const auto &lightMode = lightState.light_mode;
+  auto indicatorState = std::visit(
+      [&lightMode](auto &&lightType)
+      {
+        using T = std::decay_t<decltype(lightType)>;
+
+        if constexpr (std::is_same_v<T, mantle_api::VehicleLightType>)
+        {
+          switch (lightType)
+          {
+            case mantle_api::VehicleLightType::kIndicatorLeft:
+              return lightMode == mantle_api::LightMode::kOn ? IndicatorState::IndicatorState_Left
+                                                             : IndicatorState::IndicatorState_Off;
+            case mantle_api::VehicleLightType::kIndicatorRight:
+              return lightMode == mantle_api::LightMode::kOn ? IndicatorState::IndicatorState_Right
+                                                             : IndicatorState::IndicatorState_Off;
+            case mantle_api::VehicleLightType::kWarningLights:
+              return lightMode == mantle_api::LightMode::kOn ? IndicatorState::IndicatorState_Warn
+                                                             : IndicatorState::IndicatorState_Off;
+            default:
+              LogErrorAndThrow(
+                  "Unsupported vehicle light type in LightStateAction. Only indicatorLeft, indicatorRight and "
+                  "warningLights are supported");
+              return IndicatorState::IndicatorState_Off;
+          }
+        }
+        LogErrorAndThrow(
+            "Unsupported vehicle light type in LightStateAction. Only indicatorLeft, indicatorRight and "
+            "warningLights are supported");
+        return IndicatorState::IndicatorState_Off;
+      },
+      lightType);
+
+  if (!agent)
+  {
+    spawnParameter.indicatorState = indicatorState;
+  }
+  else
+  {
+    agent->SetIndicatorState(indicatorState);
+  }
+}
 }  // namespace core
diff --git a/sim/src/core/opSimulation/framework/entity.h b/sim/src/core/opSimulation/framework/entity.h
index 8eaa579b7bd4e018cc561ac3f04efaccb584e7c1..f1b102c79e9875b7bddf42f4ac9b20f7fc7bc78d 100644
--- a/sim/src/core/opSimulation/framework/entity.h
+++ b/sim/src/core/opSimulation/framework/entity.h
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2022-2024 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
@@ -14,6 +14,7 @@
 #include <MantleAPI/Common/orientation.h>
 #include <MantleAPI/Common/vector.h>
 #include <MantleAPI/Traffic/i_entity.h>
+#include <MantleAPI/Traffic/vehicle_light_properties.h>
 #include <memory>
 #include <stdint.h>
 #include <string>
@@ -122,6 +123,12 @@ public:
   //! @return "shouldBeSpawned" flag
   bool ShouldBeSpawned();
 
+  //! @brief Method which sets the indicator light state for the current agent
+  //!
+  //! @param[in] lightState    LightState after execution of the LightStateAction
+  //! @param[in] lightType     Type of Light
+  void SetVehicleLightState(const mantle_api::LightState &lightState, const mantle_api::LightType &lightType);
+
 private:
   mantle_api::UniqueId id;
   std::string name;
diff --git a/sim/src/core/opSimulation/framework/entityRepository.h b/sim/src/core/opSimulation/framework/entityRepository.h
index 22afb4c4e64d089a448a5eed5be98a83444bfd65..f3cd46477c0db5f11cb32682a68b7de18ba65d35 100644
--- a/sim/src/core/opSimulation/framework/entityRepository.h
+++ b/sim/src/core/opSimulation/framework/entityRepository.h
@@ -1,6 +1,6 @@
 /*******************************************************************************
  * Copyright (c) 2021 in-tech GmbH
- *               2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2022-2024 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
@@ -49,6 +49,7 @@ public:
   //! EntityRepository constructor
   //!
   //! @param[in] world        Pointer to the world
+  //! @param[in] idManager    References the idManager that handles unique IDs
   //! @param[in] agentFactory Pointer to the agent factory
   //! @param[in] routeSampler Pointer to the route sampler
   EntityRepository(WorldInterface *world,
@@ -57,18 +58,45 @@ public:
                    const RouteSamplerInterface *routeSampler);
 
   mantle_api::IVehicle &Create(const std::string &name, const mantle_api::VehicleProperties &properties) override;
-  mantle_api::IVehicle &Create(mantle_api::UniqueId id,
-                               const std::string &name,
-                               const mantle_api::VehicleProperties &properties) override;
+
+  /// @brief Creates a new dynamic scenario entity of vehicle type
+  ///
+  /// @param id         Unique ID of the entity
+  /// @param name       The name of the entity to be created
+  /// @param properties Vehicle properties
+  /// @return newly created dynamic scenario entity of vehicle type
+  mantle_api::IVehicle &Create([[maybe_unused]] mantle_api::UniqueId id,
+                               [[maybe_unused]] const std::string &name,
+                               [[maybe_unused]] const mantle_api::VehicleProperties &properties) override;
   mantle_api::IPedestrian &Create(const std::string &name, const mantle_api::PedestrianProperties &properties) override;
-  mantle_api::IPedestrian &Create(mantle_api::UniqueId id,
-                                  const std::string &name,
-                                  const mantle_api::PedestrianProperties &properties) override;
-  mantle_api::IStaticObject &Create(const std::string &name,
-                                    const mantle_api::StaticObjectProperties &properties) override;
-  mantle_api::IStaticObject &Create(mantle_api::UniqueId id,
-                                    const std::string &name,
-                                    const mantle_api::StaticObjectProperties &properties) override;
+
+  /// @brief Creates a new scenario entity of pedestrian type
+  ///
+  /// @param id         Unique ID of the entity
+  /// @param name       The name of the entity to be created
+  /// @param properties Pedestrian properties
+  /// @return newly created scenario entity of pedestrian type
+  mantle_api::IPedestrian &Create([[maybe_unused]] mantle_api::UniqueId id,
+                                  [[maybe_unused]] const std::string &name,
+                                  [[maybe_unused]] const mantle_api::PedestrianProperties &properties) override;
+
+  /// @brief Creates a new scenario entity of static object type
+  ///
+  /// @param name       The name of the entity to be created
+  /// @param properties Static object properties
+  /// @return newly created scenario entity of static object type
+  mantle_api::IStaticObject &Create([[maybe_unused]] const std::string &name,
+                                    [[maybe_unused]] const mantle_api::StaticObjectProperties &properties) override;
+
+  /// @brief Creates a new scenario entity of static object type
+  ///
+  /// @param id         Unique ID of the entity
+  /// @param name       The name of the entity to be created
+  /// @param properties Static object properties
+  /// @return newly created scenario entity of static object type
+  mantle_api::IStaticObject &Create([[maybe_unused]] mantle_api::UniqueId id,
+                                    [[maybe_unused]] const std::string &name,
+                                    [[maybe_unused]] const mantle_api::StaticObjectProperties &properties) override;
 
   mantle_api::IVehicle &GetHost() override;
   std::optional<std::reference_wrapper<mantle_api::IEntity>> Get(const std::string &name) override;
@@ -86,6 +114,11 @@ public:
 
   void RegisterEntityCreatedCallback(const std::function<void(mantle_api::IEntity &)> &callback) override {}
   void RegisterEntityDeletedCallback(const std::function<void(const std::string &)> &callback) override {}
+
+  /// @brief Allows an external component to react on deletion of an entity, such as cleaning up invalid references
+  /// pointing to it
+  ///
+  /// @param callback Function to be called when deleting an entity with UniqueId parameter
   void RegisterEntityDeletedCallback(const std::function<void(mantle_api::UniqueId)> &callback) override {}
 
   //! @brief Method which returns the entity by given unique ID
diff --git a/sim/src/core/opSimulation/framework/environment.h b/sim/src/core/opSimulation/framework/environment.h
index 3943742460a705eddc75079d2c3b16bcc4e84101..e9daeb14cc4cb070c2e2d719896873683f4e9d58 100644
--- a/sim/src/core/opSimulation/framework/environment.h
+++ b/sim/src/core/opSimulation/framework/environment.h
@@ -96,7 +96,10 @@ public:
   //! @param[in] agentBlueprintProvider   References the agent blueprint provider
   //! @param[in] agentFactory             References the agent factory of the framework
   //! @param[in] stochastics              References the stochastics functionality of the framework
+  //! @param[in] world                    References the world of the framework
   //! @param[in] turningRates             References the turning rates
+  //! @param[in] callbacks                References the callback interface
+  //! @param[in] idManager                References the idManager that handles unique IDs
   Environment(const std::string &configurationDir,
               AgentBlueprintProvider &agentBlueprintProvider,
               core::AgentFactoryInterface *agentFactory,
@@ -152,8 +155,12 @@ public:
     }
   }
 
-  void CreateMap(const std::string &map_file_path, const mantle_api::MapDetails &map_details) override final
+  void CreateMap(const std::string &map_file_path,
+                 const mantle_api::MapDetails &map_details,
+                 const std::string &map_model_reference) override final
   {
+    std::ignore = map_model_reference;
+
     if (world->isInstantiated())
     {
       return;
@@ -175,16 +182,28 @@ public:
 
   void RemoveEntityFromController(mantle_api::UniqueId entity_id, mantle_api::UniqueId controller_id) override final{};
 
+  //! @brief Updates control strategies for a given entity with the provided set of control strategies
+  //!
+  //! @param entity_id The ID of the entity whose control strategies are to be updated
+  //! @param control_strategies A vector containing shared pointers to control strategy objects
   void UpdateControlStrategies(
       std::uint64_t entity_id,
       std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) override final
   {
-    for (auto strategy : control_strategies)
+    for (auto &strategy : control_strategies)
     {
       if (auto follow_trajectory_control_strategy
           = std::dynamic_pointer_cast<mantle_api::FollowTrajectoryControlStrategy>(strategy))
       {
         auto &polyline = std::get<mantle_api::PolyLine>(follow_trajectory_control_strategy->trajectory.type);
+        if (!polyline.empty() && !polyline.front().time)
+        {
+          strategy->movement_domain = mantle_api::MovementDomain::kLateral;
+        }
+        else
+        {
+          strategy->movement_domain = mantle_api::MovementDomain::kBoth;
+        }
         std::for_each(begin(polyline),
                       end(polyline),
                       [&](auto &point)
@@ -195,6 +214,12 @@ public:
                             -entityRepository.GetEntity(entity_id).GetProperties()->bounding_box.geometric_center);
                       });
       }
+      if (auto vehicle_light_states_control_strategy
+          = std::dynamic_pointer_cast<mantle_api::VehicleLightStatesControlStrategy>(strategy))
+      {
+        entityRepository.GetEntity(entity_id).SetVehicleLightState(vehicle_light_states_control_strategy->light_state,
+                                                                   vehicle_light_states_control_strategy->light_type);
+      }
     }
     entityRepository.GetEntity(entity_id).GetScenarioControl()->SetStrategies(control_strategies);
   }
@@ -270,7 +295,6 @@ public:
 
   void InitTrafficSwarmService(const mantle_api::TrafficSwarmParameters &parameters) override {}
 
-  /// @brief Returns the traffic swarm service
   mantle_api::ITrafficSwarmService &GetTrafficSwarmService() override { return trafficSwarmService; }
 
   Scenery scenery;                                    //!< References the scenery as a list of roads
@@ -288,8 +312,8 @@ public:
       entityRepository;  //!< References the entity repository that provides CRUD functionality for scenario entities
   ControllerRepository
       controllerRepository;  //!< References the controller repository that provides CRUD functionality for controllers
-  TrafficSwarmService trafficSwarmService;
-  mantle_api::Time simulationTime{};  //!< Time since start of simulation
+  TrafficSwarmService trafficSwarmService;  //!< References the traffic swarm service
+  mantle_api::Time simulationTime{};        //!< Time since start of simulation
 };
 
 }  //namespace core
diff --git a/sim/src/core/opSimulation/framework/main.cpp b/sim/src/core/opSimulation/framework/main.cpp
index e16b412ef555eafa95d75d3bab1a8804781d86d2..4b2d268d413baae2fb49503c4f003a7d8036bb57 100644
--- a/sim/src/core/opSimulation/framework/main.cpp
+++ b/sim/src/core/opSimulation/framework/main.cpp
@@ -45,11 +45,19 @@ static void SetupLogging(const std::filesystem::path& executionPath,
                          LogLevel logLevel,
                          const std::string& logFileString);
 
+//-----------------------------------------------------------------------------
+//! \brief  Check several parameters of a directory
+//! \param  directory
+//! \param  prefix   for readable logging in case of an error
+//! \return true, if everything directory exists and really is a directory, false otherwise
+//-----------------------------------------------------------------------------
+static bool CheckDir(const std::string& directory, const std::string& prefix);
+
 //-----------------------------------------------------------------------------
 //! \brief  Check several parameters of a readable directory
 //! \param  directory
 //! \param  prefix   for readable logging in case of an error
-//! \return true, if everything is allright
+//! \return true, if \c CheckDir returns true and the directory is readable, false otherwise
 //-----------------------------------------------------------------------------
 static bool CheckReadableDir(const std::string& directory, const std::string& prefix);
 
@@ -57,17 +65,18 @@ static bool CheckReadableDir(const std::string& directory, const std::string& pr
 //! \brief  Check several parameters of a writeable directory
 //! \param  directory
 //! \param  prefix   for readable logging in case of an error
-//! \return true, if everything is allright
+//! \return true, if \c CheckDir returns true and the directory is writable, false otherwise
 //-----------------------------------------------------------------------------
 static bool CheckWritableDir(const std::string& directory, const std::string& prefix);
 
-//-----------------------------------------------------------------------------
-//! \brief   Cleans the output directory, checks the directories given by the
-//!          command line parameters and sets up the logging
-//! \param   directories
-//! \return  true, if everything is allright
-//-----------------------------------------------------------------------------
+/// @brief Prepare directories and logging
+/// @param directories      Directories use by the simulator
+/// @param clearResultsPath Clear results path before simulation if set
+/// @param logLevel         Selected Loglevel
+/// @param logFileString    Path to the logfile
+/// @returns true on success, false on error
 static bool PrepareDirectoriesAndLogging(const openpass::core::Directories& directories,
+                                         bool clearResultsPath,
                                          LogLevel logLevel,
                                          const std::string& logFileString);
 
@@ -97,8 +106,10 @@ int main(int argc, char* argv[])  // NOLINT(cppcoreguidelines-avoid-c-arrays, mo
 
   openpass::core::Directories directories(
       executionPath.string(), parsedArguments.libPath, parsedArguments.configsPath, parsedArguments.resultsPath);
-  if (!PrepareDirectoriesAndLogging(
-          directories, static_cast<LogLevel>(parsedArguments.logLevel), parsedArguments.logFile))
+  if (!PrepareDirectoriesAndLogging(directories,
+                                    parsedArguments.clearResultsPath,
+                                    static_cast<LogLevel>(parsedArguments.logLevel),
+                                    parsedArguments.logFile))
   {
     exit(EXIT_FAILURE);
   }
@@ -150,13 +161,12 @@ int main(int argc, char* argv[])  // NOLINT(cppcoreguidelines-avoid-c-arrays, mo
   LOG_INTERN(LogLevel::DebugCore) << "Simulation time elapsed: " << duration.count() << " ms";
   LOG_INTERN(LogLevel::DebugCore) << "end simulation";
 
-  #ifdef CROSS_COMPILING
+#ifdef CROSS_COMPILING
   // Code specific to cross-compiling
-    _exit(0);
-  #else
-    return(0);
-  #endif
-
+  _exit(0);
+#else
+  return (0);
+#endif
 }
 
 std::filesystem::path ResolveExecutionPath(const char* executable)
@@ -199,25 +209,59 @@ void SetupLogging(const std::filesystem::path& executionPath, LogLevel logLevel,
   LOG_INTERN(LogLevel::DebugCore) << "\n\n### simulation start ##";
 }
 
-bool PrepareDirectoriesAndLogging(const openpass::core::Directories& directories,
-                                  LogLevel logLevel,
-                                  const std::string& logFileString)
+/// @brief Removes all files and directories in the given directory
+/// @param dir path to the directory, which shall be cleared (recursive)
+/// @returns true on success, false on errors (reported to cerr)
+bool ClearDir(const std::filesystem::path& dir) [[nothrow]]
 {
   namespace fs = std::filesystem;
 
+  auto reportError = [](const fs::path& dir, const std::string& additionalInfo)
+  { std::cerr << "Failed to clean \"" << dir.string() << "\": " << additionalInfo << '\n'; };
+
   try
   {
-    fs::remove_all(directories.outputDir);
-    fs::create_directories(directories.outputDir);
+    for (const auto& entry : fs::directory_iterator(dir))
+    {
+      fs::remove_all(entry.path());
+    }
+    if (!fs::is_empty(dir))
+    {
+      reportError(dir, "Path not empty after calling \"remove_all\".");
+      return false;
+    }
   }
   catch (const fs::filesystem_error& e)
   {
-    throw std::runtime_error(std::string("Error when cleaning output path - ") + e.what());
+    reportError(dir, e.what());
+    return false;
   }
 
+  return true;
+}
+
+bool PrepareDirectoriesAndLogging(const openpass::core::Directories& directories,
+                                  bool clearResultsPath,
+                                  LogLevel logLevel,
+                                  const std::string& logFileString)
+{
   // Setup is done after the output directory has been cleaned
   // for the case that logFileString is set to the output folder
   // itself, preventing proper cleanup of the output folder
+
+  if (!std::filesystem::exists(directories.outputDir))
+  {
+    std::filesystem::create_directory(directories.outputDir);
+  }
+
+  if (clearResultsPath)
+  {
+    if (!ClearDir(directories.outputDir))
+    {
+      return false;
+    }
+  }
+
   SetupLogging(directories.baseDir, logLevel, logFileString);
   LOG_INTERN(LogLevel::DebugCore) << "base path: " << directories.baseDir;
   LOG_INTERN(LogLevel::DebugCore) << "library path: " << directories.libraryDir;
@@ -232,32 +276,49 @@ bool PrepareDirectoriesAndLogging(const openpass::core::Directories& directories
   return statusConfig && statusLibrary && statusOutput;
 }
 
-bool CheckReadableDir(const std::string& directory, const std::string& prefix)
+bool CheckDir(const std::string& directory, const std::string& prefix)
 {
   namespace fs = std::filesystem;
 
   const fs::path dir(directory);
 
-  if (!fs::exists(dir) || !fs::is_directory(dir) || access(directory.c_str(), R_OK))
+  if (!fs::exists(dir))
   {
-    LOG_INTERN(LogLevel::Error) << prefix << " directory " << directory
-                                << " does not exist, is not a directory, or is not readable";
+    LOG_INTERN(LogLevel::Error) << prefix << " directory " << directory << " does not exist";
     return false;
   }
+
+  if (!fs::is_directory(dir))
+  {
+    LOG_INTERN(LogLevel::Error) << prefix << " directory " << directory << " is not a directory";
+    return false;
+  }
+
   return true;
 }
 
-bool CheckWritableDir(const std::string& directory, const std::string& prefix)
+bool CheckReadableDir(const std::string& directory, const std::string& prefix)
 {
-  namespace fs = std::filesystem;
+  CheckDir(directory, prefix);
 
-  const fs::path dir(directory);
+  if (int ret = access(directory.c_str(), R_OK))
+  {
+    LOG_INTERN(LogLevel::Error) << prefix << " directory " << directory << " is not readable (code " << ret << ")";
+    return false;
+  }
 
-  if (!fs::exists(dir) || !fs::is_directory(dir) || access(directory.c_str(), W_OK))
+  return true;
+}
+
+bool CheckWritableDir(const std::string& directory, const std::string& prefix)
+{
+  CheckDir(directory, prefix);
+
+  if (int ret = access(directory.c_str(), W_OK))
   {
-    LOG_INTERN(LogLevel::Error) << prefix << " directory " << directory
-                                << " does not exist, is not a directory, or is not writable";
+    LOG_INTERN(LogLevel::Error) << prefix << " directory " << directory << " is not writable (code " << ret << ")";
     return false;
   }
+
   return true;
 }
diff --git a/sim/src/core/opSimulation/framework/pedestrian.h b/sim/src/core/opSimulation/framework/pedestrian.h
index 203e380f77f5309b6599453a5e5044e462d9f85f..e55be73d4d4fa779842819f9a868bd019cbab2cc 100644
--- a/sim/src/core/opSimulation/framework/pedestrian.h
+++ b/sim/src/core/opSimulation/framework/pedestrian.h
@@ -1,6 +1,6 @@
 /*******************************************************************************
  * Copyright (c) 2021 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 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
@@ -39,6 +39,9 @@ public:
              const std::shared_ptr<mantle_api::PedestrianProperties> &properties,
              const RouteSamplerInterface *routeSampler);
 
+  /// @brief Sets the properties that describe scenario pedestrian
+  ///
+  /// @param properties Basic properties that describe scenario pedestrian
   void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override;
   mantle_api::PedestrianProperties *GetProperties() const override;
 
diff --git a/sim/src/core/opSimulation/framework/runInstantiator.cpp b/sim/src/core/opSimulation/framework/runInstantiator.cpp
index 47c80d03ac6d27b1812416c77090aa5a5620f9f1..d63e9f8b95b5ce78f06e7be49c288175b7125fb2 100644
--- a/sim/src/core/opSimulation/framework/runInstantiator.cpp
+++ b/sim/src/core/opSimulation/framework/runInstantiator.cpp
@@ -83,7 +83,7 @@ bool RunInstantiator::ExecuteRun()
       = configurationDir / fs::path(scenarioEngine.GetScenarioInfo().additional_information.at("vehicle_catalog_path"))
       / fs::path(VEHICLEMODELSFILENAME);
 
-  environment->CreateMap(relativeSceneryPath, *scenarioEngine.GetScenarioInfo().map_details);
+  environment->CreateMap(relativeSceneryPath, *scenarioEngine.GetScenarioInfo().map_details, "");
 
   Importer::EntityPropertiesImporter entityPropertiesImporter;
   entityPropertiesImporter.Import(vehicleCatalogFilepath.string());
diff --git a/sim/src/core/opSimulation/framework/scheduler/scheduler.cpp b/sim/src/core/opSimulation/framework/scheduler/scheduler.cpp
index ff90c4b606e0d460f7668dbece83ed6171acf13d..06e70e55e29a4a9aac9cac3d8462bca38b6f8c9d 100644
--- a/sim/src/core/opSimulation/framework/scheduler/scheduler.cpp
+++ b/sim/src/core/opSimulation/framework/scheduler/scheduler.cpp
@@ -81,7 +81,9 @@ bool Scheduler::Run(int startTime, RunResult &runResult, mantle_api::IScenarioEn
                                  synchronizeTasks,
                                  finalizeTasks,
                                  FRAMEWORK_UPDATE_RATE);
-  scenarioEngine->Step();
+  mantle_api::Time NOT_IMPLEMENTED_YET{units::make_unit<mantle_api::Time>(0)};
+
+  scenarioEngine->Step(NOT_IMPLEMENTED_YET);
   if (ExecuteTasks(taskList.GetBootstrapTasks()) == false)
   {
     return Scheduler::FAILURE;
@@ -90,7 +92,7 @@ bool Scheduler::Run(int startTime, RunResult &runResult, mantle_api::IScenarioEn
   do
   {
     environment.SetSimulationTime(units::make_unit<mantle_api::Time>(currentTime));
-    scenarioEngine->Step();
+    scenarioEngine->Step(NOT_IMPLEMENTED_YET);
     if (scenarioEngine->IsFinished()) break;
 
     if (!ExecuteTasks(taskList.GetPostScenarioTasks(currentTime))
diff --git a/sim/src/core/opSimulation/framework/srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp b/sim/src/core/opSimulation/framework/srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp
index a1904730a767a02c6de6f0651dc0af9488732f04..0f0455ec9cacfe26040fc96aa2deaa67546d082d 100644
--- a/sim/src/core/opSimulation/framework/srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp
+++ b/sim/src/core/opSimulation/framework/srcCollisionPostCrash/collisionDetection_Impact_implementation.cpp
@@ -98,13 +98,9 @@ std::vector<Common::Vector2d<units::length::meter_t>> CollisionDetectionPostCras
     auto indices12 = (i1 + 1) % corners1.size();  // 1st polygon, 2nd corner
 
     // calculate normalized normal on polygon edge and distance for Hesse normal form
-    Common::Vector2d<units::length::meter_t> normal1;
-    normal1.x = corners1[indices12].y - corners1[indices11].y;
-    normal1.y = -(corners1[indices12].x - corners1[indices11].x);
-
-    auto tmpNormalizedVector = normal1.Norm();
-    normal1.x = units::length::meter_t(tmpNormalizedVector.x.value());
-    normal1.y = units::length::meter_t(tmpNormalizedVector.y.value());
+    Common::Vector2d<units::length::meter_t> normal1{corners1[indices12].y - corners1[indices11].y,
+                                                     -(corners1[indices12].x - corners1[indices11].x)};
+    normal1.Normalize();
 
     auto distance1 = normal1.Dot(corners1[indices11]);
 
@@ -114,10 +110,9 @@ std::vector<Common::Vector2d<units::length::meter_t>> CollisionDetectionPostCras
       auto indices22 = (i2 + 1) % corners2.size();  // 2nd polygon, 2nd corner
 
       // calculate normalized normal on polygon edge and distance for Hesse normal form
-      Common::Vector2d<units::length::meter_t> normal2;
-      normal2.x = corners2[indices22].y - corners2[indices21].y;
-      normal2.y = -(corners2[indices22].x - corners2[indices21].x);
-      normal2.Norm();
+      Common::Vector2d<units::length::meter_t> normal2{corners2[indices22].y - corners2[indices21].y,
+                                                       -(corners2[indices22].x - corners2[indices21].x)};
+      normal2.Normalize();
       auto distance2 = normal2.Dot(corners2[indices21]);
 
       // check if edges are parallel
diff --git a/sim/src/core/opSimulation/framework/trafficSwarmService.h b/sim/src/core/opSimulation/framework/trafficSwarmService.h
index 750f858cd86890aeb2efefd6e0b5044456399751..47b7c7d1023b627ec57b3bfdc3baefcb493b676a 100644
--- a/sim/src/core/opSimulation/framework/trafficSwarmService.h
+++ b/sim/src/core/opSimulation/framework/trafficSwarmService.h
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2023-2024 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
@@ -30,6 +30,11 @@ public:
   {
     LogErrorAndThrow("Method GetVehicleProperties in TrafficSwarmService is not yet implemented");
   }
+
+  /// @brief Updates parameters for the controller
+  ///
+  /// @param config External controller configuration file
+  /// @param speed  The speed of the environment controller
   void UpdateControllerConfig(std::unique_ptr<mantle_api::ExternalControllerConfig>& config,
                               units::velocity::meters_per_second_t speed) override
   {
diff --git a/sim/src/core/opSimulation/framework/vehicle.h b/sim/src/core/opSimulation/framework/vehicle.h
index eb852726b746b5a20467635724959d5594812d2c..be68801a9c5d57f5dacc0f9a6f7a705d936dc35c 100644
--- a/sim/src/core/opSimulation/framework/vehicle.h
+++ b/sim/src/core/opSimulation/framework/vehicle.h
@@ -1,5 +1,6 @@
 /*******************************************************************************
  * Copyright (c) 2021 in-tech GmbH
+ *               2024 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
@@ -41,6 +42,9 @@ public:
           const RouteSamplerInterface *routeSampler,
           AgentCategory category);
 
+  /// @brief Sets the properties that describe scenario vehicle
+  ///
+  /// @param properties Basic properties that describe scenario vehicle
   void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override;
   mantle_api::VehicleProperties *GetProperties() const override;
 
diff --git a/sim/src/core/opSimulation/importer/systemConfigImporter.cpp b/sim/src/core/opSimulation/importer/systemConfigImporter.cpp
index 3eeb5e9175c2fd245cb8df579c83518d67a118d6..ae984c7ab3aa373ea1ac74226cca7f95c6acdacf 100644
--- a/sim/src/core/opSimulation/importer/systemConfigImporter.cpp
+++ b/sim/src/core/opSimulation/importer/systemConfigImporter.cpp
@@ -249,6 +249,12 @@ xmlDocPtr SystemConfigImporter::ImportSystemConfigContent(const std::string& fil
 {
   xmlInitParser();
 
+  if (!std::filesystem::exists(filename))
+  {
+    LOG_INTERN(LogLevel::Info) << filename + " does not exist";
+    return nullptr;
+  }
+
   xmlDocPtr document
       = xmlReadFile(filename.c_str(),
                     NULL,  // NOLINT(modernize-use-nullptr)
@@ -466,7 +472,7 @@ bool SystemConfigImporter::Import(const std::string& filename,
   }
   catch (const std::runtime_error& e)
   {
-    LOG_INTERN(LogLevel::Error) << "SystemConfig import failed: " + std::string(e.what());
+    LOG_INTERN(LogLevel::Info) << "SystemConfig import failed: " + std::string(e.what());
     return false;
   }
 }
diff --git a/sim/src/core/opSimulation/modelElements/agent.cpp b/sim/src/core/opSimulation/modelElements/agent.cpp
index 461a694b69c36747b7b968321fec38c2e477d0b3..e824c3d47dd7de3f80cae794036e183c3fd0434c 100644
--- a/sim/src/core/opSimulation/modelElements/agent.cpp
+++ b/sim/src/core/opSimulation/modelElements/agent.cpp
@@ -27,7 +27,6 @@
 #include "include/agentBlueprintInterface.h"
 #include "include/agentInterface.h"
 #include "include/agentTypeInterface.h"
-#include "include/componentInterface.h"
 #include "include/publisherInterface.h"
 #include "include/worldInterface.h"
 #include "modelElements/agentType.h"
diff --git a/sim/src/core/opSimulation/modules/Observation_EntityRepository/observation_entityRepository.cpp b/sim/src/core/opSimulation/modules/Observation_EntityRepository/observation_entityRepository.cpp
index 71fd6c2ca71972e2b9daa444a096fc6378ac9808..25a112081795491df9d4ac00d7f37bf7dc9020ce 100644
--- a/sim/src/core/opSimulation/modules/Observation_EntityRepository/observation_entityRepository.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_EntityRepository/observation_entityRepository.cpp
@@ -1,6 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2020-2021 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 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
@@ -98,75 +98,6 @@ extern "C" OBSERVATION_ENTITYREPOSITORY_SHARED_EXPORT void OpenPASS_DestroyInsta
   delete implementation;  // NOLINT(cppcoreguidelines-owning-memory)
 }
 
-//! dll-function to call an instance of the module in opSimulationManager before each simulation run starts
-//!
-//! @param[in]     implementation    The instance of the module
-//! @return  returns true if the instance is invoked, false otherwise
-extern "C" OBSERVATION_ENTITYREPOSITORY_SHARED_EXPORT bool OpenPASS_OpSimulationManagerPreHook(
-    ObservationInterface* implementation)
-{
-  try
-  {
-    implementation->OpSimulationManagerPreHook();
-  }
-  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;
-}
-
-/**
- * dll-function to call an instance of the module in opSimulationManager after each simulation run ends
- *
- * @param[in]     implementation    The instance that should be called
- * @param[in]     filename          Name of file containing the simulation run results from the simulation
- * @return  returns true if the instance is invoked, false otherwise
- */
-extern "C" OBSERVATION_ENTITYREPOSITORY_SHARED_EXPORT bool OpenPASS_OpSimulationManagerPostHook(
-    ObservationInterface* implementation, const std::string& filename)
-{
-  try
-  {
-    implementation->OpSimulationManagerPostHook(filename);
-  }
-  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;
-}
-
 /**
  * dll-function called by framework in simulation before all simulation runs start
  *
@@ -346,37 +277,3 @@ extern "C" OBSERVATION_ENTITYREPOSITORY_SHARED_EXPORT bool OpenPASS_OpSimulation
 
   return true;
 }
-
-/**
- * dll-function to call an instance of the module in simulation after all simulation
- * runs end to transfer the observation module results to the opSimulationManager.
- *
- * @param[in]       implementation  The instance that should be called
- * @return  File to be transferred
- */
-extern "C" OBSERVATION_ENTITYREPOSITORY_SHARED_EXPORT const std::string OpenPASS_OpSimulationResultFile(
-    ObservationInterface* implementation)
-{
-  try
-  {
-    return implementation->OpSimulationResultFile();
-  }
-  catch (const std::runtime_error& ex)
-  {
-    if (Callbacks != nullptr)
-    {
-      Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
-    }
-
-    return "";
-  }
-  catch (...)
-  {
-    if (Callbacks != nullptr)
-    {
-      Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-    }
-
-    return "";
-  }
-}
diff --git a/sim/src/core/opSimulation/modules/Observation_EntityRepository/observation_entityRepositoryImplementation.h b/sim/src/core/opSimulation/modules/Observation_EntityRepository/observation_entityRepositoryImplementation.h
index bac1ae4f420d61465812022d5189e1b84f9aea90..0b3b3683bdd30350ced5e229fb34fa81e2626b00 100644
--- a/sim/src/core/opSimulation/modules/Observation_EntityRepository/observation_entityRepositoryImplementation.h
+++ b/sim/src/core/opSimulation/modules/Observation_EntityRepository/observation_entityRepositoryImplementation.h
@@ -127,12 +127,8 @@ public:
   void OpSimulationPreRunHook() override;
   void OpSimulationPostRunHook(const RunResultInterface &runResult) override;
   void OpSimulationUpdateHook(int, RunResultInterface &) override {}
-  void OpSimulationManagerPreHook() override {}
-  void OpSimulationManagerPostHook(const std::string &) override {}
   void OpSimulationPostHook() override;
 
-  const std::string OpSimulationResultFile() override { return ""; }
-
 private:
   /**
    * @brief Get the Entities from the databuffer as CSV row container
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/CMakeLists.txt b/sim/src/core/opSimulation/modules/Observation_Log/CMakeLists.txt
index 5a6ba34efda63aaa989decbaed951a61d4acdb36..21e2023e89bfc6096f7135e8c338f539a374d5e4 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/CMakeLists.txt
+++ b/sim/src/core/opSimulation/modules/Observation_Log/CMakeLists.txt
@@ -21,17 +21,13 @@ add_openpass_target(
     observation_LogGlobal.h
     observation_log.h
     observation_logImplementation.h
-    runStatistic.h
-    runStatisticCalculation.h
-    temporaryFilePathGenerator.h
+    temporaryFileGenerator.h
 
   SOURCES
     observationCyclics.cpp
     observationFileHandler.cpp
     observation_log.cpp
     observation_logImplementation.cpp
-    runStatistic.cpp
-    runStatisticCalculation.cpp
 
   LIBRARIES
     Iconv::Iconv
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.cpp b/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.cpp
index c379b0027d09c9649c129e9ee869d2a8037e8bb9..5117c4b53330702d79223b5a7c2d74d808b70041 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.cpp
@@ -35,8 +35,7 @@
 #include "include/dataBufferInterface.h"
 #include "observationCyclics.h"
 #include "observationLogConstants.h"
-#include "runStatistic.h"
-#include "temporaryFilePathGenerator.h"
+#include "temporaryFileGenerator.h"
 
 class RunResultInterface;
 
@@ -58,15 +57,20 @@ void ObservationFileHandler::WriteStartOfFile(const std::string& frameworkVersio
                              + "\" does not exist");
   }
 
+  if (fs::exists(finalPath))
+  {
+    fs::remove(finalPath);
+  }
+
   std::string filePath = folder.string() + "/" + finalFilename.string();
-  TemporaryFilePathGenerator filePathCreator(filePath);
-  tmpFilePath = filePathCreator.CreateTemporaryFilePath();
+  TemporaryFileGenerator fileCreator(filePath);
+  tmpFilePath = folder / fileCreator.CreateTemporaryFile();
   xmlFile.open(tmpFilePath.string());
 
   if (!xmlFile.is_open())
   {
     std::stringstream stream;
-    stream << COMPONENTNAME << ": could not create file: " << tmpFilePath.string();
+    stream << COMPONENTNAME << ": Unable to create temporary output file: " << tmpFilePath.filename().string();
     throw std::runtime_error(stream.str());
   }
 
@@ -89,7 +93,7 @@ void ObservationFileHandler::WriteStartOfFile(const std::string& frameworkVersio
 }
 
 void ObservationFileHandler::WriteRun([[maybe_unused]] const RunResultInterface& runResult,
-                                      RunStatistic runStatistic,
+                                      std::uint32_t randomSeed,
                                       ObservationCyclics& cyclics,
                                       ObservationCyclics& cyclicsActiveComponent,
                                       const Events& events)
@@ -101,14 +105,8 @@ void ObservationFileHandler::WriteRun([[maybe_unused]] const RunResultInterface&
   // init new run result
   xmlTextWriterStartElement(xmlFileStream, toXmlChar(outputTags.RUNRESULT));
   xmlTextWriterWriteAttribute(xmlFileStream, toXmlChar(outputAttributes.RUNID), toXmlChar(std::to_string(runNumber)));
-
-  // write RunStatisticsTag
-  xmlTextWriterStartElement(xmlFileStream, toXmlChar(outputTags.RUNSTATISTICS));
-
-  runStatistic.WriteStatistics(xmlFileStream);
-
-  // close RunStatisticsTag
-  xmlTextWriterEndElement(xmlFileStream);
+  xmlTextWriterWriteAttribute(
+      xmlFileStream, toXmlChar(outputAttributes.RANDOMSEED), toXmlChar(std::to_string(randomSeed)));
 
   AddEvents(events, cyclicsActiveComponent);
   AddAgents();
@@ -165,10 +163,7 @@ void ObservationFileHandler::WriteEndOfFile()
   xmlFile.close();
 
   // finalize results
-  if (fs::exists(tmpFilePath) && !fs::exists(finalPath))
-  {
-    fs::rename(tmpFilePath, finalPath);
-  }
+  fs::rename(tmpFilePath, finalPath);
 }
 
 void ObservationFileHandler::AddEvents(const Events& events, const ObservationCyclics& cyclicsActiveComponent)
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.h b/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.h
index bddc9487eedf46db8c963f65bf1406cb0112ac57..e50fe916dc1922f7275b22b9efb1d3739b9bb0f1 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.h
+++ b/sim/src/core/opSimulation/modules/Observation_Log/observationFileHandler.h
@@ -26,7 +26,6 @@
 #include "common/sensorDefinitions.h"
 #include "include/dataBufferInterface.h"
 #include "observationLogConstants.h"
-#include "runStatistic.h"
 
 class ObservationCyclics;
 class RunResultInterface;
@@ -112,13 +111,13 @@ public:
    * \brief This function gets called after each run and writes all information about this run into the output file
    *
    * \param runResult
-   * \param runStatistic
+   * \param randomSeed
    * \param cyclics
    * \param cyclicsActiveComponent  cyclics containing info about active components
    * \param events
    */
   void WriteRun([[maybe_unused]] const RunResultInterface& runResult,
-                RunStatistic runStatistic,
+                std::uint32_t randomSeed,
                 ObservationCyclics& cyclics,
                 ObservationCyclics& cyclicsActiveComponent,
                 const Events& events);
@@ -141,7 +140,6 @@ protected:
   OutputTags outputTags;              ///< Output tags
 
   std::filesystem::path folder;         ///< Output directory
-  std::filesystem::path tmpFilename;    ///< File name temporary
   std::filesystem::path finalFilename;  ///< Name of output file
   std::filesystem::path tmpFilePath;    ///< Temporary path of the output directory
   std::filesystem::path finalPath;      ///< Final path of the output directory
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/observationLogConstants.h b/sim/src/core/opSimulation/modules/Observation_Log/observationLogConstants.h
index 66554f16968039443f6980f69ed67a6976ac175e..77f757bfb031e105bae1939f4714813774761042 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/observationLogConstants.h
+++ b/sim/src/core/opSimulation/modules/Observation_Log/observationLogConstants.h
@@ -17,6 +17,7 @@ struct OutputAttributes
   static constexpr const char* FRAMEWORKVERSION{"FrameworkVersion"};  ///< Output framework version
   static constexpr const char* SCHEMAVERSION{"SchemaVersion"};        ///< Output schema version
   static constexpr const char* RUNID{"RunId"};                        ///< Id of the current run
+  static constexpr const char* RANDOMSEED{"RandomSeed"};              ///< RandomSeed of the current run
   static constexpr const char* FAILUREPROBABITLITY{
       "FailureProbability"};                        ///< Probability object is not detected although it is visible
   static constexpr const char* LATENCY{"Latency"};  ///< Sensor latency
@@ -63,8 +64,6 @@ struct OutputTags
       "RunResults"};  ///< This section contains all RunResults that occurred during the invocations
   static constexpr const char* RUNRESULT{"RunResult"};  ///< This section contains information about the agents, their
                                                         ///< parameters, events related to the entities
-  static constexpr const char* RUNSTATISTICS{
-      "RunStatistics"};  ///< This section contains the RandomSeed and general statistics of the invocation
   static constexpr const char* SIMULATIONOUTPUT{
       "SimulationOutput"};  ///< This section contains central information about all
                             ///< executed invocations within an experiment
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/observation_log.cpp b/sim/src/core/opSimulation/modules/Observation_Log/observation_log.cpp
index 47aeec6680a02c0608dcdc3dafe41e0398182e2e..36227adf5aa89f2a17ac7e7e4dcbea4328260cc3 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/observation_log.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_Log/observation_log.cpp
@@ -1,6 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2020-2021 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 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
@@ -97,74 +97,6 @@ extern "C" OBSERVATION_LOG_SHARED_EXPORT void OpenPASS_DestroyInstance(Observati
   delete implementation;  // NOLINT(cppcoreguidelines-owning-memory)
 }
 
-//! dll-function to call an instance of the module in opSimulationManager before each simulation run starts
-//!
-//! @param[in]     implementation    The instance of the module
-//! @return  returns true if the instance is invoked, false otherwise
-extern "C" OBSERVATION_LOG_SHARED_EXPORT bool OpenPASS_OpSimulationManagerPreHook(ObservationInterface* implementation)
-{
-  try
-  {
-    implementation->OpSimulationManagerPreHook();
-  }
-  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;
-}
-
-/**
- * dll-function to call an instance of the module in opSimulationManager after each simulation run ends
- *
- * @param[in]     implementation    The instance that should be called
- * @param[in]     filename          Name of file containing the simulation run results from the simulation
- * @return  returns true if the instance is invoked, false otherwise
- */
-extern "C" OBSERVATION_LOG_SHARED_EXPORT bool OpenPASS_OpSimulationManagerPostHook(ObservationInterface* implementation,
-                                                                                   const std::string& filename)
-{
-  try
-  {
-    implementation->OpSimulationManagerPostHook(filename);
-  }
-  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;
-}
-
 /**
  * dll-function called by framework in simulation before all simulation runs start
  *
@@ -342,37 +274,3 @@ extern "C" OBSERVATION_LOG_SHARED_EXPORT bool OpenPASS_OpSimulationPostHook(Obse
 
   return true;
 }
-
-/**
- * dll-function to call an instance of the module in simulation after all simulation
- * runs end to transfer the observation module results to the opSimulationManager.
- *
- * @param[in]       implementation  The instance that should be called
- * @return  File to be transferred
- */
-extern "C" OBSERVATION_LOG_SHARED_EXPORT const std::string OpenPASS_OpSimulationResultFile(
-    ObservationInterface* implementation)
-{
-  try
-  {
-    return implementation->OpSimulationResultFile();
-  }
-  catch (const std::runtime_error& ex)
-  {
-    if (Callbacks != nullptr)
-    {
-      Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
-    }
-
-    return "";
-  }
-  catch (...)
-  {
-    if (Callbacks != nullptr)
-    {
-      Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-    }
-
-    return "";
-  }
-}
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/observation_logImplementation.cpp b/sim/src/core/opSimulation/modules/Observation_Log/observation_logImplementation.cpp
index 03543aa192bdb8da128710e79dd93a4e894612b2..7ba0fd71cc223facfe695231a2940c6c29364b3e 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/observation_logImplementation.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_Log/observation_logImplementation.cpp
@@ -43,8 +43,6 @@
 #include "include/worldInterface.h"
 #include "observationCyclics.h"
 #include "observationFileHandler.h"
-#include "runStatistic.h"
-#include "runStatisticCalculation.h"
 
 class RunResultInterface;
 
@@ -134,30 +132,11 @@ void ObservationLogImplementation::OpSimulationPreHook()
 
 void ObservationLogImplementation::OpSimulationPreRunHook()
 {
-  runStatistic = RunStatistic(GetStochastics()->GetRandomSeed());
   cyclics.Clear();
   cyclicsActiveComponent.Clear();
   events.clear();
 }
 
-void GetAgentValues(const std::string& key,
-                    const DataBufferReadInterface* dataBuffer,
-                    std::map<std::string, double>& result)
-{
-  const auto agentIds = dataBuffer->GetKeys("Statics/Agents");
-
-  for (const auto& agentId : agentIds)
-  {
-    const auto tdtResult = dataBuffer->GetCyclic(std::stoi(agentId), key);
-    if (tdtResult->size() == 0)
-    {
-      continue;
-    }
-    const auto& cyclicRow = tdtResult->begin()->get();
-    result[agentId] = std::get<double>(cyclicRow.value);
-  }
-}
-
 void ObservationLogImplementation::OpSimulationUpdateHook(int time, [[maybe_unused]] RunResultInterface& runResult)
 {
   const auto dsCyclics = dataBuffer->GetCyclic(std::nullopt, "*");
@@ -196,24 +175,17 @@ void ObservationLogImplementation::OpSimulationUpdateHook(int time, [[maybe_unus
                dsCyclic.value);
   }
 
-  GetAgentValues("TotalDistanceTraveled", dataBuffer, runStatistic.distanceTraveled);
-
   const auto acyclics = dataBuffer->GetAcyclic(std::nullopt, "*");
 
   for (const AcyclicRow& event : *acyclics)
   {
     events.emplace_back(time, event);
   }
-
-  runStatistic.AddStopReason(time, RunStatistic::StopReason::DueToTimeOut);
 }
 
 void ObservationLogImplementation::OpSimulationPostRunHook(const RunResultInterface& runResult)
 {
-  RunStatisticCalculation::DetermineEgoCollision(runStatistic, runResult, GetWorld());
-  runStatistic.VisibilityDistance = GetWorld()->GetVisibilityDistance();
-
-  fileHandler.WriteRun(runResult, runStatistic, cyclics, cyclicsActiveComponent, events);
+  fileHandler.WriteRun(runResult, GetStochastics()->GetRandomSeed(), cyclics, cyclicsActiveComponent, events);
 }
 
 void ObservationLogImplementation::OpSimulationPostHook()
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/observation_logImplementation.h b/sim/src/core/opSimulation/modules/Observation_Log/observation_logImplementation.h
index 2580b0af8d69f115fe70f2412bdfff644db46cde..92731b6e6b6f91ac6c79e4b56281f9ec1472d7d7 100644
--- a/sim/src/core/opSimulation/modules/Observation_Log/observation_logImplementation.h
+++ b/sim/src/core/opSimulation/modules/Observation_Log/observation_logImplementation.h
@@ -28,7 +28,6 @@
 #include "include/observationInterface.h"
 #include "observationCyclics.h"
 #include "observationFileHandler.h"
-#include "runStatistic.h"
 
 class CallbackInterface;
 class DataBufferReadInterface;
@@ -105,12 +104,8 @@ public:
   //-----------------------------------------------------------------------------
   void OpSimulationUpdateHook(int time, [[maybe_unused]] RunResultInterface& runResult) override;
   void OpSimulationPostRunHook(const RunResultInterface& runResult) override;
-  void OpSimulationManagerPreHook() override {}
-  void OpSimulationManagerPostHook(const std::string&) override {}
   void OpSimulationPostHook() override;
 
-  const std::string OpSimulationResultFile() override { return ""; }
-
 private:
   const openpass::common::RuntimeInformation& runtimeInformation;
   DataBufferReadInterface* dataBuffer;
@@ -118,7 +113,6 @@ private:
   ObservationCyclics cyclics;
   ObservationCyclics cyclicsActiveComponent;
   Events events;
-  RunStatistic runStatistic = RunStatistic(-1);
   std::vector<std::string> selectedColumns;
   std::vector<std::pair<std::string, std::string>> selectedRegexColumns;
 };
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.cpp b/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.cpp
deleted file mode 100644
index c5377d6fed6f83966b2335ed1be2689a47ac8ea3..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2016-2017 ITK Engineering GmbH
- *               2023-2024 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  runStatistic.cpp */
-//-----------------------------------------------------------------------------
-
-#include "runStatistic.h"
-
-#include <libxml/xmlwriter.h>
-
-#include "common/xmlParser.h"
-
-using namespace SimulationCommon;
-
-RunStatistic::RunStatistic(std::uint32_t randomSeed) : _randomSeed(randomSeed) {}
-
-void RunStatistic::AddStopReason(int time, StopReason reason)
-{
-  _stopReasonIdx = static_cast<int>(reason);
-  StopTime = time;
-}
-
-// ----------------------------- writing out --------------------- //
-void RunStatistic::WriteStatistics(xmlTextWriterPtr fileStream)
-{
-  xmlTextWriterStartElement(fileStream, toXmlChar("RandomSeed"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(_randomSeed)));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("VisibilityDistance"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(VisibilityDistance.value())));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("StopReason"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::string(StopReasonsStrings.at(_stopReasonIdx))));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("StopTime"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(StopTime)));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("EgoAccident"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(BoolToString(EgoCollision)));
-  xmlTextWriterEndElement(fileStream);
-
-  double totalDistanceTraveled = 0;
-  for (const auto& [_, distance] : distanceTraveled)
-  {
-    totalDistanceTraveled += distance;
-  }
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("TotalDistanceTraveled"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(totalDistanceTraveled)));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("EgoDistanceTraveled"));
-  xmlTextWriterWriteString(fileStream,
-                           toXmlChar(std::to_string(distanceTraveled.empty() ? 0.0 : distanceTraveled.at("0"))));
-  xmlTextWriterEndElement(fileStream);
-}
-
-std::string RunStatistic::BoolToString(bool b)
-{
-  return b ? "True" : "False";
-}
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.h b/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.h
deleted file mode 100644
index 3398595aa94d9867f33882b068ebe34cf0f279f4..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_Log/runStatistic.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2016-2017 ITK Engineering GmbH
- *               2017-2021 in-tech GmbH
- *               2023-2024 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 <array>
-#include <libxml/xmlwriter.h>
-#include <map>
-#include <stdint.h>
-#include <string>
-#include <units.h>
-#include <vector>
-
-//! This class represents the RandomSeed and general statistics of the invocation
-class RunStatistic
-{
-public:
-  //! Displays the reason why the simulation stopped.
-  //! Currently only due to time out.
-  enum class StopReason
-  {
-    DueToTimeOut
-  };
-
-  //! RunStatistic constructor
-  //!
-  //! @param[in] randomSeed   Random seed used for this invocation
-  RunStatistic(std::uint32_t randomSeed);
-
-  //! Adds the reason why the simulation stopped
-  //!
-  //! @param[in] time     Stop time
-  //! @param[in] reason   Reason why the simulation stopped
-  void AddStopReason(int time, StopReason reason);
-
-  //! Writes the RunStatistic information into xml file
-  //!
-  //! @param[in] fileStream   Stream which writes into xml file
-  void WriteStatistics(xmlTextWriterPtr fileStream);
-
-  // general
-  int StopTime = -1;          //!< This stays on UNDEFINED_NUMBER, if due time out -> replace in c#
-  bool EgoCollision = false;  //!< Flag which shows whether the ego agent was involved in an accident
-  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)
-
-  //! Convert boolean to string
-  //!
-  //! @param[in] b    Boolean to convert
-  //! @return Boolean as string
-  static std::string BoolToString(bool b);
-
-  ~RunStatistic() = default;
-
-private:
-  std::uint32_t _randomSeed;
-  std::vector<int> _followerIds;
-
-  static constexpr std::array<const char*, 1> StopReasonsStrings{"Due to time out"};
-  int _stopReasonIdx = static_cast<int>(StopReason::DueToTimeOut);
-};  // class RunStatistic
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/runStatisticCalculation.cpp b/sim/src/core/opSimulation/modules/Observation_Log/runStatisticCalculation.cpp
deleted file mode 100644
index 786e5d784af2f014ad367559ee1fe8d9f5326f71..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_Log/runStatisticCalculation.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2019-2020 in-tech GmbH
- *               2023 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 "runStatisticCalculation.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "include/agentInterface.h"
-#include "include/runResultInterface.h"
-#include "include/worldInterface.h"
-#include "runStatistic.h"
-
-void RunStatisticCalculation::DetermineEgoCollision(RunStatistic& runStatistic,
-                                                    const RunResultInterface& runResult,
-                                                    WorldInterface* world)
-{
-  auto* egoAgent = world->GetEgoAgent();
-
-  if (!egoAgent)
-  {
-    return;
-  }
-
-  const int egoId = egoAgent->GetId();
-  const auto* collisionsIds = runResult.GetCollisionIds();
-
-  if (std::find(collisionsIds->cbegin(), collisionsIds->cend(), egoId) != collisionsIds->cend())
-  {
-    runStatistic.EgoCollision = true;
-  }
-}
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/runStatisticCalculation.h b/sim/src/core/opSimulation/modules/Observation_Log/runStatisticCalculation.h
deleted file mode 100644
index 4d0ed159a2cac08c92e76db742246e934f695330..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_Log/runStatisticCalculation.h
+++ /dev/null
@@ -1,33 +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
-
-class WorldInterface;
-class RunResultInterface;
-class RunStatistic;
-
-/*!
- * \brief The RunStatisticCalculation class provides helper functions for run statistic analysis
- */
-class RunStatisticCalculation
-{
-public:
-  /*!
-   * \brief Determines whether the ego had a collision and sets the related flag in the RunStatistic
-   *
-   * \param[out] runStatistic      Result is stored here
-   * \param[in]  runResult         Structure to retrieve collisions from
-   * \param[in]  world             Pointer to the world
-   */
-  static void DetermineEgoCollision(RunStatistic& runStatistic,
-                                    const RunResultInterface& runResult,
-                                    WorldInterface* world);
-};
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/temporaryFileGenerator.h b/sim/src/core/opSimulation/modules/Observation_Log/temporaryFileGenerator.h
new file mode 100644
index 0000000000000000000000000000000000000000..a40ecab646eca376efbf36266cbdd611d3eba5a0
--- /dev/null
+++ b/sim/src/core/opSimulation/modules/Observation_Log/temporaryFileGenerator.h
@@ -0,0 +1,57 @@
+/********************************************************************************
+ * Copyright (c) 2023-2024 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 <filesystem>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <string>
+#include <utility>
+
+namespace fs = std::filesystem;
+
+//! @class TemporaryFileGenerator
+//! @brief A class for generating temporary files with unique names.
+class TemporaryFileGenerator
+{
+public:
+  //! @brief Constructor for TemporaryFileGenerator.
+  //! @param filePath The base path for generating temporary file names.
+  explicit TemporaryFileGenerator(fs::path filePath) : filePath(std::move(filePath)) {}
+
+  ~TemporaryFileGenerator() = default;
+
+  //! @brief Create a unique temporary file.
+  //!
+  //! If the provided file path exists, this method generates a new file name by appending
+  //! a 6-digit number to the original file name.
+  //!
+  //! @return The generated unique temporary file.
+  fs::path CreateTemporaryFile()
+  {
+    int counter = 0;
+    do
+    {
+      //! Generate a new filename with a 6-digit number appended
+      std::ostringstream newFilenameStream;
+      newFilenameStream << std::left << std::setw(6) << std::setfill('0') << counter % 1000000;
+      std::string newFilename = filePath.stem().string() + "_" + newFilenameStream.str() + ".tmp";
+      filePath.replace_filename(newFilename);
+      counter++;
+    } while (fs::exists(filePath));
+
+    return filePath.filename();
+  }
+
+private:
+  fs::path filePath;
+};
diff --git a/sim/src/core/opSimulation/modules/Observation_Log/temporaryFilePathGenerator.h b/sim/src/core/opSimulation/modules/Observation_Log/temporaryFilePathGenerator.h
deleted file mode 100644
index ac7da6215df3ec37a53763ea4eec9820f40e4a20..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_Log/temporaryFilePathGenerator.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2023 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 <filesystem>
-#include <fstream>
-#include <iomanip>
-#include <iostream>
-#include <string>
-#include <utility>
-
-namespace fs = std::filesystem;
-
-//! @class TemporaryFilePathGenerator
-//! @brief A class for generating temporary file paths with unique names.
-class TemporaryFilePathGenerator
-{
-public:
-  //! @brief Constructor for TemporaryFilePathGenerator.
-  //! @param filePath The base path for generating temporary file names.
-  explicit TemporaryFilePathGenerator(fs::path filePath) : filePath(std::move(filePath)) {}
-
-  ~TemporaryFilePathGenerator() = default;
-
-  //! @brief Create a unique temporary file path.
-  //!
-  //! If the provided file path exists, this method generates a new file name by appending
-  //! a 6-digit number to the original file name.
-  //!
-  //! @return The generated unique temporary file path.
-  fs::path CreateTemporaryFilePath()
-  {
-    if (fs::exists(filePath))
-    {
-      int counter = 0;
-      do
-      {
-        //! Generate a new filename with a 6-digit number appended
-        std::ostringstream newFilenameStream;
-        newFilenameStream << std::left << std::setw(6) << std::setfill('0') << counter % 1000000;
-        std::string newFilename = filePath.stem().string() + "_" + newFilenameStream.str() + ".tmp";
-        filePath = fs::path(newFilename);
-        counter++;
-      } while (fs::exists(filePath));
-    }
-
-    return filePath;
-  }
-
-private:
-  fs::path filePath;
-};
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/CMakeLists.txt b/sim/src/core/opSimulation/modules/Observation_LogAgent/CMakeLists.txt
index 2633122cffa82bf61cef36a8ab8b78f5e065e4b4..652f475f7f1116da1b826e8c6c67ef3284942313 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/CMakeLists.txt
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/CMakeLists.txt
@@ -23,17 +23,13 @@ add_openpass_target(
     observation_LogGlobal.h
     observation_log.h
     observation_logImplementation.h
-    runStatistic.h
-    runStatisticCalculation.h
-    temporaryFilePathGenerator.h
+    temporaryFileGenerator.h
 
   SOURCES
     observationCyclics.cpp
     observationFileHandler.cpp
     observation_log.cpp
     observation_logImplementation.cpp
-    runStatistic.cpp
-    runStatisticCalculation.cpp
 
   LIBRARIES
     Iconv::Iconv
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/observationCyclics.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/observationCyclics.h
index b50efb020adccd987298955a9deb2a2564adb21f..d5a577bd571a1a5b1e551f2fadf9720f9ac6c278 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/observationCyclics.h
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/observationCyclics.h
@@ -17,7 +17,6 @@
 #include <map>
 #include <set>
 #include <string>
-#include <cstdint>
 #include <vector>
 
 /**
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/observationFileHandler.cpp b/sim/src/core/opSimulation/modules/Observation_LogAgent/observationFileHandler.cpp
index 4feb567161e962975f472e728d0f725157043690..e17004c7a050a7c054604d3cdb8260fc4bf3e6ef 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/observationFileHandler.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/observationFileHandler.cpp
@@ -36,8 +36,7 @@
 #include "include/dataBufferInterface.h"
 #include "opSimulation/modules/Observation_LogAgent/observationCyclics.h"
 #include "opSimulation/modules/Observation_LogAgent/observationLogConstants.h"
-#include "opSimulation/modules/Observation_LogAgent/runStatistic.h"
-#include "temporaryFilePathGenerator.h"
+#include "temporaryFileGenerator.h"
 
 class RunResultInterface;
 
@@ -59,15 +58,20 @@ void ObservationFileHandler::WriteStartOfFile(const std::string& frameworkVersio
                              + "\" does not exist");
   }
 
+  if (fs::exists(finalPath))
+  {
+    fs::remove(finalPath);
+  }
+
   std::string filePath = folder.string() + "/" + "simulationOutput";
-  TemporaryFilePathGenerator filePathCreator(filePath);
-  tmpFilePath = filePathCreator.CreateTemporaryFilePath();
+  TemporaryFileGenerator fileCreator(filePath);
+  tmpFilePath = folder / fileCreator.CreateTemporaryFile();
   xmlFile.open(tmpFilePath.string());
 
   if (!xmlFile.is_open())
   {
     std::stringstream stream;
-    stream << COMPONENTNAME << ": could not create file: " << tmpFilePath.string();
+    stream << COMPONENTNAME << ": Unable to create temporary output file: " << tmpFilePath.filename().string();
     throw std::runtime_error(stream.str());
   }
 
@@ -90,7 +94,7 @@ void ObservationFileHandler::WriteStartOfFile(const std::string& frameworkVersio
 }
 
 void ObservationFileHandler::WriteRun([[maybe_unused]] const RunResultInterface& runResult,
-                                      RunStatistic runStatistic,
+                                      std::uint32_t randomSeed,
                                       ObservationCyclics& cyclics,
                                       Events& events)
 {
@@ -101,14 +105,8 @@ void ObservationFileHandler::WriteRun([[maybe_unused]] const RunResultInterface&
   // init new run result
   xmlTextWriterStartElement(xmlFileStream, toXmlChar(outputTags.RUNRESULT));
   xmlTextWriterWriteAttribute(xmlFileStream, toXmlChar(outputAttributes.RUNID), toXmlChar(std::to_string(runNumber)));
-
-  // write RunStatisticsTag
-  xmlTextWriterStartElement(xmlFileStream, toXmlChar(outputTags.RUNSTATISTICS));
-
-  runStatistic.WriteStatistics(xmlFileStream);
-
-  // close RunStatisticsTag
-  xmlTextWriterEndElement(xmlFileStream);
+  xmlTextWriterWriteAttribute(
+      xmlFileStream, toXmlChar(outputAttributes.RANDOMSEED), toXmlChar(std::to_string(randomSeed)));
 
   AddEvents(events);
   AddAgents();
@@ -162,10 +160,7 @@ void ObservationFileHandler::WriteEndOfFile()
   xmlFile.close();
 
   // finalize results
-  if (fs::exists(tmpFilePath) && !fs::exists(finalPath))
-  {
-    fs::rename(tmpFilePath, finalPath);
-  }
+  fs::rename(tmpFilePath, finalPath);
 }
 
 void ObservationFileHandler::AddEvents(Events& events)
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/observationFileHandler.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/observationFileHandler.h
index b2dddd3f310e8eff346184dec96e94ab6e83afa8..afa3ed1140fde2e2d545ac5c6bce8d0b84322b31 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/observationFileHandler.h
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/observationFileHandler.h
@@ -25,7 +25,6 @@
 #include "common/sensorDefinitions.h"
 #include "include/dataBufferInterface.h"
 #include "observationLogConstants.h"
-#include "runStatistic.h"
 
 class ObservationCyclics;
 class RunResultInterface;
@@ -100,12 +99,12 @@ public:
    * \brief This function gets called after each run and writes all information about this run into the output file
    *
    * \param runResult
-   * \param runStatistic
+   * \param randomSeed
    * \param cyclics
    * \param events
    */
   void WriteRun([[maybe_unused]] const RunResultInterface& runResult,
-                RunStatistic runStatistic,
+                std::uint32_t randomSeed,
                 ObservationCyclics& cyclics,
                 Events& events);
 
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/observationLogConstants.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/observationLogConstants.h
index 99e3d64b9ec1e4056927e37d35705919c126ce94..77f84987444c73f787029ad62022a2ea804e3bb4 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/observationLogConstants.h
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/observationLogConstants.h
@@ -17,6 +17,7 @@ struct OutputAttributes
   static constexpr const char* FRAMEWORKVERSION{"FrameworkVersion"};
   static constexpr const char* SCHEMAVERSION{"SchemaVersion"};
   static constexpr const char* RUNID{"RunId"};
+  static constexpr const char* RANDOMSEED{"RandomSeed"};
   static constexpr const char* FAILUREPROBABITLITY{"FailureProbability"};
   static constexpr const char* LATENCY{"Latency"};
   static constexpr const char* OPENINGANGLEH{"OpeningAngleH"};
@@ -49,7 +50,6 @@ struct OutputTags
 {
   static constexpr const char* RUNRESULTS{"RunResults"};
   static constexpr const char* RUNRESULT{"RunResult"};
-  static constexpr const char* RUNSTATISTICS{"RunStatistics"};
   static constexpr const char* SIMULATIONOUTPUT{"SimulationOutput"};
   static constexpr const char* EVENTS{"Events"};
   static constexpr const char* EVENT{"Event"};
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_log.cpp b/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_log.cpp
index 37e1617309696f43e948e90653a9fc5758b81018..d9ea94aa317969009dc2a342c0296f218b55cbff 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_log.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_log.cpp
@@ -98,75 +98,6 @@ extern "C" OBSERVATION_LOGAGENT_SHARED_EXPORT void OpenPASS_DestroyInstance(Obse
   delete implementation;  // NOLINT(cppcoreguidelines-owning-memory)
 }
 
-//! dll-function to call an instance of the module in opSimulationManager before each simulation run starts
-//!
-//! @param[in]     implementation    The instance of the module
-//! @return  returns true if the instance is invoked, false otherwise
-extern "C" OBSERVATION_LOGAGENT_SHARED_EXPORT bool OpenPASS_OpSimulationManagerPreHook(
-    ObservationInterface* implementation)
-{
-  try
-  {
-    implementation->OpSimulationManagerPreHook();
-  }
-  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;
-}
-
-/**
- * dll-function to call an instance of the module in opSimulationManager after each simulation run ends
- *
- * @param[in]     implementation    The instance that should be called
- * @param[in]     filename          Name of file containing the simulation run results from the simulation
- * @return  returns true if the instance is invoked, false otherwise
- */
-extern "C" OBSERVATION_LOGAGENT_SHARED_EXPORT bool OpenPASS_OpSimulationManagerPostHook(
-    ObservationInterface* implementation, const std::string& filename)
-{
-  try
-  {
-    implementation->OpSimulationManagerPostHook(filename);
-  }
-  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;
-}
-
 /**
  * dll-function called by framework in simulation before all simulation runs start
  *
@@ -344,37 +275,3 @@ extern "C" OBSERVATION_LOGAGENT_SHARED_EXPORT bool OpenPASS_OpSimulationPostHook
 
   return true;
 }
-
-/**
- * dll-function to call an instance of the module in simulation after all simulation
- * runs end to transfer the observation module results to the opSimulationManager.
- *
- * @param[in]       implementation  The instance that should be called
- * @return  File to be transferred
- */
-extern "C" OBSERVATION_LOGAGENT_SHARED_EXPORT const std::string OpenPASS_OpSimulationResultFile(
-    ObservationInterface* implementation)
-{
-  try
-  {
-    return implementation->OpSimulationResultFile();
-  }
-  catch (const std::runtime_error& ex)
-  {
-    if (Callbacks != nullptr)
-    {
-      Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, ex.what());
-    }
-
-    return "";
-  }
-  catch (...)
-  {
-    if (Callbacks != nullptr)
-    {
-      Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "unexpected exception");
-    }
-
-    return "";
-  }
-}
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_logImplementation.cpp b/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_logImplementation.cpp
index 766ffa804c0d05297f317ee2e4dcc88ede4f88ef..9f4f1fdd8bd88e4b31ae9662bf6aa147f9241ccf 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_logImplementation.cpp
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_logImplementation.cpp
@@ -1,7 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2020 ITK Engineering GmbH
  *               2017-2021 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 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
@@ -41,8 +41,6 @@
 #include "include/worldInterface.h"
 #include "observationCyclics.h"
 #include "opSimulation/modules/Observation_LogAgent/observationFileHandler.h"
-#include "runStatistic.h"
-#include "runStatisticCalculation.h"
 
 class RunResultInterface;
 
@@ -131,29 +129,10 @@ void ObservationLogImplementation::OpSimulationPreHook()
 
 void ObservationLogImplementation::OpSimulationPreRunHook()
 {
-  runStatistic = RunStatistic(GetStochastics()->GetRandomSeed());
   cyclics.Clear();
   events.clear();
 }
 
-void GetAgentValues(const std::string& key,
-                    const DataBufferReadInterface* dataBuffer,
-                    std::map<std::string, double>& result)
-{
-  const auto agentIds = dataBuffer->GetKeys("Statics/Agents");
-
-  for (const auto& agentId : agentIds)
-  {
-    const auto tdtResult = dataBuffer->GetCyclic(std::stoi(agentId), key);
-    if (tdtResult->size() == 0)
-    {
-      continue;
-    }
-    const auto& cyclicRow = tdtResult->begin()->get();
-    result[agentId] = std::get<double>(cyclicRow.value);
-  }
-}
-
 void ObservationLogImplementation::OpSimulationUpdateHook(int time, [[maybe_unused]] RunResultInterface& runResult)
 {
   const auto dsCyclics = dataBuffer->GetCyclic(std::nullopt, "*");
@@ -185,24 +164,17 @@ void ObservationLogImplementation::OpSimulationUpdateHook(int time, [[maybe_unus
                dsCyclic.value);
   }
 
-  GetAgentValues("TotalDistanceTraveled", dataBuffer, runStatistic.distanceTraveled);
-
   const auto acyclics = dataBuffer->GetAcyclic(std::nullopt, "*");
 
   for (const AcyclicRow& event : *acyclics)
   {
     events.emplace_back(time, event);
   }
-
-  runStatistic.AddStopReason(time, RunStatistic::StopReason::DueToTimeOut);
 }
 
 void ObservationLogImplementation::OpSimulationPostRunHook(const RunResultInterface& runResult)
 {
-  RunStatisticCalculation::DetermineEgoCollision(runStatistic, runResult, GetWorld());
-  runStatistic.VisibilityDistance = GetWorld()->GetVisibilityDistance();
-
-  fileHandler.WriteRun(runResult, runStatistic, cyclics, events);
+  fileHandler.WriteRun(runResult, GetStochastics()->GetRandomSeed(), cyclics, events);
 }
 
 void ObservationLogImplementation::OpSimulationPostHook()
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_logImplementation.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_logImplementation.h
index 5b6c0ef316c9ad8914cb18dbf7b32eb3392c0e33..13e84850c6999b137eb73ad2ed781141ea0cce4f 100644
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_logImplementation.h
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/observation_logImplementation.h
@@ -1,7 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2020 ITK Engineering GmbH
  *               2017-2021 in-tech GmbH
- *               2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG
+ *               2024 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,7 +28,6 @@
 #include "include/observationInterface.h"
 #include "observationCyclics.h"
 #include "observationFileHandler.h"
-#include "runStatistic.h"
 
 class CallbackInterface;
 class DataBufferReadInterface;
@@ -82,19 +81,14 @@ public:
   void OpSimulationPreRunHook() override;
   void OpSimulationPostRunHook(const RunResultInterface& runResult) override;
   void OpSimulationUpdateHook(int, RunResultInterface&) override;
-  void OpSimulationManagerPreHook() override {}
-  void OpSimulationManagerPostHook(const std::string&) override {}
   void OpSimulationPostHook() override;
 
-  const std::string OpSimulationResultFile() override { return ""; }
-
 private:
   const openpass::common::RuntimeInformation& runtimeInformation;
   DataBufferReadInterface* dataBuffer;
   ObservationFileHandler fileHandler;
   ObservationCyclics cyclics;
   Events events;
-  RunStatistic runStatistic = RunStatistic(-1);
   std::vector<std::string> selectedColumns;
   std::vector<std::pair<std::string, std::string>> selectedRegexColumns;
 };
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.cpp b/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.cpp
deleted file mode 100644
index accd0446af97908bb14d60c9c9c2d462b9f69884..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2016-2020 ITK Engineering GmbH
- *               2023-2024 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  runStatistic.cpp */
-//-----------------------------------------------------------------------------
-
-#include "runStatistic.h"
-
-#include <libxml/xmlwriter.h>
-
-#include "common/xmlParser.h"
-
-using namespace SimulationCommon;
-
-RunStatistic::RunStatistic(std::uint32_t randomSeed) : _randomSeed(randomSeed) {}
-
-void RunStatistic::AddStopReason(int time, StopReason reason)
-{
-  _stopReasonIdx = static_cast<int>(reason);
-  StopTime = time;
-}
-
-// ----------------------------- writing out --------------------- //
-void RunStatistic::WriteStatistics(xmlTextWriterPtr fileStream)
-{
-  xmlTextWriterStartElement(fileStream, toXmlChar("RandomSeed"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(_randomSeed)));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("VisibilityDistance"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(VisibilityDistance.value())));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("StopReason"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::string(StopReasonsStrings.at(_stopReasonIdx))));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("StopTime"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(StopTime)));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("EgoAccident"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(BoolToString(EgoCollision)));
-  xmlTextWriterEndElement(fileStream);
-
-  double totalDistanceTraveled = 0;
-  for (const auto& [agent, distance] : distanceTraveled)
-  {
-    totalDistanceTraveled += distance;
-  }
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("TotalDistanceTraveled"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(totalDistanceTraveled)));
-  xmlTextWriterEndElement(fileStream);
-
-  xmlTextWriterStartElement(fileStream, toXmlChar("EgoDistanceTraveled"));
-  xmlTextWriterWriteString(fileStream, toXmlChar(std::to_string(distanceTraveled.at("0"))));
-  xmlTextWriterEndElement(fileStream);
-}
-
-std::string RunStatistic::BoolToString(bool b)
-{
-  return b ? "True" : "False";
-}
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.h
deleted file mode 100644
index d734a33d392ee9666ac63e31cac1f0f7452abd35..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatistic.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2016-2020 ITK Engineering GmbH
- *               2017-2021 in-tech GmbH
- *               2023-2024 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 <array>
-#include <libxml/xmlwriter.h>
-#include <map>
-#include <stdint.h>
-#include <string>
-#include <units.h>
-#include <vector>
-
-class RunStatistic
-{
-public:
-  //! Displays the reason why the simulation stopped.
-  //! Currently only due to time out.
-  enum class StopReason
-  {
-    DueToTimeOut
-  };
-
-  //! RunStatistic constructor
-  //!
-  //! @param[in] randomSeed   Random seed used for this invocation
-  RunStatistic(std::uint32_t randomSeed);
-
-  //! Adds the reason why the simulation stopped
-  //!
-  //! @param[in] time     Stop time
-  //! @param[in] reason   Reason why the simulation stopped
-  void AddStopReason(int time, StopReason reason);
-
-  //! Writes the RunStatistic information into xml file
-  //!
-  //! @param[in] fileStream   Stream which writes into xml file
-  void WriteStatistics(xmlTextWriterPtr 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
-  units::length::meter_t VisibilityDistance{
-      -999.0};  //!< Visibility distance of world in current run (defined in simulationConfig.xml)
-
-  //! Convert boolean to string
-  //!
-  //! @param[in] b    Boolean to convert
-  //! @return Boolean as string
-  static std::string BoolToString(bool b);
-
-  ~RunStatistic() = default;
-
-private:
-  std::uint32_t _randomSeed;
-  std::vector<int> _followerIds;
-
-  static constexpr std::array<const char*, 1> StopReasonsStrings{"Due to time out"};
-  int _stopReasonIdx = static_cast<int>(StopReason::DueToTimeOut);
-};  // class RunStatistic
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatisticCalculation.cpp b/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatisticCalculation.cpp
deleted file mode 100644
index 456e022e6e5b174ac7ebca95b00a9f8834bb8433..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatisticCalculation.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *               2020 ITK Engineering GmbH
- *               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 "runStatisticCalculation.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "include/agentInterface.h"
-#include "include/runResultInterface.h"
-#include "include/worldInterface.h"
-#include "opSimulation/modules/Observation_LogAgent/runStatistic.h"
-
-void RunStatisticCalculation::DetermineEgoCollision(RunStatistic& runStatistic,
-                                                    const RunResultInterface& runResult,
-                                                    WorldInterface* world)
-{
-  auto* egoAgent = world->GetEgoAgent();
-
-  if (!egoAgent)
-  {
-    return;
-  }
-
-  const int egoId = egoAgent->GetId();
-  const auto* collisionsIds = runResult.GetCollisionIds();
-
-  if (std::find(collisionsIds->cbegin(), collisionsIds->cend(), egoId) != collisionsIds->cend())
-  {
-    runStatistic.EgoCollision = true;
-  }
-}
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatisticCalculation.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatisticCalculation.h
deleted file mode 100644
index edc9efdb87a5218d455a5f1634180d179d385f13..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/runStatisticCalculation.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 ITK Engineering GmbH
- *               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
-
-class WorldInterface;
-class RunResultInterface;
-class RunStatistic;
-
-/*!
- * \brief The RunStatisticCalculation class provides helper functions for run statistic analysis
- */
-class RunStatisticCalculation
-{
-public:
-  /*!
-   * \brief Determines whether the ego had a collision and sets the related flag in the RunStatistic
-   *
-   * \param[out] runStatistic      Result is stored here
-   * \param[in]  runResult         Structure to retrieve collisions from
-   * \param[in]  world             Pointer to the world
-   */
-  static void DetermineEgoCollision(RunStatistic& runStatistic,
-                                    const RunResultInterface& runResult,
-                                    WorldInterface* world);
-};
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/temporaryFileGenerator.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/temporaryFileGenerator.h
new file mode 100644
index 0000000000000000000000000000000000000000..43f7327c6ffaebdec2fa2d242b7ad86a7c8e8311
--- /dev/null
+++ b/sim/src/core/opSimulation/modules/Observation_LogAgent/temporaryFileGenerator.h
@@ -0,0 +1,57 @@
+/********************************************************************************
+ * Copyright (c) 2023-2024 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 <filesystem>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <string>
+#include <utility>
+
+namespace fs = std::filesystem;
+
+//! @class TemporaryFileGenerator
+//! @brief A class for generating temporary files with unique names.
+class TemporaryFileGenerator
+{
+public:
+  //! @brief Constructor for TemporaryFileGenerator.
+  //! @param filePath The base path for generating temporary file names.
+  explicit TemporaryFileGenerator(fs::path filePath) : filePath(std::move(filePath)) {}
+
+  ~TemporaryFileGenerator() = default;
+
+  //! @brief Create a unique temporary file.
+  //!
+  //! If the provided file path exists, this method generates a new file name by appending
+  //! a 6-digit number to the original file name.
+  //!
+  //! @return The generated unique temporary file.
+  fs::path CreateTemporaryFile()
+  {
+    int counter = 0;
+    do
+    {
+      // Generate a new filename with a 6-digit number appended
+      std::ostringstream newFilenameStream;
+      newFilenameStream << std::left << std::setw(6) << std::setfill('0') << counter % 1000000;
+      std::string newFilename = filePath.stem().string() + "_" + newFilenameStream.str() + ".tmp";
+      filePath.replace_filename(newFilename);
+      counter++;
+    } while (fs::exists(filePath));
+
+    return filePath.filename();
+  }
+
+private:
+  fs::path filePath;
+};
diff --git a/sim/src/core/opSimulation/modules/Observation_LogAgent/temporaryFilePathGenerator.h b/sim/src/core/opSimulation/modules/Observation_LogAgent/temporaryFilePathGenerator.h
deleted file mode 100644
index 50b1afd2f5b961dbe870c1649f9b67cd5b52fe7f..0000000000000000000000000000000000000000
--- a/sim/src/core/opSimulation/modules/Observation_LogAgent/temporaryFilePathGenerator.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2023 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 <filesystem>
-#include <fstream>
-#include <iomanip>
-#include <iostream>
-#include <string>
-#include <utility>
-
-namespace fs = std::filesystem;
-
-//! @class TemporaryFilePathGenerator
-//! @brief A class for generating temporary file paths with unique names.
-class TemporaryFilePathGenerator
-{
-public:
-  //! @brief Constructor for TemporaryFilePathGenerator.
-  //! @param filePath The base path for generating temporary file names.
-  explicit TemporaryFilePathGenerator(fs::path filePath) : filePath(std::move(filePath)) {}
-
-  ~TemporaryFilePathGenerator() = default;
-
-  //! @brief Create a unique temporary file path.
-  //!
-  //! If the provided file path exists, this method generates a new file name by appending
-  //! a 6-digit number to the original file name.
-  //!
-  //! @return The generated unique temporary file path.
-  fs::path CreateTemporaryFilePath()
-  {
-    if (fs::exists(filePath))
-    {
-      int counter = 0;
-      do
-      {
-        // Generate a new filename with a 6-digit number appended
-        std::ostringstream newFilenameStream;
-        newFilenameStream << std::left << std::setw(6) << std::setfill('0') << counter % 1000000;
-        std::string newFilename = filePath.stem().string() + "_" + newFilenameStream.str() + ".tmp";
-        filePath = fs::path(newFilename);
-        counter++;
-      } while (fs::exists(filePath));
-    }
-
-    return filePath;
-  }
-
-private:
-  fs::path filePath;
-};
\ No newline at end of file
diff --git a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonExport.cpp b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonExport.cpp
index dbcf154af5977f08a49ef98b807c1ca9517573a2..7d5ea872cab49ea302bac4c57e8f3757b277c7c0 100644
--- a/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonExport.cpp
+++ b/sim/src/core/opSimulation/modules/Spawners/PreRunCommon/SpawnerPreRunCommonExport.cpp
@@ -39,7 +39,7 @@ extern "C" SPAWNPOINT_SHARED_EXPORT std::unique_ptr<SpawnPointInterface> OpenPAS
   {
     return std::make_unique<SpawnerPreRunCommon>(dependencies, callbacks);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
@@ -65,7 +65,7 @@ extern "C" SPAWNPOINT_SHARED_EXPORT void OpenPASS_Trigger(SpawnPointInterface *i
   {
     implementation->Trigger(time);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.cpp b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.cpp
index a352c780f57bbcaa3082f60a87feb4e94c8639d0..75a997cb05bf586dc1299aed20589e097b8d2cd4 100644
--- a/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.cpp
+++ b/sim/src/core/opSimulation/modules/Spawners/RuntimeCommon/SpawnerRuntimeCommonExport.cpp
@@ -44,7 +44,7 @@ extern "C" SPAWNPOINT_SHARED_EXPORT std::unique_ptr<SpawnPointInterface> OpenPAS
   {
     return std::make_unique<SpawnerRuntimeCommon>(dependencies, callbacks);
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/core/opSimulation/modules/Stochastics/stochastics.cpp b/sim/src/core/opSimulation/modules/Stochastics/stochastics.cpp
index c281b1ec49f0e7f1e98bdc54bbd9e5ba9a0ad8c0..47972e137b0fc4b636017e12336410c231d18705 100644
--- a/sim/src/core/opSimulation/modules/Stochastics/stochastics.cpp
+++ b/sim/src/core/opSimulation/modules/Stochastics/stochastics.cpp
@@ -53,7 +53,7 @@ extern "C" STOCHASTICS_SHARED_EXPORT StochasticsInterface *OpenPASS_CreateInstan
   {
     return (StochasticsInterface *)(new (std::nothrow) StochasticsImplementation(callbacks));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/core/opSimulation/modules/Stochastics/stochastics_implementation.cpp b/sim/src/core/opSimulation/modules/Stochastics/stochastics_implementation.cpp
index 2c882a052b965208cae6bb8a5a104ac0ff164490..205a749a84d746dc930a870c6d7a3fe82778a351 100644
--- a/sim/src/core/opSimulation/modules/Stochastics/stochastics_implementation.cpp
+++ b/sim/src/core/opSimulation/modules/Stochastics/stochastics_implementation.cpp
@@ -16,8 +16,25 @@
 /** @file  stochastics_implementation.cpp */
 //-----------------------------------------------------------------------------
 
+#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+/// \brief prevents any long double functions from being defined or used with Boost.Math
+/// this will reduce precision slightly, but will typically improve performance on 64-bit hardware
+/// \remark make valgrind working if opimization is set by compiler flags -O2, -O3, or -Og
+/// \sa     https://svn.boost.org/trac10/ticket/10005
+#define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+#endif
+
+#ifndef BOOST_MATH_PROMOTE_DOUBLE_POLICY
+/// Don't use long double in boost math
+///
+/// From boost doc: Determines whether double types get promoted to long double internally to ensure maximum precision
+/// in the result, defaults to true, but can be set to false to turn promotion of double's off.
+#define BOOST_MATH_PROMOTE_DOUBLE_POLICY false
+#endif
+
 #include "stochastics_implementation.h"
 
+#include <boost/math/distributions/lognormal.hpp>
 #include <cmath>
 #include <stdexcept>
 
diff --git a/sim/src/core/opSimulation/modules/Stochastics/stochastics_implementation.h b/sim/src/core/opSimulation/modules/Stochastics/stochastics_implementation.h
index 6471cb83ec9597efd7e1883f0321db52e923ebff..0a408f678872094940da66a2416c6f5068cb1279 100644
--- a/sim/src/core/opSimulation/modules/Stochastics/stochastics_implementation.h
+++ b/sim/src/core/opSimulation/modules/Stochastics/stochastics_implementation.h
@@ -33,23 +33,14 @@
 
 #pragma once
 
-/// \brief prevents any long double functions from being defined or used with Boost.Math
-/// this will reduce precision slightly, but will typically improve performance on 64-bit hardware
-/// \remark make valgrind working if opimization is set by compiler flags -O2, -O3, or -Og
-/// \sa     https://svn.boost.org/trac10/ticket/10005
-#define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-#define BOOST_MATH_PROMOTE_DOUBLE_POLICY false
-
-#include <boost/math/distributions/lognormal.hpp>
+#include <cstdint>
 #include <random>
-#include <stdint.h>
 #include <string>
 #include <vector>
 
 #include "include/callbackInterface.h"
 #include "include/stochasticsInterface.h"
 
-using namespace boost::math;
 using BinomialDist = std::binomial_distribution<>;
 
 /*!
diff --git a/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.cpp b/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.cpp
index 0e2014c8678090c6b933d72b52d7b1ad79557528..cb5677b666cb86926bf5288700d98f1737fe297f 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/AgentAdapter.cpp
@@ -3,7 +3,7 @@
  *               2020 HLRS, University of Stuttgart
  *               2016 ITK Engineering GmbH
  *               2017-2020 in-tech GmbH
- *               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ *               2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  *               2023 Volkswagen AG
  *
  * This program and the accompanying materials are made available under the
@@ -53,6 +53,7 @@ void AgentAdapter::InitParameter(const AgentBuildInstructions &agentBuildInstruc
   GetBaseTrafficObject().SetZ(0.5 * vehicleModelParameters->bounding_box.dimension.height);
   GetBaseTrafficObject().SetAbsVelocity(agentBuildInstructions.spawnParameter.velocity);
   GetBaseTrafficObject().SetAbsAcceleration(agentBuildInstructions.spawnParameter.acceleration);
+  GetBaseTrafficObject().SetIndicatorState(agentBuildInstructions.spawnParameter.indicatorState);
   this->currentGear = static_cast<int>(agentBuildInstructions.spawnParameter.gear);
 
   SetSensorParameters(agentBuildInstructions.system.sensorParameters);
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 3f0b8edf5c97518f3bedbff50b24a6ecb3b03397..11c681561e5891f9074ee5d8c069ea7de1af1fba 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/OWL/MovingObject.cpp
@@ -636,7 +636,7 @@ void OWL::Implementation::MovingObject::SetWheelRotationRate(const int axleIndex
                          osiObject->mutable_vehicle_attributes()->mutable_wheel_data()->end(),
                          [axleIndex, wheelIndex](const osi3::MovingObject_VehicleAttributes_WheelData &wheel)
                          { return wheel.axle() == axleIndex && wheel.index() == wheelIndex; });
-  if (it != osiObject->vehicle_attributes().wheel_data().end())
+  if (it != osiObject->mutable_vehicle_attributes()->mutable_wheel_data()->end())
   {
     it->set_rotation_rate(rotationRate.value());
   }
diff --git a/sim/src/core/opSimulation/modules/World_OSI/World.cpp b/sim/src/core/opSimulation/modules/World_OSI/World.cpp
index 6fc2bf05c76e3bedd4b36a76abfd4d7f3f7514dd..fc5738e8bdedf49338006c3330c202776c11a024 100644
--- a/sim/src/core/opSimulation/modules/World_OSI/World.cpp
+++ b/sim/src/core/opSimulation/modules/World_OSI/World.cpp
@@ -69,7 +69,7 @@ extern "C" WORLD_SHARED_EXPORT WorldInterface *OpenPASS_CreateInstance(
     return (WorldInterface *)(new (std::nothrow)
                                   WorldImplementation(callbacks, dataBuffer, idManager, *worldData_.get()));
   }
-  catch (const std::runtime_error &ex)
+  catch (const std::exception &ex)
   {
     if (Callbacks != nullptr)
     {
diff --git a/sim/src/core/opSimulation/opSimulation.h b/sim/src/core/opSimulation/opSimulation.h
index c9a64ee2f0835313e13f982ef2c1c66e3877bbf5..4b5bcb686e48739cec76649e7f5788647caa504d 100644
--- a/sim/src/core/opSimulation/opSimulation.h
+++ b/sim/src/core/opSimulation/opSimulation.h
@@ -1,6 +1,7 @@
 /********************************************************************************
  * Copyright (c) 2017-2018 ITK Engineering GmbH
  *               2017-2019 in-tech GmbH
+ *               2024 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
@@ -17,8 +18,7 @@
 * the simulation process.
 *
 
-* It is started by a opSimulationManager module with or without arguments. Following this
-* the simulation reads all configuration files and sets up the program parameters and the
+* The simulation reads all configuration files and sets up the program parameters and the
 * framework infrastructure.
 * After that the simulation starts and stores its results in a prespecified file.
 *
diff --git a/sim/src/core/opsimulationmanager/CMakeLists.txt b/sim/src/core/opsimulationmanager/CMakeLists.txt
deleted file mode 100644
index 53359d5b26f385fe6ba29d964e89ffc4194d8aeb..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/CMakeLists.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-################################################################################
-# Copyright (c) 2020-2023 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 opSimulationManager)
-
-set(CMAKE_AUTOMOC ON)
-
-add_compile_definitions(SimulationCore_EXPORTS)
-
-add_openpass_target(
-  NAME ${COMPONENT_NAME} TYPE executable COMPONENT bin
-
-  HEADERS
-    framework/processManager.h
-    framework/config.h
-    framework/simulationConfig.h
-    importer/configImporter.h
-    opSimulationManager.h
-    ../common/log.h
-
-  SOURCES
-    framework/main.cpp
-    framework/processManager.cpp
-    importer/configImporter.cpp
-    ../common/log.cpp
-
-  INCDIRS
-    framework
-    importer
-    ../../../..
-
-  LIBRARIES
-    Qt5::Concurrent
-    Qt5::Core
-    Qt5::Widgets
-    Qt5::Xml
-    CoreCommon
-    MantleAPI::MantleAPI
-
-)
-
-set_target_properties(${COMPONENT_NAME} PROPERTIES FOLDER "core")
diff --git a/sim/src/core/opsimulationmanager/framework/config.h b/sim/src/core/opsimulationmanager/framework/config.h
deleted file mode 100644
index e4be2735d84585ccbfc257500851715fcc3f3412..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/framework/config.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2018 ITK Engineering GmbH
- *               2019 in-tech GmbH
- *               2023 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  config.h
-//! @brief This file contains the representation of opSimulationManager
-//!        configuration.
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <optional>
-#include <string>
-#include <vector>
-
-namespace SimulationManager
-{
-namespace Configuration
-{
-
-class SimulationConfig;
-using SimulationConfigs
-    = std::vector<SimulationConfig>;  ///< Simulation configurations as the list of simulation config
-
-///
-/// \brief Used as value storage of parsed configuration parameters
-///
-struct Config
-{
-public:
-  /// @brief Configuration parameters constructor
-  /// @param logLevel                     Level of the log
-  /// @param logFileOpSimulationManager   Openpass log file simulation manager
-  /// @param simulation                   TODO
-  /// @param libraries
-  /// @param simulationConfigs
-  Config(std::optional<int> logLevel,
-         std::optional<std::string> logFileOpSimulationManager,
-         std::optional<std::string> simulation,
-         std::optional<std::string> libraries,
-         SimulationConfigs simulationConfigs)
-      : logLevel{CheckOrDefault(logLevel.value_or(defaultLogLevel))},
-        logFileOpSimulationManager{logFileOpSimulationManager.value_or(defaultLogFileOpSimulationManager)},
-        simulation{simulation.value_or(defaultSimulation)},
-        libraries{libraries.value_or(defaultLibraries)},
-        simulationConfigs{simulationConfigs}
-  {
-  }
-
-  Config()
-      : logLevel{defaultLogLevel},
-        logFileOpSimulationManager{defaultLogFileOpSimulationManager},
-        simulation{defaultSimulation},
-        libraries{defaultLibraries},
-        simulationConfigs{}
-  {
-  }
-
-  const int logLevel;                            ///< TODO
-  const std::string logFileOpSimulationManager;  ///< TODO
-  const std::string simulation;                  ///< TODO
-  const std::string libraries;                   ///< TODO
-  const SimulationConfigs simulationConfigs;     ///< TODO
-
-private:
-  static constexpr int defaultLogLevel = 0;
-  static constexpr const char* defaultLogFileOpSimulationManager{"opSimulationManager.log"};
-  static constexpr const char* defaultSimulation{"opSimulation"};
-  static constexpr const char* defaultLibraries{"lib"};
-
-  //-------------------------------------------------------------------------
-  //! \brief Checks if the passed value is in between the minimum and maximum
-  //!  	   log level boundaries.
-  //! \param[in] logLevel Value to be checked.
-  //! \returns logLevel if passed, defaultLogLevel if not
-  //-------------------------------------------------------------------------
-  static int CheckOrDefault(int logLevel) { return (logLevel >= 0 && logLevel <= 5) ? logLevel : defaultLogLevel; }
-};
-
-}  // namespace Configuration
-}  // namespace SimulationManager
diff --git a/sim/src/core/opsimulationmanager/framework/main.cpp b/sim/src/core/opsimulationmanager/framework/main.cpp
deleted file mode 100644
index a3ad9396ed2c8de615e1d201721e037ce8c5fa3f..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/framework/main.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
- *               2020 HLRS, University of Stuttgart
- *               2016-2019 ITK Engineering GmbH
- *               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  main.cpp
-//! @brief This file contains the main entry point.
-//!
-//! The main module handles the initialization and starts the simulation.
-//!
-//! @mainpage openPASS
-//!
-//! @section intro_sec Introduction
-//!
-//! opSimulationManager component
-//! This program component represent opSimulationManager node of the pre-crash
-//! simulation tool.
-
-#include <iostream>
-#include <stdexcept>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <qcommandlineoption.h>
-#include <qcommandlineparser.h>
-#include <qcoreapplication.h>
-#include <qdir.h>
-#include <qstring.h>
-#include <qstringlist.h>
-
-#include "../importer/configImporter.h"
-#include "common/log.h"
-#include "config.h"
-#include "processManager.h"
-#include "simulationConfig.h"
-
-using namespace SimulationManager;
-
-//! Stores command line arguments
-using Arguments = std::vector<std::pair<std::string, std::string>>;
-
-//! \brief Parses command line arguments for the opSimulationManager config file.
-//! \param[in] arguments The list of command line arguments to parse.
-//! \returns The supplied opSimulationManager config file name.
-static QString ParseArguments(const QStringList& arguments);
-
-//! \brief Creates the directories necessary to make the resultPath valid, if
-//! 	   they don't currently exist.
-//! \param[in] resultPath A string representing the desired path to results.
-static void CreateResultPathIfNecessary(const std::string& resultPath);
-
-//! \brief Initializes application logging.
-//! \param[in] logPath The path identifying where to write the logs.
-//! \param[in] logLevel The log reporting level.
-//! \returns a std::string representing the path to the log file
-std::string InitLogging(const std::string& logPath, int logLevel);
-
-//! \brief Parses opSimulationManager configuration file for opSimulationManager configuration
-//! 	   details.
-//! 	   Throws if the configuration import fails.
-//! \param[in] opSimulationManagerConfigFile The file containing the configuration details.
-//! \returns A Configuration::Config object containing opSimulationManager
-//! 	     configuration details.
-Configuration::Config ParseConfig(const QString& opSimulationManagerConfigFile);
-
-#ifndef USESIMULATIONLIBRARY
-//! \brief Retrieve the name of the simulations executable
-//! \param simulation name of the simulation
-//! \return path to the executable
-std::string GetExecutable(std::string simulation);
-#else
-typedef int (*SimulationRunFunction)(int argc, char* argv[]);
-
-//! \brief Retrieve the run function of the simulation
-//! \param simulation name of the simulation
-SimulationRunFunction GetExecutable(std::string simulation);
-#endif  // USESIMULATIONLIBRARY
-
-#ifndef OPENPASSOPSIMULATIONMANAGERLIBRARY
-//! \brief Main entry point called by main
-//! \param[in] argc		argument counter
-//! \param[in] argv[]   argument vector
-//! \return 0 on success
-int run(int argc, char* argv[])  // NOLINT(cppcoreguidelines-avoid-c-arrays, modernize-avoid-c-arrays)
-#else
-//! \brief Main entry point, called by external program
-//! \param[in] argc		argument counter
-//! \param[in] argv[]   argument vector
-//! \return 0 on success
-extern "C" Q_DECL_EXPORT int run(int argc, char* argv[])
-#endif  //OPENPASSOPSIMULATIONMANAGERLIBRARY
-{
-  QCoreApplication app(argc, argv);
-  QString opSimulationManagerConfigFile = ParseArguments(app.arguments());
-
-  auto opSimulationManagerConfig = ParseConfig(opSimulationManagerConfigFile);
-  auto logFile = InitLogging(opSimulationManagerConfig.logFileOpSimulationManager, opSimulationManagerConfig.logLevel);
-  auto simulation = GetExecutable(opSimulationManagerConfig.simulation);
-
-  LOG_INTERN(LogLevel::DebugCore) << "\n\n## opSimulationManager start ##";
-  LOG_INTERN(LogLevel::DebugCore) << "log level: " << opSimulationManagerConfig.logLevel;
-  LOG_INTERN(LogLevel::DebugCore) << "log file opSimulationManager: " << logFile;
-  LOG_INTERN(LogLevel::DebugCore) << "simulation: " << simulation;
-  LOG_INTERN(LogLevel::DebugCore) << "libraries: " << opSimulationManagerConfig.libraries;
-  LOG_INTERN(LogLevel::DebugCore) << "number of simulations: " << opSimulationManagerConfig.simulationConfigs.size();
-
-  for (const auto& simulationConfig : opSimulationManagerConfig.simulationConfigs)
-  {
-    CreateResultPathIfNecessary(simulationConfig.results);
-
-    Arguments arguments{{"--logLevel", std::to_string(opSimulationManagerConfig.logLevel)},
-                        {"--logFile", simulationConfig.logFile},
-                        {"--lib", opSimulationManagerConfig.libraries},
-                        {"--configs", simulationConfig.configs},
-                        {"--results", simulationConfig.results}};
-
-#ifndef USESIMULATIONLIBRARY
-
-    if (ProcessManager::getInstance().StartProcess(simulation, arguments))
-    {
-      std::stringstream strStream;
-      for (const auto& [command, value] : arguments)
-      {
-        strStream << command << " " << value << "\n";
-      }
-      LOG_INTERN(LogLevel::Info) << simulation << " started with \n" << strStream.str() << std::endl;
-    }
-    else
-    {
-      LOG_INTERN(LogLevel::Error) << simulation << " not started, check path.";
-      exit(EXIT_FAILURE);
-    }
-  }
-  ProcessManager::getInstance().WaitAndClear();
-
-#else
-    QtConcurrent::run(
-        [arguments, &argv, &simulation]
-        {
-          int i = 0;
-          char* argumentsValue[arguments.size() + 1];
-          argumentsValue[i++] = argv[0];
-
-          for (QString value : arguments)
-          {
-            argumentsValue[i] = new char[value.toLocal8Bit().size()];
-            strcpy(argumentsValue[i], value.toLocal8Bit().constData());
-            i++;
-          }
-          simulation(i, argumentsValue);
-        });
-  }
-  QThreadPool::globalInstance()->waitForDone();
-#endif  // USESIMULATIONLIBRARY
-
-  LOG_INTERN(LogLevel::DebugCore) << "## opSimulationManager finished ##";
-  return 0;
-}
-
-std::string InitLogging(const std::string& logPath, int logLevel)
-{
-  QDir baseDir = QCoreApplication::applicationDirPath();
-  QString logFile = baseDir.absoluteFilePath(QString::fromStdString(logPath));
-  logFile = baseDir.cleanPath(logFile);
-
-  LogOutputPolicy::SetFile(logFile.toStdString());
-  LogFile::ReportingLevel() = static_cast<LogLevel>(logLevel);
-  return logFile.toStdString();
-}
-
-QString ParseArguments(const QStringList& arguments)
-{
-  QCommandLineParser commandLineParser;
-  commandLineParser.addHelpOption();
-
-  QCommandLineOption optionConfigFile(QStringList() << "c"
-                                                    << "config",
-                                      "configuration <opSimulationManager.xml>",
-                                      "opSimulationManager",
-                                      QCoreApplication::applicationDirPath() + "/opSimulationManager.xml");
-
-  commandLineParser.addOption(optionConfigFile);
-  commandLineParser.process(arguments);
-
-  return commandLineParser.value(optionConfigFile);
-}
-
-void CreateResultPathIfNecessary(const std::string& resultPath)
-{
-  auto qResultPath = QString::fromStdString(resultPath);
-  if (!QDir(qResultPath).exists())
-  {
-    LOG_INTERN(LogLevel::DebugCore) << "created result folder " << resultPath;
-    QDir().mkpath(qResultPath);
-  }
-}
-
-Configuration::Config ParseConfig(const QString& opSimulationManagerConfigFile)
-{
-  try
-  {
-    return Configuration::ConfigImporter::Import(opSimulationManagerConfigFile);
-  }
-  catch (const std::runtime_error& e)
-  {
-    std::cerr << "Configuration related error: " << e.what() << std::endl;
-    exit(EXIT_FAILURE);
-  }
-}
-
-#ifndef USESIMULATIONLIBRARY
-std::string GetExecutable(std::string simulation)
-{
-#ifndef USESIMULATIONLIBRARY
-
-#if WIN32
-  if (QString::fromStdString(simulation).split(".").last() != "exe")
-  {
-    simulation += DEBUG_POSTFIX ".exe";
-  }
-#endif
-
-#endif  // USESIMULATIONLIBRARY
-  return simulation;
-}
-#else
-SimulationRunFunction GetExecutable(std::string simulation)
-{
-  QLibrary simulationLib(QString::fromStdString(simulation));
-  if (!simulationLib.load())
-  {
-    LOG_INTERN(LogLevel::Error) << " failed to load library " << simulation << " "
-                                << simulationLib.errorString().toStdString();
-    exit(EXIT_FAILURE);
-  }
-
-  SimulationRunFunction SimulationRunFunc = (SimulationRunFunction)simulationLib.resolve("run");
-
-  if (!SimulationRunFunc)
-  {
-    LOG_INTERN(LogLevel::Error) << " unable to resolve run function in library " << simulation;
-    exit(EXIT_FAILURE);
-  }
-
-  return SimulationRunFunc;
-}
-#endif  // USESIMULATIONLIBRARY
-
-#ifndef OPENPASSOPSIMULATIONMANAGERLIBRARY
-/// Entry point for the simulation manager
-///
-/// @param argc argument counter
-/// @param argv argument vector
-/// @return 0 on success
-int main(int argc, char* argv[])
-{
-  return run(argc, argv);
-}
-#endif  //OPENPASSOPSIMULATIONMANAGERLIBRARY
diff --git a/sim/src/core/opsimulationmanager/framework/processManager.cpp b/sim/src/core/opsimulationmanager/framework/processManager.cpp
deleted file mode 100644
index b68a57c41a47e72bbbcd098c63c2c8e5bda0d33a..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/framework/processManager.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2018 ITK Engineering GmbH
- *               2019 in-tech GmbH
- *               2023-2024 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 "processManager.h"
-
-#include <ostream>
-
-#include <QtGlobal>
-#include <qprocess.h>
-#include <qstringlist.h>
-#include <qthread.h>
-
-#include "common/log.h"
-
-ProcessManager::ProcessManager(QObject* parent) : QObject(parent), idealProcessCount(QThread::idealThreadCount()) {}
-
-void ProcessManager::RemoveProcess(QProcess* process)
-{
-  processMap.remove(process);
-  delete process;  // NOLINT(cppcoreguidelines-owning-memory)
-}
-
-ProcessManager& ProcessManager::getInstance()
-{
-  static ProcessManager instance;
-  return instance;
-}
-
-bool ProcessManager::StartProcess(const std::string& processPath,
-                                  const std::vector<std::pair<std::string, std::string>>& arguments)
-{
-  auto qProcessPath = QString::fromStdString(processPath);
-
-  QStringList qArguments;
-  for (const std::pair<std::string, std::string>& argument : arguments)
-  {
-    qArguments << QString::fromStdString(argument.first) << QString::fromStdString(argument.second);
-  }
-
-  while (processMap.size() > idealProcessCount)
-  {
-    processMap.begin().key()->waitForFinished(1);
-  }
-
-  auto* newProcess = new QProcess();  // NOLINT(cppcoreguidelines-owning-memory)
-  newProcess->start(qProcessPath, qArguments);
-
-  if (newProcess->processId() == 0)
-  {
-    LOG_INTERN(LogLevel::Error) << processPath << " not started, check path.";
-    return false;
-  }
-
-  LOG_INTERN(LogLevel::DebugCore) << std::endl
-                                  << "### process start pid: " << QString::number(newProcess->processId()).toStdString()
-                                  << "###";
-
-  connect(newProcess,
-          static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
-          [this, newProcess](int exitCode, QProcess::ExitStatus exitStatus)
-          {
-            Q_UNUSED(exitCode);
-            Q_UNUSED(exitStatus);
-            RemoveProcess(newProcess);
-          });
-
-  processMap.insert(newProcess, newProcess->processId());
-
-  return true;
-}
-
-void ProcessManager::WaitAndClear()
-{
-  QMapIterator<QProcess*, size_t> processMapIterator(processMap);
-  while (processMapIterator.hasNext())
-  {
-    processMapIterator.next();
-    QProcess* process = processMapIterator.key();
-    process->waitForFinished(-1);  //default timeout 30s, -1 :infinity
-  }
-}
-
-void ProcessManager::KillAll()
-{
-  QMapIterator<QProcess*, size_t> processMapIterator(processMap);
-  while (processMapIterator.hasNext())
-  {
-    processMapIterator.next();
-    QProcess* process = processMapIterator.key();
-    process->kill();
-    RemoveProcess(process);
-  }
-}
diff --git a/sim/src/core/opsimulationmanager/framework/processManager.h b/sim/src/core/opsimulationmanager/framework/processManager.h
deleted file mode 100644
index cbe550de5968a6a1f2bb3df79acb345763511d06..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/framework/processManager.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2018 ITK Engineering GmbH
- *               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 <stddef.h>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <qmap.h>
-#include <qobject.h>
-#include <qobjectdefs.h>
-#include <qstring.h>
-
-class QProcess;
-
-/// @brief Class representing a process manager
-class ProcessManager : public QObject
-{
-  Q_OBJECT
-public:
-  /// @brief Getter function to return the current instance of the procesess
-  /// @return Current running process manager object
-  static ProcessManager& getInstance();
-
-  ProcessManager(const ProcessManager&) = delete;
-  ProcessManager(ProcessManager&&) = delete;
-  ProcessManager& operator=(const ProcessManager&) = delete;
-  ProcessManager& operator=(ProcessManager&&) = delete;
-  virtual ~ProcessManager() { KillAll(); }
-
-  /// @brief Function to start process
-  /// @param processPath Path of the process
-  /// @param arguments   Command line arguments
-  /// @return True, if the process is started
-  bool StartProcess(const std::string& processPath, const std::vector<std::pair<std::string, std::string>>& arguments);
-  void WaitAndClear();  ///< Function to wait and clear all processes
-  void KillAll();       ///< Function to kill all processes
-
-signals:
-
-public slots:
-
-private:
-  ProcessManager(QObject* parent = nullptr);
-  void RemoveProcess(QProcess* process);
-
-  int idealProcessCount;
-  QMap<QProcess*, size_t> processMap;
-};
diff --git a/sim/src/core/opsimulationmanager/framework/simulationConfig.h b/sim/src/core/opsimulationmanager/framework/simulationConfig.h
deleted file mode 100644
index 2b5193a6e7a4fae30971c963fcd51644d7b2fc0b..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/framework/simulationConfig.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2018 ITK Engineering GmbH
- *               2019 in-tech GmbH
- *               2023 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  simulationConfig.h
-//! @brief This file contains the representation of the simulation
-//!        configuration.
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <optional>
-#include <string>
-
-namespace SimulationManager
-{
-namespace Configuration
-{
-
-/** @brief Container class for the simulation configuration
- * 	@details This class stores all information provided by the simulationConfig.xml
- *            and provides access to this information
- */
-class SimulationConfig
-{
-public:
-  /// @brief SimulationConfig constructor
-  /// @param logFile Log file
-  /// @param configs Configs file
-  /// @param results Results of the simulation
-  SimulationConfig(std::optional<std::string> logFile,
-                   std::optional<std::string> configs,
-                   std::optional<std::string> results)
-      : logFile{logFile.value_or(defaultLogFile)},
-        configs{configs.value_or(defaultConfigs)},
-        results{results.value_or(defaultResults)}
-  {
-  }
-
-  const std::string logFile;  ///< Log file
-  const std::string configs;  ///< Configs file
-  const std::string results;  ///< Results of the simulation
-
-private:
-  static constexpr const char* defaultLogFile{"opSimulation.log"};
-  static constexpr const char* defaultConfigs{"configs"};
-  static constexpr const char* defaultResults{"results"};
-};
-
-}  // namespace Configuration
-}  // namespace SimulationManager
diff --git a/sim/src/core/opsimulationmanager/importer/configImporter.cpp b/sim/src/core/opsimulationmanager/importer/configImporter.cpp
deleted file mode 100644
index 4b3da0c5457765e26437ea24e591e72391a112bd..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/importer/configImporter.cpp
+++ /dev/null
@@ -1,237 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 HLRS, University of Stuttgart
- *               2017-2019 ITK Engineering GmbH
- *               2019 in-tech GmbH
- *               2023-2024 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 "configImporter.h"
-
-#include <locale>
-#include <optional>
-#include <stdexcept>
-#include <string>
-
-#include <qbytearray.h>
-#include <qcoreapplication.h>
-#include <qdir.h>
-#include <qfile.h>
-#include <qfileinfo.h>
-#include <qiodevice.h>
-
-#include "../framework/config.h"
-#include "../framework/simulationConfig.h"
-#include "common/xmlParser.h"
-
-namespace SimulationManager::Configuration
-{
-
-bool GetFirstChildElement(const QDomElement &rootElement, const std::string &tag, QDomElement &result)
-{
-  QDomNode node = rootElement.firstChildElement(QString::fromStdString(tag));
-  if (node.isNull())
-  {
-    return false;
-  }
-
-  result = node.toElement();
-  return !result.isNull();
-}
-
-bool ParseString(const QDomElement &rootElement, const std::string &tag, std::string &result)
-{
-  QDomNode node = rootElement.firstChildElement(QString::fromStdString(tag));
-  if (node.isNull())
-  {
-    return false;
-  }
-
-  QDomElement element = node.toElement();
-  if (element.isNull())
-  {
-    return false;
-  }
-
-  result = element.text().toStdString();
-
-  return true;
-}
-
-bool ParseInt(const QDomElement &rootElement, const std::string &tag, int &result)
-{
-  QDomNode node = rootElement.firstChildElement(QString::fromStdString(tag));
-  if (node.isNull())
-  {
-    return false;
-  }
-  QDomElement element = node.toElement();
-  if (element.isNull())
-  {
-    return false;
-  }
-  try
-  {
-    result = std::stoi(element.text().toStdString());
-  }
-  catch (...)
-  {
-    return false;
-  }
-  return true;
-}
-
-template <typename T>
-bool Parse([[maybe_unused]] const QDomElement &rootElement,
-           [[maybe_unused]] const std::string &tag,
-           [[maybe_unused]] T &result)
-{
-  throw std::runtime_error("xmlParser::Parse<T> not implemented yet");
-}
-
-template <>
-bool Parse(const QDomElement &rootElement, const std::string &tag, std::string &result)
-{
-  return ParseString(rootElement, tag, result);
-}
-
-template <>
-bool Parse(const QDomElement &rootElement, const std::string &tag, int &result)
-{
-  return ParseInt(rootElement, tag, result);
-}
-
-template <typename T>
-///
-/// \brief Gets the value of a given tag
-/// \param element root element
-/// \param tag     tag
-/// \return value if tag was found, std::nullopt else
-///
-std::optional<T> GetValue(QDomElement element, const std::string &tag)
-{
-  QDomNode node = element.firstChildElement(QString::fromStdString(tag));
-  if (!node.isNull())
-  {
-    T result;
-    if (Parse<T>(element, tag, result))
-    {
-      return std::make_optional<T>(result);
-    }
-  }
-  return std::nullopt;
-}
-
-/// \brief Helper method to dig into the xml tree
-/// <a><b><c> => b = get(a), c = get(b), etc...
-/// If tag is not available, a runtime_error is issued
-///
-/// \param[in] element root
-/// \param[in] tag     tag of child
-/// \return child element
-QDomElement GetChildOrThrow(const QDomElement &element, const std::string &tag)
-{
-  QDomElement child;
-  GetFirstChildElement(element, tag, child);
-  if (child.isNull())
-  {
-    throw std::runtime_error("Missing tag " + tag);
-  }
-  return child;
-}
-
-Config ConfigImporter::Import(const QString &filename)
-{
-  std::locale::global(std::locale("C"));
-
-  // file handling
-  QString absoluteFilePath = GetAbsoluteFilePath(filename);
-  QFile xmlFile(absoluteFilePath);
-  QDomElement document = ReadDocument(xmlFile, absoluteFilePath.toStdString());
-
-  return Config{GetValue<int>(document, "logLevel"),
-                GetValue<std::string>(document, "logFileOpSimulationManager"),
-                GetValue<std::string>(document, "simulation"),
-                GetValue<std::string>(document, "libraries"),
-                ParseSimulationConfigs(document)};
-}
-
-SimulationConfigs ConfigImporter::ParseSimulationConfigs(const QDomElement &element)
-{
-  auto simulationConfigRoot = GetChildOrThrow(element, "simulationConfigs");
-
-  const std::string simulationConfigEntryTag{"simulationConfig"};
-  auto simulationConfigEntry = GetChildOrThrow(simulationConfigRoot, simulationConfigEntryTag);
-
-  SimulationConfigs simulationConfigs;
-  while (!simulationConfigEntry.isNull())
-  {
-    simulationConfigs.emplace_back(ParseSimulationConfig(simulationConfigEntry));
-    simulationConfigEntry = simulationConfigEntry.nextSiblingElement(QString::fromStdString(simulationConfigEntryTag));
-  }
-
-  return simulationConfigs;
-}
-
-SimulationConfig ConfigImporter::ParseSimulationConfig(const QDomElement &element)
-{
-  return SimulationConfig{GetValue<std::string>(element, "logFileSimulation"),
-                          GetValue<std::string>(element, "configurations"),
-                          GetValue<std::string>(element, "results")};
-}
-
-QDomElement ConfigImporter::ReadDocument(QFile &xmlFile, const std::string &file)
-{
-  if (!xmlFile.open(QIODevice::ReadOnly))
-  {
-    throw std::runtime_error("Could not open file " + file);
-  }
-
-  QByteArray xmlData(xmlFile.readAll());
-  QDomDocument document;
-  QString errorMsg;
-  int errorLine = 0;
-
-  if (!document.setContent(xmlData, &errorMsg, &errorLine))
-  {
-    throw std::runtime_error("Invalid xml file: " + file + "(" + std::to_string(errorLine) + ")");
-  }
-
-  QDomElement documentRoot = document.documentElement();
-  if (documentRoot.isNull())
-  {
-    throw std::runtime_error("Could not find xml root in " + file);
-  }
-
-  return documentRoot;
-}
-
-QString ConfigImporter::GetAbsoluteFilePath(const QString &filename)
-{
-  QString absoluteFilePath = "";
-
-  if (QFileInfo(filename).isRelative())
-  {
-    QDir baseDir = QCoreApplication::applicationDirPath();
-    absoluteFilePath = baseDir.absoluteFilePath(filename);
-    absoluteFilePath = baseDir.cleanPath(absoluteFilePath);
-  }
-  else
-  {
-    absoluteFilePath = filename;
-  }
-
-  if (!QFileInfo(absoluteFilePath).exists())
-  {
-    throw std::runtime_error(absoluteFilePath.toStdString() + " does not exist");
-  }
-
-  return absoluteFilePath;
-}
-
-}  // namespace SimulationManager::Configuration
diff --git a/sim/src/core/opsimulationmanager/importer/configImporter.h b/sim/src/core/opsimulationmanager/importer/configImporter.h
deleted file mode 100644
index 2639a3031c20f0800de3f7608f38784094c36f3c..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/importer/configImporter.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 HLRS, University of Stuttgart
- *               2017 ITK Engineering GmbH
- *               2019 in-tech GmbH
- *               2023-2024 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  configImporter.h
-//! @brief This file contains the importer of opSimulationManager configuration.
-//-----------------------------------------------------------------------------
-
-#pragma once
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include <qdom.h>
-#include <qstring.h>
-
-#include "../framework/simulationConfig.h"
-
-class QFile;
-
-namespace SimulationManager::Configuration
-{
-
-class Config;
-
-using SimulationConfigs = std::vector<SimulationConfig>;
-
-//! This class represents the importer of opSimulationManager configuration
-class ConfigImporter
-{
-public:
-  ConfigImporter() = delete;
-  ConfigImporter(const ConfigImporter&) = delete;
-  ConfigImporter(ConfigImporter&&) = delete;
-  ConfigImporter& operator=(const ConfigImporter&) = delete;
-  ConfigImporter& operator=(ConfigImporter&&) = delete;
-  virtual ~ConfigImporter() = delete;
-
-  //-------------------------------------------------------------------------
-  //! \brief Imports opSimulationManager configuration details from opSimulationManager
-  //! 	   configuration xml
-  //! \param[in] filename The name of opSimulationManager configuration xml file to
-  //! 		   parse
-  //! \returns A Config object containing the details of opSimulationManager
-  //! 		 configuration as detailed in opSimulationManager configuration xml
-  //-------------------------------------------------------------------------
-  static Config Import(const QString& filename);
-
-private:
-  //-------------------------------------------------------------------------
-  //! \brief Parses simulation configuration details from the opSimulationManager
-  //! configuration xml
-  //! \param[in] element The Xml Element containing the simulation configuration
-  //! 		   data
-  //! \returns A SimulationConfig object containing the details of the simulation
-  //! 		 configuration as detailed in the xml element
-  //-------------------------------------------------------------------------
-  static SimulationConfig ParseSimulationConfig(const QDomElement& element);
-
-  //-------------------------------------------------------------------------
-  //! \brief Converts a filename to an absolute file path, if necessary.
-  //! 	   Throws if no file exists at the location specified by the
-  //! 	   absolute file path.
-  //! \param[in] filename The filename to convert to an absolute file path.
-  //! \returns A QString representing the absolute filepath to filename.
-  //-------------------------------------------------------------------------
-  static QString GetAbsoluteFilePath(const QString& filename);
-
-  //-------------------------------------------------------------------------
-  //! \brief Prepares an XML file for parsing using QDomElements
-  //! \param[in] xmlFile The QFile object to be parsed with QDomElements
-  //! \param[in] file The path of the file xmlFile refers to
-  //! \returns A QDomElement referring to the root element of the XML file
-  //-------------------------------------------------------------------------
-  static QDomElement ReadDocument(QFile& xmlFile, const std::string& file);
-
-  //-------------------------------------------------------------------------
-  //! \brief Parses multiple simulations' configuration details from the
-  //!        opSimulationManager configuration xml
-  //! \param[in] element The parent of the xml elements containing the
-  //! 		   simulations' configuration data
-  //! \returns A std:vector<SimulationConfig> containing the details of the
-  //! 		 simulations' configurations as detailed in the xml element
-  //-------------------------------------------------------------------------
-  static SimulationConfigs ParseSimulationConfigs(const QDomElement& element);
-
-  bool GetFirstChildElement(QDomElement rootElement, const std::string& tag, QDomElement& result);
-
-  bool ParseString(QDomElement rootElement, const std::string& tag, std::string& result);
-
-  bool ParseInt(QDomElement rootElement, const std::string& tag, int& result);
-
-  template <typename T>
-  bool Parse(QDomElement rootElement, const std::string& tag, T& result);
-};
-
-}  //namespace SimulationManager::Configuration
diff --git a/sim/src/core/opsimulationmanager/opSimulationManager.h b/sim/src/core/opsimulationmanager/opSimulationManager.h
deleted file mode 100644
index 50886f621789d335e6fb1e53445a28c4438ec2fa..0000000000000000000000000000000000000000
--- a/sim/src/core/opsimulationmanager/opSimulationManager.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2017-2018 ITK Engineering GmbH
- *               2017-2019 in-tech GmbH
- *               2023      Mercedes-Benz Tech Innovation 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
- ********************************************************************************/
-
-/** \addtogroup opSimulationManager
- * @{
- *
- * \section opSimulationManagerDesc Detailed Description
- * This is opSimulationManager module of the framework and it contains the main entry point
- * of the framework.
- *
- * It reads the opSimulationManagerConfig.xml and saves all options and information.
- * Following this a simulation executable is started with the options and information
- * as argument.
- *
- * TODO: Document usage with new react GUI.
- *
- * \section InputArguments
- * | arguments | meaning |
- * |-----------|-------------------------------------------------------------------------------------------------------------------|
- * | --config  | Path to opSimulationManager configuration file. Working directory and "opSimulationManager.xml" by
- * default.       |
- *
- * \section OutputFiles
- * | file                    | description |
- * |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
- * | opSimulationManager.log | Default name for file containing all log messages (depending on the logLevel). Path and
- * name are specified in opSimulationManager.xml. |
- *
- * @} */
diff --git a/sim/tests/common/gtest/unitTestMain.cpp b/sim/tests/common/gtest/unitTestMain.cpp
index 04e93a29902af32b39bb5295eb4150770aa895f6..44016a2aa705aafe18cf103ca24a031de7213420 100644
--- a/sim/tests/common/gtest/unitTestMain.cpp
+++ b/sim/tests/common/gtest/unitTestMain.cpp
@@ -16,10 +16,10 @@ int main(int argc, char **argv)
   SetDefaultXmlOutput(&argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
 
-  #ifdef CROSS_COMPILING
+#ifdef CROSS_COMPILING
   // Code specific to cross-compiling
-    _exit(RUN_ALL_TESTS());
-  #else
-    return RUN_ALL_TESTS();
-  #endif
+  _exit(RUN_ALL_TESTS());
+#else
+  return RUN_ALL_TESTS();
+#endif
 }
diff --git a/sim/tests/endToEndTests/CMakeLists.txt b/sim/tests/endToEndTests/CMakeLists.txt
index 2da99a3fef524849d112932b59e916a5820ff29a..7be1a1bc2753b9384bb4e1ac25d240a371d7fba2 100644
--- a/sim/tests/endToEndTests/CMakeLists.txt
+++ b/sim/tests/endToEndTests/CMakeLists.txt
@@ -89,7 +89,7 @@ foreach(i RANGE ${LEN_CONFIGS})
   add_custom_target(
     pyOpenPASS_${CURRENT_TESTCASE}
     COMMAND ${CMAKE_COMMAND} -E copy ${CURRENT_CONFIG} ${CMAKE_CURRENT_LIST_DIR}/pyOpenPASS/${CURRENT_TESTCASE}.json
-    COMMAND ${Python3_EXECUTABLE} ${PYOPENPASS_ARGS}
+    COMMAND python ${PYOPENPASS_ARGS}
     WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/pyOpenPASS
     )
 
diff --git a/sim/tests/endToEndTests/pyOpenPASS.rst b/sim/tests/endToEndTests/pyOpenPASS.rst
index 13f24b41d1627e757f8639e489ff9720b3cf9877..88024776b5100d160ee06daf84182b330181743b 100644
--- a/sim/tests/endToEndTests/pyOpenPASS.rst
+++ b/sim/tests/endToEndTests/pyOpenPASS.rst
@@ -195,7 +195,7 @@ If they are, the file is merged with the corresponding `Cyclics_Run<runId>.csv`
   .. warning::
 
      pyOpenPASS does not take care of columns with duplicate names.
-     If such columns are found, duplicate names will be suffixed (see `here <https://pandas.pydata.org/pandas-docs/version/1.3.1/user_guide/merging.html#database-style-dataframe-or-named-series-joining-merging>`_ for details).
+     If such columns are found, duplicate names will be suffixed (see `here <https://pandas.pydata.org/pandas-docs/version/2.2.2/user_guide/merging.html#database-style-dataframe-or-named-series-joining-merging>`_ for details).
 
 When merging succeeds, columns from the additional controllers can be queried like every other column in the queries described below.
 
@@ -223,16 +223,6 @@ Basic Syntax
       - ``DriverProfileName``
       - ``AgentType``
 
-   -  Everything from the tag ``RunStatistics`` (see ``simulationOutput.xml``), which is currently:
-
-      - ``RandomSeed``
-      - ``VisibilityDistance``
-      - ``StopReason``
-      - ``StopTime``
-      - ``EgoAccident``
-      - ``TotalDistanceTraveled``
-      - ``EgoDistanceTraveled``
-
 -  Filter:
    A filter based on `pandas.DataFrame.filter <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html?highlight=filter#pandas.DataFrame.filter>`__ syntax using the available columns.
 -  Operator:
diff --git a/sim/tests/endToEndTests/pyOpenPASS/event_loader.py b/sim/tests/endToEndTests/pyOpenPASS/event_loader.py
index 9bb356dafbb1be311fe042a70aa951b54f5ed36b..e0311d92826264c526d7394c3101a071917c7087 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/event_loader.py
+++ b/sim/tests/endToEndTests/pyOpenPASS/event_loader.py
@@ -1,6 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2021 in-tech GmbH
-#               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2022-2024 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
@@ -116,8 +116,7 @@ def _extract_agents_from_trace(root, invocation) -> DataFrame:
     rows = []
 
     for run_result in root.findall(f"RunResults/RunResult[@RunId='{invocation}']"):
-        for a in _parse_agents(run_result):
-            rows.append(_transform_flat_dict_to_dataframe(a.get()))
+        rows.extend(_parse_agents(run_result))
 
     df = concat(rows, ignore_index=True) if len(rows) else pd.DataFrame(columns=['AgentId'])
     df['AgentId'] = df['AgentId'].astype('int64')
@@ -156,39 +155,11 @@ def _parse_events(run_result):
 
     return events
 
-
-@dataclass(init=True)
-class Agent:
-    id: int
-    AgentTypeGroupName: str
-    AgentTypeName: str
-    VehicleModelType: str
-    DriverProfileName: str
-    AgentType: str
-
-    def get(self):
-        return {
-            'AgentId': self.id,
-            'AgentTypeGroupName': self.AgentTypeGroupName,
-            'AgentTypeName': self.AgentTypeName,
-            'VehicleModelType': self.VehicleModelType,
-            'DriverProfileName': self.DriverProfileName,
-            'AgentType': self.AgentType
-        }
-
-
 def _parse_agents(run_result):
-    return map(lambda agent:
-               Agent(
-                   str(agent.attrib['Id']),
-                   agent.attrib['AgentTypeGroupName'],
-                   agent.attrib['AgentTypeName'],
-                   agent.attrib['VehicleModelType'],
-                   agent.attrib['DriverProfileName'],
-                   agent.attrib['AgentType']
-                   ),
-               run_result.find('Agents'))
-
+    for agent in run_result.find('Agents'):
+        df = DataFrame([dict(agent.attrib)])
+        df.rename(columns={'Id': 'AgentId'}, inplace=True)
+        yield df
 
 def _parse_entities(tag, event):
     parsed_entities = []
diff --git a/sim/tests/endToEndTests/pyOpenPASS/event_parser.py b/sim/tests/endToEndTests/pyOpenPASS/event_parser.py
index 4c3cb6f36a325676ea0f812366838d4ee519a705..874f3828a3b585c96ac0e48311276ed91e59d6e2 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/event_parser.py
+++ b/sim/tests/endToEndTests/pyOpenPASS/event_parser.py
@@ -1,5 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2021 in-tech GmbH
+#               2024 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
@@ -11,28 +12,16 @@
 import pandas as pd
 import re
 
-
-def normalize_column(column, event):
-    # already prefixed
-    normalized_column = f'{event}_' + re.sub(f'^({event}_?)', '', column)
-    # special chars
-    normalized_column = re.sub(r'[^a-zA-Z1-9_]', '_', normalized_column)
-    # duplicate _
-    normalized_column = re.sub(r'([_])\1+', r'\1', normalized_column)
-    # leading and trailing _
-    normalized_column = re.sub(r'^_|_$', '', normalized_column)
-    return normalized_column
-
-
-def normalize(event):
-    return normalize_column(event, event)
+def sanitize(column):
+    """Replacing non-alphanumeric characters with underscores and removing extra underscores."""
+    return re.sub(r'_+', '_', re.sub(r'[^\w]', '_', column)).strip('_')
 
 
 def parse_regular(events, event_name):
     if len(events.index) == 0:
         return pd.DataFrame(
             columns=['RunId', 'Timestep', 'Source', 'Name', 'AgentId', 'IsTriggering', 'IsAffected',
-                     f'Event_{normalize(event_name)}']
+                     sanitize(f'Event_{event_name}')]
         )
 
     # subset all events of specific type
@@ -48,15 +37,14 @@ def parse_regular(events, event_name):
     # Concat with original events
     df = pd.concat([df[columns], df_tmp], axis='columns')
 
-    # New columns (= Key) get prefix 'Event_Name_' and are properly normalized
+    # New columns (= Key) get prefix 'Event_Name_' and are properly sanitized
     new_columns = df.columns.drop(columns)
     mapping = dict()
     for new_column in new_columns:
-        mapping.update(
-            {new_column: f'Event_{normalize_column(new_column, event_name)}'})
+        mapping.update({new_column: sanitize(f'Event_{new_column}_{event_name}')})
     df.rename(columns=mapping, inplace=True)
 
     # Add Event_Name to dataframe
-    df[f'Event_{normalize(event_name)}'] = True
+    df[sanitize(f'Event_{event_name}')] = True
 
     return df
diff --git a/sim/tests/endToEndTests/pyOpenPASS/merge_csv2csv.py b/sim/tests/endToEndTests/pyOpenPASS/merge_csv2csv.py
index 3520ece2488c6d768e380f14649ba42886e0b3fd..b6e2bc12e63423f81c1b3a3fb39fa62a5366aab8 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/merge_csv2csv.py
+++ b/sim/tests/endToEndTests/pyOpenPASS/merge_csv2csv.py
@@ -31,7 +31,7 @@ def extract_columns_without_prefix(df):
         if len(parts) == 3:
             cols_mapping[col] = f'{parts[0]}:{parts[2]}'
         else:
-            cols_mapping[col] = parts[-1]
+            cols_mapping[col] = col
     output_df = df.copy()
     output_df.rename(columns=cols_mapping, inplace=True)
     return output_df
@@ -106,12 +106,15 @@ def extract_agent_data_csv(results_path: Path, component_paths: list, run_id: st
         # insert original data
         src_dfs.insert(0, pd.read_csv(dst_file, dtype=str))
 
+        # filter out empty dataframes
+        src_dfs = [df for df in src_dfs if not df.empty]
+
         # strips all column names
         for df in src_dfs:
             df.columns = df.columns.str.strip()
 
         output_df = reduce(lambda left, right:
-                        pd.merge(left, right, on='Timestep', how='left'), src_dfs).fillna('')
+                        pd.merge(left, right, on='Timestep', how='left'), src_dfs).fillna('') if src_dfs else pd.DataFrame()
 
         # sort columns
         output_df = output_df.sort_index(axis=1)
diff --git a/sim/tests/endToEndTests/pyOpenPASS/query_executor.py b/sim/tests/endToEndTests/pyOpenPASS/query_executor.py
index b6085f3b43915dc78e43e5793cf11565b6f7f36d..2254597c943ba3ce24f53de2fdcedd5aff8e4a32 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/query_executor.py
+++ b/sim/tests/endToEndTests/pyOpenPASS/query_executor.py
@@ -56,19 +56,20 @@ def join_events_and_fill(df: pd.DataFrame, events: pd.DataFrame, queried_events)
 
     for column in df.columns:
         for event in queried_events:
-            event_column = f'Event_{event_parser.normalize(event)}'
+            event_column = event_parser.sanitize(f'Event_{event}')
             if column == event_column:
-                df[column] = pd.to_numeric(df[column], downcast="float", errors='ignore')
-                df[column] = df.groupby('AgentId')[
-                    column].ffill()
-                # only for the event column itself, not its keys
-                df[column] = df.groupby('AgentId')[column].fillna(0.0)
+                df[column] = df.groupby('AgentId')[column].ffill()
+                # only for the event column itself
+                with pd.option_context('future.no_silent_downcasting', True):
+                   df[column] = df[column].astype(float).fillna(0.0)
 
     # fill default event columns
-    for column in df.columns:
-        if column in ['IsTriggering', 'IsAffected', 'Source', 'Name']:
-            df[column] = pd.to_numeric(df[column], downcast="float", errors='ignore')
+    for column in ['IsTriggering', 'IsAffected', 'Source', 'Name']:
+        try:
             df[column] = df.groupby('AgentId')[column].ffill()
+            df[column] = df[column].astype(float)
+        except:
+            pass
 
     return df
 
@@ -98,11 +99,11 @@ def query_output(data, events, run_id, query):
         data = add_shifted_column(data, shifted_column)
 
     for event, event_keys in query.parsed_events.items():
-        event_column = f'Event_{event_parser.normalize( event)}'
+        event_column = event_parser.sanitize(f'Event_{event}')
         if event_column not in data.columns:
             data[event_column] = False
         for event_key in event_keys:
-            key_column = f'Event_{event_parser.normalize_column(event_key, event)}'
+            key_column = event_parser.sanitize(f'Event_{event_key}_{event}')
             if key_column not in data.columns:
                 data[key_column] = ''
 
diff --git a/sim/tests/endToEndTests/pyOpenPASS/query_parser.py b/sim/tests/endToEndTests/pyOpenPASS/query_parser.py
index 19a87777f8b38e0dd818cdabdde0931601e0ad19..ee9b8b71404dde14bdd55f7f0e94c22c677f406f 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/query_parser.py
+++ b/sim/tests/endToEndTests/pyOpenPASS/query_parser.py
@@ -1,6 +1,6 @@
 ################################################################################
 # Copyright (c) 2020-2021 in-tech GmbH
-#               2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2022-2024 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
@@ -10,7 +10,7 @@
 ################################################################################
 
 import re
-from event_parser import normalize, normalize_column
+from event_parser import sanitize
 
 
 class Query:
@@ -101,10 +101,8 @@ class Query:
 
         for event, parameters in self.parsed_events.items():
             for parameter in parameters:
-                raw_query = raw_query.replace(
-                    f'#({event}):{parameter}', f'Event_{normalize_column(parameter, event)}')
-            raw_query = raw_query.replace(
-                f'#({event})', f'Event_{normalize(event)}')
+                raw_query = raw_query.replace(f'#({event}):{parameter}', sanitize(f'Event_{parameter}_{event}'))
+            raw_query = raw_query.replace(f'#({event})', sanitize(f'Event_{event}'))
 
         matches = set(re.findall(
             r"\|.*?(((?=[^`])[A-Za-z\d_-]+)-(\d+)(?=[^`]))", raw_query))
diff --git a/sim/tests/endToEndTests/pyOpenPASS/requirements.txt b/sim/tests/endToEndTests/pyOpenPASS/requirements.txt
index 9977fde2ce21ea6c93684910c26d40da565abfbd..a68076d504c308e63cebf49ff988c0ae1963ace3 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/requirements.txt
+++ b/sim/tests/endToEndTests/pyOpenPASS/requirements.txt
@@ -9,9 +9,9 @@
 ################################################################################
 junitparser==3.1.0
 lxml==4.9.3   # apt install libxml2-dev libxslt-dev
-pandas==2.1.0 # apt install python3-dev
+pandas==2.2.2 # apt install python3-dev
 pytest==7.4.2
 psutil==5.9.5
 pytest-xdist[psutil]==3.3.1
 filelock==3.12.3
-myst-parser
\ No newline at end of file
+myst-parser
diff --git a/sim/tests/endToEndTests/pyOpenPASS/runner.py b/sim/tests/endToEndTests/pyOpenPASS/runner.py
index 7b4bd6dd109a01c2bec7e5004ee2f1b7f37e0325..7a2d8e39450ae027045e9a560426e7bb0b79cd18 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/runner.py
+++ b/sim/tests/endToEndTests/pyOpenPASS/runner.py
@@ -67,7 +67,7 @@ class Runner:
         stderr_tempfile = NamedTemporaryFile(delete=False)
 
         try:
-            command = f'{self.executable} --logLevel 1 --logFile "{logfile}" --configs "{configs_path}" --results "{results_path}"'
+            command = f'{self.executable} --clearResultsPath --logLevel 1 --logFile "{logfile}" --configs "{configs_path}" --results "{results_path}"'
             process = subprocess.Popen(
                 command,
                 shell=True,
diff --git a/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/dataframe.csv b/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/dataframe.csv
new file mode 100644
index 0000000000000000000000000000000000000000..7009fe156e8df7e9dcb10d03e779585538b9c278
--- /dev/null
+++ b/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/dataframe.csv
@@ -0,0 +1,4 @@
+Timestep,AgentId,PositionX
+0,0,10
+100,0,20
+200,0,30
diff --git a/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/events.csv b/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/events.csv
index de2d6831d02019eb79423996e5668aabfec2a403..394dc5f40f04fceff3caf5ea1770826d5e983767 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/events.csv
+++ b/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/events.csv
@@ -1,4 +1,4 @@
 RunId,Timestep,Source,Name,AgentId,IsTriggering,IsAffected,Key,Value
 0,0,OpenSCENARIO,StateChangeStory/Act1/StateChangeSequenceA/StateChangeManeuverA/StateChangeEventA,0,False,True,,
-0,0,Dynamics_TrajectoryFollower,Dynamics_TrajectoryFollower,0,True,False,ComponentState,Acting
-0,0,Dynamics_TrajectoryFollower,Dynamics_TrajectoryFollower,0,True,False,InternalState,TrajectoryFollowerActivated
+0,100,Dynamics_TrajectoryFollower,Dynamics_TrajectoryFollower,0,True,False,ComponentState,Acting
+0,100,Dynamics_TrajectoryFollower,Dynamics_TrajectoryFollower,0,True,False,InternalState,TrajectoryFollowerActivated
diff --git a/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/parse_events.ipynb b/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/parse_events.ipynb
index 8d36ff7bf14d3f909fe7ebb186fb90fd32db2743..46dcaa88e0ea65a0897d3c36037e6af00c8140d5 100644
--- a/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/parse_events.ipynb
+++ b/sim/tests/endToEndTests/pyOpenPASS/test/parsers/events/parse_events.ipynb
@@ -19,7 +19,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 230,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -29,7 +29,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 231,
    "metadata": {},
    "outputs": [
     {
@@ -80,7 +80,7 @@
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
@@ -92,7 +92,7 @@
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
@@ -108,8 +108,8 @@
       "text/plain": [
        "   RunId  Timestep                       Source  \\\n",
        "0      0         0                 OpenSCENARIO   \n",
-       "1      0         0  Dynamics_TrajectoryFollower   \n",
-       "2      0         0  Dynamics_TrajectoryFollower   \n",
+       "1      0       100  Dynamics_TrajectoryFollower   \n",
+       "2      0       100  Dynamics_TrajectoryFollower   \n",
        "\n",
        "                                                Name  AgentId  IsTriggering  \\\n",
        "0  StateChangeStory/Act1/StateChangeSequenceA/Sta...        0         False   \n",
@@ -122,7 +122,7 @@
        "2       False   InternalState  TrajectoryFollowerActivated  "
       ]
      },
-     "execution_count": 6,
+     "execution_count": 231,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -135,7 +135,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 232,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -145,7 +145,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 233,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -167,7 +167,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 234,
    "metadata": {},
    "outputs": [
     {
@@ -206,7 +206,7 @@
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
@@ -218,7 +218,7 @@
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
@@ -233,8 +233,8 @@
       ],
       "text/plain": [
        "   RunId  Timestep                       Source                         Name  \\\n",
-       "1      0         0  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
-       "2      0         0  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
+       "1      0       100  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
+       "2      0       100  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
        "\n",
        "   AgentId  IsTriggering  IsAffected             Key  \\\n",
        "1        0          True       False  ComponentState   \n",
@@ -245,20 +245,20 @@
        "2  TrajectoryFollowerActivated  "
       ]
      },
-     "execution_count": 8,
+     "execution_count": 234,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
     "# subset all events of specific type\n",
-    "df = events[events.Name == event_name].copy()\n",
-    "df"
+    "df_events = events[events.Name == event_name].copy()\n",
+    "df_events"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 235,
    "metadata": {},
    "outputs": [
     {
@@ -307,25 +307,25 @@
        "2              NaN  TrajectoryFollowerActivated"
       ]
      },
-     "execution_count": 9,
+     "execution_count": 235,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
     "# store current columns except the one dropped in the next step\n",
-    "columns = df.columns.drop(['Key', 'Value'])\n",
+    "columns = df_events.columns.drop(['Key', 'Value'])\n",
     "\n",
     "# Merge Key/Value columns into a single Column\n",
     "df_tmp = pd.pivot_table(\n",
-    "    df, values='Value', index=df.index, columns='Key', aggfunc='first')\n",
+    "    df_events, values='Value', index=df_events.index, columns='Key', aggfunc='first')\n",
     "\n",
     "df_tmp"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 236,
    "metadata": {},
    "outputs": [
     {
@@ -364,7 +364,7 @@
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
@@ -376,7 +376,7 @@
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
@@ -391,8 +391,8 @@
       ],
       "text/plain": [
        "   RunId  Timestep                       Source                         Name  \\\n",
-       "1      0         0  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
-       "2      0         0  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
+       "1      0       100  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
+       "2      0       100  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
        "\n",
        "   AgentId  IsTriggering  IsAffected ComponentState  \\\n",
        "1        0          True       False         Acting   \n",
@@ -403,20 +403,20 @@
        "2  TrajectoryFollowerActivated  "
       ]
      },
-     "execution_count": 10,
+     "execution_count": 236,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
     "# Concat with original events\n",
-    "df = pd.concat([df[columns], df_tmp], axis='columns')\n",
+    "df = pd.concat([df_events[columns], df_tmp], axis='columns')\n",
     "df"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 237,
    "metadata": {},
    "outputs": [
     {
@@ -447,33 +447,33 @@
        "      <th>AgentId</th>\n",
        "      <th>IsTriggering</th>\n",
        "      <th>IsAffected</th>\n",
-       "      <th>Event_Dynamics_TrajectoryFollower_Event_Dynamics_TrajectoryFollower_ComponentState</th>\n",
-       "      <th>Event_Dynamics_TrajectoryFollower_Event_Dynamics_TrajectoryFollower_InternalState</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Key</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Value</th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
        "      <td>True</td>\n",
        "      <td>False</td>\n",
+       "      <td>ComponentState</td>\n",
        "      <td>Acting</td>\n",
-       "      <td>NaN</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
        "      <td>True</td>\n",
        "      <td>False</td>\n",
-       "      <td>NaN</td>\n",
+       "      <td>InternalState</td>\n",
        "      <td>TrajectoryFollowerActivated</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
@@ -482,41 +482,37 @@
       ],
       "text/plain": [
        "   RunId  Timestep                       Source                         Name  \\\n",
-       "1      0         0  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
-       "2      0         0  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
-       "\n",
-       "   AgentId  IsTriggering  IsAffected  \\\n",
-       "1        0          True       False   \n",
-       "2        0          True       False   \n",
+       "1      0       100  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
+       "2      0       100  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
        "\n",
-       "  Event_Dynamics_TrajectoryFollower_Event_Dynamics_TrajectoryFollower_ComponentState  \\\n",
-       "1                                             Acting                                   \n",
-       "2                                                NaN                                   \n",
+       "   AgentId  IsTriggering  IsAffected Event_Dynamics_TrajectoryFollower_Key  \\\n",
+       "1        0          True       False                        ComponentState   \n",
+       "2        0          True       False                         InternalState   \n",
        "\n",
-       "  Event_Dynamics_TrajectoryFollower_Event_Dynamics_TrajectoryFollower_InternalState  \n",
-       "1                                                NaN                                 \n",
-       "2                        TrajectoryFollowerActivated                                 "
+       "  Event_Dynamics_TrajectoryFollower_Value  \n",
+       "1                                  Acting  \n",
+       "2             TrajectoryFollowerActivated  "
       ]
      },
-     "execution_count": 12,
+     "execution_count": 237,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
     "# New columns (= Key) get prefix 'Event_Name_' and are properly normalized\n",
-    "new_columns = df.columns.drop(columns)\n",
+    "new_columns = df_events.columns.drop(columns)\n",
     "mapping = dict()\n",
     "for new_column in new_columns:\n",
     "    mapping.update(\n",
     "        {new_column: f'Event_{normalize_column(new_column, event_name)}'})\n",
-    "df.rename(columns=mapping, inplace=True)\n",
-    "df"
+    "df_events.rename(columns=mapping, inplace=True)\n",
+    "df_events"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 238,
    "metadata": {},
    "outputs": [
     {
@@ -547,8 +543,8 @@
        "      <th>AgentId</th>\n",
        "      <th>IsTriggering</th>\n",
        "      <th>IsAffected</th>\n",
-       "      <th>Event_Dynamics_TrajectoryFollower_Event_Dynamics_TrajectoryFollower_ComponentState</th>\n",
-       "      <th>Event_Dynamics_TrajectoryFollower_Event_Dynamics_TrajectoryFollower_InternalState</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Key</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Value</th>\n",
        "      <th>Event_Dynamics_TrajectoryFollower</th>\n",
        "    </tr>\n",
        "  </thead>\n",
@@ -556,26 +552,26 @@
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
        "      <td>True</td>\n",
        "      <td>False</td>\n",
+       "      <td>ComponentState</td>\n",
        "      <td>Acting</td>\n",
-       "      <td>NaN</td>\n",
        "      <td>True</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td>0</td>\n",
-       "      <td>0</td>\n",
+       "      <td>100</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>Dynamics_TrajectoryFollower</td>\n",
        "      <td>0</td>\n",
        "      <td>True</td>\n",
        "      <td>False</td>\n",
-       "      <td>NaN</td>\n",
+       "      <td>InternalState</td>\n",
        "      <td>TrajectoryFollowerActivated</td>\n",
        "      <td>True</td>\n",
        "    </tr>\n",
@@ -585,36 +581,916 @@
       ],
       "text/plain": [
        "   RunId  Timestep                       Source                         Name  \\\n",
-       "1      0         0  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
-       "2      0         0  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
+       "1      0       100  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
+       "2      0       100  Dynamics_TrajectoryFollower  Dynamics_TrajectoryFollower   \n",
        "\n",
-       "   AgentId  IsTriggering  IsAffected  \\\n",
-       "1        0          True       False   \n",
-       "2        0          True       False   \n",
+       "   AgentId  IsTriggering  IsAffected Event_Dynamics_TrajectoryFollower_Key  \\\n",
+       "1        0          True       False                        ComponentState   \n",
+       "2        0          True       False                         InternalState   \n",
        "\n",
-       "  Event_Dynamics_TrajectoryFollower_Event_Dynamics_TrajectoryFollower_ComponentState  \\\n",
-       "1                                             Acting                                   \n",
-       "2                                                NaN                                   \n",
+       "  Event_Dynamics_TrajectoryFollower_Value  Event_Dynamics_TrajectoryFollower  \n",
+       "1                                  Acting                               True  \n",
+       "2             TrajectoryFollowerActivated                               True  "
+      ]
+     },
+     "execution_count": 238,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Add Event_Name to dataframe\n",
+    "df_events[f'Event_{normalize(event_name)}'] = True\n",
+    "df_events"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 239,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "\n",
+    "def normalize_column(column, event):\n",
+    "    # already prefixed\n",
+    "    normalized_column = f'{event}_' + re.sub(f'^({event}_?)', '', column)\n",
+    "    # special chars\n",
+    "    normalized_column = re.sub(r'[^a-zA-Z1-9_]', '_', normalized_column)\n",
+    "    # duplicate _\n",
+    "    normalized_column = re.sub(r'([_])\\1+', r'\\1', normalized_column)\n",
+    "    # leading and trailing _\n",
+    "    normalized_column = re.sub(r'^_|_$', '', normalized_column)\n",
+    "    return normalized_column \n",
+    "\n",
+    "def normalize(event):\n",
+    "    return normalize_column(event, event)\n",
+    "\n",
+    "def join_events_and_fill_pandas2(df: pd.DataFrame, events: pd.DataFrame, queried_events):\n",
+    "    df = pd.merge(df, events, on=['Timestep', 'AgentId'], how='outer')\n",
+    "\n",
+    "    for column in df.columns:\n",
+    "        for event in queried_events:\n",
+    "            event_column = f'Event_{normalize(event)}'\n",
+    "            if column == event_column:\n",
+    "                df[column] = pd.to_numeric(df[column], downcast=\"float\", errors='ignore')\n",
+    "                df[column] = df.groupby('AgentId')[\n",
+    "                    column].ffill()\n",
+    "                # only for the event column itself, not its keys\n",
+    "                df[column] = df.groupby('AgentId')[column].fillna(0.0)\n",
+    "\n",
+    "    # fill default event columns\n",
+    "    for column in df.columns:\n",
+    "        if column in ['IsTriggering', 'IsAffected', 'Source', 'Name']:\n",
+    "            df[column] = pd.to_numeric(df[column], downcast=\"float\", errors='ignore')\n",
+    "            df[column] = df.groupby('AgentId')[column].ffill()\n",
+    "\n",
+    "    return df"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 240,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
        "\n",
-       "  Event_Dynamics_TrajectoryFollower_Event_Dynamics_TrajectoryFollower_InternalState  \\\n",
-       "1                                                NaN                                  \n",
-       "2                        TrajectoryFollowerActivated                                  \n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
        "\n",
-       "   Event_Dynamics_TrajectoryFollower  \n",
-       "1                               True  \n",
-       "2                               True  "
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>Timestep</th>\n",
+       "      <th>AgentId</th>\n",
+       "      <th>PositionX</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>10</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>200</td>\n",
+       "      <td>0</td>\n",
+       "      <td>30</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   Timestep  AgentId  PositionX\n",
+       "0         0        0         10\n",
+       "1       100        0         20\n",
+       "2       200        0         30"
       ]
      },
-     "execution_count": 14,
+     "execution_count": 240,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "# Add Event_Name to dataframe\n",
-    "df[f'Event_{normalize(event_name)}'] = True\n",
+    "df = pd.read_csv('dataframe.csv')\n",
     "df"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 249,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "\n",
+    "def join_events_and_fill_pandas3(df: pd.DataFrame, events: pd.DataFrame, queried_events):\n",
+    "    df = pd.merge(df, events, on=['Timestep', 'AgentId'], how='outer')\n",
+    "\n",
+    "    for column in df.columns:\n",
+    "        for event in queried_events:\n",
+    "            event_column = f'Event_{normalize(event)}'\n",
+    "            if column == event_column:\n",
+    "                df[column] = df.groupby('AgentId')[column].ffill()\n",
+    "                # only for the event column itself\n",
+    "                with pd.option_context('future.no_silent_downcasting', True):  \n",
+    "                   df[column] = df[column].astype(float).fillna(0.0)\n",
+    "                  \n",
+    "    # fill default event columns\n",
+    "    for column in ['IsTriggering', 'IsAffected', 'Source', 'Name']:\n",
+    "        try:\n",
+    "            df[column] = df.groupby('AgentId')[column].ffill()\n",
+    "            df[column] = df[column].astype(float)\n",
+    "        except:\n",
+    "            pass\n",
+    "\n",
+    "    return df"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 245,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/tmp/ipykernel_8413/3841375041.py:22: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n",
+      "  df[column] = pd.to_numeric(df[column], downcast=\"float\", errors='ignore')\n",
+      "/tmp/ipykernel_8413/3841375041.py:26: FutureWarning: SeriesGroupBy.fillna is deprecated and will be removed in a future version. Use obj.ffill() or obj.bfill() for forward or backward filling instead. If you want to fill with a single value, use Series.fillna instead\n",
+      "  df[column] = df.groupby('AgentId')[column].fillna(0.0)\n",
+      "/tmp/ipykernel_8413/3841375041.py:31: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n",
+      "  df[column] = pd.to_numeric(df[column], downcast=\"float\", errors='ignore')\n",
+      "/tmp/ipykernel_8413/3841375041.py:31: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n",
+      "  df[column] = pd.to_numeric(df[column], downcast=\"float\", errors='ignore')\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>Timestep</th>\n",
+       "      <th>AgentId</th>\n",
+       "      <th>PositionX</th>\n",
+       "      <th>RunId</th>\n",
+       "      <th>Source</th>\n",
+       "      <th>Name</th>\n",
+       "      <th>IsTriggering</th>\n",
+       "      <th>IsAffected</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Key</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Value</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>10</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>ComponentState</td>\n",
+       "      <td>Acting</td>\n",
+       "      <td>1.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>InternalState</td>\n",
+       "      <td>TrajectoryFollowerActivated</td>\n",
+       "      <td>1.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>200</td>\n",
+       "      <td>0</td>\n",
+       "      <td>30</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>1.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   Timestep  AgentId  PositionX  RunId                       Source  \\\n",
+       "0         0        0         10    NaN                          NaN   \n",
+       "1       100        0         20    0.0  Dynamics_TrajectoryFollower   \n",
+       "2       100        0         20    0.0  Dynamics_TrajectoryFollower   \n",
+       "3       200        0         30    NaN  Dynamics_TrajectoryFollower   \n",
+       "\n",
+       "                          Name  IsTriggering  IsAffected  \\\n",
+       "0                          NaN           NaN         NaN   \n",
+       "1  Dynamics_TrajectoryFollower           1.0         0.0   \n",
+       "2  Dynamics_TrajectoryFollower           1.0         0.0   \n",
+       "3  Dynamics_TrajectoryFollower           1.0         0.0   \n",
+       "\n",
+       "  Event_Dynamics_TrajectoryFollower_Key  \\\n",
+       "0                                   NaN   \n",
+       "1                        ComponentState   \n",
+       "2                         InternalState   \n",
+       "3                                   NaN   \n",
+       "\n",
+       "  Event_Dynamics_TrajectoryFollower_Value  Event_Dynamics_TrajectoryFollower  \n",
+       "0                                     NaN                                0.0  \n",
+       "1                                  Acting                                1.0  \n",
+       "2             TrajectoryFollowerActivated                                1.0  \n",
+       "3                                     NaN                                1.0  "
+      ]
+     },
+     "execution_count": 245,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "join_events_and_fill_pandas2(df, df_events, ['Dynamics_TrajectoryFollower'])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 250,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>Timestep</th>\n",
+       "      <th>AgentId</th>\n",
+       "      <th>PositionX</th>\n",
+       "      <th>RunId</th>\n",
+       "      <th>Source</th>\n",
+       "      <th>Name</th>\n",
+       "      <th>IsTriggering</th>\n",
+       "      <th>IsAffected</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Key</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Value</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>10</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>ComponentState</td>\n",
+       "      <td>Acting</td>\n",
+       "      <td>1.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>InternalState</td>\n",
+       "      <td>TrajectoryFollowerActivated</td>\n",
+       "      <td>1.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>200</td>\n",
+       "      <td>0</td>\n",
+       "      <td>30</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>1.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   Timestep  AgentId  PositionX  RunId                       Source  \\\n",
+       "0         0        0         10    NaN                          NaN   \n",
+       "1       100        0         20    0.0  Dynamics_TrajectoryFollower   \n",
+       "2       100        0         20    0.0  Dynamics_TrajectoryFollower   \n",
+       "3       200        0         30    NaN  Dynamics_TrajectoryFollower   \n",
+       "\n",
+       "                          Name  IsTriggering  IsAffected  \\\n",
+       "0                          NaN           NaN         NaN   \n",
+       "1  Dynamics_TrajectoryFollower           1.0         0.0   \n",
+       "2  Dynamics_TrajectoryFollower           1.0         0.0   \n",
+       "3  Dynamics_TrajectoryFollower           1.0         0.0   \n",
+       "\n",
+       "  Event_Dynamics_TrajectoryFollower_Key  \\\n",
+       "0                                   NaN   \n",
+       "1                        ComponentState   \n",
+       "2                         InternalState   \n",
+       "3                                   NaN   \n",
+       "\n",
+       "  Event_Dynamics_TrajectoryFollower_Value  Event_Dynamics_TrajectoryFollower  \n",
+       "0                                     NaN                                0.0  \n",
+       "1                                  Acting                                1.0  \n",
+       "2             TrajectoryFollowerActivated                                1.0  \n",
+       "3                                     NaN                                1.0  "
+      ]
+     },
+     "execution_count": 250,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "join_events_and_fill_pandas3(df, df_events, ['Dynamics_TrajectoryFollower'])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 251,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/tmp/ipykernel_8413/3841375041.py:22: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n",
+      "  df[column] = pd.to_numeric(df[column], downcast=\"float\", errors='ignore')\n",
+      "/tmp/ipykernel_8413/3841375041.py:26: FutureWarning: SeriesGroupBy.fillna is deprecated and will be removed in a future version. Use obj.ffill() or obj.bfill() for forward or backward filling instead. If you want to fill with a single value, use Series.fillna instead\n",
+      "  df[column] = df.groupby('AgentId')[column].fillna(0.0)\n",
+      "/tmp/ipykernel_8413/3841375041.py:31: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n",
+      "  df[column] = pd.to_numeric(df[column], downcast=\"float\", errors='ignore')\n",
+      "/tmp/ipykernel_8413/3841375041.py:31: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n",
+      "  df[column] = pd.to_numeric(df[column], downcast=\"float\", errors='ignore')\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>Timestep</th>\n",
+       "      <th>AgentId</th>\n",
+       "      <th>PositionX</th>\n",
+       "      <th>RunId</th>\n",
+       "      <th>Source</th>\n",
+       "      <th>Name</th>\n",
+       "      <th>IsTriggering</th>\n",
+       "      <th>IsAffected</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Key</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Value</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   Timestep  AgentId  PositionX  RunId  Source   Name  IsTriggering  \\\n",
+       "0      True     True       True  False   False  False         False   \n",
+       "1      True     True       True   True    True   True          True   \n",
+       "2      True     True       True   True    True   True          True   \n",
+       "3      True     True       True  False    True   True          True   \n",
+       "\n",
+       "   IsAffected  Event_Dynamics_TrajectoryFollower_Key  \\\n",
+       "0       False                                  False   \n",
+       "1        True                                   True   \n",
+       "2        True                                   True   \n",
+       "3        True                                  False   \n",
+       "\n",
+       "   Event_Dynamics_TrajectoryFollower_Value  Event_Dynamics_TrajectoryFollower  \n",
+       "0                                    False                               True  \n",
+       "1                                     True                               True  \n",
+       "2                                     True                               True  \n",
+       "3                                    False                               True  "
+      ]
+     },
+     "execution_count": 251,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "join_events_and_fill_pandas2(df, df_events, ['Dynamics_TrajectoryFollower']) == join_events_and_fill_pandas3(df, df_events, ['Dynamics_TrajectoryFollower'])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 157,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>Timestep</th>\n",
+       "      <th>AgentId</th>\n",
+       "      <th>PositionX</th>\n",
+       "      <th>RunId</th>\n",
+       "      <th>Source</th>\n",
+       "      <th>Name</th>\n",
+       "      <th>IsTriggering</th>\n",
+       "      <th>IsAffected</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Key</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Value</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>10</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "      <td>ComponentState</td>\n",
+       "      <td>Acting</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "      <td>InternalState</td>\n",
+       "      <td>TrajectoryFollowerActivated</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>200</td>\n",
+       "      <td>0</td>\n",
+       "      <td>30</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   Timestep  AgentId  PositionX  RunId                       Source  \\\n",
+       "0         0        0         10    NaN                          NaN   \n",
+       "1       100        0         20    0.0  Dynamics_TrajectoryFollower   \n",
+       "2       100        0         20    0.0  Dynamics_TrajectoryFollower   \n",
+       "3       200        0         30    NaN                          NaN   \n",
+       "\n",
+       "                          Name IsTriggering IsAffected  \\\n",
+       "0                          NaN          NaN        NaN   \n",
+       "1  Dynamics_TrajectoryFollower         True      False   \n",
+       "2  Dynamics_TrajectoryFollower         True      False   \n",
+       "3                          NaN          NaN        NaN   \n",
+       "\n",
+       "  Event_Dynamics_TrajectoryFollower_Key  \\\n",
+       "0                                   NaN   \n",
+       "1                        ComponentState   \n",
+       "2                         InternalState   \n",
+       "3                                   NaN   \n",
+       "\n",
+       "  Event_Dynamics_TrajectoryFollower_Value Event_Dynamics_TrajectoryFollower  \n",
+       "0                                     NaN                               NaN  \n",
+       "1                                  Acting                              True  \n",
+       "2             TrajectoryFollowerActivated                              True  \n",
+       "3                                     NaN                               NaN  "
+      ]
+     },
+     "execution_count": 157,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "df1 = pd.merge(df, df_events, on=['Timestep', 'AgentId'], how='outer')\n",
+    "df1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 111,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/tmp/ipykernel_8413/3193527825.py:6: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead\n",
+      "  df2[event_column] = pd.to_numeric(df1[event_column], downcast=\"float\", errors='ignore')\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>Timestep</th>\n",
+       "      <th>AgentId</th>\n",
+       "      <th>PositionX</th>\n",
+       "      <th>RunId</th>\n",
+       "      <th>Source</th>\n",
+       "      <th>Name</th>\n",
+       "      <th>IsTriggering</th>\n",
+       "      <th>IsAffected</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Key</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower_Value</th>\n",
+       "      <th>Event_Dynamics_TrajectoryFollower</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>10</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "      <td>ComponentState</td>\n",
+       "      <td>Acting</td>\n",
+       "      <td>1.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>100</td>\n",
+       "      <td>0</td>\n",
+       "      <td>20</td>\n",
+       "      <td>0.0</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>Dynamics_TrajectoryFollower</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "      <td>InternalState</td>\n",
+       "      <td>TrajectoryFollowerActivated</td>\n",
+       "      <td>1.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>200</td>\n",
+       "      <td>0</td>\n",
+       "      <td>30</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   Timestep  AgentId  PositionX  RunId                       Source  \\\n",
+       "0         0        0         10    NaN                          NaN   \n",
+       "1       100        0         20    0.0  Dynamics_TrajectoryFollower   \n",
+       "2       100        0         20    0.0  Dynamics_TrajectoryFollower   \n",
+       "3       200        0         30    NaN                          NaN   \n",
+       "\n",
+       "                          Name IsTriggering IsAffected  \\\n",
+       "0                          NaN          NaN        NaN   \n",
+       "1  Dynamics_TrajectoryFollower         True      False   \n",
+       "2  Dynamics_TrajectoryFollower         True      False   \n",
+       "3                          NaN          NaN        NaN   \n",
+       "\n",
+       "  Event_Dynamics_TrajectoryFollower_Key  \\\n",
+       "0                                   NaN   \n",
+       "1                        ComponentState   \n",
+       "2                         InternalState   \n",
+       "3                                   NaN   \n",
+       "\n",
+       "  Event_Dynamics_TrajectoryFollower_Value  Event_Dynamics_TrajectoryFollower  \n",
+       "0                                     NaN                                NaN  \n",
+       "1                                  Acting                                1.0  \n",
+       "2             TrajectoryFollowerActivated                                1.0  \n",
+       "3                                     NaN                                NaN  "
+      ]
+     },
+     "execution_count": 111,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "event = 'Dynamics_TrajectoryFollower'\n",
+    "event_column = f'Event_{normalize(event)}'\n",
+    "\n",
+    "df2 = df1.copy()\n",
+    "            \n",
+    "df2[event_column] = pd.to_numeric(df1[event_column], downcast=\"float\", errors='ignore')\n",
+    "df2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 115,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "0     NaN\n",
+       "1    True\n",
+       "2    True\n",
+       "3    True\n",
+       "Name: Event_Dynamics_TrajectoryFollower, dtype: object"
+      ]
+     },
+     "execution_count": 115,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "df3 = df1.groupby('AgentId')[event_column].ffill()\n",
+    "df3"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {
@@ -636,7 +1512,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.2"
+   "version": "3.11.2"
   },
   "orig_nbformat": 4
  },
diff --git a/sim/tests/endToEndTests/test_end_to_end.json b/sim/tests/endToEndTests/test_end_to_end.json
index f3bfa0c6ce37228d32d55afa0e7576448da5eb50..b2d776b55b0469bfea0480dfb518e2113562e203 100644
--- a/sim/tests/endToEndTests/test_end_to_end.json
+++ b/sim/tests/endToEndTests/test_end_to_end.json
@@ -14,6 +14,7 @@
             "Common",
             "DynamicOSMPSensorDataToTUStepper",
             "DynamicSSPStepper",
+            "LightStateAction",
             "LocalizationOnJunction",
             "ObjectAboveRoad",
             "ObjectOfTypeRoadMark",
@@ -57,6 +58,9 @@
         "FMU_SpeedAction": [
             "FMU_OSCAction_SpeedAction"
         ],
+        "LightStateAction": [
+            "LightStateAction"
+        ],
         "LocalizationOnJunction": [
             "LocalizationOnJunction"
         ],
@@ -320,6 +324,20 @@
             ],
             "success_rate": 1.0
         },
+        "LightStateAction": {
+            "config_sets": [
+                "LightStateAction"
+            ],
+            "duration": 10,
+            "invocations": 1,
+            "description": "IndicatorState for Ego is set to left",
+            "queries": [
+                "count(AgentId | AgentId == 0 and Timestep <= 3000 and IndicatorState == 1) == 0",
+                "count(AgentId | AgentId == 0 and Timestep > 3000 and Timestep <= 6000 and IndicatorState == 1) > 0",
+                "count(AgentId | AgentId == 0 and Timestep > 6000 and IndicatorState == 1) == 0"
+            ],
+            "success_rate": 1.0
+        },
         "LocalizationOnJunction": {
             "config_sets": [
                 "LocalizationOnJunction"
diff --git a/sim/tests/fakes/gmock/fakeEnvironment.h b/sim/tests/fakes/gmock/fakeEnvironment.h
index 5da3fd24c56a3cd2610293a21d29bc3f6adb3731..9cb13fb85b06c2275841e6dfeb0f1275ebe788cf 100644
--- a/sim/tests/fakes/gmock/fakeEnvironment.h
+++ b/sim/tests/fakes/gmock/fakeEnvironment.h
@@ -1,5 +1,5 @@
 /********************************************************************************
- * Copyright (c) 2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2022-2024 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 +19,10 @@
 class FakeEnvironment : public core::EnvironmentInterface
 {
 public:
-  MOCK_METHOD2(CreateMap, void(const std::string& map_file_path, const mantle_api::MapDetails& map_details));
+  MOCK_METHOD3(CreateMap,
+               void(const std::string& map_file_path,
+                    const mantle_api::MapDetails& map_details,
+                    const std::string& map_model_reference));
   MOCK_METHOD2(AddEntityToController, void(mantle_api::IEntity& entity, mantle_api::UniqueId controller_id));
   MOCK_METHOD2(RemoveEntityFromController, void(mantle_api::UniqueId entity_id, mantle_api::UniqueId controller_id));
   MOCK_METHOD2(UpdateControlStrategies,
diff --git a/sim/tests/fakes/gmock/fakeObservation.h b/sim/tests/fakes/gmock/fakeObservation.h
index 9830bc79c7351bc551ceb1b626a15f497c0f6a4b..d512ad6d0770e603ea3832f9be634a9324176a95 100644
--- a/sim/tests/fakes/gmock/fakeObservation.h
+++ b/sim/tests/fakes/gmock/fakeObservation.h
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2018-2020 in-tech GmbH
+ *               2024 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
@@ -15,13 +16,10 @@
 class FakeObservation : public ObservationInterface
 {
 public:
-  MOCK_METHOD0(OpSimulationManagerPreHook, void());
-  MOCK_METHOD1(OpSimulationManagerPostHook, void(const std::string& filename));
   MOCK_METHOD0(OpSimulationPreHook, void());
   MOCK_METHOD0(OpSimulationPreRunHook, void());
   MOCK_METHOD2(OpSimulationUpdateHook, void(int, RunResultInterface&));
   MOCK_METHOD1(OpSimulationPostRunHook, void(const RunResultInterface&));
   MOCK_METHOD0(OpSimulationPostHook, void());
-  MOCK_METHOD0(OpSimulationResultFile, const std::string());
   MOCK_METHOD5(Insert, void(int, int, LoggingGroup, const std::string&, const std::string&));
 };
diff --git a/sim/tests/integrationTests/Algorithm_FmuWrapper_IntegrationTest/Algorithm_FmuWrapper_IntegrationTests.cpp b/sim/tests/integrationTests/Algorithm_FmuWrapper_IntegrationTest/Algorithm_FmuWrapper_IntegrationTests.cpp
index 7df82c5696877faec7786abdf3166e0f428efd4e..84392ef4b3c259b7d12b5f1f2e4dd6aab60004b6 100644
--- a/sim/tests/integrationTests/Algorithm_FmuWrapper_IntegrationTest/Algorithm_FmuWrapper_IntegrationTests.cpp
+++ b/sim/tests/integrationTests/Algorithm_FmuWrapper_IntegrationTest/Algorithm_FmuWrapper_IntegrationTests.cpp
@@ -53,6 +53,7 @@
 #include "common/hypot.h"
 #include "common/longitudinalSignal.h"
 #include "common/runtimeInformation.h"
+#include "common/secondaryDriverTasksSignal.h"
 #include "common/sensorDataSignal.h"
 #include "common/steeringSignal.h"
 #include "common/stochasticDefinitions.h"
@@ -81,48 +82,74 @@ using ::testing::Return;
 using ::testing::ReturnRef;
 
 #if defined(WIN32)
-const std::filesystem::path resourcesFolder{std::filesystem::current_path() / ".." / ".." / ".." / "contrib" / "fmus" / "win64"};
+const std::filesystem::path resourcesFolder{std::filesystem::current_path() / ".." / ".." / ".." / "contrib" / "fmus"
+                                            / "win64"};
 #elif defined(unix)
-const std::filesystem::path resourcesFolder{std::filesystem::current_path() / ".." / ".." / ".." / "contrib" / "fmus" / "linux64"};
+const std::filesystem::path resourcesFolder{std::filesystem::current_path() / ".." / ".." / ".." / "contrib" / "fmus"
+                                            / "linux64"};
 #else
 #error win32 or unix has to be defined
 #endif
 
 const openpass::common::RuntimeInformation fakeRti{0, 100, {std::filesystem::current_path().string(), "", ""}};
 
-TEST(FmuWrapper_InputTests, DummyFmu1WithoutInputs_OutputIsZero)
+struct FmuWrapper_Test : public ::testing::Test
 {
+  FmuWrapper_Test() : entityProperties{std::make_shared<const mantle_api::EntityProperties>()}
+  {
+    ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
+    ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
+    ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
+    ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
+    ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
+    ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
+    ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
+    ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
+    ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
+
+    ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
+    ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
+        .WillByDefault(Return(controlStrategies));
+    ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kUpdateVehicleLightStates))
+        .WillByDefault(Return(controlStrategies));
+    ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
+  }
+
   NiceMock<FakeWorld> fakeWorld;
   NiceMock<FakeAgent> fakeAgent;
   NiceMock<FakeEgoAgent> fakeEgoAgent;
   NiceMock<FakeParameter> fakeParameter;
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuInputTest.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()}, {"Output_dummyFMU_Output", "AccelerationSignal_Acceleration"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
 
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  std::map<std::string, bool> boolParameter;
+  std::map<std::string, double> doubleParameter;
+  std::map<std::string, int> intParameter;
+  std::map<std::string, ParameterInterface::ParameterLists> listsParameter;
+  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter;
+  std::map<std::string, const std::string> stringParameter;
+
+  std::shared_ptr<const mantle_api::EntityProperties> entityProperties;
+
+  std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{std::make_shared<NiceMock<FakeScenarioControl>>()};
+  std::vector<std::string> commands;
+  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlStrategies;
+};
+
+struct FmuWrapper_InputTest : FmuWrapper_Test
+{
+  using FmuWrapper_Test::FmuWrapper_Test;
+};
+
+struct FmuWrapper_OutputTest : FmuWrapper_Test
+{
+  using FmuWrapper_Test::FmuWrapper_Test;
+};
+
+TEST_F(FmuWrapper_InputTest, DummyFmu1WithoutInputs_OutputIsZero)
+{
+  const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuInputTest.fmu";
+  stringParameter = {{"FmuPath", fmuPath.string()}, {"Output_dummyFMU_Output", "AccelerationSignal_Acceleration"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -142,68 +169,51 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithoutInputs_OutputIsZero)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(0.0));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu1WithAllInputs_OutputIsSumOfInputs)
+TEST_F(FmuWrapper_InputTest, DummyFmu1WithAllInputs_OutputIsSumOfInputs)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeWorldObject> fakeFrontObject;
-  NiceMock<FakeWorldObject> fakeFrontFrontObject;
-  NiceMock<FakeParameter> fakeParameter;
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-
   const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuInputTest.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()},
-      {"Output_dummyFMU_Output", "AccelerationSignal_Acceleration"},
-      {"Input_v_ego", "VelocityEgo"},
-      {"Input_aLongitudinal_ego", "AccelerationEgo"},
-      {"Input_aLateral_ego", "CentripetalAccelerationEgo"},
-      {"Input_steeringWheelAngle_ego", "SteeringWheelEgo"},
-      {"Input_pedalPosition_ego", "AccelerationPedalPositionEgo"},
-      {"Input_brakePedalPosition_ego", "BrakePedalPositionEgo"},
-      {"Input_deltaS_ego_front", "RelativeDistanceFront"},
-      {"Input_x_ego", "PositionXEgo"},
-      {"Input_y_ego", "PositionYEgo"},
-      {"Input_yaw_ego", "YawEgo"},
-      {"Input_lane_ego", "LaneEgo"},
-      {"Input_s_ego", "PositionSEgo"},
-      {"Input_t_ego", "PositionTEgo"},
-      {"Input_presence_front", "ExistenceFront"},
-      {"Input_x_front", "PositionXFront"},
-      {"Input_y_front", "PositionYFront"},
-      {"Input_width_front", "WidthFront"},
-      {"Input_length_front", "LengthFront"},
-      {"Input_yaw_front", "YawFront"},
-      {"Input_s_front", "PositionSFront"},
-      {"Input_t_front", "PositionTFront"},
-      {"Input_v_front", "VelocityFront"},
-      {"Input_lane_front", "LaneFront"},
-      {"Input_presence_frontFront", "ExistenceFrontFront"},
-      {"Input_x_frontFront", "PositionXFrontFront"},
-      {"Input_y_frontFront", "PositionYFrontFront"},
-      {"Input_v_frontFront", "VelocityFrontFront"},
-      {"Input_lane_frontFront", "LaneFrontFront"},
-      {"Input_deltaS_frontFront", "RelativeDistanceFrontFront"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_dummyFMU_Output", "AccelerationSignal_Acceleration"},
+                     {"Input_v_ego", "VelocityEgo"},
+                     {"Input_aLongitudinal_ego", "AccelerationEgo"},
+                     {"Input_aLateral_ego", "CentripetalAccelerationEgo"},
+                     {"Input_steeringWheelAngle_ego", "SteeringWheelEgo"},
+                     {"Input_pedalPosition_ego", "AccelerationPedalPositionEgo"},
+                     {"Input_brakePedalPosition_ego", "BrakePedalPositionEgo"},
+                     {"Input_deltaS_ego_front", "RelativeDistanceFront"},
+                     {"Input_x_ego", "PositionXEgo"},
+                     {"Input_y_ego", "PositionYEgo"},
+                     {"Input_yaw_ego", "YawEgo"},
+                     {"Input_lane_ego", "LaneEgo"},
+                     {"Input_s_ego", "PositionSEgo"},
+                     {"Input_t_ego", "PositionTEgo"},
+                     {"Input_presence_front", "ExistenceFront"},
+                     {"Input_x_front", "PositionXFront"},
+                     {"Input_y_front", "PositionYFront"},
+                     {"Input_width_front", "WidthFront"},
+                     {"Input_length_front", "LengthFront"},
+                     {"Input_yaw_front", "YawFront"},
+                     {"Input_s_front", "PositionSFront"},
+                     {"Input_t_front", "PositionTFront"},
+                     {"Input_v_front", "VelocityFront"},
+                     {"Input_lane_front", "LaneFront"},
+                     {"Input_presence_frontFront", "ExistenceFrontFront"},
+                     {"Input_x_frontFront", "PositionXFrontFront"},
+                     {"Input_y_frontFront", "PositionYFrontFront"},
+                     {"Input_v_frontFront", "VelocityFrontFront"},
+                     {"Input_lane_frontFront", "LaneFrontFront"},
+                     {"Input_deltaS_frontFront", "RelativeDistanceFrontFront"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   const std::string roadId{"Road"};
+  NiceMock<FakeWorldObject> fakeFrontObject;
+  NiceMock<FakeWorldObject> fakeFrontFrontObject;
   std::vector<const WorldObjectInterface*> objectsInRange{&fakeFrontObject, &fakeFrontFrontObject};
   ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
   ON_CALL(fakeEgoAgent, HasValidRoute()).WillByDefault(Return(true));
@@ -242,13 +252,6 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithAllInputs_OutputIsSumOfInputs)
   auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
   ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
 
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
-
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
                                                                         0,
@@ -267,15 +270,13 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithAllInputs_OutputIsSumOfInputs)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(380.0));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu1WithSensorFusionInput_OutputIsSumOfInputs)
+TEST_F(FmuWrapper_InputTest, DummyFmu1WithSensorFusionInput_OutputIsSumOfInputs)
 {
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   NiceMock<FakeAgent> agent0;
   NiceMock<FakeAgent> agent1;
   NiceMock<FakeAgent> agent2;
@@ -288,8 +289,7 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithSensorFusionInput_OutputIsSumOfInputs)
   NiceMock<FakeWorldObject> object2;
 
   const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuObjectsList.fmu";
-  std::map<std::string, const std::string> stringParameter{{"FmuPath", fmuPath.string()},
-                                                           {"Output_Output_Sum", "AccelerationSignal_Acceleration"}};
+  stringParameter = {{"FmuPath", fmuPath.string()}, {"Output_Output_Sum", "AccelerationSignal_Acceleration"}};
   for (int i = 0; i <= 9; ++i)
   {
     auto numberStringFmu = (i > 0) ? std::to_string(i) : "10";  // Inputs in DummyFMU are numbered from 1 to 10
@@ -317,10 +317,8 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithSensorFusionInput_OutputIsSumOfInputs)
     stringParameter.insert({"Input_SensorFusionVelocityY_" + numberStringFmu, "SensorFusionVelocityY_" + numberString});
     stringParameter.insert({"Input_SensorFusionYaw_" + numberStringFmu, "SensorFusionYaw_" + numberString});
   }
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{{"VelocityWish", 10.0}};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  doubleParameter = {{"VelocityWish", 10.0}};
   std::map<std::string, const std::string> inputId{{"InputId", "Camera"}};
 
   auto sensorLink = std::make_shared<NiceMock<FakeParameter>>();
@@ -328,14 +326,6 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithSensorFusionInput_OutputIsSumOfInputs)
   std::map<std::string, int> sensorId{{"SensorId", 7}};
   ON_CALL(*sensorLink, GetParametersInt()).WillByDefault(ReturnRef(sensorId));
   std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {sensorLink}}};
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
   ON_CALL(agent0, GetId()).WillByDefault(Return(0));
   ON_CALL(agent1, GetId()).WillByDefault(Return(1));
   ON_CALL(agent2, GetId()).WillByDefault(Return(2));
@@ -496,18 +486,6 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithSensorFusionInput_OutputIsSumOfInputs)
   ON_CALL(fakeWorld, GetAgent(5)).WillByDefault(Return(&agent5));
   ON_CALL(fakeWorld, GetAgent(6)).WillByDefault(Return(&agent6));
 
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
-
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
                                                                         0,
@@ -549,44 +527,17 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithSensorFusionInput_OutputIsSumOfInputs)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(1014.0));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu1WithParametersBool_OutputIsInput)
+TEST_F(FmuWrapper_InputTest, DummyFmu1WithParametersBool_OutputIsInput)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuParameter.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()}, {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
-  std::map<std::string, bool> boolParameter{
-      {"Logging", true}, {"CsvOutput", true}, {"Parameter_Input_Parameter_boolean.Value", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()}, {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}, {"Parameter_Input_Parameter_boolean.Value", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -606,45 +557,20 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithParametersBool_OutputIsInput)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(1));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu1WithParametersReal_OutputIsInput)
+TEST_F(FmuWrapper_InputTest, DummyFmu1WithParametersReal_OutputIsInput)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuParameter.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()}, {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{{"Parameter_Input_Parameter_integer_1.Value", 10},
-                                          {"Parameter_Input_Parameter_integer_2.Value", 20}};
-  std::map<std::string, double> doubleParameter{{"Parameter_Input_Parameter_double_1.Value", 1.23},
-                                                {"Parameter_Input_Parameter_double_2.Value", 12.3}};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()}, {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  intParameter = {{"Parameter_Input_Parameter_integer_1.Value", 10}, {"Parameter_Input_Parameter_integer_2.Value", 20}};
+  doubleParameter
+      = {{"Parameter_Input_Parameter_double_1.Value", 1.23}, {"Parameter_Input_Parameter_double_2.Value", 12.3}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -664,45 +590,19 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithParametersReal_OutputIsInput)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(43.53));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu1WithParametersString_OutputIsInput)
+TEST_F(FmuWrapper_InputTest, DummyFmu1WithParametersString_OutputIsInput)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuParameter.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()},
-      {"Parameter_Input_Parameter_string", "TestString"},
-      {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Parameter_Input_Parameter_string", "TestString"},
+                     {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -722,54 +622,28 @@ TEST(FmuWrapper_InputTests, DummyFmu1WithParametersString_OutputIsInput)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(10));
 }
 
-TEST(FmuWrapper_OutputTests, DummyFmu1WithDynamicsSignalOutput_OutputIsAsExpected)
+TEST_F(FmuWrapper_OutputTest, DummyFmu1WithDynamicsSignalOutput_OutputIsAsExpected)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuOutputTest.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()},
-      {"Output_output_1", "ComponentState"},
-      {"Output_output_2", "DynamicsSignal_Acceleration"},
-      {"Output_output_3", "DynamicsSignal_Velocity"},
-      {"Output_output_4", "DynamicsSignal_PositionX"},
-      {"Output_output_5", "DynamicsSignal_PositionY"},
-      {"Output_output_6", "DynamicsSignal_Yaw"},
-      {"Output_output_7", "DynamicsSignal_YawRate"},
-      {"Output_output_8", "DynamicsSignal_YawAcceleration"},
-      {"Output_output_9", "DynamicsSignal_SteeringWheelAngle"},
-      {"Output_output_10", "DynamicsSignal_CentripetalAcceleration"},
-      {"Output_output_11", "DynamicsSignal_TravelDistance"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_output_1", "ComponentState"},
+                     {"Output_output_2", "DynamicsSignal_Acceleration"},
+                     {"Output_output_3", "DynamicsSignal_Velocity"},
+                     {"Output_output_4", "DynamicsSignal_PositionX"},
+                     {"Output_output_5", "DynamicsSignal_PositionY"},
+                     {"Output_output_6", "DynamicsSignal_Yaw"},
+                     {"Output_output_7", "DynamicsSignal_YawRate"},
+                     {"Output_output_8", "DynamicsSignal_YawAcceleration"},
+                     {"Output_output_9", "DynamicsSignal_SteeringWheelAngle"},
+                     {"Output_output_10", "DynamicsSignal_CentripetalAcceleration"},
+                     {"Output_output_11", "DynamicsSignal_TravelDistance"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -789,7 +663,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithDynamicsSignalOutput_OutputIsAsExpecte
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(0, signal, 0);
 
-  auto dynamicsSignal = std::dynamic_pointer_cast<const DynamicsSignal>(signal);
+  const auto dynamicsSignal = std::dynamic_pointer_cast<const DynamicsSignal>(signal);
+  ASSERT_THAT(dynamicsSignal, NotNull());
   EXPECT_THAT(dynamicsSignal->componentState, Eq(ComponentState::Acting));
   EXPECT_THAT(dynamicsSignal->dynamicsInformation.acceleration.value(), DoubleEq(2.0));
   EXPECT_THAT(openpass::hypot(dynamicsSignal->dynamicsInformation.velocityX.value(),
@@ -803,46 +678,19 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithDynamicsSignalOutput_OutputIsAsExpecte
   EXPECT_THAT(dynamicsSignal->dynamicsInformation.steeringWheelAngle.value(), DoubleEq(9.0));
   EXPECT_THAT(dynamicsSignal->dynamicsInformation.centripetalAcceleration.value(), DoubleEq(10.0));
   EXPECT_THAT(dynamicsSignal->dynamicsInformation.travelDistance.value(), DoubleEq(11.0));
-  EXPECT_THAT(dynamicsSignal->dynamicsInformation.travelDistance.value(), DoubleEq(11.0));
 }
 
-TEST(FmuWrapper_OutputTests, DummyFmu1WithLongitudinalAndSteeringSignalOutput_OutputIsAsExpected)
+TEST_F(FmuWrapper_OutputTest, DummyFmu1WithLongitudinalAndSteeringSignalOutput_OutputIsAsExpected)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuOutputTest.fmu";
-  std::map<std::string, const std::string> stringParameter{{"FmuPath", fmuPath.string()},
-                                                           {"Output_output_1", "ComponentState"},
-                                                           {"Output_output_2", "LongitudinalSignal_AccPedalPos"},
-                                                           {"Output_output_3", "LongitudinalSignal_BrakePedalPos"},
-                                                           {"Output_output_12", "LongitudinalSignal_Gear"},
-                                                           {"Output_output_4", "SteeringSignal_SteeringWheelAngle"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_output_1", "ComponentState"},
+                     {"Output_output_2", "LongitudinalSignal_AccPedalPos"},
+                     {"Output_output_3", "LongitudinalSignal_BrakePedalPos"},
+                     {"Output_output_12", "LongitudinalSignal_Gear"},
+                     {"Output_output_4", "SteeringSignal_SteeringWheelAngle"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -861,10 +709,12 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithLongitudinalAndSteeringSignalOutput_Ou
   fmuWrapper->Trigger(0);
   std::shared_ptr<const SignalInterface> signal1;
   fmuWrapper->UpdateOutput(2, signal1, 0);
-  auto longitudinalSignal = std::dynamic_pointer_cast<const LongitudinalSignal>(signal1);
+  const auto longitudinalSignal = std::dynamic_pointer_cast<const LongitudinalSignal>(signal1);
+  ASSERT_THAT(longitudinalSignal, NotNull());
   std::shared_ptr<const SignalInterface> signal2;
   fmuWrapper->UpdateOutput(3, signal2, 0);
-  auto steeringSignal = std::dynamic_pointer_cast<const SteeringSignal>(signal2);
+  const auto steeringSignal = std::dynamic_pointer_cast<const SteeringSignal>(signal2);
+  ASSERT_THAT(steeringSignal, NotNull());
 
   EXPECT_THAT(longitudinalSignal->componentState, Eq(ComponentState::Acting));
   EXPECT_THAT(longitudinalSignal->accPedalPos, DoubleEq(2.0));
@@ -874,45 +724,18 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithLongitudinalAndSteeringSignalOutput_Ou
   EXPECT_THAT(steeringSignal->steeringWheelAngle.value(), DoubleEq(4.0));
 }
 
-TEST(FmuWrapper_OutputTests, DummyFmu1WithCompCtrlSignalOutput_OutputIsAsExpected)
+TEST_F(FmuWrapper_OutputTest, DummyFmu1WithCompCtrlSignalOutput_OutputIsAsExpected)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuComCtrlsSignal.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()},
-      {"Output_Output_MovementDomain", "CompCtrlSignal_MovementDomain"},
-      {"Output_Output_WarningActivity", "CompCtrlSignal_WarningActivity"},
-      {"Output_Output_WarningLevel", "CompCtrlSignal_WarningLevel"},
-      {"Output_Output_WarningType", "CompCtrlSignal_WarningType"},
-      {"Output_Output_WarningIntensity", "CompCtrlSignal_WarningIntensity"},
-      {"Output_Output_WarningDirection", "CompCtrlSignal_WarningDirection"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_Output_MovementDomain", "CompCtrlSignal_MovementDomain"},
+                     {"Output_Output_WarningActivity", "CompCtrlSignal_WarningActivity"},
+                     {"Output_Output_WarningLevel", "CompCtrlSignal_WarningLevel"},
+                     {"Output_Output_WarningType", "CompCtrlSignal_WarningType"},
+                     {"Output_Output_WarningIntensity", "CompCtrlSignal_WarningIntensity"},
+                     {"Output_Output_WarningDirection", "CompCtrlSignal_WarningDirection"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -931,7 +754,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithCompCtrlSignalOutput_OutputIsAsExpecte
   fmuWrapper->Trigger(0);
   std::shared_ptr<const SignalInterface> signal0;
   fmuWrapper->UpdateOutput(4, signal0, 0);
-  auto compCtrlSignal0 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal0);
+  const auto compCtrlSignal0 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal0);
+  ASSERT_THAT(compCtrlSignal0, NotNull());
   EXPECT_THAT(compCtrlSignal0->GetCurrentState(), Eq(ComponentState::Acting));
   EXPECT_THAT(compCtrlSignal0->GetMovementDomain(), Eq(MovementDomain::Undefined));
   auto warnings0 = compCtrlSignal0->GetComponentWarnings();
@@ -944,7 +768,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithCompCtrlSignalOutput_OutputIsAsExpecte
   fmuWrapper->Trigger(1000);
   std::shared_ptr<const SignalInterface> signal1;
   fmuWrapper->UpdateOutput(4, signal1, 0);
-  auto compCtrlSignal1 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal1);
+  const auto compCtrlSignal1 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal1);
+  ASSERT_THAT(compCtrlSignal1, NotNull());
   EXPECT_THAT(compCtrlSignal1->GetCurrentState(), Eq(ComponentState::Acting));
   EXPECT_THAT(compCtrlSignal1->GetMovementDomain(), Eq(MovementDomain::Lateral));
   auto warnings1 = compCtrlSignal1->GetComponentWarnings();
@@ -957,7 +782,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithCompCtrlSignalOutput_OutputIsAsExpecte
   fmuWrapper->Trigger(2000);
   std::shared_ptr<const SignalInterface> signal2;
   fmuWrapper->UpdateOutput(4, signal2, 0);
-  auto compCtrlSignal2 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal2);
+  const auto compCtrlSignal2 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal2);
+  ASSERT_THAT(compCtrlSignal2, NotNull());
   EXPECT_THAT(compCtrlSignal2->GetCurrentState(), Eq(ComponentState::Acting));
   EXPECT_THAT(compCtrlSignal2->GetMovementDomain(), Eq(MovementDomain::Longitudinal));
   auto warnings2 = compCtrlSignal2->GetComponentWarnings();
@@ -970,7 +796,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithCompCtrlSignalOutput_OutputIsAsExpecte
   fmuWrapper->Trigger(3000);
   std::shared_ptr<const SignalInterface> signal3;
   fmuWrapper->UpdateOutput(4, signal3, 0);
-  auto compCtrlSignal3 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal3);
+  const auto compCtrlSignal3 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal3);
+  ASSERT_THAT(compCtrlSignal3, NotNull());
   EXPECT_THAT(compCtrlSignal3->GetCurrentState(), Eq(ComponentState::Acting));
   EXPECT_THAT(compCtrlSignal3->GetMovementDomain(), Eq(MovementDomain::Both));
   auto warnings3 = compCtrlSignal3->GetComponentWarnings();
@@ -981,39 +808,84 @@ TEST(FmuWrapper_OutputTests, DummyFmu1WithCompCtrlSignalOutput_OutputIsAsExpecte
   EXPECT_THAT(warnings3.front().direction, Eq(AreaOfInterest::HUD));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu2WithoutInputs_OutputIsZero)
+TEST_F(FmuWrapper_OutputTest, DummyFmu1WithSecondaryDriverTasksSignalOutput_OutputIsAsExpected)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
-  const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuInputTest.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()}, {"Output_dummyFMU_Output", "AccelerationSignal_Acceleration"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
+  const auto fmuPath = resourcesFolder / "Fmi1" / "DummyFmuSecondaryDriverTasksSignal.fmu";
 
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_IndicatorState", "SecondaryDriverTasksSignal_IndicatorState"},
+                     {"Output_HornSwitch", "SecondaryDriverTasksSignal_HornSwitch"},
+                     {"Output_HeadLightSwitch", "SecondaryDriverTasksSignal_HeadLightSwitch"},
+                     {"Output_HighBeamLightSwitch", "SecondaryDriverTasksSignal_HighBeamLightSwitch"},
+                     {"Output_FlasherSwitch", "SecondaryDriverTasksSignal_FlasherSwitch"}};
+
+  std::shared_ptr<const SignalInterface> rawSignal;
+  auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
+                                                                        false,
+                                                                        0,
+                                                                        0,
+                                                                        0,
+                                                                        1000,
+                                                                        &fakeWorld,
+                                                                        nullptr,
+                                                                        &fakeParameter,
+                                                                        nullptr,
+                                                                        nullptr,
+                                                                        &fakeAgent,
+                                                                        fakeScenarioControl);
+
+  // NOTE: See sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/model.c for expected values
+  fmuWrapper->Trigger(0);
+  fmuWrapper->UpdateOutput(5, rawSignal, 0);
+  const auto signal0 = std::dynamic_pointer_cast<const SecondaryDriverTasksSignal>(rawSignal);
+  ASSERT_THAT(signal0, NotNull());
+  EXPECT_EQ(signal0->componentState, ComponentState::Acting);
+  EXPECT_EQ(signal0->indicatorState, 0);
+  EXPECT_TRUE(signal0->hornSwitch);
+  EXPECT_FALSE(signal0->headLightSwitch);
+  EXPECT_FALSE(signal0->highBeamLightSwitch);
+  EXPECT_FALSE(signal0->flasherSwitch);
+
+  fmuWrapper->Trigger(1);
+  fmuWrapper->UpdateOutput(5, rawSignal, 1);
+  const auto signal1 = std::dynamic_pointer_cast<const SecondaryDriverTasksSignal>(rawSignal);
+  ASSERT_THAT(signal1, NotNull());
+  EXPECT_EQ(signal1->componentState, ComponentState::Acting);
+  EXPECT_EQ(signal1->indicatorState, 1000);
+  EXPECT_FALSE(signal1->hornSwitch);
+  EXPECT_TRUE(signal1->headLightSwitch);
+  EXPECT_FALSE(signal1->highBeamLightSwitch);
+  EXPECT_FALSE(signal1->flasherSwitch);
+
+  fmuWrapper->Trigger(2);
+  fmuWrapper->UpdateOutput(5, rawSignal, 2);
+  const auto signal2 = std::dynamic_pointer_cast<const SecondaryDriverTasksSignal>(rawSignal);
+  ASSERT_THAT(signal2, NotNull());
+  EXPECT_EQ(signal2->componentState, ComponentState::Acting);
+  EXPECT_EQ(signal2->indicatorState, 2000);
+  EXPECT_FALSE(signal2->hornSwitch);
+  EXPECT_FALSE(signal2->headLightSwitch);
+  EXPECT_TRUE(signal2->highBeamLightSwitch);
+  EXPECT_FALSE(signal2->flasherSwitch);
+
+  fmuWrapper->Trigger(3);
+  fmuWrapper->UpdateOutput(5, rawSignal, 3);
+  const auto signal3 = std::dynamic_pointer_cast<const SecondaryDriverTasksSignal>(rawSignal);
+  ASSERT_THAT(signal3, NotNull());
+  EXPECT_EQ(signal3->componentState, ComponentState::Acting);
+  EXPECT_EQ(signal3->indicatorState, 3000);
+  EXPECT_FALSE(signal3->hornSwitch);
+  EXPECT_FALSE(signal3->headLightSwitch);
+  EXPECT_FALSE(signal3->highBeamLightSwitch);
+  EXPECT_TRUE(signal3->flasherSwitch);
+}
+
+TEST_F(FmuWrapper_InputTest, DummyFmu2WithoutInputs_OutputIsZero)
+{
+  const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuInputTest.fmu";
+  stringParameter = {{"FmuPath", fmuPath.string()}, {"Output_dummyFMU_Output", "AccelerationSignal_Acceleration"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -1033,67 +905,52 @@ TEST(FmuWrapper_InputTests, DummyFmu2WithoutInputs_OutputIsZero)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(0.0));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu2WithAllInputs_OutputIsSumOfInputs)
+TEST_F(FmuWrapper_InputTest, DummyFmu2WithAllInputs_OutputIsSumOfInputs)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeWorldObject> fakeFrontObject;
-  NiceMock<FakeWorldObject> fakeFrontFrontObject;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuInputTest.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()},
-      {"Output_dummyFMU_Output", "AccelerationSignal_Acceleration"},
-      {"Input_v_ego", "VelocityEgo"},
-      {"Input_aLongitudinal_ego", "AccelerationEgo"},
-      {"Input_aLateral_ego", "CentripetalAccelerationEgo"},
-      {"Input_steeringWheelAngle_ego", "SteeringWheelEgo"},
-      {"Input_pedalPosition_ego", "AccelerationPedalPositionEgo"},
-      {"Input_brakePedalPosition_ego", "BrakePedalPositionEgo"},
-      {"Input_deltaS_ego_front", "RelativeDistanceFront"},
-      {"Input_x_ego", "PositionXEgo"},
-      {"Input_y_ego", "PositionYEgo"},
-      {"Input_yaw_ego", "YawEgo"},
-      {"Input_lane_ego", "LaneEgo"},
-      {"Input_s_ego", "PositionSEgo"},
-      {"Input_t_ego", "PositionTEgo"},
-      {"Input_presence_front", "ExistenceFront"},
-      {"Input_x_front", "PositionXFront"},
-      {"Input_y_front", "PositionYFront"},
-      {"Input_width_front", "WidthFront"},
-      {"Input_length_front", "LengthFront"},
-      {"Input_yaw_front", "YawFront"},
-      {"Input_s_front", "PositionSFront"},
-      {"Input_t_front", "PositionTFront"},
-      {"Input_v_front", "VelocityFront"},
-      {"Input_lane_front", "LaneFront"},
-      {"Input_presence_frontFront", "ExistenceFrontFront"},
-      {"Input_x_frontFront", "PositionXFrontFront"},
-      {"Input_y_frontFront", "PositionYFrontFront"},
-      {"Input_v_frontFront", "VelocityFrontFront"},
-      {"Input_lane_frontFront", "LaneFrontFront"},
-      {"Input_deltaS_frontFront", "RelativeDistanceFrontFront"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_dummyFMU_Output", "AccelerationSignal_Acceleration"},
+                     {"Input_v_ego", "VelocityEgo"},
+                     {"Input_aLongitudinal_ego", "AccelerationEgo"},
+                     {"Input_aLateral_ego", "CentripetalAccelerationEgo"},
+                     {"Input_steeringWheelAngle_ego", "SteeringWheelEgo"},
+                     {"Input_pedalPosition_ego", "AccelerationPedalPositionEgo"},
+                     {"Input_brakePedalPosition_ego", "BrakePedalPositionEgo"},
+                     {"Input_deltaS_ego_front", "RelativeDistanceFront"},
+                     {"Input_x_ego", "PositionXEgo"},
+                     {"Input_y_ego", "PositionYEgo"},
+                     {"Input_yaw_ego", "YawEgo"},
+                     {"Input_lane_ego", "LaneEgo"},
+                     {"Input_s_ego", "PositionSEgo"},
+                     {"Input_t_ego", "PositionTEgo"},
+                     {"Input_presence_front", "ExistenceFront"},
+                     {"Input_x_front", "PositionXFront"},
+                     {"Input_y_front", "PositionYFront"},
+                     {"Input_width_front", "WidthFront"},
+                     {"Input_length_front", "LengthFront"},
+                     {"Input_yaw_front", "YawFront"},
+                     {"Input_s_front", "PositionSFront"},
+                     {"Input_t_front", "PositionTFront"},
+                     {"Input_v_front", "VelocityFront"},
+                     {"Input_lane_front", "LaneFront"},
+                     {"Input_presence_frontFront", "ExistenceFrontFront"},
+                     {"Input_x_frontFront", "PositionXFrontFront"},
+                     {"Input_y_frontFront", "PositionYFrontFront"},
+                     {"Input_v_frontFront", "VelocityFrontFront"},
+                     {"Input_lane_frontFront", "LaneFrontFront"},
+                     {"Input_deltaS_frontFront", "RelativeDistanceFrontFront"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   const std::string roadId{"Road"};
+  NiceMock<FakeWorldObject> fakeFrontObject;
+  NiceMock<FakeWorldObject> fakeFrontFrontObject;
   std::vector<const WorldObjectInterface*> objectsInRange{&fakeFrontObject, &fakeFrontFrontObject};
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
   ON_CALL(fakeEgoAgent, HasValidRoute()).WillByDefault(Return(true));
   ON_CALL(fakeEgoAgent, GetObjectsInRange(_, _, _)).WillByDefault(Return(objectsInRange));
   EXPECT_CALL(fakeAgent, GetVelocity(_)).WillOnce(Return(Common::Vector2d{1.0_mps, 0.0_mps}));
@@ -1130,15 +987,6 @@ TEST(FmuWrapper_InputTests, DummyFmu2WithAllInputs_OutputIsSumOfInputs)
   auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
   ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
 
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
-
   auto fmuWrapper = std::make_shared<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
                                                                         0,
@@ -1157,44 +1005,17 @@ TEST(FmuWrapper_InputTests, DummyFmu2WithAllInputs_OutputIsSumOfInputs)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(380.0));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu2WithParametersBool_OutputIsInput)
+TEST_F(FmuWrapper_InputTest, DummyFmu2WithParametersBool_OutputIsInput)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuParameter.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()}, {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
-  std::map<std::string, bool> boolParameter{
-      {"Logging", true}, {"CsvOutput", true}, {"Parameter_Input_Parameter_boolean.Value", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()}, {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}, {"Parameter_Input_Parameter_boolean.Value", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -1214,45 +1035,22 @@ TEST(FmuWrapper_InputTests, DummyFmu2WithParametersBool_OutputIsInput)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(1));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu2WithParametersReal_OutputIsInput)
+TEST_F(FmuWrapper_InputTest, DummyFmu2WithParametersReal_OutputIsInput)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuParameter.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()}, {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{{"Parameter_Input_Parameter_integer_1.Value", 10},
-                                          {"Parameter_Input_Parameter_integer_2.Value", 20}};
-  std::map<std::string, double> doubleParameter{{"Parameter_Input_Parameter_double_1.Value", 1.23},
-                                                {"Parameter_Input_Parameter_double_2.Value", 12.3}};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
+  stringParameter = {{"FmuPath", fmuPath.string()}, {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  intParameter = {{"Parameter_Input_Parameter_integer_1.Value", 10}, {"Parameter_Input_Parameter_integer_2.Value", 20}};
+  doubleParameter
+      = {{"Parameter_Input_Parameter_double_1.Value", 1.23}, {"Parameter_Input_Parameter_double_2.Value", 12.3}};
+  listsParameter = {{"SensorLinks", {}}};
 
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
   ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -1272,45 +1070,21 @@ TEST(FmuWrapper_InputTests, DummyFmu2WithParametersReal_OutputIsInput)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(43.53));
 }
 
-TEST(FmuWrapper_InputTests, DummyFmu2WithParametersString_OutputIsInput)
+TEST_F(FmuWrapper_InputTest, DummyFmu2WithParametersString_OutputIsInput)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuParameter.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()},
-      {"Parameter_Input_Parameter_string", "TestString"},
-      {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Parameter_Input_Parameter_string", "TestString"},
+                     {"Output_Output_ParameterSum", "AccelerationSignal_Acceleration"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
   ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -1330,54 +1104,28 @@ TEST(FmuWrapper_InputTests, DummyFmu2WithParametersString_OutputIsInput)
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(1, signal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(signal);
+  ASSERT_THAT(accelerationSignal, NotNull());
   ASSERT_THAT(accelerationSignal->acceleration.value(), DoubleEq(10));
 }
 
-TEST(FmuWrapper_OutputTests, DummyFmu2WithDynamicsSignalOutput_OutputIsAsExpected)
+TEST_F(FmuWrapper_OutputTest, DummyFmu2WithDynamicsSignalOutput_OutputIsAsExpected)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuOutputTest.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()},
-      {"Output_output_1", "ComponentState"},
-      {"Output_output_2", "DynamicsSignal_Acceleration"},
-      {"Output_output_3", "DynamicsSignal_Velocity"},
-      {"Output_output_4", "DynamicsSignal_PositionX"},
-      {"Output_output_5", "DynamicsSignal_PositionY"},
-      {"Output_output_6", "DynamicsSignal_Yaw"},
-      {"Output_output_7", "DynamicsSignal_YawRate"},
-      {"Output_output_8", "DynamicsSignal_YawAcceleration"},
-      {"Output_output_9", "DynamicsSignal_SteeringWheelAngle"},
-      {"Output_output_10", "DynamicsSignal_CentripetalAcceleration"},
-      {"Output_output_11", "DynamicsSignal_TravelDistance"}};
-  std::map<std::string, bool> boolParameter{{"Logging", false}, {"CsvOutput", false}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_output_1", "ComponentState"},
+                     {"Output_output_2", "DynamicsSignal_Acceleration"},
+                     {"Output_output_3", "DynamicsSignal_Velocity"},
+                     {"Output_output_4", "DynamicsSignal_PositionX"},
+                     {"Output_output_5", "DynamicsSignal_PositionY"},
+                     {"Output_output_6", "DynamicsSignal_Yaw"},
+                     {"Output_output_7", "DynamicsSignal_YawRate"},
+                     {"Output_output_8", "DynamicsSignal_YawAcceleration"},
+                     {"Output_output_9", "DynamicsSignal_SteeringWheelAngle"},
+                     {"Output_output_10", "DynamicsSignal_CentripetalAcceleration"},
+                     {"Output_output_11", "DynamicsSignal_TravelDistance"}};
+  boolParameter = {{"Logging", false}, {"CsvOutput", false}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -1397,7 +1145,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithDynamicsSignalOutput_OutputIsAsExpecte
   std::shared_ptr<const SignalInterface> signal;
   fmuWrapper->UpdateOutput(0, signal, 0);
 
-  auto dynamicsSignal = std::dynamic_pointer_cast<const DynamicsSignal>(signal);
+  const auto dynamicsSignal = std::dynamic_pointer_cast<const DynamicsSignal>(signal);
+  ASSERT_THAT(dynamicsSignal, NotNull());
   EXPECT_THAT(dynamicsSignal->componentState, Eq(ComponentState::Acting));
   EXPECT_THAT(dynamicsSignal->dynamicsInformation.acceleration.value(), DoubleEq(2.0));
   EXPECT_THAT(openpass::hypot(dynamicsSignal->dynamicsInformation.velocityX.value(),
@@ -1413,43 +1162,17 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithDynamicsSignalOutput_OutputIsAsExpecte
   EXPECT_THAT(dynamicsSignal->dynamicsInformation.travelDistance.value(), DoubleEq(11.0));
 }
 
-TEST(FmuWrapper_OutputTests, DummyFmu2WithLongitudinalAndSteeringSignalOutput_OutputIsAsExpected)
+TEST_F(FmuWrapper_OutputTest, DummyFmu2WithLongitudinalAndSteeringSignalOutput_OutputIsAsExpected)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuOutputTest.fmu";
-  std::map<std::string, const std::string> stringParameter{{"FmuPath", fmuPath.string()},
-                                                           {"Output_output_1", "ComponentState"},
-                                                           {"Output_output_2", "LongitudinalSignal_AccPedalPos"},
-                                                           {"Output_output_3", "LongitudinalSignal_BrakePedalPos"},
-                                                           {"Output_output_12", "LongitudinalSignal_Gear"},
-                                                           {"Output_output_4", "SteeringSignal_SteeringWheelAngle"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_output_1", "ComponentState"},
+                     {"Output_output_2", "LongitudinalSignal_AccPedalPos"},
+                     {"Output_output_3", "LongitudinalSignal_BrakePedalPos"},
+                     {"Output_output_12", "LongitudinalSignal_Gear"},
+                     {"Output_output_4", "SteeringSignal_SteeringWheelAngle"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -1468,10 +1191,12 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithLongitudinalAndSteeringSignalOutput_Ou
   fmuWrapper->Trigger(0);
   std::shared_ptr<const SignalInterface> signal1;
   fmuWrapper->UpdateOutput(2, signal1, 0);
-  auto longitudinalSignal = std::dynamic_pointer_cast<const LongitudinalSignal>(signal1);
+  const auto longitudinalSignal = std::dynamic_pointer_cast<const LongitudinalSignal>(signal1);
+  ASSERT_THAT(longitudinalSignal, NotNull());
   std::shared_ptr<const SignalInterface> signal2;
   fmuWrapper->UpdateOutput(3, signal2, 0);
-  auto steeringSignal = std::dynamic_pointer_cast<const SteeringSignal>(signal2);
+  const auto steeringSignal = std::dynamic_pointer_cast<const SteeringSignal>(signal2);
+  ASSERT_THAT(steeringSignal, NotNull());
 
   EXPECT_THAT(longitudinalSignal->componentState, Eq(ComponentState::Acting));
   EXPECT_THAT(longitudinalSignal->accPedalPos, DoubleEq(2.0));
@@ -1481,45 +1206,18 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithLongitudinalAndSteeringSignalOutput_Ou
   EXPECT_THAT(steeringSignal->steeringWheelAngle.value(), DoubleEq(4.0));
 }
 
-TEST(FmuWrapper_OutputTests, DummyFmu2WithCompCtrlSignalOutput_OutputIsAsExpected)
+TEST_F(FmuWrapper_InputTest, DummyFmu2WithCompCtrlSignalOutput_OutputIsAsExpected)
 {
-  NiceMock<FakeWorld> fakeWorld;
-  NiceMock<FakeAgent> fakeAgent;
-  NiceMock<FakeEgoAgent> fakeEgoAgent;
-  NiceMock<FakeParameter> fakeParameter;
   const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuComCtrlsSignal.fmu";
-  std::map<std::string, const std::string> stringParameter{
-      {"FmuPath", fmuPath.string()},
-      {"Output_Output_MovementDomain", "CompCtrlSignal_MovementDomain"},
-      {"Output_Output_WarningActivity", "CompCtrlSignal_WarningActivity"},
-      {"Output_Output_WarningLevel", "CompCtrlSignal_WarningLevel"},
-      {"Output_Output_WarningType", "CompCtrlSignal_WarningType"},
-      {"Output_Output_WarningIntensity", "CompCtrlSignal_WarningIntensity"},
-      {"Output_Output_WarningDirection", "CompCtrlSignal_WarningDirection"}};
-  std::map<std::string, bool> boolParameter{{"Logging", true}, {"CsvOutput", true}};
-  std::map<std::string, int> intParameter{};
-  std::map<std::string, double> doubleParameter{};
-  std::map<std::string, const openpass::parameter::StochasticDistribution> stochasticParameter{};
-  std::map<std::string, ParameterInterface::ParameterLists> listsParameter{{"SensorLinks", {}}};
-  auto entityProperties = std::make_shared<const mantle_api::EntityProperties>();
-  ON_CALL(fakeParameter, GetParametersString()).WillByDefault(ReturnRef(stringParameter));
-  ON_CALL(fakeParameter, GetParametersBool()).WillByDefault(ReturnRef(boolParameter));
-  ON_CALL(fakeParameter, GetParametersInt()).WillByDefault(ReturnRef(intParameter));
-  ON_CALL(fakeParameter, GetParametersDouble()).WillByDefault(ReturnRef(doubleParameter));
-  ON_CALL(fakeParameter, GetParametersStochastic()).WillByDefault(ReturnRef(stochasticParameter));
-  ON_CALL(fakeParameter, GetParameterLists()).WillByDefault(ReturnRef(listsParameter));
-  ON_CALL(fakeParameter, GetRuntimeInformation()).WillByDefault(ReturnRef(fakeRti));
-  ON_CALL(fakeAgent, GetEgoAgent()).WillByDefault(ReturnRef(fakeEgoAgent));
-  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(entityProperties));
-
-  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
-      std::make_shared<NiceMock<FakeScenarioControl>>()};
-  const std::vector<std::string> commands{};
-  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> controlstrategies = {};
-  ON_CALL(*fakeScenarioControl, GetCustomCommands()).WillByDefault(ReturnRef(commands));
-  ON_CALL(*fakeScenarioControl, HasNewLongitudinalStrategy()).WillByDefault(Return(false));
-  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
-      .WillByDefault(Return(controlstrategies));
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_Output_MovementDomain", "CompCtrlSignal_MovementDomain"},
+                     {"Output_Output_WarningActivity", "CompCtrlSignal_WarningActivity"},
+                     {"Output_Output_WarningLevel", "CompCtrlSignal_WarningLevel"},
+                     {"Output_Output_WarningType", "CompCtrlSignal_WarningType"},
+                     {"Output_Output_WarningIntensity", "CompCtrlSignal_WarningIntensity"},
+                     {"Output_Output_WarningDirection", "CompCtrlSignal_WarningDirection"}};
+  boolParameter = {{"Logging", true}, {"CsvOutput", true}};
+  listsParameter = {{"SensorLinks", {}}};
 
   auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
                                                                         false,
@@ -1538,7 +1236,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithCompCtrlSignalOutput_OutputIsAsExpecte
   fmuWrapper->Trigger(0);
   std::shared_ptr<const SignalInterface> signal0;
   fmuWrapper->UpdateOutput(4, signal0, 0);
-  auto compCtrlSignal0 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal0);
+  const auto compCtrlSignal0 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal0);
+  ASSERT_THAT(compCtrlSignal0, NotNull());
   EXPECT_THAT(compCtrlSignal0->GetCurrentState(), Eq(ComponentState::Acting));
   EXPECT_THAT(compCtrlSignal0->GetMovementDomain(), Eq(MovementDomain::Undefined));
   auto warnings0 = compCtrlSignal0->GetComponentWarnings();
@@ -1551,7 +1250,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithCompCtrlSignalOutput_OutputIsAsExpecte
   fmuWrapper->Trigger(1000);
   std::shared_ptr<const SignalInterface> signal1;
   fmuWrapper->UpdateOutput(4, signal1, 0);
-  auto compCtrlSignal1 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal1);
+  const auto compCtrlSignal1 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal1);
+  ASSERT_THAT(compCtrlSignal1, NotNull());
   EXPECT_THAT(compCtrlSignal1->GetCurrentState(), Eq(ComponentState::Acting));
   EXPECT_THAT(compCtrlSignal1->GetMovementDomain(), Eq(MovementDomain::Lateral));
   auto warnings1 = compCtrlSignal1->GetComponentWarnings();
@@ -1564,7 +1264,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithCompCtrlSignalOutput_OutputIsAsExpecte
   fmuWrapper->Trigger(2000);
   std::shared_ptr<const SignalInterface> signal2;
   fmuWrapper->UpdateOutput(4, signal2, 0);
-  auto compCtrlSignal2 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal2);
+  const auto compCtrlSignal2 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal2);
+  ASSERT_THAT(compCtrlSignal2, NotNull());
   EXPECT_THAT(compCtrlSignal2->GetCurrentState(), Eq(ComponentState::Acting));
   EXPECT_THAT(compCtrlSignal2->GetMovementDomain(), Eq(MovementDomain::Longitudinal));
   auto warnings2 = compCtrlSignal2->GetComponentWarnings();
@@ -1577,7 +1278,8 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithCompCtrlSignalOutput_OutputIsAsExpecte
   fmuWrapper->Trigger(3000);
   std::shared_ptr<const SignalInterface> signal3;
   fmuWrapper->UpdateOutput(4, signal3, 0);
-  auto compCtrlSignal3 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal3);
+  const auto compCtrlSignal3 = std::dynamic_pointer_cast<const VehicleCompToCompCtrlSignal>(signal3);
+  ASSERT_THAT(compCtrlSignal3, NotNull());
   EXPECT_THAT(compCtrlSignal3->GetCurrentState(), Eq(ComponentState::Acting));
   EXPECT_THAT(compCtrlSignal3->GetMovementDomain(), Eq(MovementDomain::Both));
   auto warnings3 = compCtrlSignal3->GetComponentWarnings();
@@ -1588,6 +1290,78 @@ TEST(FmuWrapper_OutputTests, DummyFmu2WithCompCtrlSignalOutput_OutputIsAsExpecte
   EXPECT_THAT(warnings3.front().direction, Eq(AreaOfInterest::HUD));
 }
 
+TEST_F(FmuWrapper_OutputTest, DummyFmu2WithSecondaryDriverTasksSignalOutput_OutputIsAsExpected)
+{
+  const auto fmuPath = resourcesFolder / "Fmi2" / "DummyFmuSecondaryDriverTasksSignal.fmu";
+
+  stringParameter = {{"FmuPath", fmuPath.string()},
+                     {"Output_IndicatorState", "SecondaryDriverTasksSignal_IndicatorState"},
+                     {"Output_HornSwitch", "SecondaryDriverTasksSignal_HornSwitch"},
+                     {"Output_HeadLightSwitch", "SecondaryDriverTasksSignal_HeadLightSwitch"},
+                     {"Output_HighBeamLightSwitch", "SecondaryDriverTasksSignal_HighBeamLightSwitch"},
+                     {"Output_FlasherSwitch", "SecondaryDriverTasksSignal_FlasherSwitch"}};
+
+  std::shared_ptr<const SignalInterface> rawSignal;
+  auto fmuWrapper = std::make_unique<AlgorithmFmuWrapperImplementation>("FmuWrapper",
+                                                                        false,
+                                                                        0,
+                                                                        0,
+                                                                        0,
+                                                                        1000,
+                                                                        &fakeWorld,
+                                                                        nullptr,
+                                                                        &fakeParameter,
+                                                                        nullptr,
+                                                                        nullptr,
+                                                                        &fakeAgent,
+                                                                        fakeScenarioControl);
+
+  // NOTE: See sim/contrib/fmus/DummyFmuSecondaryDriverTasksSignal/model.c for expected values
+  fmuWrapper->Trigger(0);
+  fmuWrapper->UpdateOutput(5, rawSignal, 0);
+  const auto signal0 = std::dynamic_pointer_cast<const SecondaryDriverTasksSignal>(rawSignal);
+  ASSERT_THAT(signal0, NotNull());
+  EXPECT_EQ(signal0->componentState, ComponentState::Acting);
+  EXPECT_EQ(signal0->indicatorState, 0);
+  EXPECT_TRUE(signal0->hornSwitch);
+  EXPECT_FALSE(signal0->headLightSwitch);
+  EXPECT_FALSE(signal0->highBeamLightSwitch);
+  EXPECT_FALSE(signal0->flasherSwitch);
+
+  fmuWrapper->Trigger(1);
+  fmuWrapper->UpdateOutput(5, rawSignal, 1);
+  const auto signal1 = std::dynamic_pointer_cast<const SecondaryDriverTasksSignal>(rawSignal);
+  ASSERT_THAT(signal1, NotNull());
+  EXPECT_EQ(signal1->componentState, ComponentState::Acting);
+  EXPECT_EQ(signal1->indicatorState, 1000);
+  EXPECT_FALSE(signal1->hornSwitch);
+  EXPECT_TRUE(signal1->headLightSwitch);
+  EXPECT_FALSE(signal1->highBeamLightSwitch);
+  EXPECT_FALSE(signal1->flasherSwitch);
+
+  fmuWrapper->Trigger(2);
+  fmuWrapper->UpdateOutput(5, rawSignal, 2);
+  const auto signal2 = std::dynamic_pointer_cast<const SecondaryDriverTasksSignal>(rawSignal);
+  ASSERT_THAT(signal2, NotNull());
+  EXPECT_EQ(signal2->componentState, ComponentState::Acting);
+  EXPECT_EQ(signal2->indicatorState, 2000);
+  EXPECT_FALSE(signal2->hornSwitch);
+  EXPECT_FALSE(signal2->headLightSwitch);
+  EXPECT_TRUE(signal2->highBeamLightSwitch);
+  EXPECT_FALSE(signal2->flasherSwitch);
+
+  fmuWrapper->Trigger(3);
+  fmuWrapper->UpdateOutput(5, rawSignal, 3);
+  const auto signal3 = std::dynamic_pointer_cast<const SecondaryDriverTasksSignal>(rawSignal);
+  ASSERT_THAT(signal3, NotNull());
+  EXPECT_EQ(signal3->componentState, ComponentState::Acting);
+  EXPECT_EQ(signal3->indicatorState, 3000);
+  EXPECT_FALSE(signal3->hornSwitch);
+  EXPECT_FALSE(signal3->headLightSwitch);
+  EXPECT_FALSE(signal3->highBeamLightSwitch);
+  EXPECT_TRUE(signal3->flasherSwitch);
+}
+
 class FmuWrapper_OSMPDummy : public ::testing::Test
 {
 public:
@@ -1796,8 +1570,7 @@ TEST_F(FmuWrapper_OSMPDummy, SensorViewWithEgoAndNoMovingObjects_SensorDataConta
   fmuWrapper->Trigger(0);
   fmuWrapper->UpdateOutput(6, outputSignal, 0);
 
-  auto sensorDataSignal = std::dynamic_pointer_cast<const SensorDataSignal>(outputSignal);
-
+  const auto sensorDataSignal = std::dynamic_pointer_cast<const SensorDataSignal>(outputSignal);
   ASSERT_THAT(sensorDataSignal, NotNull());
 
   const auto& sensorData = sensorDataSignal->sensorData;
@@ -1826,8 +1599,7 @@ TEST_F(FmuWrapper_OSMPDummy, SensorViewWithEgoAndTwoMovingObjects_SensorDataCont
   fmuWrapper->Trigger(0);
   fmuWrapper->UpdateOutput(6, outputSignal, 0);
 
-  auto sensorDataSignal = std::dynamic_pointer_cast<const SensorDataSignal>(outputSignal);
-
+  const auto sensorDataSignal = std::dynamic_pointer_cast<const SensorDataSignal>(outputSignal);
   ASSERT_THAT(sensorDataSignal, NotNull());
 
   const auto& sensorData = sensorDataSignal->sensorData;
@@ -1864,8 +1636,7 @@ TEST_F(FmuWrapper_OSMPDummy, SensorViewWithRotatedEgoAndTwoMovingObjects_SensorD
   fmuWrapper->Trigger(0);
   fmuWrapper->UpdateOutput(6, outputSignal, 0);
 
-  auto sensorDataSignal = std::dynamic_pointer_cast<const SensorDataSignal>(outputSignal);
-
+  const auto sensorDataSignal = std::dynamic_pointer_cast<const SensorDataSignal>(outputSignal);
   ASSERT_THAT(sensorDataSignal, NotNull());
 
   const auto& sensorData = sensorDataSignal->sensorData;
@@ -1914,8 +1685,7 @@ TEST_F(FmuWrapper_OSMPDummy, LinearTrajectorySignal_TrafficUpdateIsCorrectlyConv
   fmuWrapper->Trigger(0);
   fmuWrapper->UpdateOutput(0, outputSignal, 0);
 
-  auto dynamicsSignal = std::dynamic_pointer_cast<const DynamicsSignal>(outputSignal);
-
+  const auto dynamicsSignal = std::dynamic_pointer_cast<const DynamicsSignal>(outputSignal);
   ASSERT_THAT(dynamicsSignal, NotNull());
 
   EXPECT_THAT(dynamicsSignal->dynamicsInformation.acceleration.value(),
@@ -1929,16 +1699,14 @@ TEST_F(FmuWrapper_OSMPDummy, LinearTrajectorySignal_TrafficUpdateIsCorrectlyConv
 
   fmuWrapper->UpdateOutput(1, outputSignal, 0);
 
-  auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(outputSignal);
-
+  const auto accelerationSignal = std::dynamic_pointer_cast<const AccelerationSignal>(outputSignal);
   ASSERT_THAT(accelerationSignal, NotNull());
 
   EXPECT_THAT(accelerationSignal->acceleration.value(), DoubleEq(std::cos(0.4) * 10.0 + std::sin(0.4) * 15.0));
 
   fmuWrapper->UpdateOutput(2, outputSignal, 0);
 
-  auto longitudinalSignal = std::dynamic_pointer_cast<const LongitudinalSignal>(outputSignal);
-
+  const auto longitudinalSignal = std::dynamic_pointer_cast<const LongitudinalSignal>(outputSignal);
   ASSERT_THAT(longitudinalSignal, NotNull());
 
   EXPECT_THAT(longitudinalSignal->accPedalPos, DoubleEq(0.2));
@@ -1947,8 +1715,7 @@ TEST_F(FmuWrapper_OSMPDummy, LinearTrajectorySignal_TrafficUpdateIsCorrectlyConv
 
   fmuWrapper->UpdateOutput(3, outputSignal, 0);
 
-  auto steeringSignal = std::dynamic_pointer_cast<const SteeringSignal>(outputSignal);
-
+  const auto steeringSignal = std::dynamic_pointer_cast<const SteeringSignal>(outputSignal);
   ASSERT_THAT(steeringSignal, NotNull());
 
   EXPECT_THAT(steeringSignal->steeringWheelAngle.value(), DoubleEq(0.5));
diff --git a/sim/tests/integrationTests/Algorithm_FmuWrapper_IntegrationTest/CMakeLists.txt b/sim/tests/integrationTests/Algorithm_FmuWrapper_IntegrationTest/CMakeLists.txt
index ed4a658ee3dbd1eff6d2761b571cc2d6b1cd782c..330ffeff89cb788e5ed49aa2d4860364bbb50799 100644
--- a/sim/tests/integrationTests/Algorithm_FmuWrapper_IntegrationTest/CMakeLists.txt
+++ b/sim/tests/integrationTests/Algorithm_FmuWrapper_IntegrationTest/CMakeLists.txt
@@ -95,6 +95,8 @@ add_dependencies(${COMPONENT_TEST_NAME}
   DummyFmuOutputTestFmi2
   DummyFmuParameterFmi1
   DummyFmuParameterFmi2
+  DummyFmuSecondaryDriverTasksSignalFmi1
+  DummyFmuSecondaryDriverTasksSignalFmi2
   OSMPDummySensor
   OSMPDummyTCTU
 )
diff --git a/sim/tests/integrationTests/OpenPassSlave_IntegrationTests/OpenPassSlave_IntegrationTests.pro b/sim/tests/integrationTests/OpenPassSlave_IntegrationTests/OpenPassSlave_IntegrationTests.pro
deleted file mode 100644
index 60cff760e5aad59d1c0c269cbf9321abfd6c5f9c..0000000000000000000000000000000000000000
--- a/sim/tests/integrationTests/OpenPassSlave_IntegrationTests/OpenPassSlave_IntegrationTests.pro
+++ /dev/null
@@ -1,151 +0,0 @@
-#/*******************************************************************************
-#* 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
-
-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_CORESHARE \
-    $$SRC_WORLD \
-    $$SRC_SLAVECONFIG
-
-HEADERS += \
-    $$OPEN_SRC/common/commonTools.h \
-    $$INC_SCENARIO \
-    $$INC_SCENERY \
-    $$INC_SYSTEMCONFIG \
-    $$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/unitTests/components/Action_BrakeSystem/Brakesystem_Tests.cpp b/sim/tests/unitTests/components/Action_BrakeSystem/Brakesystem_Tests.cpp
index 723a4bbb5aad20f6b1c80a9312c4c80e5fa311a9..08d1d1f071ae41228f648bd0f0e95857ee7fef03 100644
--- a/sim/tests/unitTests/components/Action_BrakeSystem/Brakesystem_Tests.cpp
+++ b/sim/tests/unitTests/components/Action_BrakeSystem/Brakesystem_Tests.cpp
@@ -278,4 +278,4 @@ TEST(BrakeSystem, BrakeWithMaximumDeceleration)
   sumDeceleration = std::accumulate(wheelBrakeTorque.begin(), wheelBrakeTorque.end(), 0.0) * 2
                   / fakeVehicleModelParameters->front_axle.wheel_diameter.value() / fakeVehicleMass;
   ASSERT_DOUBLE_EQ(0.0, std::abs(sumDeceleration));
-}
\ No newline at end of file
+}
diff --git a/sim/tests/unitTests/components/Action_BrakeSystem/CMakeLists.txt b/sim/tests/unitTests/components/Action_BrakeSystem/CMakeLists.txt
index 2c56490782b6c86b06a5066846de7fbe880fed70..e4bcb0cef717bf278961f99790cf6e3d7bb6bff6 100644
--- a/sim/tests/unitTests/components/Action_BrakeSystem/CMakeLists.txt
+++ b/sim/tests/unitTests/components/Action_BrakeSystem/CMakeLists.txt
@@ -1,5 +1,4 @@
 ################################################################################
-
 # Copyright (c) 2023-2024 Volkswagen AG
 #
 # This program and the accompanying materials are made available under the
@@ -28,4 +27,3 @@ add_openpass_target(
   LIBRARIES
     MantleAPI::MantleAPI
 )
-
diff --git a/sim/tests/unitTests/components/Action_Powertrain/CMakeLists.txt b/sim/tests/unitTests/components/Action_Powertrain/CMakeLists.txt
index 284df70b4ea58c41745fe51aca85e89c0dfbb9c6..1edf2814c66591f600dc859a5fca61c1ecb62dbb 100644
--- a/sim/tests/unitTests/components/Action_Powertrain/CMakeLists.txt
+++ b/sim/tests/unitTests/components/Action_Powertrain/CMakeLists.txt
@@ -1,5 +1,4 @@
 ################################################################################
-
 # Copyright (c) 2023-2024 Volkswagen AG
 #
 # This program and the accompanying materials are made available under the
@@ -32,4 +31,3 @@ add_openpass_target(
   LIBRARIES
     MantleAPI::MantleAPI
 )
-
diff --git a/sim/tests/unitTests/components/Action_Powertrain/Powertrain_Tests.cpp b/sim/tests/unitTests/components/Action_Powertrain/Powertrain_Tests.cpp
index 73412331341ca6d39f8c07c00a1c551ebce22c8f..ac8760dd5f85f8e15bb503c62bd8aee86ef9de32 100644
--- a/sim/tests/unitTests/components/Action_Powertrain/Powertrain_Tests.cpp
+++ b/sim/tests/unitTests/components/Action_Powertrain/Powertrain_Tests.cpp
@@ -495,4 +495,4 @@ TEST(Powertrain, CheckExceptionErrors)
   ASSERT_THROW(implementation.UpdateInput(0, nullptr, 0), std::runtime_error);
   ASSERT_THROW(implementation.UpdateInput(1, nullptr, 0), std::runtime_error);
   ASSERT_THROW(implementation.UpdateInput(2, nullptr, 0), std::runtime_error);
-}
\ No newline at end of file
+}
diff --git a/sim/tests/unitTests/components/Action_SteeringSystem/CMakeLists.txt b/sim/tests/unitTests/components/Action_SteeringSystem/CMakeLists.txt
index 5c9db4325dd73b55c4ca5d1b023143fa60b156a9..525c0a09695a2d8a0ef62d133834639b3d41a848 100644
--- a/sim/tests/unitTests/components/Action_SteeringSystem/CMakeLists.txt
+++ b/sim/tests/unitTests/components/Action_SteeringSystem/CMakeLists.txt
@@ -29,4 +29,3 @@ add_openpass_target(
   LIBRARIES
     MantleAPI::MantleAPI
 )
-
diff --git a/sim/tests/unitTests/components/Algorithm_FmuWrapper/ChannelDefinitionParserUnitTests.cpp b/sim/tests/unitTests/components/Algorithm_FmuWrapper/ChannelDefinitionParserUnitTests.cpp
index 4ad7685d397ef89834e59dc275176461c3d73f27..5d37d1408288a1025d711f630cbc9912a5684f51 100644
--- a/sim/tests/unitTests/components/Algorithm_FmuWrapper/ChannelDefinitionParserUnitTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_FmuWrapper/ChannelDefinitionParserUnitTests.cpp
@@ -26,20 +26,37 @@ const FmuVariables testFmu1Variables = FmuVariables{
     std::in_place_index_t<0>(),
     Fmu1Variables{
         {"BoolTestChannel",
-         FmuVariable1{0, VariableType::Bool, fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
-        {"IntTestChannel", FmuVariable1{1, VariableType::Int, fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+         FmuVariable1{0, VariableType::Bool, "", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+        {"IntTestChannel",
+         FmuVariable1{1, VariableType::Int, "", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
         {"Real1TestChannel",
-         FmuVariable1{2, VariableType::Double, fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+         FmuVariable1{2, VariableType::Double, "", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
         {"Real2TestChannel",
-         FmuVariable1{3, VariableType::Double, fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+         FmuVariable1{3, VariableType::Double, "", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
         {"Real3TestChannel",
-         FmuVariable1{4, VariableType::Double, fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+         FmuVariable1{4, VariableType::Double, "", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
         {"StringTestChannel",
-         FmuVariable1{5, VariableType::String, fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+         FmuVariable1{5, VariableType::String, "", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
         {"UnusedBoolTestChannel",
-         FmuVariable1{6, VariableType::Bool, fmi1_causality_enu_input, fmi1_variability_enu_discrete}}},
+         FmuVariable1{6, VariableType::Bool, "", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+        {"Enum1TestChannel",
+         FmuVariable1{
+             7, VariableType::Enum, "ComponentState", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+        {"Enum2TestChannel",
+         FmuVariable1{
+             8, VariableType::Enum, "ComponentStateSignal", fmi1_causality_enu_input, fmi1_variability_enu_discrete}},
+        {"Enum3TestChannel",
+         FmuVariable1{9,
+                      VariableType::Enum,
+                      "CompCtrlSignal_MovementDomain",
+                      fmi1_causality_enu_input,
+                      fmi1_variability_enu_discrete}}},
 };
 
+const std::unordered_map<std::string, std::unordered_map<int, std::string>> testFmuTypeDefinitions
+    = {{"ComponentStateSignal", {{1, "one"}, {2, "two"}, {3, "three"}}},
+       {"CompCtrlSignal_MovementDomain", {{1, "Undefined"}, {2, "Lateral"}, {3, "Longitudinal"}, {4, "Both"}}}};
+
 bool operator==(const Fmu1Input& lhs, const Fmu1Input& rhs)
 {
   return lhs.type == rhs.type && lhs.valueReference == rhs.valueReference
@@ -82,6 +99,7 @@ TEST_F(FmuWrapper_ChannelDefinitionParser, AddValidOutputChannelName)
 {
   EXPECT_NO_THROW(channelDefinitionParser.AddOutputChannel("DynamicsSignal_Velocity", "Real1TestChannel", {}));
 }
+
 TEST_F(FmuWrapper_ChannelDefinitionParser, AddOutputChannelWithWrongType_ThrowError)
 {
   EXPECT_THAT([&]() { channelDefinitionParser.AddOutputChannel("DynamicsSignal_Velocity", "BoolTestChannel", {}); },
@@ -97,6 +115,22 @@ TEST_F(FmuWrapper_ChannelDefinitionParser, AddValidOutputChannelTwice_ThrowError
       ThrowsMessage<std::runtime_error>(HasSubstr("Unable to add output channel: Variable <Real1TestChannel>")));
 }
 
+TEST_F(FmuWrapper_ChannelDefinitionParser, InvalidDeclaredType_ThrowError)
+{
+  EXPECT_THAT(
+      [&]() { channelDefinitionParser.AddOutputChannel("ComponentState", "Enum1TestChannel", testFmuTypeDefinitions); },
+      ThrowsMessage<std::runtime_error>(HasSubstr("Unable to add output channel: Enumeration is not (correctly) "
+                                                  "defined in FMU for declared type <ComponentState>")));
+}
+
+TEST_F(FmuWrapper_ChannelDefinitionParser, InvalidEnumerationValue_ThrowError)
+{
+  EXPECT_THAT(
+      [&]() { channelDefinitionParser.AddOutputChannel("ComponentState", "Enum2TestChannel", testFmuTypeDefinitions); },
+      ThrowsMessage<std::runtime_error>(
+          HasSubstr("Unable to add output channel: Enumeration value <three> not a valid value for ComponentState")));
+}
+
 TEST_F(FmuWrapper_ChannelDefinitionParser, AddInvalidInputChannel_ThrowError)
 {
   EXPECT_THAT(
@@ -129,14 +163,17 @@ TEST_F(FmuWrapper_ChannelDefinitionParser, ValidOutputConfiguration_GeneratesVal
   channelDefinitionParser.AddOutputChannel("DynamicsSignal_Velocity", "Real1TestChannel", {});
   channelDefinitionParser.AddOutputChannel("DynamicsSignal_Acceleration", "Real2TestChannel", {});
   channelDefinitionParser.AddOutputChannel("DynamicsSignal_PositionX", "Real3TestChannel", {});
+  EXPECT_NO_THROW(channelDefinitionParser.AddOutputChannel(
+      "CompCtrlSignal_MovementDomain", "Enum3TestChannel", testFmuTypeDefinitions));
 
   auto outputs = std::get<FMI1>(channelDefinitionParser.GetFmuOutputs());
 
-  ASSERT_THAT(
-      outputs,
-      UnorderedElementsAre(std::pair<SignalValue, fmi1_value_reference_t>(SignalValue::DynamicsSignal_Velocity, 2),
-                           std::pair<SignalValue, fmi1_value_reference_t>(SignalValue::DynamicsSignal_Acceleration, 3),
-                           std::pair<SignalValue, fmi1_value_reference_t>(SignalValue::DynamicsSignal_PositionX, 4)));
+  ASSERT_THAT(outputs,
+              UnorderedElementsAre(
+                  std::pair<SignalValue, fmi1_value_reference_t>(SignalValue::DynamicsSignal_Velocity, 2),
+                  std::pair<SignalValue, fmi1_value_reference_t>(SignalValue::DynamicsSignal_Acceleration, 3),
+                  std::pair<SignalValue, fmi1_value_reference_t>(SignalValue::DynamicsSignal_PositionX, 4),
+                  std::pair<SignalValue, fmi1_value_reference_t>(SignalValue::CompCtrlSignal_MovementDomain, 9)));
 }
 
 TEST_F(FmuWrapper_ChannelDefinitionParser, ValidInputConfiguration_GeneratesValidMap)
diff --git a/sim/tests/unitTests/components/Algorithm_FmuWrapper/FmuWriteAndReadValuesTests.cpp b/sim/tests/unitTests/components/Algorithm_FmuWrapper/FmuWriteAndReadValuesTests.cpp
index 6cde0ceccc41e493eb6c0627c86ca2cd29672a84..19a752ead0c7df677d3acbcd0fb277671893509d 100644
--- a/sim/tests/unitTests/components/Algorithm_FmuWrapper/FmuWriteAndReadValuesTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_FmuWrapper/FmuWriteAndReadValuesTests.cpp
@@ -123,26 +123,29 @@ public:
 
   void fillVariables()
   {
-    FmuVariable2 fmuVarParaConst(0, VariableType::Int, fmi2_causality_enu_parameter, fmi2_variability_enu_constant);
-    FmuVariable2 fmuVarParaFixed(1, VariableType::Int, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
-    FmuVariable2 fmuVarParaTunable(2, VariableType::Int, fmi2_causality_enu_parameter, fmi2_variability_enu_tunable);
+    FmuVariable2 fmuVarParaConst(0, VariableType::Int, "", fmi2_causality_enu_parameter, fmi2_variability_enu_constant);
+    FmuVariable2 fmuVarParaFixed(1, VariableType::Int, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+    FmuVariable2 fmuVarParaTunable(
+        2, VariableType::Int, "", fmi2_causality_enu_parameter, fmi2_variability_enu_tunable);
 
-    FmuVariable2 fmuVarOutConst(3, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_constant);
-    FmuVariable2 fmuVarOutFixed(4, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_fixed);
-    FmuVariable2 fmuVarOutContinuous(5, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_continuous);
-    FmuVariable2 fmuVarOutDiscrete(6, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete);
+    FmuVariable2 fmuVarOutConst(3, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_constant);
+    FmuVariable2 fmuVarOutFixed(4, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_fixed);
+    FmuVariable2 fmuVarOutContinuous(
+        5, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_continuous);
+    FmuVariable2 fmuVarOutDiscrete(6, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete);
 
     FmuVariable2 fmuVarCalcParaConst(
-        7, VariableType::Int, fmi2_causality_enu_calculated_parameter, fmi2_variability_enu_constant);
+        7, VariableType::Int, "", fmi2_causality_enu_calculated_parameter, fmi2_variability_enu_constant);
     FmuVariable2 fmuVarCalcParaFixed(
-        8, VariableType::Int, fmi2_causality_enu_calculated_parameter, fmi2_variability_enu_fixed);
+        8, VariableType::Int, "", fmi2_causality_enu_calculated_parameter, fmi2_variability_enu_fixed);
     FmuVariable2 fmuVarCalcParaTunable(
-        9, VariableType::Int, fmi2_causality_enu_calculated_parameter, fmi2_variability_enu_tunable);
+        9, VariableType::Int, "", fmi2_causality_enu_calculated_parameter, fmi2_variability_enu_tunable);
 
-    FmuVariable2 fmuVarInConst(10, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_constant);
-    FmuVariable2 fmuVarInFixed(11, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_fixed);
-    FmuVariable2 fmuVarInContinuous(12, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_continuous);
-    FmuVariable2 fmuVarInDiscrete(13, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete);
+    FmuVariable2 fmuVarInConst(10, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_constant);
+    FmuVariable2 fmuVarInFixed(11, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_fixed);
+    FmuVariable2 fmuVarInContinuous(
+        12, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_continuous);
+    FmuVariable2 fmuVarInDiscrete(13, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete);
 
     std::vector<std::pair<std::string, FmuVariable2>> fmuVariables2;
 
@@ -399,11 +402,11 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameters_ParseParameters)
   stochasticParameter = {{"Parameter_ParameterStoch", openpass::parameter::NormalDistribution{5.5, 1, 5.5, 5.5}}};
   stringParameter = {{"Parameter_ParameterString", "a string"}};
 
-  FmuVariable2 fmuVarParaBool(0, VariableType::Bool, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
-  FmuVariable2 fmuVarParaInt(14, VariableType::Int, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
-  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
-  FmuVariable2 fmuVarParaStoch(1, VariableType::Double, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
-  FmuVariable2 fmuVarParaString(0, VariableType::String, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaBool(0, VariableType::Bool, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaInt(14, VariableType::Int, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaStoch(1, VariableType::Double, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaString(0, VariableType::String, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
 
   std::get<FMI2>(*fmuVariables).clear();
   std::get<FMI2>(*fmuVariables).insert({"ParameterBool", fmuVarParaBool});
@@ -448,7 +451,7 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_RandomSeed)
   const unsigned int fakeSeed = 4321;
   ON_CALL(fakeStochastics, GetRandomSeed()).WillByDefault(Return(fakeSeed));
 
-  FmuVariable2 fmuVarParaInt(14, VariableType::Int, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaInt(14, VariableType::Int, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
   std::get<FMI2>(*fmuVariables).insert({"ParameterInt", fmuVarParaInt});
   fmuVariableValues->insert({{14, VariableType::Int}, FmuValue{}});
 
@@ -463,7 +466,7 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_ConfigPath)
   stringParameter.insert({"Parameter_AssignSpecial_ParameterString", "ConfigPath"});
   fmuCheckData->FMUPath = "fakeFmu.fmu";
 
-  FmuVariable2 fmuVarParaString(0, VariableType::String, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaString(0, VariableType::String, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
   std::get<FMI2>(*fmuVariables).insert({"ParameterString", fmuVarParaString});
   fmuVariableValues->insert({{0, VariableType::String}, FmuValue{}});
 
@@ -479,7 +482,7 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_OutputPath)
   stringParameter.insert({"Parameter_AssignSpecial_ParameterString", "OutputPath"});
   fmuCheckData->FMUPath = "fakeFmu.fmu";
 
-  FmuVariable2 fmuVarParaString(0, VariableType::String, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaString(0, VariableType::String, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
   std::get<FMI2>(*fmuVariables).insert({"ParameterString", fmuVarParaString});
   fmuVariableValues->insert({{0, VariableType::String}, FmuValue{}});
 
@@ -499,7 +502,7 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_MaxSteering)
   entityProperties->front_axle.max_steering = 10.0_rad;
   stringParameter.insert({"Parameter_AssignSpecial_ParameterDouble", "MaxSteering"});
 
-  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
   std::get<FMI2>(*fmuVariables).insert({"ParameterDouble", fmuVarParaDouble});
   fmuVariableValues->insert({{0, VariableType::Double}, FmuValue{}});
 
@@ -509,12 +512,27 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_MaxSteering)
   ASSERT_THAT(fmuVariableValues->at({0, VariableType::Double}).realValue, DoubleEq(10.0));
 }
 
+TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_AxleRatio)
+{
+  entityProperties->properties["AxleRatio"] = "1.0";
+  stringParameter.insert({"Parameter_AssignSpecial_ParameterDouble", "AxleRatio"});
+
+  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  std::get<FMI2>(*fmuVariables).insert({"ParameterDouble", fmuVarParaDouble});
+  fmuVariableValues->insert({{0, VariableType::Double}, FmuValue{}});
+
+  fmuHandlerPartialMock->PrepareInit();
+  fmuHandlerPartialMock->SyncFmuVariablesAndParameters();
+
+  ASSERT_THAT(fmuVariableValues->at({0, VariableType::Double}).realValue, DoubleEq(1.0));
+}
+
 TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_SteeringRatio)
 {
   entityProperties->properties["SteeringRatio"] = "11.0";
   stringParameter.insert({"Parameter_AssignSpecial_ParameterDouble", "SteeringRatio"});
 
-  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
   std::get<FMI2>(*fmuVariables).insert({"ParameterDouble", fmuVarParaDouble});
   fmuVariableValues->insert({{0, VariableType::Double}, FmuValue{}});
 
@@ -534,9 +552,9 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_Gears)
   stringParameter.insert({"Parameter_AssignSpecial_ParameterDouble1", "GearRatio1"});
   stringParameter.insert({"Parameter_AssignSpecial_ParameterDouble2", "GearRatio2"});
 
-  FmuVariable2 fmuVarParaInt(14, VariableType::Int, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
-  FmuVariable2 fmuVarParaDouble1(0, VariableType::Double, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
-  FmuVariable2 fmuVarParaDouble2(1, VariableType::Double, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaInt(14, VariableType::Int, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaDouble1(0, VariableType::Double, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaDouble2(1, VariableType::Double, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
 
   std::get<FMI2>(*fmuVariables).insert({"ParameterInt", fmuVarParaInt});
   std::get<FMI2>(*fmuVariables).insert({"ParameterDouble1", fmuVarParaDouble1});
@@ -558,7 +576,7 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_UnknownAssignment_Th
 {
   stringParameter.insert({"Parameter_AssignSpecial_ParameterDouble", "NotAKnownAssignment"});
 
-  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaDouble(0, VariableType::Double, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
   std::get<FMI2>(*fmuVariables).insert({"ParameterDouble", fmuVarParaDouble});
   fmuVariableValues->insert({{0, VariableType::Double}, FmuValue{}});
 
@@ -571,7 +589,7 @@ TEST_F(FmuWriteAndReadValuesTests, ParseParameterAssignment_InvalidProperty_Thro
   entityProperties->properties["NumberOfGears"] = "not a valid int";
   stringParameter.insert({"Parameter_AssignSpecial_ParameterInt", "NumberOfGears"});
 
-  FmuVariable2 fmuVarParaInt(14, VariableType::Int, fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
+  FmuVariable2 fmuVarParaInt(14, VariableType::Int, "", fmi2_causality_enu_parameter, fmi2_variability_enu_fixed);
   std::get<FMI2>(*fmuVariables).insert({"ParameterInt", fmuVarParaInt});
   fmuVariableValues->insert({{14, VariableType::Int}, FmuValue{}});
 
diff --git a/sim/tests/unitTests/components/Algorithm_FmuWrapper/OsmpFmuUnitTests.cpp b/sim/tests/unitTests/components/Algorithm_FmuWrapper/OsmpFmuUnitTests.cpp
index 6c1584572ae0c87283381ae34e6948553ca36407..6e09771690e4e336761fa022d76c565bfacc48f0 100644
--- a/sim/tests/unitTests/components/Algorithm_FmuWrapper/OsmpFmuUnitTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_FmuWrapper/OsmpFmuUnitTests.cpp
@@ -18,8 +18,6 @@
 
 using namespace units::literals;
 
-using namespace units::literals;
-
 using ::testing::Eq;
 
 TEST(OsmpFmuUnitTests, GetTrafficCommandFromOpenScenarioTrajectory_FollowTrajectoryAction)
diff --git a/sim/tests/unitTests/components/Algorithm_FmuWrapper/SignalTranslatorTests.cpp b/sim/tests/unitTests/components/Algorithm_FmuWrapper/SignalTranslatorTests.cpp
index dc11e069aec4c3bf8a87f56526a50a640a837930..aed0c33d0c4cb493ff1e70299336bf3d3945436f 100644
--- a/sim/tests/unitTests/components/Algorithm_FmuWrapper/SignalTranslatorTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_FmuWrapper/SignalTranslatorTests.cpp
@@ -22,6 +22,7 @@
 #include "SignalInterface/SignalTranslator.h"
 #include "common/dynamicsSignal.h"
 #include "common/primitiveSignals.h"
+#include "common/secondaryDriverTasksSignal.h"
 #include "fakeAgent.h"
 #include "include/fmuHandlerInterface.h"
 #include "include/signalInterface.h"
@@ -436,4 +437,45 @@ TEST(SignalParser, GivenOutputSignalForCompCtrlSignal_WhenSignalNotEmpty_ThenGen
   EXPECT_THAT(warnings1.front().type, Eq(ComponentWarningType::ACOUSTIC));
   EXPECT_THAT(warnings1.front().intensity, Eq(ComponentWarningIntensity::MEDIUM));
   EXPECT_THAT(warnings1.front().direction, Eq(AreaOfInterest::EGO_FRONT_FAR));
-}
\ No newline at end of file
+}
+
+TEST(SignalParser,
+     GivenOutputSignalForSecondaryDriverTasksSignal_WhenSignalNotEmpty_ThenGeneratesSecondaryDriverTasksSignal)
+{
+  std::set<SignalType> outputSignals{SignalType::SecondaryDriverTasksSignal};
+  std::map<SignalValue, FmuValueWrapper> fakeValues{
+      {SignalValue::SecondaryDriverTasksSignal_IndicatorState, -1},
+      {SignalValue::SecondaryDriverTasksSignal_HornSwitch, true},
+      {SignalValue::SecondaryDriverTasksSignal_HeadLightSwitch, false},
+      {SignalValue::SecondaryDriverTasksSignal_HighBeamLightSwitch, false},
+      {SignalValue::SecondaryDriverTasksSignal_FlasherSwitch, true}};
+
+  std::vector<VariableType> requested_types;
+
+  std::function<FmuValue&(SignalValue, VariableType)> getFmuSignalValue
+      = [&](SignalValue signal_value, VariableType var_type) -> FmuValue&
+  {
+    requested_types.push_back(var_type);
+    return fakeValues.at(signal_value).raw;
+  };
+
+  FakeAgent fakeAgent;
+
+  auto data = std::visit(OutputSignalVisitor(SignalType::SecondaryDriverTasksSignal,
+                                             outputSignals,
+                                             {},
+                                             {},
+                                             ComponentState::Acting,
+                                             &fakeAgent,
+                                             FMI1,
+                                             getFmuSignalValue),
+                         OsiSource{std::monostate{}});
+
+  const auto* signal{dynamic_cast<const SecondaryDriverTasksSignal*>(data.get())};
+  EXPECT_EQ(signal->indicatorState, -1);
+  EXPECT_EQ(signal->hornSwitch, true);
+  EXPECT_EQ(signal->headLightSwitch, false);
+  EXPECT_EQ(signal->highBeamLightSwitch, false);
+  EXPECT_EQ(signal->flasherSwitch, true);
+  EXPECT_EQ(signal->componentState, ComponentState::Acting);
+}
diff --git a/sim/tests/unitTests/components/Algorithm_RouteControl/CMakeLists.txt b/sim/tests/unitTests/components/Algorithm_RouteControl/CMakeLists.txt
index ac52e0b077c784bd492847c84cd25915be70d178..e5386f3eb73b493198c71b68f3a79f4b585a4625 100644
--- a/sim/tests/unitTests/components/Algorithm_RouteControl/CMakeLists.txt
+++ b/sim/tests/unitTests/components/Algorithm_RouteControl/CMakeLists.txt
@@ -1,6 +1,7 @@
 ################################################################################
 # Copyright (c) 2021 ITK Engineering GmbH
 #               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024 Volkswagen AG
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
@@ -14,12 +15,15 @@ set(COMMON_SOURCE_DIR ${OPENPASS_SIMCORE_DIR}/common)
 
 add_openpass_target(
   NAME ${COMPONENT_TEST_NAME} TYPE test COMPONENT module
+  DEFAULT_MAIN
 
   SOURCES
-    tst_ut_RouteControl.cpp
+    RouteControl_ut_test.cpp							
+    ${COMPONENT_SOURCE_DIR}/algorithm_RouteControl_implementation.cpp
     ${COMPONENT_SOURCE_DIR}/routeControl.cpp
 
   HEADERS
+    ${COMPONENT_SOURCE_DIR}/algorithm_RouteControl_implementation.h  
     ${COMPONENT_SOURCE_DIR}/routeControl.h
 
   INCDIRS
@@ -27,7 +31,5 @@ add_openpass_target(
     ${COMMON_SOURCE_DIR}
 
   LIBRARIES
-    Qt5::Core
-    Qt5::Test
     MantleAPI::MantleAPI
 )
diff --git a/sim/tests/unitTests/components/Algorithm_RouteControl/RouteControl_ut_test.cpp b/sim/tests/unitTests/components/Algorithm_RouteControl/RouteControl_ut_test.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..59196da539b34d88ab355530e3a4a21ce6bcc5c9
--- /dev/null
+++ b/sim/tests/unitTests/components/Algorithm_RouteControl/RouteControl_ut_test.cpp
@@ -0,0 +1,259 @@
+/********************************************************************************
+ * Copyright (c) 2024 Volkswagen 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 <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <MantleAPI/Common/orientation.h>
+#include <MantleAPI/Common/poly_line.h>
+#include <MantleAPI/Common/pose.h>
+#include <MantleAPI/Common/spline.h>
+#include <MantleAPI/Common/time_utils.h>
+#include <MantleAPI/Common/trajectory.h>
+#include <MantleAPI/Traffic/control_strategy.h>
+#include <numeric>
+#include <units.h>
+#include <vector>
+
+#include "algorithm_RouteControl_implementation.h"
+#include "common/vector2d.h"
+#include "dontCare.h"
+#include "fakeAgent.h"
+#include "fakeParameter.h"
+#include "fakeScenarioControl.h"
+
+using ::testing::_;
+using ::testing::DontCare;
+using ::testing::DoubleEq;
+using ::testing::DoubleNear;
+using ::testing::Eq;
+using ::testing::Ne;
+using ::testing::NiceMock;
+using ::testing::Return;
+using ::testing::ReturnRef;
+
+//class SignalInterface;
+
+TEST(RouteControl, TestCases)
+{
+  NiceMock<FakeParameter> fakeParameters;
+  std::map<std::string, double> fakeParametersDouble;
+
+  double fakeDrivingAggressiveness = 1.0;
+  double fakePedalsKp = -2.0;
+  double fakePedalsKi = -1.5;
+  double fakePedalsKd = 0.0;
+  double fakeSteeringKp = -18.0;
+  double fakeSteeringKi = -0.6;
+  double fakeSteeringKd = 0.0;
+
+  fakeParametersDouble.insert(std::pair<std::string, double>("DrivingAggressiveness", fakeDrivingAggressiveness));
+  fakeParametersDouble.insert(std::pair<std::string, double>("PedalsKp", fakePedalsKp));
+  fakeParametersDouble.insert(std::pair<std::string, double>("PedalsKi", fakePedalsKi));
+  fakeParametersDouble.insert(std::pair<std::string, double>("PedalsKd", fakePedalsKd));
+  fakeParametersDouble.insert(std::pair<std::string, double>("SteeringKp", fakeSteeringKp));
+  fakeParametersDouble.insert(std::pair<std::string, double>("SteeringKi", fakeSteeringKi));
+  fakeParametersDouble.insert(std::pair<std::string, double>("SteeringKd", fakeSteeringKd));
+
+  ON_CALL(fakeParameters, GetParametersDouble()).WillByDefault(ReturnRef(fakeParametersDouble));
+
+  double fakeMinBrakeTorque = -10000.0;
+  double fakeMass = 1000.0;
+  double fakeMaxEnginePower = 100000.0;
+  double fakeSteeringRatio = 1.0;
+
+  NiceMock<FakeAgent> fakeAgent;
+
+  auto fakeVehicleModelParameters = std::make_shared<mantle_api::VehicleProperties>();
+
+  fakeVehicleModelParameters->properties.insert(
+      std::pair<std::string, std::string>("MaximumEnginePower", std::to_string(fakeMaxEnginePower)));
+  fakeVehicleModelParameters->properties.insert(
+      std::pair<std::string, std::string>("MinimumEngineTorque", std::to_string(fakeMinBrakeTorque)));
+  fakeVehicleModelParameters->properties.insert(
+      std::pair<std::string, std::string>("SteeringRatio", std::to_string(fakeSteeringRatio)));
+  fakeVehicleModelParameters->mass = units::mass::kilogram_t(fakeMass);
+
+  ON_CALL(fakeAgent, GetVehicleModelParameters()).WillByDefault(Return(fakeVehicleModelParameters));
+
+  // fake trajectory
+  int pointCount = 120;
+  units::length::meter_t prevPosX = 20.0_m;
+  units::velocity::meters_per_second_t longVelocityBasis = 10_mps;  // in m/s // in s
+  units::time::second_t cycleTime = 0.01_s;
+  mantle_api::PolyLine fakePolyLine;
+
+  for (int j = 0; j < pointCount; j++)
+  {
+    auto tPos = j * cycleTime;  // in s
+    auto longVelocity = longVelocityBasis;
+    if ((j > 10) && (j < 15))  // velocity decrease
+    {
+      longVelocity *= 0.7;
+    }
+    if ((j > 60) && (j < 65))  // velocity increase
+    {
+      longVelocity *= 1.3;
+    }
+    auto posX = prevPosX + longVelocity * cycleTime;
+    mantle_api::Pose fakePose{{posX, 0_m, 0_m}, {0_rad, 0_rad, 0_rad}};
+    mantle_api::PolyLinePoint fakePolyLinePoint{fakePose, tPos};
+    fakePolyLine.push_back(fakePolyLinePoint);
+    prevPosX = posX;
+  }
+  mantle_api::Trajectory fakeCoordinates = {"", fakePolyLine};
+
+  auto followTrajectoryControlStrategy = std::make_shared<mantle_api::FollowTrajectoryControlStrategy>();
+  followTrajectoryControlStrategy->trajectory = fakeCoordinates;
+  std::vector<std::shared_ptr<mantle_api::ControlStrategy>> strategies{followTrajectoryControlStrategy};
+
+  const std::shared_ptr<NiceMock<FakeScenarioControl>> fakeScenarioControl{
+      std::make_shared<NiceMock<FakeScenarioControl>>()};
+  ON_CALL(*fakeScenarioControl, GetStrategies(mantle_api::ControlStrategyType::kFollowTrajectory))
+      .WillByDefault(Return(strategies));
+
+  ON_CALL(fakeAgent, GetPositionY()).WillByDefault(Return(0.0_m));
+  ON_CALL(fakeAgent, GetYaw()).WillByDefault(Return(0.0_rad));
+
+  int nbtests = 6;
+  for (int i = 1; i <= nbtests; i++)
+  {
+    int cycleMin = 0;
+    int cycleMax = 0;
+    units::length::meter_t basePosX;
+    units::velocity::meters_per_second_t velX;
+
+    // TC1: Neither acceleration nor braking at start
+    if (i == 1)
+    {
+      cycleMin = 0;
+      cycleMax = 0;
+      basePosX = 20_m;
+      velX = 10_mps;
+    }
+    // TC2: Acceleration at start
+    if (i == 2)
+    {
+      cycleMin = 0;
+      cycleMax = 0;
+      basePosX = 20_m;
+      velX = 9_mps;
+    }
+    // TC3: Braking at start
+    if (i == 3)
+    {
+      cycleMin = 0;
+      cycleMax = 0;
+      basePosX = 20_m;
+      velX = 11_mps;
+    }
+    // TC4
+    if (i == 4)
+    {
+      cycleMin = 0;
+      cycleMax = 10;
+      basePosX = 20_m;
+      velX = 10_mps;
+    }
+    // TC5
+    if (i == 5)
+    {
+      cycleMin = 9;
+      cycleMax = 19;
+      basePosX = 21.10_m;
+      velX = 10_mps;
+    }
+    // TC6
+    if (i == 6)
+    {
+      cycleMin = 58;
+      cycleMax = 68;
+      basePosX = 25.78_m;
+      velX = 10_mps;
+    }
+
+    ON_CALL(fakeAgent, GetVelocity(_)).WillByDefault(Return(Common::Vector2d{velX, 0.0_mps}));
+    int fakeCycleTime = 10;  // in ms
+    Algorithm_Routecontrol_Implementation AlgoRouteControl_implementation("Algorithm_RouteControl",
+                                                                          false,
+                                                                          DontCare<int>(),
+                                                                          DontCare<int>(),
+                                                                          DontCare<int>(),
+                                                                          fakeCycleTime,
+                                                                          nullptr,
+                                                                          nullptr,
+                                                                          &fakeParameters,
+                                                                          nullptr,
+                                                                          nullptr,
+                                                                          &fakeAgent,
+                                                                          fakeScenarioControl);
+
+    std::shared_ptr<SignalInterface const> outputSignalLong;
+    std::shared_ptr<SignalInterface const> outputSignalSteer;
+
+    int fakeTimeMs = 0;
+    auto curPosX = basePosX;
+
+    AlgoRouteControl_implementation.UpdateInput(0, nullptr, 0);
+    for (int k = cycleMin; k < cycleMax + 1; k++)
+    {
+      ON_CALL(fakeAgent, GetPositionX()).WillByDefault(Return(curPosX));
+
+      fakeTimeMs = k * 10;  // in ms
+      AlgoRouteControl_implementation.Trigger(fakeTimeMs);
+      curPosX += velX * cycleTime;
+    }
+    AlgoRouteControl_implementation.UpdateOutput(0, outputSignalLong, 0);
+    AlgoRouteControl_implementation.UpdateOutput(1, outputSignalSteer, 0);
+    auto resultLongitudinalSignal = std::dynamic_pointer_cast<LongitudinalSignal const>(outputSignalLong);
+    auto resultSteeringSignal = std::dynamic_pointer_cast<SteeringSignal const>(outputSignalSteer);
+
+    // Test results
+    // TC1: Neither acceleration nor braking at start
+    if (i == 1)
+    {
+      EXPECT_THAT(resultLongitudinalSignal, Ne(nullptr));
+      EXPECT_THAT(resultLongitudinalSignal->accPedalPos, DoubleNear(0.0, 1e-3));
+      EXPECT_THAT(resultLongitudinalSignal->brakePedalPos, DoubleNear(0.0, 1e-3));
+      EXPECT_THAT(resultLongitudinalSignal->gear, Eq(1));
+      EXPECT_THAT(resultSteeringSignal, Ne(nullptr));
+      EXPECT_THAT(resultSteeringSignal->steeringWheelAngle.value(), DoubleEq(0.0));
+    }
+    // TC2: Acceleration at start
+    if (i == 2)
+    {
+      EXPECT_THAT(resultLongitudinalSignal->accPedalPos, DoubleEq(1.0));
+      EXPECT_THAT(resultLongitudinalSignal->brakePedalPos, DoubleNear(0.0, 1e-3));
+    }
+    // TC3: Braking at start
+    if (i == 3)
+    {
+      EXPECT_THAT(resultLongitudinalSignal->accPedalPos, DoubleNear(0.0, 1e-3));
+      EXPECT_THAT(resultLongitudinalSignal->brakePedalPos, DoubleNear(0.824318181818, 1e-3));
+    }
+    // TC4
+    if (i == 4)
+    {
+      EXPECT_THAT(resultLongitudinalSignal->accPedalPos, DoubleNear(0.0, 1e-3));
+      EXPECT_THAT(resultLongitudinalSignal->brakePedalPos, DoubleNear(1.0, 1e-3));
+    }
+    // TC5
+    if (i == 5)
+    {
+      EXPECT_THAT(resultLongitudinalSignal->accPedalPos, DoubleNear(0.0, 1e-3));
+      EXPECT_THAT(resultLongitudinalSignal->brakePedalPos, DoubleNear(0.0405, 1e-3));
+    }
+    // TC6
+    if (i == 6)
+    {
+      EXPECT_THAT(resultLongitudinalSignal->accPedalPos, DoubleNear(1.0, 1e-3));
+      EXPECT_THAT(resultLongitudinalSignal->brakePedalPos, DoubleNear(0.0, 1e-3));
+    }
+  }
+}
diff --git a/sim/tests/unitTests/components/Algorithm_RouteControl/tst_ut_RouteControl.cpp b/sim/tests/unitTests/components/Algorithm_RouteControl/tst_ut_RouteControl.cpp
deleted file mode 100644
index e7bda343b4a7a339968f02b512b951b91c817a11..0000000000000000000000000000000000000000
--- a/sim/tests/unitTests/components/Algorithm_RouteControl/tst_ut_RouteControl.cpp
+++ /dev/null
@@ -1,310 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021 ITK Engineering GmbH
- *               2024 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 <QString>
-#include <QtTest>
-
-#include "routeControl.h"
-
-using namespace Common;
-
-class UT_RouteControl : public QObject
-{
-  Q_OBJECT
-
-public:
-  UT_RouteControl() = default;
-  ~UT_RouteControl() override = default;
-
-private Q_SLOTS:
-  void testCase_data();
-  void testCase();
-
-private:
-  void TestCaseSequence1(double lenLeft, double lenRight, double lenFront, double drivingAggressivity);
-  void TestCaseSequence2(double lenLeft, double lenRight, double lenFront, double drivingAggressivity);
-  void TestCaseSequence3(double lenLeft, double lenRight, double lenFront, double drivingAggressivity);
-  void TestCaseSequence4(double lenLeft, double lenRight, double lenFront, double drivingAggressivity);
-  void TestCaseSequence5(double lenLeft, double lenRight, double lenFront, double drivingAggressivity);
-  void TestCaseSequence6(double lenLeft, double lenRight, double lenFront, double drivingAggressivity);
-};
-
-std::vector<WaypointData> *CreateWayPointData(units::time::second_t cycleTime,
-                                              units::velocity::meters_per_second_t longVelocity)
-{
-  int pointCount = 120;
-  auto *pWaypoints = new std::vector<WaypointData>(pointCount);
-  std::vector<WaypointData> &waypointsRef = *pWaypoints;
-
-  units::length::meter_t prevPosX = 20.0_m;
-  for (int i = 0; i < pointCount; ++i)
-  {
-    waypointsRef[i].time = i * 10_ms;  // in ms
-    waypointsRef[i].longVelocity = longVelocity;
-    if ((i > 10) && (i < 15))  // introduce velocity decrease
-    {
-      waypointsRef[i].longVelocity *= 0.7;
-    }
-
-    if ((i > 60) && (i < 65))  // introduce velocity increase
-    {
-      waypointsRef[i].longVelocity *= 1.3;
-    }
-    waypointsRef[i].position.x = prevPosX + waypointsRef[i].longVelocity * cycleTime;
-    waypointsRef[i].position.y = 0.0_m;
-    prevPosX = waypointsRef[i].position.x;
-    // qDebug("%.0f;%.2f;%.2f;%.2f", waypointsRef[i].time, waypointsRef[i].position.x, waypointsRef[i].position.y,
-    // waypointsRef[i].longVelocity);
-  }
-
-  return pWaypoints;
-}
-
-void UT_RouteControl::testCase_data()
-{
-  // inputs
-  QTest::addColumn<double>("cycleMin");
-  QTest::addColumn<double>("cycleMax");
-  QTest::addColumn<double>("posX");
-  QTest::addColumn<double>("posY");
-  QTest::addColumn<double>("yawAngle");
-  QTest::addColumn<double>("longVelocity");
-
-  // fixed parameters
-  QTest::addColumn<double>("mass");
-  QTest::addColumn<double>("enginePowerMax");
-  QTest::addColumn<double>("brakeTorqueMin");
-  QTest::addColumn<double>("drivingAggressivity");
-
-  // outputs
-  QTest::addColumn<double>("expectedThrottle");
-  QTest::addColumn<double>("expectedBrake");
-  QTest::addColumn<double>("expectedSteer");
-
-  double mass = 1000.0;
-  double enginePowerMax = 100000.0;
-  double brakeTorqueMin = -10000.0;
-  double drivingAggressivity = 1.0;
-
-  TestCaseSequence1(mass, enginePowerMax, brakeTorqueMin, drivingAggressivity);
-  TestCaseSequence2(mass, enginePowerMax, brakeTorqueMin, drivingAggressivity);
-  TestCaseSequence3(mass, enginePowerMax, brakeTorqueMin, drivingAggressivity);
-  TestCaseSequence4(mass, enginePowerMax, brakeTorqueMin, drivingAggressivity);
-  TestCaseSequence5(mass, enginePowerMax, brakeTorqueMin, drivingAggressivity);
-  TestCaseSequence6(mass, enginePowerMax, brakeTorqueMin, drivingAggressivity);
-}
-
-void UT_RouteControl::TestCaseSequence1(double mass,
-                                        double enginePowerMax,
-                                        double brakeTorqueMin,
-                                        double drivingAggressivity)
-{
-  QString testCaseTitle = "TC1";
-
-  // inputs
-  double cycleMin = 0, cycleMax = 0;
-  double posX = 20.0, posY = 0.0;
-  double yawAngle = 0.0;
-  double longVelocity = 10.0;
-
-  // expected outputs
-  double expectedThrottle = 0.0;
-  double expectedBrake = 0.0;
-  double expectedSteer = 0.0;
-
-  QTest::newRow(testCaseTitle.toLatin1())
-      << cycleMin << cycleMax << posX << posY << yawAngle << longVelocity  // inputs
-      << mass << enginePowerMax << brakeTorqueMin << drivingAggressivity   // fixed values
-      << expectedThrottle << expectedBrake << expectedSteer;               // outputs
-}
-
-void UT_RouteControl::TestCaseSequence2(double mass,
-                                        double enginePowerMax,
-                                        double brakeTorqueMin,
-                                        double drivingAggressivity)
-{
-  QString testCaseTitle = "TC2";
-
-  // inputs
-  double cycleMin = 0, cycleMax = 0;
-  double posX = 20.0, posY = 0.0;
-  double yawAngle = 0.0;
-  double longVelocity = 9.0;
-
-  // expected outputs
-  double expectedThrottle = 1.0;
-  double expectedBrake = 0.0;
-  double expectedSteer = 0.0;
-
-  QTest::newRow(testCaseTitle.toLatin1())
-      << cycleMin << cycleMax << posX << posY << yawAngle << longVelocity  // inputs
-      << mass << enginePowerMax << brakeTorqueMin << drivingAggressivity   // fixed values
-      << expectedThrottle << expectedBrake << expectedSteer;               // outputs
-}
-
-void UT_RouteControl::TestCaseSequence3(double mass,
-                                        double enginePowerMax,
-                                        double brakeTorqueMin,
-                                        double drivingAggressivity)
-{
-  QString testCaseTitle = "TC3";
-
-  // inputs
-  double cycleMin = 0, cycleMax = 0;
-  double posX = 20.0, posY = 0.0;
-  double yawAngle = 0.0;
-  double longVelocity = 11.0;
-
-  // expected outputs
-  double expectedThrottle = 0.0;
-  double expectedBrake = 0.824318181818;
-  double expectedSteer = 0.0;
-
-  QTest::newRow(testCaseTitle.toLatin1())
-      << cycleMin << cycleMax << posX << posY << yawAngle << longVelocity  // inputs
-      << mass << enginePowerMax << brakeTorqueMin << drivingAggressivity   // fixed values
-      << expectedThrottle << expectedBrake << expectedSteer;               // outputs
-}
-
-void UT_RouteControl::TestCaseSequence4(double mass,
-                                        double enginePowerMax,
-                                        double brakeTorqueMin,
-                                        double drivingAggressivity)
-{
-  QString testCaseTitle = "TC4";
-
-  // inputs
-  double cycleMin = 0, cycleMax = 10;
-  double posX = 20.0, posY = 0.0;
-  double yawAngle = 0.0;
-  double longVelocity = 10.0;
-
-  // expected outputs
-  double expectedThrottle = 0.0;
-  double expectedBrake = 0.0;
-  double expectedSteer = 0.0;
-
-  QTest::newRow(testCaseTitle.toLatin1())
-      << cycleMin << cycleMax << posX << posY << yawAngle << longVelocity  // inputs
-      << mass << enginePowerMax << brakeTorqueMin << drivingAggressivity   // fixed values
-      << expectedThrottle << expectedBrake << expectedSteer;               // outputs
-}
-
-void UT_RouteControl::TestCaseSequence5(double mass,
-                                        double enginePowerMax,
-                                        double brakeTorqueMin,
-                                        double drivingAggressivity)
-{
-  QString testCaseTitle = "TC5";
-
-  // inputs
-  double cycleMin = 9, cycleMax = 19;
-  double posX = 21.10, posY = 0.0;
-  double yawAngle = 0.0;
-  double longVelocity = 10.0;
-
-  // expected outputs
-  double expectedThrottle = 0.0;
-  double expectedBrake = 0.06075;
-  double expectedSteer = 0.0;
-
-  QTest::newRow(testCaseTitle.toLatin1())
-      << cycleMin << cycleMax << posX << posY << yawAngle << longVelocity  // inputs
-      << mass << enginePowerMax << brakeTorqueMin << drivingAggressivity   // fixed values
-      << expectedThrottle << expectedBrake << expectedSteer;               // outputs
-}
-
-void UT_RouteControl::TestCaseSequence6(double mass,
-                                        double enginePowerMax,
-                                        double brakeTorqueMin,
-                                        double drivingAggressivity)
-{
-  QString testCaseTitle = "TC6";
-
-  // inputs
-  double cycleMin = 58, cycleMax = 68;
-  double posX = 25.78, posY = 0.0;
-  double yawAngle = 0.0;
-  double longVelocity = 10.0;
-
-  // expected outputs
-  double expectedThrottle = 1.0;
-  double expectedBrake = 0.0;
-  double expectedSteer = 0.0;
-
-  QTest::newRow(testCaseTitle.toLatin1())
-      << cycleMin << cycleMax << posX << posY << yawAngle << longVelocity  // inputs
-      << mass << enginePowerMax << brakeTorqueMin << drivingAggressivity   // fixed values
-      << expectedThrottle << expectedBrake << expectedSteer;               // outputs
-}
-
-void UT_RouteControl::testCase()
-{
-  // inputs
-  QFETCH(double, cycleMin);
-  QFETCH(double, cycleMax);
-  QFETCH(double, posX);
-  QFETCH(double, posY);
-  QFETCH(double, yawAngle);
-  QFETCH(double, longVelocity);
-
-  // fixed values
-  QFETCH(double, mass);
-  QFETCH(double, enginePowerMax);
-  QFETCH(double, brakeTorqueMin);
-  QFETCH(double, drivingAggressivity);
-
-  // outputs
-  QFETCH(double, expectedThrottle);
-  QFETCH(double, expectedBrake);
-  QFETCH(double, expectedSteer);
-
-  units::time::second_t cycleTime = 0.01_s;
-  RouteControl routeControl(cycleTime);
-
-  routeControl.SetVehicleProperties(units::mass::kilogram_t(mass),
-                                    enginePowerMax,
-                                    units::torque::newton_meter_t(brakeTorqueMin),
-                                    drivingAggressivity);
-
-  std::vector<WaypointData> *pWaypoints = CreateWayPointData(cycleTime, 10_mps);
-  routeControl.SetRequestedTrajectory(*pWaypoints);
-
-  auto curPosX = units::length::meter_t(posX);
-  for (auto i = cycleMin; i < cycleMax + 1; i++)
-  {
-    units::time::millisecond_t time = i * 10_ms;
-    routeControl.Perform(time,
-                         curPosX,
-                         units::length::meter_t(posY),
-                         units::angle::radian_t(yawAngle),
-                         units::velocity::meters_per_second_t(longVelocity));
-    qDebug("time %d, pos(%.2f, %.2f), yaw %.2f, velocity %.4f, Throttle %.12f, Brake %.12f, Steer %.12f",
-           time,
-           curPosX,
-           posY,
-           yawAngle,
-           longVelocity,
-           routeControl.GetThrottlePedal(),
-           routeControl.GetBrakePedal(),
-           routeControl.GetFrontWheelAngle());
-
-    curPosX += units::velocity::meters_per_second_t(longVelocity) * cycleTime;
-  }
-
-  QCOMPARE(routeControl.GetThrottlePedal(), expectedThrottle);
-  QCOMPARE(routeControl.GetBrakePedal(), expectedBrake);
-  QCOMPARE(routeControl.GetFrontWheelAngle().value(), expectedSteer);
-}
-
-QTEST_MAIN(UT_RouteControl);
-
-#include <tst_ut_RouteControl.moc>
diff --git a/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPAlgorithmTests.cpp b/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPAlgorithmTests.cpp
index 34d5555a48087f516946356a381e71ee1affcad6..293cca1f2800cbd9d9f3b0b3fba56c1feb093e93 100644
--- a/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPAlgorithmTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPAlgorithmTests.cpp
@@ -630,7 +630,7 @@ TEST(SSPAlgorithmTests, FmuConnectorTest)
   std::get<FMI2>(fmuVariables)
       .emplace("integer",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   fmi2_integer_t integer{42};
   auto integerValue = FmuValue{.intValue = integer};
@@ -654,7 +654,7 @@ TEST(SSPAlgorithmTests, RealConnectorTest)
   std::get<FMI2>(fmuVariables)
       .emplace("double",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Double, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Double, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   fmi2_real_t real{42};
   auto realValue = FmuValue{.realValue = real};
@@ -678,7 +678,7 @@ TEST(SSPAlgorithmTests, IntegerConnectorWithVisitor)
   std::get<FMI2>(fmuVariables)
       .emplace("integer",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   fmi2_integer_t integer{42};
   auto integerValue = FmuValue{.intValue = integer};
@@ -707,7 +707,7 @@ TEST(SSPAlgorithmTests, RealFmuConnectorWithVisitor)
   std::get<FMI2>(fmuVariables)
       .emplace("real",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   fmi2_real_t real{42};
   auto realValue = FmuValue{.realValue = real};
@@ -736,15 +736,15 @@ TEST(SSPAlgorithmTests, OSMPConnectorTest)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   auto fakeFmuWrapper = std::make_shared<FakeFmuWrapper>();
 
@@ -787,54 +787,54 @@ TEST(SSPAlgorithmTests, OSMPConnectorWithVisitor)
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataIn.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataIn.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataIn.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataOut.base.lo",
                *std::make_shared<FmuVariable2>(
-                   3, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   3, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataOut.base.hi",
                *std::make_shared<FmuVariable2>(
-                   4, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   4, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataOut.size",
                *std::make_shared<FmuVariable2>(
-                   5, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   5, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2In.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2In.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2In.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2Out.base.lo",
                *std::make_shared<FmuVariable2>(
-                   3, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   3, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2Out.base.hi",
                *std::make_shared<FmuVariable2>(
-                   4, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   4, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2Out.size",
                *std::make_shared<FmuVariable2>(
-                   5, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   5, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   auto fakeFmuWrapper = std::make_shared<NiceMock<FakeFmuWrapper>>();
   auto fakeFmuWrapper2 = std::make_shared<NiceMock<FakeFmuWrapper>>();
@@ -1005,54 +1005,54 @@ TEST(SSPAlgorithmTests, TestPropagateDataVisitor)
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataIn.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataIn.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataIn.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataOut.base.lo",
                *std::make_shared<FmuVariable2>(
-                   3, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   3, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataOut.base.hi",
                *std::make_shared<FmuVariable2>(
-                   4, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   4, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables1)
       .emplace("SensorDataOut.size",
                *std::make_shared<FmuVariable2>(
-                   5, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   5, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2In.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2In.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2In.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2Out.base.lo",
                *std::make_shared<FmuVariable2>(
-                   3, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   3, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2Out.base.hi",
                *std::make_shared<FmuVariable2>(
-                   4, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   4, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables2)
       .emplace("SensorData2Out.size",
                *std::make_shared<FmuVariable2>(
-                   5, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   5, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   auto fakeFmuWrapper = std::make_shared<NiceMock<FakeFmuWrapper>>();
   auto fakeFmuWrapper2 = std::make_shared<NiceMock<FakeFmuWrapper>>();
@@ -1290,15 +1290,15 @@ TEST(SSPAlgorithmTests, OSMPConnectorSensorData)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   auto fakeFmuWrapper = std::make_shared<FakeFmuWrapper>();
 
diff --git a/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPFileHelperTests.cpp b/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPFileHelperTests.cpp
index 371984dbe4182b84c60ade4710699463fe9220c8..97928e92d4cbc33758f039e44b2c6a759e23d0fe 100644
--- a/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPFileHelperTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPFileHelperTests.cpp
@@ -117,15 +117,15 @@ TEST_F(SSPFileHelperTests, WriteOutputJsonSensorData)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   auto fakeFmuWrapper = std::make_shared<FakeFmuWrapper>();
 
@@ -235,15 +235,15 @@ TEST_F(SSPFileHelperTests, WriteTraceSensorData)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   auto fakeFmuWrapper = std::make_shared<FakeFmuWrapper>();
 
@@ -371,15 +371,15 @@ TEST_F(SSPFileHelperTests, WriteBinaryTraceFileNameCompleteTest)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   auto fakeFmuWrapper = std::make_shared<FakeFmuWrapper>();
 
diff --git a/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPLoggingTests.cpp b/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPLoggingTests.cpp
index 2286cd726562465b49b6937a001b4c1aa1548592..4dac4697e5b843f383c5eaafa2d5b4402a36b23e 100644
--- a/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPLoggingTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPLoggingTests.cpp
@@ -198,15 +198,15 @@ TEST_F(SSPLoggingTests, VisistTestNoError)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   auto fakeFmuWrapper = std::make_shared<FakeFmuWrapper>();
 
diff --git a/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPNetworkTests.cpp b/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPNetworkTests.cpp
index 2179a81821e25a3ae2bea8e471b954fddff5447f..21a3f2dfc77427cc5f3023192037c6d9cb2e159b 100644
--- a/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPNetworkTests.cpp
+++ b/sim/tests/unitTests/components/Algorithm_SspWrapper/SSPNetworkTests.cpp
@@ -114,15 +114,15 @@ TEST_F(SSPNetworkTest, UpdateInput_OneComponent_ExpectCallsToFmuInterface)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   EXPECT_CALL(*fmuWrapperInterface, GetFmuVariables()).WillRepeatedly(ReturnRef(fmuVariables));
 
@@ -174,15 +174,15 @@ TEST_F(SSPNetworkTest, UpdateInput_OneComponentUpdateInputCallesTwice_InitOnlyCa
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   EXPECT_CALL(*fmuWrapperInterface, GetFmuVariables()).WillRepeatedly(ReturnRef(fmuVariables));
 
@@ -235,15 +235,15 @@ TEST_F(SSPNetworkTest, UpdateInput_NoConnector_ExpectNoUpdateInput)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   EXPECT_CALL(*fmuWrapperInterface, GetFmuVariables()).WillRepeatedly(ReturnRef(fmuVariables));
 
@@ -293,15 +293,15 @@ TEST_F(SSPNetworkTest, Trigger_OneComponent_ExpectCallsToFmuInterface_TriggerWit
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   EXPECT_CALL(*fmuWrapperInterface, GetFmuVariables()).WillRepeatedly(ReturnRef(fmuVariables));
 
@@ -349,15 +349,15 @@ TEST_F(SSPNetworkTest, Trigger_OneComponentTriggerCallsTwice_InitOnlyCalledOnce)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorData.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
 
   EXPECT_CALL(*fmuWrapperInterface, GetFmuVariables()).WillRepeatedly(ReturnRef(fmuVariables));
 
@@ -409,15 +409,15 @@ TEST_F(SSPNetworkTest, UpdateOutput_OneComponent_ExpectCallsToFmuInterface)
   std::get<FMI2>(fmuVariables)
       .emplace("SensorDataOut.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorDataOut.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorDataOut.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete));
 
   EXPECT_CALL(*fmuWrapperInterface, GetFmuVariables()).WillRepeatedly(ReturnRef(fmuVariables));
 
@@ -469,15 +469,15 @@ TEST_F(SSPNetworkTest, UpdateOutput_OneComponentUpdateOutputFmuWrapperSetsSignal
   std::get<FMI2>(fmuVariables)
       .emplace("SensorDataOut.base.lo",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorDataOut.base.hi",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("SensorDataOut.size",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete));
 
   EXPECT_CALL(*fmuWrapperInterface, GetFmuVariables()).WillRepeatedly(ReturnRef(fmuVariables));
 
diff --git a/sim/tests/unitTests/components/Algorithm_SspWrapper/SimpleAffineFMU.cpp b/sim/tests/unitTests/components/Algorithm_SspWrapper/SimpleAffineFMU.cpp
index 2c251d6d6a7b4a4c4383c5621aedec4af1ee1db2..b3b99410234b4609860994ba3dcd293c1565b80e 100644
--- a/sim/tests/unitTests/components/Algorithm_SspWrapper/SimpleAffineFMU.cpp
+++ b/sim/tests/unitTests/components/Algorithm_SspWrapper/SimpleAffineFMU.cpp
@@ -1,5 +1,5 @@
 /********************************************************************************
- * Copyright (c) 2021-2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+ * Copyright (c) 2021-2024 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
@@ -54,19 +54,19 @@ ssp::SimpleAffineFMU::SimpleAffineFMU(double factor, int priority) : factor(fact
   std::get<FMI2>(fmuVariables)
       .emplace("fmu" + std::to_string(static_cast<int>(factor)) + "_rate",
                *std::make_shared<FmuVariable2>(
-                   0, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   0, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("fmu" + std::to_string(static_cast<int>(factor)) + "_offset",
                *std::make_shared<FmuVariable2>(
-                   1, VariableType::Int, fmi2_causality_enu_input, fmi2_variability_enu_discrete));
+                   1, VariableType::Int, "", fmi2_causality_enu_input, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("fmu" + std::to_string(static_cast<int>(factor)) + "_result",
                *std::make_shared<FmuVariable2>(
-                   2, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete));
+                   2, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete));
   std::get<FMI2>(fmuVariables)
       .emplace("fmu" + std::to_string(static_cast<int>(factor)) + "_result2",
                *std::make_shared<FmuVariable2>(
-                   3, VariableType::Int, fmi2_causality_enu_output, fmi2_variability_enu_discrete));
+                   3, VariableType::Int, "", fmi2_causality_enu_output, fmi2_variability_enu_discrete));
 }
 void ssp::SimpleAffineFMU::UpdateInput(size_t index, double data)
 {
diff --git a/sim/tests/unitTests/components/Dynamics_Chassis/Chassis_Tests.cpp b/sim/tests/unitTests/components/Dynamics_Chassis/Chassis_Tests.cpp
index c122fbab05d7805e4a6ffc05ce73fa68807d0c69..fb1243cd65bce604fc5b437ff90046a6b6eee8b8 100644
--- a/sim/tests/unitTests/components/Dynamics_Chassis/Chassis_Tests.cpp
+++ b/sim/tests/unitTests/components/Dynamics_Chassis/Chassis_Tests.cpp
@@ -15,7 +15,6 @@
 #include "WheelOscillation.h"
 #include "fakeAgent.h"
 
-
 TEST(Dynamics, WheelOscillation)
 {
   for (unsigned int run = 1; run < 10; run++)
diff --git a/sim/tests/unitTests/components/Dynamics_MotionModel/MotionModel_Tests.cpp b/sim/tests/unitTests/components/Dynamics_MotionModel/MotionModel_Tests.cpp
index 30246ab009495f49de412808d23e3372d4821b0b..c26bc2987cc9e27d33c5e7b7d6f29449523e2393 100644
--- a/sim/tests/unitTests/components/Dynamics_MotionModel/MotionModel_Tests.cpp
+++ b/sim/tests/unitTests/components/Dynamics_MotionModel/MotionModel_Tests.cpp
@@ -208,4 +208,4 @@ TEST(MotionModel, CheckVehicleAcceleration)
                      * dynamicsSignal->dynamicsInformation.yawRate.value() * (fakeYPositionCOG)),
               std::accumulate(fakeLateralTireForce.begin(), fakeLateralTireForce.end(), 0.0) / fakeMass,
               (std::accumulate(fakeLateralTireForce.begin(), fakeLateralTireForce.end(), 0.0) / fakeMass) * 0.01);
-}
\ No newline at end of file
+}
diff --git a/sim/tests/unitTests/components/Dynamics_TireModel/CMakeLists.txt b/sim/tests/unitTests/components/Dynamics_TireModel/CMakeLists.txt
index 9920347a4312f6e253eb1e7fd7643c78cda165e3..c8bc4e1b862998e12321750b67975eb13cbe8849 100644
--- a/sim/tests/unitTests/components/Dynamics_TireModel/CMakeLists.txt
+++ b/sim/tests/unitTests/components/Dynamics_TireModel/CMakeLists.txt
@@ -1,5 +1,4 @@
 ################################################################################
-
 # Copyright (c) 2023-2024 Volkswagen AG
 #               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 #
@@ -28,8 +27,7 @@ add_openpass_target(
 
   INCDIRS
     ${COMPONENT_SOURCE_DIR}
-	
+
   LIBRARIES
     MantleAPI::MantleAPI
 )
-
diff --git a/sim/tests/unitTests/components/Dynamics_TireModel/Tiremodel_Tests.cpp b/sim/tests/unitTests/components/Dynamics_TireModel/Tiremodel_Tests.cpp
index 79db14e181302481d53244c1364b8845597d7f44..ca37dbbc4412f4218033a0cae44330c7e8238066 100644
--- a/sim/tests/unitTests/components/Dynamics_TireModel/Tiremodel_Tests.cpp
+++ b/sim/tests/unitTests/components/Dynamics_TireModel/Tiremodel_Tests.cpp
@@ -353,4 +353,4 @@ TEST(TMEASYTireModel, CheckTireModelImplementation)
                    std::static_pointer_cast<SignalVectorDouble const>(outputSignal)->value[1]);
   ASSERT_DOUBLE_EQ(std::static_pointer_cast<SignalVectorDouble const>(outputSignal)->value[1],
                    std::static_pointer_cast<SignalVectorDouble const>(outputSignal)->value[2]);
-}
\ No newline at end of file
+}
diff --git a/sim/tests/unitTests/core/opSimulation/modules/Observation_Log/CMakeLists.txt b/sim/tests/unitTests/core/opSimulation/modules/Observation_Log/CMakeLists.txt
index 03921fd6227eee1d3e1a5fc1a90f44414cf354e4..30f8de3c33fb5810975f30b1f7d70f158f27788b 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/Observation_Log/CMakeLists.txt
+++ b/sim/tests/unitTests/core/opSimulation/modules/Observation_Log/CMakeLists.txt
@@ -20,8 +20,6 @@ add_openpass_target(
     ${COMPONENT_SOURCE_DIR}/observation_logImplementation.cpp
     ${COMPONENT_SOURCE_DIR}/observationCyclics.cpp
     ${COMPONENT_SOURCE_DIR}/observationFileHandler.cpp
-    ${COMPONENT_SOURCE_DIR}/runStatistic.cpp
-    ${COMPONENT_SOURCE_DIR}/runStatisticCalculation.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/directories.cpp
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/importer/importerCommon.cpp
     ${OPENPASS_SIMCORE_DIR}/core/common/log.cpp
@@ -30,8 +28,6 @@ add_openpass_target(
     ${COMPONENT_SOURCE_DIR}/observation_logImplementation.h
     ${COMPONENT_SOURCE_DIR}/observationCyclics.h
     ${COMPONENT_SOURCE_DIR}/observationFileHandler.h
-    ${COMPONENT_SOURCE_DIR}/runStatistic.h
-    ${COMPONENT_SOURCE_DIR}/runStatisticCalculation.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/framework/directories.h
     ${OPENPASS_SIMCORE_DIR}/core/opSimulation/importer/importerCommon.h
     ${OPENPASS_SIMCORE_DIR}/core/common/log.h
diff --git a/sim/tests/unitTests/core/opSimulation/modules/Observation_Log/observationLog_Tests.cpp b/sim/tests/unitTests/core/opSimulation/modules/Observation_Log/observationLog_Tests.cpp
index 14c29d7c391cec4d4b9d85580e1a6029ea4c5c12..1e3e72686b03c6baecced917b1d3161036f23d4e 100644
--- a/sim/tests/unitTests/core/opSimulation/modules/Observation_Log/observationLog_Tests.cpp
+++ b/sim/tests/unitTests/core/opSimulation/modules/Observation_Log/observationLog_Tests.cpp
@@ -30,88 +30,9 @@
 #include "include/dataBufferInterface.h"
 #include "observationCyclics.h"
 #include "observation_logImplementation.h"
-#include "runStatistic.h"
-#include "runStatisticCalculation.h"
 
-using ::testing::ByMove;
 using ::testing::ElementsAre;
 using ::testing::Eq;
-using ::testing::NiceMock;
-using ::testing::Not;
-using ::testing::Optional;
-using ::testing::Pair;
-using ::testing::Return;
-using ::testing::SizeIs;
-
-TEST(ObservationLog_GetAgentValues, AgentWithoutMatchingKeyInBuffer_DoesntCrash)
-{
-  const Keys fakeAgentIds{"0"};
-  const Key key{"theKey"};
-  const Key otherKey{"otherKey"};
-
-  std::unique_ptr<NiceMock<FakeCyclicResult>> emptyCyclicResult = std::make_unique<NiceMock<FakeCyclicResult>>();
-  ON_CALL(*emptyCyclicResult, size()).WillByDefault(Return(0));
-
-  NiceMock<FakeDataBuffer> buffer;
-  EXPECT_CALL(buffer, GetKeys("Statics/Agents")).WillRepeatedly(Return(fakeAgentIds));
-  ON_CALL(buffer, GetCyclic(Optional(0), Not(key))).WillByDefault(Return(ByMove(std::move(emptyCyclicResult))));
-
-  std::map<std::string, double> result;
-
-  ASSERT_NO_THROW(GetAgentValues(otherKey, &buffer, result));
-  ASSERT_THAT(result, SizeIs(0));
-}
-
-TEST(ObservationLog_GetAgentValues, MultipleAgentsInBuffer_StoresCorrectResult)
-{
-  const Keys fakeAgentIds{"0", "1"};
-  const Key key{"theKey"};
-
-  const CyclicRow row0{0, key, 1.0};
-  const CyclicRow row1{1, key, 2.0};
-  const CyclicRowRefs rowRefs0{row0};
-  const CyclicRowRefs rowRefs1{row1};
-
-  std::unique_ptr<NiceMock<FakeCyclicResult>> cyclicResult0 = std::make_unique<NiceMock<FakeCyclicResult>>();
-  std::unique_ptr<NiceMock<FakeCyclicResult>> cyclicResult1 = std::make_unique<NiceMock<FakeCyclicResult>>();
-  ON_CALL(*cyclicResult0, size()).WillByDefault(Return(1));
-  ON_CALL(*cyclicResult1, size()).WillByDefault(Return(1));
-  ON_CALL(*cyclicResult0, begin()).WillByDefault(Return(rowRefs0.cbegin()));
-  ON_CALL(*cyclicResult1, begin()).WillByDefault(Return(rowRefs1.cbegin()));
-
-  NiceMock<FakeDataBuffer> buffer;
-  EXPECT_CALL(buffer, GetKeys("Statics/Agents")).WillRepeatedly(Return(fakeAgentIds));
-  ON_CALL(buffer, GetCyclic(Optional(0), key)).WillByDefault(Return(ByMove(std::move(cyclicResult0))));
-  ON_CALL(buffer, GetCyclic(Optional(1), key)).WillByDefault(Return(ByMove(std::move(cyclicResult1))));
-
-  std::map<std::string, double> result;
-
-  GetAgentValues(key, &buffer, result);
-
-  ASSERT_THAT(result, SizeIs(2));
-  EXPECT_THAT(result, ElementsAre(Pair("0", 1.0), Pair("1", 2.0)));
-}
-
-TEST(ObservationLog_GetAgentValues, OtherDatatypeThanDoubleInStore_Throws)
-{
-  const Keys fakeAgentIds{"0"};
-  const Key key{"theKey"};
-
-  const CyclicRow row{0, key, "other data"};
-  const CyclicRowRefs rowRefs{row};
-
-  std::unique_ptr<NiceMock<FakeCyclicResult>> cyclicResult = std::make_unique<NiceMock<FakeCyclicResult>>();
-  ON_CALL(*cyclicResult, size()).WillByDefault(Return(1));
-  ON_CALL(*cyclicResult, begin()).WillByDefault(Return(rowRefs.cbegin()));
-
-  NiceMock<FakeDataBuffer> buffer;
-  EXPECT_CALL(buffer, GetKeys("Statics/Agents")).WillRepeatedly(Return(fakeAgentIds));
-  ON_CALL(buffer, GetCyclic(Optional(0), key)).WillByDefault(Return(ByMove(std::move(cyclicResult))));
-
-  std::map<std::string, double> result;
-
-  ASSERT_THROW(GetAgentValues(key, &buffer, result), std::bad_variant_access);
-}
 
 TEST(ObservationCyclics_Test, GetHeader_ReturnsCorrectHeader)
 {
@@ -203,45 +124,3 @@ TEST(ObservationCyclics_Test, GetSamplesLineSamplesNotUntilEnd_ReturnsLineWithEm
   samplesLine = cyclics.GetSamplesLine(2);
   ASSERT_THAT(samplesLine, Eq(", 789, "));
 }
-
-TEST(RunStatisticCalculation_Test, DetermineEgoCollisionWithEgoCollision_SetsEgoCollisionTrue)
-{
-  NiceMock<FakeWorld> fakeWorld;
-
-  NiceMock<FakeAgent> fakeEgo;
-  ON_CALL(fakeEgo, GetId()).WillByDefault(Return(0));
-
-  ON_CALL(fakeWorld, GetEgoAgent()).WillByDefault(Return(&fakeEgo));
-
-  NiceMock<FakeRunResult> runResult;
-
-  std::vector<int> collisionIds{{0, 1}};
-  ON_CALL(runResult, GetCollisionIds()).WillByDefault(Return(&collisionIds));
-
-  RunStatistic runStatistic{0};
-
-  RunStatisticCalculation::DetermineEgoCollision(runStatistic, runResult, &fakeWorld);
-
-  ASSERT_THAT(runStatistic.EgoCollision, Eq(true));
-}
-
-TEST(RunStatisticCalculation_Test, DetermineEgoCollisionWithoutEgoCollision_SetsEgoCollisionFalse)
-{
-  NiceMock<FakeWorld> fakeWorld;
-
-  NiceMock<FakeAgent> fakeEgo;
-  ON_CALL(fakeEgo, GetId()).WillByDefault(Return(0));
-
-  ON_CALL(fakeWorld, GetEgoAgent()).WillByDefault(Return(&fakeEgo));
-
-  NiceMock<FakeRunResult> runResult;
-
-  std::vector<int> collisionIds{{1, 2, 3}};
-  ON_CALL(runResult, GetCollisionIds()).WillByDefault(Return(&collisionIds));
-
-  RunStatistic runStatistic{0};
-
-  RunStatisticCalculation::DetermineEgoCollision(runStatistic, runResult, &fakeWorld);
-
-  ASSERT_THAT(runStatistic.EgoCollision, Eq(false));
-}
diff --git a/sim/tests/unitTests/core/opSimulation/opSimulation_Tests.pro b/sim/tests/unitTests/core/opSimulation/opSimulation_Tests.pro
deleted file mode 100644
index 909f29fa1c2bad50f0cb4c57d62744eba52ef890..0000000000000000000000000000000000000000
--- a/sim/tests/unitTests/core/opSimulation/opSimulation_Tests.pro
+++ /dev/null
@@ -1,128 +0,0 @@
-################################################################################
-# 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/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
-
-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 \
-    $$PARAMETERIMPORTER_TESTS \
-    $$SAMPLER_TESTS \
-    $$SCENERYIMPORTER_TESTS \
-    $$INVOCATIONCONTROL_TESTS \
-    $$VEHICLEMODELIMPORTER_TESTS \
-    $$DIRECTORIES_TESTS \
-    $$COMMANDLINERPARSER_TESTS \
-    $$AGENTSAMPLER_TESTS \
-    $$PUBLISHER_TESTS
diff --git a/utils/Dockerfile b/utils/Dockerfile
index a73ca429bc9fc1edd4606e14e3853e5f811685e2..4e9e8894afda6e7fd917cbb899bae21512d81046 100644
--- a/utils/Dockerfile
+++ b/utils/Dockerfile
@@ -2,7 +2,7 @@
 # Copyright (c) 2020-2021 in-tech GmbH
 #               2021 ITK-Engineering GmbH
 #               2023 Deutsches Zentrum für Luft- und Raumfahrt e. V. (DLR)
-#               2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2022-2024 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,6 +23,7 @@ RUN apt-get -qq update && apt-get -qq dist-upgrade && apt-get install -qq -y --n
     cmake \
     clang-format-15 \
     clang-tidy-14 \
+    curl \
     doxygen \
     g++ \
     gcc \
@@ -35,7 +36,6 @@ RUN apt-get -qq update && apt-get -qq dist-upgrade && apt-get install -qq -y --n
     libgmock-dev \
     libgtest-dev \
     libprotobuf-dev \
-    libqt5xmlpatterns5-dev \
     libantlr4-runtime4.9 \
     libantlr4-runtime-java \
     libantlr4-runtime-dev \
@@ -45,52 +45,10 @@ RUN apt-get -qq update && apt-get -qq dist-upgrade && apt-get install -qq -y --n
     python3 \
     python3-distutils \
     python3-pip \
-    qtbase5-dev \
+    python3-venv \
     uuid-dev \
     && apt-get -qq clean
 
-# Packages required for qt build through conan
-RUN apt-get install -qq -y --no-install-recommends \
-    libx11-xcb-dev \
-    libfontenc-dev \
-    libice-dev \
-    libsm-dev \
-    libxaw7-dev \
-    libxcomposite-dev \
-    libxcursor-dev \
-    libxdamage-dev \
-    libxfixes-dev \
-    libxi-dev \
-    libxinerama-dev \
-    libxkbfile-dev \
-    libxmu-dev \
-    libxmuu-dev \
-    libxpm-dev \
-    libxrandr-dev \
-    libxrender-dev \
-    libxres-dev \
-    libxss-dev \
-    libxt-dev \
-    libxtst-dev \
-    libxv-dev \
-    libxvmc-dev \
-    libxxf86vm-dev \
-    libxcb-render0-dev \
-    libxcb-render-util0-dev \
-    libxcb-xkb-dev \
-    libxcb-icccm4-dev \
-    libxcb-image0-dev \
-    libxcb-keysyms1-dev \
-    libxcb-randr0-dev \
-    libxcb-shape0-dev \
-    libxcb-sync-dev \
-    libxcb-xfixes0-dev \
-    libxcb-xinerama0-dev \
-    libxcb-dri3-dev \
-    libxcb-cursor-dev \
-    libxcb-util-dev \
-    && apt-get -qq clean
-
 RUN apt-get install -qq -y --no-install-recommends \
     texlive-base \
     texlive-latex-extra
@@ -104,6 +62,8 @@ RUN mkdir -p /opsimulation/conan
 # set the folder as a conan home
 ENV CONAN_HOME='/opsimulation/conan'
 
+ENV PYTHON_EXECUTABLE=python3
+
 # copy the required contents from the repo to build conan packages
 COPY repo/utils/ci/scripts/15_prepare_thirdParty.sh   repo/utils/ci/scripts/15_prepare_thirdParty.sh
 COPY repo/utils/ci/conan                              repo/utils/ci/conan
diff --git a/utils/Dockerfile.CrossCompilation b/utils/Dockerfile.CrossCompilation
index e88a46f29f6da84c1b49dd975eb30c07b3e5902c..ae2591171e52f1025848a25a0d3691515e7aff4d 100644
--- a/utils/Dockerfile.CrossCompilation
+++ b/utils/Dockerfile.CrossCompilation
@@ -34,7 +34,6 @@ RUN apt-get -qq update && apt-get -qq dist-upgrade && apt-get install -qq -y --n
     libgmock-dev \
     libgtest-dev \
     libprotobuf-dev \
-    libqt5xmlpatterns5-dev \
     libantlr4-runtime4.9 \
     libantlr4-runtime-java \
     libantlr4-runtime-dev \
@@ -44,54 +43,11 @@ RUN apt-get -qq update && apt-get -qq dist-upgrade && apt-get install -qq -y --n
     python3 \
     python3-distutils \
     python3-pip \
-    qtbase5-dev \
     uuid-dev \
     g++-mingw-w64-x86-64 \
     gcc-mingw-w64-x86-64 \
     && apt-get -qq clean
 
-# Packages required for qt build through conan
-RUN apt-get install -qq -y --no-install-recommends \
-    libx11-xcb-dev \
-    libfontenc-dev \
-    libice-dev \
-    libsm-dev \
-    libxaw7-dev \
-    libxcomposite-dev \
-    libxcursor-dev \
-    libxdamage-dev \
-    libxfixes-dev \
-    libxi-dev \
-    libxinerama-dev \
-    libxkbfile-dev \
-    libxmu-dev \
-    libxmuu-dev \
-    libxpm-dev \
-    libxrandr-dev \
-    libxrender-dev \
-    libxres-dev \
-    libxss-dev \
-    libxt-dev \
-    libxtst-dev \
-    libxv-dev \
-    libxvmc-dev \
-    libxxf86vm-dev \
-    libxcb-render0-dev \
-    libxcb-render-util0-dev \
-    libxcb-xkb-dev \
-    libxcb-icccm4-dev \
-    libxcb-image0-dev \
-    libxcb-keysyms1-dev \
-    libxcb-randr0-dev \
-    libxcb-shape0-dev \
-    libxcb-sync-dev \
-    libxcb-xfixes0-dev \
-    libxcb-xinerama0-dev \
-    libxcb-dri3-dev \
-    libxcb-cursor-dev \
-    libxcb-util-dev \
-    && apt-get -qq clean
-
 RUN apt-get install -qq -y --no-install-recommends \
     texlive-base \
     texlive-latex-extra
diff --git a/utils/ci/Jenkinsfile b/utils/ci/Jenkinsfile
index 3beee53f8a26c33e5ef2d5a1bc035c28c2060974..1fb189b4dcec8a71cce9315c62f7773208171198 100644
--- a/utils/ci/Jenkinsfile
+++ b/utils/ci/Jenkinsfile
@@ -18,6 +18,8 @@ pipeline {
     checkoutToSubdirectory('repo')
     timeout(time: 10, unit: 'HOURS')
     timestamps()
+    disableConcurrentBuilds(abortPrevious: true)
+    buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '2'))
   }
   environment {
     IMAGE_NAME = "eclipseopenpass/opsim-ci"
@@ -64,12 +66,12 @@ spec:
           }
           steps {
             script {
-              env.IMAGE_TAG = "ose-v431"
+              env.IMAGE_TAG = "v1.2.0"
             }
-            build job: 'Docker-build', parameters: [string(name: 'IMAGE_NAME', value: "${env.IMAGE_NAME}"), 
+            build job: 'Docker-build', parameters: [string(name: 'IMAGE_NAME', value: "${env.IMAGE_NAME}"),
                                                     string(name: 'IMAGE_TAG', value:"${env.IMAGE_TAG}"),
-                                                    string(name: 'REPO_URL', value: "${env.REPO_URL}"), 
-                                                    string(name: 'BRANCH_NAME', value: "${env.GIT_BRANCH}"), 
+                                                    string(name: 'REPO_URL', value: "${env.REPO_URL}"),
+                                                    string(name: 'BRANCH_NAME', value: "${env.GIT_BRANCH}"),
                                                     string(name: 'DOCKERFILE_PATH', value: "${env.DOCKERFILE_PATH}")],
                                        propagate: true
           }
@@ -82,7 +84,7 @@ spec:
           }
           steps {
             script {
-              env.IMAGE_TAG = "ose-v431"
+              env.IMAGE_TAG = "v1.2.0"
             }
           }
         }
@@ -106,9 +108,6 @@ spec:
       limits:
         memory: "16Gi"
         cpu: "4"
-      requests:
-        memory: "16Gi"
-        cpu: "4"
     volumeMounts:
     - name: openpass-cache-storage
       mountPath: "/home/jenkins/cache"
@@ -124,10 +123,9 @@ spec:
     persistentVolumeClaim:
       claimName: openpass-cache-storage
   securityContext:
-      fsGroupChangePolicy: "OnRootMismatch"
-      runAsUser: 1002870000
       seLinuxOptions:
         level: s0:c4,c54
+        type: spc_t
 """
             }
           }
@@ -137,6 +135,7 @@ spec:
             CCACHE_REMOTE_ONLY = 'true'
             CCACHE_BASE_DIR = "${env.WORKSPACE}"
             CTCACHE_BASE_DIR = '/home/jenkins/cache/opSimulation/ctcache'
+            PYTHON_EXECUTABLE = 'python3'
           }
           stages {
             stage('Linux: Cleanup and prepare dependencies') {
@@ -149,6 +148,8 @@ spec:
             stage('Linux: Code compliance') {
               steps {
                 container('openpass-build') {
+                  sh 'bash repo/utils/ci/scripts/25_check_inline_docu.sh'
+                  sh 'bash repo/utils/ci/scripts/60_check_clang_format.sh'
                   sh 'bash repo/utils/ci/scripts/61_check_eol.sh'
                   sh 'bash repo/utils/ci/scripts/62_static_analysis.sh'
                 }
@@ -190,6 +191,17 @@ spec:
                 }
               }
             }
+            stage('Linux: Deploy Docs') {
+              steps {
+                container('openpass-build')
+                {
+                  withCredentials([string(credentialsId: 'gitlab-api-token', variable: 'GITLAB_BOT_TOKEN')])
+                  {
+                    sh 'bash repo/utils/ci/scripts/auto_deploy_docu.sh'
+                  }
+                }
+              }
+            }
           }
           post {
             always {
@@ -205,7 +217,10 @@ spec:
           environment {
             MSYSTEM = 'MINGW64'
             CHERE_INVOKING = 'yes'
-            PYTHON_WINDOWS_EXE = 'C:/op/python/python.exe'
+            PYTHON_EXECUTABLE = 'C:/op/python/python.exe'
+            OP_BASE_DIR = '/w'
+            OP_REPO_DIR = '/w/repo'
+            OP_DEPS_DIR = '/w/deps'
           }
           stages {
             stage('Windows: Cleanup and prepare dependencies') {
diff --git a/utils/ci/Jenkinsfile.CrossCompilation b/utils/ci/Jenkinsfile.CrossCompilation
index a321a3fbcc45217375159ff239f4ca0a7b66e747..1d4c550432e517dcf62e6ce035f1920428176337 100644
--- a/utils/ci/Jenkinsfile.CrossCompilation
+++ b/utils/ci/Jenkinsfile.CrossCompilation
@@ -18,6 +18,7 @@ pipeline {
     checkoutToSubdirectory('repo')
     timeout(time: 10, unit: 'HOURS')
     timestamps()
+    buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '2'))
   }
   environment {
     IMAGE_NAME = "eclipseopenpass/opsim-ci"
@@ -41,9 +42,6 @@ spec:
       limits:
         memory: "16Gi"
         cpu: "4"
-      requests:
-        memory: "16Gi"
-        cpu: "4"
   - name: jnlp
     volumeMounts:
     - name: volume-known-hosts
@@ -58,6 +56,7 @@ spec:
         environment {
           CONAN_HOME = '/opsimulation/cross-compilation'
           CROSS_COMPILE = 'true'
+          PYTHON_EXECUTABLE = 'python3'
         }
         stages {
           stage('Linux: Cleanup and prepare dependencies') {
@@ -116,7 +115,7 @@ spec:
       }
       stage('Windows') {
         agent {
-          label 'windows'
+          label 'windows10'
         }
         environment {
           MSYSTEM = 'MINGW64'
@@ -172,4 +171,4 @@ spec:
         }
       }
   }
-}
\ No newline at end of file
+}
diff --git a/utils/ci/Jenkinsfile.nightly b/utils/ci/Jenkinsfile.nightly
index 7d91efb55c9db3f8a6f80e4c51936a14fdc05912..8713f5940097be6e452b6adafb194949086b9563 100644
--- a/utils/ci/Jenkinsfile.nightly
+++ b/utils/ci/Jenkinsfile.nightly
@@ -18,6 +18,7 @@ pipeline {
     timeout(time: 5, unit: 'HOURS')
     timestamps()
     disableConcurrentBuilds(abortPrevious: true)
+    buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '10'))
   }
   stages {
     stage('Windows and Linux')
@@ -39,9 +40,6 @@ spec:
       limits:
         memory: "16Gi"
         cpu: "4"
-      requests:
-        memory: "16Gi"
-        cpu: "4"
   - name: jnlp
     volumeMounts:
     - name: volume-known-hosts
@@ -55,13 +53,14 @@ spec:
           }
           environment {
             CONAN_HOME = '/opsimulation/conan'
+            PYTHON_EXECUTABLE = 'python3'
           }
           stages {
             stage('Linux: Create and Run Docker image') {
               steps {
                 container('openpass-build') {
                   sh 'bash repo/utils/ci/scripts/nightly/create_docker_image.sh'
-                }              
+                }
               }
             }
           }
@@ -73,12 +72,12 @@ spec:
           }
           stage('Windows') {
             agent {
-              label 'windows'
+              label 'windows10'
             }
             environment {
               MSYSTEM = 'MINGW64'
               CHERE_INVOKING = 'yes'
-              PYTHON_WINDOWS_EXE = 'C:/Program Files/Python39/python.exe'
+              PYTHON_EXECUTABLE = 'C:/Program Files/Python39/python.exe'
               CONAN_HOME = 'C:/_dev/workspace/nightly-conan'
               bash_executable='C:\\msys-nightly\\msys2\\bin\\msys64\\usr\\bin\\bash'
             }
@@ -121,8 +120,8 @@ spec:
               }
             }
           }
-        } 
-      } 
-    } 
-  } 
-}
\ No newline at end of file
+        }
+      }
+    }
+  }
+}
diff --git a/utils/ci/conan/conanfile.txt b/utils/ci/conan/conanfile.txt
index 567bff983bfd89fc0b9ffca3d6c56ff3ca4e4b91..b2b361c62efef04ba2deeee59c75ac1fdb4a7e9f 100644
--- a/utils/ci/conan/conanfile.txt
+++ b/utils/ci/conan/conanfile.txt
@@ -1,42 +1,24 @@
 [requires]
-libiconv/1.17@
-libxml2/2.12.5@
-b2/4.10.1
+b2/5.0.0
 boost/1.85.0
-qt/5.15.7
-zlib/1.2.13@
-minizip/1.2.13@
-gtest/1.14.0@
-fmilibrary/2.0.3@openpass/testing
-protobuf/3.20.0@
-units/2.3.3@openpass/testing
-open-simulation-interface/3.6.0@openpass/testing
-mantleapi/v4.0.0@openpass/testing
-yase/d0c0e58d17358044cc9018c74308b45f6097ecfb@openpass/testing
-openscenario_api/v1.3.1@openpass/testing
-openscenario_engine/v4.3.1@openpass/testing
-
+fmilibrary/2.0.3
+gtest/1.14.0
+libiconv/1.17
+libxml2/2.11.5
+mantleapi/v5.1.0
+minizip/1.2.13
+open-simulation-interface/3.7.0
+openscenario_api/v1.3.1
+openscenario_engine/v6.0.1
+protobuf-shared/3.20.0
+protobuf/3.20.0
+units/2.3.3
+yase/0.1
+zlib/1.3.1
 
 [options]
-libxml2/*:shared=False
-libxml2/*:include_utils=False
-libxml2/*:ftp=False
-libxml2/*:http=False
-libxml2/*:html=False
-libxml2/*:legacy=False
-libxml2/*:sax1=False
-libxml2/*:zlib=False
-msys2/*:no_kill=True
-qt/*:with_pq=False
-qt/*:with_libpng=False
-qt/*:openssl=False
-qt/*:opengl=no
-qt/*:qtxmlpatterns=True
-qt/*:with_x11=False
-qt/*:qtwayland=False
-b2/4.10.1:toolset=gcc
+b2/*:toolset=gcc
 boost/*:shared=True
-boost/*:fPIC=True
 boost/*:without_chrono=True
 boost/*:without_cobalt=True
 boost/*:without_container=True
@@ -57,9 +39,19 @@ boost/*:without_timer=True
 boost/*:without_type_erasure=True
 boost/*:without_url=True
 boost/*:without_wave=True
-protobuf/*:shared=True
-openscenario_engine/*:MantleAPI_version=v4.0.0
-openscenario_engine/*:Yase_version=d0c0e58d17358044cc9018c74308b45f6097ecfb
+libxml2/*:ftp=False
+libxml2/*:html=False
+libxml2/*:http=False
+libxml2/*:include_utils=False
+libxml2/*:legacy=False
+libxml2/*:sax1=False
+libxml2/*:shared=False
+libxml2/*:zlib=False
+msys2/*:no_kill=True
+openscenario_engine/*:MantleAPI_version=v5.1.0
+openscenario_engine/*:Yase_version=0.1
+protobuf-shared/*:debug_suffix=False
+protobuf/*:debug_suffix=False
 
 [generators]
-CMakeDeps
\ No newline at end of file
+CMakeDeps
diff --git a/utils/ci/conan/recipe/conanprofile_crosscompilation b/utils/ci/conan/conanprofile_crosscompilation
similarity index 100%
rename from utils/ci/conan/recipe/conanprofile_crosscompilation
rename to utils/ci/conan/conanprofile_crosscompilation
diff --git a/utils/ci/conan/recipe/conanprofile_linux b/utils/ci/conan/conanprofile_linux
similarity index 100%
rename from utils/ci/conan/recipe/conanprofile_linux
rename to utils/ci/conan/conanprofile_linux
diff --git a/utils/ci/conan/recipe/conanprofile_windows b/utils/ci/conan/conanprofile_windows
similarity index 70%
rename from utils/ci/conan/recipe/conanprofile_windows
rename to utils/ci/conan/conanprofile_windows
index a9f0597ae84404308e2d21898a484fbf11badfc1..00301e08944f8ef32ed2216ce2a47b2ed0a501c3 100644
--- a/utils/ci/conan/recipe/conanprofile_windows
+++ b/utils/ci/conan/conanprofile_windows
@@ -12,4 +12,5 @@ os.subsystem=msys2
 tools.build:jobs=1
 tools.system.package_manager:mode=install
 tools.microsoft.bash:subsystem=msys2
-tools.microsoft.bash:path=C:/op/msys64/usr/bin/bash.exe
\ No newline at end of file
+tools.microsoft.bash:path=C:/op/msys64/usr/bin/bash.exe
+tools.cmake.cmaketoolchain:generator=MSYS Makefiles
diff --git a/utils/ci/conan/recipe/fmilibrary/all/patches/0001-cross-compilation-compatible.patch b/utils/ci/conan/recipe/fmilibrary/all/patches/0001-cross-compilation-compatible.patch
deleted file mode 100644
index eaade3c8475c77219e63bcc06802785142cf6818..0000000000000000000000000000000000000000
--- a/utils/ci/conan/recipe/fmilibrary/all/patches/0001-cross-compilation-compatible.patch
+++ /dev/null
@@ -1,142 +0,0 @@
-From cbb2cbf313c2f9e3e4f8c9e7cf543a2b3ed92aaa Mon Sep 17 00:00:00 2001
-From: Raghunandan Netrapalli Madhusudhan <raghunandan.madhusudhan@in-tech.com>
-Date: Mon, 2 Oct 2023 08:01:45 +0200
-Subject: [PATCH] cross-compilation-compatible
-
----
- CMakeLists.txt                         | 12 ++++++++++--
- Config.cmake/fmixml.cmake              |  4 ++++
- Config.cmake/jmutil.cmake              |  6 +++++-
- src/Import/src/FMI1/fmi1_import_capi.c | 10 ----------
- src/Import/src/FMI2/fmi2_import_capi.c | 10 ----------
- src/Util/include/JM/jm_portability.h   |  2 ++
- 6 files changed, 21 insertions(+), 23 deletions(-)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index f7372bf..abffee2 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -264,12 +264,20 @@ if(FMILIB_BUILD_STATIC_LIB)
- 	include(mergestaticlibs)
- 	if(WIN32)
- 		merge_static_libs(fmilib ${FMILIB_SUBLIBS})
--        target_link_libraries(fmilib Shlwapi)
-+		if(MSYS)
-+			target_link_libraries(jmutils Shlwapi)
-+		else()
-+			target_link_libraries(jmutils shlwapi)
-+		endif()
-         foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
- 			set(flags "")
- 			string(TOUPPER "STATIC_LIBRARY_FLAGS_${CONFIG_TYPE}" PROPNAME)
- 			get_target_property(flags fmilib ${PROPNAME})
--			set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} Shlwapi.lib")
-+			if(MSYS)
-+				set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} Shlwapi.lib")
-+			else()
-+				set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} shlwapi.lib")
-+			endif()
- 		endforeach()
- 	else()
- 		merge_static_libs(fmilib ${FMILIB_SUBLIBS} )
-diff --git a/Config.cmake/fmixml.cmake b/Config.cmake/fmixml.cmake
-index 03acb3e..1b45c1d 100644
---- a/Config.cmake/fmixml.cmake
-+++ b/Config.cmake/fmixml.cmake
-@@ -159,6 +159,10 @@ set(EXPAT_SETTINGS
- 		-DCMAKE_MODULE_LINKER_FLAGS:STRING=${CMAKE_MODULE_LINKER_FLAGS}
- 		-DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_SHARED_LINKER_FLAGS}	
- 		-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ExpatEx/install
-+        -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
-+        -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
-+        -DCMAKE_SYSTEM_NAME:STRING=${CMAKE_SYSTEM_NAME}
-+        -DCMAKE_SYSTEM_VERSION:STRING=${CMAKE_SYSTEM_VERSION}
- )
- 
- ExternalProject_Add(
-diff --git a/Config.cmake/jmutil.cmake b/Config.cmake/jmutil.cmake
-index 0cce2f7..23f12d1 100644
---- a/Config.cmake/jmutil.cmake
-+++ b/Config.cmake/jmutil.cmake
-@@ -67,7 +67,11 @@ if(UNIX)
- 	target_link_libraries(jmutils dl)
- endif(UNIX)
- if(WIN32)
--	target_link_libraries(jmutils Shlwapi)
-+  if(MSYS)
-+  	target_link_libraries(jmutils Shlwapi)
-+  else()
-+	  target_link_libraries(jmutils shlwapi)
-+  endif()
- endif(WIN32)
- 
- endif(NOT JMUTILDIR)
-diff --git a/src/Import/src/FMI1/fmi1_import_capi.c b/src/Import/src/FMI1/fmi1_import_capi.c
-index 842c998..cd1f57b 100644
---- a/src/Import/src/FMI1/fmi1_import_capi.c
-+++ b/src/Import/src/FMI1/fmi1_import_capi.c
-@@ -67,18 +67,8 @@ jm_status_enu_t fmi1_import_create_dllfmu(fmi1_import_t* fmu, fmi1_callback_func
- 		return jm_status_error;
- 	}
- 
--	if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) {
--		jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath);
--		if(ENOENT == errno)
--			jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform.");
--		else
--			jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno));
--	}
--	else {
- 		/* Allocate memory for the C-API struct */
- 		fmu -> capi = fmi1_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, standard);
--	}
--
- 
- 	/* Load the DLL handle */
- 	if (fmu -> capi) {
-diff --git a/src/Import/src/FMI2/fmi2_import_capi.c b/src/Import/src/FMI2/fmi2_import_capi.c
-index e794775..a82e4eb 100644
---- a/src/Import/src/FMI2/fmi2_import_capi.c
-+++ b/src/Import/src/FMI2/fmi2_import_capi.c
-@@ -88,18 +88,8 @@ jm_status_enu_t fmi2_import_create_dllfmu(fmi2_import_t* fmu, fmi2_fmu_kind_enu_
- 		callBackFunctions = &defaultCallbacks;
- 	}
- 
--	if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) {
--		jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath);
--		if(ENOENT == errno)
--			jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform.");
--		else
--			jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno));
--	}
--	else {
- 		/* Allocate memory for the C-API struct */
- 		fmu -> capi = fmi2_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, fmuKind);
--	}
--
- 
- 	/* Load the DLL handle */
- 	if (fmu -> capi) {
-diff --git a/src/Util/include/JM/jm_portability.h b/src/Util/include/JM/jm_portability.h
-index 82e472a..3e50603 100644
---- a/src/Util/include/JM/jm_portability.h
-+++ b/src/Util/include/JM/jm_portability.h
-@@ -65,6 +65,7 @@ jm_status_enu_t jm_portability_get_current_working_directory(char* buffer, size_
- jm_status_enu_t jm_portability_set_current_working_directory(const char* cwd);
- 
- /** \brief Get system-wide temporary directory */
-+FMILIB_EXPORT
- const char* jm_get_system_temp_dir();
- 
- /**
-@@ -118,6 +119,7 @@ jm_status_enu_t jm_mkdir(jm_callbacks* cb, const char* dir);
- /**
- \brief Remove directory and all it contents.
- */
-+FMILIB_EXPORT
- jm_status_enu_t jm_rmdir(jm_callbacks* cb, const char* dir);
- 
- /**
--- 
-2.34.1
-
diff --git a/utils/ci/conan/recipe/fmilibrary/all/patches/patch4.patch b/utils/ci/conan/recipe/fmilibrary/all/patches/patch4.patch
deleted file mode 100644
index 49a62840a0c54823543eeef7d38c9aea08acb155..0000000000000000000000000000000000000000
--- a/utils/ci/conan/recipe/fmilibrary/all/patches/patch4.patch
+++ /dev/null
@@ -1,466 +0,0 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index f7372bf..8f8ee7b 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -24,7 +24,7 @@ project (FMILibrary)
- set_property(GLOBAL PROPERTY PROPERTYPREDEFINED_TARGETS_FOLDER Global)
- set(FMILIBRARYHOME ${FMILibrary_SOURCE_DIR})
- set(FMILIBRARYBUILD ${FMILibrary_BINARY_DIR})
--
-+set(CMAKE_HOST_SYSTEM_NAME Windows)
- # User configuration options and parameters
- SET(FMILIB_INSTALL_PREFIX ${FMILibrary_BINARY_DIR}/../install CACHE PATH "Prefix prepended to install directories")
- set(FMILIB_THIRDPARTYLIBS  ${FMILibrary_SOURCE_DIR}/ThirdParty CACHE PATH "Path to the ThirdParty library dir" )
-@@ -264,12 +264,20 @@ if(FMILIB_BUILD_STATIC_LIB)
- 	include(mergestaticlibs)
- 	if(WIN32)
- 		merge_static_libs(fmilib ${FMILIB_SUBLIBS})
--        target_link_libraries(fmilib Shlwapi)
-+		if(MSYS)
-+			target_link_libraries(jmutils Shlwapi)
-+		else()
-+			target_link_libraries(jmutils shlwapi)
-+		endif()
-         foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
- 			set(flags "")
- 			string(TOUPPER "STATIC_LIBRARY_FLAGS_${CONFIG_TYPE}" PROPNAME)
- 			get_target_property(flags fmilib ${PROPNAME})
--			set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} Shlwapi.lib")
-+			if(MSYS)
-+				set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} Shlwapi.lib")
-+			else()
-+				set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} shlwapi.lib")
-+			endif()
- 		endforeach()
- 	else()
- 		merge_static_libs(fmilib ${FMILIB_SUBLIBS} )
-diff --git a/Config.cmake/fmiplatform.cmake b/Config.cmake/fmiplatform.cmake
-index 2023163..2288992 100644
---- a/Config.cmake/fmiplatform.cmake
-+++ b/Config.cmake/fmiplatform.cmake
-@@ -15,7 +15,8 @@
- # win32, win64, linux32, linux64, darwin32 or darwin64 depending on cmake
- # generator
- function(fmi_platform platform )
--    if(CMAKE_HOST_WIN32) #Set to true when the host system is Windows and on cygwin.
-+    if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) #Set to true when the host system is Windows and on cygwin.
-+        message(STATUS "Debugging")
-         if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-             set(${platform} win32 PARENT_SCOPE)
-         else(CMAKE_SIZEOF_VOID_P EQUAL 4)
-diff --git a/Config.cmake/fmixml.cmake b/Config.cmake/fmixml.cmake
-index 03acb3e..1b45c1d 100644
---- a/Config.cmake/fmixml.cmake
-+++ b/Config.cmake/fmixml.cmake
-@@ -159,6 +159,10 @@ set(EXPAT_SETTINGS
- 		-DCMAKE_MODULE_LINKER_FLAGS:STRING=${CMAKE_MODULE_LINKER_FLAGS}
- 		-DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_SHARED_LINKER_FLAGS}	
- 		-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ExpatEx/install
-+        -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
-+        -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
-+        -DCMAKE_SYSTEM_NAME:STRING=${CMAKE_SYSTEM_NAME}
-+        -DCMAKE_SYSTEM_VERSION:STRING=${CMAKE_SYSTEM_VERSION}
- )
- 
- ExternalProject_Add(
-diff --git a/Config.cmake/jmutil.cmake b/Config.cmake/jmutil.cmake
-index 0cce2f7..23f12d1 100644
---- a/Config.cmake/jmutil.cmake
-+++ b/Config.cmake/jmutil.cmake
-@@ -67,7 +67,11 @@ if(UNIX)
- 	target_link_libraries(jmutils dl)
- endif(UNIX)
- if(WIN32)
--	target_link_libraries(jmutils Shlwapi)
-+  if(MSYS)
-+  	target_link_libraries(jmutils Shlwapi)
-+  else()
-+	  target_link_libraries(jmutils shlwapi)
-+  endif()
- endif(WIN32)
- 
- endif(NOT JMUTILDIR)
-diff --git a/src/Import/src/FMI1/fmi1_import_capi.c b/src/Import/src/FMI1/fmi1_import_capi.c
-index 842c998..f762d77 100644
---- a/src/Import/src/FMI1/fmi1_import_capi.c
-+++ b/src/Import/src/FMI1/fmi1_import_capi.c
-@@ -21,7 +21,7 @@ extern "C" {
- #include <errno.h>
- #include <FMI1/fmi1_types.h>
- #include <FMI1/fmi1_functions.h>
--#include <FMI1/fmi1_enums.h>
-+#include <FMI1/fmi1_enums.h>
- #include <FMI1/fmi1_capi.h>
- #include <FMI/fmi_util.h>
- #include "fmi1_import_impl.h"
-@@ -67,23 +67,13 @@ jm_status_enu_t fmi1_import_create_dllfmu(fmi1_import_t* fmu, fmi1_callback_func
- 		return jm_status_error;
- 	}
- 
--	if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) {
--		jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath);
--		if(ENOENT == errno)
--			jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform.");
--		else
--			jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno));
--	}
--	else {
- 		/* Allocate memory for the C-API struct */
- 		fmu -> capi = fmi1_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, standard);
--	}
--
- 
- 	/* Load the DLL handle */
- 	if (fmu -> capi) {
--		jm_log_info(fmu->callbacks, module, 
--			"Loading '" FMI_PLATFORM "' binary with '%s' platform types", fmi1_get_platform() );
-+		jm_log_info(fmu->callbacks, module, 
-+			"Loading '" FMI_PLATFORM "' binary with '%s' platform types", fmi1_get_platform() );
- 
- 		if(fmi1_capi_load_dll(fmu -> capi) == jm_status_error) {		
- 			fmi1_capi_destroy_dllfmu(fmu -> capi);
-@@ -303,8 +293,8 @@ jm_status_enu_t fmi1_import_instantiate_slave(fmi1_import_t* fmu, fmi1_string_t
- 	fmi1_component_t c;
- 	if(!mimeType) mimeType = "application/x-fmu-sharedlibrary";
- 	if(!fmuLocation) fmuLocation = fmu->location;
--	jm_log_verbose(fmu->callbacks, module, "Instantiating the slave with \n"
--					"\tFMU location ='%s'\n\tMIME type = '%s'", fmuLocation, mimeType);
-+	jm_log_verbose(fmu->callbacks, module, "Instantiating the slave with \n"
-+					"\tFMU location ='%s'\n\tMIME type = '%s'", fmuLocation, mimeType);
- 
- 	c = fmi1_capi_instantiate_slave(fmu -> capi, instanceName, fmuGUID, fmuLocation, mimeType, timeout, visible, interactive, loggingOn);
- 	if (c == NULL) {
-diff --git a/src/Import/src/FMI2/fmi2_import_capi.c b/src/Import/src/FMI2/fmi2_import_capi.c
-index e794775..5af253f 100644
---- a/src/Import/src/FMI2/fmi2_import_capi.c
-+++ b/src/Import/src/FMI2/fmi2_import_capi.c
-@@ -21,7 +21,7 @@ extern "C" {
- #include <errno.h>
- #include <FMI2/fmi2_types.h>
- #include <FMI2/fmi2_functions.h>
--#include <FMI2/fmi2_enums.h>
-+#include <FMI2/fmi2_enums.h>
- #include <FMI2/fmi2_capi.h>
- #include <FMI/fmi_util.h>
- #include "fmi2_import_impl.h"
-@@ -88,23 +88,13 @@ jm_status_enu_t fmi2_import_create_dllfmu(fmi2_import_t* fmu, fmi2_fmu_kind_enu_
- 		callBackFunctions = &defaultCallbacks;
- 	}
- 
--	if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) {
--		jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath);
--		if(ENOENT == errno)
--			jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform.");
--		else
--			jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno));
--	}
--	else {
- 		/* Allocate memory for the C-API struct */
- 		fmu -> capi = fmi2_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, fmuKind);
--	}
--
- 
- 	/* Load the DLL handle */
- 	if (fmu -> capi) {
--		jm_log_info(fmu->callbacks, module, 
--			"Loading '" FMI_PLATFORM "' binary with '%s' platform types", fmi2_get_types_platform() );
-+		jm_log_info(fmu->callbacks, module, 
-+			"Loading '" FMI_PLATFORM "' binary with '%s' platform types", fmi2_get_types_platform() );
- 
- 		if(fmi2_capi_load_dll(fmu -> capi) == jm_status_error) {		
- 			fmi2_capi_destroy_dllfmu(fmu -> capi);
-@@ -271,29 +261,29 @@ const char* fmi2_import_get_types_platform(fmi2_import_t* fmu) {
- 	return fmi2_capi_get_types_platform(fmu -> capi);
- }
- 
--fmi2_status_t fmi2_import_get_fmu_state           (fmi2_import_t* fmu, fmi2_FMU_state_t* s) {
--	return fmi2_capi_get_fmu_state(fmu -> capi,s);
--}
--fmi2_status_t fmi2_import_set_fmu_state           (fmi2_import_t* fmu, fmi2_FMU_state_t s){
--	return fmi2_capi_set_fmu_state(fmu -> capi,s);
--}
--fmi2_status_t fmi2_import_free_fmu_state          (fmi2_import_t* fmu, fmi2_FMU_state_t* s){
--	return fmi2_capi_free_fmu_state (fmu -> capi,s);
--}
--fmi2_status_t fmi2_import_serialized_fmu_state_size(fmi2_import_t* fmu, fmi2_FMU_state_t s, size_t* sz){
--	return fmi2_capi_serialized_fmu_state_size(fmu -> capi,s,sz);
--}
--fmi2_status_t fmi2_import_serialize_fmu_state     (fmi2_import_t* fmu, fmi2_FMU_state_t s , fmi2_byte_t data[], size_t sz){
--	return fmi2_capi_serialize_fmu_state(fmu -> capi,s,data,sz);
--}
--fmi2_status_t fmi2_import_de_serialize_fmu_state  (fmi2_import_t* fmu, const fmi2_byte_t data[], size_t sz, fmi2_FMU_state_t* s){
--	return fmi2_capi_de_serialize_fmu_state (fmu -> capi,data,sz,s);
--}
--
--fmi2_status_t fmi2_import_get_directional_derivative(fmi2_import_t* fmu, const fmi2_value_reference_t v_ref[], size_t nv,
--                                                                   const fmi2_value_reference_t z_ref[], size_t nz,
--                                                                   const fmi2_real_t dv[], fmi2_real_t dz[]){
--	return fmi2_capi_get_directional_derivative(fmu -> capi,v_ref, nv, z_ref, nz, dv, dz);
-+fmi2_status_t fmi2_import_get_fmu_state           (fmi2_import_t* fmu, fmi2_FMU_state_t* s) {
-+	return fmi2_capi_get_fmu_state(fmu -> capi,s);
-+}
-+fmi2_status_t fmi2_import_set_fmu_state           (fmi2_import_t* fmu, fmi2_FMU_state_t s){
-+	return fmi2_capi_set_fmu_state(fmu -> capi,s);
-+}
-+fmi2_status_t fmi2_import_free_fmu_state          (fmi2_import_t* fmu, fmi2_FMU_state_t* s){
-+	return fmi2_capi_free_fmu_state (fmu -> capi,s);
-+}
-+fmi2_status_t fmi2_import_serialized_fmu_state_size(fmi2_import_t* fmu, fmi2_FMU_state_t s, size_t* sz){
-+	return fmi2_capi_serialized_fmu_state_size(fmu -> capi,s,sz);
-+}
-+fmi2_status_t fmi2_import_serialize_fmu_state     (fmi2_import_t* fmu, fmi2_FMU_state_t s , fmi2_byte_t data[], size_t sz){
-+	return fmi2_capi_serialize_fmu_state(fmu -> capi,s,data,sz);
-+}
-+fmi2_status_t fmi2_import_de_serialize_fmu_state  (fmi2_import_t* fmu, const fmi2_byte_t data[], size_t sz, fmi2_FMU_state_t* s){
-+	return fmi2_capi_de_serialize_fmu_state (fmu -> capi,data,sz,s);
-+}
-+
-+fmi2_status_t fmi2_import_get_directional_derivative(fmi2_import_t* fmu, const fmi2_value_reference_t v_ref[], size_t nv,
-+                                                                   const fmi2_value_reference_t z_ref[], size_t nz,
-+                                                                   const fmi2_real_t dv[], fmi2_real_t dz[]){
-+	return fmi2_capi_get_directional_derivative(fmu -> capi,v_ref, nv, z_ref, nz, dv, dz);
- }
- 
- /* FMI 2.0 ME functions */
-diff --git a/src/Util/include/JM/jm_portability.h b/src/Util/include/JM/jm_portability.h
-index 82e472a..605dff9 100644
---- a/src/Util/include/JM/jm_portability.h
-+++ b/src/Util/include/JM/jm_portability.h
-@@ -11,61 +11,62 @@
- 
-     You should have received a copy of the FMILIB_License.txt file
-     along with this program. If not, contact Modelon AB <http://www.modelon.com>.
--*/
--
--#ifndef JM_PORTABILITY_H_
--#define JM_PORTABILITY_H_
--#include <fmilib_config.h>
--#include "jm_callbacks.h"
--
--/* Include platform dependent headers */
--#if defined(_MSC_VER) || defined(WIN32) || defined(__MINGW32__)
--#include <windows.h> /* Microsoft Windows API */
--#define DLL_HANDLE HANDLE
--#else
--#define DLL_HANDLE void*
--#include <dlfcn.h>  /* Standard POSIX/UNIX API */
--#endif
--
--#include "jm_types.h"
--/** \file jm_portability.h
--	Handling platform specific defines and functions.
--*/
--/**
--	\addtogroup jm_utils
--	@{
--		\addtogroup jm_portability
--	@}
--*/
--/** \addtogroup jm_portability Handling platform specific defines and functions
--@{*/
--/** \brief Load a dll/so library into the process and return a handle. */
--DLL_HANDLE		jm_portability_load_dll_handle		(const char* dll_file_path);
--
--/** \brief Unload a Dll and release the handle*/
--jm_status_enu_t jm_portability_free_dll_handle		(DLL_HANDLE dll_handle);
--
-+*/
-+
-+#ifndef JM_PORTABILITY_H_
-+#define JM_PORTABILITY_H_
-+#include <fmilib_config.h>
-+#include "jm_callbacks.h"
-+
-+/* Include platform dependent headers */
-+#if defined(_MSC_VER) || defined(WIN32) || defined(__MINGW32__)
-+#include <windows.h> /* Microsoft Windows API */
-+#define DLL_HANDLE HANDLE
-+#else
-+#define DLL_HANDLE void*
-+#include <dlfcn.h>  /* Standard POSIX/UNIX API */
-+#endif
-+
-+#include "jm_types.h"
-+/** \file jm_portability.h
-+	Handling platform specific defines and functions.
-+*/
-+/**
-+	\addtogroup jm_utils
-+	@{
-+		\addtogroup jm_portability
-+	@}
-+*/
-+/** \addtogroup jm_portability Handling platform specific defines and functions
-+@{*/
-+/** \brief Load a dll/so library into the process and return a handle. */
-+DLL_HANDLE		jm_portability_load_dll_handle		(const char* dll_file_path);
-+
-+/** \brief Unload a Dll and release the handle*/
-+jm_status_enu_t jm_portability_free_dll_handle		(DLL_HANDLE dll_handle);
-+
- /** \brief A function pointer as returned when DLL symbol is loaded.*/
--#ifdef WIN32
--#define jm_dll_function_ptr FARPROC
--#else
--typedef void* jm_dll_function_ptr; 
--#endif
--
--/** \brief Find a function in the Dll and return a function pointer */
--jm_status_enu_t jm_portability_load_dll_function	(DLL_HANDLE dll_handle, char* dll_function_name, jm_dll_function_ptr* dll_function_ptrptr);
--
--/** \brief Return error associated with Dll handling */
--char* jm_portability_get_last_dll_error	(void);
--
--/** \brief Get current working directory name */
--jm_status_enu_t jm_portability_get_current_working_directory(char* buffer, size_t len);
--
--/** \brief Set current working directory*/
--jm_status_enu_t jm_portability_set_current_working_directory(const char* cwd);
--
--/** \brief Get system-wide temporary directory */
--const char* jm_get_system_temp_dir();
-+#ifdef WIN32
-+#define jm_dll_function_ptr FARPROC
-+#else
-+typedef void* jm_dll_function_ptr; 
-+#endif
-+
-+/** \brief Find a function in the Dll and return a function pointer */
-+jm_status_enu_t jm_portability_load_dll_function	(DLL_HANDLE dll_handle, char* dll_function_name, jm_dll_function_ptr* dll_function_ptrptr);
-+
-+/** \brief Return error associated with Dll handling */
-+char* jm_portability_get_last_dll_error	(void);
-+
-+/** \brief Get current working directory name */
-+jm_status_enu_t jm_portability_get_current_working_directory(char* buffer, size_t len);
-+
-+/** \brief Set current working directory*/
-+jm_status_enu_t jm_portability_set_current_working_directory(const char* cwd);
-+
-+/** \brief Get system-wide temporary directory */
-+FMILIB_EXPORT
-+const char* jm_get_system_temp_dir();
- 
- /**
-     \brief Create a uniquely named temporary directory.
-@@ -79,66 +80,67 @@ const char* jm_get_system_temp_dir();
- */
- char *jm_mkdtemp(jm_callbacks *cb, char *tmplt);
- 
--
--/** 
--	\brief Get absolute path to an existing directory
--	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
--	\param dir - path to a directory (relative or absolute).
--	\param outPath - buffer for storing the directory
--	\param len - of the buffer (if size is larger than FILENAME_MAX + 1 then the path will always fit in)
--	\return Pointer to outPath on success, 0 - on error in which case a message is send to the logger.	
--*/
--char* jm_get_dir_abspath(jm_callbacks* cb, const char* dir, char* outPath, size_t len);
--
--/** 
--	\brief Create a unique temporary directory
--	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
--	\param systemTempDir - directory where the temp dir should be located both absolute and relative path are accepted.
--				System-wide directory is used if this parameter is NULL.
--	\param tempPrefix - File name template prefix used when creating temporaty directories. "jm" is used if this is NULL.
--	\return A pointer to the temporary directory name (absolute path, no terminating '/'). Caller is responsible for freeing the memory.
--		The function returns NULL if there were errors in which case a message is send to the logger.	
--*/
--char* jm_mk_temp_dir(jm_callbacks* cb, const char* systemTempDir, const char* tempPrefix);
--
--/** 
--	\brief Create a file:// URL from absolute path
--	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
--	\param absPath - absolute path to be converted into the URL
--	\return A pointer to the URL. Caller is responsible for freeing the memory.
--		The function returns NULL if there were errors in which case a message is send to the logger.	
--*/
--char* jm_create_URL_from_abs_path(jm_callbacks* cb, const char* absPath);
--
--/**
--	\brief Make a directory.
--*/
--jm_status_enu_t jm_mkdir(jm_callbacks* cb, const char* dir);
--
--/**
--\brief Remove directory and all it contents.
--*/
--jm_status_enu_t jm_rmdir(jm_callbacks* cb, const char* dir);
--
--/**
--\brief C89 compatible implementation of C99 vsnprintf. 
--*/
-+
-+/** 
-+	\brief Get absolute path to an existing directory
-+	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
-+	\param dir - path to a directory (relative or absolute).
-+	\param outPath - buffer for storing the directory
-+	\param len - of the buffer (if size is larger than FILENAME_MAX + 1 then the path will always fit in)
-+	\return Pointer to outPath on success, 0 - on error in which case a message is send to the logger.	
-+*/
-+char* jm_get_dir_abspath(jm_callbacks* cb, const char* dir, char* outPath, size_t len);
-+
-+/** 
-+	\brief Create a unique temporary directory
-+	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
-+	\param systemTempDir - directory where the temp dir should be located both absolute and relative path are accepted.
-+				System-wide directory is used if this parameter is NULL.
-+	\param tempPrefix - File name template prefix used when creating temporaty directories. "jm" is used if this is NULL.
-+	\return A pointer to the temporary directory name (absolute path, no terminating '/'). Caller is responsible for freeing the memory.
-+		The function returns NULL if there were errors in which case a message is send to the logger.	
-+*/
-+char* jm_mk_temp_dir(jm_callbacks* cb, const char* systemTempDir, const char* tempPrefix);
-+
-+/** 
-+	\brief Create a file:// URL from absolute path
-+	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
-+	\param absPath - absolute path to be converted into the URL
-+	\return A pointer to the URL. Caller is responsible for freeing the memory.
-+		The function returns NULL if there were errors in which case a message is send to the logger.	
-+*/
-+char* jm_create_URL_from_abs_path(jm_callbacks* cb, const char* absPath);
-+
-+/**
-+	\brief Make a directory.
-+*/
-+jm_status_enu_t jm_mkdir(jm_callbacks* cb, const char* dir);
-+
-+/**
-+\brief Remove directory and all it contents.
-+*/
-+FMILIB_EXPORT
-+jm_status_enu_t jm_rmdir(jm_callbacks* cb, const char* dir);
-+
-+/**
-+\brief C89 compatible implementation of C99 vsnprintf. 
-+*/
- FMILIB_EXPORT
- int jm_vsnprintf(char * str, size_t size, const char * fmt, va_list al);
- 
--/**
--\brief C89 compatible implementation of C99 snprintf. 
--*/
--FMILIB_EXPORT
-+/**
-+\brief C89 compatible implementation of C99 snprintf. 
-+*/
-+FMILIB_EXPORT
- int jm_snprintf(char * str, size_t size, const char * fmt, ...);
--
-+
- #ifdef HAVE_VA_COPY
- #define JM_VA_COPY va_copy
--#elif defined(HAVE___VA_COPY)
-+#elif defined(HAVE___VA_COPY)
- #define JM_VA_COPY __va_copy
- #elif defined(WIN32)
- #define JM_VA_COPY(dest,src) dest=src
- #endif
--
--/*@}*/
--#endif /* End of header file JM_PORTABILITY_H_ */
-+
-+/*@}*/
-+#endif /* End of header file JM_PORTABILITY_H_ */
diff --git a/utils/ci/conan/recipe/fmilibrary/all/patches/patch5.patch b/utils/ci/conan/recipe/fmilibrary/all/patches/patch5.patch
deleted file mode 100644
index 55525034197d75b9037917096fae5d13b8a63904..0000000000000000000000000000000000000000
--- a/utils/ci/conan/recipe/fmilibrary/all/patches/patch5.patch
+++ /dev/null
@@ -1,511 +0,0 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index f7372bf..8f8ee7b 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -24,7 +24,7 @@ project (FMILibrary)
- set_property(GLOBAL PROPERTY PROPERTYPREDEFINED_TARGETS_FOLDER Global)
- set(FMILIBRARYHOME ${FMILibrary_SOURCE_DIR})
- set(FMILIBRARYBUILD ${FMILibrary_BINARY_DIR})
--
-+set(CMAKE_HOST_SYSTEM_NAME Windows)
- # User configuration options and parameters
- SET(FMILIB_INSTALL_PREFIX ${FMILibrary_BINARY_DIR}/../install CACHE PATH "Prefix prepended to install directories")
- set(FMILIB_THIRDPARTYLIBS  ${FMILibrary_SOURCE_DIR}/ThirdParty CACHE PATH "Path to the ThirdParty library dir" )
-@@ -264,12 +264,20 @@ if(FMILIB_BUILD_STATIC_LIB)
- 	include(mergestaticlibs)
- 	if(WIN32)
- 		merge_static_libs(fmilib ${FMILIB_SUBLIBS})
--        target_link_libraries(fmilib Shlwapi)
-+		if(MSYS)
-+			target_link_libraries(jmutils Shlwapi)
-+		else()
-+			target_link_libraries(jmutils shlwapi)
-+		endif()
-         foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
- 			set(flags "")
- 			string(TOUPPER "STATIC_LIBRARY_FLAGS_${CONFIG_TYPE}" PROPNAME)
- 			get_target_property(flags fmilib ${PROPNAME})
--			set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} Shlwapi.lib")
-+			if(MSYS)
-+				set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} Shlwapi.lib")
-+			else()
-+				set_target_properties(fmilib PROPERTIES ${PROPNAME} "${flags} shlwapi.lib")
-+			endif()
- 		endforeach()
- 	else()
- 		merge_static_libs(fmilib ${FMILIB_SUBLIBS} )
-diff --git a/Config.cmake/fmiplatform.cmake b/Config.cmake/fmiplatform.cmake
-index 2023163..f5b46a4 100644
---- a/Config.cmake/fmiplatform.cmake
-+++ b/Config.cmake/fmiplatform.cmake
-@@ -15,26 +15,32 @@
- # win32, win64, linux32, linux64, darwin32 or darwin64 depending on cmake
- # generator
- function(fmi_platform platform )
--    if(CMAKE_HOST_WIN32) #Set to true when the host system is Windows and on cygwin.
--        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
--            set(${platform} win32 PARENT_SCOPE)
--        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
--            set(${platform} win64 PARENT_SCOPE)
--        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
--    elseif(CMAKE_HOST_APPLE) #Set to true when the host system is Apple OSX. 
--        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
--            set(${platform} darwin32 PARENT_SCOPE)
--        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
--            set(${platform} darwin64 PARENT_SCOPE)
--        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
--    elseif(CMAKE_HOST_UNIX) #Set to true when the host system is UNIX or UNIX like (i.e. APPLE and CYGWIN). 
--        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
--            set(${platform} linux32 PARENT_SCOPE)
--        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
--            set(${platform} linux64 PARENT_SCOPE)
--        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
--    else(CMAKE_HOST_WIN32)
--        message(SEND_ERROR "Target ${platform} is not supported by the tests")
--        set(${platform} not_supported)
--    endif()
-+    # if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) #Set to true when the host system is Windows and on cygwin.
-+    #     message(STATUS "Debugging")
-+    #     if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    #         set(${platform} win32 PARENT_SCOPE)
-+    #     else(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    #         set(${platform} win64 PARENT_SCOPE)
-+    #     endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    # elseif(CMAKE_HOST_APPLE) #Set to true when the host system is Apple OSX. 
-+    #     if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    #         set(${platform} darwin32 PARENT_SCOPE)
-+    #     else(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    #         set(${platform} darwin64 PARENT_SCOPE)
-+    #     endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    # elseif(CMAKE_HOST_UNIX) #Set to true when the host system is UNIX or UNIX like (i.e. APPLE and CYGWIN). 
-+    #     if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    #         set(${platform} linux32 PARENT_SCOPE)
-+    #     else(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    #         set(${platform} linux64 PARENT_SCOPE)
-+    #     endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+    # else(CMAKE_HOST_WIN32)
-+    #     message(SEND_ERROR "Target ${platform} is not supported by the tests")
-+    #     set(${platform} not_supported)
-+    # endif()
-+    if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+        set(${platform} win32 PARENT_SCOPE)
-+    else(CMAKE_SIZEOF_VOID_P EQUAL 4)
-+        set(${platform} win64 PARENT_SCOPE)
-+    endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
- endfunction()
-diff --git a/Config.cmake/fmixml.cmake b/Config.cmake/fmixml.cmake
-index 03acb3e..1b45c1d 100644
---- a/Config.cmake/fmixml.cmake
-+++ b/Config.cmake/fmixml.cmake
-@@ -159,6 +159,10 @@ set(EXPAT_SETTINGS
- 		-DCMAKE_MODULE_LINKER_FLAGS:STRING=${CMAKE_MODULE_LINKER_FLAGS}
- 		-DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_SHARED_LINKER_FLAGS}	
- 		-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ExpatEx/install
-+        -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
-+        -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
-+        -DCMAKE_SYSTEM_NAME:STRING=${CMAKE_SYSTEM_NAME}
-+        -DCMAKE_SYSTEM_VERSION:STRING=${CMAKE_SYSTEM_VERSION}
- )
- 
- ExternalProject_Add(
-diff --git a/Config.cmake/jmutil.cmake b/Config.cmake/jmutil.cmake
-index 0cce2f7..23f12d1 100644
---- a/Config.cmake/jmutil.cmake
-+++ b/Config.cmake/jmutil.cmake
-@@ -67,7 +67,11 @@ if(UNIX)
- 	target_link_libraries(jmutils dl)
- endif(UNIX)
- if(WIN32)
--	target_link_libraries(jmutils Shlwapi)
-+  if(MSYS)
-+  	target_link_libraries(jmutils Shlwapi)
-+  else()
-+	  target_link_libraries(jmutils shlwapi)
-+  endif()
- endif(WIN32)
- 
- endif(NOT JMUTILDIR)
-diff --git a/src/Import/src/FMI1/fmi1_import_capi.c b/src/Import/src/FMI1/fmi1_import_capi.c
-index 842c998..f762d77 100644
---- a/src/Import/src/FMI1/fmi1_import_capi.c
-+++ b/src/Import/src/FMI1/fmi1_import_capi.c
-@@ -21,7 +21,7 @@ extern "C" {
- #include <errno.h>
- #include <FMI1/fmi1_types.h>
- #include <FMI1/fmi1_functions.h>
--#include <FMI1/fmi1_enums.h>
-+#include <FMI1/fmi1_enums.h>
- #include <FMI1/fmi1_capi.h>
- #include <FMI/fmi_util.h>
- #include "fmi1_import_impl.h"
-@@ -67,23 +67,13 @@ jm_status_enu_t fmi1_import_create_dllfmu(fmi1_import_t* fmu, fmi1_callback_func
- 		return jm_status_error;
- 	}
- 
--	if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) {
--		jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath);
--		if(ENOENT == errno)
--			jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform.");
--		else
--			jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno));
--	}
--	else {
- 		/* Allocate memory for the C-API struct */
- 		fmu -> capi = fmi1_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, standard);
--	}
--
- 
- 	/* Load the DLL handle */
- 	if (fmu -> capi) {
--		jm_log_info(fmu->callbacks, module, 
--			"Loading '" FMI_PLATFORM "' binary with '%s' platform types", fmi1_get_platform() );
-+		jm_log_info(fmu->callbacks, module, 
-+			"Loading '" FMI_PLATFORM "' binary with '%s' platform types", fmi1_get_platform() );
- 
- 		if(fmi1_capi_load_dll(fmu -> capi) == jm_status_error) {		
- 			fmi1_capi_destroy_dllfmu(fmu -> capi);
-@@ -303,8 +293,8 @@ jm_status_enu_t fmi1_import_instantiate_slave(fmi1_import_t* fmu, fmi1_string_t
- 	fmi1_component_t c;
- 	if(!mimeType) mimeType = "application/x-fmu-sharedlibrary";
- 	if(!fmuLocation) fmuLocation = fmu->location;
--	jm_log_verbose(fmu->callbacks, module, "Instantiating the slave with \n"
--					"\tFMU location ='%s'\n\tMIME type = '%s'", fmuLocation, mimeType);
-+	jm_log_verbose(fmu->callbacks, module, "Instantiating the slave with \n"
-+					"\tFMU location ='%s'\n\tMIME type = '%s'", fmuLocation, mimeType);
- 
- 	c = fmi1_capi_instantiate_slave(fmu -> capi, instanceName, fmuGUID, fmuLocation, mimeType, timeout, visible, interactive, loggingOn);
- 	if (c == NULL) {
-diff --git a/src/Import/src/FMI2/fmi2_import_capi.c b/src/Import/src/FMI2/fmi2_import_capi.c
-index e794775..5af253f 100644
---- a/src/Import/src/FMI2/fmi2_import_capi.c
-+++ b/src/Import/src/FMI2/fmi2_import_capi.c
-@@ -21,7 +21,7 @@ extern "C" {
- #include <errno.h>
- #include <FMI2/fmi2_types.h>
- #include <FMI2/fmi2_functions.h>
--#include <FMI2/fmi2_enums.h>
-+#include <FMI2/fmi2_enums.h>
- #include <FMI2/fmi2_capi.h>
- #include <FMI/fmi_util.h>
- #include "fmi2_import_impl.h"
-@@ -88,23 +88,13 @@ jm_status_enu_t fmi2_import_create_dllfmu(fmi2_import_t* fmu, fmi2_fmu_kind_enu_
- 		callBackFunctions = &defaultCallbacks;
- 	}
- 
--	if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) {
--		jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath);
--		if(ENOENT == errno)
--			jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform.");
--		else
--			jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno));
--	}
--	else {
- 		/* Allocate memory for the C-API struct */
- 		fmu -> capi = fmi2_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, fmuKind);
--	}
--
- 
- 	/* Load the DLL handle */
- 	if (fmu -> capi) {
--		jm_log_info(fmu->callbacks, module, 
--			"Loading '" FMI_PLATFORM "' binary with '%s' platform types", fmi2_get_types_platform() );
-+		jm_log_info(fmu->callbacks, module, 
-+			"Loading '" FMI_PLATFORM "' binary with '%s' platform types", fmi2_get_types_platform() );
- 
- 		if(fmi2_capi_load_dll(fmu -> capi) == jm_status_error) {		
- 			fmi2_capi_destroy_dllfmu(fmu -> capi);
-@@ -271,29 +261,29 @@ const char* fmi2_import_get_types_platform(fmi2_import_t* fmu) {
- 	return fmi2_capi_get_types_platform(fmu -> capi);
- }
- 
--fmi2_status_t fmi2_import_get_fmu_state           (fmi2_import_t* fmu, fmi2_FMU_state_t* s) {
--	return fmi2_capi_get_fmu_state(fmu -> capi,s);
--}
--fmi2_status_t fmi2_import_set_fmu_state           (fmi2_import_t* fmu, fmi2_FMU_state_t s){
--	return fmi2_capi_set_fmu_state(fmu -> capi,s);
--}
--fmi2_status_t fmi2_import_free_fmu_state          (fmi2_import_t* fmu, fmi2_FMU_state_t* s){
--	return fmi2_capi_free_fmu_state (fmu -> capi,s);
--}
--fmi2_status_t fmi2_import_serialized_fmu_state_size(fmi2_import_t* fmu, fmi2_FMU_state_t s, size_t* sz){
--	return fmi2_capi_serialized_fmu_state_size(fmu -> capi,s,sz);
--}
--fmi2_status_t fmi2_import_serialize_fmu_state     (fmi2_import_t* fmu, fmi2_FMU_state_t s , fmi2_byte_t data[], size_t sz){
--	return fmi2_capi_serialize_fmu_state(fmu -> capi,s,data,sz);
--}
--fmi2_status_t fmi2_import_de_serialize_fmu_state  (fmi2_import_t* fmu, const fmi2_byte_t data[], size_t sz, fmi2_FMU_state_t* s){
--	return fmi2_capi_de_serialize_fmu_state (fmu -> capi,data,sz,s);
--}
--
--fmi2_status_t fmi2_import_get_directional_derivative(fmi2_import_t* fmu, const fmi2_value_reference_t v_ref[], size_t nv,
--                                                                   const fmi2_value_reference_t z_ref[], size_t nz,
--                                                                   const fmi2_real_t dv[], fmi2_real_t dz[]){
--	return fmi2_capi_get_directional_derivative(fmu -> capi,v_ref, nv, z_ref, nz, dv, dz);
-+fmi2_status_t fmi2_import_get_fmu_state           (fmi2_import_t* fmu, fmi2_FMU_state_t* s) {
-+	return fmi2_capi_get_fmu_state(fmu -> capi,s);
-+}
-+fmi2_status_t fmi2_import_set_fmu_state           (fmi2_import_t* fmu, fmi2_FMU_state_t s){
-+	return fmi2_capi_set_fmu_state(fmu -> capi,s);
-+}
-+fmi2_status_t fmi2_import_free_fmu_state          (fmi2_import_t* fmu, fmi2_FMU_state_t* s){
-+	return fmi2_capi_free_fmu_state (fmu -> capi,s);
-+}
-+fmi2_status_t fmi2_import_serialized_fmu_state_size(fmi2_import_t* fmu, fmi2_FMU_state_t s, size_t* sz){
-+	return fmi2_capi_serialized_fmu_state_size(fmu -> capi,s,sz);
-+}
-+fmi2_status_t fmi2_import_serialize_fmu_state     (fmi2_import_t* fmu, fmi2_FMU_state_t s , fmi2_byte_t data[], size_t sz){
-+	return fmi2_capi_serialize_fmu_state(fmu -> capi,s,data,sz);
-+}
-+fmi2_status_t fmi2_import_de_serialize_fmu_state  (fmi2_import_t* fmu, const fmi2_byte_t data[], size_t sz, fmi2_FMU_state_t* s){
-+	return fmi2_capi_de_serialize_fmu_state (fmu -> capi,data,sz,s);
-+}
-+
-+fmi2_status_t fmi2_import_get_directional_derivative(fmi2_import_t* fmu, const fmi2_value_reference_t v_ref[], size_t nv,
-+                                                                   const fmi2_value_reference_t z_ref[], size_t nz,
-+                                                                   const fmi2_real_t dv[], fmi2_real_t dz[]){
-+	return fmi2_capi_get_directional_derivative(fmu -> capi,v_ref, nv, z_ref, nz, dv, dz);
- }
- 
- /* FMI 2.0 ME functions */
-diff --git a/src/Util/include/JM/jm_portability.h b/src/Util/include/JM/jm_portability.h
-index 82e472a..605dff9 100644
---- a/src/Util/include/JM/jm_portability.h
-+++ b/src/Util/include/JM/jm_portability.h
-@@ -11,61 +11,62 @@
- 
-     You should have received a copy of the FMILIB_License.txt file
-     along with this program. If not, contact Modelon AB <http://www.modelon.com>.
--*/
--
--#ifndef JM_PORTABILITY_H_
--#define JM_PORTABILITY_H_
--#include <fmilib_config.h>
--#include "jm_callbacks.h"
--
--/* Include platform dependent headers */
--#if defined(_MSC_VER) || defined(WIN32) || defined(__MINGW32__)
--#include <windows.h> /* Microsoft Windows API */
--#define DLL_HANDLE HANDLE
--#else
--#define DLL_HANDLE void*
--#include <dlfcn.h>  /* Standard POSIX/UNIX API */
--#endif
--
--#include "jm_types.h"
--/** \file jm_portability.h
--	Handling platform specific defines and functions.
--*/
--/**
--	\addtogroup jm_utils
--	@{
--		\addtogroup jm_portability
--	@}
--*/
--/** \addtogroup jm_portability Handling platform specific defines and functions
--@{*/
--/** \brief Load a dll/so library into the process and return a handle. */
--DLL_HANDLE		jm_portability_load_dll_handle		(const char* dll_file_path);
--
--/** \brief Unload a Dll and release the handle*/
--jm_status_enu_t jm_portability_free_dll_handle		(DLL_HANDLE dll_handle);
--
-+*/
-+
-+#ifndef JM_PORTABILITY_H_
-+#define JM_PORTABILITY_H_
-+#include <fmilib_config.h>
-+#include "jm_callbacks.h"
-+
-+/* Include platform dependent headers */
-+#if defined(_MSC_VER) || defined(WIN32) || defined(__MINGW32__)
-+#include <windows.h> /* Microsoft Windows API */
-+#define DLL_HANDLE HANDLE
-+#else
-+#define DLL_HANDLE void*
-+#include <dlfcn.h>  /* Standard POSIX/UNIX API */
-+#endif
-+
-+#include "jm_types.h"
-+/** \file jm_portability.h
-+	Handling platform specific defines and functions.
-+*/
-+/**
-+	\addtogroup jm_utils
-+	@{
-+		\addtogroup jm_portability
-+	@}
-+*/
-+/** \addtogroup jm_portability Handling platform specific defines and functions
-+@{*/
-+/** \brief Load a dll/so library into the process and return a handle. */
-+DLL_HANDLE		jm_portability_load_dll_handle		(const char* dll_file_path);
-+
-+/** \brief Unload a Dll and release the handle*/
-+jm_status_enu_t jm_portability_free_dll_handle		(DLL_HANDLE dll_handle);
-+
- /** \brief A function pointer as returned when DLL symbol is loaded.*/
--#ifdef WIN32
--#define jm_dll_function_ptr FARPROC
--#else
--typedef void* jm_dll_function_ptr; 
--#endif
--
--/** \brief Find a function in the Dll and return a function pointer */
--jm_status_enu_t jm_portability_load_dll_function	(DLL_HANDLE dll_handle, char* dll_function_name, jm_dll_function_ptr* dll_function_ptrptr);
--
--/** \brief Return error associated with Dll handling */
--char* jm_portability_get_last_dll_error	(void);
--
--/** \brief Get current working directory name */
--jm_status_enu_t jm_portability_get_current_working_directory(char* buffer, size_t len);
--
--/** \brief Set current working directory*/
--jm_status_enu_t jm_portability_set_current_working_directory(const char* cwd);
--
--/** \brief Get system-wide temporary directory */
--const char* jm_get_system_temp_dir();
-+#ifdef WIN32
-+#define jm_dll_function_ptr FARPROC
-+#else
-+typedef void* jm_dll_function_ptr; 
-+#endif
-+
-+/** \brief Find a function in the Dll and return a function pointer */
-+jm_status_enu_t jm_portability_load_dll_function	(DLL_HANDLE dll_handle, char* dll_function_name, jm_dll_function_ptr* dll_function_ptrptr);
-+
-+/** \brief Return error associated with Dll handling */
-+char* jm_portability_get_last_dll_error	(void);
-+
-+/** \brief Get current working directory name */
-+jm_status_enu_t jm_portability_get_current_working_directory(char* buffer, size_t len);
-+
-+/** \brief Set current working directory*/
-+jm_status_enu_t jm_portability_set_current_working_directory(const char* cwd);
-+
-+/** \brief Get system-wide temporary directory */
-+FMILIB_EXPORT
-+const char* jm_get_system_temp_dir();
- 
- /**
-     \brief Create a uniquely named temporary directory.
-@@ -79,66 +80,67 @@ const char* jm_get_system_temp_dir();
- */
- char *jm_mkdtemp(jm_callbacks *cb, char *tmplt);
- 
--
--/** 
--	\brief Get absolute path to an existing directory
--	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
--	\param dir - path to a directory (relative or absolute).
--	\param outPath - buffer for storing the directory
--	\param len - of the buffer (if size is larger than FILENAME_MAX + 1 then the path will always fit in)
--	\return Pointer to outPath on success, 0 - on error in which case a message is send to the logger.	
--*/
--char* jm_get_dir_abspath(jm_callbacks* cb, const char* dir, char* outPath, size_t len);
--
--/** 
--	\brief Create a unique temporary directory
--	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
--	\param systemTempDir - directory where the temp dir should be located both absolute and relative path are accepted.
--				System-wide directory is used if this parameter is NULL.
--	\param tempPrefix - File name template prefix used when creating temporaty directories. "jm" is used if this is NULL.
--	\return A pointer to the temporary directory name (absolute path, no terminating '/'). Caller is responsible for freeing the memory.
--		The function returns NULL if there were errors in which case a message is send to the logger.	
--*/
--char* jm_mk_temp_dir(jm_callbacks* cb, const char* systemTempDir, const char* tempPrefix);
--
--/** 
--	\brief Create a file:// URL from absolute path
--	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
--	\param absPath - absolute path to be converted into the URL
--	\return A pointer to the URL. Caller is responsible for freeing the memory.
--		The function returns NULL if there were errors in which case a message is send to the logger.	
--*/
--char* jm_create_URL_from_abs_path(jm_callbacks* cb, const char* absPath);
--
--/**
--	\brief Make a directory.
--*/
--jm_status_enu_t jm_mkdir(jm_callbacks* cb, const char* dir);
--
--/**
--\brief Remove directory and all it contents.
--*/
--jm_status_enu_t jm_rmdir(jm_callbacks* cb, const char* dir);
--
--/**
--\brief C89 compatible implementation of C99 vsnprintf. 
--*/
-+
-+/** 
-+	\brief Get absolute path to an existing directory
-+	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
-+	\param dir - path to a directory (relative or absolute).
-+	\param outPath - buffer for storing the directory
-+	\param len - of the buffer (if size is larger than FILENAME_MAX + 1 then the path will always fit in)
-+	\return Pointer to outPath on success, 0 - on error in which case a message is send to the logger.	
-+*/
-+char* jm_get_dir_abspath(jm_callbacks* cb, const char* dir, char* outPath, size_t len);
-+
-+/** 
-+	\brief Create a unique temporary directory
-+	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
-+	\param systemTempDir - directory where the temp dir should be located both absolute and relative path are accepted.
-+				System-wide directory is used if this parameter is NULL.
-+	\param tempPrefix - File name template prefix used when creating temporaty directories. "jm" is used if this is NULL.
-+	\return A pointer to the temporary directory name (absolute path, no terminating '/'). Caller is responsible for freeing the memory.
-+		The function returns NULL if there were errors in which case a message is send to the logger.	
-+*/
-+char* jm_mk_temp_dir(jm_callbacks* cb, const char* systemTempDir, const char* tempPrefix);
-+
-+/** 
-+	\brief Create a file:// URL from absolute path
-+	\param cb - callbacks for memory allocation and logging. Default callbacks are used if this parameter is NULL.
-+	\param absPath - absolute path to be converted into the URL
-+	\return A pointer to the URL. Caller is responsible for freeing the memory.
-+		The function returns NULL if there were errors in which case a message is send to the logger.	
-+*/
-+char* jm_create_URL_from_abs_path(jm_callbacks* cb, const char* absPath);
-+
-+/**
-+	\brief Make a directory.
-+*/
-+jm_status_enu_t jm_mkdir(jm_callbacks* cb, const char* dir);
-+
-+/**
-+\brief Remove directory and all it contents.
-+*/
-+FMILIB_EXPORT
-+jm_status_enu_t jm_rmdir(jm_callbacks* cb, const char* dir);
-+
-+/**
-+\brief C89 compatible implementation of C99 vsnprintf. 
-+*/
- FMILIB_EXPORT
- int jm_vsnprintf(char * str, size_t size, const char * fmt, va_list al);
- 
--/**
--\brief C89 compatible implementation of C99 snprintf. 
--*/
--FMILIB_EXPORT
-+/**
-+\brief C89 compatible implementation of C99 snprintf. 
-+*/
-+FMILIB_EXPORT
- int jm_snprintf(char * str, size_t size, const char * fmt, ...);
--
-+
- #ifdef HAVE_VA_COPY
- #define JM_VA_COPY va_copy
--#elif defined(HAVE___VA_COPY)
-+#elif defined(HAVE___VA_COPY)
- #define JM_VA_COPY __va_copy
- #elif defined(WIN32)
- #define JM_VA_COPY(dest,src) dest=src
- #endif
--
--/*@}*/
--#endif /* End of header file JM_PORTABILITY_H_ */
-+
-+/*@}*/
-+#endif /* End of header file JM_PORTABILITY_H_ */
diff --git a/utils/ci/conan/recipe/openpass/conanfile.py b/utils/ci/conan/recipe/openpass/conanfile.py
deleted file mode 100644
index 2004a079b25721948bbdf9ee41d334434c551d00..0000000000000000000000000000000000000000
--- a/utils/ci/conan/recipe/openpass/conanfile.py
+++ /dev/null
@@ -1,79 +0,0 @@
-################################################################################
-# Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
-#               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
-################################################################################
-
-################################################################################
-# Install file for building openPASS with Conan
-################################################################################
-
-from conans import ConanFile, CMake, tools
-from pathlib import Path
-import shutil
-
-class OpenpassConan(ConanFile):
-    name = "openpass"
-    version = "0.8"
-    license = "Eclipse Public License 2.0"
-    author = "Michael Scharfenberg michael.scharfenberg@itk-engineering.de"
-    url = "https://gitlab.eclipse.org/eclipse/openpass"
-    description = "openPASS is an open source platform for effectiveness assessment of advanced driver assistance systems and automated driving"
-    settings = "os", "compiler", "build_type", "arch"
-    options = {"shared": [True, False], "fPIC": [True, False]}
-    default_options = {"shared": True, "fPIC": True, "boost:shared": True}
-    generators = "cmake"
-    exports_sources = "../../../../../*" # use source of the repo
-    short_paths = True
-
-    def config_options(self):
-        if self.settings.os == "Windows":
-            del self.options.fPIC   
-
-    def requirements(self):
-            #self.requires("boost/1.76.0@openpass/testing")
-            #self.requires("protobuf/3.15.5")
-            self.requires("OSI/3.5.0")
-            self.requires("FMILibrary/2.0.3")
-            #self.requires("gtest/1.10.0")
-
-    def imports(self):
-        self.copy("*", dst="ThirdParty")
-
-    # def source(self):
-    #     git = tools.Git()
-    #     git.clone("https://gitlab.eclipse.org/eclipse/openpass/opSimulation.git", "servant", "--recursive")
-
-    def build(self):
-        cmake = CMake(self)
-        if self.settings.os == "Windows":
-            cmake.configure(defs={"CMAKE_PREFIX_PATH":"ThirdParty",
-                                "CMAKE_INSTALL_PREFIX":"temp-deploy",
-                                "WITH_TESTS":"OFF",
-                                "INSTALL_EXTRA_RUNTIME_DEPS":"OFF"})
-        elif self.settings.os == "Linux":
-            cmake.configure(defs={"CMAKE_PREFIX_PATH":"./ThirdParty",
-                                "CMAKE_INSTALL_PREFIX":"./temp-deploy",
-                                "CMAKE_C_COMPILER":"gcc-10",
-                                "CMAKE_CXX_COMPILER":"g++-10",
-                                "WITH_TESTS":"OFF",
-                                "INSTALL_EXTRA_RUNTIME_DEPS":"ON"})
-        cmake.build()
-        # can be deleted as soon as branch is up to date
-        if self.settings.os == "Windows":
-            self.run("mingw32-make doc", win_bash=True)
-        elif self.settings.os == "Linux":
-            self.run("make doc", win_bash=True)
-        cmake.install()
-
-    def package(self):
-        self.copy("*", src="temp-deploy", excludes=["bin/*"])
-        self.copy("*", src="temp-deploy/bin")
-
-    def package_info(self):
-        self.cpp_info.libs = ["openpass"]
diff --git a/utils/ci/conan/recipe/openscenario_api/all/conanfile.py b/utils/ci/conan/recipe/openscenario_api/all/conanfile.py
deleted file mode 100644
index acbcaa7bfc11102bcf44573fa3e0cb3f29e3ca52..0000000000000000000000000000000000000000
--- a/utils/ci/conan/recipe/openscenario_api/all/conanfile.py
+++ /dev/null
@@ -1,92 +0,0 @@
-################################################################################
-# Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
-#               2024 Volkswagen 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
-################################################################################
-
-################################################################################
-# Install file for building open scenario api with Conan
-################################################################################
-import os
-
-from conan import ConanFile
-from conan.tools.build import cross_building
-from conan.tools.files import copy, export_conandata_patches, apply_conandata_patches
-from conan.tools.scm import Git
-
-required_conan_version = ">=1.53.0"
-
-class OpenScenarioApiConan(ConanFile):
-    name = "openscenario_api"
-    settings = "os", "compiler", "build_type", "arch"
-    options = {"shared": [True, False], "fPIC": [True, False]}
-    default_options = {"shared": False, "fPIC": True}
-    _repo_source = None
-    short_paths = True
-    _artifact_path = None
-    no_copy_source = True
-
-    def export_sources(self):
-        export_conandata_patches(self)
-
-    def config_options(self):
-        if self.settings.os == "Windows":
-            del self.options.fPIC
-
-    def _get_url_sha(self):
-        if self.version in self.conan_data["sources"]:
-            url = self.conan_data["sources"][self.version]["url"]
-            sha256 = self.conan_data["sources"][self.version]["sha256"]
-        else:
-            url = self.conan_data["sources"]["default"]["url"]
-            sha256 = self.version
-        return url, sha256
-
-    def source(self):
-        url, sha256 = self._get_url_sha()
-        git = Git(self)
-        git.clone(url=url, target=self.name)
-        git.folder=self.name
-        git.checkout(commit=sha256)
-        self._repo_source = os.path.join(self.source_folder, self.name)
-        self._artifact_path = os.path.join(self._repo_source, "cpp", "buildArtifact")
-        apply_conandata_patches(self)
-
-
-    def build(self):
-        if cross_building(self):
-            os.chdir(os.path.join(self._repo_source, "cpp"))
-            os.system('cmake -Wno-dev --preset="Cross-shared-release"')
-            os.system('cmake --build --preset="Build-Cross-shared-release"')
-        elif self.settings.os == "Windows":
-            os.chdir(os.path.join(self._repo_source, "cpp"))
-            os.system('cmake -Wno-dev --preset="MSYS-shared-release"')
-            os.system('cmake --build --preset="Build-MSYS-shared-release"')
-        else:
-            os.chdir(self._artifact_path)
-            os.system('chmod +x generateLinux.sh')
-            os.system('./generateLinux.sh shared release make')
-
-    def package(self):
-        copy(self, "*", src=os.path.join(self._repo_source, "cpp/common"), dst=os.path.join(self.package_folder, "include/common"))
-
-        copy(self, "*", src=os.path.join(self._repo_source, "cpp/expressionsLib/inc"), dst=os.path.join(self.package_folder, "include/expressionsLib/inc"))
-
-        copy(self, "*", src=os.path.join(self._repo_source, "cpp/externalLibs/Filesystem"), dst=os.path.join(self.package_folder, "include/externalLibs/Filesystem"))
-        copy(self, "*", src=os.path.join(self._repo_source, "cpp/externalLibs/TinyXML2"), dst=os.path.join(self.package_folder, "include/externalLibs/TinyXML2"))
-
-        copy(self, "*", src=os.path.join(self._repo_source, "cpp/openScenarioLib/src"), dst=os.path.join(self.package_folder, "include/openScenarioLib/src"))
-
-        copy(self, "*", src=os.path.join(self._repo_source, "cpp/openScenarioLib/generated"), dst=os.path.join(self.package_folder, "include/openScenarioLib/generated"))
-
-        copy(self, "*", src=os.path.join(self._repo_source, "cpp/build/cgReleaseMakeShared/antlr4_runtime/src/antlr4_runtime/runtime/Cpp/dist"), dst=os.path.join(self.package_folder, "lib"))
-        copy(self, "lib*", src=os.path.join(self._repo_source, "cpp/build/cgReleaseMakeShared/openScenarioLib"), dst=os.path.join(self.package_folder, "lib"))
-        copy(self, "lib*", src=os.path.join(self._repo_source, "cpp/build/cgReleaseMakeShared/expressionsLib"), dst=os.path.join(self.package_folder, "lib"))
-
-        os.chdir(self.package_folder)
-        os.system('find . -name "*.cpp" -exec rm {} \;')
diff --git a/utils/ci/conan/recipes/b2/all/conandata.yml b/utils/ci/conan/recipes/b2/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4bd954865dc3a23cd7578645be2a4ed6df39ba12
--- /dev/null
+++ b/utils/ci/conan/recipes/b2/all/conandata.yml
@@ -0,0 +1,16 @@
+sources:
+  "4.8.2":
+    url: "https://github.com/bfgroup/b2/archive/4.8.2.tar.gz"
+    sha256: "220edfbd5022394c5dc264dfdd8bf6d3ec53b784db87461026bb23ea9d9ec4bd"
+  "4.9.6":
+    url: "https://github.com/bfgroup/b2/releases/download/4.9.6/b2-4.9.6.tar.bz2"
+    sha256: "10c1344c751fcf5a1f9ec6f52c02626cfbf78a4806f7817949b115e107bbbc5f"
+  "4.10.0":
+    url: "https://github.com/bfgroup/b2/releases/download/4.10.0/b2-4.10.0.tar.bz2"
+    sha256: "aee0185473141d4acb56e39c78758b1016e66393ea5ca86ef29403bd9258f2e2"
+  "4.10.1":
+    url: "https://github.com/bfgroup/b2/releases/download/4.10.1/b2-4.10.1.tar.bz2"
+    sha256: "d0818276955c3351eac26e4aa1e61046cfded88773232d76f2833c93bb917633"
+  "5.0.0":
+    url: "https://github.com/bfgroup/b2/releases/download/5.0.0/b2-5.0.0.tar.bz2"
+    sha256: "1ef867f7d374345a948baca025ed277dadda05a68439aa383a06aceb9911f7d3"
diff --git a/utils/ci/conan/recipes/b2/all/conanfile.py b/utils/ci/conan/recipes/b2/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..365240cd5828ff5b66b9dc8ca888a2bdf4d9cff0
--- /dev/null
+++ b/utils/ci/conan/recipes/b2/all/conanfile.py
@@ -0,0 +1,205 @@
+from conan import ConanFile
+from conan.errors import ConanInvalidConfiguration
+from conan.tools.build import cross_building
+from conan.tools.env import VirtualBuildEnv
+from conan.tools.files import chdir, copy, get
+from conan.tools.layout import basic_layout
+
+from contextlib import contextmanager
+import os
+from io import StringIO
+
+required_conan_version = ">=1.47.0"
+
+
+class B2Conan(ConanFile):
+    name = "b2"
+    homepage = "https://www.bfgroup.xyz/b2/"
+    description = "B2 makes it easy to build C++ projects, everywhere."
+    topics = ("installer", "builder", "build", "build-system")
+    license = "BSL-1.0"
+    url = "https://github.com/conan-io/conan-center-index"
+
+    settings = "os", "arch"
+    '''
+    * use_cxx_env: False, True
+
+    Indicates if the build will use the CXX and
+    CXXFLAGS environment variables. The common use is to add additional flags
+    for building on specific platforms or for additional optimization options.
+
+    * toolset: 'auto', 'cxx', 'cross-cxx',
+    'acc', 'borland', 'clang', 'como', 'gcc-nocygwin', 'gcc',
+    'intel-darwin', 'intel-linux', 'intel-win32', 'kcc', 'kylix',
+    'mingw', 'mipspro', 'pathscale', 'pgi', 'qcc', 'sun', 'sunpro',
+    'tru64cxx', 'vacpp', 'vc12', 'vc14', 'vc141', 'vc142', 'vc143'
+
+    Specifies the toolset to use for building. The default of 'auto' detects
+    a usable compiler for building and should be preferred. The 'cxx' toolset
+    uses the 'CXX' and 'CXXFLAGS' solely for building. Using the 'cxx'
+    toolset will also turn on the 'use_cxx_env' option. And the 'cross-cxx'
+    toolset uses the 'BUILD_CXX' and 'BUILD_CXXFLAGS' vars. This frees the
+    'CXX' and 'CXXFLAGS' variables for use in subprocesses.
+    '''
+    options = {
+        'use_cxx_env': [False, True],
+        'toolset': [
+            'auto', 'cxx', 'cross-cxx',
+            'acc', 'borland', 'clang', 'como', 'gcc-nocygwin', 'gcc',
+            'intel-darwin', 'intel-linux', 'intel-win32', 'kcc', 'kylix',
+            'mingw', 'mipspro', 'pathscale', 'pgi', 'qcc', 'sun', 'sunpro',
+            'tru64cxx', 'vacpp', 'vc12', 'vc14', 'vc141', 'vc142', 'vc143',
+        ]
+    }
+    default_options = {
+        'use_cxx_env': False,
+        'toolset': 'auto'
+    }
+
+    def layout(self):
+        basic_layout(self, src_folder="src")
+
+    def package_id(self):
+        del self.info.options.use_cxx_env
+        del self.info.options.toolset
+
+        if self._is_macos_intel_or_arm(self.info.settings):
+            self.info.settings.arch = "x86_64,armv8"
+
+    def validate_build(self):
+        if hasattr(self, "settings_build") and cross_building(self) and not self._is_macos_intel_or_arm(self.settings):
+            raise ConanInvalidConfiguration(f"{self.ref} recipe doesn't support cross-build yet")
+
+    def validate(self):
+        if (self.options.toolset == 'cxx' or self.options.toolset == 'cross-cxx') and not self.options.use_cxx_env:
+            raise ConanInvalidConfiguration(
+                "Option toolset 'cxx' and 'cross-cxx' requires 'use_cxx_env=True'")
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    @property
+    def _b2_dir(self):
+        return self.source_folder
+
+    @property
+    def _b2_engine_dir(self):
+        return os.path.join(self._b2_dir, "src", "engine")
+
+    @property
+    def _b2_output_dir(self):
+        return os.path.join(self.build_folder, "output")
+
+    @property
+    def _pkg_bin_dir(self):
+        return os.path.join(self.package_folder, "bin")
+
+    def _is_macos_intel_or_arm(self, settings):
+        return settings.os == "Macos" and settings.arch in ["x86_64", "armv8"]
+
+    @contextmanager
+    def _bootstrap_env(self):
+        saved_env = dict(os.environ)
+        # Vcvars will change the directory after it runs in the situation when
+        # the user has previously run the VS command console inits. In that
+        # context it remembers the dir and resets it at each vcvars invocation.
+        os.environ.update({"VSCMD_START_DIR": os.getcwd()})
+        if not self.options.use_cxx_env:
+            # To avoid using the CXX env vars we clear them out for the build.
+            os.environ.update({
+                "CXX": "",
+                "CXXFLAGS": ""})
+        try:
+            yield
+        finally:
+            os.environ.clear()
+            os.environ.update(saved_env)
+
+    def _write_project_config(self, cxx):
+        with open(os.path.join(self.source_folder, "project-config.jam"), "w") as f:
+            f.write(
+                f"using {self.options.toolset} : : {cxx} ;\n"
+            )
+
+    def build(self):
+        # The order of the with:with: below is important. The first one changes
+        # the current dir. While the second does env changes that guarantees
+        # that dir doesn't change if/when vsvars runs to set the msvc compile
+        # env.
+        self.output.info("Build engine..")
+        command = ""
+        b2_toolset = self.options.toolset
+        use_windows_commands = os.name == 'nt' and self.settings.os.subsystem != "msys2"        # modified by BMW
+        if b2_toolset == 'auto':
+            if use_windows_commands:
+                # For windows auto detection it can evaluate to a msvc version
+                # that it's not aware of. Most likely because it's a future one
+                # that didn't exist when the build was written. This turns that
+                # into a generic msvc toolset build assuming it could work,
+                # since it's a better version.
+                with chdir(self, self._b2_engine_dir):
+                    with self._bootstrap_env():
+                        buf = StringIO()
+                        self.run('guess_toolset && set', buf)
+                        guess_vars = map(
+                            lambda x: x.strip(), buf.getvalue().split("\n"))
+                        if "B2_TOOLSET=vcunk" in guess_vars:
+                            b2_toolset = 'msvc'
+                            for kv in guess_vars:
+                                if kv.startswith("B2_TOOLSET_ROOT="):
+                                    b2_vcvars = os.path.join(
+                                        kv.split('=')[1].strip(), 'Auxiliary', 'Build', 'vcvars32.bat')
+                                    command += '"'+b2_vcvars+'" && '
+        command += "build" if use_windows_commands else "bash build.sh"      # modified by BMW
+
+        cxxflags = ""
+        if self._is_macos_intel_or_arm(self.settings):
+            cxxflags += " -arch arm64 -arch x86_64"
+
+        if self.options.use_cxx_env:
+            envvars = VirtualBuildEnv(self).vars()
+
+            cxx_env = envvars.get("CXX")
+            if cxx_env:
+                command += f" --cxx={cxx_env}"
+                self._write_project_config(cxx_env)
+
+            cxxflags_env = envvars.get("CXXFLAGS")
+            if cxxflags_env:
+                cxxflags = f"{cxxflags} {cxxflags_env}"
+
+        if cxxflags:
+            command += f' --cxxflags="{cxxflags}"'
+
+        if b2_toolset != 'auto':
+            command += " "+str(b2_toolset)
+        with chdir(self, self._b2_engine_dir):
+            with self._bootstrap_env():
+                self.run(command)
+
+        self.output.info("Install..")
+        command = os.path.join(
+            self._b2_engine_dir, "b2.exe" if use_windows_commands else "b2")
+        if b2_toolset not in ["auto", "cxx", "cross-cxx"]:
+            command += " toolset=" + str(b2_toolset)
+        full_command = \
+            (f"{command} --ignore-site-config " +
+             f"--prefix={self._b2_output_dir} " +
+             "--abbreviate-paths " +
+             "install " +
+             "b2-install-layout=portable")
+        with chdir(self, self._b2_dir):
+            self.run(full_command)
+
+    def package(self):
+        copy(self, "LICENSE.txt", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
+        copy(self, "*b2", dst=self._pkg_bin_dir, src=self._b2_output_dir)
+        copy(self, "*b2.exe", dst=self._pkg_bin_dir, src=self._b2_output_dir)
+        copy(self, "*.jam", dst=self._pkg_bin_dir, src=self._b2_output_dir)
+
+    def package_info(self):
+        self.cpp_info.includedirs = []
+        self.cpp_info.libdirs = []
+
+        # TODO: to remove in conan v2
+        self.env_info.PATH.append(self._pkg_bin_dir)
diff --git a/utils/ci/conan/recipes/b2/config.yml b/utils/ci/conan/recipes/b2/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..91025146cc90413e7d5d36538de43db3b772231d
--- /dev/null
+++ b/utils/ci/conan/recipes/b2/config.yml
@@ -0,0 +1,11 @@
+versions:
+  "4.8.2":
+    folder: all
+  "4.9.6":
+    folder: all
+  "4.10.0":
+    folder: all
+  "4.10.1":
+    folder: all
+  "5.0.0":
+    folder: all
diff --git a/utils/ci/conan/recipes/boost/all/conandata.yml b/utils/ci/conan/recipes/boost/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4ec2a9756c4904e06c9a0a05c8c40105907afdad
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/conandata.yml
@@ -0,0 +1,369 @@
+sources:
+  "1.85.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.85.0/source/boost_1_85_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.85.0/boost_1_85_0.tar.bz2"
+    sha256: "7009fe1faa1697476bdc7027703a2badb84e849b7b0baad5086b087b971f8617"
+  "1.84.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.84.0/source/boost_1_84_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.84.0/boost_1_84_0.tar.bz2"
+    sha256: "cc4b893acf645c9d4b698e9a0f08ca8846aa5d6c68275c14c3e7949c24109454"
+  "1.83.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.83.0/source/boost_1_83_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.83.0/boost_1_83_0.tar.bz2"
+    sha256: "6478edfe2f3305127cffe8caf73ea0176c53769f4bf1585be237eb30798c3b8e"
+  "1.82.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.82.0/boost_1_82_0.tar.bz2"
+    sha256: "a6e1ab9b0860e6a2881dd7b21fe9f737a095e5f33a3a874afc6a345228597ee6"
+  "1.81.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/boost_1_81_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.81.0/boost_1_81_0.tar.bz2"
+    sha256: "71feeed900fbccca04a3b4f2f84a7c217186f28a940ed8b7ed4725986baf99fa"
+  "1.80.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.80.0/boost_1_80_0.tar.bz2"
+    sha256: "1e19565d82e43bc59209a168f5ac899d3ba471d55c7610c677d4ccf2c9c500c0"
+  "1.79.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.79.0/source/boost_1_79_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.79.0/boost_1_79_0.tar.bz2"
+    sha256: "475d589d51a7f8b3ba2ba4eda022b170e562ca3b760ee922c146b6c65856ef39"
+  "1.78.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.78.0/source/boost_1_78_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.78.0/boost_1_78_0.tar.bz2"
+    sha256: "8681f175d4bdb26c52222665793eef08490d7758529330f98d3b29dd0735bccc"
+  "1.77.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.77.0/boost_1_77_0.tar.bz2"
+    sha256: "fc9f85fc030e233142908241af7a846e60630aa7388de9a5fafb1f3a26840854"
+  "1.76.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.76.0/boost_1_76_0.tar.bz2"
+    sha256: "f0397ba6e982c4450f27bf32a2a83292aba035b827a5623a14636ea583318c41"
+  "1.75.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.75.0/boost_1_75_0.tar.bz2"
+    sha256: "953db31e016db7bb207f11432bef7df100516eeb746843fa0486a222e3fd49cb"
+  "1.74.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.74.0/boost_1_74_0.tar.bz2"
+    sha256: "83bfc1507731a0906e387fc28b7ef5417d591429e51e788417fe9ff025e116b1"
+  "1.73.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.73.0/source/boost_1_73_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.73.0/boost_1_73_0.tar.bz2"
+    sha256: "4eb3b8d442b426dc35346235c8733b5ae35ba431690e38c6a8263dce9fcbb402"
+  "1.72.0":
+    url:
+      - "https://boostorg.jfrog.io/artifactory/main/release/1.72.0/source/boost_1_72_0.tar.bz2"
+      - "https://sourceforge.net/projects/boost/files/boost/1.72.0/boost_1_72_0.tar.bz2"
+    sha256: "59c9b274bc451cf91a9ba1dd2c7fdcaf5d60b1b3aa83f2c9fa143417cc660722"
+  "1.71.0":
+    url: "https://boostorg.jfrog.io/artifactory/main/release/1.71.0/source/boost_1_71_0.tar.bz2"
+    sha256: "d73a8da01e8bf8c7eda40b4c84915071a8c8a0df4a6734537ddde4a8580524ee"
+patches:
+  "1.85.0":
+    - patch_file: "patches/1.82.0-locale-iconv-library-option.patch"
+      patch_description: "Optional flag to specify iconv from either libc of libiconv"
+      patch_type: "conan"
+  "1.84.0":
+    - patch_file: "patches/1.82.0-locale-iconv-library-option.patch"
+      patch_description: "Optional flag to specify iconv from either libc of libiconv"
+      patch_type: "conan"
+    - patch_file: "patches/1.84.0-reimplement-string_set-as-any-string.patch"
+      patch_description: "Fix compilation with cppstd=20 on libcxx platforms (e.g. MacOS)"
+      patch_type: "official"
+      patch_source: "https://github.com/boostorg/locale/commit/c5e8f02c903696a213fc4b710f6740ccd1f07f4e"
+  "1.83.0":
+    - patch_file: "patches/1.82.0-locale-iconv-library-option.patch"
+      patch_description: "Optional flag to specify iconv from either libc of libiconv"
+      patch_type: "conan"
+    - patch_file: "patches/1.83.0-locale-msvc.patch"
+      patch_description: "Fix compilation on windows when NOMINMAX is not defined"
+      patch_type: "official"
+      patch_source: "https://github.com/boostorg/locale/pull/189"
+  "1.82.0":
+    - patch_file: "patches/1.82.0-locale-iconv-library-option.patch"
+      patch_description: "Optional flag to specify iconv from either libc of libiconv"
+      patch_type: "conan"
+  "1.81.0":
+    - patch_file: "patches/boost_1_77_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.81.0-locale-fail-on-missing-backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+  "1.80.0":
+    - patch_file: "patches/1.80.0-locale-fail-on-missing-backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_1_77_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.80.0-0001-filesystem-win-fix-dir-it-net-share.patch"
+      patch_description: "Directory iterators may fail to construct for a network share on Windows prior to 10"
+      patch_type: "official"
+      patch_source: "https://github.com/boostorg/filesystem/issues/245"
+    - patch_file: "patches/1.80.0-0002-filesystem-fix-weakly-canonical-long-path.patch"
+      patch_description: 'On Windows, weakly_canonical fails to process paths that start with the "\\?\" prefix'
+      patch_type: "official"
+      patch_source: "https://github.com/boostorg/filesystem/issues/247"
+    - patch_file: "patches/1.80.0-0003-unordered-valid-after-move.patch"
+      patch_description: "Containers are not in a valid state after moving"
+      patch_type: "official"
+      patch_source: "https://github.com/boostorg/unordered/issues/139"
+    - patch_file: "patches/1.80.0-0004-filesystem-posix-fix-no-at-apis-missing-include.patch"
+      patch_description: "On POSIX systems that don't support *at APIs, compilation fails due to a missing include"
+      patch_type: "official"
+      patch_source: "https://github.com/boostorg/filesystem/issues/250"
+    - patch_file: "patches/1.80.0-0005-config-libcpp15.patch"
+      patch_description: "Support for libcpp15 which removes std::unary_function and std::binary_function."
+      patch_type: "portability"
+      patch_source: "https://www.boost.org/patches/1_80_0/0005-config-libcpp15.patch"
+    - patch_file: "patches/1.80.0-0006-unordered-msvc-rtcc.patch"
+      patch_description: "Fix MSVC /RTCc build runtime failures."
+      patch_type: "official"
+      patch_source: "https://www.boost.org/patches/1_80_0/0006-unordered-msvc-rtcc.patch"
+  "1.79.0":
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_1_77_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.77.0-fiber-mingw.patch"
+      patch_description: "fix layout=versioned for clang@Macos + mingw@Windows"
+      patch_type: "conan"
+    - patch_file: "patches/1.79.0-0001-json-array-erase-relocate.patch"
+      patch_description: "json::array::erase(it) seg fault on linux"
+      patch_type: "official"
+      patch_source: "https://github.com/boostorg/json/issues/692"
+    - patch_file: "patches/1.79.0-smart_ptr_cw_ppc_msync.patch"
+      patch_description: "Use msync for PowerPC architectures"
+      patch_type: "portability"
+    - patch_file: "patches/1.79.0-geometry_no_rtti.patch"
+      patch_description: "Fix access specifier preventing use of experimental iterators. Allow more granular control over enabled experimental features."
+      patch_type: "portability"
+      patch_source: "https://github.com/boostorg/geometry/discussions/1041"
+  "1.78.0":
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_1_77_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.77.0-type_erasure-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.77.0-fiber-mingw.patch"
+      patch_description: "fix layout=versioned for clang@Macos + mingw@Windows"
+      patch_type: "conan"
+    - patch_file: "patches/1.78.0-b2-fix-install.patch"
+      patch_description: "Don't skip install targets if there's <build>no in ureqs"
+      patch_type: "official"
+      patch_source: "https://github.com/boostorg/build/pull/113"
+  "1.77.0":
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_1_77_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.77.0-type_erasure-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.77.0-fiber-mingw.patch"
+      patch_description: "fix layout=versioned for clang@Macos + mingw@Windows"
+      patch_type: "conan"
+    - patch_file: "patches/1.77.0-boost_build-with-newer-b2.patch"
+      patch_description: "Bump build_requires of 'b2' to '4.7.1' (was '4.5.0')"
+      patch_type: "conan"
+  "1.76.0":
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.76.0-0001-fix-include-inside-boost-namespace.patch"
+      patch_description: "Fix #include inside boost namespace"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/boostorg/math/pull/670"
+    - patch_file: "patches/1.77.0-type_erasure-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.77.0-boost_build-with-newer-b2.patch"
+      patch_description: "Bump build_requires of 'b2' to '4.7.1' (was '4.5.0')"
+      patch_type: "conan"
+  "1.75.0":
+    - patch_file: "patches/boost_build_qcc_fix_debug_build_parameter_since_1_74.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/python_base_prefix_since_1_74.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.77.0-type_erasure-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.75.0-boost_build-with-newer-b2.patch"
+      patch_description: "Bump build_requires of 'b2' to '4.7.1' (was '4.5.0')"
+      patch_type: "conan"
+  "1.74.0":
+    - patch_file: "patches/boost_build_qcc_fix_debug_build_parameter_since_1_74.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/python_base_prefix_since_1_74.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-random-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-type_erasure-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.75.0-boost_build-with-newer-b2.patch"
+      patch_description: "Bump build_requires of 'b2' to '4.7.1' (was '4.5.0')"
+      patch_type: "conan"
+  "1.73.0":
+    - patch_file: "patches/boost_build_qcc_fix_debug_build_parameter.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/python_base_prefix.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-random-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-type_erasure-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.75.0-boost_build-with-newer-b2.patch"
+      patch_description: "Bump build_requires of 'b2' to '4.7.1' (was '4.5.0')"
+      patch_type: "conan"
+  "1.72.0":
+    - patch_file: "patches/bcp_namespace_issues_1_72.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_build_qcc_fix_debug_build_parameter.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_core_qnx_cxx_provide___cxa_get_globals.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/python_base_prefix.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/solaris_pthread_data.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/0001-revert-cease-dependence-on-range.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_log_filesystem_no_deprecated_1_72.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-random-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-type_erasure-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.75.0-boost_build-with-newer-b2.patch"
+      patch_description: "Bump build_requires of 'b2' to '4.7.1' (was '4.5.0')"
+      patch_type: "conan"
+  "1.71.0":
+    - patch_file: "patches/bcp_namespace_issues_1_71.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_build_qcc_fix_debug_build_parameter.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_core_qnx_cxx_provide___cxa_get_globals.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/python_base_prefix.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/solaris_pthread_data.patch"
+      patch_description: ""
+      patch_type: "conan"
+    - patch_file: "patches/boost_locale_fail_on_missing_backend.patch"
+      patch_description: "Fails the build when there is no iconv backend"
+      patch_type: "conan"
+    - patch_file: "patches/boost_mpi_check.patch"
+      patch_description: "Fails the build when mpi is not configured"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-contract-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-locale-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-random-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.69.0-type_erasure-no-system.patch"
+      patch_description: "This library links to boost_system, even though that library is header-only"
+      patch_type: "conan"
+    - patch_file: "patches/1.75.0-boost_build-with-newer-b2.patch"
+      patch_description: "Bump build_requires of 'b2' to '4.7.1' (was '4.5.0')"
+      patch_type: "conan"
diff --git a/utils/ci/conan/recipes/boost/all/conanfile.py b/utils/ci/conan/recipes/boost/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..f766a841c17d4a9f8793d609a59dd86958480f16
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/conanfile.py
@@ -0,0 +1,1991 @@
+from conan import ConanFile
+from conan.errors import ConanException, ConanInvalidConfiguration
+from conan.tools.apple import is_apple_os, to_apple_arch, XCRun
+from conan.tools.build import build_jobs, check_min_cppstd, cross_building, valid_min_cppstd, supported_cppstd
+from conan.tools.env import VirtualBuildEnv
+from conan.tools.files import (
+    apply_conandata_patches, chdir, collect_libs, copy, export_conandata_patches,
+    get, mkdir, rename, replace_in_file, rm, rmdir, save
+)
+from conan.tools.gnu import AutotoolsToolchain
+from conan.tools.layout import basic_layout
+from conan.tools.microsoft import is_msvc, is_msvc_static_runtime, MSBuildToolchain, msvc_runtime_flag, VCVars
+from conan.tools.scm import Version
+
+import glob
+from io import StringIO
+import os
+import re
+import shlex
+import shutil
+import sys
+import yaml
+
+required_conan_version = ">=1.53.0"
+
+# When adding (or removing) an option, also add this option to the list in
+# `rebuild-dependencies.yml` and re-run that script.
+CONFIGURE_OPTIONS = (
+    "atomic",
+    "charconv",
+    "chrono",
+    "cobalt",
+    "container",
+    "context",
+    "contract",
+    "coroutine",
+    "date_time",
+    "exception",
+    "fiber",
+    "filesystem",
+    "graph",
+    "graph_parallel",
+    "iostreams",
+    "json",
+    "locale",
+    "log",
+    "math",
+    "mpi",
+    "nowide",
+    "program_options",
+    "python",
+    "random",
+    "regex",
+    "serialization",
+    "stacktrace",
+    "system",
+    "test",
+    "thread",
+    "timer",
+    "type_erasure",
+    "url",
+    "wave",
+)
+
+
+class BoostConan(ConanFile):
+    name = "boost"
+    description = "Boost provides free peer-reviewed portable C++ source libraries"
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://www.boost.org"
+    license = "BSL-1.0"
+    topics = ("libraries", "cpp")
+
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "header_only": [True, False],
+        "error_code_header_only": [True, False],
+        "system_no_deprecated": [True, False],
+        "asio_no_deprecated": [True, False],
+        "filesystem_no_deprecated": [True, False],
+        "filesystem_use_std_fs": [True, False],
+        "filesystem_version": [None, "3", "4"],
+        "layout": ["system", "versioned", "tagged", "b2-default"],
+        "magic_autolink": [True, False],  # enables BOOST_ALL_NO_LIB
+        "diagnostic_definitions": [True, False],  # enables BOOST_LIB_DIAGNOSTIC
+        "python_executable": [None, "ANY"],  # system default python installation is used, if None
+        "python_version": [None, "ANY"],  # major.minor; computed automatically, if None
+        "namespace": ["ANY"],  # custom boost namespace for bcp, e.g. myboost
+        "namespace_alias": [True, False],  # enable namespace alias for bcp, boost=myboost
+        "multithreading": [True, False],  # enables multithreading support
+        "numa": [True, False],
+        "zlib": [True, False],
+        "bzip2": [True, False],
+        "lzma": [True, False],
+        "zstd": [True, False],
+        "segmented_stacks": [True, False],
+        "debug_level": list(range(0, 14)),
+        "pch": [True, False],
+        "extra_b2_flags": [None, "ANY"],  # custom b2 flags
+        "i18n_backend": ["iconv", "icu", None, "deprecated"],
+        "i18n_backend_iconv": ["libc", "libiconv", "off"],
+        "i18n_backend_icu": [True, False],
+        "visibility": ["global", "protected", "hidden"],
+        "addr2line_location": ["ANY"],
+        "with_stacktrace_backtrace": [True, False],
+        "buildid": [None, "ANY"],
+        "python_buildid": [None, "ANY"],
+        "system_use_utf8": [True, False],
+    }
+    options.update({f"without_{_name}": [True, False] for _name in CONFIGURE_OPTIONS})
+
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+        "header_only": False,
+        "error_code_header_only": False,
+        "system_no_deprecated": False,
+        "asio_no_deprecated": False,
+        "filesystem_no_deprecated": False,
+        "filesystem_use_std_fs": False,
+        "filesystem_version": None,
+        "layout": "system",
+        "magic_autolink": False,
+        "diagnostic_definitions": False,
+        "python_executable": None,
+        "python_version": None,
+        "namespace": "boost",
+        "namespace_alias": False,
+        "multithreading": True,
+        "numa": True,
+        "zlib": True,
+        "bzip2": True,
+        "lzma": False,
+        "zstd": False,
+        "segmented_stacks": False,
+        "debug_level": 0,
+        "pch": True,
+        "extra_b2_flags": None,
+        "i18n_backend": "deprecated",
+        "i18n_backend_iconv": "libc",
+        "i18n_backend_icu": False,
+        "visibility": "hidden",
+        "addr2line_location": "/usr/bin/addr2line",
+        "with_stacktrace_backtrace": True,
+        "buildid": None,
+        "python_buildid": None,
+        "system_use_utf8": False,
+    }
+    default_options.update({f"without_{_name}": False for _name in CONFIGURE_OPTIONS})
+    default_options.update({f"without_{_name}": True for _name in ("graph_parallel", "mpi", "python")})
+
+    short_paths = True
+    no_copy_source = True
+    _cached_dependencies = None
+
+    def export(self):
+        copy(self, f"dependencies/{self._dependency_filename}", src=self.recipe_folder, dst=self.export_folder)
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def _cppstd_flag(self, compiler_cppstd=None):
+        """Return the flag for the given C++ standard and compiler"""
+        # TODO: Replace it by Conan tool when available: https://github.com/conan-io/conan/issues/12603
+        compiler = self.settings.get_safe("compiler")
+        compiler_version = self.settings.get_safe("compiler.version")
+        cppstd = self.settings.get_safe("compiler.cppstd") or compiler_cppstd
+        if not compiler or not compiler_version or not cppstd:
+            return ""
+
+        def _cppstd_gcc(gcc_version, cppstd):
+            """Return the flag for the given C++ standard and GCC version"""
+            cppstd_flags = {}
+            cppstd_flags.setdefault("98", "98" if gcc_version >= "3.4" else None)
+            cppstd_flags.setdefault("11", "11" if gcc_version >= "4.7" else "0x" if gcc_version >= "4.3" else None)
+            cppstd_flags.setdefault("14", "14" if gcc_version >= "4.9" else "1y" if gcc_version >= "4.8" else None)
+            cppstd_flags.setdefault("17", "17" if gcc_version >= "5.2" else "1z" if gcc_version >= "5" else None)
+            cppstd_flags.setdefault("20", "2a" if gcc_version >= "8" else "20" if gcc_version >= "12" else None)
+            cppstd_flags.setdefault("23", "2b" if gcc_version >= "11" else None)
+            return cppstd_flags.get(cppstd.lstrip("gnu"))
+
+        def _cppstd_clang(clang_version, cppstd):
+            """Return the flag for the given C++ standard and Clang version"""
+            cppstd_flags = {}
+            cppstd_flags.setdefault("98", "98" if clang_version >= "2.1" else None)
+            cppstd_flags.setdefault("11", "11" if clang_version >= "3.1" else "0x" if clang_version >= "2.1" else None)
+            cppstd_flags.setdefault("14", "14" if clang_version >= "3.5" else "1y" if clang_version >= "3.4" else None)
+            cppstd_flags.setdefault("17", "17" if clang_version >= "5" else "1z" if clang_version >= "3.5" else None)
+            cppstd_flags.setdefault("20", "2a" if clang_version >= "6" else "20" if clang_version >= "12" else None)
+            cppstd_flags.setdefault("23", "2b" if clang_version >= "13"  else "23" if clang_version >= "17" else None)
+            return cppstd_flags.get(cppstd.lstrip("gnu"))
+
+
+        def _cppstd_apple_clang(clang_version, cppstd):
+            """Return the flag for the given C++ standard and Apple Clang version"""
+            cppstd_flags = {}
+            cppstd_flags.setdefault("98", "98" if clang_version >= "4.0" else None)
+            cppstd_flags.setdefault("11", "11" if clang_version >= "4.0" else None)
+            cppstd_flags.setdefault("14", "14" if clang_version >= "6.1" else "1y" if clang_version >= "5.1" else None)
+            cppstd_flags.setdefault("17", "17" if clang_version >= "9.1" else "1z" if clang_version >= "6.1" else None)
+            cppstd_flags.setdefault("20", "20" if clang_version >= "13.0" else "2a" if clang_version >= "10.0" else None)
+            cppstd_flags.setdefault("23", "2b" if clang_version >= "13.0" else None)
+            return cppstd_flags.get(cppstd.lstrip("gnu"))
+
+        def _cppstd_msvc(visual_version, cppstd):
+            """Return the flag for the given C++ standard and MSVC version"""
+            cppstd_flags = {}
+            cppstd_flags.setdefault("98", "98")
+            cppstd_flags.setdefault("11", "11")
+            cppstd_flags.setdefault("14", "14" if visual_version >= "190" else None)
+            cppstd_flags.setdefault("17", "17" if visual_version >= "191" else "latest" if visual_version >= "190" else None)
+            cppstd_flags.setdefault("20", "20" if visual_version >= "192" else "latest" if visual_version >= "191" else None)
+            cppstd_flags.setdefault("23", "latest" if visual_version >= "193" else None)
+            return cppstd_flags.get(cppstd)
+
+        func = {"gcc": _cppstd_gcc, "clang": _cppstd_clang, "apple-clang": _cppstd_apple_clang, "msvc": _cppstd_msvc}.get(compiler)
+        flag = cppstd
+        if func:
+            flag = func(Version(compiler_version), str(cppstd))
+        return flag
+
+    @property
+    def _min_compiler_version_default_cxx11(self):
+        """ Minimum compiler version having c++ standard >= 11
+        """
+        return {
+            "gcc": 6,
+            "clang": 6,
+            "apple-clang": 99,  # still uses C++98 by default. XCode does not reflect apple-clang
+            "Visual Studio": 14,  # guess
+            "msvc": 190,  # guess
+        }.get(str(self.settings.compiler))
+
+    @property
+    def _min_compiler_version_default_cxx14(self):
+        """ Minimum compiler version having c++ standard >= 14
+        https://gcc.gnu.org/gcc-6/changes.html
+        https://releases.llvm.org/6.0.0/tools/clang/docs/ReleaseNotes.html#id9
+        https://learn.microsoft.com/en-us/cpp/build/reference/std-specify-language-standard-version?view=msvc-150#remarks
+        """
+        return {
+            "gcc": 6,
+            "clang": 6,
+            "apple-clang": 99,  # still uses C++98 by default. XCode does not reflect apple-clang
+            "Visual Studio": 15,  # guess
+            "msvc": 191,  # guess
+        }.get(str(self.settings.compiler))
+
+    @property
+    def _min_compiler_version_default_cxx20(self):
+        return {
+            "gcc": 99,
+            "clang": 99,
+            "apple-clang": 99,
+            "Visual Studio": 99,
+            "msvc": 999,
+        }.get(str(self.settings.compiler))
+
+    @property
+    def _has_cppstd_11_supported(self):
+        cppstd = self.settings.compiler.get_safe("cppstd")
+        if cppstd:
+            return valid_min_cppstd(self, 11)
+        compiler_version = self._min_compiler_version_default_cxx11
+        if compiler_version:
+            return (Version(self.settings.compiler.version) >= compiler_version) or "11" in supported_cppstd(self)
+
+    @property
+    def _has_cppstd_14_supported(self):
+        cppstd = self.settings.compiler.get_safe("cppstd")
+        if cppstd:
+            return valid_min_cppstd(self, 14)
+        required_compiler_version = self._min_compiler_version_default_cxx14
+        if required_compiler_version:
+            msvc_versions = {14: 190, 15: 191, 16: 192, 17: 193}
+            compiler_version = Version(self.settings.compiler.version)
+            is_visual_studio = str(self.settings.compiler) == "Visual Studio"
+            # supported_cppstd only supports msvc, but not Visual Studio as compiler
+            supported_cxx14 = "14" in supported_cppstd(self, "msvc", msvc_versions.get(compiler_version)) if is_visual_studio else "14" in supported_cppstd(self)
+            # supported_cppstd: lists GCC 5 due partial support for C++14, but not enough for Boost
+            return (compiler_version >= required_compiler_version) and supported_cxx14
+
+
+    @property
+    def _min_compiler_version_nowide(self):
+        # Nowide needs c++11 + swappable std::fstream
+        return {
+            "gcc": 4.8,
+            "clang": 5,
+            "Visual Studio": 14,  # guess
+            "msvc": 190,  # guess
+        }.get(str(self.settings.compiler))
+
+    @property
+    def _dependency_filename(self):
+        return f"dependencies-{self.version}.yml"
+
+    @property
+    def _dependencies(self):
+        if self._cached_dependencies is None:
+            dependencies_filepath = os.path.join(self.recipe_folder, "dependencies", self._dependency_filename)
+            if not os.path.isfile(dependencies_filepath):
+                raise ConanException(f"Cannot find {dependencies_filepath}")
+            with open(dependencies_filepath, encoding='utf-8') as f:
+                self._cached_dependencies = yaml.safe_load(f)
+        return self._cached_dependencies
+
+    def _all_dependent_modules(self, name):
+        dependencies = {name}
+        while True:
+            new_dependencies = set()
+            for dependency in dependencies:
+                new_dependencies.update(set(self._dependencies["dependencies"][dependency]))
+                new_dependencies.update(dependencies)
+            if len(new_dependencies) > len(dependencies):
+                dependencies = new_dependencies
+            else:
+                break
+        return dependencies
+
+    def _all_super_modules(self, name):
+        dependencies = {name}
+        while True:
+            new_dependencies = set(dependencies)
+            for module in self._dependencies["dependencies"]:
+                if dependencies.intersection(set(self._dependencies["dependencies"][module])):
+                    new_dependencies.add(module)
+            if len(new_dependencies) > len(dependencies):
+                dependencies = new_dependencies
+            else:
+                break
+        return dependencies
+
+    @property
+    def _bcp_dir(self):
+        return "custom-boost"
+
+    @property
+    def _settings_build(self):
+        return getattr(self, "settings_build", self.settings)
+
+    @property
+    def _is_clang_cl(self):
+        return self.settings.os == "Windows" and self.settings.compiler == "clang"
+
+    @property
+    def _python_executable(self):
+        """
+        obtain full path to the python interpreter executable
+        :return: path to the python interpreter executable, either set by option, or system default
+        """
+        exe = self.options.python_executable if self.options.python_executable else sys.executable
+        return str(exe).replace("\\", "/")
+
+    @property
+    def _is_windows_platform(self):
+        return self.settings.os in ["Windows", "WindowsStore", "WindowsCE"]
+
+    @property
+    def _is_apple_embedded_platform(self):
+        return self.settings.os in ["iOS", "watchOS", "tvOS"]
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+        # Test whether all config_options from the yml are available in CONFIGURE_OPTIONS
+        for opt_name in self._configure_options:
+            if f"without_{opt_name}" not in self.options:
+                raise ConanException(f"{self._dependency_filename} has the configure options {opt_name} which is not available in conanfile.py")
+
+        # stacktrace_backtrace not supported on Windows
+        if self.settings.os == "Windows":
+            del self.options.with_stacktrace_backtrace
+
+        # nowide requires a c++11-able compiler + movable std::fstream: change default to not build on compiler with too old default c++ standard or too low compiler.cppstd
+        # json requires a c++11-able compiler: change default to not build on compiler with too old default c++ standard or too low compiler.cppstd
+        if self.settings.compiler.get_safe("cppstd"):
+            if not valid_min_cppstd(self, 11):
+                self.options.without_fiber = True
+                self.options.without_nowide = True
+                self.options.without_json = True
+                self.options.without_url = True
+        else:
+            version_cxx11_standard_json = self._min_compiler_version_default_cxx11
+            if version_cxx11_standard_json:
+                if not self._has_cppstd_11_supported:
+                    self.options.without_fiber = True
+                    self.options.without_json = True
+                    self.options.without_nowide = True
+                    self.options.without_url = True
+            else:
+                self.options.without_fiber = True
+                self.options.without_json = True
+                self.options.without_nowide = True
+                self.options.without_url = True
+        if Version(self.version) >= "1.85.0" and not self._has_cppstd_14_supported:
+            self.options.without_math = True
+
+        # iconv is off by default on Windows and Solaris
+        if self._is_windows_platform or self.settings.os == "SunOS":
+            self.options.i18n_backend_iconv = "off"
+        elif is_apple_os(self):
+            self.options.i18n_backend_iconv = "libiconv"
+        elif self.settings.os == "Android":
+            # bionic provides iconv since API level 28
+            api_level = self.settings.get_safe("os.api_level")
+            if api_level and Version(api_level) < "28":
+                self.options.i18n_backend_iconv = "libiconv"
+
+        # Remove options not supported by this version of boost
+        for dep_name in CONFIGURE_OPTIONS:
+            if dep_name not in self._configure_options:
+                delattr(self.options, f"without_{dep_name}")
+
+        def disable_math():
+            super_modules = self._all_super_modules("math")
+            for smod in super_modules:
+                try:
+                    setattr(self.options, f"without_{smod}", True)
+                except ConanException:
+                    pass
+
+        if Version(self.version) >= "1.76.0":
+            # Starting from 1.76.0, Boost.Math requires a c++11 capable compiler
+            # ==> disable it by default for older compilers or c++ standards
+            if self.settings.compiler.get_safe("cppstd"):
+                if not valid_min_cppstd(self, 11):
+                    disable_math()
+            else:
+                min_compiler_version = self._min_compiler_version_default_cxx11
+                if min_compiler_version is None:
+                    self.output.warning("Assuming the compiler supports c++11 by default")
+                elif not self._has_cppstd_11_supported:
+                    disable_math()
+                # Boost.Math is not built when the compiler is GCC < 5 and uses C++11
+                elif self.settings.compiler == "gcc" and Version(self.settings.compiler.version) < "5":
+                    disable_math()
+
+        if Version(self.version) >= "1.79.0":
+            # Starting from 1.79.0, Boost.Wave requires a c++11 capable compiler
+            # ==> disable it by default for older compilers or c++ standards
+
+            def disable_wave():
+                super_modules = self._all_super_modules("wave")
+                for smod in super_modules:
+                    try:
+                        setattr(self.options, f"without_{smod}", True)
+                    except ConanException:
+                        pass
+
+            if self.settings.compiler.get_safe("cppstd"):
+                if not valid_min_cppstd(self, 11):
+                    disable_wave()
+            else:
+                min_compiler_version = self._min_compiler_version_default_cxx11
+                if min_compiler_version is None:
+                    self.output.warning("Assuming the compiler supports c++11 by default")
+                elif not self._has_cppstd_11_supported:
+                    disable_wave()
+                # Boost.Wave is not built when the compiler is GCC < 5 and uses C++11
+                elif self.settings.compiler == "gcc" and Version(self.settings.compiler.version) < "5":
+                    disable_wave()
+
+        if Version(self.version) >= "1.81.0":
+            # Starting from 1.81.0, Boost.Locale requires a c++11 capable compiler
+            # ==> disable it by default for older compilers or c++ standards
+
+            def disable_locale():
+                super_modules = self._all_super_modules("locale")
+                for smod in super_modules:
+                    try:
+                        setattr(self.options, f"without_{smod}", True)
+                    except ConanException:
+                        pass
+
+            if self.settings.compiler.get_safe("cppstd"):
+                if not valid_min_cppstd(self, 11):
+                    disable_locale()
+            else:
+                min_compiler_version = self._min_compiler_version_default_cxx11
+                if min_compiler_version is None:
+                    self.output.warning("Assuming the compiler supports c++11 by default")
+                elif not self._has_cppstd_11_supported:
+                    disable_locale()
+                # Boost.Locale is not built when the compiler is GCC < 5 and uses C++11
+                elif self.settings.compiler == "gcc" and Version(self.settings.compiler.version) < "5":
+                    disable_locale()
+
+        if Version(self.version) >= "1.84.0":
+            # Starting from 1.84.0, Boost.Cobalt requires a c++20 capable compiler
+            # ==> disable it by default for older compilers or c++ standards
+
+            def disable_cobalt():
+                super_modules = self._all_super_modules("cobalt")
+                for smod in super_modules:
+                    try:
+                        setattr(self.options, f"without_{smod}", True)
+                    except ConanException:
+                        pass
+
+            if self.settings.compiler.get_safe("cppstd"):
+                if not valid_min_cppstd(self, 20):
+                    disable_cobalt()
+            else:
+                min_compiler_version = self._min_compiler_version_default_cxx20
+                if min_compiler_version is None:
+                    self.output.warning("Assuming the compiler supports c++20 by default")
+                elif Version(self.settings.compiler.version) < min_compiler_version:
+                    disable_cobalt()
+
+            # FIXME: Compilation errors on msvc shared build for boost.fiber https://github.com/boostorg/fiber/issues/314
+            if is_msvc(self):
+                self.options.without_fiber = True
+
+        if Version(self.version) >= "1.85.0":
+            # Starting from 1.85.0, Boost.Math requires a c++14 capable compiler
+            # https://github.com/boostorg/math/blob/boost-1.85.0/README.md
+            # ==> disable it by default for older compilers or c++ standards
+            if self.settings.compiler.get_safe("cppstd"):
+                if not valid_min_cppstd(self, 14):
+                    disable_math()
+            else:
+                min_compiler_version = self._min_compiler_version_default_cxx14
+                if min_compiler_version is None:
+                    self.output.warning("Assuming the compiler supports c++14 by default")
+                elif not self._has_cppstd_14_supported:
+                    disable_math()
+
+
+    @property
+    def _configure_options(self):
+        return self._dependencies["configure_options"]
+
+    @property
+    def _fPIC(self):
+        return self.options.get_safe("fPIC", self.default_options["fPIC"])
+
+    @property
+    def _shared(self):
+        return self.options.get_safe("shared", self.default_options["shared"])
+
+    @property
+    def _stacktrace_addr2line_available(self):
+        if (self._is_apple_embedded_platform or self.settings.get_safe("os.subsystem") == "catalyst"):
+             # sandboxed environment - cannot launch external processes (like addr2line), system() function is forbidden
+            return False
+        return not self.options.header_only and not self.options.without_stacktrace and self.settings.os != "Windows"
+
+    @property
+    def _stacktrace_from_exception_available(self):
+        if Version(self.version) >= "1.85.0":
+            return not self.options.header_only and not self.options.without_stacktrace and self.settings.os != "Windows"
+
+    def configure(self):
+        if self.options.header_only:
+            self.options.rm_safe("shared")
+            self.options.rm_safe("fPIC")
+        elif self.options.shared:
+            self.options.rm_safe("fPIC")
+
+        if self.options.i18n_backend != "deprecated":
+            self.output.warning("i18n_backend option is deprecated, do not use anymore.")
+            if self.options.i18n_backend == "iconv":
+                self.options.i18n_backend_iconv = "libiconv"
+                self.options.i18n_backend_icu = False
+            if self.options.i18n_backend == "icu":
+                self.options.i18n_backend_iconv = "off"
+                self.options.i18n_backend_icu = True
+            if self.options.i18n_backend == "None":
+                self.options.i18n_backend_iconv = "off"
+                self.options.i18n_backend_icu = False
+        if self.options.without_locale:
+            self.options.rm_safe("i18n_backend_iconv")
+            self.options.rm_safe("i18n_backend_icu")
+
+        if not self.options.without_python:
+            if not self.options.python_version:
+                self.options.python_version = self._detect_python_version()
+                self.options.python_executable = self._python_executable
+        else:
+            self.options.rm_safe("python_buildid")
+
+        if not self._stacktrace_addr2line_available:
+            self.options.rm_safe("addr2line_location")
+
+        if self.options.get_safe("without_stacktrace", True):
+            self.options.rm_safe("with_stacktrace_backtrace")
+
+        if self.options.layout == "b2-default":
+            self.options.layout = "versioned" if self.settings.os == "Windows" else "system"
+
+        if self.options.without_fiber:
+            self.options.rm_safe("numa")
+
+    def layout(self):
+        basic_layout(self, src_folder="src")
+
+    @property
+    def _cxx11_boost_libraries(self):
+        libraries = ["fiber", "json", "nowide", "url"]
+        if Version(self.version) >= "1.76.0":
+            libraries.append("math")
+        if Version(self.version) >= "1.79.0":
+            libraries.append("wave")
+        if Version(self.version) >= "1.81.0":
+            libraries.append("locale")
+        if Version(self.version) >= "1.84.0":
+            libraries.append("atomic")
+            libraries.append("filesystem")
+            libraries.append("log")
+            libraries.append("random")
+            libraries.append("stacktrace")
+            libraries.append("test")
+            libraries.append("thread")
+        if Version(self.version) >= "1.85.0":
+            libraries.append("system")
+        libraries.sort()
+        return filter(lambda library: f"without_{library}" in self.options, libraries)
+
+    @property
+    def _cxx14_boost_libraries(self):
+        libraries = []
+        if Version(self.version) >= "1.85.0":
+            # https://github.com/boostorg/math/blob/develop/README.md#boost-math-library
+            libraries.append("math")
+        libraries.sort()
+        return filter(lambda library: f"without_{library}" in self.options, libraries)
+
+    def validate(self):
+        if not self.options.multithreading:
+            # * For the reason 'thread' is deactivate look at https://stackoverflow.com/a/20991533
+            #   Look also on the comments of the answer for more details
+            # * Although the 'context' and 'atomic' library does not mention anything about threading,
+            #   when being build the compiler uses the -pthread flag, which makes it quite dangerous
+            for lib in ["locale", "coroutine", "wave", "type_erasure", "fiber", "thread", "context", "atomic"]:
+                if not self.options.get_safe(f"without_{lib}"):
+                    raise ConanInvalidConfiguration(f"Boost '{lib}' library requires multi threading")
+
+        if is_msvc(self) and self._shared and is_msvc_static_runtime(self):
+            raise ConanInvalidConfiguration("Boost can not be built as shared library with MT runtime.")
+
+        # FIXME: In 1.84.0, there are compilation errors on msvc shared build for boost.fiber. https://github.com/boostorg/fiber/issues/314
+        if Version(self.version) >= "1.84.0" and is_msvc(self) and self._shared and not self.options.without_fiber:
+            raise ConanInvalidConfiguration("Boost.fiber can not be built as shared library on MSVC.")
+
+        if not self.options.without_locale and self.options.i18n_backend_iconv == "off" and \
+           not self.options.i18n_backend_icu and not self._is_windows_platform:
+            raise ConanInvalidConfiguration(
+                "Boost.Locale library needs either iconv or ICU library to be built on non windows platforms"
+            )
+
+        if self._stacktrace_addr2line_available:
+            if not os.path.isabs(str(self.options.addr2line_location)):
+                raise ConanInvalidConfiguration("addr2line_location must be an absolute path to addr2line")
+
+        # Check, when a boost module is enabled, whether the boost modules it depends on are enabled as well.
+        for mod_name, mod_deps in self._dependencies["dependencies"].items():
+            if not self.options.get_safe(f"without_{mod_name}", True):
+                for mod_dep in mod_deps:
+                    if self.options.get_safe(f"without_{mod_dep}", False):
+                        raise ConanInvalidConfiguration(f"{mod_name} requires {mod_deps}: {mod_dep} is disabled")
+
+        if not self.options.get_safe("without_nowide", True):
+            # nowide require a c++11-able compiler with movable std::fstream
+            mincompiler_version = self._min_compiler_version_nowide
+            if mincompiler_version and Version(self.settings.compiler.version) < mincompiler_version:
+                raise ConanInvalidConfiguration("This compiler is too old to build Boost.nowide.")
+
+        if any([not self.options.get_safe(f"without_{library}", True) for library in self._cxx11_boost_libraries]):
+            if self.settings.compiler.get_safe("cppstd"):
+                check_min_cppstd(self, 11)
+            else:
+                if not self._has_cppstd_11_supported:
+                    raise ConanInvalidConfiguration(
+                        f"Boost.{{{','.join(self._cxx11_boost_libraries)}}} requires a c++11 compiler "
+                        "(please set compiler.cppstd or use a newer compiler)"
+                    )
+
+        if any([not self.options.get_safe(f"without_{library}", True) for library in self._cxx14_boost_libraries]):
+            if self.settings.compiler.get_safe("cppstd"):
+                check_min_cppstd(self, 14)
+            else:
+                if not self._has_cppstd_14_supported:
+                    raise ConanInvalidConfiguration(
+                        f"Boost.{{{','.join(self._cxx14_boost_libraries)}}} requires a c++14 compiler "
+                        "(please set compiler.cppstd or use a newer compiler)"
+                    )
+
+    def _with_dependency(self, dependency):
+        """
+        Return true when dependency is required according to the dependencies-x.y.z.yml file
+        """
+        for name, reqs in self._dependencies["requirements"].items():
+            if dependency in reqs:
+                if not self.options.get_safe(f"without_{name}", True):
+                    return True
+        return False
+
+    @property
+    def _with_zlib(self):
+        return not self.options.header_only and self._with_dependency("zlib") and self.options.zlib
+
+    @property
+    def _with_bzip2(self):
+        return not self.options.header_only and self._with_dependency("bzip2") and self.options.bzip2
+
+    @property
+    def _with_lzma(self):
+        return not self.options.header_only and self._with_dependency("lzma") and self.options.lzma
+
+    @property
+    def _with_zstd(self):
+        return not self.options.header_only and self._with_dependency("zstd") and self.options.zstd
+
+    @property
+    def _with_icu(self):
+        return not self.options.header_only and self._with_dependency("icu") and self.options.get_safe("i18n_backend_icu")
+
+    @property
+    def _with_iconv(self):
+        return not self.options.header_only and self._with_dependency("iconv") and self.options.get_safe("i18n_backend_iconv") == "libiconv"
+
+    @property
+    def _with_stacktrace_backtrace(self):
+        return not self.options.header_only and self.options.get_safe("with_stacktrace_backtrace", False)
+
+    def requirements(self):
+        if self._with_zlib:
+            self.requires(f"zlib/[>=1.2.11 <2]")
+        if self._with_bzip2:
+            self.requires(f"bzip2/1.0.8")
+        if self._with_lzma:
+            self.requires(f"xz_utils/5.4.4")
+        if self._with_zstd:
+            self.requires(f"zstd/1.5.5")
+        if self._with_stacktrace_backtrace:
+            self.requires(f"libbacktrace/cci.20210118", transitive_headers=True, transitive_libs=True)
+
+        if self._with_icu:
+            self.requires(f"icu/73.2")
+        if self._with_iconv:
+            self.requires(f"libiconv/1.17")
+
+    def package_id(self):
+        del self.info.options.i18n_backend
+
+        if self.info.options.header_only:
+            self.info.clear()
+        else:
+            del self.info.options.debug_level
+            del self.info.options.filesystem_version
+            del self.info.options.pch
+            del self.info.options.python_executable  # PATH to the interpreter is not important, only version matters
+            if self.info.options.without_python:
+                del self.info.options.python_version
+
+    def build_requirements(self):
+        if not self.options.header_only:
+            self.tool_requires(f"b2/4.10.1")
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version],
+            destination=self.source_folder, strip_root=True)
+        apply_conandata_patches(self)
+
+    def generate(self):
+        if not self.options.header_only:
+            env = VirtualBuildEnv(self)
+            env.generate()
+            vc = VCVars(self)
+            vc.generate()
+
+    ##################### BUILDING METHODS ###########################
+
+    def _run_python_script(self, script):
+        """
+        execute python one-liner script and return its output
+        :param script: string containing python script to be executed
+        :return: output of the python script execution, or None, if script has failed
+        """
+        output = StringIO()
+        command = f'"{self._python_executable}" -c "{script}"'
+        self.output.info(f"running {command}")
+        try:
+            self.run(command, output, scope="run")
+        except ConanException:
+            self.output.info("(failed)")
+            return None
+        output = output.getvalue()
+        # Conan is broken when run_to_output = True
+        if "\n-----------------\n" in output:
+            output = output.split("\n-----------------\n", 1)[1]
+        output = output.strip()
+        return output if output != "None" else None
+
+    def _get_python_path(self, name):
+        """
+        obtain path entry for the python installation
+        :param name: name of the python config entry for path to be queried (such as "include", "platinclude", etc.)
+        :return: path entry from the sysconfig
+        """
+        # https://docs.python.org/3/library/sysconfig.html
+        # https://docs.python.org/2.7/library/sysconfig.html
+        return self._run_python_script("from __future__ import print_function; "
+                                       "import sysconfig; "
+                                       f"print(sysconfig.get_path('{name}'))")
+
+    def _get_python_sc_var(self, name):
+        """
+        obtain value of python sysconfig variable
+        :param name: name of variable to be queried (such as LIBRARY or LDLIBRARY)
+        :return: value of python sysconfig variable
+        """
+        return self._run_python_script("from __future__ import print_function; "
+                                       "import sysconfig; "
+                                       f"print(sysconfig.get_config_var('{name}'))")
+
+    def _get_python_du_var(self, name):
+        """
+        obtain value of python distutils sysconfig variable
+        (sometimes sysconfig returns empty values, while python.sysconfig provides correct values)
+        :param name: name of variable to be queried (such as LIBRARY or LDLIBRARY)
+        :return: value of python sysconfig variable
+        """
+        return self._run_python_script("from __future__ import print_function; "
+                                       "import distutils.sysconfig as du_sysconfig; "
+                                       f"print(du_sysconfig.get_config_var('{name}'))")
+
+    def _get_python_var(self, name):
+        """
+        obtain value of python variable, either by sysconfig, or by distutils.sysconfig
+        :param name: name of variable to be queried (such as LIBRARY or LDLIBRARY)
+        :return: value of python sysconfig variable
+
+        NOTE: distutils is deprecated and breaks the recipe since Python 3.10
+        """
+        python_version_parts = str(self.info.options.python_version).split('.')
+        python_major = int(python_version_parts[0])
+        python_minor = int(python_version_parts[1])
+        if(python_major >= 3 and python_minor >= 10):
+            return self._get_python_sc_var(name)
+
+        return self._get_python_sc_var(name) or self._get_python_du_var(name)
+
+    def _detect_python_version(self):
+        """
+        obtain version of python interpreter
+        :return: python interpreter version, in format major.minor
+        """
+        return self._run_python_script("from __future__ import print_function; "
+                                       "import sys; "
+                                       "print('{}.{}'.format(sys.version_info[0], sys.version_info[1]))")
+
+    @property
+    def _python_version(self):
+        version = self._detect_python_version()
+        if self.options.python_version and version != self.options.python_version:
+            raise ConanInvalidConfiguration(f"detected python version {version} doesn't match conan option {self.options.python_version}")
+        return version
+
+    @property
+    def _python_inc(self):
+        """
+        obtain the result of the "sysconfig.get_python_inc()" call
+        :return: result of the "sysconfig.get_python_inc()" execution
+        """
+        return self._run_python_script("from __future__ import print_function; "
+                                       "import sysconfig; "
+                                       "print(sysconfig.get_python_inc())")
+
+    @property
+    def _python_abiflags(self):
+        """
+        obtain python ABI flags, see https://www.python.org/dev/peps/pep-3149/ for the details
+        :return: the value of python ABI flags
+        """
+        return self._run_python_script("from __future__ import print_function; "
+                                       "import sys; "
+                                       "print(getattr(sys, 'abiflags', ''))")
+
+    @property
+    def _python_includes(self):
+        """
+        attempt to find directory containing Python.h header file
+        :return: the directory with python includes
+        """
+        include = self._get_python_path("include")
+        plat_include = self._get_python_path("platinclude")
+        include_py = self._get_python_var("INCLUDEPY")
+        include_dir = self._get_python_var("INCLUDEDIR")
+        python_inc = self._python_inc
+
+        candidates = [include,
+                      plat_include,
+                      include_py,
+                      include_dir,
+                      python_inc]
+        for candidate in candidates:
+            if candidate:
+                python_h = os.path.join(candidate, 'Python.h')
+                self.output.info(f"checking {python_h}")
+                if os.path.isfile(python_h):
+                    self.output.info(f"found Python.h: {python_h}")
+                    return candidate.replace("\\", "/")
+        raise Exception("couldn't locate Python.h - make sure you have installed python development files")
+
+    @property
+    def _python_library_dir(self):
+        """
+        attempt to find python development library
+        :return: the full path to the python library to be linked with
+        """
+        library = self._get_python_var("LIBRARY")
+        ldlibrary = self._get_python_var("LDLIBRARY")
+        libdir = self._get_python_var("LIBDIR")
+        multiarch = self._get_python_var("MULTIARCH")
+        masd = self._get_python_var("multiarchsubdir")
+        with_dyld = self._get_python_var("WITH_DYLD")
+        if libdir and multiarch and masd and not libdir.endswith(masd):
+            if masd.startswith(os.sep):
+                masd = masd[len(os.sep):]
+            self.output.warning(f"Python libdir candidate thingy: {libdir}")
+            libdir = os.path.join(libdir, masd)
+
+        if not libdir:
+            libdest = self._get_python_var("LIBDEST")
+            libdir = os.path.join(os.path.dirname(libdest), "libs")
+
+        candidates = [ldlibrary, library]
+        library_prefixes = [""] if is_msvc(self) else ["", "lib"]
+        library_suffixes = [".lib"] if is_msvc(self) else [".so", ".dll.a", ".a"]
+        if with_dyld:
+            library_suffixes.insert(0, ".dylib")
+
+        python_version = self._python_version
+        python_version_no_dot = python_version.replace(".", "")
+        versions = ["", python_version, python_version_no_dot]
+        abiflags = self._python_abiflags
+
+        for prefix in library_prefixes:
+            for suffix in library_suffixes:
+                for version in versions:
+                    candidates.append(f"{prefix}python{version}{abiflags}{suffix}")
+
+        for candidate in candidates:
+            if candidate:
+                python_lib = os.path.join(libdir, candidate)
+                self.output.info(f"checking {python_lib}")
+                if os.path.isfile(python_lib):
+                    self.output.info(f"found python library: {python_lib}")
+                    return libdir.replace("\\", "/")
+        raise ConanInvalidConfiguration("couldn't locate python libraries - make sure you have installed python development files")
+
+    def _clean(self):
+        clean_dirs = [
+            os.path.join(self.build_folder, "bin.v2"),
+            os.path.join(self.build_folder, "architecture"),
+            os.path.join(self.source_folder, self._bcp_dir),
+            os.path.join(self.source_folder, "dist", "bin"),
+            os.path.join(self.source_folder, "stage"),
+            os.path.join(self.source_folder, "tools", "build", "src", "engine", "bootstrap"),
+            os.path.join(self.source_folder, "tools", "build", "src", "engine", "bin.ntx86"),
+            os.path.join(self.source_folder, "tools", "build", "src", "engine", "bin.ntx86_64"),
+        ]
+        for d in clean_dirs:
+            if os.path.isdir(d):
+                self.output.warning(f"removing '{d}'")
+                shutil.rmtree(d)
+
+    @property
+    def _b2_exe(self):
+        return "b2"
+
+    @property
+    def _bcp_exe(self):
+        folder = os.path.join(self.source_folder, "dist", "bin")
+        return os.path.join(folder, "bcp")
+
+    @property
+    def _use_bcp(self):
+        return self.options.namespace != "boost"
+
+    @property
+    def _boost_build_dir(self):
+        return os.path.join(self.source_folder, "tools", "build")
+
+    def _build_bcp(self):
+        folder = os.path.join(self.source_folder, "tools", "bcp")
+        with chdir(self, folder):
+            command = f"{self._b2_exe} -j{build_jobs(self)} --abbreviate-paths toolset={self._toolset}"
+            command += f" -d{self.options.debug_level}"
+            self.output.warning(command)
+            self.run(command)
+
+    def _run_bcp(self):
+        with chdir(self, self.source_folder):
+            mkdir(self, self._bcp_dir)
+            namespace = f"--namespace={self.options.namespace}"
+            alias = "--namespace-alias" if self.options.namespace_alias else ""
+            boostdir = f"--boost={self.source_folder}"
+            libraries = {"build", "boost-build.jam", "boostcpp.jam", "boost_install", "headers"}
+            for d in os.listdir(os.path.join(self.source_folder, "boost")):
+                if os.path.isdir(os.path.join(self.source_folder, "boost", d)):
+                    libraries.add(d)
+            for d in os.listdir(os.path.join(self.source_folder, "libs")):
+                if os.path.isdir(os.path.join(self.source_folder, "libs", d)):
+                    libraries.add(d)
+            libraries = " ".join(libraries)
+            command = f"{self._bcp_exe} {namespace} {alias} {boostdir} {libraries} {self._bcp_dir}"
+            self.output.warning(command)
+            self.run(command)
+
+    def build(self):
+        stacktrace_jamfile = os.path.join(self.source_folder, "libs", "stacktrace", "build", "Jamfile.v2")
+        if cross_building(self, skip_x64_x86=True):
+            # When cross building, do not attempt to run the test-executable (assume they work)
+            replace_in_file(self, stacktrace_jamfile, "$(>) > $(<)", "echo \"\" > $(<)", strict=False)
+        if self._with_stacktrace_backtrace and self.settings.os != "Windows" and not cross_building(self):
+            # When libbacktrace is shared, give extra help to the test-executable
+            linker_var = "DYLD_LIBRARY_PATH" if self.settings.os == "Macos" else "LD_LIBRARY_PATH"
+            libbacktrace_libdir = self.dependencies["libbacktrace"].cpp_info.aggregated_components().libdirs[0]
+            patched_run_rule = f"{linker_var}={libbacktrace_libdir} $(>) > $(<)"
+            replace_in_file(self, stacktrace_jamfile, "$(>) > $(<)", patched_run_rule, strict=False)
+            if self.dependencies["libbacktrace"].options.shared:
+                replace_in_file(self, stacktrace_jamfile, "<link>static", "<link>shared", strict=False)
+
+        # Older clang releases require a thread_local variable to be initialized by a constant value
+        replace_in_file(self, os.path.join(self.source_folder, "boost", "stacktrace", "detail", "libbacktrace_impls.hpp"),
+                              "/* thread_local */", "thread_local", strict=False)
+        replace_in_file(self, os.path.join(self.source_folder, "boost", "stacktrace", "detail", "libbacktrace_impls.hpp"),
+                              "/* static __thread */", "static __thread", strict=False)
+        if self.settings.compiler == "apple-clang" or (self.settings.compiler == "clang" and Version(self.settings.compiler.version) < 6):
+            replace_in_file(self, os.path.join(self.source_folder, "boost", "stacktrace", "detail", "libbacktrace_impls.hpp"),
+                                  "thread_local", "/* thread_local */")
+            replace_in_file(self, os.path.join(self.source_folder, "boost", "stacktrace", "detail", "libbacktrace_impls.hpp"),
+                                  "static __thread", "/* static __thread */")
+        replace_in_file(self, os.path.join(self.source_folder, "tools", "build", "src", "tools", "gcc.jam"),
+                              "local generic-os = [ set.difference $(all-os) : aix darwin vxworks solaris osf hpux ] ;",
+                              "local generic-os = [ set.difference $(all-os) : aix darwin vxworks solaris osf hpux iphone appletv ] ;",
+                              strict=False)
+        replace_in_file(self, os.path.join(self.source_folder, "tools", "build", "src", "tools", "gcc.jam"),
+                              "local no-threading = android beos haiku sgi darwin vxworks ;",
+                              "local no-threading = android beos haiku sgi darwin vxworks iphone appletv ;",
+                              strict=False)
+        replace_in_file(self, os.path.join(self.source_folder, "libs", "fiber", "build", "Jamfile.v2"),
+                              "    <conditional>@numa",
+                              "    <link>shared:<library>.//boost_fiber : <conditional>@numa",
+                              strict=False)
+        if self.settings.os == "Android":
+            # force versionless soname from boostorg/boost#206
+            # this can be applied to all versions and it's easier with a replace
+            replace_in_file(self, os.path.join(self.source_folder, "boostcpp.jam"),
+                            "! [ $(property-set).get <target-os> ] in windows cygwin darwin aix &&",
+                            "! [ $(property-set).get <target-os> ] in windows cygwin darwin aix android &&",
+                            strict=False)
+
+        if self.options.header_only:
+            self.output.warning("Header only package, skipping build")
+            return
+
+        self._clean()
+
+        if self._use_bcp:
+            self._build_bcp()
+            self._run_bcp()
+
+        self._create_user_config_jam(self._boost_build_dir)
+
+        # JOIN ALL FLAGS
+        b2_flags = " ".join(self._build_flags)
+        full_command = f"{self._b2_exe} {b2_flags}"
+        # -d2 is to print more debug info and avoid travis timing out without output
+        sources = os.path.join(self.source_folder, self._bcp_dir) if self._use_bcp else self.source_folder
+        full_command += f' --debug-configuration --build-dir="{self.build_folder}"'
+        self.output.warning(full_command)
+
+        # If sending a user-specified toolset to B2, setting the vcvars
+        # interferes with the compiler selection.
+        with chdir(self, sources):
+            # To show the libraries *1
+            # self.run("%s --show-libraries" % b2_exe)
+            self.run(full_command)
+
+    @property
+    def _b2_os(self):
+        return {
+            "Windows": "windows",
+            "WindowsStore": "windows",
+            "Linux": "linux",
+            "Android": "android",
+            "Macos": "darwin",
+            "iOS": "iphone",
+            "watchOS": "iphone",
+            "tvOS": "appletv",
+            "FreeBSD": "freebsd",
+            "SunOS": "solaris",
+        }.get(str(self.settings.os))
+
+    @property
+    def _b2_address_model(self):
+        if self.settings.arch in ("x86_64", "ppc64", "ppc64le", "mips64", "armv8", "armv8.3", "sparcv9"):
+            return "64"
+
+        return "32"
+
+    @property
+    def _b2_binary_format(self):
+        return {
+            "Windows": "pe",
+            "WindowsStore": "pe",
+            "Linux": "elf",
+            "Android": "elf",
+            "Macos": "mach-o",
+            "iOS": "mach-o",
+            "watchOS": "mach-o",
+            "tvOS": "mach-o",
+            "FreeBSD": "elf",
+            "SunOS": "elf",
+        }.get(str(self.settings.os))
+
+    @property
+    def _b2_architecture(self):
+        if str(self.settings.arch).startswith("x86"):
+            return "x86"
+        if str(self.settings.arch).startswith("ppc"):
+            return "power"
+        if str(self.settings.arch).startswith("arm"):
+            return "arm"
+        if str(self.settings.arch).startswith("sparc"):
+            return "sparc"
+        if str(self.settings.arch).startswith("mips64"):
+            return "mips64"
+        if str(self.settings.arch).startswith("mips"):
+            return "mips1"
+        if str(self.settings.arch).startswith("s390"):
+            return "s390x"
+
+        return None
+
+    @property
+    def _b2_abi(self):
+        if str(self.settings.arch).startswith("x86"):
+            return "ms" if str(self.settings.os) in ["Windows", "WindowsStore"] else "sysv"
+        if str(self.settings.arch).startswith("ppc"):
+            return "sysv"
+        if str(self.settings.arch).startswith("arm"):
+            return "aapcs"
+        if str(self.settings.arch).startswith("mips"):
+            return "o32"
+
+        return None
+
+    @property
+    def _gnu_cxx11_abi(self):
+        """Checks libcxx setting and returns value for the GNU C++11 ABI flag
+        _GLIBCXX_USE_CXX11_ABI= .  Returns None if C++ library cannot be
+        determined.
+        """
+        try:
+            if str(self.settings.compiler.libcxx) == "libstdc++":
+                return "0"
+            if str(self.settings.compiler.libcxx) == "libstdc++11":
+                return "1"
+        except ConanException:
+            pass
+        return None
+
+    @property
+    def _build_flags(self):
+        flags = self._build_cross_flags
+
+        # Stop at the first error. No need to continue building.
+        flags.append("-q")
+
+        if self.options.get_safe("numa"):
+            flags.append("numa=on")
+
+        # https://www.boost.org/doc/libs/1_70_0/libs/context/doc/html/context/architectures.html
+        if not self._is_apple_embedded_platform and self._b2_os:
+            flags.append(f"target-os={self._b2_os}")
+        if self._b2_architecture:
+            flags.append(f"architecture={self._b2_architecture}")
+        if self._b2_address_model:
+            flags.append(f"address-model={self._b2_address_model}")
+        if self._b2_binary_format:
+            flags.append(f"binary-format={self._b2_binary_format}")
+        if self._b2_abi:
+            flags.append(f"abi={self._b2_abi}")
+
+        flags.append(f"--layout={self.options.layout}")
+        flags.append(f"--user-config={os.path.join(self._boost_build_dir, 'user-config.jam')}")
+        flags.append(f"-sNO_ZLIB={'0' if self._with_zlib else '1'}")
+        flags.append(f"-sNO_BZIP2={'0' if self._with_bzip2 else '1'}")
+        flags.append(f"-sNO_LZMA={'0' if self._with_lzma else '1'}")
+        flags.append(f"-sNO_ZSTD={'0' if self._with_zstd else '1'}")
+
+        if self.options.get_safe("i18n_backend_icu"):
+            flags.append("boost.locale.icu=on")
+        else:
+            flags.append("boost.locale.icu=off")
+            flags.append("--disable-icu")
+        if self.options.get_safe("i18n_backend_iconv") in ["libc", "libiconv"]:
+            flags.append("boost.locale.iconv=on")
+            if self.options.get_safe("i18n_backend_iconv") == "libc":
+                flags.append("boost.locale.iconv.lib=libc")
+            else:
+                flags.append("boost.locale.iconv.lib=libiconv")
+        else:
+            flags.append("boost.locale.iconv=off")
+            flags.append("--disable-iconv")
+
+        def add_defines(library):
+            for define in self.dependencies[library].cpp_info.aggregated_components().defines:
+                flags.append(f"define={define}")
+
+        if self._with_zlib:
+            add_defines("zlib")
+        if self._with_bzip2:
+            add_defines("bzip2")
+        if self._with_lzma:
+            add_defines("xz_utils")
+        if self._with_zstd:
+            add_defines("zstd")
+
+        for define in self.conf.get("tools.build:defines", default=[], check_type=list):
+            flags.append(f"define={define}")
+
+        if is_msvc(self):
+            flags.append(f"runtime-link={'static' if is_msvc_static_runtime(self) else 'shared'}")
+            flags.append(f"runtime-debugging={'on' if 'd' in msvc_runtime_flag(self) else 'off'}")
+
+        # For details https://boostorg.github.io/build/manual/master/index.html
+        flags.append(f"threading={'single' if not self.options.multithreading else 'multi'}")
+        flags.append(f"visibility={self.options.visibility}")
+
+        flags.append(f"link={'shared' if self._shared else 'static'}")
+        if self.settings.build_type == "Debug":
+            flags.append("variant=debug")
+        else:
+            flags.append("variant=release")
+
+        for libname in self._configure_options:
+            if not getattr(self.options, f"without_{libname}"):
+                flags.append(f"--with-{libname}")
+
+        flags.append(f"toolset={self._toolset}")
+
+        safe_cppstd = self.settings.get_safe("compiler.cppstd")
+        if safe_cppstd:
+            cppstd_version = self._cppstd_flag(safe_cppstd)
+            flags.append(f"cxxstd={cppstd_version}")
+            if "gnu" in safe_cppstd:
+                flags.append("cxxstd-dialect=gnu")
+        elif Version(self.version) >= "1.85.0" and self._has_cppstd_14_supported:
+            cppstd_version = self._cppstd_flag("14")
+            flags.append(f"cxxstd={cppstd_version}")
+        elif self._has_cppstd_11_supported:
+            cppstd_version = self._cppstd_flag("11")
+            flags.append(f"cxxstd={cppstd_version}")
+
+        # LDFLAGS
+        link_flags = []
+
+        # CXX FLAGS
+        cxx_flags = []
+        # fPIC DEFINITION
+        if self._fPIC:
+            cxx_flags.append("-fPIC")
+        if self.settings.build_type == "RelWithDebInfo":
+            if self.settings.compiler == "gcc" or "clang" in str(self.settings.compiler):
+                cxx_flags.append("-g")
+            elif is_msvc(self):
+                cxx_flags.append("/Z7")
+
+        # Standalone toolchain fails when declare the std lib
+        if self.settings.os not in ("Android", "Emscripten"):
+            try:
+                if self._gnu_cxx11_abi:
+                    flags.append(f"define=_GLIBCXX_USE_CXX11_ABI={self._gnu_cxx11_abi}")
+
+                if self.settings.compiler in ("clang", "apple-clang"):
+                    libcxx = {
+                        "libstdc++11": "libstdc++",
+                    }.get(str(self.settings.compiler.libcxx), str(self.settings.compiler.libcxx))
+                    cxx_flags.append(f"-stdlib={libcxx}")
+                    link_flags.append(f"-stdlib={libcxx}")
+            except ConanException:
+                pass
+
+        if self.options.error_code_header_only:
+            flags.append("define=BOOST_ERROR_CODE_HEADER_ONLY=1")
+        if self.options.system_no_deprecated:
+            flags.append("define=BOOST_SYSTEM_NO_DEPRECATED=1")
+        if self.options.asio_no_deprecated:
+            flags.append("define=BOOST_ASIO_NO_DEPRECATED=1")
+        if self.options.filesystem_no_deprecated:
+            flags.append("define=BOOST_FILESYSTEM_NO_DEPRECATED=1")
+        if self.options.filesystem_use_std_fs:
+            flags.append("define=BOOST_DLL_USE_STD_FS=1")
+        if self.options.system_use_utf8:
+            flags.append("define=BOOST_SYSTEM_USE_UTF8=1")
+        if self.options.segmented_stacks:
+            flags.extend(["segmented-stacks=on",
+                          "define=BOOST_USE_SEGMENTED_STACKS=1",
+                          "define=BOOST_USE_UCONTEXT=1"])
+        flags.append("pch=on" if self.options.pch else "pch=off")
+
+        if is_apple_os(self):
+            apple_min_version_flag = AutotoolsToolchain(self).apple_min_version_flag
+            if apple_min_version_flag:
+                cxx_flags.append(apple_min_version_flag)
+                link_flags.append(apple_min_version_flag)
+            os_subsystem = self.settings.get_safe("os.subsystem")
+            if os_subsystem == "catalyst":
+                cxx_flags.append("--target=arm64-apple-ios-macabi")
+                link_flags.append("--target=arm64-apple-ios-macabi")
+
+        if self.settings.os == "iOS":
+            if self.options.multithreading:
+                cxx_flags.append("-DBOOST_SP_USE_SPINLOCK")
+
+            if self.conf.get("tools.apple:enable_bitcode", check_type=bool):
+                cxx_flags.append("-fembed-bitcode")
+        if self._with_stacktrace_backtrace:
+            flags.append(f"-sLIBBACKTRACE_PATH={self.dependencies['libbacktrace'].package_folder}")
+        if self._stacktrace_from_exception_available and "x86" not in str(self.settings.arch):
+            # https://github.com/boostorg/stacktrace/blob/boost-1.85.0/src/from_exception.cpp#L29
+            # This feature is guarded by BOOST_STACKTRACE_ALWAYS_STORE_IN_PADDING, but that is only enabled on x86.
+            flags.append("define=BOOST_STACKTRACE_LIBCXX_RUNTIME_MAY_CAUSE_MEMORY_LEAK=1")
+        if self._with_iconv:
+            flags.append(f"-sICONV_PATH={self.dependencies['libiconv'].package_folder}")
+        if self._with_icu:
+            flags.append(f"-sICU_PATH={self.dependencies['icu'].package_folder}")
+            if not self.dependencies["icu"].options.shared:
+                # Using ICU_OPTS to pass ICU system libraries is not possible due to Boost.Regex disallowing it.
+                icu_system_libs = self.dependencies["icu"].cpp_info.aggregated_components().system_libs
+                if is_msvc(self):
+                    icu_ldflags = " ".join(f"{l}.lib" for l in icu_system_libs)
+                else:
+                    icu_ldflags = " ".join(f"-l{l}" for l in icu_system_libs)
+                link_flags.append(icu_ldflags)
+
+        link_flags = f'linkflags="{" ".join(link_flags)}"'
+        flags.append(link_flags)
+
+        if self.options.get_safe("addr2line_location"):
+            cxx_flags.append(f"-DBOOST_STACKTRACE_ADDR2LINE_LOCATION={self.options.addr2line_location}")
+
+        cxx_flags = f'cxxflags="{" ".join(cxx_flags)}"'
+        flags.append(cxx_flags)
+
+        if self.options.buildid:
+            flags.append(f"--buildid={self.options.buildid}")
+        if not self.options.without_python and self.options.python_buildid:
+            flags.append(f"--python-buildid={self.options.python_buildid}")
+
+        if self.options.extra_b2_flags:
+            flags.extend(shlex.split(str(self.options.extra_b2_flags)))
+
+        flags.extend([
+            "install",
+            f"--prefix={self.package_folder}",
+            f"-j{build_jobs(self)}",
+            "--abbreviate-paths",
+            f"-d{self.options.debug_level}",
+        ])
+        return flags
+
+    @property
+    def _build_cross_flags(self):
+        flags = []
+        if not cross_building(self):
+            return flags
+        arch = self.settings.get_safe("arch")
+        self.output.info("Cross building, detecting compiler...")
+
+        if arch.startswith("arm"):
+            if "hf" in arch:
+                flags.append("-mfloat-abi=hard")
+        elif self.settings.os == "Emscripten":
+            pass
+        elif arch in ["x86", "x86_64"]:
+            pass
+        elif arch.startswith("ppc"):
+            pass
+        elif arch.startswith("mips"):
+            pass
+        else:
+            self.output.warning(f"Unable to detect the appropriate ABI for {arch} architecture.")
+        self.output.info(f"Cross building flags: {flags}")
+
+        return flags
+
+    @property
+    def _ar(self):
+        ar = VirtualBuildEnv(self).vars().get("AR")
+        if ar:
+            return ar
+        if is_apple_os(self) and self.settings.compiler == "apple-clang":
+            return XCRun(self).ar
+        return None
+
+    @property
+    def _ranlib(self):
+        ranlib = VirtualBuildEnv(self).vars().get("RANLIB")
+        if ranlib:
+            return ranlib
+        if is_apple_os(self) and self.settings.compiler == "apple-clang":
+            return XCRun(self).ranlib
+        return None
+
+    @property
+    def _cxx(self):
+        compilers_by_conf = self.conf.get("tools.build:compiler_executables", default={}, check_type=dict)
+        cxx = compilers_by_conf.get("cpp") or VirtualBuildEnv(self).vars().get("CXX")
+        if cxx:
+            return cxx
+        if is_apple_os(self) and self.settings.compiler == "apple-clang":
+            return XCRun(self).cxx
+        compiler_version = str(self.settings.compiler.version)
+        major = compiler_version.split(".", maxsplit=1)[0]
+        if self.settings.compiler == "gcc":
+            return shutil.which(f"g++-{compiler_version}") or shutil.which(f"g++-{major}") or shutil.which("g++") or ""
+        if self.settings.compiler == "clang":
+            return shutil.which(f"clang++-{compiler_version}") or shutil.which(f"clang++-{major}") or shutil.which("clang++") or ""
+        return ""
+
+    def _create_user_config_jam(self, folder):
+        self.output.warning("Patching user-config.jam")
+
+        def create_library_config(deps_name, name):
+            aggregated_cpp_info = self.dependencies[deps_name].cpp_info.aggregated_components()
+            if len(aggregated_cpp_info.libs) == 0:
+                return ""
+
+            includedir = aggregated_cpp_info.includedirs[0].replace("\\", "/")
+            includedir = f"\"{includedir}\""
+            libdir = aggregated_cpp_info.libdirs[0].replace("\\", "/")
+            libdir = f"\"{libdir}\""
+            lib = aggregated_cpp_info.libs[0]
+            version = self.dependencies[deps_name].ref.version
+            return f"\nusing {name} : {version} : " \
+                   f"<include>{includedir} " \
+                   f"<search>{libdir} " \
+                   f"<name>{lib} ;"
+
+        contents = ""
+
+        if self._with_zlib:
+            contents += create_library_config("zlib", "zlib")
+        if self._with_bzip2:
+            contents += create_library_config("bzip2", "bzip2")
+        if self._with_lzma:
+            contents += create_library_config("xz_utils", "lzma")
+        if self._with_zstd:
+            contents += create_library_config("zstd", "zstd")
+
+        if not self.options.without_python:
+            # https://www.boost.org/doc/libs/1_70_0/libs/python/doc/html/building/configuring_boost_build.html
+            contents += f'\nusing python : {self._python_version} : "{self._python_executable}" : "{self._python_includes}" : "{self._python_library_dir}" ;'
+
+        if not self.options.without_mpi:
+            # https://www.boost.org/doc/libs/1_72_0/doc/html/mpi/getting_started.html
+            contents += "\nusing mpi ;"
+
+        # Specify here the toolset with the binary if present if don't empty parameter :
+        contents += f'\nusing "{self._toolset}" : {self._toolset_version} : '
+
+        cxx_fwd_slahes = self._cxx.replace("\\", "/")
+        if cxx_fwd_slahes:
+            contents += f" \"{cxx_fwd_slahes}\""
+
+        if is_apple_os(self):
+            if self.settings.compiler == "apple-clang":
+                contents += f" -isysroot {XCRun(self).sdk_path}"
+            if self.settings.get_safe("arch"):
+                contents += f" -arch {to_apple_arch(self)}"
+
+        contents += " : \n"
+        if self._ar:
+            ar_path = self._ar.replace("\\", "/")
+            contents += f'<archiver>"{ar_path}" '
+        if self._ranlib:
+            ranlib_path = self._ranlib.replace("\\", "/")
+            contents += f'<ranlib>"{ranlib_path}" '
+        cxxflags = " ".join(self.conf.get("tools.build:cxxflags", default=[], check_type=list)) + " "
+        cflags = " ".join(self.conf.get("tools.build:cflags", default=[], check_type=list)) + " "
+        buildenv_vars = VirtualBuildEnv(self).vars()
+        cppflags = buildenv_vars.get("CPPFLAGS", "") + " "
+        ldflags = " ".join(self.conf.get("tools.build:sharedlinkflags", default=[], check_type=list)) + " "
+        asflags = buildenv_vars.get("ASFLAGS", "") + " "
+
+        sysroot = self.conf.get("tools.build:sysroot")
+        if sysroot and not is_msvc(self):
+            sysroot = sysroot.replace("\\", "/")
+            sysroot = f'"{sysroot}"' if ' ' in sysroot else sysroot
+            cppflags += f"--sysroot={sysroot} "
+            ldflags += f"--sysroot={sysroot} "
+
+        if self._with_stacktrace_backtrace:
+            backtrace_aggregated_cpp_info = self.dependencies["libbacktrace"].cpp_info.aggregated_components()
+            cppflags += " ".join(f"-I{p}" for p in backtrace_aggregated_cpp_info.includedirs) + " "
+            ldflags += " ".join(f"-L{p}" for p in backtrace_aggregated_cpp_info.libdirs) + " "
+
+        if cxxflags.strip():
+            contents += f'<cxxflags>"{cxxflags.strip()}" '
+        if cflags.strip():
+            contents += f'<cflags>"{cflags.strip()}" '
+        if cppflags.strip():
+            contents += f'<compileflags>"{cppflags.strip()}" '
+        if ldflags.strip():
+            contents += f'<linkflags>"{ldflags.strip()}" '
+        if asflags.strip():
+            contents += f'<asmflags>"{asflags.strip()}" '
+
+        if self._is_apple_embedded_platform:
+            contents += f'<target-os>"{self._b2_os}" '
+
+        contents += " ;"
+
+        self.output.warning(contents)
+        filename = f"{folder}/user-config.jam"
+        save(self, filename, contents)
+
+    @property
+    def _toolset_version(self):
+        toolset = MSBuildToolchain(self).toolset
+        if toolset:
+            match = re.match(r"v(\d+)(\d)$", toolset)
+            if match:
+                return f"{match.group(1)}.{match.group(2)}"
+        return ""
+
+    @property
+    def _toolset(self):
+        if is_msvc(self):
+            return "clang-win" if self.settings.compiler.get_safe("toolset") == "ClangCL" else "msvc"
+        if self.settings.os == "Windows" and self.settings.compiler == "clang":
+            return "clang-win"
+        if self.settings.os == "Emscripten" and self.settings.compiler == "clang":
+            return "emscripten"
+        if self.settings.compiler == "gcc" and is_apple_os(self):
+            return "darwin"
+        if self.settings.compiler == "apple-clang":
+            return "clang-darwin"
+        if self.settings.os == "Android" and self.settings.compiler == "clang":
+            return "clang-linux"
+        if self.settings.compiler in ["clang", "gcc"]:
+            return str(self.settings.compiler)
+        if self.settings.compiler == "sun-cc":
+            return "sunpro"
+        if self.settings.compiler == "intel":
+            return {
+                "Macos": "intel-darwin",
+                "Windows": "intel-win",
+                "Linux": "intel-linux",
+            }[str(self.settings.os)]
+
+        return str(self.settings.compiler)
+
+    @property
+    def _toolset_tag(self):
+        # compiler       | compiler.version | os          | toolset_tag    | remark
+        # ---------------+------------------+-------------+----------------+-----------------------------
+        # apple-clang    | 12               | Macos       | darwin12       |
+        # clang          | 12               | Macos       | clang-darwin12 |
+        # gcc            | 11               | Linux       | gcc8           |
+        # gcc            | 8                | Windows     | mgw8           |
+        # Visual Studio  | 17               | Windows     | vc142          | depends on compiler.toolset
+        compiler = {
+            "apple-clang": "",
+            "Visual Studio": "vc",
+            "msvc": "vc",
+        }.get(str(self.settings.compiler), str(self.settings.compiler))
+        if (self.settings.compiler, self.settings.os) == ("gcc", "Windows"):
+            compiler = "mgw"
+        os_ = ""
+        if self.settings.os == "Macos":
+            os_ = "darwin"
+        if is_msvc(self):
+            toolset_version = self._toolset_version.replace(".", "")
+        else:
+            toolset_version = str(Version(self.settings.compiler.version).major)
+
+        toolset_parts = [compiler, os_]
+        toolset_tag = "-".join(part for part in toolset_parts if part) + toolset_version
+        return toolset_tag
+
+    ####################################################################
+
+    def package(self):
+        # This stage/lib is in source_folder... Face palm, looks like it builds in build but then
+        # copy to source with the good lib name
+        copy(self, "LICENSE_1_0.txt", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
+        if self.options.header_only:
+            copy(self, "*", src=os.path.join(self.source_folder, "boost"),
+                            dst=os.path.join(self.package_folder, "include", "boost"))
+
+        if self.settings.os == "Emscripten" and not self.options.header_only:
+            self._create_emscripten_libs()
+
+        if is_msvc(self) and self._shared:
+            # Some boost releases contain both static and shared variants of some libraries (if shared=True)
+            all_libs = set(collect_libs(self, "lib"))
+            static_libs = set(l for l in all_libs if l.startswith("lib"))
+            shared_libs = all_libs.difference(static_libs)
+            static_libs = set(l[3:] for l in static_libs)
+            common_libs = static_libs.intersection(shared_libs)
+            for common_lib in common_libs:
+                common_lib_fullname = f"lib{common_lib}.lib"
+                self.output.info(f'Unlinking static duplicate library: {os.path.join(self.package_folder, "lib", common_lib_fullname)}')
+                os.unlink(os.path.join(self.package_folder, "lib", common_lib_fullname))
+
+        dll_pdbs = glob.glob(os.path.join(self.package_folder, "lib", "*.dll")) + \
+                    glob.glob(os.path.join(self.package_folder, "lib", "*.pdb"))
+        if dll_pdbs:
+            mkdir(self, os.path.join(self.package_folder, "bin"))
+            for bin_file in dll_pdbs:
+                rename(self, bin_file, os.path.join(self.package_folder, "bin", os.path.basename(bin_file)))
+
+        rm(self, "*.pdb", os.path.join(self.package_folder, "bin"))
+
+    def _create_emscripten_libs(self):
+        # Boost Build doesn't create the libraries, but it gets close,
+        # leaving .bc files where the libraries would be.
+        staged_libs = os.path.join(
+            self.package_folder, "lib"
+        )
+        if not os.path.exists(staged_libs):
+            self.output.warning(f"Lib folder doesn't exist, can't collect libraries: {staged_libs}")
+            return
+        for bc_file in os.listdir(staged_libs):
+            if bc_file.startswith("lib") and bc_file.endswith(".bc"):
+                a_file = bc_file[:-3] + ".a"
+                cmd = f"emar q {os.path.join(staged_libs, a_file)} {os.path.join(staged_libs, bc_file)}"
+                self.output.info(cmd)
+                self.run(cmd)
+
+    @staticmethod
+    def _option_to_conan_requirement(name):
+        return {
+            "lzma": "xz_utils",
+            "iconv": "libiconv",
+            "python": None,  # FIXME: change to cpython when it becomes available
+        }.get(name, name)
+
+    def package_info(self):
+        self.env_info.BOOST_ROOT = self.package_folder
+
+        self.cpp_info.set_property("cmake_file_name", "Boost")
+        self.cpp_info.filenames["cmake_find_package"] = "Boost"
+        self.cpp_info.filenames["cmake_find_package_multi"] = "Boost"
+        self.cpp_info.names["cmake_find_package"] = "Boost"
+        self.cpp_info.names["cmake_find_package_multi"] = "Boost"
+
+        # - Use 'headers' component for all includes + defines
+        # - Use '_libboost' component to attach extra system_libs, ...
+
+        self.cpp_info.components["headers"].libs = []
+        self.cpp_info.components["headers"].libdirs = []
+        self.cpp_info.components["headers"].set_property("cmake_target_name", "Boost::headers")
+        self.cpp_info.components["headers"].names["cmake_find_package"] = "headers"
+        self.cpp_info.components["headers"].names["cmake_find_package_multi"] = "headers"
+        self.cpp_info.components["headers"].names["pkg_config"] = "boost"
+
+        if self.options.system_no_deprecated:
+            self.cpp_info.components["headers"].defines.append("BOOST_SYSTEM_NO_DEPRECATED")
+
+        if self.options.asio_no_deprecated:
+            self.cpp_info.components["headers"].defines.append("BOOST_ASIO_NO_DEPRECATED")
+
+        if self.options.filesystem_no_deprecated:
+            self.cpp_info.components["headers"].defines.append("BOOST_FILESYSTEM_NO_DEPRECATED")
+
+        if self.options.filesystem_use_std_fs:
+            self.cpp_info.components["headers"].defines.append("BOOST_DLL_USE_STD_FS")
+
+        if self.options.filesystem_version:
+            self.cpp_info.components["headers"].defines.append(f"BOOST_FILESYSTEM_VERSION={self.options.filesystem_version}")
+
+        if self.options.segmented_stacks:
+            self.cpp_info.components["headers"].defines.extend(["BOOST_USE_SEGMENTED_STACKS", "BOOST_USE_UCONTEXT"])
+
+        if self.options.system_use_utf8:
+            self.cpp_info.components["headers"].defines.append("BOOST_SYSTEM_USE_UTF8")
+
+        if self.options.buildid:
+            # If you built Boost using the --buildid option then set this macro to the same value
+            # as you passed to bjam.
+            # For example if you built using bjam address-model=64 --buildid=amd64 then compile your code with
+            # -DBOOST_LIB_BUILDID=amd64 to ensure the correct libraries are selected at link time.
+            self.cpp_info.components["headers"].defines.append(f"BOOST_LIB_BUILDID={self.options.buildid}")
+
+        if not self.options.header_only:
+            if self.options.error_code_header_only:
+                self.cpp_info.components["headers"].defines.append("BOOST_ERROR_CODE_HEADER_ONLY")
+
+        if self.options.layout == "versioned":
+            version = Version(self.version)
+            self.cpp_info.components["headers"].includedirs.append(os.path.join("include", f"boost-{version.major}_{version.minor}"))
+
+        # Boost::boost is an alias of Boost::headers
+        self.cpp_info.components["_boost_cmake"].requires = ["headers"]
+        self.cpp_info.components["_boost_cmake"].set_property("cmake_target_name", "Boost::boost")
+        self.cpp_info.components["_boost_cmake"].names["cmake_find_package"] = "boost"
+        self.cpp_info.components["_boost_cmake"].names["cmake_find_package_multi"] = "boost"
+        if self.options.header_only:
+            self.cpp_info.components["_boost_cmake"].libdirs = []
+
+        if not self.options.header_only:
+            self.cpp_info.components["_libboost"].requires = ["headers"]
+
+            self.cpp_info.components["diagnostic_definitions"].libs = []
+            self.cpp_info.components["diagnostic_definitions"].set_property("cmake_target_name", "Boost::diagnostic_definitions")
+            self.cpp_info.components["diagnostic_definitions"].names["cmake_find_package"] = "diagnostic_definitions"
+            self.cpp_info.components["diagnostic_definitions"].names["cmake_find_package_multi"] = "diagnostic_definitions"
+            self.cpp_info.components["diagnostic_definitions"].names["pkg_config"] = "boost_diagnostic_definitions"  # FIXME: disable on pkg_config
+            # I would assume headers also need the define BOOST_LIB_DIAGNOSTIC, as a header can trigger an autolink,
+            # and this definition triggers a print out of the library selected.  See notes below on autolink and headers.
+            self.cpp_info.components["headers"].requires.append("diagnostic_definitions")
+            if self.options.diagnostic_definitions:
+                self.cpp_info.components["diagnostic_definitions"].defines = ["BOOST_LIB_DIAGNOSTIC"]
+
+            self.cpp_info.components["disable_autolinking"].libs = []
+            self.cpp_info.components["disable_autolinking"].set_property("cmake_target_name", "Boost::disable_autolinking")
+            self.cpp_info.components["disable_autolinking"].names["cmake_find_package"] = "disable_autolinking"
+            self.cpp_info.components["disable_autolinking"].names["cmake_find_package_multi"] = "disable_autolinking"
+            self.cpp_info.components["disable_autolinking"].names["pkg_config"] = "boost_disable_autolinking"  # FIXME: disable on pkg_config
+
+            # Even headers needs to know the flags for disabling autolinking ...
+            # magic_autolink is an option in the recipe, so if a consumer wants this version of boost,
+            # then they should not get autolinking.
+            # Note that autolinking can sneak in just by some file #including a header with (eg) boost/atomic.hpp,
+            # even if it doesn't use any part that requires linking with libboost_atomic in order to compile.
+            # So a boost-header-only library that links to Boost::headers needs to see BOOST_ALL_NO_LIB
+            # in order to avoid autolinking to libboost_atomic
+
+            # This define is already imported into all of the _libboost libraries from this recipe anyway,
+            # so it would be better to be consistent and ensure ANYTHING using boost (headers or libs) has consistent #defines.
+
+            # Same applies for for BOOST_AUTO_LINK_{layout}:
+            # consumer libs that use headers also need to know what is the layout/filename of the libraries.
+            #
+            # eg, if using the "tagged" naming scheme, and a header triggers an autolink,
+            # then that header's autolink request had better be configured to request the "tagged" library name.
+            # Otherwise, the linker will be looking for a (eg) "versioned" library name, and there will be a link error.
+
+            # Note that "_libboost" requires "headers" so these defines will be applied to all the libraries too.
+            self.cpp_info.components["headers"].requires.append("disable_autolinking")
+            if is_msvc(self) or self._is_clang_cl:
+                if self.options.magic_autolink:
+                    if self.options.layout == "system":
+                        self.cpp_info.components["headers"].defines.append("BOOST_AUTO_LINK_SYSTEM")
+                    elif self.options.layout == "tagged":
+                        self.cpp_info.components["headers"].defines.append("BOOST_AUTO_LINK_TAGGED")
+                    self.output.info("Enabled magic autolinking (smart and magic decisions)")
+                else:
+                    # DISABLES AUTO LINKING! NO SMART AND MAGIC DECISIONS THANKS!
+                    self.cpp_info.components["disable_autolinking"].defines = ["BOOST_ALL_NO_LIB"]
+                    self.output.info("Disabled magic autolinking (smart and magic decisions)")
+
+            self.cpp_info.components["dynamic_linking"].libs = []
+            self.cpp_info.components["dynamic_linking"].set_property("cmake_target_name", "Boost::dynamic_linking")
+            self.cpp_info.components["dynamic_linking"].names["cmake_find_package"] = "dynamic_linking"
+            self.cpp_info.components["dynamic_linking"].names["cmake_find_package_multi"] = "dynamic_linking"
+            self.cpp_info.components["dynamic_linking"].names["pkg_config"] = "boost_dynamic_linking"  # FIXME: disable on pkg_config
+            # A library that only links to Boost::headers can be linked into another library that links a Boost::library,
+            # so for this reasons, the header-only library should know the BOOST_ALL_DYN_LINK definition as it will likely
+            # change some important part of the boost code and cause linking errors downstream.
+            # This is in the same theme as the notes above, re autolinking.
+            self.cpp_info.components["headers"].requires.append("dynamic_linking")
+            if self._shared:
+                # A Boost::dynamic_linking cmake target does only make sense for a shared boost package
+                self.cpp_info.components["dynamic_linking"].defines = ["BOOST_ALL_DYN_LINK"]
+
+            # https://www.boost.org/doc/libs/1_73_0/more/getting_started/windows.html#library-naming
+            # libsuffix for MSVC:
+            # - system: ""
+            # - versioned: "-vc142-mt-d-x64-1_74"
+            # - tagged: "-mt-d-x64"
+            libsuffix_lut = {
+                "system": "",
+                "versioned": "{toolset}{threading}{abi}{arch}{version}",
+                "tagged": "{threading}{abi}{arch}",
+            }
+            libsuffix_data = {
+                "toolset": f"-{self._toolset_tag}",
+                "threading": "-mt" if self.options.multithreading else "",
+                "abi": "",
+                "ach": "",
+                "version": "",
+            }
+            if is_msvc(self):  # FIXME: mingw?
+                # FIXME: add 'y' when using cpython cci package and when python is built in debug mode
+                static_runtime_key = "s" if is_msvc_static_runtime(self) else ""
+                debug_runtime_key = "g" if "d" in msvc_runtime_flag(self) else ""
+                debug_key = "d" if self.settings.build_type == "Debug" else ""
+                abi = static_runtime_key + debug_runtime_key + debug_key
+                if abi:
+                    libsuffix_data["abi"] = f"-{abi}"
+            else:
+                debug_tag = "d" if self.settings.build_type == "Debug" else ""
+                abi = debug_tag
+                if abi:
+                    libsuffix_data["abi"] = f"-{abi}"
+
+            if self._b2_architecture:
+                libsuffix_data["arch"] = f"-{self._b2_architecture[0]}{self._b2_address_model}"
+            version = Version(self.version)
+            if not version.patch or version.patch == "0":
+                libsuffix_data["version"] = f"-{version.major}_{version.minor}"
+            else:
+                libsuffix_data["version"] = f"-{version.major}_{version.minor}_{version.patch}"
+            libsuffix = libsuffix_lut[str(self.options.layout)].format(**libsuffix_data)
+            if libsuffix:
+                self.output.info(f"Library layout suffix: {repr(libsuffix)}")
+
+            libformatdata = {}
+            if not self.options.without_python:
+                pyversion = Version(self._python_version)
+                libformatdata["py_major"] = pyversion.major
+                libformatdata["py_minor"] = pyversion.minor
+
+            def add_libprefix(n):
+                """ On MSVC, static libraries are built with a 'lib' prefix. Some libraries do not support shared, so are always built as a static library. """
+                libprefix = ""
+                if is_msvc(self) and (not self._shared or n in self._dependencies["static_only"]):
+                    libprefix = "lib"
+                return libprefix + n
+
+            all_detected_libraries = set(l[:-4] if l.endswith(".dll") else l for l in collect_libs(self))
+            all_expected_libraries = set()
+            incomplete_components = []
+
+            def filter_transform_module_libraries(names):
+                libs = []
+                for name in names:
+                    if name in ("boost_stacktrace_windbg", "boost_stacktrace_windbg_cached") and self.settings.os != "Windows":
+                        continue
+                    if name in ("boost_math_c99l", "boost_math_tr1l") and str(self.settings.arch).startswith("ppc"):
+                        continue
+                    if name in ("boost_stacktrace_addr2line", "boost_stacktrace_backtrace", "boost_stacktrace_basic", "boost_stacktrace_from_exception",) and self.settings.os == "Windows":
+                        continue
+                    if name == "boost_stacktrace_addr2line" and not self._stacktrace_addr2line_available:
+                        continue
+                    if name == "boost_stacktrace_backtrace" and self.options.get_safe("with_stacktrace_backtrace") == False:
+                        continue
+                    if not self.options.get_safe("numa") and "_numa" in name:
+                        continue
+                    new_name = add_libprefix(name.format(**libformatdata)) + libsuffix
+                    if self.options.namespace != 'boost':
+                        new_name = new_name.replace("boost_", str(self.options.namespace) + "_")
+                    if name.startswith("boost_python") or name.startswith("boost_numpy"):
+                        if self.options.python_buildid:
+                            new_name += f"-{self.options.python_buildid}"
+                    if self.options.buildid:
+                        new_name += f"-{self.options.buildid}"
+                    libs.append(new_name)
+                return libs
+
+            for module in self._dependencies["dependencies"].keys():
+                missing_depmodules = list(depmodule for depmodule in self._all_dependent_modules(module) if self.options.get_safe(f"without_{depmodule}", False))
+                if missing_depmodules:
+                    continue
+
+                module_libraries = filter_transform_module_libraries(self._dependencies["libs"][module])
+
+                # Don't create components for modules that should have libraries, but don't have (because of filter)
+                if self._dependencies["libs"][module] and not module_libraries:
+                    continue
+
+                all_expected_libraries = all_expected_libraries.union(module_libraries)
+                if set(module_libraries).difference(all_detected_libraries):
+                    incomplete_components.append(module)
+
+                # Starting v1.69.0 Boost.System is header-only. A stub library is
+                # still built for compatibility, but linking to it is no longer
+                # necessary.
+                # https://www.boost.org/doc/libs/1_75_0/libs/system/doc/html/system.html#changes_in_boost_1_69
+                if module == "system":
+                    module_libraries = []
+
+                self.cpp_info.components[module].libs = module_libraries
+
+                self.cpp_info.components[module].requires = self._dependencies["dependencies"][module] + ["_libboost"]
+                self.cpp_info.components[module].set_property("cmake_target_name", "Boost::" + module)
+                self.cpp_info.components[module].names["cmake_find_package"] = module
+                self.cpp_info.components[module].names["cmake_find_package_multi"] = module
+                self.cpp_info.components[module].names["pkg_config"] = f"boost_{module}"
+
+                # extract list of names of direct host dependencies to check for dependencies
+                # of components that exist in other packages
+                dependencies = [d.ref.name for d, _ in self.dependencies.direct_host.items()]
+
+                for requirement in self._dependencies.get("requirements", {}).get(module, []):
+                    if self.options.get_safe(requirement, None) == False:
+                        continue
+                    conan_requirement = self._option_to_conan_requirement(requirement)
+                    if conan_requirement not in dependencies:
+                        continue
+                    if module == "locale" and requirement in ("icu", "iconv"):
+                        if requirement == "icu" and not self._with_icu:
+                            continue
+                        if requirement == "iconv" and not self._with_iconv:
+                            continue
+                    self.cpp_info.components[module].requires.append(f"{conan_requirement}::{conan_requirement}")
+
+            for incomplete_component in incomplete_components:
+                self.output.warning(f"Boost component '{incomplete_component}' is missing libraries. Try building boost with '-o boost:without_{incomplete_component}'. (Option is not guaranteed to exist)")
+
+            non_used = all_detected_libraries.difference(all_expected_libraries)
+            if non_used:
+                raise ConanException(f"These libraries were built, but were not used in any boost module: {non_used}")
+
+            non_built = all_expected_libraries.difference(all_detected_libraries)
+            if non_built:
+                raise ConanException(f"These libraries were expected to be built, but were not built: {non_built}")
+
+            if not self.options.without_stacktrace:
+                if self.settings.os in ("Linux", "FreeBSD"):
+                    self.cpp_info.components["stacktrace_basic"].system_libs.append("dl")
+                    if self._stacktrace_addr2line_available:
+                        self.cpp_info.components["stacktrace_addr2line"].system_libs.append("dl")
+                    if self._with_stacktrace_backtrace:
+                        self.cpp_info.components["stacktrace_backtrace"].system_libs.append("dl")
+                    if self._stacktrace_from_exception_available:
+                        self.cpp_info.components["stacktrace_from_exception"].system_libs.append("dl")
+
+                if self._stacktrace_addr2line_available:
+                    self.cpp_info.components["stacktrace_addr2line"].defines.extend([
+                        f"BOOST_STACKTRACE_ADDR2LINE_LOCATION=\"{self.options.addr2line_location}\"",
+                        "BOOST_STACKTRACE_USE_ADDR2LINE",
+                    ])
+
+                if self._with_stacktrace_backtrace:
+                    self.cpp_info.components["stacktrace_backtrace"].defines.append("BOOST_STACKTRACE_USE_BACKTRACE")
+                    self.cpp_info.components["stacktrace_backtrace"].requires.append("libbacktrace::libbacktrace")
+
+                self.cpp_info.components["stacktrace_noop"].defines.append("BOOST_STACKTRACE_USE_NOOP")
+
+                if self.settings.os == "Windows":
+                    self.cpp_info.components["stacktrace_windbg"].defines.append("BOOST_STACKTRACE_USE_WINDBG")
+                    self.cpp_info.components["stacktrace_windbg"].system_libs.extend(["ole32", "dbgeng"])
+                    self.cpp_info.components["stacktrace_windbg_cached"].defines.append("BOOST_STACKTRACE_USE_WINDBG_CACHED")
+                    self.cpp_info.components["stacktrace_windbg_cached"].system_libs.extend(["ole32", "dbgeng"])
+                elif is_apple_os(self) or self.settings.os == "FreeBSD":
+                    self.cpp_info.components["stacktrace"].defines.append("BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED")
+
+            if not self.options.without_python:
+                pyversion = Version(self._python_version)
+                self.cpp_info.components[f"python{pyversion.major}{pyversion.minor}"].requires = ["python"]
+                if not self._shared:
+                    self.cpp_info.components["python"].defines.append("BOOST_PYTHON_STATIC_LIB")
+
+                self.cpp_info.components[f"numpy{pyversion.major}{pyversion.minor}"].requires = ["numpy"]
+
+            if is_msvc(self) or self._is_clang_cl:
+                # https://github.com/conan-community/conan-boost/issues/127#issuecomment-404750974
+                self.cpp_info.components["_libboost"].system_libs.append("bcrypt")
+            elif self.settings.os == "Linux":
+                # https://github.com/conan-community/community/issues/135
+                self.cpp_info.components["_libboost"].system_libs.append("rt")
+                if self.options.multithreading:
+                    self.cpp_info.components["_libboost"].system_libs.append("pthread")
+            elif self.settings.os == "Emscripten":
+                if self.options.multithreading:
+                    arch = str(self.settings.arch)
+                    # https://emscripten.org/docs/porting/pthreads.html
+                    # The documentation mentions that we should be using the "-s USE_PTHREADS=1"
+                    # but it was causing problems with the target based configurations in conan
+                    # So instead we are using the raw compiler flags (that are being activated
+                    # from the aforementioned flag)
+                    if arch.startswith("x86") or arch.startswith("wasm"):
+                        self.cpp_info.components["_libboost"].cxxflags.append("-pthread")
+                        self.cpp_info.components["_libboost"].sharedlinkflags.extend(["-pthread","--shared-memory"])
+                        self.cpp_info.components["_libboost"].exelinkflags.extend(["-pthread","--shared-memory"])
+            elif self.settings.os == "iOS":
+                if self.options.multithreading:
+                    # https://github.com/conan-io/conan-center-index/issues/3867
+                    # runtime crashes occur when using the default platform-specific reference counter/atomic
+                    # https://github.com/boostorg/filesystem/issues/147
+                    # iOS should use spinlocks to avoid filesystem crashes
+                    self.cpp_info.components["headers"].defines.append("BOOST_SP_USE_SPINLOCK")
+                else:
+                    self.cpp_info.components["headers"].defines.extend(["BOOST_AC_DISABLE_THREADS", "BOOST_SP_DISABLE_THREADS"])
+        #TODO: remove in the future, user_info deprecated in conan2, but kept for compatibility while recipe is cross-compatible.
+        self.user_info.stacktrace_addr2line_available = self._stacktrace_addr2line_available
+        self.conf_info.define("user.boost:stacktrace_addr2line_available", self._stacktrace_addr2line_available)
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.71.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.71.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9c2d0a8c2241060555c6898f4e728de176c5a9a2
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.71.0.yml
@@ -0,0 +1,269 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- locale
+- log
+- math
+- mpi
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context:
+  - thread
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  - thread
+  date_time:
+  - serialization
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - locale
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math:
+  - atomic
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - math
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.71.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.72.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.72.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f0213a24374bb267e031802fe1d6337a7c7c384e
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.72.0.yml
@@ -0,0 +1,270 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- locale
+- log
+- math
+- mpi
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context:
+  - thread
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  - thread
+  date_time:
+  - serialization
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - locale
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math:
+  - atomic
+  - chrono
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - math
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.72.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.73.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.73.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d26d67c9c338d067338b1ecb70237e6a69652640
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.73.0.yml
@@ -0,0 +1,274 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context:
+  - thread
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  - thread
+  date_time:
+  - serialization
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - locale
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math:
+  - atomic
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - math
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.73.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.74.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.74.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..679e8d616f32438f21d8fc0b7952ea8a13885335
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.74.0.yml
@@ -0,0 +1,273 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context:
+  - thread
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  - thread
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - locale
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math:
+  - atomic
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - math
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.74.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.75.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.75.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4d24ca98d63375fd9dbb2cdfde63310c82ac1926
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.75.0.yml
@@ -0,0 +1,280 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context:
+  - thread
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  - thread
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - exception
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - locale
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math:
+  - atomic
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - math
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.75.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.76.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.76.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b404c36315ae12e69291f127baa4187448438e27
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.76.0.yml
@@ -0,0 +1,279 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context:
+  - thread
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  - thread
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - exception
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - locale
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math:
+  - atomic
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.76.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.77.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.77.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..921d8f4f45b12ab3caccc3681b625a1b20b2065e
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.77.0.yml
@@ -0,0 +1,277 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  - thread
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - exception
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.77.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.78.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.78.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dd3207297bf168506cae17c6a40f044e63e7c873
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.78.0.yml
@@ -0,0 +1,276 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - exception
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.78.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.79.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.79.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ddef536e6ff013fbc8a175de46e4d1040896a57e
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.79.0.yml
@@ -0,0 +1,276 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - exception
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.79.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.80.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.80.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4cabd8ca5c44dd345e5556968d1457e7f7b962b0
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.80.0.yml
@@ -0,0 +1,275 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.80.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.81.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.81.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..838c68bc7e432491b79d2a53deed1f4475a61c00
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.81.0.yml
@@ -0,0 +1,280 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- url
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  url:
+  - system
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  url:
+  - boost_url
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.81.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.82.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.82.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..02d6958cfca28849d030421c80840738a896fbd9
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.82.0.yml
@@ -0,0 +1,280 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- url
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer:
+  - chrono
+  - system
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  url:
+  - system
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  url:
+  - boost_url
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.82.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.83.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.83.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7200adb04009d397144a0f92c42c1b02993b6347
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.83.0.yml
@@ -0,0 +1,278 @@
+configure_options:
+- atomic
+- chrono
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- url
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - container
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer: []
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  url:
+  - system
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  url:
+  - boost_url
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.83.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.84.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.84.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..064fb7bca5d2afc930086c16665096a90fbcd922
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.84.0.yml
@@ -0,0 +1,283 @@
+configure_options:
+- atomic
+- chrono
+- cobalt
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- url
+- wave
+dependencies:
+  atomic: []
+  chrono:
+  - system
+  cobalt:
+  - container
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer: []
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  url:
+  - system
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  chrono:
+  - boost_chrono
+  cobalt:
+  - boost_cobalt
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  url:
+  - boost_url
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.84.0
diff --git a/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.85.0.yml b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.85.0.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2306346f433722aef81e8b98c519cccfc7f409ab
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/dependencies/dependencies-1.85.0.yml
@@ -0,0 +1,291 @@
+configure_options:
+- atomic
+- charconv
+- chrono
+- cobalt
+- container
+- context
+- contract
+- coroutine
+- date_time
+- exception
+- fiber
+- filesystem
+- graph
+- graph_parallel
+- iostreams
+- json
+- locale
+- log
+- math
+- mpi
+- nowide
+- program_options
+- python
+- random
+- regex
+- serialization
+- stacktrace
+- system
+- test
+- thread
+- timer
+- type_erasure
+- url
+- wave
+dependencies:
+  atomic: []
+  charconv: []
+  chrono:
+  - system
+  cobalt:
+  - container
+  - system
+  container: []
+  context: []
+  contract:
+  - exception
+  - thread
+  coroutine:
+  - context
+  - exception
+  - system
+  date_time: []
+  exception: []
+  fiber:
+  - context
+  - filesystem
+  fiber_numa:
+  - fiber
+  filesystem:
+  - atomic
+  - system
+  graph:
+  - math
+  - random
+  - regex
+  - serialization
+  graph_parallel:
+  - filesystem
+  - graph
+  - mpi
+  - random
+  - serialization
+  iostreams:
+  - random
+  - regex
+  json:
+  - container
+  - system
+  locale:
+  - thread
+  log:
+  - atomic
+  - date_time
+  - exception
+  - filesystem
+  - random
+  - regex
+  - system
+  - thread
+  log_setup:
+  - log
+  math: []
+  math_c99:
+  - math
+  math_c99f:
+  - math
+  math_c99l:
+  - math
+  math_tr1:
+  - math
+  math_tr1f:
+  - math
+  math_tr1l:
+  - math
+  mpi:
+  - graph
+  - serialization
+  mpi_python:
+  - mpi
+  - python
+  nowide:
+  - filesystem
+  numpy:
+  - python
+  prg_exec_monitor:
+  - test
+  program_options: []
+  python: []
+  random:
+  - system
+  regex: []
+  serialization: []
+  stacktrace: []
+  stacktrace_addr2line:
+  - stacktrace
+  stacktrace_backtrace:
+  - stacktrace
+  stacktrace_basic:
+  - stacktrace
+  stacktrace_from_exception:
+  - stacktrace
+  stacktrace_noop:
+  - stacktrace
+  stacktrace_windbg:
+  - stacktrace
+  stacktrace_windbg_cached:
+  - stacktrace
+  system: []
+  test:
+  - exception
+  test_exec_monitor:
+  - test
+  thread:
+  - atomic
+  - chrono
+  - container
+  - date_time
+  - exception
+  - system
+  timer: []
+  type_erasure:
+  - thread
+  unit_test_framework:
+  - prg_exec_monitor
+  - test
+  - test_exec_monitor
+  url:
+  - system
+  wave:
+  - filesystem
+  - serialization
+  wserialization:
+  - serialization
+libs:
+  atomic:
+  - boost_atomic
+  charconv:
+  - boost_charconv
+  chrono:
+  - boost_chrono
+  cobalt:
+  - boost_cobalt
+  container:
+  - boost_container
+  context:
+  - boost_context
+  contract:
+  - boost_contract
+  coroutine:
+  - boost_coroutine
+  date_time:
+  - boost_date_time
+  exception:
+  - boost_exception
+  fiber:
+  - boost_fiber
+  fiber_numa:
+  - boost_fiber_numa
+  filesystem:
+  - boost_filesystem
+  graph:
+  - boost_graph
+  graph_parallel:
+  - boost_graph_parallel
+  iostreams:
+  - boost_iostreams
+  json:
+  - boost_json
+  locale:
+  - boost_locale
+  log:
+  - boost_log
+  log_setup:
+  - boost_log_setup
+  math: []
+  math_c99:
+  - boost_math_c99
+  math_c99f:
+  - boost_math_c99f
+  math_c99l:
+  - boost_math_c99l
+  math_tr1:
+  - boost_math_tr1
+  math_tr1f:
+  - boost_math_tr1f
+  math_tr1l:
+  - boost_math_tr1l
+  mpi:
+  - boost_mpi
+  mpi_python:
+  - boost_mpi_python
+  nowide:
+  - boost_nowide
+  numpy:
+  - boost_numpy{py_major}{py_minor}
+  prg_exec_monitor:
+  - boost_prg_exec_monitor
+  program_options:
+  - boost_program_options
+  python:
+  - boost_python{py_major}{py_minor}
+  random:
+  - boost_random
+  regex:
+  - boost_regex
+  serialization:
+  - boost_serialization
+  stacktrace: []
+  stacktrace_addr2line:
+  - boost_stacktrace_addr2line
+  stacktrace_backtrace:
+  - boost_stacktrace_backtrace
+  stacktrace_basic:
+  - boost_stacktrace_basic
+  stacktrace_from_exception:
+  - boost_stacktrace_from_exception
+  stacktrace_noop:
+  - boost_stacktrace_noop
+  stacktrace_windbg:
+  - boost_stacktrace_windbg
+  stacktrace_windbg_cached:
+  - boost_stacktrace_windbg_cached
+  system:
+  - boost_system
+  test: []
+  test_exec_monitor:
+  - boost_test_exec_monitor
+  thread:
+  - boost_thread
+  timer:
+  - boost_timer
+  type_erasure:
+  - boost_type_erasure
+  unit_test_framework:
+  - boost_unit_test_framework
+  url:
+  - boost_url
+  wave:
+  - boost_wave
+  wserialization:
+  - boost_wserialization
+requirements:
+  iostreams:
+  - bzip2
+  - lzma
+  - zlib
+  - zstd
+  locale:
+  - iconv
+  - icu
+  python:
+  - python
+  regex:
+  - icu
+  stacktrace:
+  - backtrace
+static_only:
+- boost_exception
+- boost_test_exec_monitor
+version: 1.85.0
diff --git a/utils/ci/conan/recipes/boost/all/patches/0001-revert-cease-dependence-on-range.patch b/utils/ci/conan/recipes/boost/all/patches/0001-revert-cease-dependence-on-range.patch
new file mode 100644
index 0000000000000000000000000000000000000000..fd069197a95a077e03af8a6026598f3a83c76b35
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/0001-revert-cease-dependence-on-range.patch
@@ -0,0 +1,49 @@
+From 188eac4acf37313fcec27d7b266c6517b99ed23d Mon Sep 17 00:00:00 2001
+From: Oliver Kowalke <oliver.kowalke@gmail.com>
+Date: Sun, 1 Dec 2019 20:40:28 +0100
+Subject: [PATCH] Revert "Cease dependence on Range"
+
+This reverts commit 0c556bb59241e682bbcd3f572815149c5a9b17db.
+
+see #44 (One test fails to compile after boostorg/coroutine submodule updated)
+---
+ boost/coroutine/asymmetric_coroutine.hpp | 12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+diff --git a/boost/coroutine/asymmetric_coroutine.hpp b/boost/coroutine/asymmetric_coroutine.hpp
+index f2ae16f..78b1842 100644
+--- a/boost/coroutine/asymmetric_coroutine.hpp
++++ b/boost/coroutine/asymmetric_coroutine.hpp
+@@ -14,6 +14,7 @@
+ #include <boost/assert.hpp>
+ #include <boost/config.hpp>
+ #include <boost/move/move.hpp>
++#include <boost/range.hpp>
+ #include <boost/throw_exception.hpp>
+ #include <boost/utility/explicit_operator_bool.hpp>
+ 
+@@ -2390,19 +2391,12 @@ end( push_coroutine< R > & c)
+ 
+ }
+ 
+-// forward declaration of Boost.Range traits to break dependency on it
+-template<typename C, typename Enabler>
+-struct range_mutable_iterator;
+-
+-template<typename C, typename Enabler>
+-struct range_const_iterator;
+-
+ template< typename Arg >
+-struct range_mutable_iterator< coroutines::push_coroutine< Arg >, void >
++struct range_mutable_iterator< coroutines::push_coroutine< Arg > >
+ { typedef typename coroutines::push_coroutine< Arg >::iterator type; };
+ 
+ template< typename R >
+-struct range_mutable_iterator< coroutines::pull_coroutine< R >, void >
++struct range_mutable_iterator< coroutines::pull_coroutine< R > >
+ { typedef typename coroutines::pull_coroutine< R >::iterator type; };
+ 
+ }
+-- 
+2.21.0
+
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.69.0-contract-no-system.patch b/utils/ci/conan/recipes/boost/all/patches/1.69.0-contract-no-system.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d98fe7b2f7e3e60d207da5c8c63d24b971fe95ea
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.69.0-contract-no-system.patch
@@ -0,0 +1,11 @@
+This library links to boost_system, even though that library is header-only.
+--- libs/contract/build/Jamfile.v2
++++ libs/contract/build/Jamfile.v2
+@@ -18,5 +18,5 @@
+ ;
+ 
+ # If lib as header-only, none of following will be used.
+-lib boost_contract : contract.cpp : <link>shared <library>/boost//system ;
+-lib boost_contract : contract.cpp : <link>static <library>/boost//system ;
++lib boost_contract : contract.cpp : <link>shared ;
++lib boost_contract : contract.cpp : <link>static ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.69.0-locale-no-system.patch b/utils/ci/conan/recipes/boost/all/patches/1.69.0-locale-no-system.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a2ca64eb92300623a49710f2a33a0c020a70ec98
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.69.0-locale-no-system.patch
@@ -0,0 +1,12 @@
+This library links to boost_system, even though that library is header-only.
+--- libs/locale/build/Jamfile.v2
++++ libs/locale/build/Jamfile.v2
+@@ -410,7 +410,7 @@
+         result += <source>util/gregorian.cpp ;
+     }
+     
+-    result += <library>../../system/build//boost_system ;
++
+ 
+ 
+     if "$(flags-only)" = "flags" 
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.69.0-random-no-system.patch b/utils/ci/conan/recipes/boost/all/patches/1.69.0-random-no-system.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ad03e39931654673e99bf1087442a71544ba0ac2
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.69.0-random-no-system.patch
@@ -0,0 +1,11 @@
+This library links to boost_system, even though that library is header-only.
+--- libs/random/build/Jamfile.v2
++++ libs/random/build/Jamfile.v2
+@@ -13,6 +13,6 @@
+   : usage-requirements <link>shared:<define>BOOST_RANDOM_DYN_LINK
+ ;
+ 
+-lib boost_random : [ glob *.cpp ] /boost//system ;
++lib boost_random : [ glob *.cpp ] ;
+ 
+ boost-install boost_random ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.69.0-type_erasure-no-system.patch b/utils/ci/conan/recipes/boost/all/patches/1.69.0-type_erasure-no-system.patch
new file mode 100644
index 0000000000000000000000000000000000000000..c3b7cde662175a28237b29f08eff57682512fa81
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.69.0-type_erasure-no-system.patch
@@ -0,0 +1,9 @@
+This library links to boost_system, even though that library is header-only.
+--- libs/type_erasure/build/Jamfile.v2
++++ libs/type_erasure/build/Jamfile.v2
+@@ -12,4 +12,4 @@
+   : usage-requirements <link>shared:<define>BOOST_TYPE_ERASURE_DYN_LINK
+ ;
+ 
+-lib boost_type_erasure : dynamic_binding.cpp /boost//thread /boost//system ;
++lib boost_type_erasure : dynamic_binding.cpp /boost//thread ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.75.0-boost_build-with-newer-b2.patch b/utils/ci/conan/recipes/boost/all/patches/1.75.0-boost_build-with-newer-b2.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4c22c748fe894fb5ec5ffe25e9d32674283208a6
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.75.0-boost_build-with-newer-b2.patch
@@ -0,0 +1,51 @@
+--- tools/build/src/build/configure.jam.orig	2020-12-03 00:02:49.000000000 -0500
++++ tools/build/src/build/configure.jam	2022-01-28 20:32:41.260634800 -0500
+@@ -454,7 +454,7 @@
+     return [ find-builds-raw $(p) : $(ps) : $(what) :
+         $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) :
+         $(10) : $(11) : $(12) : $(13) : $(14) : $(15) :
+-        $(16) : $(17) : $(18) : $(19)  ] ;
++        $(16) : $(17) : $(18) ] ;
+ }
+ 
+ 
+@@ -518,7 +518,7 @@
+     {
+         local project = [ project.current ] ;
+         self.message = $(message) ;
+-        for i in 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
++        for i in 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
+         {
+             local name = [ CALC $(i) - 1 ] ;
+             self.targets.$(name) = $($(i)[1]) ;
+@@ -537,7 +537,7 @@
+     }
+     rule all-properties ( )
+     {
+-        local i = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ;
++        local i = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ;
+         return $(self.props.$(i)) ;
+     }
+     rule check ( properties * )
+@@ -559,9 +559,7 @@
+             : $(self.targets.14) $(self.what.14)
+             : $(self.targets.15) $(self.what.15)
+             : $(self.targets.16) $(self.what.16)
+-            : $(self.targets.17) $(self.what.17)
+-            : $(self.targets.18) $(self.what.18)
+-            : $(self.targets.19) $(self.what.19) ] ;
++            : $(self.targets.17) $(self.what.17) ] ;
+         if $(self.props.$(i))
+         {
+             return [ property.evaluate-conditionals-in-context $(self.props.$(i)) : $(properties) ] ;
+--- tools/build/src/util/indirect.jam.orig	2020-12-03 00:02:49.000000000 -0500
++++ tools/build/src/util/indirect.jam	2022-01-28 20:32:41.249509200 -0500
+@@ -102,7 +102,7 @@
+ {
+     return [ modules.call-in [ get-module $(r) ] : [ get-rule $(r) ] $(args) :
+         $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) : $(10) : $(11) :
+-        $(12) : $(13) : $(14) : $(15) : $(16) : $(17) : $(18) : $(19) ] ;
++        $(12) : $(13) : $(14) : $(15) : $(16) : $(17) : $(18) ] ;
+ }
+ 
+ 
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.76.0-0001-fix-include-inside-boost-namespace.patch b/utils/ci/conan/recipes/boost/all/patches/1.76.0-0001-fix-include-inside-boost-namespace.patch
new file mode 100644
index 0000000000000000000000000000000000000000..c06566b5a75fbbfefa8c8a26dd08effb2f06023c
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.76.0-0001-fix-include-inside-boost-namespace.patch
@@ -0,0 +1,33 @@
+From 1ec5c98d80de97f9e962c5627e1a0e6096099894 Mon Sep 17 00:00:00 2001
+From: Daniel Scharrer <daniel@constexpr.org>
+Date: Wed, 28 Jul 2021 19:56:31 +0200
+Subject: [PATCH] Fix #include inside boost namespace
+
+The existing code fails to build if <utility> was not already included.
+---
+ boost/math/tools/mp.hpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/boost/math/tools/mp.hpp b/boost/math/tools/mp.hpp
+index 35565646f..dc8440988 100644
+--- a/boost/math/tools/mp.hpp
++++ b/boost/math/tools/mp.hpp
+@@ -13,6 +13,7 @@
+ 
+ #include <type_traits>
+ #include <cstddef>
++#include <utility>
+ 
+ namespace boost { namespace math { namespace tools { namespace meta_programming {
+ 
+@@ -338,7 +339,6 @@ using mp_remove_if_q = mp_remove_if<L, Q::template fn>;
+ // Index sequence
+ // Use C++14 index sequence if available
+ #if defined(__cpp_lib_integer_sequence) && (__cpp_lib_integer_sequence >= 201304)
+-#include <utility>
+ template<std::size_t... I>
+ using index_sequence = std::index_sequence<I...>;
+ 
+-- 
+2.39.1
+
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.77.0-boost_build-with-newer-b2.patch b/utils/ci/conan/recipes/boost/all/patches/1.77.0-boost_build-with-newer-b2.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bdc7476f27137ab3f2cab96d0880a4bfa3987428
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.77.0-boost_build-with-newer-b2.patch
@@ -0,0 +1,51 @@
+--- tools/build/src/build/configure.jam.orig	2021-08-05 05:42:46.000000000 -0400
++++ tools/build/src/build/configure.jam	2022-01-28 19:55:37.960877600 -0500
+@@ -467,7 +467,7 @@
+     return [ find-builds-raw $(p) : $(ps) : $(what) :
+         $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) :
+         $(10) : $(11) : $(12) : $(13) : $(14) : $(15) :
+-        $(16) : $(17) : $(18) : $(19)  ] ;
++        $(16) : $(17) : $(18) ] ;
+ }
+ 
+ 
+@@ -531,7 +531,7 @@
+     {
+         local project = [ project.current ] ;
+         self.message = $(message) ;
+-        for i in 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
++        for i in 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
+         {
+             local name = [ CALC $(i) - 1 ] ;
+             self.targets.$(name) = $($(i)[1]) ;
+@@ -550,7 +550,7 @@
+     }
+     rule all-properties ( )
+     {
+-        local i = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ;
++        local i = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ;
+         return $(self.props.$(i)) ;
+     }
+     rule check ( properties * )
+@@ -572,9 +572,7 @@
+             : $(self.targets.14) $(self.what.14)
+             : $(self.targets.15) $(self.what.15)
+             : $(self.targets.16) $(self.what.16)
+-            : $(self.targets.17) $(self.what.17)
+-            : $(self.targets.18) $(self.what.18)
+-            : $(self.targets.19) $(self.what.19) ] ;
++            : $(self.targets.17) $(self.what.17) ] ;
+         if $(self.props.$(i))
+         {
+             return [ property.evaluate-conditionals-in-context $(self.props.$(i)) : $(properties) ] ;
+--- tools/build/src/util/indirect.jam.orig	2021-08-05 05:42:46.000000000 -0400
++++ tools/build/src/util/indirect.jam	2021-12-02 01:48:03.000000000 -0500
+@@ -102,7 +102,7 @@
+ {
+     return [ modules.call-in [ get-module $(r) ] : [ get-rule $(r) ] $(args) :
+         $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) : $(10) : $(11) :
+-        $(12) : $(13) : $(14) : $(15) : $(16) : $(17) : $(18) : $(19) ] ;
++        $(12) : $(13) : $(14) : $(15) : $(16) : $(17) : $(18) ] ;
+ }
+ 
+ .parts_regex = "^([^@]*)@" "([^%]*)%" "([^%]+)$" ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.77.0-fiber-mingw.patch b/utils/ci/conan/recipes/boost/all/patches/1.77.0-fiber-mingw.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5bf38006a4213dca05b5967ca94c7f7c6867d622
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.77.0-fiber-mingw.patch
@@ -0,0 +1,20 @@
+--- libs/fiber/src/numa/windows/pin_thread.cpp
++++ libs/fiber/src/numa/windows/pin_thread.cpp
+@@ -23,7 +23,7 @@
+ 
+ BOOST_FIBERS_DECL
+ void pin_thread( std::uint32_t cpuid) {
+-    pin_thread( cpuid, ::GetCurrentThread() );
++    pin_thread( cpuid, reinterpret_cast< std::thread::native_handle_type >(::GetCurrentThread()));
+ }
+ 
+ BOOST_FIBERS_DECL
+@@ -37,7 +37,7 @@
+     uint32_t id = cpuid % 64; 
+     // set the bit mask of the logical CPU
+     affinity.Mask = static_cast< KAFFINITY >( 1) << id;
+-    if ( BOOST_UNLIKELY( 0 == ::SetThreadGroupAffinity( h, & affinity, nullptr) ) ) {
++    if ( BOOST_UNLIKELY( 0 == ::SetThreadGroupAffinity( reinterpret_cast< HANDLE >(h), & affinity, nullptr) ) ) {
+         throw std::system_error(
+                 std::error_code( ::GetLastError(), std::system_category() ),
+                 "::SetThreadiGroupAffinity() failed");
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.77.0-type_erasure-no-system.patch b/utils/ci/conan/recipes/boost/all/patches/1.77.0-type_erasure-no-system.patch
new file mode 100644
index 0000000000000000000000000000000000000000..71aac779a339f1f3c87e7880b83e407fa489a194
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.77.0-type_erasure-no-system.patch
@@ -0,0 +1,11 @@
+This library links to boost_system, even though that library is header-only.
+--- libs/type_erasure/build/Jamfile.v2
++++ libs/type_erasure/build/Jamfile.v2
+@@ -12,6 +12,6 @@
+   : usage-requirements <link>shared:<define>BOOST_TYPE_ERASURE_DYN_LINK
+ ;
+ 
+-lib boost_type_erasure : dynamic_binding.cpp /boost//thread /boost//system ;
++lib boost_type_erasure : dynamic_binding.cpp /boost//thread ;
+ 
+ boost-install boost_type_erasure ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.78.0-b2-fix-install.patch b/utils/ci/conan/recipes/boost/all/patches/1.78.0-b2-fix-install.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ac0ed81a3e85c1e0b6f6d7a11279343c955625fb
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.78.0-b2-fix-install.patch
@@ -0,0 +1,62 @@
+--- tools/build/src/tools/stage.jam	2021-12-09 16:30:45.956457531 +0300
++++ tools/build/src/tools/stage.jam	2021-12-09 16:30:45.952457519 +0300
+@@ -476,10 +476,14 @@ class install-target-class : basic-targe
+         }
+         DELETE_MODULE $(result) ;
+         return [ sequence.unique $(result2) ] ;
+     }
+ 
++    rule skip-from-usage-requirements ( )
++    {
++    }
++
+     # Returns true iff 'type' is subtype of some element of 'types-to-include'.
+     #
+     local rule include-type ( type : types-to-include * )
+     {
+         local found ;
+
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ tools/build/test/install_build_no.py	2021-12-09 16:30:45.953457522 +0300
+@@ -0,0 +1,26 @@
++#!/usr/bin/python
++
++# Copyright 2021 Dmitry Arkhipov (grisumbras@gmail.com)
++# Distributed under the Boost Software License, Version 1.0.
++# (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
++
++# Check that <build>no in usage-requirements of dependencies does not affect
++# install rule, i.e. a skipped installed target does not affect insallation of
++# other targets.
++
++import BoostBuild
++
++t = BoostBuild.Tester()
++
++t.write("a.cpp", "int main() {}\n")
++
++t.write("jamroot.jam", """
++make x : : maker : <build>no ;
++exe a : a.cpp ;
++install install : x a ;
++""")
++
++t.run_build_system()
++t.expect_addition("install/a.exe")
++
++t.cleanup()
+
+--- tools/build/test/test_all.py	2021-12-09 16:30:45.956457531 +0300
++++ tools/build/test/test_all.py	2021-12-09 16:30:45.953457522 +0300
+@@ -248,10 +248,11 @@ tests = ["abs_workdir",
+          "implicit_dependency",
+          "indirect_conditional",
+          "inherit_toolset",
+          "inherited_dependency",
+          "inline",
++         "install_build_no",
+          "libjpeg",
+          "liblzma",
+          "libpng",
+          "libtiff",
+          "libzstd",
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.79.0-0001-json-array-erase-relocate.patch b/utils/ci/conan/recipes/boost/all/patches/1.79.0-0001-json-array-erase-relocate.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d322b64f4477df3b1459561bb2e0830d7b24162d
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.79.0-0001-json-array-erase-relocate.patch
@@ -0,0 +1,49 @@
+diff -ur boost/json/impl/array.ipp boost/json/impl/array.ipp
+--- boost/json/impl/array.ipp	2022-04-06 17:02:43.000000000 -0400
++++ boost/json/impl/array.ipp	2022-04-13 20:55:20.464359478 -0400
+@@ -491,8 +491,11 @@
+     auto const p = &(*t_)[0] +
+         (pos - &(*t_)[0]);
+     destroy(p, p + 1);
+-    relocate(p, p + 1, 1);
+     --t_->size;
++    if(t_->size > 0)
++        relocate(p, p + 1,
++            t_->size - (p -
++                &(*t_)[0]));
+     return p;
+ }
+ 
+diff -ur libs/json/test/array.cpp libs/json/test/array.cpp
+--- libs/json/test/array.cpp	2022-04-06 17:02:43.000000000 -0400
++++ libs/json/test/array.cpp	2022-04-13 20:53:32.671782680 -0400
+@@ -1270,6 +1270,21 @@
+     }
+ 
+     void
++    testIssue692()
++    {
++	    array a;
++	    object obj;
++	    obj["test1"] = "hello";
++	    a.push_back(obj);
++	    a.push_back(obj);
++	    a.push_back(obj);
++	    a.push_back(obj);
++	    a.push_back(obj);
++	    while(a.size())
++		    a.erase(a.begin());
++    }
++
++    void
+     run()
+     {
+         testDestroy();
+@@ -1283,6 +1298,7 @@
+         testExceptions();
+         testEquality();
+         testHash();
++        testIssue692();
+     }
+ };
+ 
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.79.0-geometry_no_rtti.patch b/utils/ci/conan/recipes/boost/all/patches/1.79.0-geometry_no_rtti.patch
new file mode 100644
index 0000000000000000000000000000000000000000..15e7b06f5683502e8d4def9105c260dc5c8e7256
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.79.0-geometry_no_rtti.patch
@@ -0,0 +1,169 @@
+From 379f0c364a5ef3e6d57021ab815ea603ab3f1178 Mon Sep 17 00:00:00 2001
+From: Adam Wulkiewicz <adam.wulkiewicz@gmail.com>
+Date: Tue, 19 Jul 2022 22:52:09 +0200
+Subject: [PATCH] [index] Fix and improve rtree experimental features
+
+Fix access specifier preventing use of experimental iterators.
+Allow more granular control over enabled experimental features.
+---
+ .../geometry/index/distance_predicates.hpp     | 12 +++++++++---
+ include/boost/geometry/index/predicates.hpp    | 16 +++++++++++-----
+ include/boost/geometry/index/rtree.hpp         | 18 ++++++++++++++----
+ 3 files changed, 34 insertions(+), 12 deletions(-)
+
+diff --git a/boost/geometry/index/distance_predicates.hpp b/boost/geometry/index/distance_predicates.hpp
+index 59b32af4753..00fc663cb38 100644
+--- a/boost/geometry/index/distance_predicates.hpp
++++ b/boost/geometry/index/distance_predicates.hpp
+@@ -2,7 +2,7 @@
+ //
+ // Spatial index distance predicates, calculators and checkers used in nearest neighbor query
+ //
+-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
++// Copyright (c) 2011-2022 Adam Wulkiewicz, Lodz, Poland.
+ //
+ // Use, modification and distribution is subject to the Boost Software License,
+ // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+@@ -11,6 +11,12 @@
+ #ifndef BOOST_GEOMETRY_INDEX_DISTANCE_PREDICATES_HPP
+ #define BOOST_GEOMETRY_INDEX_DISTANCE_PREDICATES_HPP
+ 
++#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#ifndef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
++#define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
++#endif
++#endif
++
+ #include <boost/geometry/index/detail/distance_predicates.hpp>
+ 
+ /*!
+@@ -21,7 +27,7 @@ namespace boost { namespace geometry { namespace index {
+ 
+ // relations generators
+ 
+-#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
+ 
+ /*!
+ \brief Generate to_nearest() relationship.
+@@ -91,7 +97,7 @@ detail::to_furthest<T> to_furthest(T const& v)
+     return detail::to_furthest<T>(v);
+ }
+ 
+-#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
+ 
+ // distance predicates generators
+ 
+diff --git a/boost/geometry/index/predicates.hpp b/boost/geometry/index/predicates.hpp
+index 6da0d0ec5d0..3678188dcd1 100644
+--- a/boost/geometry/index/predicates.hpp
++++ b/boost/geometry/index/predicates.hpp
+@@ -2,7 +2,7 @@
+ //
+ // Spatial query predicates
+ //
+-// Copyright (c) 2011-2018 Adam Wulkiewicz, Lodz, Poland.
++// Copyright (c) 2011-2022 Adam Wulkiewicz, Lodz, Poland.
+ //
+ // This file was modified by Oracle on 2019-2021.
+ // Modifications copyright (c) 2019-2021 Oracle and/or its affiliates.
+@@ -15,6 +15,12 @@
+ #ifndef BOOST_GEOMETRY_INDEX_PREDICATES_HPP
+ #define BOOST_GEOMETRY_INDEX_PREDICATES_HPP
+ 
++#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#ifndef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
++#define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
++#endif
++#endif
++
+ #include <boost/geometry/index/detail/predicates.hpp>
+ #include <boost/geometry/util/tuples.hpp>
+ 
+@@ -212,7 +218,7 @@ overlaps(Geometry const& g)
+                 >(g);
+ }
+ 
+-#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
+ 
+ /*!
+ \brief Generate \c touches() predicate.
+@@ -240,7 +246,7 @@ touches(Geometry const& g)
+                 >(g);
+ }
+ 
+-#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
+ 
+ /*!
+ \brief Generate \c within() predicate.
+@@ -343,7 +349,7 @@ nearest(Geometry const& geometry, std::size_t k)
+     return detail::predicates::nearest<Geometry>(geometry, k);
+ }
+ 
+-#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
+ 
+ /*!
+ \brief Generate path() predicate.
+@@ -373,7 +379,7 @@ path(SegmentOrLinestring const& linestring, std::size_t k)
+     return detail::predicates::path<SegmentOrLinestring>(linestring, k);
+ }
+ 
+-#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES
+ 
+ namespace detail { namespace predicates {
+ 
+diff --git a/boost/geometry/index/rtree.hpp b/boost/geometry/index/rtree.hpp
+index af3b6f4ee07..6bb34faf6e9 100644
+--- a/boost/geometry/index/rtree.hpp
++++ b/boost/geometry/index/rtree.hpp
+@@ -3,7 +3,7 @@
+ // R-tree implementation
+ //
+ // Copyright (c) 2008 Federico J. Fernandez.
+-// Copyright (c) 2011-2019 Adam Wulkiewicz, Lodz, Poland.
++// Copyright (c) 2011-2022 Adam Wulkiewicz, Lodz, Poland.
+ // Copyright (c) 2020 Caian Benedicto, Campinas, Brazil.
+ //
+ // This file was modified by Oracle on 2019-2021.
+@@ -90,7 +90,15 @@
+ #include <boost/geometry/index/detail/rtree/query_iterators.hpp>
+ 
+ #ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
+-// serialization
++#ifndef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_SERIALIZATION
++#define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_SERIALIZATION
++#endif
++#ifndef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_ITERATORS
++#define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_ITERATORS
++#endif
++#endif
++
++#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_SERIALIZATION
+ #include <boost/geometry/index/detail/serialization.hpp>
+ #endif
+ 
+@@ -312,7 +320,7 @@ class rtree
+     typedef typename members_holder::allocator_traits_type allocator_traits_type;
+ 
+     friend class detail::rtree::utilities::view<rtree>;
+-#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_SERIALIZATION
+     friend class detail::rtree::private_view<rtree>;
+     friend class detail::rtree::const_private_view<rtree>;
+ #endif
+@@ -1184,7 +1192,9 @@ class rtree
+             detail::rtree::iterators::distance_query_iterator<members_holder, Predicates>
+         >;
+ 
+-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
++#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_ITERATORS
++public:
++#else
+ private:
+ #endif
+     /*!
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.79.0-smart_ptr_cw_ppc_msync.patch b/utils/ci/conan/recipes/boost/all/patches/1.79.0-smart_ptr_cw_ppc_msync.patch
new file mode 100644
index 0000000000000000000000000000000000000000..61770f8c8863f6e1bb7cc1e4d8e8f783ea7bf82d
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.79.0-smart_ptr_cw_ppc_msync.patch
@@ -0,0 +1,25 @@
+diff --git a/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp b/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp
+index 81387ce..58a69e6 100644
+--- a/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp
++++ b/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp
+@@ -35,8 +35,6 @@ BOOST_PRAGMA_MESSAGE("Using CodeWarrior/PowerPC sp_counted_base")
+ 
+ #endif
+ 
+-BOOST_SP_OBSOLETE()
+-
+ namespace boost
+ {
+ 
+@@ -64,7 +62,11 @@ inline long atomic_decrement( register long * pw )
+ 
+     asm
+     {
++#if defined(__PPCZen__) || defined(__PPCe500__) || defined(__PPCe500v2__)
++    msync
++#else
+     sync
++#endif
+ 
+ loop:
+ 
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.80.0-0001-filesystem-win-fix-dir-it-net-share.patch b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0001-filesystem-win-fix-dir-it-net-share.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0d28b86bb670c1ffd94a65c98617451df2858175
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0001-filesystem-win-fix-dir-it-net-share.patch
@@ -0,0 +1,31 @@
+commit 9c9d127bddc2b72187c57f4933c49666255d7a4f
+Author: Olavo Belloc <obelloc@think-cell.com>
+Date:   Mon Aug 8 10:54:02 2022 +0200
+
+    Limit the buffer size for compatibility with previous versions of Windows
+    
+    The reported error was reproduced on Windows 7 and 8.1, but not on an early
+    version of Windows 10 (2004).
+    
+    Closes https://github.com/boostorg/filesystem/pull/246.
+    Likely fixes https://github.com/boostorg/filesystem/issues/245.
+
+diff --git a/libs/filesystem/src/directory.cpp b/libs/filesystem/src/directory.cpp
+index 6a3e1dc..9334893 100644
+--- a/libs/filesystem/src/directory.cpp
++++ b/libs/filesystem/src/directory.cpp
+@@ -599,9 +599,12 @@ extra_data_format g_extra_data_format = file_directory_information_format;
+  * \brief Extra buffer size for GetFileInformationByHandleEx-based or NtQueryDirectoryFile-based directory iterator.
+  *
+  * Must be large enough to accommodate at least one FILE_DIRECTORY_INFORMATION or *_DIR_INFO struct and one filename.
+- * NTFS, VFAT, exFAT support filenames up to 255 UTF-16/UCS-2 characters. ReFS supports filenames up to 32768 UTF-16 characters.
++ * NTFS, VFAT, exFAT and ReFS support filenames up to 255 UTF-16/UCS-2 characters. (For ReFS, there is no information
++ * on the on-disk format, and it is possible that it supports longer filenames, up to 32768 UTF-16/UCS-2 characters.)
++ * The buffer cannot be larger than 64k, because up to Windows 8.1, NtQueryDirectoryFile and GetFileInformationByHandleEx
++ * fail with ERROR_INVALID_PARAMETER when trying to retrieve the filenames from a network share.
+  */
+-BOOST_CONSTEXPR_OR_CONST std::size_t dir_itr_extra_size = sizeof(file_id_extd_dir_info) + 65536u;
++BOOST_CONSTEXPR_OR_CONST std::size_t dir_itr_extra_size = 65536u;
+ 
+ inline system::error_code dir_itr_close(dir_itr_imp& imp) BOOST_NOEXCEPT
+ {
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.80.0-0002-filesystem-fix-weakly-canonical-long-path.patch b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0002-filesystem-fix-weakly-canonical-long-path.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9312059a600000b5f406be4ff073a0bfdfcb5a3c
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0002-filesystem-fix-weakly-canonical-long-path.patch
@@ -0,0 +1,171 @@
+commit 476ca7b6c1d37a5d796f8525813a9a64c9e54ffc
+Author: Andrey Semashev <andrey.semashev@gmail.com>
+Date:   Wed Aug 10 04:57:21 2022 +0300
+
+    Fix weakly_canonical on Windows with long paths prefix.
+    
+    During its operation, weakly_canonical would call status() on the path
+    consisting only from the root name of the input path. This would fail
+    with ERROR_INVALID_FUNCTION if the root name starts with the "\\?\" prefix,
+    as the root name path is not absolute.
+    
+    To fix this, we don't check the status of the root name path (which is
+    not the correct check anyways as it tests the current directory on the
+    corresponding drive for existence, which is not what we want). Additionally,
+    avoid calling status() on the paths containing dot and dot-dot elements
+    during the weakly_canonical execution for the same reason - the "\\?\"
+    prefix disables most of the path processing in Windows APIs, including
+    dot and dot-dot elements resolution.
+    
+    Fixes https://github.com/boostorg/filesystem/issues/247.
+
+diff --git a/libs/filesystem/src/operations.cpp b/libs/filesystem/src/operations.cpp
+index dd636e9..ca2fff3 100644
+--- a/libs/filesystem/src/operations.cpp
++++ b/libs/filesystem/src/operations.cpp
+@@ -4434,7 +4434,7 @@ path weakly_canonical(path const& p, path const& base, system::error_code* ec)
+     path head(p);
+     for (; !head.empty(); --itr)
+     {
+-        file_status head_status = detail::status_impl(head, &local_ec);
++        file_status head_status(detail::status_impl(head, &local_ec));
+         if (BOOST_UNLIKELY(head_status.type() == fs::status_error))
+         {
+             if (!ec)
+@@ -4450,32 +4450,83 @@ path weakly_canonical(path const& p, path const& base, system::error_code* ec)
+         head.remove_filename();
+     }
+ 
++    if (head.empty())
++        return p.lexically_normal();
++
++    path const& dot_p = dot_path();
++    path const& dot_dot_p = dot_dot_path();
++
+ #else
+ 
+-    // On Windows, filesystem APIs such as GetFileAttributesW perform lexical path normalization internally.
+-    // As a result, a path like "c:\a\.." can be reported as present even if "c:\a" is not. This would break
+-    // canonical, as symlink_status that it calls internally would report an error that the file at the intermediate
+-    // path does not exist. To avoid this, scan the initial path in the forward direction.
+-    // Also, operate on paths with preferred separators. This can be important on Windows since GetFileAttributesW,
+-    // which is called in status() may return "file not found" for paths to network shares and mounted cloud
+-    // storages that have forward slashes as separators.
++    // On Windows, filesystem APIs such as GetFileAttributesW and CreateFileW perform lexical path normalization
++    // internally. As a result, a path like "c:\a\.." can be reported as present even if "c:\a" is not. This would
++    // break canonical, as symlink_status that it calls internally would report an error that the file at the
++    // intermediate path does not exist. To avoid this, scan the initial path in the forward direction.
++    // Also, operate on paths with preferred separators. This can be important on Windows since GetFileAttributesW
++    // or CreateFileW, which is called in status() may return "file not found" for paths to network shares and
++    // mounted cloud storages that have forward slashes as separators.
++    // Also, avoid querying status of the root name such as \\?\c: as CreateFileW returns ERROR_INVALID_FUNCTION for
++    // such path. Querying the status of a root name such as c: is also not right as this path refers to the current
++    // directory on drive C:, which is not what we want to test for existence anyway.
+     path::iterator itr(p.begin());
+     path head;
+-    for (; itr != p_end; ++itr)
++    if (p.has_root_name())
+     {
+-        path const& p_elem = *itr;
+-        if (p_elem.size() == 1u && detail::is_directory_separator(p_elem.native()[0]))
++        BOOST_ASSERT(itr != p_end);
++        head = *itr;
++        ++itr;
++    }
++
++    if (p.has_root_directory())
++    {
++        BOOST_ASSERT(itr != p_end);
++        // Convert generic separator returned by the iterator for the root directory to
++        // the preferred separator.
++        head += path::preferred_separator;
++        ++itr;
++    }
++
++    if (!head.empty())
++    {
++        file_status head_status(detail::status_impl(head, &local_ec));
++        if (BOOST_UNLIKELY(head_status.type() == fs::status_error))
+         {
+-            // Convert generic separator returned by the iterator for the root directory to
+-            // the preferred separator.
+-            head += path::preferred_separator;
++            if (!ec)
++                BOOST_FILESYSTEM_THROW(filesystem_error("boost::filesystem::weakly_canonical", head, local_ec));
++
++            *ec = local_ec;
++            return path();
+         }
+-        else
++
++        if (head_status.type() == fs::file_not_found)
++        {
++            // If the root path does not exist then no path element exists
++            return p.lexically_normal();
++        }
++    }
++
++    path const& dot_p = dot_path();
++    path const& dot_dot_p = dot_dot_path();
++    for (; itr != p_end; ++itr)
++    {
++        path const& p_elem = *itr;
++
++        // Avoid querying status of paths containing dot and dot-dot elements, as this will break
++        // if the root name starts with "\\?\".
++        if (p_elem == dot_p)
++            continue;
++
++        if (p_elem == dot_dot_p)
+         {
+-            head /= p_elem;
++            if (head.has_relative_path())
++                head.remove_filename();
++
++            continue;
+         }
+ 
+-        file_status head_status = detail::status_impl(head, &local_ec);
++        head /= p_elem;
++
++        file_status head_status(detail::status_impl(head, &local_ec));
+         if (BOOST_UNLIKELY(head_status.type() == fs::status_error))
+         {
+             if (!ec)
+@@ -4492,33 +4543,22 @@ path weakly_canonical(path const& p, path const& base, system::error_code* ec)
+         }
+     }
+ 
++    if (head.empty())
++        return p.lexically_normal();
++
+ #endif
+ 
+-    path const& dot_p = dot_path();
+-    path const& dot_dot_p = dot_dot_path();
+     path tail;
+     bool tail_has_dots = false;
+     for (; itr != p_end; ++itr)
+     {
+         path const& tail_elem = *itr;
+-#if defined(BOOST_WINDOWS_API)
+-        if (tail_elem.size() == 1u && detail::is_directory_separator(tail_elem.native()[0]))
+-        {
+-            // Convert generic separator returned by the iterator for the root directory to
+-            // the preferred separator.
+-            tail += path::preferred_separator;
+-            continue;
+-        }
+-#endif
+         tail /= tail_elem;
+         // for a later optimization, track if any dot or dot-dot elements are present
+         if (!tail_has_dots && (tail_elem == dot_p || tail_elem == dot_dot_p))
+             tail_has_dots = true;
+     }
+ 
+-    if (head.empty())
+-        return p.lexically_normal();
+-
+     head = detail::canonical(head, base, &local_ec);
+     if (BOOST_UNLIKELY(!!local_ec))
+     {
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.80.0-0003-unordered-valid-after-move.patch b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0003-unordered-valid-after-move.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4245f23e76299929720704957b043e604467da77
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0003-unordered-valid-after-move.patch
@@ -0,0 +1,175 @@
+diff -urN a/boost/unordered/detail/fca.hpp b/boost/unordered/detail/fca.hpp
+--- a/boost/unordered/detail/fca.hpp	2022-08-03 22:47:16.000000000 -0400
++++ b/boost/unordered/detail/fca.hpp	2022-08-24 19:44:43.139787681 -0400
+@@ -646,7 +646,7 @@
+ 
+         size_type bucket_count() const { return size_; }
+ 
+-        iterator begin() const { return ++at(size_); }
++        iterator begin() const { return size_ == 0 ? end() : ++at(size_); }
+ 
+         iterator end() const
+         {
+@@ -660,6 +660,10 @@
+ 
+         local_iterator begin(size_type n) const
+         {
++          if (size_ == 0) {
++            return this->end(n);
++          }
++
+           return local_iterator(
+             (buckets + static_cast<difference_type>(n))->next);
+         }
+@@ -670,12 +674,16 @@
+ 
+         iterator at(size_type n) const
+         {
+-          std::size_t const N = group::N;
++          if (size_ > 0) {
++            std::size_t const N = group::N;
+ 
+-          iterator pbg(buckets + static_cast<difference_type>(n),
+-            groups + static_cast<difference_type>(n / N));
++            iterator pbg(buckets + static_cast<difference_type>(n),
++              groups + static_cast<difference_type>(n / N));
+ 
+-          return pbg;
++            return pbg;
++          } else {
++            return this->end();
++          }
+         }
+ 
+         span<Bucket> raw()
+diff -urN a/boost/unordered/detail/implementation.hpp b/boost/unordered/detail/implementation.hpp
+--- a/boost/unordered/detail/implementation.hpp	2022-08-03 22:47:16.000000000 -0400
++++ b/boost/unordered/detail/implementation.hpp	2022-08-24 19:44:43.139787681 -0400
+@@ -2054,12 +2054,14 @@
+ 
+         std::size_t bucket_size(std::size_t index) const
+         {
+-          bucket_iterator itb = buckets_.at(index);
+-          node_pointer n = itb->next;
+           std::size_t count = 0;
+-          while (n) {
+-            ++count;
+-            n = n->next;
++          if (size_ > 0) {
++            bucket_iterator itb = buckets_.at(index);
++            node_pointer n = itb->next;
++            while (n) {
++              ++count;
++              n = n->next;
++            }
+           }
+           return count;
+         }
+@@ -2420,11 +2422,14 @@
+         node_pointer find_node_impl(
+           Key const& x, bucket_iterator itb) const
+         {
+-          key_equal const& pred = this->key_eq();
+-          node_pointer p = itb->next;
+-          for (; p; p = p->next) {
+-            if (pred(x, extractor::extract(p->value()))) {
+-              break;
++          node_pointer p = node_pointer();
++          if (itb != buckets_.end()) {
++            key_equal const& pred = this->key_eq();
++            p = itb->next;
++            for (; p; p = p->next) {
++              if (pred(x, extractor::extract(p->value()))) {
++                break;
++              }
+             }
+           }
+           return p;
+@@ -2453,11 +2458,13 @@
+         inline iterator transparent_find(
+           Key const& k, Hash const& h, Pred const& pred) const
+         {
+-          std::size_t const key_hash = h(k);
+-          bucket_iterator itb = buckets_.at(buckets_.position(key_hash));
+-          for (node_pointer p = itb->next; p; p = p->next) {
+-            if (BOOST_LIKELY(pred(k, extractor::extract(p->value())))) {
+-              return iterator(p, itb);
++          if (size_ > 0) {
++            std::size_t const key_hash = h(k);
++            bucket_iterator itb = buckets_.at(buckets_.position(key_hash));
++            for (node_pointer p = itb->next; p; p = p->next) {
++              if (BOOST_LIKELY(pred(k, extractor::extract(p->value())))) {
++                return iterator(p, itb);
++              }
+             }
+           }
+ 
+@@ -2467,11 +2474,13 @@
+         template <class Key>
+         node_pointer* find_prev(Key const& key, bucket_iterator itb)
+         {
+-          key_equal pred = this->key_eq();
+-          for (node_pointer* pp = boost::addressof(itb->next); *pp;
+-               pp = boost::addressof((*pp)->next)) {
+-            if (pred(key, extractor::extract((*pp)->value()))) {
+-              return pp;
++          if (size_ > 0) {
++            key_equal pred = this->key_eq();
++            for (node_pointer* pp = boost::addressof(itb->next); *pp;
++                pp = boost::addressof((*pp)->next)) {
++              if (pred(key, extractor::extract((*pp)->value()))) {
++                return pp;
++              }
+             }
+           }
+           typedef node_pointer* node_pointer_pointer;
+diff -urN a/boost/unordered/unordered_map.hpp b/boost/unordered/unordered_map.hpp
+--- a/boost/unordered/unordered_map.hpp	2022-08-03 22:47:16.000000000 -0400
++++ b/boost/unordered/unordered_map.hpp	2022-08-24 19:44:43.139787681 -0400
+@@ -2069,6 +2069,10 @@
+     template <class K, class T, class H, class P, class A>
+     float unordered_map<K, T, H, P, A>::load_factor() const BOOST_NOEXCEPT
+     {
++      if (table_.size_ == 0) {
++        return 0.0f;
++      }
++
+       BOOST_ASSERT(table_.bucket_count() != 0);
+       return static_cast<float>(table_.size_) /
+              static_cast<float>(table_.bucket_count());
+@@ -2506,6 +2510,10 @@
+     template <class K, class T, class H, class P, class A>
+     float unordered_multimap<K, T, H, P, A>::load_factor() const BOOST_NOEXCEPT
+     {
++      if (table_.size_ == 0) {
++        return 0.0f;
++      }
++
+       BOOST_ASSERT(table_.bucket_count() != 0);
+       return static_cast<float>(table_.size_) /
+              static_cast<float>(table_.bucket_count());
+diff -urN a/boost/unordered/unordered_set.hpp b/boost/unordered/unordered_set.hpp
+--- a/boost/unordered/unordered_set.hpp	2022-08-03 22:47:16.000000000 -0400
++++ b/boost/unordered/unordered_set.hpp	2022-08-24 19:44:43.139787681 -0400
+@@ -1586,6 +1586,10 @@
+     template <class T, class H, class P, class A>
+     float unordered_set<T, H, P, A>::load_factor() const BOOST_NOEXCEPT
+     {
++      if (table_.size_ == 0) {
++        return 0.0f;
++      }
++
+       BOOST_ASSERT(table_.bucket_count() != 0);
+       return static_cast<float>(table_.size_) /
+              static_cast<float>(table_.bucket_count());
+@@ -1986,6 +1990,10 @@
+     template <class T, class H, class P, class A>
+     float unordered_multiset<T, H, P, A>::load_factor() const BOOST_NOEXCEPT
+     {
++      if (table_.size_ == 0) {
++        return 0.0f;
++      }
++
+       BOOST_ASSERT(table_.bucket_count() != 0);
+       return static_cast<float>(table_.size_) /
+              static_cast<float>(table_.bucket_count());
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.80.0-0004-filesystem-posix-fix-no-at-apis-missing-include.patch b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0004-filesystem-posix-fix-no-at-apis-missing-include.patch
new file mode 100644
index 0000000000000000000000000000000000000000..dfa4438d93acdde5d0d7e8dbe1e6102d61742098
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0004-filesystem-posix-fix-no-at-apis-missing-include.patch
@@ -0,0 +1,21 @@
+commit 5864f397ccad30f6e73221b90bdac57a303b9752
+Author: Andrey Semashev <andrey.semashev@gmail.com>
+Date:   Fri Aug 12 12:59:56 2022 +0300
+
+    Fixed a missing include on POSIX systems that don't support *at APIs.
+    
+    Fixes https://github.com/boostorg/filesystem/issues/250.
+
+diff --git a/libs/filesystem/src/operations.cpp b/libs/filesystem/src/operations.cpp
+index ca2fff3..e22967e 100644
+--- a/libs/filesystem/src/operations.cpp
++++ b/libs/filesystem/src/operations.cpp
+@@ -70,7 +70,7 @@
+ 
+ #include <unistd.h>
+ #include <fcntl.h>
+-#if _POSIX_C_SOURCE < 200809L
++#if !defined(BOOST_FILESYSTEM_HAS_POSIX_AT_APIS)
+ #include <utime.h>
+ #endif
+ #include <limits.h>
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.80.0-0005-config-libcpp15.patch b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0005-config-libcpp15.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1e84702f8b06bfc57bc0209aa6006f6a278834c8
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0005-config-libcpp15.patch
@@ -0,0 +1,16 @@
+--- a/boost/config/stdlib/libcpp.hpp	2022-08-03 22:47:07.000000000 -0400
++++ b/boost/config/stdlib/libcpp.hpp	2022-09-16 22:16:17.044119011 -0400
+@@ -168,4 +168,13 @@
+ #  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+ #endif
+ 
++#if _LIBCPP_VERSION >= 15000
++//
++// Unary function is now deprecated in C++11 and later:
++//
++#if __cplusplus >= 201103L
++#define BOOST_NO_CXX98_FUNCTION_BASE
++#endif
++#endif
++
+ //  --- end ---
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.80.0-0006-unordered-msvc-rtcc.patch b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0006-unordered-msvc-rtcc.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ff133016a20225dc31e03343d623c8060850c60d
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.80.0-0006-unordered-msvc-rtcc.patch
@@ -0,0 +1,18 @@
+--- a/boost/unordered/detail/prime_fmod.hpp	2022-08-03 22:47:16.000000000 -0400
++++ b/boost/unordered/detail/prime_fmod.hpp	2022-12-14 01:45:27.368620146 -0500
+@@ -117,9 +117,15 @@
+ #if defined(BOOST_UNORDERED_FCA_HAS_64B_SIZE_T)
+           std::size_t sizes_under_32bit = inv_sizes32_len;
+           if (BOOST_LIKELY(size_index < sizes_under_32bit)) {
++#if defined(__MSVC_RUNTIME_CHECKS)
++            return fast_modulo(
++              boost::uint32_t(hash & 0xffffffffu) + boost::uint32_t(hash >> 32),
++              inv_sizes32[size_index], boost::uint32_t(sizes[size_index]));
++#else
+             return fast_modulo(
+               boost::uint32_t(hash) + boost::uint32_t(hash >> 32),
+               inv_sizes32[size_index], boost::uint32_t(sizes[size_index]));
++#endif
+           } else {
+             return positions[size_index - sizes_under_32bit](hash);
+           }
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.80.0-locale-fail-on-missing-backend.patch b/utils/ci/conan/recipes/boost/all/patches/1.80.0-locale-fail-on-missing-backend.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e3523962267101f604419c57c3948efbb9eb7762
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.80.0-locale-fail-on-missing-backend.patch
@@ -0,0 +1,84 @@
+diff --git a/libs/locale/build/Jamfile.v2 b/libs/locale/build/Jamfile.v2
+index 3c517c884..0f521dbcf 100644
+--- a/libs/locale/build/Jamfile.v2
++++ b/libs/locale/build/Jamfile.v2
+@@ -20,6 +20,7 @@ project /boost/locale
+ # Features
+ 
+ feature.feature boost.locale.iconv : on off : optional propagated ;
++feature.feature boost.locale.iconv.lib : libc libiconv : optional propagated ;
+ feature.feature boost.locale.icu : on off :  optional propagated ;
+ feature.feature boost.locale.posix : on off : optional propagated ;
+ feature.feature boost.locale.std : on off : optional propagated ;
+@@ -29,7 +30,8 @@ feature.feature boost.locale.winapi : on off : optional propagated ;
+ 
+ ## iconv
+ 
+-exe has_iconv : $(TOP)/build/has_iconv.cpp ;
++obj has_iconv_libc_obj : $(TOP)/build/has_iconv.cpp ;
++exe has_iconv : has_iconv_libc_obj ;
+ explicit has_iconv ;
+ 
+ ICONV_PATH = [ modules.peek : ICONV_PATH ] ;
+@@ -43,7 +45,8 @@ lib iconv
+ 
+ explicit iconv ;
+ 
+-exe has_external_iconv : $(TOP)/build/has_iconv.cpp iconv ;
++obj has_iconv_libc_ext : $(TOP)/build/has_iconv.cpp iconv ;
++exe has_external_iconv : has_iconv_libc_ext iconv ;
+ explicit has_external_iconv ;
+ 
+ exe accepts_shared_option   : $(TOP)/build/option.cpp
+@@ -230,10 +233,37 @@ rule configure-full ( properties * : flags-only )
+         if [ configure.builds has_iconv : $(properties) : "iconv (libc)" ]
+         {
+             found-iconv = true ;
+-        } else if [ configure.builds has_external_iconv : $(properties) : "iconv (separate)" ]
++            if <boost.locale.iconv.lib>libiconv in $(properties)
++            {
++                if [ configure.builds has_external_iconv : $(properties) : "iconv (separate)" ]
++                {
++                    result += <library>iconv ;
++                }
++                else
++                {
++                    EXIT "- Boost.Locale found iconv (libc) instead of iconv (separate) library to be built." ;
++                }
++            }
++        }
++        else if <boost.locale.iconv.lib>libc in $(properties)
+         {
+-            found-iconv = true ;
+-            result += <library>iconv ;
++            EXIT "- Boost.Locale failed to find iconv (libc) library to be built." ;
++        }
++        else
++        {
++            if [ configure.builds has_external_iconv : $(properties) : "iconv (separate)" ]
++            {
++                found-iconv = true ;
++                result += <library>iconv ;
++            }
++            else if <boost.locale.iconv.lib>libiconv in $(properties)
++            {
++                EXIT "- Boost.Locale failed to find iconv (separate) library to be built." ;
++            }
++        }
++        if ! $(found-iconv)
++        {
++            EXIT "- Boost.Locale failed to find iconv library to be built." ;
+         }
+     }
+     if $(found-iconv)
+@@ -273,6 +303,10 @@ rule configure-full ( properties * : flags-only )
+                       <library>/boost/thread//boost_thread
+                       ;
+         }
++        else
++        {
++            EXIT "- Boost.Locale failed to find ICU library to be built." ;
++        }
+     }
+ 
+     if ! $(found-iconv) && ! $(found-icu) && ! <target-os>windows in $(properties) && ! <target-os>cygwin in $(properties)
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.81.0-locale-fail-on-missing-backend.patch b/utils/ci/conan/recipes/boost/all/patches/1.81.0-locale-fail-on-missing-backend.patch
new file mode 100644
index 0000000000000000000000000000000000000000..80b22dd54b0e120183c0e6126ff30f7da45f44bb
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.81.0-locale-fail-on-missing-backend.patch
@@ -0,0 +1,12 @@
+diff --git a/libs/locale/build/Jamfile.v2 b/libs/locale/build/Jamfile.v2
+index f1321db3..36899cdc 100644
+--- a/libs/locale/build/Jamfile.v2
++++ b/libs/locale/build/Jamfile.v2
+@@ -22,6 +22,7 @@ project /boost/locale
+ # Features
+ 
+ feature.feature boost.locale.iconv : on off : optional propagated ;
++feature.feature boost.locale.iconv.lib : libc libiconv : optional propagated ;
+ feature.feature boost.locale.icu : on off :  optional propagated ;
+ feature.feature boost.locale.posix : on off : optional propagated ;
+ feature.feature boost.locale.std : on off : optional propagated ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.82.0-locale-iconv-library-option.patch b/utils/ci/conan/recipes/boost/all/patches/1.82.0-locale-iconv-library-option.patch
new file mode 100644
index 0000000000000000000000000000000000000000..80b22dd54b0e120183c0e6126ff30f7da45f44bb
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.82.0-locale-iconv-library-option.patch
@@ -0,0 +1,12 @@
+diff --git a/libs/locale/build/Jamfile.v2 b/libs/locale/build/Jamfile.v2
+index f1321db3..36899cdc 100644
+--- a/libs/locale/build/Jamfile.v2
++++ b/libs/locale/build/Jamfile.v2
+@@ -22,6 +22,7 @@ project /boost/locale
+ # Features
+ 
+ feature.feature boost.locale.iconv : on off : optional propagated ;
++feature.feature boost.locale.iconv.lib : libc libiconv : optional propagated ;
+ feature.feature boost.locale.icu : on off :  optional propagated ;
+ feature.feature boost.locale.posix : on off : optional propagated ;
+ feature.feature boost.locale.std : on off : optional propagated ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.83.0-locale-msvc.patch b/utils/ci/conan/recipes/boost/all/patches/1.83.0-locale-msvc.patch
new file mode 100644
index 0000000000000000000000000000000000000000..acb9510e6eb2fac88579931653f2b3e11599e4c8
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.83.0-locale-msvc.patch
@@ -0,0 +1,22 @@
+From 0552ffc29ff11e4fe130b7143ea6ac2bee7b15c6 Mon Sep 17 00:00:00 2001
+From: wevsty <ty@wevs.org>
+Date: Sat, 12 Aug 2023 22:13:48 +0800
+Subject: [PATCH] fix build error on MSVC
+
+---
+ boost/locale/util/string.hpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/boost/locale/util/string.hpp b/boost/locale/util/string.hpp
+index 9ab9521c..ba066bd4 100644
+--- a/boost/locale/util/string.hpp
++++ b/boost/locale/util/string.hpp
+@@ -38,7 +38,7 @@ namespace boost { namespace locale { namespace util {
+     /// Cast an unsigned char to a (possibly signed) char avoiding implementation defined behavior
+     constexpr char to_char(unsigned char c)
+     {
+-        return static_cast<char>((c - std::numeric_limits<char>::min()) + std::numeric_limits<char>::min());
++        return static_cast<char>((c - (std::numeric_limits<char>::min)()) + (std::numeric_limits<char>::min)());
+     }
+ 
+ }}} // namespace boost::locale::util
diff --git a/utils/ci/conan/recipes/boost/all/patches/1.84.0-reimplement-string_set-as-any-string.patch b/utils/ci/conan/recipes/boost/all/patches/1.84.0-reimplement-string_set-as-any-string.patch
new file mode 100644
index 0000000000000000000000000000000000000000..15393721de8ee19075968ff38a37fdb9bd0066a2
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/1.84.0-reimplement-string_set-as-any-string.patch
@@ -0,0 +1,337 @@
+Fixes compilation with cppstd=20 on MacOS
+
+From c5e8f02c903696a213fc4b710f6740ccd1f07f4e Mon Sep 17 00:00:00 2001
+From: Alexander Grund <Flamefire@users.noreply.github.com>
+Date: Sun, 3 Dec 2023 20:06:27 +0100
+Subject: [PATCH] Reimplement `string_set` as `any_string`
+
+Use a better name for a type-erased string implemented using
+`dynamic_cast` instead of storing&comparing the `typeid` of the char
+type used.
+This is a workaround for missing typeinfo for `char8_t` on e.g. libc++
+on FreeBSD 13.1.
+It also simplifies memory management size calc/copy implementation.
+---
+ boost/locale/detail/any_string.hpp | 71 ++++++++++++++++++++++
+ boost/locale/formatting.hpp        | 51 ++--------------
+ libs/locale/src/boost/locale/formatting.cpp       | 45 --------------
+ libs/locale/test/test_ios_info.cpp             | 64 +++++++++++++++----
+ 4 files changed, 127 insertions(+), 104 deletions(-)
+ create mode 100644 boost/locale/detail/any_string.hpp
+
+diff --git a/boost/locale/detail/any_string.hpp b/boost/locale/detail/any_string.hpp
+new file mode 100644
+index 00000000..c0cc7ffb
+--- /dev/null
++++ b/boost/locale/detail/any_string.hpp
+@@ -0,0 +1,71 @@
++//
++// Copyright (c) 2023 Alexander Grund
++//
++// Distributed under the Boost Software License, Version 1.0.
++// https://www.boost.org/LICENSE_1_0.txt
++
++#ifndef BOOST_LOCALE_DETAIL_ANY_STRING_HPP_INCLUDED
++#define BOOST_LOCALE_DETAIL_ANY_STRING_HPP_INCLUDED
++
++#include <boost/locale/config.hpp>
++#include <boost/assert.hpp>
++#include <boost/utility/string_view.hpp>
++#include <memory>
++#include <stdexcept>
++#include <string>
++
++/// \cond INTERNAL
++namespace boost { namespace locale { namespace detail {
++    /// Type-erased std::basic_string
++    class any_string {
++        struct BOOST_SYMBOL_VISIBLE base {
++            virtual ~base() = default;
++            virtual base* clone() const = 0;
++
++        protected:
++            base() = default;
++            base(const base&) = default;
++            base(base&&) = delete;
++            base& operator=(const base&) = default;
++            base& operator=(base&&) = delete;
++        };
++        template<typename Char>
++        struct BOOST_SYMBOL_VISIBLE impl : base {
++            explicit impl(const boost::basic_string_view<Char> value) : s(value) {}
++            impl* clone() const override { return new impl(*this); }
++            std::basic_string<Char> s;
++        };
++
++        std::unique_ptr<const base> s_;
++
++    public:
++        any_string() = default;
++        any_string(const any_string& other) : s_(other.s_ ? other.s_->clone() : nullptr) {}
++        any_string(any_string&&) = default;
++        any_string& operator=(any_string other) // Covers the copy and move assignment
++        {
++            s_.swap(other.s_);
++            return *this;
++        }
++
++        template<typename Char>
++        void set(const boost::basic_string_view<Char> s)
++        {
++            BOOST_ASSERT(!s.empty());
++            s_.reset(new impl<Char>(s));
++        }
++
++        template<typename Char>
++        std::basic_string<Char> get() const
++        {
++            if(!s_)
++                throw std::bad_cast();
++            return dynamic_cast<const impl<Char>&>(*s_).s;
++        }
++    };
++
++}}} // namespace boost::locale::detail
++
++/// \endcond
++
++#endif
+diff --git a/boost/locale/formatting.hpp b/boost/locale/formatting.hpp
+index d14e6f69..e3c8619e 100644
+--- a/boost/locale/formatting.hpp
++++ b/boost/locale/formatting.hpp
+@@ -8,15 +8,13 @@
+ #ifndef BOOST_LOCALE_FORMATTING_HPP_INCLUDED
+ #define BOOST_LOCALE_FORMATTING_HPP_INCLUDED
+ 
++#include <boost/locale/detail/any_string.hpp>
+ #include <boost/locale/time_zone.hpp>
+-#include <boost/assert.hpp>
+-#include <boost/utility/string_view.hpp>
+ #include <cstdint>
+ #include <cstring>
+ #include <istream>
+ #include <ostream>
+ #include <string>
+-#include <typeinfo>
+ 
+ #ifdef BOOST_MSVC
+ #    pragma warning(push)
+@@ -130,13 +128,13 @@ namespace boost { namespace locale {
+         template<typename CharType>
+         void date_time_pattern(const std::basic_string<CharType>& str)
+         {
+-            date_time_pattern_set().set<CharType>(str);
++            datetime_.set<CharType>(str);
+         }
+         /// Get date/time pattern (strftime like)
+         template<typename CharType>
+         std::basic_string<CharType> date_time_pattern() const
+         {
+-            return date_time_pattern_set().get<CharType>();
++            return datetime_.get<CharType>();
+         }
+ 
+         /// \cond INTERNAL
+@@ -144,51 +142,10 @@ namespace boost { namespace locale {
+         /// \endcond
+ 
+     private:
+-        class string_set;
+-
+-        const string_set& date_time_pattern_set() const;
+-        string_set& date_time_pattern_set();
+-
+-        class BOOST_LOCALE_DECL string_set {
+-        public:
+-            string_set();
+-            ~string_set();
+-            string_set(const string_set& other);
+-            string_set& operator=(string_set other);
+-            void swap(string_set& other);
+-
+-            template<typename Char>
+-            void set(const boost::basic_string_view<Char> s)
+-            {
+-                BOOST_ASSERT(!s.empty());
+-                delete[] ptr;
+-                ptr = nullptr;
+-                type = &typeid(Char);
+-                size = sizeof(Char) * s.size();
+-                ptr = size ? new char[size] : nullptr;
+-                memcpy(ptr, s.data(), size);
+-            }
+-
+-            template<typename Char>
+-            std::basic_string<Char> get() const
+-            {
+-                if(type == nullptr || *type != typeid(Char))
+-                    throw std::bad_cast();
+-                std::basic_string<Char> result(size / sizeof(Char), Char(0));
+-                memcpy(&result.front(), ptr, size);
+-                return result;
+-            }
+-
+-        private:
+-            const std::type_info* type;
+-            size_t size;
+-            char* ptr;
+-        };
+-
+         uint64_t flags_;
+         int domain_id_;
+         std::string time_zone_;
+-        string_set datetime_;
++        detail::any_string datetime_;
+     };
+ 
+     /// \brief This namespace includes all manipulators that can be used on IO streams
+diff --git a/src/boost/locale/shared/formatting.cpp b/src/boost/locale/shared/formatting.cpp
+index 489d1fd5..457ba782 100644
+--- a/libs/locale/src/boost/locale/shared/formatting.cpp
++++ b/libs/locale/src/boost/locale/shared/formatting.cpp
+@@ -7,43 +7,8 @@
+ #include <boost/locale/date_time.hpp>
+ #include <boost/locale/formatting.hpp>
+ #include "boost/locale/shared/ios_prop.hpp"
+-#include <algorithm>
+-#include <typeinfo>
+ 
+ namespace boost { namespace locale {
+-
+-    ios_info::string_set::string_set() : type(nullptr), size(0), ptr(nullptr) {}
+-    ios_info::string_set::~string_set()
+-    {
+-        delete[] ptr;
+-    }
+-    ios_info::string_set::string_set(const string_set& other)
+-    {
+-        if(other.ptr != nullptr) {
+-            ptr = new char[other.size];
+-            size = other.size;
+-            type = other.type;
+-            memcpy(ptr, other.ptr, size);
+-        } else {
+-            ptr = nullptr;
+-            size = 0;
+-            type = nullptr;
+-        }
+-    }
+-
+-    void ios_info::string_set::swap(string_set& other)
+-    {
+-        std::swap(type, other.type);
+-        std::swap(size, other.size);
+-        std::swap(ptr, other.ptr);
+-    }
+-
+-    ios_info::string_set& ios_info::string_set::operator=(string_set other)
+-    {
+-        swap(other);
+-        return *this;
+-    }
+-
+     ios_info::ios_info() : flags_(0), domain_id_(0), time_zone_(time_zone::global()) {}
+ 
+     ios_info::~ios_info() = default;
+@@ -105,16 +70,6 @@ namespace boost { namespace locale {
+         return time_zone_;
+     }
+ 
+-    const ios_info::string_set& ios_info::date_time_pattern_set() const
+-    {
+-        return datetime_;
+-    }
+-
+-    ios_info::string_set& ios_info::date_time_pattern_set()
+-    {
+-        return datetime_;
+-    }
+-
+     ios_info& ios_info::get(std::ios_base& ios)
+     {
+         return impl::ios_prop<ios_info>::get(ios);
+diff --git a/libs/locale/test/test_ios_info.cpp b/libs/locale/test/test_ios_info.cpp
+index 9b63aaed..79179a8f 100644
+--- a/libs/locale/test/test_ios_info.cpp
++++ b/libs/locale/test/test_ios_info.cpp
+@@ -105,18 +105,6 @@ void test_member_methods()
+ 
+         info.date_time_pattern(std::string("Pattern"));
+         TEST_EQ(info.date_time_pattern<char>(), "Pattern");
+-
+-        info.date_time_pattern(ascii_to<wchar_t>("WChar Pattern"));
+-        TEST_EQ(info.date_time_pattern<wchar_t>(), ascii_to<wchar_t>("WChar Pattern"));
+-        TEST_THROWS(info.date_time_pattern<char>(), std::bad_cast);
+-
+-        info.date_time_pattern(ascii_to<char16_t>("Char16 Pattern"));
+-        TEST_THROWS(info.date_time_pattern<wchar_t>(), std::bad_cast);
+-        TEST_EQ(info.date_time_pattern<char16_t>(), ascii_to<char16_t>("Char16 Pattern"));
+-
+-        info.date_time_pattern(ascii_to<char32_t>("Char32 Pattern"));
+-        TEST_THROWS(info.date_time_pattern<char16_t>(), std::bad_cast);
+-        TEST_EQ(info.date_time_pattern<char32_t>(), ascii_to<char32_t>("Char32 Pattern"));
+     }
+ }
+ 
+@@ -212,8 +200,60 @@ void test_manipulators()
+     TEST_EQ(info2.date_time_pattern<wchar_t>(), L"My TZ");
+ }
+ 
++void test_any_string()
++{
++    boost::locale::detail::any_string s;
++    TEST_THROWS(s.get<char>(), std::bad_cast);
++    TEST_THROWS(s.get<wchar_t>(), std::bad_cast);
++
++    s.set<char>("Char Pattern");
++    TEST_EQ(s.get<char>(), "Char Pattern");
++    TEST_THROWS(s.get<wchar_t>(), std::bad_cast);
++
++    s.set<wchar_t>(ascii_to<wchar_t>("WChar Pattern"));
++    TEST_EQ(s.get<wchar_t>(), ascii_to<wchar_t>("WChar Pattern"));
++    TEST_THROWS(s.get<char>(), std::bad_cast);
++
++    s.set<char16_t>(ascii_to<char16_t>("Char16 Pattern"));
++    TEST_EQ(s.get<char16_t>(), ascii_to<char16_t>("Char16 Pattern"));
++    TEST_THROWS(s.get<char>(), std::bad_cast);
++
++    s.set<char32_t>(ascii_to<char32_t>("Char32 Pattern"));
++    TEST_EQ(s.get<char32_t>(), ascii_to<char32_t>("Char32 Pattern"));
++    TEST_THROWS(s.get<char16_t>(), std::bad_cast);
++
++#ifndef BOOST_LOCALE_NO_CXX20_STRING8
++    s.set<char8_t>(ascii_to<char8_t>("Char8 Pattern"));
++    TEST_EQ(s.get<char8_t>(), ascii_to<char8_t>("Char8 Pattern"));
++    TEST_THROWS(s.get<char32_t>(), std::bad_cast);
++#endif
++
++    boost::locale::detail::any_string s1, s2, empty;
++    s1.set<char>("Char");
++    s2.set<wchar_t>(ascii_to<wchar_t>("WChar"));
++    // Copy ctor
++    boost::locale::detail::any_string s3(s1);
++    TEST_EQ(s3.get<char>(), "Char");
++    TEST_EQ(s1.get<char>(), "Char");
++    // Ensure deep copy
++    s3.set<char>("Foo");
++    TEST_EQ(s3.get<char>(), "Foo");
++    TEST_EQ(s1.get<char>(), "Char");
++    // Copy assign
++    s3 = s2;
++    TEST_EQ(s3.get<wchar_t>(), ascii_to<wchar_t>("WChar"));
++    TEST_EQ(s2.get<wchar_t>(), ascii_to<wchar_t>("WChar"));
++    // Move assign
++    s3 = std::move(s1);
++    TEST_EQ(s3.get<char>(), "Char");
++    // From empty
++    s3 = empty;
++    TEST_THROWS(s3.get<char>(), std::bad_cast);
++}
++
+ void test_main(int /*argc*/, char** /*argv*/)
+ {
++    test_any_string();
+     test_member_methods();
+     test_manipulators();
+ }
diff --git a/utils/ci/conan/recipes/boost/all/patches/bcp_namespace_issues_1_71.patch b/utils/ci/conan/recipes/boost/all/patches/bcp_namespace_issues_1_71.patch
new file mode 100644
index 0000000000000000000000000000000000000000..94e748ef55f4b900877671394984e3cac7037041
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/bcp_namespace_issues_1_71.patch
@@ -0,0 +1,33 @@
+From d0586e88122f41cd5ac9666db70c37d6f0fc7480 Mon Sep 17 00:00:00 2001
+From: Peter Dimov <pdimov@gmail.com>
+Date: Sun, 26 May 2019 18:49:12 +0300
+Subject: [PATCH] Fix `bcp --namespace` issues
+
+---
+ Jamroot | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/Jamroot b/Jamroot
+index e0d7c90f51d..4e913c2b3f3 100644
+--- a/Jamroot
++++ b/Jamroot
+@@ -140,7 +140,8 @@ import "class" : new ;
+ import property-set ;
+ import threadapi-feature ;
+ import option ;
+-import tools/boost_install/boost-install ;
++# Backslash because of `bcp --namespace`
++import tools/boost\_install/boost-install ;
+ 
+ path-constant BOOST_ROOT : . ;
+ constant BOOST_VERSION : 1.71.0 ;
+@@ -311,8 +312,8 @@ rule boost-install ( libraries * )
+ # stage and install targets via boost-install, above.
+ rule boost-lib ( name : sources * : requirements * : default-build * : usage-requirements * )
+ {
++    autolink = <link>shared:<define>BOOST_$(name:U)_DYN_LINK=1 ;
+     name = boost_$(name) ;
+-    autolink = <link>shared:<define>$(name:U)_DYN_LINK=1 ;
+     lib $(name)
+         : $(sources)
+         : $(requirements) $(autolink)
diff --git a/utils/ci/conan/recipes/boost/all/patches/bcp_namespace_issues_1_72.patch b/utils/ci/conan/recipes/boost/all/patches/bcp_namespace_issues_1_72.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5ffe1ec157b1931739c5d0c28dfb9dec83eba534
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/bcp_namespace_issues_1_72.patch
@@ -0,0 +1,33 @@
+From d0586e88122f41cd5ac9666db70c37d6f0fc7480 Mon Sep 17 00:00:00 2001
+From: Peter Dimov <pdimov@gmail.com>
+Date: Sun, 26 May 2019 18:49:12 +0300
+Subject: [PATCH] Fix `bcp --namespace` issues
+
+---
+ Jamroot | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/Jamroot b/Jamroot
+index e0d7c90f51d..4e913c2b3f3 100644
+--- a/Jamroot
++++ b/Jamroot
+@@ -140,7 +140,8 @@ import "class" : new ;
+ import property-set ;
+ import threadapi-feature ;
+ import option ;
+-import tools/boost_install/boost-install ;
++# Backslash because of `bcp --namespace`
++import tools/boost\_install/boost-install ;
+
+ path-constant BOOST_ROOT : . ;
+ constant BOOST_VERSION : 1.72.0 ;
+@@ -311,8 +312,8 @@ rule boost-install ( libraries * )
+ # stage and install targets via boost-install, above.
+ rule boost-lib ( name : sources * : requirements * : default-build * : usage-requirements * )
+ {
++    autolink = <link>shared:<define>BOOST_$(name:U)_DYN_LINK=1 ;
+     name = boost_$(name) ;
+-    autolink = <link>shared:<define>$(name:U)_DYN_LINK=1 ;
+     lib $(name)
+         : $(sources)
+         : $(requirements) $(autolink)
diff --git a/utils/ci/conan/recipes/boost/all/patches/boost_1_77_mpi_check.patch b/utils/ci/conan/recipes/boost/all/patches/boost_1_77_mpi_check.patch
new file mode 100644
index 0000000000000000000000000000000000000000..59e5030464cca5bb3d99cb9bbde6e148f71aa77b
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/boost_1_77_mpi_check.patch
@@ -0,0 +1,24 @@
+diff -ru a/tools/build/src/tools/mpi.jam b/tools/build/src/tools/mpi.jam
+--- a/tools/build/src/tools/mpi.jam	2019-12-10 01:20:16.000000000 +0100
++++ b/tools/build/src/tools/mpi.jam	2020-09-02 13:17:22.942349254 +0200
+@@ -66,6 +66,8 @@
+ import type ;
+ import path ;
+ 
++import errors ;
++
+ # Make this module a project
+ project.initialize $(__name__) ;
+ project mpi ;
+@@ -538,6 +540,11 @@
+     # Set up the "mpi" alias
+     alias mpi : : : : $(options) ;
+   }
++
++  if ! $(.configured)
++  {
++	 errors.user-error "MPI not configured" ;
++  }     
+ }
+ 
+ # States whether MPI has bee configured
diff --git a/utils/ci/conan/recipes/boost/all/patches/boost_build_qcc_fix_debug_build_parameter.patch b/utils/ci/conan/recipes/boost/all/patches/boost_build_qcc_fix_debug_build_parameter.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5e6c660ee96c2ec2249ed5ce336567d87ae7620c
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/boost_build_qcc_fix_debug_build_parameter.patch
@@ -0,0 +1,22 @@
+diff --git a/tools/build/src/tools/qcc.jam b/tools/build/src/tools/qcc.jam
+index 155b1ac3..64274e65 100644
+--- a/tools/build/src/tools/qcc.jam
++++ b/tools/build/src/tools/qcc.jam
+@@ -48,7 +48,7 @@ generators.register-c-compiler qcc.compile.asm : ASM : OBJ : <toolset>qcc ;
+ 
+ 
+ # Declare flags for compilation.
+-toolset.flags qcc.compile OPTIONS <debug-symbols>on : -gstabs+ ;
++toolset.flags qcc.compile OPTIONS <debug-symbols>on : -g ;
+ 
+ # Declare flags and action for compilation.
+ toolset.flags qcc.compile OPTIONS <optimization>off : -O0 ;
+@@ -164,7 +164,7 @@ generators.override qcc.searched-lib-generator : searched-lib-generator ;
+ 
+ # Declare flags for linking.
+ # First, the common flags.
+-toolset.flags qcc.link OPTIONS <debug-symbols>on : -gstabs+ ;
++toolset.flags qcc.link OPTIONS <debug-symbols>on : -g ;
+ toolset.flags qcc.link OPTIONS <profiling>on : -p ;
+ toolset.flags qcc.link OPTIONS <linkflags> ;
+ toolset.flags qcc.link LINKPATH <library-path> ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/boost_build_qcc_fix_debug_build_parameter_since_1_74.patch b/utils/ci/conan/recipes/boost/all/patches/boost_build_qcc_fix_debug_build_parameter_since_1_74.patch
new file mode 100644
index 0000000000000000000000000000000000000000..29b744e9667d32fa6650bba66fa731b807181bb0
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/boost_build_qcc_fix_debug_build_parameter_since_1_74.patch
@@ -0,0 +1,22 @@
+diff --git a/tools/build/src/tools/qcc.jam b/tools/build/src/tools/qcc.jam
+index 740e907..b0653f1 100644
+--- a/tools/build/src/tools/qcc.jam
++++ b/tools/build/src/tools/qcc.jam
+@@ -86,7 +86,7 @@ local rule check-target-platform
+ }
+ 
+ # Declare flags for compilation.
+-toolset.flags qcc.compile OPTIONS <debug-symbols>on : -gstabs+ ;
++toolset.flags qcc.compile OPTIONS <debug-symbols>on : -g ;
+ 
+ # Declare flags and action for compilation.
+ toolset.flags qcc.compile OPTIONS <optimization>off : -O0 ;
+@@ -216,7 +216,7 @@ generators.override qcc.searched-lib-generator : searched-lib-generator ;
+ 
+ # Declare flags for linking.
+ # First, the common flags.
+-toolset.flags qcc.link OPTIONS <debug-symbols>on : -gstabs+ ;
++toolset.flags qcc.link OPTIONS <debug-symbols>on : -g ;
+ toolset.flags qcc.link OPTIONS <profiling>on : -p ;
+ toolset.flags qcc.link OPTIONS <linkflags> ;
+ toolset.flags qcc.link LINKPATH <library-path> ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/boost_core_qnx_cxx_provide___cxa_get_globals.patch b/utils/ci/conan/recipes/boost/all/patches/boost_core_qnx_cxx_provide___cxa_get_globals.patch
new file mode 100644
index 0000000000000000000000000000000000000000..dffef671e7992a5a4f86ad1f63556dbfcad15efc
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/boost_core_qnx_cxx_provide___cxa_get_globals.patch
@@ -0,0 +1,20 @@
+diff --git a/boost/core/uncaught_exceptions.hpp b/boost/core/uncaught_exceptions.hpp
+index c39120b..436717f 100644
+--- a/boost/core/uncaught_exceptions.hpp
++++ b/boost/core/uncaught_exceptions.hpp
+@@ -56,10 +56,15 @@
+ // On Linux with clang and libc++ and on OS X, there is a version of cxxabi.h from libc++abi that doesn't declare __cxa_get_globals, but provides __cxa_uncaught_exceptions.
+ // The function only appeared in version _LIBCPPABI_VERSION >= 1002 of the library. Unfortunately, there are linking errors about undefined reference to __cxa_uncaught_exceptions
+ // on Ubuntu Trusty and OS X, so we avoid using it and forward-declare __cxa_get_globals instead.
++// On QNX SDP 7.0 (QCC 5.4.0), there are multiple cxxabi.h, one from glibcxx from gcc and another from libc++abi from LLVM. Which one is included will be determined by the qcc
++// command line arguments (-V and/or -Y; http://www.qnx.com/developers/docs/7.0.0/#com.qnx.doc.neutrino.utilities/topic/q/qcc.html). The LLVM libc++abi is missing the declaration
++// of __cxa_get_globals but it is also patched by QNX developers to not define _LIBCPPABI_VERSION. Older QNX SDP versions, up to and including 6.6, don't provide LLVM and libc++abi.
++// See https://github.com/boostorg/core/issues/59.
+ #if !defined(__FreeBSD__) && \
+     ( \
+         (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407) || \
+         defined(__OpenBSD__) || \
++        (defined(__QNXNTO__) && !defined(__GLIBCXX__) && !defined(__GLIBCPP__)) || \
+         defined(_LIBCPPABI_VERSION) \
+     )
+ namespace __cxxabiv1 {
diff --git a/utils/ci/conan/recipes/boost/all/patches/boost_locale_fail_on_missing_backend.patch b/utils/ci/conan/recipes/boost/all/patches/boost_locale_fail_on_missing_backend.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f1a0b7958449e467dadd9b35b0bbd50795e1cc33
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/boost_locale_fail_on_missing_backend.patch
@@ -0,0 +1,60 @@
+diff --git a/libs/locale/build/Jamfile.v2 b/libs/locale/build/Jamfile.v2
+index 578e722..b715f59 100644
+--- a/libs/locale/build/Jamfile.v2
++++ b/libs/locale/build/Jamfile.v2
+@@ -17,6 +17,7 @@ import feature ;
+ # Features
+ 
+ feature.feature boost.locale.iconv : on off : optional propagated ;
++feature.feature boost.locale.iconv.lib : libc libiconv : optional propagated ;
+ feature.feature boost.locale.icu : on off :  optional propagated ;
+ feature.feature boost.locale.posix : on off : optional propagated ;
+ feature.feature boost.locale.std : on off : optional propagated ;
+@@ -217,6 +217,21 @@ rule configure-full ( properties * : flags-only )
+         if [ configure.builds has_iconv : $(properties) : "iconv (libc)" ]
+         {
+             found-iconv = true ;
++            if <boost.locale.iconv.lib>libiconv in $(properties)
++			 {
++               if [ configure.builds has_external_iconv : $(properties) : "iconv (separate)" ]
++               {
++                   result += <library>iconv ;
++               }
++               else
++               {
++                   EXIT "- Boost.Locale found iconv (libc) instead of iconv (separate) library to be built." ;
++               }
++			 }
++        }
++        else if <boost.locale.iconv.lib>libc in $(properties)
++        {
++            EXIT "- Boost.Locale failed to find iconv (libc) library to be built." ;
+         }
+         else 
+         {
+@@ -225,6 +234,14 @@ rule configure-full ( properties * : flags-only )
+                 found-iconv = true ;
+                 result += <library>iconv ;
+             }
++            else if <boost.locale.iconv.lib>libiconv in $(properties)
++            {
++                EXIT "- Boost.Locale failed to find iconv (separate) library to be built." ;
++            }
++        }
++        if ! $(found-iconv)
++        {
++            EXIT "- Boost.Locale failed to find iconv library to be built." ;
+         }
+     }        
+     if $(found-iconv) 
+@@ -265,6 +282,10 @@ rule configure-full ( properties * : flags-only )
+                       <library>../../thread/build//boost_thread 
+                       ;
+         }
++        else
++        {
++            EXIT "- Boost.Locale failed to find ICU library to be built." ;
++        }
+ 
+     }
+         
diff --git a/utils/ci/conan/recipes/boost/all/patches/boost_log_filesystem_no_deprecated_1_72.patch b/utils/ci/conan/recipes/boost/all/patches/boost_log_filesystem_no_deprecated_1_72.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bb010943f2bde27bdcf9693ef46c75b9b6f3b303
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/boost_log_filesystem_no_deprecated_1_72.patch
@@ -0,0 +1,13 @@
+diff --git a/libs/log/src/text_file_backend.cpp b/libs/log/src/text_file_backend.cpp
+index 50cef3b..d5fd02e 100644
+--- a/libs/log/src/text_file_backend.cpp
++++ b/libs/log/src/text_file_backend.cpp
+@@ -39,6 +39,8 @@
+ #include <boost/type_traits/is_same.hpp>
+ #include <boost/system/error_code.hpp>
+ #include <boost/system/system_error.hpp>
++#include <boost/filesystem/directory.hpp>
++#include <boost/filesystem/exception.hpp>
+ #include <boost/filesystem/path.hpp>
+ #include <boost/filesystem/fstream.hpp>
+ #include <boost/filesystem/operations.hpp>
diff --git a/utils/ci/conan/recipes/boost/all/patches/boost_mpi_check.patch b/utils/ci/conan/recipes/boost/all/patches/boost_mpi_check.patch
new file mode 100644
index 0000000000000000000000000000000000000000..af7e45f610510668f9d10f4c2c98979e6fe513d8
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/boost_mpi_check.patch
@@ -0,0 +1,24 @@
+diff -ru a/tools/build/src/tools/mpi.jam b/tools/build/src/tools/mpi.jam
+--- a/tools/build/src/tools/mpi.jam	2019-12-10 01:20:16.000000000 +0100
++++ b/tools/build/src/tools/mpi.jam	2020-09-02 13:17:22.942349254 +0200
+@@ -66,6 +66,8 @@
+ import type ;
+ import path ;
+ 
++import errors ;
++
+ # Make this module a project
+ project.initialize $(__name__) ;
+ project mpi ;
+@@ -539,6 +541,11 @@
+     # Set up the "mpi" alias
+     alias mpi : : : : $(options) ;
+   }
++
++  if ! $(.configured)
++  {
++	 errors.user-error "MPI not configured" ;
++  }     
+ }
+ 
+ # States whether MPI has bee configured
diff --git a/utils/ci/conan/recipes/boost/all/patches/python_base_prefix.patch b/utils/ci/conan/recipes/boost/all/patches/python_base_prefix.patch
new file mode 100644
index 0000000000000000000000000000000000000000..47371cba773df01296184002d4540be2ce44a4e1
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/python_base_prefix.patch
@@ -0,0 +1,25 @@
+diff -ru a/tools/build/src/tools/python.jam b/tools/build/src/tools/python.jam
+--- a/tools/build/src/tools/python.jam
++++ b/tools/build/src/tools/python.jam
+@@ -746,7 +746,7 @@ local rule configure ( version ? : cmd-or-prefix ? : includes * : libraries ? :
+     {
+         # Values to be extracted from python's sys module. These will be set by
+         # the probe rule, above, using Jam's dynamic scoping.
+-        local sys-elements = version platform prefix exec_prefix executable ;
++        local sys-elements = version platform base_prefix base_exec_prefix executable ;
+         local sys.$(sys-elements) ;
+
+         # Compute the string Python's sys.platform needs to match. If not
+@@ -786,10 +786,10 @@ local rule configure ( version ? : cmd-or-prefix ? : includes * : libraries ? :
+                 {
+                     debug-message ...requested configuration matched! ;
+ 
+-                    exec-prefix = $(sys.exec_prefix) ;
++                    exec-prefix = $(sys.base_exec_prefix) ;
+ 
+                     compute-default-paths $(target-os) : $(sys.version) :
+-                        $(sys.prefix) : $(sys.exec_prefix) ;
++                        $(sys.base_prefix) : $(sys.base_exec_prefix) ;
+ 
+                     version = $(sys.version) ;
+                     interpreter-cmd ?= $(cmd) ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/python_base_prefix_since_1_74.patch b/utils/ci/conan/recipes/boost/all/patches/python_base_prefix_since_1_74.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2267fe4762dc8915d87c4c83836b5138c292046a
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/python_base_prefix_since_1_74.patch
@@ -0,0 +1,26 @@
+diff --git a/tools/build/src/tools/python.jam b/tools/build/src/tools/python.jam
+index cf8c379..3e3f095 100644
+--- a/tools/build/src/tools/python.jam
++++ b/tools/build/src/tools/python.jam
+@@ -749,7 +749,7 @@ local rule configure ( version ? : cmd-or-prefix ? : includes * : libraries ? :
+     {
+         # Values to be extracted from python's sys module. These will be set by
+         # the probe rule, above, using Jam's dynamic scoping.
+-        local sys-elements = version platform prefix exec_prefix executable ;
++        local sys-elements = version platform base_prefix base_exec_prefix executable ;
+         local sys.$(sys-elements) ;
+ 
+         # Compute the string Python's sys.platform needs to match. If not
+@@ -789,10 +789,10 @@ local rule configure ( version ? : cmd-or-prefix ? : includes * : libraries ? :
+                 {
+                     debug-message ...requested configuration matched! ;
+ 
+-                    exec-prefix = $(sys.exec_prefix) ;
++                    exec-prefix = $(sys.base_exec_prefix) ;
+ 
+                     compute-default-paths $(target-os) : $(sys.version) :
+-                        $(sys.prefix) : $(sys.exec_prefix) ;
++                        $(sys.base_prefix) : $(sys.base_exec_prefix) ;
+ 
+                     version = $(sys.version) ;
+                     interpreter-cmd ?= $(cmd) ;
diff --git a/utils/ci/conan/recipes/boost/all/patches/solaris_pthread_data.patch b/utils/ci/conan/recipes/boost/all/patches/solaris_pthread_data.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ea5e4d7048d4ee2b78b72ec27d23e89301fa2e42
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/patches/solaris_pthread_data.patch
@@ -0,0 +1,13 @@
+diff --git a/include/boost/thread/pthread/thread_data.hpp b/include/boost/thread/pthread/thread_data.hpp
+index aefbeb4..bc9b136 100644
+--- a/boost/thread/pthread/thread_data.hpp
++++ b/boost/thread/pthread/thread_data.hpp
+@@ -57,7 +57,7 @@ namespace boost
+ #else
+           std::size_t page_size = ::sysconf( _SC_PAGESIZE);
+ #endif
+-#if PTHREAD_STACK_MIN > 0
++#ifdef PTHREAD_STACK_MIN
+           if (size<PTHREAD_STACK_MIN) size=PTHREAD_STACK_MIN;
+ #endif
+           size = ((size+page_size-1)/page_size)*page_size;
diff --git a/utils/ci/conan/recipes/boost/all/rebuild-dependencies.py b/utils/ci/conan/recipes/boost/all/rebuild-dependencies.py
new file mode 100644
index 0000000000000000000000000000000000000000..d9f286b2135d66f6a07353e38777710d5608a21e
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/all/rebuild-dependencies.py
@@ -0,0 +1,491 @@
+#!/usr/bin/env python3
+
+import argparse
+import dataclasses
+import json
+import logging
+import pprint
+import re
+import subprocess
+import tempfile
+from pathlib import Path
+from typing import Dict, List, Tuple
+
+import yaml
+from conan.tools.files import chdir
+
+log = logging.Logger("boost-dependency-builder")
+log.parent = logging.root
+log.setLevel(logging.WARNING)
+
+
+BOOST_GIT_URL = "https://github.com/boostorg/boost.git"
+
+# When adding (or removing) an option, also add this option to the list in
+# `conanfile.py` and re-run this script.
+CONFIGURE_OPTIONS = (
+    "atomic",
+    "charconv",
+    "chrono",
+    "cobalt",
+    "container",
+    "context",
+    "contract",
+    "coroutine",
+    "date_time",
+    "exception",
+    "fiber",
+    "filesystem",
+    "graph",
+    "graph_parallel",
+    "iostreams",
+    "json",
+    "locale",
+    "log",
+    "math",
+    "mpi",
+    "nowide",
+    "program_options",
+    "python",
+    "random",
+    "regex",
+    "serialization",
+    "stacktrace",
+    "system",
+    "test",
+    "thread",
+    "timer",
+    "type_erasure",
+    "url",
+    "wave",
+)
+
+
+CONAN_REQUIREMENTS = (
+    "backtrace",
+    "bzip2",
+    "iconv",
+    "icu",
+    "lzma",
+    "python",
+    "zlib",
+    "zstd",
+)
+
+
+LINUX_SYSTEM_LIBS = (
+    "dl",
+    "m",
+    "rt",
+    "pthread",
+)
+
+
+WINDOWS_SYSTEM_LIBS = (
+    "bcrypt",
+    "coredll",
+    "dbgeng",
+)
+
+
+@dataclasses.dataclass
+class BoostDependenciesExport(object):
+    version: str
+    configure_options: List[str]
+    dependencies: Dict[str, List[str]] = dataclasses.field(default_factory=dict)
+    libs: Dict[str, List[str]] = dataclasses.field(default_factory=dict)
+    requirements: Dict[str, List[str]] = dataclasses.field(default_factory=dict)
+    static_only: List[str] = dataclasses.field(default_factory=list)
+
+
+@dataclasses.dataclass
+class BoostDependencies(object):
+    buildables: List[str]
+    export: BoostDependenciesExport
+
+
+class BoostDependencyBuilder(object):
+    def __init__(self, boost_version: str, boostdep_version: str, tmppath: Path, git_url: str, outputdir: Path, unsafe: bool):
+        self.boost_version = boost_version
+        self.boostdep_version = boostdep_version
+        self.git_url = git_url
+        self.tmppath = tmppath
+        self.outputdir = outputdir
+        self.unsafe = unsafe
+        self._boostdep = None
+
+    @property
+    def boost_path(self) -> Path:
+        return self.tmppath / "boost"
+
+    def do_git_update(self) -> None:
+        if not self.boost_path.exists():
+            with chdir(self, self.tmppath):
+                print("Cloning boost git")
+                subprocess.check_call(["git", "clone", "--", self.git_url, "boost"])
+            with chdir(self, self.boost_path):
+                print("Checking out current master")
+                subprocess.check_call(["git", "checkout", "origin/master"])
+                print("Removing master branch")
+                subprocess.check_call(["git", "branch", "-D", "master"])
+        else:
+            with chdir(self, self.boost_path):
+                print("Updating git repo")
+                subprocess.check_call(["git", "fetch", "origin"])
+                print("Removing all local changes to git repo")
+                subprocess.check_call(["git", "reset", "--hard", "HEAD"])
+                print("Checking out current master")
+                subprocess.check_call(["git", "checkout", "origin/master"])
+
+    def do_git_submodule_update(self):
+        with chdir(self, self.boost_path):
+            if not self.unsafe:
+                # De-init + init to make sure that boostdep won't detect a new or removed boost library
+                print("De-init git submodules")
+                subprocess.check_call(["git", "submodule", "deinit", "--all", "-f"])
+
+            try:
+                print(f"Checking out version {self.boost_version}")
+                subprocess.check_call(["git", "checkout", f"boost-{self.boost_version}"])
+            except subprocess.CalledProcessError:
+                print(f"version {self.boost_version} does not exist")
+                raise
+
+            print("Re-init git submodules")
+            subprocess.check_call(["git", "submodule", "update", "--init"])
+
+            print("Removing unknown files/directories")
+            subprocess.check_call(["git", "clean", "-d", "-f"])
+
+    def do_install_boostdep(self):
+        with chdir(self, self.boost_path):
+            print(f"Installing boostdep/{self.boostdep_version}")
+            cmd = ["conan", "install", "--tool-requires", f"boostdep/{self.boostdep_version}", "--format", "json", "-vquiet"]
+            info = json.loads(subprocess.check_output(cmd))
+            self._boostdep = Path(info["graph"]["nodes"]["1"]["package_folder"]) / "bin" / "boostdep"
+
+    _GREP_IGNORE_PREFIX = ("#", "\"")
+    _GREP_IGNORE_PARTS = ("boost", "<", ">")
+
+    @classmethod
+    def _grep_libs(cls, regex, text):
+        res = set()
+        for m in re.finditer(regex, text, flags=re.MULTILINE):
+            # If text before main capture group contains a string or a comment => ignore
+            ignore = False
+            for ign in cls._GREP_IGNORE_PREFIX:
+                if ign in m.group(1):
+                    ignore = True
+            if ignore:
+                continue
+            l = m.group(2).lower()
+            ignore = False
+            for ign in cls._GREP_IGNORE_PARTS:
+                if ign in l:
+                    ignore = True
+            if ignore:
+                continue
+            res.add(l)
+        return list(res)
+
+    def _grep_requirements(self, component: str) -> List[str]:
+        jam = self.boost_path / "libs" / component / "build" / "Jamfile.v2"
+        if not jam.is_file():
+            jam = self.boost_path / "libs" / component / "build" / "Jamfile"
+        if not jam.is_file():
+            log.warning("Can't find Jamfile for %s. Unable to determine dependencies.", component)
+            return []
+        contents = jam.open().read()
+
+        using = self._grep_libs("\n(.*)using\\s+([^ ;:]+)\\s*", contents)
+        libs = self._grep_libs("\n(.*)\\s(?:searched-)?lib\\s+([^ \t\n;:]+)", contents)
+
+        requirements = using + libs
+        return requirements
+
+    def _sort_requirements(self, requirements: List[str]) -> Tuple[List[str], Dict[str, List[str]], List[str]]:
+        conan_requirements = set()
+        system_libs = {}
+        unknown_libs = set()
+
+        for req in requirements:
+            if req in LINUX_SYSTEM_LIBS:
+                system_libs.setdefault("linux", []).append(req)
+                continue
+            if req in WINDOWS_SYSTEM_LIBS:
+                system_libs.setdefault("windows", []).append(req)
+                continue
+            added = False
+            for conan_req in CONAN_REQUIREMENTS:
+                if conan_req in req:
+                    conan_requirements.add(conan_req)
+                    added = True
+            if added:
+                continue
+            unknown_libs.add(req)
+        return list(conan_requirements), system_libs, list(unknown_libs)
+
+    def do_boostdep_collect(self) -> BoostDependencies:
+        with chdir(self, self.boost_path):
+            buildables = subprocess.check_output([self._boostdep, "--list-buildable"], text=True)
+            buildables = buildables.splitlines()
+            log.debug("`boostdep --list--buildable` returned these buildables: %s", buildables)
+
+            # modules = subprocess.check_output([self._boostdep_path, "--list-modules"])
+            # modules = modules.decode().splitlines()
+
+            dependency_tree = {}
+            buildable_dependencies = subprocess.check_output([self._boostdep, "--list-buildable-dependencies"], text=True)
+            log.debug("boostdep --list-buildable-dependencies returns: %s", buildable_dependencies)
+            for line in buildable_dependencies.splitlines():
+                if re.match(r"^[\s]*#.*", line):
+                    continue
+                match = re.match(r"([\S]+)\s*=\s*([^;]+)\s*;\s*", line)
+                if not match:
+                    continue
+                master = match.group(1)
+                dependencies = re.split(r"\s+", match.group(2).strip())
+                dependency_tree[master] = dependencies
+
+            log.debug("Using `boostdep --track-sources`, the following dependency tree was calculated:")
+            log.debug(pprint.pformat(dependency_tree))
+
+        filtered_dependency_tree = {k: [d for d in v if d in buildables] for k, v in dependency_tree.items() if k in buildables}
+
+        configure_options = []
+        for conf_option in CONFIGURE_OPTIONS:
+            if conf_option in filtered_dependency_tree:
+                configure_options.append(conf_option)
+            else:
+                log.warning("option %s not available in %s", conf_option, self.boost_version)
+
+        log.debug("Following config_options remain: %s", configure_options)
+
+        requirements = {}
+        for conf_option in configure_options:
+            reqs = self._grep_requirements(conf_option)
+            conan_requirements, system_libs, unknown_libs = self._sort_requirements(reqs)
+            if system_libs:
+                log.warning("Module '%s' (%s) has system libraries: %s", conf_option, self.boost_version, system_libs)
+            if unknown_libs:
+                log.warning("Module '%s' (%s) has unknown libs: %s", conf_option, self.boost_version, unknown_libs)
+            if conan_requirements:
+                requirements[conf_option] = conan_requirements
+
+        boost_dependencies = BoostDependencies(
+            export=BoostDependenciesExport(
+                version=self.boost_version,
+                configure_options=configure_options,
+                dependencies=filtered_dependency_tree,
+                requirements=requirements,
+                static_only=[],
+            ),
+            buildables=buildables,
+        )
+
+        return boost_dependencies
+
+    @staticmethod
+    def detect_cycles(tree: Dict[str, List[str]]) -> Dict[str, List[str]]:
+        tree = {k: v[:] for k, v in tree.items()}
+        while tree:
+            nodeps = set(k for k, v in tree.items() if not v)
+            if not nodeps:
+                return tree
+            tree = {k: [d for d in v if d not in nodeps] for k, v in tree.items() if k not in nodeps}
+        return {}
+
+    def _fix_dependencies(self, deptree: Dict[str, List[str]]) -> Dict[str, List[str]]:
+        try:
+            # python does not depend on graph
+            deptree["python"].remove("graph")
+        except (KeyError, ValueError):
+            pass
+
+        try:
+            # graph does not depend on graph_parallel
+            deptree["graph"].remove("graph_parallel")
+        except (KeyError, ValueError):
+            pass
+
+        try:
+            # mpi does not depend on python
+            deptree["mpi"].remove("python")
+        except (KeyError, ValueError):
+            pass
+
+        if "mpi_python" in deptree and "python" not in deptree["mpi_python"]:
+            deptree["mpi_python"].append("python")
+
+        # Break random/math dependency cycle
+        try:
+            deptree["math"].remove("random")
+        except ValueError:
+            pass
+
+        remaining_tree = self.detect_cycles(deptree)
+        if remaining_tree:
+            raise Exception(f"Dependency cycle detected. Remaining tree: {remaining_tree}")
+        return deptree
+
+    @staticmethod
+    def _boostify_library(lib: str) -> str:
+        return f"boost_{lib}"
+
+    def do_create_libraries(self, boost_dependencies: BoostDependencies):
+        libraries = {}
+        module_provides_extra = {}
+
+        #  Look for the names of libraries in Jam build files
+        for buildable in boost_dependencies.buildables:
+            construct_jam = lambda jam_ext : self.boost_path / "libs" / buildable / "build" / f"Jamfile{jam_ext}"
+            try:
+                buildable_jam = next(construct_jam(jam_ext) for jam_ext in ("", ".v2") if construct_jam(jam_ext).is_file())
+            except StopIteration:
+                raise Exception(f"Cannot find jam build file for {buildable}")
+            jam_text = buildable_jam.read_text()
+            buildable_libs = re.findall("[ \n](boost-)?lib ([a-zA-Z0-9_]+)[ \n]", jam_text)
+            buildable_libs = set(f"boost_{lib}" if lib_prefix else lib for lib_prefix, lib in buildable_libs)
+            buildable_libs = set(l[len("boost_"):] for l in buildable_libs if l.startswith("boost_"))  # list(filter(lambda l: l.startswith("boost"), buildable_libs))
+
+            if not buildable_libs:
+                # Some boost releases support multiple python versions
+                if buildable == "python":
+                    buildable_libs.add("python")
+            if not buildable_libs:
+                raise Exception(f"Cannot find any library for buildable {buildable}")
+
+            if buildable in buildable_libs:
+                libraries[buildable] = [f"boost_{buildable}"]
+                buildable_libs.remove(buildable)
+            else:
+                libraries[buildable] = []
+            module_provides_extra[buildable] = buildable_libs
+            for buildable_dep in buildable_libs:
+                boost_dependencies.export.dependencies[buildable_dep] = [buildable]
+                libraries[buildable_dep] = [f"boost_{buildable_dep}"]
+
+        # Boost.Test: unit_test_framework depends on all libraries of Boost.Test
+        if "unit_test_framework" in boost_dependencies.export.dependencies and "test" in module_provides_extra:
+            boost_dependencies.export.dependencies["unit_test_framework"].extend(module_provides_extra["test"].difference({"unit_test_framework"}))
+
+        # python and numpy have a version suffix. Add it here.
+        if "python" in libraries:
+            if len(libraries["python"]) != 1:
+                raise Exception("Boost.Python should provide exactly one library")
+            libraries["python"][0] += "{py_major}{py_minor}"
+        if "numpy" in libraries:
+            if len(libraries["numpy"]) != 1:
+                raise Exception("Boost.Numpy should provide exactly one library")
+            libraries["numpy"][0] += "{py_major}{py_minor}"
+
+        boost_dependencies.export.libs = libraries
+        boost_dependencies.export.static_only = [
+            "boost_exception",
+            "boost_test_exec_monitor",
+        ]
+
+        return boost_dependencies
+
+    @property
+    def _outputpath(self) -> Path:
+        return self.outputdir / f"dependencies-{self.boost_version}.yml"
+
+    @classmethod
+    def _sort_item(cls, item):
+        if isinstance(item, dict):
+            items = sorted(item.items())
+            new_items = []
+            for item in sorted(items):
+                new_items.append((item[0], cls._sort_item(item[1])))
+            return dict(new_items)
+        elif isinstance(item, tuple):
+            return tuple(cls._sort_item(e) for e in sorted(item))
+        elif isinstance(item, list):
+            return list(cls._sort_item(e) for e in sorted(item))
+        else:
+            return item
+
+    def do_create_dependency_file(self) -> None:
+        tree = self.do_boostdep_collect()
+        tree = self.do_create_libraries(tree)
+
+        tree.export.dependencies = self._fix_dependencies(tree.export.dependencies)
+
+        data = dataclasses.asdict(tree.export)
+        if self.unsafe:
+            data["UNSAFE"] = "!DO NOT COMMIT! !THIS FILE IS GENERATED WITH THE UNSAFE OPTION ENABLED!"
+
+        data = self._sort_item(data)
+
+        print(f"Creating {self.outputdir}")
+        with self._outputpath.open("w") as fout:
+            yaml.dump(data, fout)
+
+
+def main(args=None) -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--verbose", dest="verbose", action="store_true", help="verbose output")
+    parser.add_argument("-t", dest="tmppath", help="temporary folder where to clone boost (default is system temporary folder)")
+    parser.add_argument("-d", dest="boostdep_version", default="1.82.0", type=str, help="boostdep version")
+    parser.add_argument("-u", dest="git_url", default=BOOST_GIT_URL, help="boost git url")
+    parser.add_argument("-U", dest="git_update", action="store_true", help="update the git repo")
+    parser.add_argument("-o", dest="outputdir", default=None, type=Path, help="output dependency dir")
+    parser.add_argument("-x", dest="unsafe", action="store_true", help="unsafe fast(er) operation")
+
+    version_group = parser.add_mutually_exclusive_group(required=True)
+    version_group.add_argument("-v", dest="boost_version", help="boost version")
+    version_group.add_argument("-A", dest="boost_version", action="store_const", const=None, help="All boost versions")
+    ns = parser.parse_args(args)
+
+    logging.basicConfig(format="[%(levelname)s] %(message)s")
+    if ns.verbose:
+        log.setLevel(logging.DEBUG)
+
+    if not ns.tmppath:
+        ns.tmppath = Path(tempfile.gettempdir())
+    print(f"Temporary folder is {ns.tmppath}")
+    if not ns.outputdir:
+        ns.outputdir = Path("dependencies")
+    print(f"Dependencies folder is {ns.outputdir}")
+
+    ns.outputdir.mkdir(exist_ok=True)
+
+    git_update_done = False
+
+    if ns.boost_version is None:
+        conan_data = yaml.safe_load(Path("conandata.yml").open())
+        boost_versions = list(conan_data["sources"].keys())
+    else:
+        boost_versions = [ns.boost_version]
+
+    for boost_version in boost_versions:
+        print(f"Starting {boost_version}")
+        boost_collector = BoostDependencyBuilder(
+            boost_version=boost_version,
+            boostdep_version=ns.boostdep_version,
+            git_url=ns.git_url,
+            outputdir=ns.outputdir,
+            tmppath=ns.tmppath,
+            unsafe=ns.unsafe,
+        )
+
+        if not ns.git_update and not boost_collector.boost_path.exists():
+            log.error("Boost directory does not exist. Re-execute this script with -U to run 'git update'.")
+            return 1
+
+        if ns.git_update and not git_update_done:
+            boost_collector.do_git_update()
+            git_update_done = True
+
+        boost_collector.do_git_submodule_update()
+
+        boost_collector.do_install_boostdep()
+
+        boost_collector.do_create_dependency_file()
+    return 0
+
+
+if __name__ == "__main__":
+    import sys
+    sys.exit(main())
diff --git a/utils/ci/conan/recipes/boost/config.yml b/utils/ci/conan/recipes/boost/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3363c84d6a537840f1c5a5c252434ea3a7f9744f
--- /dev/null
+++ b/utils/ci/conan/recipes/boost/config.yml
@@ -0,0 +1,31 @@
+versions:
+  "1.85.0":
+    folder: all
+  "1.84.0":
+    folder: all
+  "1.83.0":
+    folder: all
+  "1.82.0":
+    folder: all
+  "1.81.0":
+    folder: all
+  "1.80.0":
+    folder: all
+  "1.79.0":
+    folder: all
+  "1.78.0":
+    folder: all
+  "1.77.0":
+    folder: all
+  "1.76.0":
+    folder: all
+  "1.75.0":
+    folder: all
+  "1.74.0":
+    folder: all
+  "1.73.0":
+    folder: all
+  "1.72.0":
+    folder: all
+  "1.71.0":
+    folder: all
diff --git a/utils/ci/conan/recipes/bzip2/all/CMakeLists.txt b/utils/ci/conan/recipes/bzip2/all/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cce959a4a45c57ec1d215e473629e0381924d288
--- /dev/null
+++ b/utils/ci/conan/recipes/bzip2/all/CMakeLists.txt
@@ -0,0 +1,41 @@
+cmake_minimum_required(VERSION 3.4)
+project(bzip2 LANGUAGES C)
+
+include(GNUInstallDirs)
+
+option(BZ2_BUILD_EXE "Build bzip2 command-line utility" ON)
+
+add_library(
+    bz2
+    ${BZ2_SRC_DIR}/blocksort.c
+    ${BZ2_SRC_DIR}/bzlib.c
+    ${BZ2_SRC_DIR}/compress.c
+    ${BZ2_SRC_DIR}/crctable.c
+    ${BZ2_SRC_DIR}/decompress.c
+    ${BZ2_SRC_DIR}/huffman.c
+    ${BZ2_SRC_DIR}/randtable.c
+)
+
+target_include_directories(bz2 PUBLIC ${BZ2_SRC_DIR})
+set_target_properties(
+    bz2
+    PROPERTIES
+    PUBLIC_HEADER "${BZ2_SRC_DIR}/bzlib.h"
+    SOVERSION ${BZ2_VERSION_MAJOR}
+    VERSION ${BZ2_VERSION_STRING}
+    WINDOWS_EXPORT_ALL_SYMBOLS ON
+)
+
+install(
+    TARGETS bz2
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+)
+
+if(BZ2_BUILD_EXE)
+    add_executable(bzip2 ${BZ2_SRC_DIR}/bzip2.c)
+    target_link_libraries(bzip2 PRIVATE bz2)
+    install(TARGETS bzip2 DESTINATION ${CMAKE_INSTALL_BINDIR})
+endif()
diff --git a/utils/ci/conan/recipes/bzip2/all/conandata.yml b/utils/ci/conan/recipes/bzip2/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..01ba013179e10f00e0e00eb02888da729ccf1fe0
--- /dev/null
+++ b/utils/ci/conan/recipes/bzip2/all/conandata.yml
@@ -0,0 +1,10 @@
+sources:
+  "1.0.8":
+    url: "https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz"
+    sha256: "ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269"
+  "1.0.6":
+    url: "https://sourceware.org/pub/bzip2/bzip2-1.0.6.tar.gz"
+    sha256: "a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd"
+patches:
+  "1.0.6":
+    - patch_file: "patches/0001-fix-sys-stat-include.patch"
diff --git a/utils/ci/conan/recipes/bzip2/all/conanfile.py b/utils/ci/conan/recipes/bzip2/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..2a39045a8299d05a67865a230c6a468c0817523a
--- /dev/null
+++ b/utils/ci/conan/recipes/bzip2/all/conanfile.py
@@ -0,0 +1,106 @@
+from conan import ConanFile
+from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
+from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, save
+from conan.tools.scm import Version
+import os
+import textwrap
+
+required_conan_version = ">=1.53.0"
+
+
+class Bzip2Conan(ConanFile):
+    name = "bzip2"
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://sourceware.org/bzip2"
+    license = "bzip2-1.0.8"
+    description = "bzip2 is a free and open-source file compression program that uses the Burrows Wheeler algorithm."
+    topics = ("data-compressor", "file-compression")
+    package_type = "library"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "build_executable": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+        "build_executable": True,
+    }
+
+    def export_sources(self):
+        copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder)
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+        self.license = f"bzip2-{self.version}"
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        self.settings.compiler.rm_safe("libcxx")
+        self.settings.compiler.rm_safe("cppstd")
+
+    def layout(self):
+        cmake_layout(self, src_folder="src")
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.variables["BZ2_BUILD_EXE"] = self.options.build_executable
+        tc.variables["BZ2_SRC_DIR"] = self.source_folder.replace("\\", "/")
+        tc.variables["BZ2_VERSION_MAJOR"] = Version(self.version).major
+        tc.variables["BZ2_VERSION_STRING"] = self.version
+        tc.generate()
+
+    def build(self):
+        apply_conandata_patches(self)
+        cmake = CMake(self)
+        cmake.configure(build_script_folder=os.path.join(self.source_folder, os.pardir))
+        cmake.build()
+
+    def package(self):
+        copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
+        cmake = CMake(self)
+        cmake.install()
+        self._create_cmake_module_variables(
+            os.path.join(self.package_folder, self._module_file_rel_path)
+        )
+
+    def _create_cmake_module_variables(self, module_file):
+        content = textwrap.dedent(f"""\
+            set(BZIP2_NEED_PREFIX TRUE)
+            set(BZIP2_FOUND TRUE)
+            if(NOT DEFINED BZIP2_INCLUDE_DIRS AND DEFINED BZip2_INCLUDE_DIRS)
+                set(BZIP2_INCLUDE_DIRS ${{BZip2_INCLUDE_DIRS}})
+            endif()
+            if(NOT DEFINED BZIP2_INCLUDE_DIR AND DEFINED BZip2_INCLUDE_DIR)
+                set(BZIP2_INCLUDE_DIR ${{BZip2_INCLUDE_DIR}})
+            endif()
+            if(NOT DEFINED BZIP2_LIBRARIES AND DEFINED BZip2_LIBRARIES)
+                set(BZIP2_LIBRARIES ${{BZip2_LIBRARIES}})
+            endif()
+            set(BZIP2_VERSION_STRING "{self.version}")
+        """)
+        save(self, module_file, content)
+
+    @property
+    def _module_file_rel_path(self):
+        return os.path.join("lib", "cmake", f"conan-official-{self.name}-variables.cmake")
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "both")
+        self.cpp_info.set_property("cmake_file_name", "BZip2")
+        self.cpp_info.set_property("cmake_target_name", "BZip2::BZip2")
+        self.cpp_info.set_property("cmake_build_modules", [self._module_file_rel_path])
+        self.cpp_info.libs = ["bz2"]
+
+        self.cpp_info.names["cmake_find_package"] = "BZip2"
+        self.cpp_info.names["cmake_find_package_multi"] = "BZip2"
+        self.cpp_info.build_modules["cmake_find_package"] = [self._module_file_rel_path]
+        if self.options.build_executable:
+            self.env_info.PATH.append(os.path.join(self.package_folder, "bin"))
diff --git a/utils/ci/conan/recipes/bzip2/all/patches/0001-fix-sys-stat-include.patch b/utils/ci/conan/recipes/bzip2/all/patches/0001-fix-sys-stat-include.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6c79502b81348a924d9d4e35df2947dc37182358
--- /dev/null
+++ b/utils/ci/conan/recipes/bzip2/all/patches/0001-fix-sys-stat-include.patch
@@ -0,0 +1,11 @@
+--- a/bzip2.c
++++ b/bzip2.c
+@@ -128,7 +128,7 @@
+ #if BZ_LCCWIN32
+ #   include <io.h>
+ #   include <fcntl.h>
+-#   include <sys\stat.h>
++#   include <sys/stat.h>
+ 
+ #   define NORETURN       /**/
+ #   define PATH_SEP       '\\'
diff --git a/utils/ci/conan/recipes/bzip2/config.yml b/utils/ci/conan/recipes/bzip2/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..09dfd19800bb5690aef819281f05ffc6faf61223
--- /dev/null
+++ b/utils/ci/conan/recipes/bzip2/config.yml
@@ -0,0 +1,5 @@
+versions:
+  "1.0.8":
+    folder: all
+  "1.0.6":
+    folder: all
diff --git a/utils/ci/conan/recipe/fmilibrary/all/conandata.yml b/utils/ci/conan/recipes/fmilibrary/all/conandata.yml
similarity index 79%
rename from utils/ci/conan/recipe/fmilibrary/all/conandata.yml
rename to utils/ci/conan/recipes/fmilibrary/all/conandata.yml
index 482fe50de41fa7f0fcfbc340140947e41db17d4e..4d020eef8634c102e3c3b083cb0df20fd4df9ff8 100644
--- a/utils/ci/conan/recipe/fmilibrary/all/conandata.yml
+++ b/utils/ci/conan/recipes/fmilibrary/all/conandata.yml
@@ -16,8 +16,11 @@ sources:
   "2.0.3":
     url: https://github.com/modelon-community/fmi-library.git
     sha256: "4076be18d2e5506cf2d5ef4af526d93148947925"
-
+  "commitid":
+    url: https://github.com/modelon-community/fmi-library.git
 patches:
   "2.0.3":
-    - patch_file: "patches/patch5.patch"
+    - patch_file: "patches/cross-compilation-0001.patch"
+      base_path: "fmilibrary"
+    - patch_file: "patches/fmi-library-2.0.3.patch"
       base_path: "fmilibrary"
diff --git a/utils/ci/conan/recipe/fmilibrary/all/conanfile.py b/utils/ci/conan/recipes/fmilibrary/all/conanfile.py
similarity index 62%
rename from utils/ci/conan/recipe/fmilibrary/all/conanfile.py
rename to utils/ci/conan/recipes/fmilibrary/all/conanfile.py
index ab04a64230e21d69462a97ad00c51f702fb0dbf7..352cf9814c49d9f5f1287d36220e6b1b922d2007 100644
--- a/utils/ci/conan/recipe/fmilibrary/all/conanfile.py
+++ b/utils/ci/conan/recipes/fmilibrary/all/conanfile.py
@@ -26,9 +26,13 @@ class FmiConan(ConanFile):
     url = "https://github.com/modelon-community"
     description = "The Functional Mock-up Interface (or FMI) defines a standardized interface to be used in computer simulations to develop complex cyber-physical systems"
     settings = "os", "compiler", "build_type", "arch"
-    options = {"shared": [True, False], "fPIC": [True, False],"FMILIB_BUILD_STATIC_LIB": ["OFF", "ON"], "FMILIB_BUILD_SHARED_LIB": ["OFF", "ON"], "FMILIB_BUILD_TESTS": ["OFF", "ON"]}
-    default_options = {"shared": False, "fPIC": True, "FMILIB_BUILD_STATIC_LIB":"OFF", "FMILIB_BUILD_SHARED_LIB": "ON", "FMILIB_BUILD_TESTS": "OFF"}
+    options = {"shared": [True, False], "fPIC": [True, False], "FMILIB_BUILD_STATIC_LIB": ["OFF", "ON"], "FMILIB_BUILD_SHARED_LIB": ["OFF", "ON"],
+               "commit_id_value":[None, "ANY"], "FMILIB_BUILD_TESTS": ["OFF", "ON"]
+               }
+    default_options = {"shared": True, "fPIC": True,
+                       "commit_id_value": None, "FMILIB_BUILD_TESTS": "OFF"}
     short_paths = True
+    commit = None
 
     def export_sources(self):
         export_conandata_patches(self)
@@ -37,21 +41,35 @@ class FmiConan(ConanFile):
         if self.settings.os == "Windows":
             del self.options.fPIC
 
-    def _get_url_sha(self):
-        if "CommitID" in self.version:
-            url = self.conan_data["sources"][self.version.split("_")[0]]["url"]
-            sha256 = self.version.split("_")[1]
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        if self.options.commit_id_value:
+            self.commit = self.options.commit_id_value
+        if self.options.FMILIB_BUILD_STATIC_LIB or self.options.FMILIB_BUILD_SHARED_LIB:
+            pass
         else:
+            if self.options.shared:
+                self.options.FMILIB_BUILD_STATIC_LIB = "OFF"
+                self.options.FMILIB_BUILD_SHARED_LIB = "ON"
+            else:
+                self.options.FMILIB_BUILD_STATIC_LIB = "ON"
+                self.options.FMILIB_BUILD_SHARED_LIB = "OFF"
+
+    def _get_url_sha(self):
+        if self.version != "commitid" :
             url = self.conan_data["sources"][self.version]["url"]
-            sha256 = self.conan_data["sources"][self.version]["sha256"]
-        return url, sha256
+            self.commit = self.conan_data["sources"][self.version]["sha256"]
+        else:
+            url = self.conan_data["sources"]["commitid"]["url"]
+        return url
 
     def source(self):
-        url, sha256 = self._get_url_sha()
+        url = self._get_url_sha()
         git = Git(self)
         git.clone(url=url, target=self.name)
         git.folder=self.name
-        git.checkout(commit=sha256)
+        git.checkout(commit=self.commit)
         apply_conandata_patches(self)
 
     def generate(self):
@@ -69,3 +87,7 @@ class FmiConan(ConanFile):
     def package(self):
         cmake = CMake(self)
         cmake.install()
+
+    def package_info(self):
+        if self.options.shared:
+            self.cpp_info.libs = ["fmilib_shared"]
diff --git a/utils/ci/conan/recipes/fmilibrary/all/patches/cross-compilation-0001.patch b/utils/ci/conan/recipes/fmilibrary/all/patches/cross-compilation-0001.patch
new file mode 100644
index 0000000000000000000000000000000000000000..21f9016c18f0fbce1e403de2d4d10c5587ea9e1b
--- /dev/null
+++ b/utils/ci/conan/recipes/fmilibrary/all/patches/cross-compilation-0001.patch
@@ -0,0 +1,115 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index f7372bf..2d764a0 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -24,7 +24,9 @@ project (FMILibrary)
+ set_property(GLOBAL PROPERTY PROPERTYPREDEFINED_TARGETS_FOLDER Global)
+ set(FMILIBRARYHOME ${FMILibrary_SOURCE_DIR})
+ set(FMILIBRARYBUILD ${FMILibrary_BINARY_DIR})
+-
++if(CMAKE_CROSSCOMPILING)
++	set(CMAKE_HOST_SYSTEM_NAME Windows)
++endif()
+ # User configuration options and parameters
+ SET(FMILIB_INSTALL_PREFIX ${FMILibrary_BINARY_DIR}/../install CACHE PATH "Prefix prepended to install directories")
+ set(FMILIB_THIRDPARTYLIBS  ${FMILibrary_SOURCE_DIR}/ThirdParty CACHE PATH "Path to the ThirdParty library dir" )
+diff --git a/Config.cmake/fmiplatform.cmake b/Config.cmake/fmiplatform.cmake
+index 2023163..8df49bf 100644
+--- a/Config.cmake/fmiplatform.cmake
++++ b/Config.cmake/fmiplatform.cmake
+@@ -1,40 +1,40 @@
+-#    Copyright (C) 2017 Modelon AB
+-
+-#    This program is free software: you can redistribute it and/or modify
+-#    it under the terms of the BSD style license.
+-
+-#    This program is distributed in the hope that it will be useful,
+-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-#    FMILIB_License.txt file for more details.
+-
+-#    You should have received a copy of the FMILIB_License.txt file
+-#    along with this program. If not, contact Modelon AB <http://www.modelon.com>.
+-
+-# fmi_platform(platform) sets platform to one of the by FMI defined platforms
+-# win32, win64, linux32, linux64, darwin32 or darwin64 depending on cmake
+-# generator
+-function(fmi_platform platform )
+-    if(CMAKE_HOST_WIN32) #Set to true when the host system is Windows and on cygwin.
+-        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-            set(${platform} win32 PARENT_SCOPE)
+-        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-            set(${platform} win64 PARENT_SCOPE)
+-        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-    elseif(CMAKE_HOST_APPLE) #Set to true when the host system is Apple OSX. 
+-        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-            set(${platform} darwin32 PARENT_SCOPE)
+-        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-            set(${platform} darwin64 PARENT_SCOPE)
+-        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-    elseif(CMAKE_HOST_UNIX) #Set to true when the host system is UNIX or UNIX like (i.e. APPLE and CYGWIN). 
+-        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-            set(${platform} linux32 PARENT_SCOPE)
+-        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-            set(${platform} linux64 PARENT_SCOPE)
+-        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+-    else(CMAKE_HOST_WIN32)
+-        message(SEND_ERROR "Target ${platform} is not supported by the tests")
+-        set(${platform} not_supported)
+-    endif()
+-endfunction()
++#    Copyright (C) 2017 Modelon AB
++
++#    This program is free software: you can redistribute it and/or modify
++#    it under the terms of the BSD style license.
++
++#    This program is distributed in the hope that it will be useful,
++#    but WITHOUT ANY WARRANTY; without even the implied warranty of
++#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++#    FMILIB_License.txt file for more details.
++
++#    You should have received a copy of the FMILIB_License.txt file
++#    along with this program. If not, contact Modelon AB <http://www.modelon.com>.
++
++# fmi_platform(platform) sets platform to one of the by FMI defined platforms
++# win32, win64, linux32, linux64, darwin32 or darwin64 depending on cmake
++# generator
++function(fmi_platform platform )
++    if(CMAKE_HOST_WIN32 OR CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)  #Set to true when the host system is Windows and on cygwin. CMAKE_HOST_SYSTEM_NAME check is required for cross compilation
++        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
++            set(${platform} win32 PARENT_SCOPE)
++        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
++            set(${platform} win64 PARENT_SCOPE)
++        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
++    elseif(CMAKE_HOST_APPLE) #Set to true when the host system is Apple OSX. 
++        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
++            set(${platform} darwin32 PARENT_SCOPE)
++        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
++            set(${platform} darwin64 PARENT_SCOPE)
++        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
++    elseif(CMAKE_HOST_UNIX) #Set to true when the host system is UNIX or UNIX like (i.e. APPLE and CYGWIN). 
++        if(CMAKE_SIZEOF_VOID_P EQUAL 4)
++            set(${platform} linux32 PARENT_SCOPE)
++        else(CMAKE_SIZEOF_VOID_P EQUAL 4)
++            set(${platform} linux64 PARENT_SCOPE)
++        endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
++    else(CMAKE_HOST_WIN32)
++        message(SEND_ERROR "Target ${platform} is not supported by the tests")
++        set(${platform} not_supported)
++    endif()
++endfunction()
+diff --git a/Config.cmake/fmixml.cmake b/Config.cmake/fmixml.cmake
+index 03acb3e..1b45c1d 100644
+--- a/Config.cmake/fmixml.cmake
++++ b/Config.cmake/fmixml.cmake
+@@ -159,6 +159,10 @@ set(EXPAT_SETTINGS
+ 		-DCMAKE_MODULE_LINKER_FLAGS:STRING=${CMAKE_MODULE_LINKER_FLAGS}
+ 		-DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_SHARED_LINKER_FLAGS}	
+ 		-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ExpatEx/install
++        -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
++        -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
++        -DCMAKE_SYSTEM_NAME:STRING=${CMAKE_SYSTEM_NAME}
++        -DCMAKE_SYSTEM_VERSION:STRING=${CMAKE_SYSTEM_VERSION}
+ )
+ 
+ ExternalProject_Add(
diff --git a/utils/ci/conan/recipe/fmilibrary/all/patches/fmi-library-2.0.3-fixes.patch b/utils/ci/conan/recipes/fmilibrary/all/patches/fmi-library-2.0.3-fixes.patch
similarity index 100%
rename from utils/ci/conan/recipe/fmilibrary/all/patches/fmi-library-2.0.3-fixes.patch
rename to utils/ci/conan/recipes/fmilibrary/all/patches/fmi-library-2.0.3-fixes.patch
diff --git a/utils/ci/conan/recipes/fmilibrary/all/patches/fmi-library-2.0.3.patch b/utils/ci/conan/recipes/fmilibrary/all/patches/fmi-library-2.0.3.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b2d9a79d3b803c5e516317b70d762b38a9ef13c2
--- /dev/null
+++ b/utils/ci/conan/recipes/fmilibrary/all/patches/fmi-library-2.0.3.patch
@@ -0,0 +1,66 @@
+diff --git a/src/Import/src/FMI1/fmi1_import_capi.c b/src/Import/src/FMI1/fmi1_import_capi.c
+index 842c998..f762d77 100644
+--- a/src/Import/src/FMI1/fmi1_import_capi.c
++++ b/src/Import/src/FMI1/fmi1_import_capi.c
+@@ -67,18 +67,8 @@ jm_status_enu_t fmi1_import_create_dllfmu(fmi1_import_t* fmu, fmi1_callback_func
+ 		return jm_status_error;
+ 	}
+ 
+-	if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) {
+-		jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath);
+-		if(ENOENT == errno)
+-			jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform.");
+-		else
+-			jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno));
+-	}
+-	else {
+ 		/* Allocate memory for the C-API struct */
+ 		fmu -> capi = fmi1_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, standard);
+-	}
+-
+ 
+ 	/* Load the DLL handle */
+ 	if (fmu -> capi) {
+diff --git a/src/Import/src/FMI2/fmi2_import_capi.c b/src/Import/src/FMI2/fmi2_import_capi.c
+index e794775..5af253f 100644
+--- a/src/Import/src/FMI2/fmi2_import_capi.c
++++ b/src/Import/src/FMI2/fmi2_import_capi.c
+@@ -88,18 +88,8 @@ jm_status_enu_t fmi2_import_create_dllfmu(fmi2_import_t* fmu, fmi2_fmu_kind_enu_
+ 		callBackFunctions = &defaultCallbacks;
+ 	}
+ 
+-	if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) {
+-		jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath);
+-		if(ENOENT == errno)
+-			jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform.");
+-		else
+-			jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno));
+-	}
+-	else {
+ 		/* Allocate memory for the C-API struct */
+ 		fmu -> capi = fmi2_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, fmuKind);
+-	}
+-
+ 
+ 	/* Load the DLL handle */
+ 	if (fmu -> capi) {
+diff --git a/src/Util/include/JM/jm_portability.h b/src/Util/include/JM/jm_portability.h
+index 82e472a..605dff9 100644
+--- a/src/Util/include/JM/jm_portability.h
++++ b/src/Util/include/JM/jm_portability.h
+@@ -65,6 +65,7 @@ jm_status_enu_t jm_portability_get_current_working_directory(char* buffer, size_
+ jm_status_enu_t jm_portability_set_current_working_directory(const char* cwd);
+ 
+ /** \brief Get system-wide temporary directory */
++FMILIB_EXPORT
+ const char* jm_get_system_temp_dir();
+ 
+ /**
+@@ -118,6 +119,7 @@ jm_status_enu_t jm_mkdir(jm_callbacks* cb, const char* dir);
+ /**
+ \brief Remove directory and all it contents.
+ */
++FMILIB_EXPORT
+ jm_status_enu_t jm_rmdir(jm_callbacks* cb, const char* dir);
+ 
+ /**
diff --git a/utils/ci/conan/recipe/fmilibrary/config.yml b/utils/ci/conan/recipes/fmilibrary/config.yml
similarity index 95%
rename from utils/ci/conan/recipe/fmilibrary/config.yml
rename to utils/ci/conan/recipes/fmilibrary/config.yml
index 003907cf669a570fc9702059ddb158e80da0bd09..924270c2385e9c0986b857bb7bec20ce0e9517d9 100644
--- a/utils/ci/conan/recipe/fmilibrary/config.yml
+++ b/utils/ci/conan/recipes/fmilibrary/config.yml
@@ -15,3 +15,5 @@
 versions:
   "2.0.3":
     folder: "all"
+  "commitid":
+    folder: "all"
diff --git a/utils/ci/conan/recipes/fmt/all/conandata.yml b/utils/ci/conan/recipes/fmt/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5ec660a369fa83565b91c53c3620fb130f5bee8d
--- /dev/null
+++ b/utils/ci/conan/recipes/fmt/all/conandata.yml
@@ -0,0 +1,49 @@
+sources:
+  "11.0.2":
+    url: "https://github.com/fmtlib/fmt/releases/download/11.0.2/fmt-11.0.2.zip"
+    sha256: "40fc58bebcf38c759e11a7bd8fdc163507d2423ef5058bba7f26280c5b9c5465"
+  "11.0.1":
+    url: "https://github.com/fmtlib/fmt/releases/download/11.0.1/fmt-11.0.1.zip"
+    sha256: "62ca45531814109b5d6cef0cf2fd17db92c32a30dd23012976e768c685534814"
+  "11.0.0":
+    url: "https://github.com/fmtlib/fmt/releases/download/11.0.0/fmt-11.0.0.zip"
+    sha256: "583ce480ef07fad76ef86e1e2a639fc231c3daa86c4aa6bcba524ce908f30699"
+  "10.2.1":
+    url: "https://github.com/fmtlib/fmt/releases/download/10.2.1/fmt-10.2.1.zip"
+    sha256: "312151a2d13c8327f5c9c586ac6cf7cddc1658e8f53edae0ec56509c8fa516c9"
+  "10.2.0":
+    url: "https://github.com/fmtlib/fmt/releases/download/10.2.0/fmt-10.2.0.zip"
+    sha256: "8a942861a94f8461a280f823041cde8f620a6d8b0e0aacc98c15bb5a9dd92399"
+  "10.1.1":
+    url: "https://github.com/fmtlib/fmt/releases/download/10.1.1/fmt-10.1.1.zip"
+    sha256: "b84e58a310c9b50196cda48d5678d5fa0849bca19e5fdba6b684f0ee93ed9d1b"
+  "10.1.0":
+    url: "https://github.com/fmtlib/fmt/releases/download/10.1.0/fmt-10.1.0.zip"
+    sha256: "d725fa83a8b57a3cedf238828fa6b167f963041e8f9f7327649bddc68ae316f4"
+  "10.0.0":
+    url: "https://github.com/fmtlib/fmt/releases/download/10.0.0/fmt-10.0.0.zip"
+    sha256: "4943cb165f3f587f26da834d3056ee8733c397e024145ca7d2a8a96bb71ac281"
+  "9.1.0":
+    url: "https://github.com/fmtlib/fmt/releases/download/9.1.0/fmt-9.1.0.zip"
+    sha256: "cceb4cb9366e18a5742128cb3524ce5f50e88b476f1e54737a47ffdf4df4c996"
+  "9.0.0":
+    url: "https://github.com/fmtlib/fmt/releases/download/9.0.0/fmt-9.0.0.zip"
+    sha256: "fc96dd2d2fdf2bded630787adba892c23cb9e35c6fd3273c136b0c57d4651ad6"
+  "8.1.1":
+    url: "https://github.com/fmtlib/fmt/releases/download/8.1.1/fmt-8.1.1.zip"
+    sha256: "23778bad8edba12d76e4075da06db591f3b0e3c6c04928ced4a7282ca3400e5d"
+  "8.0.1":
+    url: "https://github.com/fmtlib/fmt/releases/download/8.0.1/fmt-8.0.1.zip"
+    sha256: "a627a56eab9554fc1e5dd9a623d0768583b3a383ff70a4312ba68f94c9d415bf"
+  "7.1.3":
+    url: "https://github.com/fmtlib/fmt/releases/download/7.1.3/fmt-7.1.3.zip"
+    sha256: "5d98c504d0205f912e22449ecdea776b78ce0bb096927334f80781e720084c9f"
+  "6.2.1":
+    url: "https://github.com/fmtlib/fmt/releases/download/6.2.1/fmt-6.2.1.zip"
+    sha256: "94fea742ddcccab6607b517f6e608b1e5d63d712ddbc5982e44bafec5279881a"
+  "5.3.0":
+    url: "https://github.com/fmtlib/fmt/releases/download/5.3.0/fmt-5.3.0.zip"
+    sha256: "4c0741e10183f75d7d6f730b8708a99b329b2f942dad5a9da3385ab92bb4a15c"
+patches:
+  "5.3.0":
+    - patch_file: "patches/fix-install-5.3.0.patch"
diff --git a/utils/ci/conan/recipes/fmt/all/conanfile.py b/utils/ci/conan/recipes/fmt/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..86da321d038627d3124c5ffb4c6c2f134dfd42f2
--- /dev/null
+++ b/utils/ci/conan/recipes/fmt/all/conanfile.py
@@ -0,0 +1,155 @@
+import os
+
+from conan import ConanFile
+from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
+from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rmdir
+from conan.tools.layout import basic_layout
+from conan.tools.build import check_min_cppstd
+from conan.tools.scm import Version
+from conan.tools.microsoft import is_msvc
+
+required_conan_version = ">=1.53.0"
+
+
+class FmtConan(ConanFile):
+    name = "fmt"
+    description = "A safe and fast alternative to printf and IOStreams."
+    license = "MIT"
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://github.com/fmtlib/fmt"
+    topics = ("format", "iostream", "printf")
+    package_type = "library"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "header_only": [True, False],
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "with_fmt_alias": [True, False],
+        "with_os_api": [True, False],
+        "with_unicode": [True, False],
+    }
+    default_options = {
+        "header_only": False,
+        "shared": False,
+        "fPIC": True,
+        "with_fmt_alias": False,
+        "with_os_api": True,
+        "with_unicode": True,
+    }
+
+    @property
+    def _has_with_os_api_option(self):
+        return Version(self.version) >= "7.0.0"
+
+    @property
+    def _has_with_unicode_option(self):
+        return Version(self.version) >= "11.0.0"
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+        if not self._has_with_os_api_option:
+            del self.options.with_os_api
+        elif str(self.settings.os) == "baremetal":
+            self.options.with_os_api = False
+        if not self._has_with_unicode_option:
+            del self.options.with_unicode
+
+    def configure(self):
+        if self.options.header_only:
+            self.options.rm_safe("fPIC")
+            self.options.rm_safe("shared")
+            self.options.rm_safe("with_os_api")
+        elif self.options.shared:
+            self.options.rm_safe("fPIC")
+
+    def layout(self):
+        if self.options.header_only:
+            basic_layout(self, src_folder="src")
+        else:
+            cmake_layout(self, src_folder="src")
+
+    def package_id(self):
+        if self.info.options.header_only:
+            self.info.clear()
+        else:
+            del self.info.options.with_fmt_alias
+
+    def validate(self):
+        if self.settings.get_safe("compiler.cppstd"):
+            check_min_cppstd(self, 11)
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    def generate(self):
+        if not self.options.header_only:
+            tc = CMakeToolchain(self)
+            tc.cache_variables["FMT_DOC"] = False
+            tc.cache_variables["FMT_TEST"] = False
+            tc.cache_variables["FMT_INSTALL"] = True
+            tc.cache_variables["FMT_LIB_DIR"] = "lib"
+            if self._has_with_os_api_option:
+                tc.cache_variables["FMT_OS"] = bool(self.options.with_os_api)
+            if self._has_with_unicode_option:
+                tc.cache_variables["FMT_UNICODE"] = bool(self.options.with_unicode)
+            tc.generate()
+
+    def build(self):
+        apply_conandata_patches(self)
+        if not self.options.header_only:
+            cmake = CMake(self)
+            cmake.configure()
+            cmake.build()
+
+    def package(self):
+        if Version(self.version) < "10.2.0":
+            copy(self, pattern="*LICENSE.rst", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
+        else:
+            copy(self, pattern="LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
+        if self.options.header_only:
+            copy(self, pattern="*.h", src=os.path.join(self.source_folder, "include"), dst=os.path.join(self.package_folder, "include"))
+        else:
+            cmake = CMake(self)
+            cmake.install()
+            rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
+            rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
+            rmdir(self, os.path.join(self.package_folder, "res"))
+            rmdir(self, os.path.join(self.package_folder, "share"))
+
+    def package_info(self):
+        target = "fmt-header-only" if self.options.header_only else "fmt"
+        self.cpp_info.set_property("cmake_file_name", "fmt")
+        self.cpp_info.set_property("cmake_target_name", f"fmt::{target}")
+        self.cpp_info.set_property("pkg_config_name",  "fmt")
+
+        if self.options.get_safe("with_unicode") and is_msvc(self):
+            self.cpp_info.components["_fmt"].cxxflags.append("/utf-8")
+
+        # TODO: back to global scope in conan v2 once cmake_find_package* generators removed
+        if self.options.with_fmt_alias:
+            self.cpp_info.components["_fmt"].defines.append("FMT_STRING_ALIAS=1")
+
+        if self.options.header_only:
+            self.cpp_info.components["_fmt"].defines.append("FMT_HEADER_ONLY=1")
+            self.cpp_info.components["_fmt"].libdirs = []
+            self.cpp_info.components["_fmt"].bindirs = []
+        else:
+            postfix = "d" if self.settings.build_type == "Debug" else ""
+            libname = "fmt" + postfix
+            self.cpp_info.components["_fmt"].libs = [libname]
+            if self.settings.os == "Linux":
+                self.cpp_info.components["_fmt"].system_libs.extend(["m"])
+            if self.options.shared:
+                self.cpp_info.components["_fmt"].defines.append("FMT_SHARED")
+
+        # TODO: to remove in conan v2 once cmake_find_package* generators removed
+        self.cpp_info.names["cmake_find_package"] = "fmt"
+        self.cpp_info.names["cmake_find_package_multi"] = "fmt"
+        self.cpp_info.names["pkg_config"] = "fmt"
+        self.cpp_info.components["_fmt"].names["cmake_find_package"] = target
+        self.cpp_info.components["_fmt"].names["cmake_find_package_multi"] = target
+        self.cpp_info.components["_fmt"].set_property("cmake_target_name", f"fmt::{target}")
diff --git a/utils/ci/conan/recipes/fmt/all/patches/fix-install-5.3.0.patch b/utils/ci/conan/recipes/fmt/all/patches/fix-install-5.3.0.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b478cc0710e3b53dd163247d7dfb809c8b12d811
--- /dev/null
+++ b/utils/ci/conan/recipes/fmt/all/patches/fix-install-5.3.0.patch
@@ -0,0 +1,13 @@
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -235,7 +235,9 @@ if (FMT_INSTALL)
+ 
+   # Install the library and headers.
+   install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name}
+-          DESTINATION ${FMT_LIB_DIR})
++          LIBRARY DESTINATION ${FMT_LIB_DIR}
++          ARCHIVE DESTINATION ${FMT_LIB_DIR}
++          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+ 
+   install(FILES $<TARGET_PDB_FILE:${INSTALL_TARGETS}> DESTINATION ${FMT_LIB_DIR} OPTIONAL)
+   install(FILES ${FMT_HEADERS} DESTINATION ${FMT_INC_DIR})
diff --git a/utils/ci/conan/recipes/fmt/config.yml b/utils/ci/conan/recipes/fmt/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..22c106719d701b79aa898ef06b58576471f2ddf2
--- /dev/null
+++ b/utils/ci/conan/recipes/fmt/config.yml
@@ -0,0 +1,31 @@
+versions:
+  "11.0.2":
+    folder: all
+  "11.0.1":
+    folder: all
+  "11.0.0":
+    folder: all
+  "10.2.1":
+    folder: all
+  "10.2.0":
+    folder: all
+  "10.1.1":
+    folder: all
+  "10.1.0":
+    folder: all
+  "10.0.0":
+    folder: all
+  "9.1.0":
+    folder: all
+  "9.0.0":
+    folder: all
+  "8.1.1":
+    folder: all
+  "8.0.1":
+    folder: all
+  "7.1.3":
+    folder: all
+  "6.2.1":
+    folder: all
+  "5.3.0":
+    folder: all
diff --git a/utils/ci/conan/recipes/gtest/all/conandata.yml b/utils/ci/conan/recipes/gtest/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b22247dc8573db1c85267dd38cd8851a56565bd5
--- /dev/null
+++ b/utils/ci/conan/recipes/gtest/all/conandata.yml
@@ -0,0 +1,29 @@
+sources:
+  "1.14.0":
+    url: "https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz"
+    sha256: "8ad598c73ad796e0d8280b082cebd82a630d73e73cd3c70057938a6501bba5d7"
+  "1.13.0":
+    url: "https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz"
+    sha256: "ad7fdba11ea011c1d925b3289cf4af2c66a352e18d4c7264392fead75e919363"
+  "1.12.1":
+    url: "https://github.com/google/googletest/archive/release-1.12.1.tar.gz"
+    sha256: "81964fe578e9bd7c94dfdb09c8e4d6e6759e19967e397dbea48d1c10e45d0df2"
+  "1.10.0":
+    url: "https://github.com/google/googletest/archive/release-1.10.0.tar.gz"
+    sha256: "9dc9157a9a1551ec7a7e43daea9a694a0bb5fb8bec81235d8a1e6ef64c716dcb"
+  "1.8.1":
+    url: "https://github.com/google/googletest/archive/release-1.8.1.tar.gz"
+    sha256: "9bf1fe5182a604b4135edc1a425ae356c9ad15e9b23f9f12a02e80184c3a249c"
+patches:
+  "1.10.0":
+    - patch_file: "patches/gtest-1.10.0.patch"
+      patch_description: "add CUSTOM_DEBUG_POSTFIX option"
+      patch_type: "conan"
+    - patch_file: "patches/gtest-1.10.0-override.patch"
+      patch_description: "prevent compiler from complaining while compiling"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/google/googletest/pull/2507"
+  "1.8.1":
+    - patch_file: "patches/gtest-1.8.1.patch"
+      patch_description: "add CUSTOM_DEBUG_POSTFIX option"
+      patch_type: "conan"
diff --git a/utils/ci/conan/recipes/gtest/all/conanfile.py b/utils/ci/conan/recipes/gtest/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..556a1401b077b515a12d551d3eea4f1e32d7bace
--- /dev/null
+++ b/utils/ci/conan/recipes/gtest/all/conanfile.py
@@ -0,0 +1,193 @@
+from conan import ConanFile
+from conan.errors import ConanInvalidConfiguration
+from conan.tools.build import check_min_cppstd
+from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
+from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, replace_in_file, rm, rmdir
+from conan.tools.microsoft import is_msvc_static_runtime, msvc_runtime_flag
+from conan.tools.scm import Version
+import os
+
+required_conan_version = ">=1.54.0"
+
+
+class GTestConan(ConanFile):
+    name = "gtest"
+    description = "Google's C++ test framework"
+    license = "BSD-3-Clause"
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://github.com/google/googletest"
+    topics = ("testing", "google-testing", "unit-test")
+    package_type = "library"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "build_gmock": [True, False],
+        "no_main": [True, False],
+        "hide_symbols": [True, False],
+        "debug_postfix": ["ANY"],
+        "disable_pthreads": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+        "build_gmock": True,
+        "no_main": False,
+        "hide_symbols": False,
+        "debug_postfix": "d",
+        "disable_pthreads": False,
+    }
+
+    @property
+    def _min_cppstd(self):
+        return "11" if Version(self.version) < "1.13.0" else "14"
+
+    @property
+    def _minimum_compilers_version(self):
+        return {
+            "11": {
+                "Visual Studio": "14",
+                "msvc": "190",
+                "gcc": "4.8.1" if Version(self.version) < "1.11.0" else "5",
+                "clang": "3.3" if Version(self.version) < "1.11.0" else "5",
+                "apple-clang": "5.0" if Version(self.version) < "1.11.0" else "9.1",
+            },
+            # Sinse 1.13.0, gtest requires C++14 and Google's Foundational C++ Support Policy
+            # https://github.com/google/oss-policies-info/blob/603a042ce2ee8f165fac46721a651d796ce59cb6/foundational-cxx-support-matrix.md
+            "14": {
+                "Visual Studio": "15",
+                "msvc": "191",
+                "gcc": "7.3.1",
+                "clang": "6",
+                "apple-clang": "12",
+            },
+        }.get(self._min_cppstd, {})
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+        if Version(self.version) >= "1.12.0" or self.settings.build_type != "Debug":
+            del self.options.debug_postfix
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+
+    def layout(self):
+        cmake_layout(self, src_folder="src")
+
+    def package_id(self):
+        del self.info.options.no_main # Only used to expose more targets
+
+    def validate(self):
+        if self.options.shared and is_msvc_static_runtime(self):
+            raise ConanInvalidConfiguration("gtest shared is not compatible with static vc runtime")
+
+        if self.settings.get_safe("compiler.cppstd"):
+            check_min_cppstd(self, self._min_cppstd)
+
+        def loose_lt_semver(v1, v2):
+            lv1 = [int(v) for v in v1.split(".")]
+            lv2 = [int(v) for v in v2.split(".")]
+            min_length = min(len(lv1), len(lv2))
+            return lv1[:min_length] < lv2[:min_length]
+
+        compiler = self.settings.compiler
+        min_version = self._minimum_compilers_version.get(str(compiler))
+        if min_version and loose_lt_semver(str(compiler.version), min_version):
+            raise ConanInvalidConfiguration(
+                f"{self.ref} requires C++{self._min_cppstd}, which your compiler does not support."
+            )
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.variables["BUILD_GMOCK"] = bool(self.options.build_gmock)
+        tc.variables["gtest_hide_internal_symbols"] = bool(self.options.hide_symbols)
+
+        if self.settings.build_type == "Debug" and Version(self.version) < "1.12.0":
+            tc.cache_variables["CUSTOM_DEBUG_POSTFIX"] = str(self.options.debug_postfix)
+
+        if self.settings.compiler.get_safe("runtime"):
+            tc.variables["gtest_force_shared_crt"] = "MD" in msvc_runtime_flag(self)
+        tc.variables["gtest_disable_pthreads"] = self.options.disable_pthreads
+        if Version(self.version) < "1.12.0":
+            # Relocatable shared lib on Macos
+            tc.cache_variables["CMAKE_POLICY_DEFAULT_CMP0042"] = "NEW"
+        tc.generate()
+
+    def _patch_sources(self):
+        apply_conandata_patches(self)
+        # No warnings as errors
+        internal_utils = os.path.join(self.source_folder, "googletest", "cmake", "internal_utils.cmake")
+        replace_in_file(self, internal_utils, "-WX", "")
+        if Version(self.version) < "1.12.0":
+            replace_in_file(self, internal_utils, "-Werror", "")
+
+    def build(self):
+        self._patch_sources()
+        cmake = CMake(self)
+        cmake.configure()
+        cmake.build()
+
+    def package(self):
+        copy(self, "LICENSE", self.source_folder, os.path.join(self.package_folder, "licenses"))
+        cmake = CMake(self)
+        cmake.install()
+        rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
+        rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
+        rm(self, "*.pdb", os.path.join(self.package_folder, "lib"))
+
+    @property
+    def _postfix(self):
+        return self.options.get_safe("debug_postfix", "")
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "both")
+        self.cpp_info.set_property("cmake_file_name", "GTest")
+
+        # gtest
+        self.cpp_info.components["libgtest"].set_property("cmake_target_name", "GTest::gtest")
+        self.cpp_info.components["libgtest"].set_property("cmake_target_aliases", ["GTest::GTest"])
+        self.cpp_info.components["libgtest"].set_property("pkg_config_name", "gtest")
+        self.cpp_info.components["libgtest"].libs = [f"gtest{self._postfix}"]
+        if self.settings.os in ["Linux", "FreeBSD"]:
+            self.cpp_info.components["libgtest"].system_libs.append("m")
+            self.cpp_info.components["libgtest"].system_libs.append("pthread")
+        if self.settings.os == "Neutrino" and self.settings.os.version == "7.1":
+            self.cpp_info.components["libgtest"].system_libs.append("regex")
+        if self.options.shared:
+            self.cpp_info.components["libgtest"].defines.append("GTEST_LINKED_AS_SHARED_LIBRARY=1")
+
+        # gtest_main
+        if not self.options.no_main:
+            self.cpp_info.components["gtest_main"].set_property("cmake_target_name", "GTest::gtest_main")
+            self.cpp_info.components["gtest_main"].set_property("cmake_target_aliases", ["GTest::Main"])
+            self.cpp_info.components["gtest_main"].set_property("pkg_config_name", "gtest_main")
+            self.cpp_info.components["gtest_main"].libs = [f"gtest_main{self._postfix}"]
+            self.cpp_info.components["gtest_main"].requires = ["libgtest"]
+
+        # gmock
+        if self.options.build_gmock:
+            self.cpp_info.components["gmock"].set_property("cmake_target_name", "GTest::gmock")
+            self.cpp_info.components["gmock"].set_property("pkg_config_name", "gmock")
+            self.cpp_info.components["gmock"].libs = [f"gmock{self._postfix}"]
+            self.cpp_info.components["gmock"].requires = ["libgtest"]
+
+            # gmock_main
+            if not self.options.no_main:
+                self.cpp_info.components["gmock_main"].set_property("cmake_target_name", "GTest::gmock_main")
+                self.cpp_info.components["gmock_main"].set_property("pkg_config_name", "gmock_main")
+                self.cpp_info.components["gmock_main"].libs = [f"gmock_main{self._postfix}"]
+                self.cpp_info.components["gmock_main"].requires = ["gmock"]
+
+        # TODO: to remove in conan v2 once cmake_find_package_* generators removed
+        self.cpp_info.names["cmake_find_package"] = "GTest"
+        self.cpp_info.names["cmake_find_package_multi"] = "GTest"
+        self.cpp_info.components["libgtest"].names["cmake_find_package"] = "gtest"
+        self.cpp_info.components["libgtest"].names["cmake_find_package_multi"] = "gtest"
diff --git a/utils/ci/conan/recipes/gtest/all/patches/gtest-1.10.0-override.patch b/utils/ci/conan/recipes/gtest/all/patches/gtest-1.10.0-override.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1757bf310744599d794b4cfc821ba639179007bb
--- /dev/null
+++ b/utils/ci/conan/recipes/gtest/all/patches/gtest-1.10.0-override.patch
@@ -0,0 +1,450 @@
+From 3cddd56e195b516f449bea6dcd3edd4494195631 Mon Sep 17 00:00:00 2001
+From: Robert Luberda <robert@debian.org>
+Date: Wed, 9 Oct 2019 21:48:00 +0200
+Subject: [PATCH] Add more override keywords
+
+Mark more functions with "override" keyword, just like
+it was done in commit 2460f97152c.
+
+This should prevent compiler from complaining while compiling both
+user code, and the googletest code itself with the -Wsuggest-override
+option turned on; with the exception of:
+ * calls to new MOCK_METHOD() in test/gmock-function-mocker_test.cc
+ * calls to old MOCK_METHODx()/MOCK_CONST_METHODx() in other
+   unit test files.
+
+Closes #2493
+---
+ .../include/gmock/gmock-generated-actions.h   | 24 ++---
+ .../gmock/gmock-generated-actions.h.pump      |  4 +-
+ .../include/gmock/gmock-generated-matchers.h  | 88 +++++++++----------
+ .../gmock/gmock-generated-matchers.h.pump     |  8 +-
+ googletest/include/gtest/gtest-typed-test.h   |  4 +-
+ .../include/gtest/internal/gtest-port.h       |  4 +-
+ googletest/test/gtest_unittest.cc             |  4 +-
+ 7 files changed, 68 insertions(+), 68 deletions(-)
+
+diff --git a/googlemock/include/gmock/gmock-generated-actions.h b/googlemock/include/gmock/gmock-generated-actions.h
+index 981af78ff..cee96dae8 100644
+--- a/googlemock/include/gmock/gmock-generated-actions.h
++++ b/googlemock/include/gmock/gmock-generated-actions.h
+@@ -663,7 +663,7 @@ class ActionHelper {
+       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
+           args_type;\
+       explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -726,7 +726,7 @@ class ActionHelper {
+       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
+           args_type;\
+       gmock_Impl() {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -776,7 +776,7 @@ class ActionHelper {
+           args_type;\
+       explicit gmock_Impl(p0##_type gmock_p0) : \
+           p0(::std::forward<p0##_type>(gmock_p0)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -832,7 +832,7 @@ class ActionHelper {
+       gmock_Impl(p0##_type gmock_p0, \
+           p1##_type gmock_p1) : p0(::std::forward<p0##_type>(gmock_p0)), \
+           p1(::std::forward<p1##_type>(gmock_p1)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -893,7 +893,7 @@ class ActionHelper {
+           p2##_type gmock_p2) : p0(::std::forward<p0##_type>(gmock_p0)), \
+           p1(::std::forward<p1##_type>(gmock_p1)), \
+           p2(::std::forward<p2##_type>(gmock_p2)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -961,7 +961,7 @@ class ActionHelper {
+           p1(::std::forward<p1##_type>(gmock_p1)), \
+           p2(::std::forward<p2##_type>(gmock_p2)), \
+           p3(::std::forward<p3##_type>(gmock_p3)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -1038,7 +1038,7 @@ class ActionHelper {
+           p2(::std::forward<p2##_type>(gmock_p2)), \
+           p3(::std::forward<p3##_type>(gmock_p3)), \
+           p4(::std::forward<p4##_type>(gmock_p4)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -1119,7 +1119,7 @@ class ActionHelper {
+           p3(::std::forward<p3##_type>(gmock_p3)), \
+           p4(::std::forward<p4##_type>(gmock_p4)), \
+           p5(::std::forward<p5##_type>(gmock_p5)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -1206,7 +1206,7 @@ class ActionHelper {
+           p4(::std::forward<p4##_type>(gmock_p4)), \
+           p5(::std::forward<p5##_type>(gmock_p5)), \
+           p6(::std::forward<p6##_type>(gmock_p6)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -1302,7 +1302,7 @@ class ActionHelper {
+           p5(::std::forward<p5##_type>(gmock_p5)), \
+           p6(::std::forward<p6##_type>(gmock_p6)), \
+           p7(::std::forward<p7##_type>(gmock_p7)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -1404,7 +1404,7 @@ class ActionHelper {
+           p6(::std::forward<p6##_type>(gmock_p6)), \
+           p7(::std::forward<p7##_type>(gmock_p7)), \
+           p8(::std::forward<p8##_type>(gmock_p8)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -1513,7 +1513,7 @@ class ActionHelper {
+           p7(::std::forward<p7##_type>(gmock_p7)), \
+           p8(::std::forward<p8##_type>(gmock_p8)), \
+           p9(::std::forward<p9##_type>(gmock_p9)) {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+diff --git a/googlemock/include/gmock/gmock-generated-actions.h.pump b/googlemock/include/gmock/gmock-generated-actions.h.pump
+index 209603c5a..283abcdc2 100644
+--- a/googlemock/include/gmock/gmock-generated-actions.h.pump
++++ b/googlemock/include/gmock/gmock-generated-actions.h.pump
+@@ -395,7 +395,7 @@ $range k 0..n-1
+       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
+           args_type;\
+       explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+@@ -482,7 +482,7 @@ $var macro_name = [[$if i==0 [[ACTION]] $elif i==1 [[ACTION_P]]
+       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
+           args_type;\
+       [[$if i==1 [[explicit ]]]]gmock_Impl($ctor_param_list)$inits {}\
+-      virtual return_type Perform(const args_type& args) {\
++      return_type Perform(const args_type& args) override {\
+         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
+             Perform(this, args);\
+       }\
+diff --git a/googlemock/include/gmock/gmock-generated-matchers.h b/googlemock/include/gmock/gmock-generated-matchers.h
+index 690a57f1c..61892380c 100644
+--- a/googlemock/include/gmock/gmock-generated-matchers.h
++++ b/googlemock/include/gmock/gmock-generated-matchers.h
+@@ -269,13 +269,13 @@
+      public:\
+       gmock_Impl()\
+            {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+      private:\
+@@ -318,13 +318,13 @@
+      public:\
+       explicit gmock_Impl(p0##_type gmock_p0)\
+            : p0(::std::move(gmock_p0)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -371,13 +371,13 @@
+      public:\
+       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\
+            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -431,13 +431,13 @@
+       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\
+            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
+                p2(::std::move(gmock_p2)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -495,13 +495,13 @@
+           p3##_type gmock_p3)\
+            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
+                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -568,13 +568,13 @@
+            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
+                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
+                p4(::std::move(gmock_p4)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -644,13 +644,13 @@
+            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
+                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
+                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -726,13 +726,13 @@
+                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
+                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \
+                p6(::std::move(gmock_p6)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -814,13 +814,13 @@
+                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
+                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \
+                p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -909,13 +909,13 @@
+                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \
+                p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \
+                p8(::std::move(gmock_p8)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+@@ -1009,13 +1009,13 @@
+                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \
+                p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \
+                p8(::std::move(gmock_p8)), p9(::std::move(gmock_p9)) {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\
+       p0##_type const p0;\
+diff --git a/googlemock/include/gmock/gmock-generated-matchers.h.pump b/googlemock/include/gmock/gmock-generated-matchers.h.pump
+index ae90917cc..69d2ae418 100644
+--- a/googlemock/include/gmock/gmock-generated-matchers.h.pump
++++ b/googlemock/include/gmock/gmock-generated-matchers.h.pump
+@@ -302,13 +302,13 @@ $var param_field_decls2 = [[$for j
+      public:\
+       [[$if i==1 [[explicit ]]]]gmock_Impl($impl_ctor_param_list)\
+           $impl_inits {}\
+-      virtual bool MatchAndExplain(\
++      bool MatchAndExplain(\
+           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
+-          ::testing::MatchResultListener* result_listener) const;\
+-      virtual void DescribeTo(::std::ostream* gmock_os) const {\
++          ::testing::MatchResultListener* result_listener) const override;\
++      void DescribeTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(false);\
+       }\
+-      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
++      void DescribeNegationTo(::std::ostream* gmock_os) const override {\
+         *gmock_os << FormatDescription(true);\
+       }\$param_field_decls
+      private:\
+diff --git a/googletest/include/gtest/gtest-typed-test.h b/googletest/include/gtest/gtest-typed-test.h
+index 095ce0580..6b7c9c8a0 100644
+--- a/googletest/include/gtest/gtest-typed-test.h
++++ b/googletest/include/gtest/gtest-typed-test.h
+@@ -201,7 +201,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
+    private:                                                                   \
+     typedef CaseName<gtest_TypeParam_> TestFixture;                           \
+     typedef gtest_TypeParam_ TypeParam;                                       \
+-    virtual void TestBody();                                                  \
++    void TestBody() override;                                                 \
+   };                                                                          \
+   static bool gtest_##CaseName##_##TestName##_registered_                     \
+         GTEST_ATTRIBUTE_UNUSED_ =                                             \
+@@ -276,7 +276,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
+      private:                                                         \
+       typedef SuiteName<gtest_TypeParam_> TestFixture;                \
+       typedef gtest_TypeParam_ TypeParam;                             \
+-      virtual void TestBody();                                        \
++      void TestBody() override;                                       \
+     };                                                                \
+     static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+         GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName(       \
+diff --git a/googletest/include/gtest/internal/gtest-port.h b/googletest/include/gtest/internal/gtest-port.h
+index f6433c58a..2b4770ff5 100644
+--- a/googletest/include/gtest/internal/gtest-port.h
++++ b/googletest/include/gtest/internal/gtest-port.h
+@@ -1599,7 +1599,7 @@ class ThreadLocal : public ThreadLocalBase {
+   class DefaultValueHolderFactory : public ValueHolderFactory {
+    public:
+     DefaultValueHolderFactory() {}
+-    virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }
++    ValueHolder* MakeNewHolder() const override { return new ValueHolder(); }
+ 
+    private:
+     GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
+@@ -1608,7 +1608,7 @@ class ThreadLocal : public ThreadLocalBase {
+   class InstanceValueHolderFactory : public ValueHolderFactory {
+    public:
+     explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
+-    virtual ValueHolder* MakeNewHolder() const {
++    ValueHolder* MakeNewHolder() const override {
+       return new ValueHolder(value_);
+     }
+ 
+diff --git a/googletest/test/gtest_unittest.cc b/googletest/test/gtest_unittest.cc
+index 8312bd10e..d17a15540 100644
+--- a/googletest/test/gtest_unittest.cc
++++ b/googletest/test/gtest_unittest.cc
+@@ -6170,7 +6170,7 @@ TEST_F(ParseFlagsTest, WideStrings) {
+ #if GTEST_USE_OWN_FLAGFILE_FLAG_
+ class FlagfileTest : public ParseFlagsTest {
+  public:
+-  virtual void SetUp() {
++  void SetUp() override {
+     ParseFlagsTest::SetUp();
+ 
+     testdata_path_.Set(internal::FilePath(
+@@ -6180,7 +6180,7 @@ class FlagfileTest : public ParseFlagsTest {
+     EXPECT_TRUE(testdata_path_.CreateFolder());
+   }
+ 
+-  virtual void TearDown() {
++  void TearDown() override {
+     testing::internal::posix::RmDir(testdata_path_.c_str());
+     ParseFlagsTest::TearDown();
+   }
diff --git a/utils/ci/conan/recipes/gtest/all/patches/gtest-1.10.0.patch b/utils/ci/conan/recipes/gtest/all/patches/gtest-1.10.0.patch
new file mode 100644
index 0000000000000000000000000000000000000000..92d37990ee2c69a1539a2a28b227a1eb25f08d8d
--- /dev/null
+++ b/utils/ci/conan/recipes/gtest/all/patches/gtest-1.10.0.patch
@@ -0,0 +1,13 @@
+diff --git a/googletest/cmake/internal_utils.cmake b/googletest/cmake/internal_utils.cmake
+index 2f70f0b0..8cd03693 100644
+--- a/googletest/cmake/internal_utils.cmake
++++ b/googletest/cmake/internal_utils.cmake
+@@ -154,7 +154,7 @@ function(cxx_library_with_type name type cxx_flags)
+   # Generate debug library name with a postfix.
+   set_target_properties(${name}
+     PROPERTIES
+-    DEBUG_POSTFIX "d")
++    DEBUG_POSTFIX "${CUSTOM_DEBUG_POSTFIX}")
+   # Set the output directory for build artifacts
+   set_target_properties(${name}
+     PROPERTIES
diff --git a/utils/ci/conan/recipes/gtest/all/patches/gtest-1.8.1.patch b/utils/ci/conan/recipes/gtest/all/patches/gtest-1.8.1.patch
new file mode 100755
index 0000000000000000000000000000000000000000..838ab42c89f02fded991dd5e62993e0e3dca1931
--- /dev/null
+++ b/utils/ci/conan/recipes/gtest/all/patches/gtest-1.8.1.patch
@@ -0,0 +1,13 @@
+diff --git a/googletest/cmake/internal_utils.cmake b/googletest/cmake/internal_utils.cmake
+index 8c1f9ba..2203d3c 100644
+--- a/googletest/cmake/internal_utils.cmake
++++ b/googletest/cmake/internal_utils.cmake
+@@ -166,7 +166,7 @@ function(cxx_library_with_type name type cxx_flags)
+   # Generate debug library name with a postfix.
+   set_target_properties(${name}
+     PROPERTIES
+-    DEBUG_POSTFIX "d")
++    DEBUG_POSTFIX "${CUSTOM_DEBUG_POSTFIX}")
+   if (BUILD_SHARED_LIBS OR type STREQUAL "SHARED")
+     set_target_properties(${name}
+       PROPERTIES
diff --git a/utils/ci/conan/recipes/gtest/config.yml b/utils/ci/conan/recipes/gtest/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fa66f2eb7d4d7861515a7f51f8c60383a15a245a
--- /dev/null
+++ b/utils/ci/conan/recipes/gtest/config.yml
@@ -0,0 +1,11 @@
+versions:
+  "1.14.0":
+    folder: all
+  "1.13.0":
+    folder: all
+  "1.12.1":
+    folder: all
+  "1.10.0":
+    folder: all
+  "1.8.1":
+    folder: all
diff --git a/utils/ci/conan/recipes/libbacktrace/all/conandata.yml b/utils/ci/conan/recipes/libbacktrace/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..56d79ce7402eb4cbdd2cf087dba29d7fdad8fee1
--- /dev/null
+++ b/utils/ci/conan/recipes/libbacktrace/all/conandata.yml
@@ -0,0 +1,8 @@
+sources:
+  "cci.20210118":
+    url: "https://github.com/ianlancetaylor/libbacktrace/archive/dedbe13fda00253fe5d4f2fb812c909729ed5937.tar.gz"
+    sha256: "dc8c167f48f3de5ae318c528b26b72f300edb6e33744e55394674fd4b7cdd21d"
+patches:
+  "cci.20210118":
+    - patch_file: "patches/0001-pointer-arithmetic.patch"
+    - patch_file: "patches/0002-msvc-unistd-alternative.patch"
diff --git a/utils/ci/conan/recipes/libbacktrace/all/conanfile.py b/utils/ci/conan/recipes/libbacktrace/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..2fa71b8e362281dca67f4df2202ba4d9b63a6a06
--- /dev/null
+++ b/utils/ci/conan/recipes/libbacktrace/all/conanfile.py
@@ -0,0 +1,108 @@
+from conan import ConanFile
+from conan.errors import ConanInvalidConfiguration
+from conan.tools.apple import fix_apple_shared_install_name
+from conan.tools.env import VirtualBuildEnv
+from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rename, rm
+from conan.tools.gnu import Autotools, AutotoolsToolchain
+from conan.tools.layout import basic_layout
+from conan.tools.microsoft import check_min_vs, is_msvc, unix_path
+import os
+
+required_conan_version = ">=1.54.0"
+
+
+class LibbacktraceConan(ConanFile):
+    name = "libbacktrace"
+    description = "A C library that may be linked into a C/C++ program to produce symbolic backtraces."
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://github.com/ianlancetaylor/libbacktrace"
+    license = "BSD-3-Clause"
+    topics = ("backtrace", "stack-trace")
+    package_type = "library"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+    }
+
+    @property
+    def _settings_build(self):
+        return getattr(self, "settings_build", self.settings)
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        self.settings.rm_safe("compiler.libcxx")
+        self.settings.rm_safe("compiler.cppstd")
+
+    def layout(self):
+        basic_layout(self, src_folder="src")
+
+    def validate(self):
+        check_min_vs(self, "180")
+        if is_msvc(self) and self.options.shared:
+            raise ConanInvalidConfiguration("libbacktrace shared is not supported with Visual Studio")
+
+    def build_requirements(self):
+        if self._settings_build.os == "Windows":
+            self.win_bash = True
+            if not self.conf.get("tools.microsoft.bash:path", check_type=str):
+                self.tool_requires("msys2/cci.latest")
+        if is_msvc(self):
+            self.tool_requires("automake/1.16.5")
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    def generate(self):
+        env = VirtualBuildEnv(self)
+        env.generate()
+
+        tc = AutotoolsToolchain(self)
+        if is_msvc(self):
+            # https://github.com/conan-io/conan/issues/6514
+            tc.extra_cflags.append("-FS")
+        env = tc.environment()
+        if is_msvc(self):
+            compile_wrapper = unix_path(self, self.conf.get("user.automake:compile-wrapper"))
+            ar_wrapper = unix_path(self, self.conf.get("user.automake:lib-wrapper"))
+            env.define("CC", f"{compile_wrapper} cl -nologo")
+            env.define("CXX", f"{compile_wrapper} cl -nologo")
+            env.define("LD", "link -nologo")
+            env.define("AR", f"{ar_wrapper} \"lib -nologo\"")
+            env.define("NM", "dumpbin -symbols")
+            env.define("OBJDUMP", ":")
+            env.define("RANLIB", ":")
+            env.define("STRIP", ":")
+        tc.generate(env)
+
+    def build(self):
+        apply_conandata_patches(self)
+        autotools = Autotools(self)
+        autotools.configure()
+        autotools.make()
+
+    def package(self):
+        copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
+        autotools = Autotools(self)
+        autotools.install()
+        lib_folder = os.path.join(self.package_folder, "lib")
+        rm(self, "*.la", lib_folder)
+        fix_apple_shared_install_name(self)
+        if is_msvc(self):
+            rename(self, os.path.join(lib_folder, "libbacktrace.lib"),
+                         os.path.join(lib_folder, "backtrace.lib"))
+
+    def package_info(self):
+        self.cpp_info.libs = ["backtrace"]
diff --git a/utils/ci/conan/recipes/libbacktrace/all/patches/0001-pointer-arithmetic.patch b/utils/ci/conan/recipes/libbacktrace/all/patches/0001-pointer-arithmetic.patch
new file mode 100644
index 0000000000000000000000000000000000000000..062c4cdb4f0898d38311bf7fc49ee353a160f99e
--- /dev/null
+++ b/utils/ci/conan/recipes/libbacktrace/all/patches/0001-pointer-arithmetic.patch
@@ -0,0 +1,29 @@
+--- a/pecoff.c
++++ b/pecoff.c
+@@ -648,7 +648,7 @@ coff_add (struct backtrace_state *state, int descriptor,
+       magic_ok = memcmp (magic, "PE\0", 4) == 0;
+       fhdr_off += 4;
+ 
+-      memcpy (&fhdr, fhdr_view.data + 4, sizeof fhdr);
++      memcpy (&fhdr, (char *)fhdr_view.data + 4, sizeof fhdr);
+     }
+   else
+     {
+@@ -682,7 +682,7 @@ coff_add (struct backtrace_state *state, int descriptor,
+   sects_view_valid = 1;
+   opt_hdr = (const b_coff_optional_header *) sects_view.data;
+   sects = (const b_coff_section_header *)
+-    (sects_view.data + fhdr.size_of_optional_header);
++    ((b_coff_optional_header *)sects_view.data + fhdr.size_of_optional_header);
+ 
+   is_64 = 0;
+   if (fhdr.size_of_optional_header > sizeof (*opt_hdr))
+@@ -726,7 +726,7 @@ coff_add (struct backtrace_state *state, int descriptor,
+ 	goto fail;
+       syms_view_valid = 1;
+ 
+-      str_size = coff_read4 (syms_view.data + syms_size);
++      str_size = coff_read4 ((const unsigned char *)((char *)syms_view.data + syms_size));
+ 
+       str_off = syms_off + syms_size;
+ 
diff --git a/utils/ci/conan/recipes/libbacktrace/all/patches/0002-msvc-unistd-alternative.patch b/utils/ci/conan/recipes/libbacktrace/all/patches/0002-msvc-unistd-alternative.patch
new file mode 100644
index 0000000000000000000000000000000000000000..988e538fc511de926e345fd867e5b5ce169f1bec
--- /dev/null
+++ b/utils/ci/conan/recipes/libbacktrace/all/patches/0002-msvc-unistd-alternative.patch
@@ -0,0 +1,54 @@
+--- a/allocfail.c
++++ b/allocfail.c
+@@ -33,7 +33,6 @@ POSSIBILITY OF SUCH DAMAGE.  */
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+-#include <unistd.h>
+ 
+ #include "filenames.h"
+ 
+--- a/fileline.c
++++ b/fileline.c
+@@ -37,7 +37,11 @@ POSSIBILITY OF SUCH DAMAGE.  */
+ #include <errno.h>
+ #include <fcntl.h>
+ #include <stdlib.h>
++#ifdef _MSC_VER
++#include <process.h>
++#else
+ #include <unistd.h>
++#endif
+ 
+ #if defined (HAVE_KERN_PROC_ARGS) || defined (HAVE_KERN_PROC)
+ #include <sys/sysctl.h>
+--- a/posix.c
++++ b/posix.c
+@@ -36,7 +36,11 @@ POSSIBILITY OF SUCH DAMAGE.  */
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
++#ifdef _MSC_VER
++#include <io.h>
++#else
+ #include <unistd.h>
++#endif
+ 
+ #include "backtrace.h"
+ #include "internal.h"
+--- a/read.c
++++ b/read.c
+@@ -35,7 +35,13 @@ POSSIBILITY OF SUCH DAMAGE.  */
+ #include <errno.h>
+ #include <stdlib.h>
+ #include <sys/types.h>
++#ifdef _MSC_VER
++#include <io.h>
++#include <basetsd.h>
++typedef SSIZE_T ssize_t;
++#else
+ #include <unistd.h>
++#endif
+ 
+ #include "backtrace.h"
+ #include "internal.h"
diff --git a/utils/ci/conan/recipes/libbacktrace/config.yml b/utils/ci/conan/recipes/libbacktrace/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bc0e7ddecd921c62d923c0fa6edadbc40fb61f22
--- /dev/null
+++ b/utils/ci/conan/recipes/libbacktrace/config.yml
@@ -0,0 +1,3 @@
+versions:
+  "cci.20210118":
+    folder: all
diff --git a/utils/ci/conan/recipe/libiconv/all/conandata.yml b/utils/ci/conan/recipes/libiconv/all/conandata.yml
similarity index 100%
rename from utils/ci/conan/recipe/libiconv/all/conandata.yml
rename to utils/ci/conan/recipes/libiconv/all/conandata.yml
diff --git a/utils/ci/conan/recipe/libiconv/all/conanfile.py b/utils/ci/conan/recipes/libiconv/all/conanfile.py
similarity index 99%
rename from utils/ci/conan/recipe/libiconv/all/conanfile.py
rename to utils/ci/conan/recipes/libiconv/all/conanfile.py
index 1c44ed6e67c0264b65826479341c1b04caedda8e..cd4c436d2f8c40c2b2a895bcdce531c38b3499d6 100644
--- a/utils/ci/conan/recipe/libiconv/all/conanfile.py
+++ b/utils/ci/conan/recipes/libiconv/all/conanfile.py
@@ -139,7 +139,7 @@ class LibiconvConan(ConanFile):
             self.output.info("Applying {} resource patch: {}".format(self.settings.arch, windres_options_path))
             replace_in_file(self, windres_options_path, '#   PACKAGE_VERSION_SUBMINOR', '#   PACKAGE_VERSION_SUBMINOR\necho "--target=pe-i386"', strict=True)
 
-    def build(self): 
+    def build(self):
         apply_conandata_patches(self)
         self._apply_resource_patch()
         autotools = Autotools(self)
diff --git a/utils/ci/conan/recipe/libiconv/all/patches/0001-libcharset-fix-linkage.patch b/utils/ci/conan/recipes/libiconv/all/patches/0001-libcharset-fix-linkage.patch
similarity index 100%
rename from utils/ci/conan/recipe/libiconv/all/patches/0001-libcharset-fix-linkage.patch
rename to utils/ci/conan/recipes/libiconv/all/patches/0001-libcharset-fix-linkage.patch
diff --git a/utils/ci/conan/recipe/libiconv/config.yml b/utils/ci/conan/recipes/libiconv/config.yml
similarity index 100%
rename from utils/ci/conan/recipe/libiconv/config.yml
rename to utils/ci/conan/recipes/libiconv/config.yml
diff --git a/utils/ci/conan/recipe/libxml2/all/conandata.yml b/utils/ci/conan/recipes/libxml2/all/conandata.yml
similarity index 62%
rename from utils/ci/conan/recipe/libxml2/all/conandata.yml
rename to utils/ci/conan/recipes/libxml2/all/conandata.yml
index 6b264c344e091e9210cadc243f39d1912bb86b01..e2e741589891979d7180119f8296c295fe646a15 100644
--- a/utils/ci/conan/recipe/libxml2/all/conandata.yml
+++ b/utils/ci/conan/recipes/libxml2/all/conandata.yml
@@ -1,22 +1,4 @@
 sources:
-  "2.12.5":
-    url: "https://download.gnome.org/sources/libxml2/2.12/libxml2-2.12.5.tar.xz"
-    sha256: "a972796696afd38073e0f59c283c3a2f5a560b5268b4babc391b286166526b21"
-  "2.12.4":
-    url: "https://download.gnome.org/sources/libxml2/2.12/libxml2-2.12.4.tar.xz"
-    sha256: "497360e423cf0bd99eacdb7c6215dea92e6d6e89ee940393c2bae0e77cb9b7d0"
-  "2.12.3":
-    url: "https://download.gnome.org/sources/libxml2/2.12/libxml2-2.12.3.tar.xz"
-    sha256: "8c8f1092340a89ff32bc44ad5c9693aff9bc8a7a3e161bb239666e5d15ac9aaa"
-  "2.11.8":
-    url: "https://download.gnome.org/sources/libxml2/2.11/libxml2-2.11.8.tar.xz"
-    sha256: "53961af1721b72246180cd844b7ddae36ea8e1e4e27b683567990a1ee78b02c1"
-  "2.11.7":
-    url: "https://download.gnome.org/sources/libxml2/2.11/libxml2-2.11.7.tar.xz"
-    sha256: "fb27720e25eaf457f94fd3d7189bcf2626c6dccf4201553bc8874d50e3560162"
-  "2.11.6":
-    url: "https://download.gnome.org/sources/libxml2/2.11/libxml2-2.11.6.tar.xz"
-    sha256: "c90eee7506764abbe07bb616b82da452529609815aefef423d66ef080eb0c300"
   "2.11.5":
     url: "https://download.gnome.org/sources/libxml2/2.11/libxml2-2.11.5.tar.xz"
     sha256: "3727b078c360ec69fa869de14bd6f75d7ee8d36987b071e6928d4720a28df3a6"
diff --git a/utils/ci/conan/recipe/libxml2/all/conanfile.py b/utils/ci/conan/recipes/libxml2/all/conanfile.py
similarity index 99%
rename from utils/ci/conan/recipe/libxml2/all/conanfile.py
rename to utils/ci/conan/recipes/libxml2/all/conanfile.py
index 7b8117fecb427a7465f04f461548b5627b0d1b47..2433d25f0f098907662777e7a7fce8eecbeba781 100644
--- a/utils/ci/conan/recipe/libxml2/all/conanfile.py
+++ b/utils/ci/conan/recipes/libxml2/all/conanfile.py
@@ -95,11 +95,11 @@ class Libxml2Conan(ConanFile):
 
     def requirements(self):
         if self.options.zlib:
-            self.requires("zlib/[>=1.2.11 <2]")
+            self.requires(f"zlib/[>=1.2.11 <2]")
         if self.options.lzma:
             self.requires("xz_utils/5.4.4")
         if self.options.iconv:
-            self.requires("libiconv/1.17", transitive_headers=True, transitive_libs=True)
+            self.requires(f"libiconv/1.17", transitive_headers=True, transitive_libs=True)
         if self.options.icu:
             self.requires("icu/73.2")
 
diff --git a/utils/ci/conan/recipe/libxml2/config.yml b/utils/ci/conan/recipes/libxml2/config.yml
similarity index 100%
rename from utils/ci/conan/recipe/libxml2/config.yml
rename to utils/ci/conan/recipes/libxml2/config.yml
diff --git a/utils/ci/conan/recipe/mantleapi/all/conandata.yml b/utils/ci/conan/recipes/mantleapi/all/conandata.yml
similarity index 65%
rename from utils/ci/conan/recipe/mantleapi/all/conandata.yml
rename to utils/ci/conan/recipes/mantleapi/all/conandata.yml
index c87db1f2bd637388622b27da45a721e1b0bffa75..554255b0b2b1b41fe62fb535b975bac9d9c2939a 100644
--- a/utils/ci/conan/recipe/mantleapi/all/conandata.yml
+++ b/utils/ci/conan/recipes/mantleapi/all/conandata.yml
@@ -1,5 +1,5 @@
 ################################################################################
-# Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# Copyright (c) 2023-2024 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
@@ -17,9 +17,21 @@ sources:
     url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git
     sha256: "9a038989604e8da62ecddbe2094b16ce1b778be1"
 
+  "v3.0.1":
+    url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git
+    sha256: "6de56d10004458be6e67ff72010c2690c42171d5"
+
   "v4.0.0":
     url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git
     sha256: "10df3786abc8d4774f3c3d9bbfdfbb6f8c885112"
 
-  "default":
-    url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git
\ No newline at end of file
+  "v5.0.0":
+    url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git
+    sha256: "f2447b55108e1ee53f659e626942bfa7518d3319"
+
+  "v5.1.0":
+    url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git
+    sha256: "34851cb3686ec65aa4a9107bf91773a5653ce20b"
+
+  "commitid":
+    url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git
diff --git a/utils/ci/conan/recipe/mantleapi/all/conanfile.py b/utils/ci/conan/recipes/mantleapi/all/conanfile.py
similarity index 67%
rename from utils/ci/conan/recipe/mantleapi/all/conanfile.py
rename to utils/ci/conan/recipes/mantleapi/all/conanfile.py
index 8d7eef3053f0962a7fb66f3b21f729d37ddcbb8b..103b57b6cb87b0987bae2df1d682d016da85b4dc 100644
--- a/utils/ci/conan/recipe/mantleapi/all/conanfile.py
+++ b/utils/ci/conan/recipes/mantleapi/all/conanfile.py
@@ -14,7 +14,7 @@
 
 from conan import ConanFile
 from conan.tools.cmake import CMake, CMakeToolchain
-from conan.tools.files import rm, copy
+from conan.tools.files import rm, copy, rmdir
 from conan.tools.scm import Git
 import os
 
@@ -25,15 +25,23 @@ class MantleAPIConan(ConanFile):
     settings = "os", "compiler", "build_type", "arch"
     options = {"shared": [True, False],
                "fPIC": [True, False],
-               "MantleAPI_TEST":[True, False]}
+               "MantleAPI_TEST":[True, False],
+               "commit_id_value":[None, "ANY"]}
 
     default_options = {"shared": False,
                        "fPIC": True,
-                       "MantleAPI_TEST":False}
+                       "MantleAPI_TEST":False,
+                       "commit_id_value": None}
 
-    exports_sources = "*"
     no_copy_source = False
     short_paths = True
+    commit = None
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        if self.options.commit_id_value:
+            self.commit = self.options.commit_id_value
 
     def generate(self):
         tc = CMakeToolchain(self)
@@ -41,21 +49,20 @@ class MantleAPIConan(ConanFile):
         tc.generate()
 
     def _get_url_sha(self):
-        if self.version in self.conan_data["sources"]:
+        if self.version != "commitid" :
             url = self.conan_data["sources"][self.version]["url"]
-            sha256 = self.conan_data["sources"][self.version]["sha256"]
+            self.commit = self.conan_data["sources"][self.version]["sha256"]
         else:
-            url = self.conan_data["sources"]["default"]["url"]
-            sha256 = self.version
+            url = self.conan_data["sources"]["commitid"]["url"]
 
-        return url, sha256
+        return url
 
     def source(self):
-        url, sha256 = self._get_url_sha()
+        url = self._get_url_sha()
         git = Git(self)
         git.clone(url=url, target=self.name)
         git.folder=self.name
-        git.checkout(commit=sha256)
+        git.checkout(commit=self.commit)
 
     def build(self):
         cmake = CMake(self)
@@ -67,4 +74,9 @@ class MantleAPIConan(ConanFile):
         cmake.install()
         copy(self, pattern="*", src=os.path.join(self.name, "test/MantleAPI"), dst=os.path.join(self.package_folder, "test/MantleAPI"))
         rm(self, "conanbuildinfo.txt", self.package_folder)
+        rm(self, "units.h", os.path.join(self.package_folder, "include"))
+        rmdir(self, os.path.join(self.package_folder, "share"))
         rm(self, "conandata.yml", self.package_folder)
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "none")
diff --git a/utils/ci/conan/recipe/mantleapi/config.yml b/utils/ci/conan/recipes/mantleapi/config.yml
similarity index 85%
rename from utils/ci/conan/recipe/mantleapi/config.yml
rename to utils/ci/conan/recipes/mantleapi/config.yml
index 8a31abed5c9eb7fa2601d00388c6f8d78c085b98..2971d4f4ac6bc6743fe697c86333e0a5ee96a5e6 100644
--- a/utils/ci/conan/recipe/mantleapi/config.yml
+++ b/utils/ci/conan/recipes/mantleapi/config.yml
@@ -15,3 +15,11 @@
 versions:
   "0.1":
     folder: "all"
+  "v4.0.0":
+    folder: "all"
+  "v5.0.0":
+    folder: "all"
+  "v5.1.0":
+    folder: "all"
+  "commitid":
+    folder: "all"
diff --git a/utils/ci/conan/recipes/minizip/all/CMakeLists.txt b/utils/ci/conan/recipes/minizip/all/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c17b5f7dd7466a21a758976b236fada2a1977e93
--- /dev/null
+++ b/utils/ci/conan/recipes/minizip/all/CMakeLists.txt
@@ -0,0 +1,75 @@
+cmake_minimum_required(VERSION 3.4)
+project(minizip LANGUAGES C)
+
+option(MINIZIP_ENABLE_BZIP2 "Build minizip with bzip2 support" ON)
+option(MINIZIP_BUILD_TOOLS "Build minizip tool" OFF)
+
+include(GNUInstallDirs)
+
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
+
+find_package(ZLIB REQUIRED)
+if(MINIZIP_ENABLE_BZIP2)
+    find_package(BZip2 REQUIRED)
+endif()
+
+set(SOURCE_FILES
+    ${MINIZIP_SRC_DIR}/ioapi.c
+    ${MINIZIP_SRC_DIR}/unzip.c
+    ${MINIZIP_SRC_DIR}/zip.c
+    ${MINIZIP_SRC_DIR}/mztools.c
+)
+if(WIN32)
+    list(APPEND SOURCE_FILES ${MINIZIP_SRC_DIR}/iowin32.c)
+endif()
+
+set(HEADER_FILES
+    ${MINIZIP_SRC_DIR}/ioapi.h
+    ${MINIZIP_SRC_DIR}/unzip.h
+    ${MINIZIP_SRC_DIR}/zip.h
+    ${MINIZIP_SRC_DIR}/mztools.h
+)
+if(WIN32)
+    list(APPEND HEADER_FILES ${MINIZIP_SRC_DIR}/iowin32.h)
+endif()
+
+add_library(minizip ${SOURCE_FILES})
+target_link_libraries(minizip PUBLIC ZLIB::ZLIB)
+target_compile_definitions(minizip PRIVATE -D_ZLIB_H)
+target_include_directories(minizip PUBLIC ${MINIZIP_SRC_DIR})
+set_target_properties(minizip PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
+
+if(MINIZIP_ENABLE_BZIP2)
+    target_compile_definitions(minizip PUBLIC HAVE_BZIP2=1)
+    target_link_libraries(minizip PUBLIC BZip2::BZip2)
+endif()
+if(MSVC)
+    target_compile_options(minizip PRIVATE /wd4005 /wd4996 /wd4018 -D_CRT_SECURE_NO_WARNINGS)
+endif()
+
+install(
+    TARGETS minizip
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+)
+
+install(FILES ${HEADER_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/minizip)
+
+if(MINIZIP_BUILD_TOOLS)
+    add_executable(minizip_bin ${MINIZIP_SRC_DIR}/minizip.c)
+    add_executable(miniunz_bin ${MINIZIP_SRC_DIR}/miniunz.c)
+
+    target_link_libraries(minizip_bin PRIVATE minizip)
+    target_link_libraries(miniunz_bin PRIVATE minizip)
+
+    set_target_properties(minizip_bin PROPERTIES OUTPUT_NAME minizip)
+    set_target_properties(miniunz_bin PROPERTIES OUTPUT_NAME miniunz)
+
+    if(MSVC)
+        target_compile_options(minizip_bin PRIVATE /wd4005 /wd4996 /wd4018 -D_CRT_SECURE_NO_WARNINGS)
+        target_compile_options(miniunz_bin PRIVATE /wd4005 /wd4996 /wd4018 -D_CRT_SECURE_NO_WARNINGS)
+    endif()
+
+    install(TARGETS minizip_bin miniunz_bin DESTINATION ${CMAKE_INSTALL_BINDIR})
+endif()
diff --git a/utils/ci/conan/recipes/minizip/all/conandata.yml b/utils/ci/conan/recipes/minizip/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f8773fd58975f0d6f43228daeaca51ae8208c328
--- /dev/null
+++ b/utils/ci/conan/recipes/minizip/all/conandata.yml
@@ -0,0 +1,24 @@
+sources:
+  "1.3.1":
+    url: "https://zlib.net/fossils/zlib-1.3.1.tar.gz"
+    sha256: "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23"
+  "1.2.13":
+    url: "https://zlib.net/fossils/zlib-1.2.13.tar.gz"
+    sha256: "b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30"
+  "1.2.12":
+    url: "https://zlib.net/fossils/zlib-1.2.12.tar.gz"
+    sha256: "91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9"
+  "1.2.11":
+    url: "https://zlib.net/fossils/zlib-1.2.11.tar.gz"
+    sha256: "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1"
+patches:
+  "1.3.1":
+    - patch_file: "patches/minizip.patch"
+  "1.2.13":
+    - patch_file: "patches/minizip.patch"
+  "1.2.12":
+    - patch_file: "patches/minizip.patch"
+    - patch_file: "patches/ioapi.patch"
+  "1.2.11":
+    - patch_file: "patches/minizip.patch"
+    - patch_file: "patches/miniunz.patch"
diff --git a/utils/ci/conan/recipes/minizip/all/conanfile.py b/utils/ci/conan/recipes/minizip/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..cbc7529132a6637b3c974522778ea14fab398326
--- /dev/null
+++ b/utils/ci/conan/recipes/minizip/all/conanfile.py
@@ -0,0 +1,90 @@
+from conan import ConanFile
+from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
+from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, load, save
+import os
+
+required_conan_version = ">=1.53.0"
+
+
+class MinizipConan(ConanFile):
+    name = "minizip"
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://zlib.net"
+    license = "Zlib"
+    description = "An experimental package to read and write files in .zip format, written on top of zlib"
+    topics = ("zip", "compression", "inflate")
+    package_type = "library"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "bzip2": [True, False],
+        "tools": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+        "bzip2": True,
+        "tools": False,
+    }
+
+    def export_sources(self):
+        copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder)
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        self.settings.rm_safe("compiler.cppstd")
+        self.settings.rm_safe("compiler.libcxx")
+
+    def layout(self):
+        cmake_layout(self, src_folder="src")
+
+    def requirements(self):
+        self.requires(f"zlib/[>=1.2.11 <2]", transitive_headers=True)
+        if self.options.bzip2:
+            self.requires(f"bzip2/1.0.8", transitive_headers=True)
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.variables["MINIZIP_SRC_DIR"] = os.path.join(self.source_folder, "contrib", "minizip").replace("\\", "/")
+        tc.variables["MINIZIP_ENABLE_BZIP2"] = self.options.bzip2
+        tc.variables["MINIZIP_BUILD_TOOLS"] = self.options.tools
+        # fopen64 and similar are unavailable before API level 24: https://github.com/madler/zlib/pull/436
+        if self.settings.os == "Android" and int(str(self.settings.os.api_level)) < 24:
+            tc.preprocessor_definitions["IOAPI_NO_64"] = "1"
+        tc.generate()
+        deps = CMakeDeps(self)
+        deps.generate()
+
+    def build(self):
+        apply_conandata_patches(self)
+        cmake = CMake(self)
+        cmake.configure(build_script_folder=os.path.join(self.source_folder, os.pardir))
+        cmake.build()
+
+    def _extract_license(self):
+        zlib_h = load(self, os.path.join(self.source_folder, "zlib.h"))
+        return zlib_h[2:zlib_h.find("*/", 1)]
+
+    def package(self):
+        save(self, os.path.join(self.package_folder, "licenses", "LICENSE"), self._extract_license())
+        cmake = CMake(self)
+        cmake.install()
+
+    def package_info(self):
+        self.cpp_info.libs = ["minizip"]
+        self.cpp_info.includedirs.append(os.path.join("include", "minizip"))
+        if self.options.bzip2:
+            self.cpp_info.defines.append("HAVE_BZIP2")
+
+        if self.options.tools:
+            self.env_info.PATH.append(os.path.join(self.package_folder, "bin"))
diff --git a/utils/ci/conan/recipes/minizip/all/patches/ioapi.patch b/utils/ci/conan/recipes/minizip/all/patches/ioapi.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8ab56b08bf0aaadb5cc46bdf842e2bbd60725f89
--- /dev/null
+++ b/utils/ci/conan/recipes/minizip/all/patches/ioapi.patch
@@ -0,0 +1,102 @@
+--- a/contrib/minizip/ioapi.c
++++ b/contrib/minizip/ioapi.c
+@@ -94,9 +94,9 @@ static int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
+ 
+ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
+ {
+-    (void)opaque;
+     FILE* file = NULL;
+     const char* mode_fopen = NULL;
++    (void)opaque;
+     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+         mode_fopen = "rb";
+     else
+@@ -113,9 +113,9 @@ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, in
+ 
+ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
+ {
+-    (void)opaque;
+     FILE* file = NULL;
+     const char* mode_fopen = NULL;
++    (void)opaque;
+     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+         mode_fopen = "rb";
+     else
+@@ -133,24 +133,24 @@ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename,
+ 
+ static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
+ {
+-    (void)opaque;
+     uLong ret;
++    (void)opaque;
+     ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
+     return ret;
+ }
+ 
+ static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
+ {
+-    (void)opaque;
+     uLong ret;
++    (void)opaque;
+     ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
+     return ret;
+ }
+ 
+ static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
+ {
+-    (void)opaque;
+     long ret;
++    (void)opaque;
+     ret = ftell((FILE *)stream);
+     return ret;
+ }
+@@ -158,17 +158,17 @@ static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
+ 
+ static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
+ {
+-    (void)opaque;
+     ZPOS64_T ret;
++    (void)opaque;
+     ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream);
+     return ret;
+ }
+ 
+ static long ZCALLBACK fseek_file_func (voidpf  opaque, voidpf stream, uLong offset, int origin)
+ {
+-    (void)opaque;
+     int fseek_origin=0;
+     long ret;
++    (void)opaque;
+     switch (origin)
+     {
+     case ZLIB_FILEFUNC_SEEK_CUR :
+@@ -190,9 +190,9 @@ static long ZCALLBACK fseek_file_func (voidpf  opaque, voidpf stream, uLong offs
+ 
+ static long ZCALLBACK fseek64_file_func (voidpf  opaque, voidpf stream, ZPOS64_T offset, int origin)
+ {
+-    (void)opaque;
+     int fseek_origin=0;
+     long ret;
++    (void)opaque;
+     switch (origin)
+     {
+     case ZLIB_FILEFUNC_SEEK_CUR :
+@@ -217,16 +217,16 @@ static long ZCALLBACK fseek64_file_func (voidpf  opaque, voidpf stream, ZPOS64_T
+ 
+ static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
+ {
+-    (void)opaque;
+     int ret;
++    (void)opaque;
+     ret = fclose((FILE *)stream);
+     return ret;
+ }
+ 
+ static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
+ {
+-    (void)opaque;
+     int ret;
++    (void)opaque;
+     ret = ferror((FILE *)stream);
+     return ret;
+ }
diff --git a/utils/ci/conan/recipes/minizip/all/patches/miniunz.patch b/utils/ci/conan/recipes/minizip/all/patches/miniunz.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a9b42551ba7c796b3babcf57b352fd0ad51ce092
--- /dev/null
+++ b/utils/ci/conan/recipes/minizip/all/patches/miniunz.patch
@@ -0,0 +1,11 @@
+--- a/contrib/minizip/miniunz.c
++++ b/contrib/minizip/miniunz.c
+@@ -52,6 +52,8 @@
+ #else
+ # include <unistd.h>
+ # include <utime.h>
++#include <sys/stat.h>
++#include <sys/types.h>
+ #endif
+ 
+ 
diff --git a/utils/ci/conan/recipes/minizip/all/patches/minizip.patch b/utils/ci/conan/recipes/minizip/all/patches/minizip.patch
new file mode 100644
index 0000000000000000000000000000000000000000..51ec03ade115b2fe35a9bc24c3540dae668a5852
--- /dev/null
+++ b/utils/ci/conan/recipes/minizip/all/patches/minizip.patch
@@ -0,0 +1,16 @@
+diff --git a/contrib/minizip/unzip.c b/contrib/minizip/unzip.c
+index f12e3329..bfc05f77 100644
+--- a/contrib/minizip/unzip.c
++++ b/contrib/minizip/unzip.c
+@@ -68,10 +68,6 @@
+ #include <stdlib.h>
+ #include <string.h>
+ 
+-#ifndef NOUNCRYPT
+-        #define NOUNCRYPT
+-#endif
+-
+ #include "zlib.h"
+ #include "unzip.h"
+ 
+
diff --git a/utils/ci/conan/recipes/minizip/config.yml b/utils/ci/conan/recipes/minizip/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bd5341271951db1aa739dc1c69b7830938f502df
--- /dev/null
+++ b/utils/ci/conan/recipes/minizip/config.yml
@@ -0,0 +1,9 @@
+versions:
+  "1.3.1":
+    folder: all
+  "1.2.13":
+    folder: all
+  "1.2.12":
+    folder: all
+  "1.2.11":
+    folder: all
diff --git a/utils/ci/conan/recipes/nlohmann_json/all/conandata.yml b/utils/ci/conan/recipes/nlohmann_json/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..246346e50d25c8ea2e8fd4cf2d205490aceb974c
--- /dev/null
+++ b/utils/ci/conan/recipes/nlohmann_json/all/conandata.yml
@@ -0,0 +1,18 @@
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# conan data file for building nlohmann_json with Conan
+################################################################################
+
+sources:
+  "v3.11.3":
+    url: https://github.com/nlohmann/json/archive/refs/tags/v3.11.3.tar.gz
+    sha256: "0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406"
diff --git a/utils/ci/conan/recipes/nlohmann_json/all/conanfile.py b/utils/ci/conan/recipes/nlohmann_json/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..2a50d1348b4231e643550a5b2a6faef2ba0bb170
--- /dev/null
+++ b/utils/ci/conan/recipes/nlohmann_json/all/conanfile.py
@@ -0,0 +1,60 @@
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# Install file for building nlohmann_json with Conan
+################################################################################
+
+from conan import ConanFile
+from conan.tools.cmake import CMake, CMakeToolchain
+from conan.tools.files import rm, copy, rmdir
+from conan.tools.files import get, copy
+import os
+
+required_conan_version = ">=1.53"
+
+class NlohmannJSONConan(ConanFile):
+    name = "nlohmann_json"
+    settings = "os", "compiler", "build_type", "arch"
+    options = {"shared": [True, False],
+               "fPIC": [True, False]}
+
+    default_options = {"shared": False,
+                       "fPIC": True}
+
+    exports_sources = "*"
+    no_copy_source = False
+    short_paths = True
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.generate()
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    def build(self):
+        cmake = CMake(self)
+        cmake.configure()
+
+    def package(self):
+        cmake = CMake(self)
+        cmake.install()
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "none")
diff --git a/utils/ci/conan/recipes/nlohmann_json/config.yml b/utils/ci/conan/recipes/nlohmann_json/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7e10f079f806eb78c75263fe1ad33ae28bf25b9a
--- /dev/null
+++ b/utils/ci/conan/recipes/nlohmann_json/config.yml
@@ -0,0 +1,17 @@
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# config file for building nlohmann_json with Conan
+################################################################################
+
+versions:
+  "v3.11.3":
+    folder: "all"
diff --git a/utils/ci/conan/recipe/open-simulation-interface/all/conandata.yml b/utils/ci/conan/recipes/open-simulation-interface/all/conandata.yml
similarity index 83%
rename from utils/ci/conan/recipe/open-simulation-interface/all/conandata.yml
rename to utils/ci/conan/recipes/open-simulation-interface/all/conandata.yml
index 83c23370548e91780de6058a229a65c2aa0a8294..e9954e672b5d8ab53f15d5b6e969f3ad748e4046 100644
--- a/utils/ci/conan/recipe/open-simulation-interface/all/conandata.yml
+++ b/utils/ci/conan/recipes/open-simulation-interface/all/conandata.yml
@@ -19,4 +19,8 @@ sources:
 
   "3.6.0":
     url: https://github.com/OpenSimulationInterface/open-simulation-interface/archive/refs/tags/v3.6.0.tar.gz
-    sha256: "b391b3de8871c2e6ffbbf08d0744a8e3d829615b8f4b9163a7b51f1469c5a59a"
\ No newline at end of file
+    sha256: "b391b3de8871c2e6ffbbf08d0744a8e3d829615b8f4b9163a7b51f1469c5a59a"
+
+  "3.7.0":
+    url: https://github.com/OpenSimulationInterface/open-simulation-interface/archive/refs/tags/v3.7.0.tar.gz
+    sha256: "b88a826e6ecae9573f76ec3eecc883773dad4f4e4fce6eea6910ac1dcf2e0cd3"
diff --git a/utils/ci/conan/recipe/open-simulation-interface/all/conanfile.py b/utils/ci/conan/recipes/open-simulation-interface/all/conanfile.py
similarity index 72%
rename from utils/ci/conan/recipe/open-simulation-interface/all/conanfile.py
rename to utils/ci/conan/recipes/open-simulation-interface/all/conanfile.py
index 51009e7e43933724a86ba954cf71e5ebf0b78b83..847ed427cadeb5095584ce368434cdfc10aa57fd 100644
--- a/utils/ci/conan/recipe/open-simulation-interface/all/conanfile.py
+++ b/utils/ci/conan/recipes/open-simulation-interface/all/conanfile.py
@@ -14,8 +14,8 @@
 import os
 
 from conan import ConanFile
-from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps
-from conan.tools.files import get, copy
+from conan.tools.cmake import CMake, CMakeToolchain
+from conan.tools.files import get, copy, replace_in_file
 
 required_conan_version = ">=1.53.0"
 
@@ -28,27 +28,35 @@ class OpenSimulationInterfaceConan(ConanFile):
     options = {
         "shared": [True, False],
         "fPIC": [True, False],
+        "protobuf_version":["ANY"]
     }
     default_options = {
         "shared": False,
         "fPIC": True,
+        "protobuf_version":"3.20.0"
     }
     short_paths = True
     _repo_source = None
 
     def requirements(self):
-        self.requires("protobuf/3.20.0", transitive_headers=True, transitive_libs=True)
+        self.requires(f"protobuf/{self.options.protobuf_version}", transitive_headers=True, transitive_libs=True, options={"debug_suffix": False})
 
     def build_requirements(self):
-        self.tool_requires("protobuf/3.20.0")
+        self.tool_requires(f"protobuf/{self.options.protobuf_version}", options={"debug_suffix": False})
 
     def config_options(self):
         if self.settings.os == "Windows":
             del self.options.fPIC
 
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+
     def source(self):
         get(self, **self.conan_data["sources"][self.version], strip_root=True)
-        
+        if self.version in ["3.5.0", "3.6.0"]:
+            replace_in_file(self, os.path.join(self.source_folder, "CMakeLists.txt"), "osi_trafficcommand.proto", "osi_trafficcommand.proto\nosi_trafficcommandupdate.proto")
+
     def generate(self):
         tc = CMakeToolchain(self)
         tc.generate()
diff --git a/utils/ci/conan/recipe/open-simulation-interface/config.yml b/utils/ci/conan/recipes/open-simulation-interface/config.yml
similarity index 92%
rename from utils/ci/conan/recipe/open-simulation-interface/config.yml
rename to utils/ci/conan/recipes/open-simulation-interface/config.yml
index 97c70ac200101886f060728b547e292c8db16b86..2aa4b41adfd7811bf9f080d6238e8f0ae977a6ea 100644
--- a/utils/ci/conan/recipe/open-simulation-interface/config.yml
+++ b/utils/ci/conan/recipes/open-simulation-interface/config.yml
@@ -14,3 +14,7 @@
 versions:
   "3.5.0":
     folder: "all"
+  "3.6.0":
+    folder: "all"
+  "3.7.0":
+    folder: "all"
diff --git a/utils/ci/conan/recipe/openscenario_api/all/conandata.yml b/utils/ci/conan/recipes/openscenario_api/all/conandata.yml
similarity index 92%
rename from utils/ci/conan/recipe/openscenario_api/all/conandata.yml
rename to utils/ci/conan/recipes/openscenario_api/all/conandata.yml
index 004aca18fb76b98768b68184acd380b2547f8c52..d92efcbd58f3c183aef416d879efcb8e08ad92f1 100644
--- a/utils/ci/conan/recipe/openscenario_api/all/conandata.yml
+++ b/utils/ci/conan/recipes/openscenario_api/all/conandata.yml
@@ -16,7 +16,7 @@ sources:
   "v1.3.1":
     url: https://github.com/RA-Consulting-GmbH/openscenario.api.test.git
     sha256: "65f8dcadd44e16ac083fc5109f3f0f992d9e332f"
-  "default":
+  "commitid":
     url: https://github.com/RA-Consulting-GmbH/openscenario.api.test.git
 
 patches:
@@ -25,3 +25,5 @@ patches:
       base_path: "openscenario_api"
     - patch_file: "patches/0001-cross-compilation-compatible.patch"
       base_path: "openscenario_api"
+    - patch_file: "patches/rpath.patch"
+      base_path: "openscenario_api"
\ No newline at end of file
diff --git a/utils/ci/conan/recipes/openscenario_api/all/conanfile.py b/utils/ci/conan/recipes/openscenario_api/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..15a6f05bb73e64e56e5d7c4844862106512b87eb
--- /dev/null
+++ b/utils/ci/conan/recipes/openscenario_api/all/conanfile.py
@@ -0,0 +1,116 @@
+################################################################################
+# Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2024      Volkswagen 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
+################################################################################
+
+################################################################################
+# Install file for building open scenario api with Conan
+################################################################################
+import os
+
+from conan import ConanFile
+from conan.tools.files import copy, export_conandata_patches, apply_conandata_patches
+from conan.tools.scm import Git
+from conan.tools.cmake import CMake, CMakeToolchain
+
+required_conan_version = ">=1.53.0"
+
+class OpenScenarioApiConan(ConanFile):
+    name = "openscenario_api"
+    settings = "os", "compiler", "build_type", "arch"
+    options = {"shared": [True, False], "fPIC": [True, False],"commit_id_value":[None, "ANY"]}
+    default_options = {"shared": True, "fPIC": False,
+                       "commit_id_value": None}
+    short_paths = True
+    no_copy_source = True
+    library_type = None
+    commit = None
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+    def configure(self):
+        if self.options.shared:
+            self.library_type = "Shared"
+        else:
+            self.library_type = "Static"
+        if self.options.commit_id_value:
+            self.commit = self.options.commit_id_value
+
+    def _get_url_sha(self):
+        if self.version != "commitid" :
+            url = self.conan_data["sources"][self.version]["url"]
+            self.commit = self.conan_data["sources"][self.version]["sha256"]
+        else:
+            url = self.conan_data["sources"]["commitid"]["url"]
+        return url
+
+    def source(self):
+        url = self._get_url_sha()
+        git = Git(self)
+        git.clone(url=url, target=self.name)
+        git.folder=self.name
+        git.checkout(commit=self.commit)
+        apply_conandata_patches(self)
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.user_presets_path="CMakePresets.json"
+        tc.cache_variables["preset"] = "MSYS-shared-release"
+        tc.generate()
+
+    def build(self):
+        _repo_source = os.path.join(self.source_folder, self.name)
+        _artifact_path = os.path.join(_repo_source, "cpp", "buildArtifact")
+        if self.settings.os == "Windows":
+            # os.chdir(os.path.join(_repo_source, "cpp"))
+            # os.system('cmake -Wno-dev --preset="MSYS-shared-release"')
+            # os.system('cmake --build --preset="Build-MSYS-shared-release"')
+            cmake = CMake(self)
+            cmake.configure(build_script_folder=self.name+"/cpp", cli_args=['-Wno-dev'])
+            cmake.build()
+        else:
+            os.chdir(_artifact_path)
+            os.system('chmod +x generateLinux.sh')
+            command = f'./generateLinux.sh "{self.library_type.lower()}" release make'
+            os.system(command)
+
+    def package(self):
+        _repo_source = os.path.join(self.source_folder, self.name)
+        _build_folder = self.build_folder
+        copy(self, "*", src=os.path.join(_repo_source, "cpp/common"), dst=os.path.join(self.package_folder, "include/common"))
+
+        copy(self, "*", src=os.path.join(_repo_source, "cpp/expressionsLib/inc"), dst=os.path.join(self.package_folder, "include/expressionsLib/inc"))
+
+        copy(self, "*", src=os.path.join(_repo_source, "cpp/externalLibs/Filesystem"), dst=os.path.join(self.package_folder, "include/externalLibs/Filesystem"))
+        copy(self, "*", src=os.path.join(_repo_source, "cpp/externalLibs/TinyXML2"), dst=os.path.join(self.package_folder, "include/externalLibs/TinyXML2"))
+
+        copy(self, "*", src=os.path.join(_repo_source, "cpp/openScenarioLib/src"), dst=os.path.join(self.package_folder, "include/openScenarioLib/src"))
+
+        copy(self, "*", src=os.path.join(_repo_source, "cpp/openScenarioLib/generated"), dst=os.path.join(self.package_folder, "include/openScenarioLib/generated"))
+
+        if self.settings.os == "Windows":
+            copy(self, "lib*", src=os.path.join(_build_folder, "openScenarioLib"), dst=os.path.join(self.package_folder, "lib"))
+            copy(self, "lib*", src=os.path.join(_build_folder, "expressionsLib"), dst=os.path.join(self.package_folder, "lib"))
+            copy(self, "*", src=os.path.join(_build_folder, "antlr4_runtime/src/antlr4_runtime/runtime/Cpp/dist"), dst=os.path.join(self.package_folder, "lib"))
+
+        else:
+            copy(self, "*", src=os.path.join(_repo_source, f"cpp/build/cgReleaseMake{self.library_type}/antlr4_runtime/src/antlr4_runtime/runtime/Cpp/dist"), dst=os.path.join(self.package_folder, "lib"))
+            copy(self, "lib*", src=os.path.join(_repo_source, f"cpp/build/cgReleaseMake{self.library_type}/openScenarioLib"), dst=os.path.join(self.package_folder, "lib"))
+            copy(self, "lib*", src=os.path.join(_repo_source, f"cpp/build/cgReleaseMake{self.library_type}/expressionsLib"), dst=os.path.join(self.package_folder, "lib"))
+
+        os.chdir(self.package_folder)
+        os.system('find . -name "*.cpp" -exec rm {} \;')
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "none")
diff --git a/utils/ci/conan/recipe/openscenario_api/all/patches/0001-cross-compilation-compatible.patch b/utils/ci/conan/recipes/openscenario_api/all/patches/0001-cross-compilation-compatible.patch
similarity index 100%
rename from utils/ci/conan/recipe/openscenario_api/all/patches/0001-cross-compilation-compatible.patch
rename to utils/ci/conan/recipes/openscenario_api/all/patches/0001-cross-compilation-compatible.patch
diff --git a/utils/ci/conan/recipe/openscenario_api/all/patches/rpath.patch b/utils/ci/conan/recipes/openscenario_api/all/patches/rpath.patch
similarity index 100%
rename from utils/ci/conan/recipe/openscenario_api/all/patches/rpath.patch
rename to utils/ci/conan/recipes/openscenario_api/all/patches/rpath.patch
diff --git a/utils/ci/conan/recipe/openscenario_api/all/patches/v1.3.1.patch b/utils/ci/conan/recipes/openscenario_api/all/patches/v1.3.1.patch
similarity index 100%
rename from utils/ci/conan/recipe/openscenario_api/all/patches/v1.3.1.patch
rename to utils/ci/conan/recipes/openscenario_api/all/patches/v1.3.1.patch
diff --git a/utils/ci/conan/recipe/openscenario_api/config.yml b/utils/ci/conan/recipes/openscenario_api/config.yml
similarity index 94%
rename from utils/ci/conan/recipe/openscenario_api/config.yml
rename to utils/ci/conan/recipes/openscenario_api/config.yml
index c138e280b8235b608f7a64d56f090835243899f6..9ca6d35078257717a233014e82d5ea04cb29af95 100644
--- a/utils/ci/conan/recipe/openscenario_api/config.yml
+++ b/utils/ci/conan/recipes/openscenario_api/config.yml
@@ -13,5 +13,7 @@
 ################################################################################
 
 versions:
-  "0.1":
+  "v1.3.1":
+    folder: "all"
+  "commitid":
     folder: "all"
diff --git a/utils/ci/conan/recipe/openscenario_engine/all/conandata.yml b/utils/ci/conan/recipes/openscenario_engine/all/conandata.yml
similarity index 63%
rename from utils/ci/conan/recipe/openscenario_engine/all/conandata.yml
rename to utils/ci/conan/recipes/openscenario_engine/all/conandata.yml
index eeee39617d47d1a5b414702516bfe532c10b2f38..6aa85e75ba266f5a163649552d52c0c48e00fad0 100644
--- a/utils/ci/conan/recipe/openscenario_engine/all/conandata.yml
+++ b/utils/ci/conan/recipes/openscenario_engine/all/conandata.yml
@@ -1,5 +1,5 @@
 ################################################################################
-# Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# Copyright (c) 2023-2024 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
@@ -13,13 +13,24 @@
 ################################################################################
 
 sources:
+  "commitid":
+    url: https://gitlab.eclipse.org/eclipse/openpass/openscenario1_engine.git
+
+  "v4.2.1":
+    url: https://gitlab.eclipse.org/eclipse/openpass/openscenario1_engine.git
+    sha256: "f78508229ced13224a4dea145053630bebfd342b"
+
   "v4.3.1":
     url: https://gitlab.eclipse.org/eclipse/openpass/openscenario1_engine.git
     sha256: "b9d8af9ff3c910bd78b392b5e134b6242b1c7c0d"
 
-  "default":
+  "v6.0.1":
     url: https://gitlab.eclipse.org/eclipse/openpass/openscenario1_engine.git
+    sha256: "012b31400c1ac3fd21d75705168a22360248d86d"
 
 patches:
   - patch_file: "patches/math_defines.patch"
-    base_path: "openscenario_engine"
\ No newline at end of file
+    base_path: "openscenario_engine"
+
+  - patch_file: "patches/gcc-14-compatibility.patch"
+    base_path: "openscenario_engine"
diff --git a/utils/ci/conan/recipe/openscenario_engine/all/conanfile.py b/utils/ci/conan/recipes/openscenario_engine/all/conanfile.py
similarity index 74%
rename from utils/ci/conan/recipe/openscenario_engine/all/conanfile.py
rename to utils/ci/conan/recipes/openscenario_engine/all/conanfile.py
index 43f2201c526021b14146254a41d61f9fdbd91bb9..358ff6504e6d42ee8a3e8671d1c753a87e7d67c9 100644
--- a/utils/ci/conan/recipe/openscenario_engine/all/conanfile.py
+++ b/utils/ci/conan/recipes/openscenario_engine/all/conanfile.py
@@ -28,46 +28,53 @@ class OpenScenarioEngineConan(ConanFile):
                "MantleAPI_version":["ANY"],
                "openscenario_api_version":["ANY"],
                "units_version":["ANY"],
-               "Yase_version":["ANY"]
+               "Yase_version":["ANY"],
+               "commit_id_value":[None, "ANY"]
                }
 
-    default_options = {"shared": False,
-                       "fPIC": True,
+    default_options = {"shared": True,
+                       "fPIC": False,
                        "openscenario_api_version":"v1.3.1",
-                       "units_version":"2.3.3"}
+                       "units_version":"2.3.3",
+                       "commit_id_value": None}
 
     no_copy_source = False
     short_paths = True
+    commit = None
 
     def export_sources(self):
         export_conandata_patches(self)
 
     def requirements(self):
-        self.requires(f"openscenario_api/{self.options.openscenario_api_version}@openpass/testing")
-        self.requires(f"units/{self.options.units_version}@openpass/testing")
-        self.requires(f"yase/{self.options.Yase_version}@openpass/testing")
-        self.requires(f"mantleapi/{self.options.MantleAPI_version}@openpass/testing")
+        self.requires(f"openscenario_api/{self.options.openscenario_api_version}")
+        self.requires(f"units/{self.options.units_version}")
+        self.requires(f"yase/{self.options.Yase_version}")
+        self.requires(f"mantleapi/{self.options.MantleAPI_version}")
 
     def config_options(self):
         if self.settings.os == "Windows":
             del self.options.fPIC
-       
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        if self.options.commit_id_value:
+            self.commit = self.options.commit_id_value
+
     def _get_url_sha(self):
-        if self.version in self.conan_data["sources"]:
+        if self.version != "commitid" :
             url = self.conan_data["sources"][self.version]["url"]
-            sha256 = self.conan_data["sources"][self.version]["sha256"]
+            self.commit = self.conan_data["sources"][self.version]["sha256"]
         else:
-            url = self.conan_data["sources"]["default"]["url"]
-            sha256 = self.version
-
-        return url, sha256
+            url = self.conan_data["sources"]["commitid"]["url"]
+        return url
 
     def source(self):
-        url, sha256 = self._get_url_sha()
+        url = self._get_url_sha()
         git = Git(self)
         git.clone(url=url, target=self.name)
         git.folder=self.name
-        git.checkout(commit=sha256)
+        git.checkout(commit=self.commit)
         apply_conandata_patches(self)
 
     def generate(self):
@@ -90,3 +97,6 @@ class OpenScenarioEngineConan(ConanFile):
         copy(self, "*", src=os.path.join(self.source_folder, "engine/cmake"), dst=os.path.join(self.package_folder, "lib/cmake/OpenScenarioEngine/deps"))
         rm(self, "conanbuildinfo.txt", self.package_folder)
         rm(self, "conandata.yml", self.package_folder)
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "none")
diff --git a/utils/ci/conan/recipes/openscenario_engine/all/patches/gcc-14-compatibility.patch b/utils/ci/conan/recipes/openscenario_engine/all/patches/gcc-14-compatibility.patch
new file mode 100644
index 0000000000000000000000000000000000000000..24022177170dbc9ddf747001e902b95ea48d5a9a
--- /dev/null
+++ b/utils/ci/conan/recipes/openscenario_engine/all/patches/gcc-14-compatibility.patch
@@ -0,0 +1,13 @@
+diff --git a/engine/src/Utils/EntityUtils.cpp b/engine/src/Utils/EntityUtils.cpp
+index 6a01d1b..4fd5e83 100644
+--- a/engine/src/Utils/EntityUtils.cpp
++++ b/engine/src/Utils/EntityUtils.cpp
+@@ -11,6 +11,8 @@
+ 
+ #include "Utils/EntityUtils.h"
+ 
++#include <algorithm>
++
+ #include "Utils/Logger.h"
+ 
+ namespace OpenScenarioEngine::v1_2
diff --git a/utils/ci/conan/recipe/openscenario_engine/all/patches/math_defines.patch b/utils/ci/conan/recipes/openscenario_engine/all/patches/math_defines.patch
similarity index 100%
rename from utils/ci/conan/recipe/openscenario_engine/all/patches/math_defines.patch
rename to utils/ci/conan/recipes/openscenario_engine/all/patches/math_defines.patch
diff --git a/utils/ci/conan/recipe/openscenario_engine/config.yml b/utils/ci/conan/recipes/openscenario_engine/config.yml
similarity index 90%
rename from utils/ci/conan/recipe/openscenario_engine/config.yml
rename to utils/ci/conan/recipes/openscenario_engine/config.yml
index 9a3d74d428484b717579d6fc60a87e2882fc9bdc..38a6fa886d057d4cd919cdf2810f823180aae669 100644
--- a/utils/ci/conan/recipe/openscenario_engine/config.yml
+++ b/utils/ci/conan/recipes/openscenario_engine/config.yml
@@ -13,5 +13,9 @@
 ################################################################################
 
 versions:
-  "0.1":
+  "v4.3.1":
+    folder: "all"
+  "v6.0.1":
+    folder: "all"
+  "commitid":
     folder: "all"
diff --git a/utils/ci/conan/recipes/osiquerylibrary/all/conandata.yml b/utils/ci/conan/recipes/osiquerylibrary/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9e34e2d8e33bfe9e3bd6735e897d5e8b46554499
--- /dev/null
+++ b/utils/ci/conan/recipes/osiquerylibrary/all/conandata.yml
@@ -0,0 +1,18 @@
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# conan data file for building OsiQueryLibrary with Conan
+################################################################################
+
+sources:
+  "commitid":
+    url_https: https://cc-github.bmwgroup.net/openpass/OsiQueryLibrary.git
+    url_ssh: git@cc-github.bmwgroup.net:openpass/OsiQueryLibrary.git
diff --git a/utils/ci/conan/recipes/osiquerylibrary/all/conanfile.py b/utils/ci/conan/recipes/osiquerylibrary/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..9104a752f7abfbcec90fa761f47cf46d264f9104
--- /dev/null
+++ b/utils/ci/conan/recipes/osiquerylibrary/all/conanfile.py
@@ -0,0 +1,119 @@
+################################################################################
+# Copyright (c) 2023-2024 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
+################################################################################
+
+################################################################################
+# Install file for building OsiQueryLibrary with Conan
+################################################################################
+
+from conan import ConanFile
+from conan.tools.scm import Git
+from conan.tools.files import copy, export_conandata_patches, apply_conandata_patches
+from conan.tools.cmake import CMake, CMakeToolchain
+import os, subprocess
+
+required_conan_version = ">=1.53.0"
+
+class OsiQueryLibraryConan(ConanFile):
+    name = "osiquerylibrary"
+    settings = "os", "compiler", "build_type", "arch"
+    options = {"shared": [True, False],
+               "fPIC": [True, False],
+               "open_simulation_interface_version":["ANY"],
+               "protobuf_version":["ANY"],
+               "boost_version":["ANY"],
+               "commit_id_value":[None, "ANY"],
+               "with_test":["OFF", "ON"]
+               }
+
+    default_options = {"shared": False,
+                       "fPIC": True,
+                       "open_simulation_interface_version":"3.6.0",
+                       "protobuf_version":"3.20.0",
+                       "boost_version":"1.85.0",
+                       "commit_id_value": None,
+                       "with_test":"OFF"}
+
+    no_copy_source = False
+    short_paths = True
+    commit = None
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def requirements(self):
+        self.requires(f"protobuf/{self.options.protobuf_version}", options={"debug_suffix": False})
+        self.requires(f"open-simulation-interface/{self.options.open_simulation_interface_version}")
+        self.requires(f"boost/{self.options.boost_version}")
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        self._strict_options_requirements()
+        if self.options.commit_id_value:
+            self.commit = self.options.commit_id_value
+
+    def _strict_options_requirements(self):
+        self.options["boost"].shared = True
+        for boost_options in self._required_boost_options:
+            setattr(self.options["boost"], f"without_{boost_options}", True)
+
+    @property
+    def _required_boost_options(self):
+        return ["chrono", "cobalt", "container", "context", "contract", "coroutine", "date_time", "fiber", "iostreams", "json", "locale", "log", "nowide", "stacktrace", "test", "thread", "timer", "type_erasure", "url", "wave"]
+
+    def _get_url_sha(self):
+        if self.version != "commitid" :
+            url_https = self.conan_data["sources"][self.version]["url_https"]
+            url_ssh = self.conan_data["sources"][self.version]["url_ssh"]
+            self.commit = self.conan_data["sources"][self.version]["sha256"]
+        else:
+            if not self.commit:
+                raise Exception("Invalid to build commitid version without specifying commit_id_value option")
+
+            url_https = self.conan_data["sources"]["commitid"]["url_https"]
+            url_ssh = self.conan_data["sources"]["commitid"]["url_ssh"]
+        return url_https, url_ssh
+
+    def generate(self):
+        _cmake_prefix_paths = []
+        for _, dependency in self.dependencies.items():
+            _cmake_prefix_paths.append(dependency.package_folder)
+        _cmake_prefix_paths = ';'.join(str(_cmake_prefix_path) for _cmake_prefix_path in _cmake_prefix_paths)
+        tc = CMakeToolchain(self)
+        tc.cache_variables["CMAKE_PREFIX_PATH"] = _cmake_prefix_paths
+        tc.cache_variables["OSIQL_TEST"] = self.options.with_test
+        tc.generate()
+
+    def source(self):
+        url_https, url_ssh = self._get_url_sha()
+        if "GIT_USER" and "GIT_PASSWORD" in os.environ:
+            git = Git(self)
+            url = f"https://{os.getenv('GIT_USER')}:{os.getenv('GIT_PASSWORD')}@cc-github.bmwgroup.net/openpass/OsiQueryLibrary.git"
+        else:
+            git = Git(self)
+            url = url_ssh
+        git.clone(url=url, target=self.name)
+        git.folder=self.name
+        git.checkout(commit=self.commit)
+        apply_conandata_patches(self)
+
+    def build(self):
+        cmake = CMake(self)
+        cmake.configure(build_script_folder=self.name)
+        cmake.build()
+
+    def package(self):
+        cmake = CMake(self)
+        cmake.install()
diff --git a/utils/ci/conan/recipes/osiquerylibrary/config.yml b/utils/ci/conan/recipes/osiquerylibrary/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a230bc78366d0220a9ba167fccb2a90cd193fe6a
--- /dev/null
+++ b/utils/ci/conan/recipes/osiquerylibrary/config.yml
@@ -0,0 +1,19 @@
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# config file for building OsiQueryLibrary with Conan
+################################################################################
+versions:
+  "0.1.0":
+    folder: "all"
+
+  "commitid":
+    folder: "all"
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/conandata.yml b/utils/ci/conan/recipes/protobuf-shared/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..38a844081521573e275db9ee1e8a5cde8ff28f04
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/conandata.yml
@@ -0,0 +1,66 @@
+sources:
+  "3.21.12":
+    url: "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.21.12.tar.gz"
+    sha256: "930c2c3b5ecc6c9c12615cf5ad93f1cd6e12d0aba862b572e076259970ac3a53"
+  "3.21.9":
+    url: "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.21.9.tar.gz"
+    sha256: "1add10f9bd92775b91f326da259f243881e904dd509367d5031d4c782ba82810"
+  "3.20.3":
+    url: "https://github.com/protocolbuffers/protobuf/archive/v3.20.3.tar.gz"
+    sha256: "9c0fd39c7a08dff543c643f0f4baf081988129a411b977a07c46221793605638"
+  "3.20.0":
+    url: "https://github.com/protocolbuffers/protobuf/archive/v3.20.0.tar.gz"
+    sha256: "b07772d38ab07e55eca4d50f4b53da2d998bb221575c60a4f81100242d4b4889"
+  "3.19.6":
+    url: "https://github.com/protocolbuffers/protobuf/archive/v3.19.6.tar.gz"
+    sha256: "9a301cf94a8ddcb380b901e7aac852780b826595075577bb967004050c835056"
+  "3.18.3":
+    url: "https://github.com/protocolbuffers/protobuf/archive/v3.18.3.tar.gz"
+    sha256: "663b3a6d56605e6ab7888d32a1525c34f34639b25b8996337821591e60c37041"
+  "3.17.1":
+    url: "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.17.1.tar.gz"
+    sha256: "036d66d6eec216160dd898cfb162e9d82c1904627642667cc32b104d407bb411"
+  "3.6.1":
+    url: "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.6.1.tar.gz"
+    sha256: "3d4e589d81b2006ca603c1ab712c9715a76227293032d05b26fca603f90b3f5b"
+patches:
+  "3.21.12":
+    - patch_file: "patches/protobuf-3.21.12-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.21.9":
+    - patch_file: "patches/protobuf-3.21.9-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.20.3":
+    - patch_file: "patches/protobuf-3.20.0-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.20.0":
+    - patch_file: "patches/protobuf-3.20.0-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+    - patch_file: "patches/mingw.patch"
+  "3.19.6":
+    - patch_file: "patches/upstream-pr-9437-msvc-runtime.patch"
+      patch_description: "Properly handle CMAKE_MSVC_RUNTIME_LIBRARY when using CMake >= 3.15"
+      patch_type: "portability"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/9437"
+    - patch_file: "patches/protobuf-3.19.6-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.18.3":
+    - patch_file: "patches/protobuf-3.18.1-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.17.1":
+    - patch_file: "patches/protobuf-3.17.1-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/conanfile.py b/utils/ci/conan/recipes/protobuf-shared/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b20457061b94637e1f87c50207c35575775128d
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/conanfile.py
@@ -0,0 +1,267 @@
+from conan import ConanFile
+from conan.errors import ConanInvalidConfiguration
+from conan.tools.apple import is_apple_os
+from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
+from conan.tools.files import copy, rename, get, apply_conandata_patches, export_conandata_patches, replace_in_file, rmdir, rm
+from conan.tools.microsoft import check_min_vs, msvc_runtime_flag, is_msvc, is_msvc_static_runtime
+from conan.tools.scm import Version
+
+import os
+import textwrap
+
+required_conan_version = ">=1.53"
+
+
+class ProtobufConan(ConanFile):
+    name = "protobuf-shared"
+    description = "Protocol Buffers - Google's data interchange format"
+    topics = ("protocol-buffers", "protocol-compiler", "serialization", "rpc", "protocol-compiler")
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://github.com/protocolbuffers/protobuf"
+    license = "BSD-3-Clause"
+    package_type = "library"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "with_zlib": [True, False],
+        "with_rtti": [True, False],
+        "lite": [True, False],
+        "debug_suffix": [True, False],
+    }
+    default_options = {
+        "shared": True,
+        "fPIC": False,
+        "with_zlib": True,
+        "with_rtti": True,
+        "lite": False,
+        "debug_suffix": True,
+    }
+
+    short_paths = True
+
+    @property
+    def _is_clang_cl(self):
+        return self.settings.compiler == "clang" and self.settings.os == "Windows"
+
+    @property
+    def _is_clang_x86(self):
+        return self.settings.compiler == "clang" and self.settings.arch == "x86"
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+
+    def layout(self):
+        cmake_layout(self, src_folder="src")
+
+    def requirements(self):
+        if self.options.with_zlib:
+            self.requires(f"zlib/[>=1.2.11 <2]")
+
+    def validate(self):
+        if self.options.shared and is_msvc_static_runtime(self):
+            raise ConanInvalidConfiguration("Protobuf can't be built with shared + MT(d) runtimes")
+
+        check_min_vs(self, "190")
+
+        if self.settings.compiler == "clang":
+            if Version(self.settings.compiler.version) < "4":
+                raise ConanInvalidConfiguration(f"{self.ref} doesn't support clang < 4")
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    @property
+    def _cmake_install_base_path(self):
+        return os.path.join("lib", "cmake", "protobuf")
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.cache_variables["CMAKE_INSTALL_CMAKEDIR"] = self._cmake_install_base_path.replace("\\", "/")
+        tc.cache_variables["protobuf_WITH_ZLIB"] = self.options.with_zlib
+        tc.cache_variables["protobuf_BUILD_TESTS"] = False
+        tc.cache_variables["protobuf_BUILD_PROTOC_BINARIES"] = self.settings.os != "tvOS"
+        if not self.options.debug_suffix:
+            tc.cache_variables["protobuf_DEBUG_POSTFIX"] = ""
+        tc.cache_variables["protobuf_BUILD_LIBPROTOC"] = self.settings.os != "tvOS"
+        tc.cache_variables["protobuf_DISABLE_RTTI"] = not self.options.with_rtti
+        if is_msvc(self) or self._is_clang_cl:
+            runtime = msvc_runtime_flag(self)
+            if not runtime:
+                runtime = self.settings.get_safe("compiler.runtime")
+            tc.cache_variables["protobuf_MSVC_STATIC_RUNTIME"] = "MT" in runtime
+        if is_apple_os(self) and self.options.shared:
+            # Workaround against SIP on macOS for consumers while invoking protoc when protobuf lib is shared
+            tc.variables["CMAKE_INSTALL_RPATH"] = "@loader_path/../lib"
+        tc.generate()
+
+        deps = CMakeDeps(self)
+        deps.generate()
+
+    def _patch_sources(self):
+        apply_conandata_patches(self)
+
+        # Provide relocatable protobuf::protoc target and Protobuf_PROTOC_EXECUTABLE cache variable
+        # TODO: some of the following logic might be disabled when conan will
+        #       allow to create executable imported targets in package_info()
+        protobuf_config_cmake = os.path.join(self.source_folder, "cmake", "protobuf-config.cmake.in")
+
+        replace_in_file(self,
+            protobuf_config_cmake,
+            "@_protobuf_FIND_ZLIB@",
+            "# BEGIN CONAN PATCH\n#_protobuf_FIND_ZLIB@\n# END CONAN PATCH"
+        )
+
+        exe_ext = ".exe" if self.settings.os == "Windows" else ""
+        protoc_filename = "protoc" + exe_ext
+        module_folder_depth = len(os.path.normpath(self._cmake_install_base_path).split(os.path.sep))
+        protoc_rel_path = "{}bin/{}".format("".join(["../"] * module_folder_depth), protoc_filename)
+        protoc_target = textwrap.dedent(f"""\
+            if(NOT TARGET protobuf::protoc)
+                # Locate protoc executable
+                ## Workaround for legacy "cmake" generator in case of cross-build
+                if(CMAKE_CROSSCOMPILING)
+                    find_program(PROTOC_PROGRAM NAMES protoc PATHS ENV PATH NO_DEFAULT_PATH)
+                endif()
+                ## And here this will work fine with "CMakeToolchain" (for native & cross-build)
+                ## and legacy "cmake" generator in case of native build
+                if(NOT PROTOC_PROGRAM)
+                    find_program(PROTOC_PROGRAM NAMES protoc)
+                endif()
+                ## Last resort: we search in package folder directly
+                if(NOT PROTOC_PROGRAM)
+                    set(PROTOC_PROGRAM \"${{CMAKE_CURRENT_LIST_DIR}}/{protoc_rel_path}\")
+                endif()
+                get_filename_component(PROTOC_PROGRAM \"${{PROTOC_PROGRAM}}\" ABSOLUTE)
+
+                # Give opportunity to users to provide an external protoc executable
+                # (this is a feature of official FindProtobuf.cmake)
+                set(Protobuf_PROTOC_EXECUTABLE ${{PROTOC_PROGRAM}} CACHE FILEPATH \"The protoc compiler\")
+
+                # Create executable imported target protobuf::protoc
+                add_executable(protobuf::protoc IMPORTED)
+                set_property(TARGET protobuf::protoc PROPERTY IMPORTED_LOCATION ${{Protobuf_PROTOC_EXECUTABLE}})
+            endif()
+        """)
+        replace_in_file(self,
+            protobuf_config_cmake,
+            "include(\"${CMAKE_CURRENT_LIST_DIR}/protobuf-targets.cmake\")",
+            protoc_target
+        )
+
+        # Disable a potential warning in protobuf-module.cmake.in
+        # TODO: remove this patch? Is it really useful?
+        protobuf_module_cmake = os.path.join(self.source_folder, "cmake", "protobuf-module.cmake.in")
+        replace_in_file(self,
+            protobuf_module_cmake,
+            "if(DEFINED Protobuf_SRC_ROOT_FOLDER)",
+            "if(0)\nif(DEFINED Protobuf_SRC_ROOT_FOLDER)",
+        )
+        replace_in_file(self,
+            protobuf_module_cmake,
+            "# Define upper case versions of output variables",
+            "endif()",
+        )
+
+        # https://github.com/protocolbuffers/protobuf/issues/9916
+        # it will be solved in protobuf 3.21.0
+        if Version(self.version) == "3.20.0":
+            replace_in_file(self, os.path.join(self.source_folder, "src", "google", "protobuf", "port_def.inc"),
+                "#elif PROTOBUF_GNUC_MIN(12, 0)",
+                "#elif PROTOBUF_GNUC_MIN(12, 2)")
+
+    def build(self):
+        self._patch_sources()
+        cmake = CMake(self)
+        cmake_root = "cmake" if Version(self.version) < "3.21" else None
+        cmake.configure(build_script_folder=cmake_root)
+        cmake.build()
+
+    def package(self):
+        copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
+        cmake = CMake(self)
+        cmake.install()
+        rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
+        os.unlink(os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-config-version.cmake"))
+        os.unlink(os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-targets.cmake"))
+        os.unlink(os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-targets-{}.cmake".format(str(self.settings.build_type).lower())))
+        rename(self, os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-config.cmake"),
+                     os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-generate.cmake"))
+
+        if not self.options.lite:
+            rm(self, "libprotobuf-lite*", os.path.join(self.package_folder, "lib"))
+            rm(self, "libprotobuf-lite*", os.path.join(self.package_folder, "bin"))
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "none")
+        self.cpp_info.set_property("cmake_module_file_name", "Protobuf")
+        self.cpp_info.set_property("cmake_file_name", "protobuf")
+        self.cpp_info.set_property("pkg_config_name", "protobuf_full_package") # unofficial, but required to avoid side effects (libprotobuf component "steals" the default global pkg_config name)
+
+        build_modules = [
+            os.path.join(self._cmake_install_base_path, "protobuf-generate.cmake"),
+            os.path.join(self._cmake_install_base_path, "protobuf-module.cmake"),
+            os.path.join(self._cmake_install_base_path, "protobuf-options.cmake"),
+        ]
+        self.cpp_info.set_property("cmake_build_modules", build_modules)
+
+        lib_prefix = "lib" if (is_msvc(self) or self._is_clang_cl) else ""
+        lib_suffix = "d" if self.settings.build_type == "Debug" and self.options.debug_suffix else ""
+
+        # libprotobuf
+        self.cpp_info.components["libprotobuf"].set_property("cmake_target_name", "protobuf::libprotobuf")
+        self.cpp_info.components["libprotobuf"].set_property("pkg_config_name", "protobuf")
+        self.cpp_info.components["libprotobuf"].builddirs.append(self._cmake_install_base_path)
+        self.cpp_info.components["libprotobuf"].libs = [lib_prefix + "protobuf" + lib_suffix]
+        if self.options.with_zlib:
+            self.cpp_info.components["libprotobuf"].requires = ["zlib::zlib"]
+        if self.settings.os in ["Linux", "FreeBSD"]:
+            self.cpp_info.components["libprotobuf"].system_libs.extend(["m", "pthread"])
+            if self._is_clang_x86 or "arm" in str(self.settings.arch):
+                self.cpp_info.components["libprotobuf"].system_libs.append("atomic")
+        if self.settings.os == "Android":
+            self.cpp_info.components["libprotobuf"].system_libs.append("log")
+        if self.settings.os == "Windows":
+            if self.options.shared:
+                self.cpp_info.components["libprotobuf"].defines = ["PROTOBUF_USE_DLLS"]
+
+        # libprotoc
+        if self.settings.os != "tvOS":
+            self.cpp_info.components["libprotoc"].set_property("cmake_target_name", "protobuf::libprotoc")
+            self.cpp_info.components["libprotoc"].libs = [lib_prefix + "protoc" + lib_suffix]
+            self.cpp_info.components["libprotoc"].requires = ["libprotobuf"]
+
+        # libprotobuf-lite
+        if self.options.lite:
+            self.cpp_info.components["libprotobuf-lite"].set_property("cmake_target_name", "protobuf::libprotobuf-lite")
+            self.cpp_info.components["libprotobuf-lite"].set_property("pkg_config_name", "protobuf-lite")
+            self.cpp_info.components["libprotobuf-lite"].builddirs.append(self._cmake_install_base_path)
+            self.cpp_info.components["libprotobuf-lite"].libs = [lib_prefix + "protobuf-lite" + lib_suffix]
+            if self.settings.os in ["Linux", "FreeBSD"]:
+                self.cpp_info.components["libprotobuf-lite"].system_libs.extend(["m", "pthread"])
+                if self._is_clang_x86 or "arm" in str(self.settings.arch):
+                    self.cpp_info.components["libprotobuf-lite"].system_libs.append("atomic")
+            if self.settings.os == "Windows":
+                if self.options.shared:
+                    self.cpp_info.components["libprotobuf-lite"].defines = ["PROTOBUF_USE_DLLS"]
+            if self.settings.os == "Android":
+                self.cpp_info.components["libprotobuf-lite"].system_libs.append("log")
+
+        # TODO: to remove in conan v2 once cmake_find_package* & pkg_config generators removed
+        self.cpp_info.filenames["cmake_find_package"] = "Protobuf"
+        self.cpp_info.filenames["cmake_find_package_multi"] = "protobuf"
+        self.cpp_info.names["pkg_config"] ="protobuf_full_package"
+        for generator in ["cmake_find_package", "cmake_find_package_multi"]:
+            self.cpp_info.components["libprotobuf"].build_modules[generator] = build_modules
+        if self.options.lite:
+            for generator in ["cmake_find_package", "cmake_find_package_multi"]:
+                self.cpp_info.components["libprotobuf-lite"].build_modules[generator] = build_modules
+        self.env_info.PATH.append(os.path.join(self.package_folder, "bin"))
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/patches/mingw.patch b/utils/ci/conan/recipes/protobuf-shared/all/patches/mingw.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1df9cfd6d09208c672759e108ac88be44830c856
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/patches/mingw.patch
@@ -0,0 +1,22 @@
+--- src/google/protobuf/port_def.inc	2023-08-22 08:57:16.181828100 +0200
++++ src/google/protobuf/port_def_new.inc	2023-08-21 19:14:38.691985700 +0200
+@@ -756,7 +756,7 @@
+
+ // Windows declares several inconvenient macro names.  We #undef them and then
+ // restore them in port_undef.inc.
+-#ifdef _MSC_VER
++#ifdef _WIN32
+ #pragma push_macro("CREATE_NEW")
+ #undef CREATE_NEW
+ #pragma push_macro("DELETE")
+--- src/google/protobuf/port_undef.inc	2023-08-22 08:55:24.385192600 +0200
++++ src/google/protobuf/port_undef_new.inc	2023-08-21 19:15:41.091144100 +0200
+@@ -103,7 +103,7 @@
+ #endif
+
+ // Restore macro that may have been #undef'd in port_def.inc.
+-#ifdef _MSC_VER
++#ifdef _WIN32
+ #pragma pop_macro("CREATE_NEW")
+ #pragma pop_macro("DELETE")
+ #pragma pop_macro("DOUBLE_CLICK")
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.17.1-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.17.1-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d8f8f14a25361255e97f79ea7e0f4c64d340cc7e
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.17.1-upstream-macos-macros.patch
@@ -0,0 +1,46 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index 61f0859..d673519 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -616,6 +616,22 @@
+ #undef timezone
+ #endif  // _MSC_VER
+ 
++#ifdef __APPLE__
++// Inconvenient macro names from usr/include/math.h in some macOS SDKs.
++#pragma push_macro("DOMAIN")
++#undef DOMAIN
++// Inconvenient macro names from /usr/include/mach/boolean.h in some macOS SDKs.
++#pragma push_macro("TRUE")
++#undef TRUE
++#pragma push_macro("FALSE")
++#undef FALSE
++// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
++#pragma push_macro("UID_MAX")
++#undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
++#endif  // __APPLE__
++
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+ // Don't let Objective-C Macros interfere with proto identifiers with the same
+ // name.
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index 82fe794..dfbbf5b 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -112,6 +112,14 @@
+ #pragma pop_macro("timezone")
+ #endif
+ 
++#ifdef __APPLE__
++#pragma pop_macro("DOMAIN")
++#pragma pop_macro("TRUE")
++#pragma pop_macro("FALSE")
++#pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
++#endif  // __APPLE__
++
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
+ #pragma pop_macro("DEBUG")
+ #endif // defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.18.1-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.18.1-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4825966e01d9d66ce91f6e5c33f20a58ca499ac3
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.18.1-upstream-macos-macros.patch
@@ -0,0 +1,46 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index 01384c8..8f8a44d 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -736,6 +736,22 @@
+ #undef timezone
+ #endif  // _MSC_VER
+ 
++#ifdef __APPLE__
++// Inconvenient macro names from usr/include/math.h in some macOS SDKs.
++#pragma push_macro("DOMAIN")
++#undef DOMAIN
++// Inconvenient macro names from /usr/include/mach/boolean.h in some macOS SDKs.
++#pragma push_macro("TRUE")
++#undef TRUE
++#pragma push_macro("FALSE")
++#undef FALSE
++// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
++#pragma push_macro("UID_MAX")
++#undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
++#endif  // __APPLE__
++
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+ // Don't let Objective-C Macros interfere with proto identifiers with the same
+ // name.
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index 5fef6e4..9efd5d6 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -128,6 +128,14 @@
+ #pragma pop_macro("timezone")
+ #endif
+ 
++#ifdef __APPLE__
++#pragma pop_macro("DOMAIN")
++#pragma pop_macro("TRUE")
++#pragma pop_macro("FALSE")
++#pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
++#endif  // __APPLE__
++
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
+ #pragma pop_macro("DEBUG")
+ #endif // defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.19.6-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.19.6-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5aadd2a2570439d4a967dd213721e10e30565912
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.19.6-upstream-macos-macros.patch
@@ -0,0 +1,46 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index 30af1cf..4ddf5dc 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -763,6 +763,22 @@
+ #undef timezone
+ #endif  // _MSC_VER
+ 
++#ifdef __APPLE__
++// Inconvenient macro names from usr/include/math.h in some macOS SDKs.
++#pragma push_macro("DOMAIN")
++#undef DOMAIN
++// Inconvenient macro names from /usr/include/mach/boolean.h in some macOS SDKs.
++#pragma push_macro("TRUE")
++#undef TRUE
++#pragma push_macro("FALSE")
++#undef FALSE
++// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
++#pragma push_macro("UID_MAX")
++#undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
++#endif  // __APPLE__
++
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+ // Don't let Objective-C Macros interfere with proto identifiers with the same
+ // name.
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index 579eb41..7a179f9 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -129,6 +129,14 @@
+ #pragma pop_macro("timezone")
+ #endif
+ 
++#ifdef __APPLE__
++#pragma pop_macro("DOMAIN")
++#pragma pop_macro("TRUE")
++#pragma pop_macro("FALSE")
++#pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
++#endif  // __APPLE__
++
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
+ #pragma pop_macro("DEBUG")
+ #endif // defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.20.0-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.20.0-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..df772b59588790bfc6fe2d85f583c0fee4f7dabc
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.20.0-upstream-macos-macros.patch
@@ -0,0 +1,29 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index bdb2eec..e8d7dbc 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -816,6 +816,11 @@
+ #undef TRUE
+ #pragma push_macro("FALSE")
+ #undef FALSE
++// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
++#pragma push_macro("UID_MAX")
++#undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index 58136a4..eb0fdc8 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -134,6 +134,8 @@
+ #pragma pop_macro("DOMAIN")
+ #pragma pop_macro("TRUE")
+ #pragma pop_macro("FALSE")
++#pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.21.12-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.21.12-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3a152f62bca6961a993c16dfbabf99c9860c44e1
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.21.12-upstream-macos-macros.patch
@@ -0,0 +1,25 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index f00daf7..d956db2 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -870,6 +870,8 @@
+ // Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
+ #pragma push_macro("UID_MAX")
+ #undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index e880fa5..f8968d9 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -144,6 +144,7 @@
+ #pragma pop_macro("TRUE")
+ #pragma pop_macro("FALSE")
+ #pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.21.9-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.21.9-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3a152f62bca6961a993c16dfbabf99c9860c44e1
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/patches/protobuf-3.21.9-upstream-macos-macros.patch
@@ -0,0 +1,25 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index f00daf7..d956db2 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -870,6 +870,8 @@
+ // Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
+ #pragma push_macro("UID_MAX")
+ #undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index e880fa5..f8968d9 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -144,6 +144,7 @@
+ #pragma pop_macro("TRUE")
+ #pragma pop_macro("FALSE")
+ #pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf-shared/all/patches/upstream-pr-9437-msvc-runtime.patch b/utils/ci/conan/recipes/protobuf-shared/all/patches/upstream-pr-9437-msvc-runtime.patch
new file mode 100644
index 0000000000000000000000000000000000000000..06cb0a97681d10a9348282a58ae114408c3f39b8
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/all/patches/upstream-pr-9437-msvc-runtime.patch
@@ -0,0 +1,17 @@
+Fix from Protobuf PR: https://github.com/protocolbuffers/protobuf/pull/9437
+
+--- a/cmake/CMakeLists.txt
++++ b/cmake/CMakeLists.txt
+@@ -182,7 +182,11 @@ else (protobuf_BUILD_SHARED_LIBS)
+   # making programmatic control difficult.  Prefer the functionality in newer
+   # CMake versions when available.
+   if(CMAKE_VERSION VERSION_GREATER 3.15 OR CMAKE_VERSION VERSION_EQUAL 3.15)
+-    set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
++    if (protobuf_MSVC_STATIC_RUNTIME)
++      set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
++    else()
++      set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>DLL)
++    endif()
+   else()
+     # In case we are building static libraries, link also the runtime library statically
+     # so that MSVCR*.DLL is not required at runtime.
diff --git a/utils/ci/conan/recipes/protobuf-shared/config.yml b/utils/ci/conan/recipes/protobuf-shared/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cafb5a884d7e8e5611a8ace10805da879739c688
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf-shared/config.yml
@@ -0,0 +1,17 @@
+versions:
+  "3.21.12":
+    folder: all
+  "3.21.9":
+    folder: all
+  "3.20.3":
+    folder: all
+  "3.20.0":
+    folder: all
+  "3.19.6":
+    folder: all
+  "3.18.3":
+    folder: all
+  "3.17.1":
+    folder: all
+  "3.6.1":
+    folder: all
diff --git a/utils/ci/conan/recipes/protobuf/all/conandata.yml b/utils/ci/conan/recipes/protobuf/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..38a844081521573e275db9ee1e8a5cde8ff28f04
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/conandata.yml
@@ -0,0 +1,66 @@
+sources:
+  "3.21.12":
+    url: "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.21.12.tar.gz"
+    sha256: "930c2c3b5ecc6c9c12615cf5ad93f1cd6e12d0aba862b572e076259970ac3a53"
+  "3.21.9":
+    url: "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.21.9.tar.gz"
+    sha256: "1add10f9bd92775b91f326da259f243881e904dd509367d5031d4c782ba82810"
+  "3.20.3":
+    url: "https://github.com/protocolbuffers/protobuf/archive/v3.20.3.tar.gz"
+    sha256: "9c0fd39c7a08dff543c643f0f4baf081988129a411b977a07c46221793605638"
+  "3.20.0":
+    url: "https://github.com/protocolbuffers/protobuf/archive/v3.20.0.tar.gz"
+    sha256: "b07772d38ab07e55eca4d50f4b53da2d998bb221575c60a4f81100242d4b4889"
+  "3.19.6":
+    url: "https://github.com/protocolbuffers/protobuf/archive/v3.19.6.tar.gz"
+    sha256: "9a301cf94a8ddcb380b901e7aac852780b826595075577bb967004050c835056"
+  "3.18.3":
+    url: "https://github.com/protocolbuffers/protobuf/archive/v3.18.3.tar.gz"
+    sha256: "663b3a6d56605e6ab7888d32a1525c34f34639b25b8996337821591e60c37041"
+  "3.17.1":
+    url: "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.17.1.tar.gz"
+    sha256: "036d66d6eec216160dd898cfb162e9d82c1904627642667cc32b104d407bb411"
+  "3.6.1":
+    url: "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.6.1.tar.gz"
+    sha256: "3d4e589d81b2006ca603c1ab712c9715a76227293032d05b26fca603f90b3f5b"
+patches:
+  "3.21.12":
+    - patch_file: "patches/protobuf-3.21.12-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.21.9":
+    - patch_file: "patches/protobuf-3.21.9-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.20.3":
+    - patch_file: "patches/protobuf-3.20.0-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.20.0":
+    - patch_file: "patches/protobuf-3.20.0-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+    - patch_file: "patches/mingw.patch"
+  "3.19.6":
+    - patch_file: "patches/upstream-pr-9437-msvc-runtime.patch"
+      patch_description: "Properly handle CMAKE_MSVC_RUNTIME_LIBRARY when using CMake >= 3.15"
+      patch_type: "portability"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/9437"
+    - patch_file: "patches/protobuf-3.19.6-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.18.3":
+    - patch_file: "patches/protobuf-3.18.1-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
+  "3.17.1":
+    - patch_file: "patches/protobuf-3.17.1-upstream-macos-macros.patch"
+      patch_description: "Handle case where macOS SDK macros may conflict with protobuf message types"
+      patch_type: "bugfix"
+      patch_source: "https://github.com/protocolbuffers/protobuf/pull/10103"
diff --git a/utils/ci/conan/recipes/protobuf/all/conanfile.py b/utils/ci/conan/recipes/protobuf/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..777661c7330a7bc1816e5aa65ae0a283b084d1b2
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/conanfile.py
@@ -0,0 +1,267 @@
+from conan import ConanFile
+from conan.errors import ConanInvalidConfiguration
+from conan.tools.apple import is_apple_os
+from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
+from conan.tools.files import copy, rename, get, apply_conandata_patches, export_conandata_patches, replace_in_file, rmdir, rm
+from conan.tools.microsoft import check_min_vs, msvc_runtime_flag, is_msvc, is_msvc_static_runtime
+from conan.tools.scm import Version
+
+import os
+import textwrap
+
+required_conan_version = ">=1.53"
+
+
+class ProtobufConan(ConanFile):
+    name = "protobuf"
+    description = "Protocol Buffers - Google's data interchange format"
+    topics = ("protocol-buffers", "protocol-compiler", "serialization", "rpc", "protocol-compiler")
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://github.com/protocolbuffers/protobuf"
+    license = "BSD-3-Clause"
+    package_type = "library"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "with_zlib": [True, False],
+        "with_rtti": [True, False],
+        "lite": [True, False],
+        "debug_suffix": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+        "with_zlib": True,
+        "with_rtti": True,
+        "lite": False,
+        "debug_suffix": True,
+    }
+
+    short_paths = True
+
+    @property
+    def _is_clang_cl(self):
+        return self.settings.compiler == "clang" and self.settings.os == "Windows"
+
+    @property
+    def _is_clang_x86(self):
+        return self.settings.compiler == "clang" and self.settings.arch == "x86"
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+
+    def layout(self):
+        cmake_layout(self, src_folder="src")
+
+    def requirements(self):
+        if self.options.with_zlib:
+            self.requires(f"zlib/[>=1.2.11 <2]")
+
+    def validate(self):
+        if self.options.shared and is_msvc_static_runtime(self):
+            raise ConanInvalidConfiguration("Protobuf can't be built with shared + MT(d) runtimes")
+
+        check_min_vs(self, "190")
+
+        if self.settings.compiler == "clang":
+            if Version(self.settings.compiler.version) < "4":
+                raise ConanInvalidConfiguration(f"{self.ref} doesn't support clang < 4")
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    @property
+    def _cmake_install_base_path(self):
+        return os.path.join("lib", "cmake", "protobuf")
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.cache_variables["CMAKE_INSTALL_CMAKEDIR"] = self._cmake_install_base_path.replace("\\", "/")
+        tc.cache_variables["protobuf_WITH_ZLIB"] = self.options.with_zlib
+        tc.cache_variables["protobuf_BUILD_TESTS"] = False
+        tc.cache_variables["protobuf_BUILD_PROTOC_BINARIES"] = self.settings.os != "tvOS"
+        if not self.options.debug_suffix:
+            tc.cache_variables["protobuf_DEBUG_POSTFIX"] = ""
+        tc.cache_variables["protobuf_BUILD_LIBPROTOC"] = self.settings.os != "tvOS"
+        tc.cache_variables["protobuf_DISABLE_RTTI"] = not self.options.with_rtti
+        if is_msvc(self) or self._is_clang_cl:
+            runtime = msvc_runtime_flag(self)
+            if not runtime:
+                runtime = self.settings.get_safe("compiler.runtime")
+            tc.cache_variables["protobuf_MSVC_STATIC_RUNTIME"] = "MT" in runtime
+        if is_apple_os(self) and self.options.shared:
+            # Workaround against SIP on macOS for consumers while invoking protoc when protobuf lib is shared
+            tc.variables["CMAKE_INSTALL_RPATH"] = "@loader_path/../lib"
+        tc.generate()
+
+        deps = CMakeDeps(self)
+        deps.generate()
+
+    def _patch_sources(self):
+        apply_conandata_patches(self)
+
+        # Provide relocatable protobuf::protoc target and Protobuf_PROTOC_EXECUTABLE cache variable
+        # TODO: some of the following logic might be disabled when conan will
+        #       allow to create executable imported targets in package_info()
+        protobuf_config_cmake = os.path.join(self.source_folder, "cmake", "protobuf-config.cmake.in")
+
+        replace_in_file(self,
+            protobuf_config_cmake,
+            "@_protobuf_FIND_ZLIB@",
+            "# BEGIN CONAN PATCH\n#_protobuf_FIND_ZLIB@\n# END CONAN PATCH"
+        )
+
+        exe_ext = ".exe" if self.settings.os == "Windows" else ""
+        protoc_filename = "protoc" + exe_ext
+        module_folder_depth = len(os.path.normpath(self._cmake_install_base_path).split(os.path.sep))
+        protoc_rel_path = "{}bin/{}".format("".join(["../"] * module_folder_depth), protoc_filename)
+        protoc_target = textwrap.dedent(f"""\
+            if(NOT TARGET protobuf::protoc)
+                # Locate protoc executable
+                ## Workaround for legacy "cmake" generator in case of cross-build
+                if(CMAKE_CROSSCOMPILING)
+                    find_program(PROTOC_PROGRAM NAMES protoc PATHS ENV PATH NO_DEFAULT_PATH)
+                endif()
+                ## And here this will work fine with "CMakeToolchain" (for native & cross-build)
+                ## and legacy "cmake" generator in case of native build
+                if(NOT PROTOC_PROGRAM)
+                    find_program(PROTOC_PROGRAM NAMES protoc)
+                endif()
+                ## Last resort: we search in package folder directly
+                if(NOT PROTOC_PROGRAM)
+                    set(PROTOC_PROGRAM \"${{CMAKE_CURRENT_LIST_DIR}}/{protoc_rel_path}\")
+                endif()
+                get_filename_component(PROTOC_PROGRAM \"${{PROTOC_PROGRAM}}\" ABSOLUTE)
+
+                # Give opportunity to users to provide an external protoc executable
+                # (this is a feature of official FindProtobuf.cmake)
+                set(Protobuf_PROTOC_EXECUTABLE ${{PROTOC_PROGRAM}} CACHE FILEPATH \"The protoc compiler\")
+
+                # Create executable imported target protobuf::protoc
+                add_executable(protobuf::protoc IMPORTED)
+                set_property(TARGET protobuf::protoc PROPERTY IMPORTED_LOCATION ${{Protobuf_PROTOC_EXECUTABLE}})
+            endif()
+        """)
+        replace_in_file(self,
+            protobuf_config_cmake,
+            "include(\"${CMAKE_CURRENT_LIST_DIR}/protobuf-targets.cmake\")",
+            protoc_target
+        )
+
+        # Disable a potential warning in protobuf-module.cmake.in
+        # TODO: remove this patch? Is it really useful?
+        protobuf_module_cmake = os.path.join(self.source_folder, "cmake", "protobuf-module.cmake.in")
+        replace_in_file(self,
+            protobuf_module_cmake,
+            "if(DEFINED Protobuf_SRC_ROOT_FOLDER)",
+            "if(0)\nif(DEFINED Protobuf_SRC_ROOT_FOLDER)",
+        )
+        replace_in_file(self,
+            protobuf_module_cmake,
+            "# Define upper case versions of output variables",
+            "endif()",
+        )
+
+        # https://github.com/protocolbuffers/protobuf/issues/9916
+        # it will be solved in protobuf 3.21.0
+        if Version(self.version) == "3.20.0":
+            replace_in_file(self, os.path.join(self.source_folder, "src", "google", "protobuf", "port_def.inc"),
+                "#elif PROTOBUF_GNUC_MIN(12, 0)",
+                "#elif PROTOBUF_GNUC_MIN(12, 2)")
+
+    def build(self):
+        self._patch_sources()
+        cmake = CMake(self)
+        cmake_root = "cmake" if Version(self.version) < "3.21" else None
+        cmake.configure(build_script_folder=cmake_root)
+        cmake.build()
+
+    def package(self):
+        copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
+        cmake = CMake(self)
+        cmake.install()
+        rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
+        os.unlink(os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-config-version.cmake"))
+        os.unlink(os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-targets.cmake"))
+        os.unlink(os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-targets-{}.cmake".format(str(self.settings.build_type).lower())))
+        rename(self, os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-config.cmake"),
+                     os.path.join(self.package_folder, self._cmake_install_base_path, "protobuf-generate.cmake"))
+
+        if not self.options.lite:
+            rm(self, "libprotobuf-lite*", os.path.join(self.package_folder, "lib"))
+            rm(self, "libprotobuf-lite*", os.path.join(self.package_folder, "bin"))
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "none")
+        self.cpp_info.set_property("cmake_module_file_name", "Protobuf")
+        self.cpp_info.set_property("cmake_file_name", "protobuf")
+        self.cpp_info.set_property("pkg_config_name", "protobuf_full_package") # unofficial, but required to avoid side effects (libprotobuf component "steals" the default global pkg_config name)
+
+        build_modules = [
+            os.path.join(self._cmake_install_base_path, "protobuf-generate.cmake"),
+            os.path.join(self._cmake_install_base_path, "protobuf-module.cmake"),
+            os.path.join(self._cmake_install_base_path, "protobuf-options.cmake"),
+        ]
+        self.cpp_info.set_property("cmake_build_modules", build_modules)
+
+        lib_prefix = "lib" if (is_msvc(self) or self._is_clang_cl) else ""
+        lib_suffix = "d" if self.settings.build_type == "Debug" and self.options.debug_suffix else ""
+
+        # libprotobuf
+        self.cpp_info.components["libprotobuf"].set_property("cmake_target_name", "protobuf::libprotobuf")
+        self.cpp_info.components["libprotobuf"].set_property("pkg_config_name", "protobuf")
+        self.cpp_info.components["libprotobuf"].builddirs.append(self._cmake_install_base_path)
+        self.cpp_info.components["libprotobuf"].libs = [lib_prefix + "protobuf" + lib_suffix]
+        if self.options.with_zlib:
+            self.cpp_info.components["libprotobuf"].requires = ["zlib::zlib"]
+        if self.settings.os in ["Linux", "FreeBSD"]:
+            self.cpp_info.components["libprotobuf"].system_libs.extend(["m", "pthread"])
+            if self._is_clang_x86 or "arm" in str(self.settings.arch):
+                self.cpp_info.components["libprotobuf"].system_libs.append("atomic")
+        if self.settings.os == "Android":
+            self.cpp_info.components["libprotobuf"].system_libs.append("log")
+        if self.settings.os == "Windows":
+            if self.options.shared:
+                self.cpp_info.components["libprotobuf"].defines = ["PROTOBUF_USE_DLLS"]
+
+        # libprotoc
+        if self.settings.os != "tvOS":
+            self.cpp_info.components["libprotoc"].set_property("cmake_target_name", "protobuf::libprotoc")
+            self.cpp_info.components["libprotoc"].libs = [lib_prefix + "protoc" + lib_suffix]
+            self.cpp_info.components["libprotoc"].requires = ["libprotobuf"]
+
+        # libprotobuf-lite
+        if self.options.lite:
+            self.cpp_info.components["libprotobuf-lite"].set_property("cmake_target_name", "protobuf::libprotobuf-lite")
+            self.cpp_info.components["libprotobuf-lite"].set_property("pkg_config_name", "protobuf-lite")
+            self.cpp_info.components["libprotobuf-lite"].builddirs.append(self._cmake_install_base_path)
+            self.cpp_info.components["libprotobuf-lite"].libs = [lib_prefix + "protobuf-lite" + lib_suffix]
+            if self.settings.os in ["Linux", "FreeBSD"]:
+                self.cpp_info.components["libprotobuf-lite"].system_libs.extend(["m", "pthread"])
+                if self._is_clang_x86 or "arm" in str(self.settings.arch):
+                    self.cpp_info.components["libprotobuf-lite"].system_libs.append("atomic")
+            if self.settings.os == "Windows":
+                if self.options.shared:
+                    self.cpp_info.components["libprotobuf-lite"].defines = ["PROTOBUF_USE_DLLS"]
+            if self.settings.os == "Android":
+                self.cpp_info.components["libprotobuf-lite"].system_libs.append("log")
+
+        # TODO: to remove in conan v2 once cmake_find_package* & pkg_config generators removed
+        self.cpp_info.filenames["cmake_find_package"] = "Protobuf"
+        self.cpp_info.filenames["cmake_find_package_multi"] = "protobuf"
+        self.cpp_info.names["pkg_config"] ="protobuf_full_package"
+        for generator in ["cmake_find_package", "cmake_find_package_multi"]:
+            self.cpp_info.components["libprotobuf"].build_modules[generator] = build_modules
+        if self.options.lite:
+            for generator in ["cmake_find_package", "cmake_find_package_multi"]:
+                self.cpp_info.components["libprotobuf-lite"].build_modules[generator] = build_modules
+        self.env_info.PATH.append(os.path.join(self.package_folder, "bin"))
diff --git a/utils/ci/conan/recipes/protobuf/all/patches/mingw.patch b/utils/ci/conan/recipes/protobuf/all/patches/mingw.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1df9cfd6d09208c672759e108ac88be44830c856
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/patches/mingw.patch
@@ -0,0 +1,22 @@
+--- src/google/protobuf/port_def.inc	2023-08-22 08:57:16.181828100 +0200
++++ src/google/protobuf/port_def_new.inc	2023-08-21 19:14:38.691985700 +0200
+@@ -756,7 +756,7 @@
+
+ // Windows declares several inconvenient macro names.  We #undef them and then
+ // restore them in port_undef.inc.
+-#ifdef _MSC_VER
++#ifdef _WIN32
+ #pragma push_macro("CREATE_NEW")
+ #undef CREATE_NEW
+ #pragma push_macro("DELETE")
+--- src/google/protobuf/port_undef.inc	2023-08-22 08:55:24.385192600 +0200
++++ src/google/protobuf/port_undef_new.inc	2023-08-21 19:15:41.091144100 +0200
+@@ -103,7 +103,7 @@
+ #endif
+
+ // Restore macro that may have been #undef'd in port_def.inc.
+-#ifdef _MSC_VER
++#ifdef _WIN32
+ #pragma pop_macro("CREATE_NEW")
+ #pragma pop_macro("DELETE")
+ #pragma pop_macro("DOUBLE_CLICK")
diff --git a/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.17.1-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.17.1-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d8f8f14a25361255e97f79ea7e0f4c64d340cc7e
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.17.1-upstream-macos-macros.patch
@@ -0,0 +1,46 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index 61f0859..d673519 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -616,6 +616,22 @@
+ #undef timezone
+ #endif  // _MSC_VER
+ 
++#ifdef __APPLE__
++// Inconvenient macro names from usr/include/math.h in some macOS SDKs.
++#pragma push_macro("DOMAIN")
++#undef DOMAIN
++// Inconvenient macro names from /usr/include/mach/boolean.h in some macOS SDKs.
++#pragma push_macro("TRUE")
++#undef TRUE
++#pragma push_macro("FALSE")
++#undef FALSE
++// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
++#pragma push_macro("UID_MAX")
++#undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
++#endif  // __APPLE__
++
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+ // Don't let Objective-C Macros interfere with proto identifiers with the same
+ // name.
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index 82fe794..dfbbf5b 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -112,6 +112,14 @@
+ #pragma pop_macro("timezone")
+ #endif
+ 
++#ifdef __APPLE__
++#pragma pop_macro("DOMAIN")
++#pragma pop_macro("TRUE")
++#pragma pop_macro("FALSE")
++#pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
++#endif  // __APPLE__
++
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
+ #pragma pop_macro("DEBUG")
+ #endif // defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.18.1-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.18.1-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4825966e01d9d66ce91f6e5c33f20a58ca499ac3
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.18.1-upstream-macos-macros.patch
@@ -0,0 +1,46 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index 01384c8..8f8a44d 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -736,6 +736,22 @@
+ #undef timezone
+ #endif  // _MSC_VER
+ 
++#ifdef __APPLE__
++// Inconvenient macro names from usr/include/math.h in some macOS SDKs.
++#pragma push_macro("DOMAIN")
++#undef DOMAIN
++// Inconvenient macro names from /usr/include/mach/boolean.h in some macOS SDKs.
++#pragma push_macro("TRUE")
++#undef TRUE
++#pragma push_macro("FALSE")
++#undef FALSE
++// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
++#pragma push_macro("UID_MAX")
++#undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
++#endif  // __APPLE__
++
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+ // Don't let Objective-C Macros interfere with proto identifiers with the same
+ // name.
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index 5fef6e4..9efd5d6 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -128,6 +128,14 @@
+ #pragma pop_macro("timezone")
+ #endif
+ 
++#ifdef __APPLE__
++#pragma pop_macro("DOMAIN")
++#pragma pop_macro("TRUE")
++#pragma pop_macro("FALSE")
++#pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
++#endif  // __APPLE__
++
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
+ #pragma pop_macro("DEBUG")
+ #endif // defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.19.6-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.19.6-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5aadd2a2570439d4a967dd213721e10e30565912
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.19.6-upstream-macos-macros.patch
@@ -0,0 +1,46 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index 30af1cf..4ddf5dc 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -763,6 +763,22 @@
+ #undef timezone
+ #endif  // _MSC_VER
+ 
++#ifdef __APPLE__
++// Inconvenient macro names from usr/include/math.h in some macOS SDKs.
++#pragma push_macro("DOMAIN")
++#undef DOMAIN
++// Inconvenient macro names from /usr/include/mach/boolean.h in some macOS SDKs.
++#pragma push_macro("TRUE")
++#undef TRUE
++#pragma push_macro("FALSE")
++#undef FALSE
++// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
++#pragma push_macro("UID_MAX")
++#undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
++#endif  // __APPLE__
++
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+ // Don't let Objective-C Macros interfere with proto identifiers with the same
+ // name.
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index 579eb41..7a179f9 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -129,6 +129,14 @@
+ #pragma pop_macro("timezone")
+ #endif
+ 
++#ifdef __APPLE__
++#pragma pop_macro("DOMAIN")
++#pragma pop_macro("TRUE")
++#pragma pop_macro("FALSE")
++#pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
++#endif  // __APPLE__
++
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
+ #pragma pop_macro("DEBUG")
+ #endif // defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.20.0-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.20.0-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..df772b59588790bfc6fe2d85f583c0fee4f7dabc
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.20.0-upstream-macos-macros.patch
@@ -0,0 +1,29 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index bdb2eec..e8d7dbc 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -816,6 +816,11 @@
+ #undef TRUE
+ #pragma push_macro("FALSE")
+ #undef FALSE
++// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
++#pragma push_macro("UID_MAX")
++#undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index 58136a4..eb0fdc8 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -134,6 +134,8 @@
+ #pragma pop_macro("DOMAIN")
+ #pragma pop_macro("TRUE")
+ #pragma pop_macro("FALSE")
++#pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.21.12-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.21.12-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3a152f62bca6961a993c16dfbabf99c9860c44e1
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.21.12-upstream-macos-macros.patch
@@ -0,0 +1,25 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index f00daf7..d956db2 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -870,6 +870,8 @@
+ // Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
+ #pragma push_macro("UID_MAX")
+ #undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index e880fa5..f8968d9 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -144,6 +144,7 @@
+ #pragma pop_macro("TRUE")
+ #pragma pop_macro("FALSE")
+ #pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.21.9-upstream-macos-macros.patch b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.21.9-upstream-macos-macros.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3a152f62bca6961a993c16dfbabf99c9860c44e1
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/patches/protobuf-3.21.9-upstream-macos-macros.patch
@@ -0,0 +1,25 @@
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index f00daf7..d956db2 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -870,6 +870,8 @@
+ // Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
+ #pragma push_macro("UID_MAX")
+ #undef UID_MAX
++#pragma push_macro("GID_MAX")
++#undef GID_MAX
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
+diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
+index e880fa5..f8968d9 100644
+--- a/src/google/protobuf/port_undef.inc
++++ b/src/google/protobuf/port_undef.inc
+@@ -144,6 +144,7 @@
+ #pragma pop_macro("TRUE")
+ #pragma pop_macro("FALSE")
+ #pragma pop_macro("UID_MAX")
++#pragma pop_macro("GID_MAX")
+ #endif  // __APPLE__
+ 
+ #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/utils/ci/conan/recipes/protobuf/all/patches/upstream-pr-9437-msvc-runtime.patch b/utils/ci/conan/recipes/protobuf/all/patches/upstream-pr-9437-msvc-runtime.patch
new file mode 100644
index 0000000000000000000000000000000000000000..06cb0a97681d10a9348282a58ae114408c3f39b8
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/all/patches/upstream-pr-9437-msvc-runtime.patch
@@ -0,0 +1,17 @@
+Fix from Protobuf PR: https://github.com/protocolbuffers/protobuf/pull/9437
+
+--- a/cmake/CMakeLists.txt
++++ b/cmake/CMakeLists.txt
+@@ -182,7 +182,11 @@ else (protobuf_BUILD_SHARED_LIBS)
+   # making programmatic control difficult.  Prefer the functionality in newer
+   # CMake versions when available.
+   if(CMAKE_VERSION VERSION_GREATER 3.15 OR CMAKE_VERSION VERSION_EQUAL 3.15)
+-    set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
++    if (protobuf_MSVC_STATIC_RUNTIME)
++      set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
++    else()
++      set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>DLL)
++    endif()
+   else()
+     # In case we are building static libraries, link also the runtime library statically
+     # so that MSVCR*.DLL is not required at runtime.
diff --git a/utils/ci/conan/recipes/protobuf/config.yml b/utils/ci/conan/recipes/protobuf/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cafb5a884d7e8e5611a8ace10805da879739c688
--- /dev/null
+++ b/utils/ci/conan/recipes/protobuf/config.yml
@@ -0,0 +1,17 @@
+versions:
+  "3.21.12":
+    folder: all
+  "3.21.9":
+    folder: all
+  "3.20.3":
+    folder: all
+  "3.20.0":
+    folder: all
+  "3.19.6":
+    folder: all
+  "3.18.3":
+    folder: all
+  "3.17.1":
+    folder: all
+  "3.6.1":
+    folder: all
diff --git a/utils/ci/conan/recipes/spdlog/all/conandata.yml b/utils/ci/conan/recipes/spdlog/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b8131b03e011e354dc7c1325c01949f70dfaac72
--- /dev/null
+++ b/utils/ci/conan/recipes/spdlog/all/conandata.yml
@@ -0,0 +1,34 @@
+sources:
+  "1.14.1":
+    url: "https://github.com/gabime/spdlog/archive/v1.14.1.tar.gz"
+    sha256: "1586508029a7d0670dfcb2d97575dcdc242d3868a259742b69f100801ab4e16b"
+  "1.14.0":
+    url: "https://github.com/gabime/spdlog/archive/v1.14.0.tar.gz"
+    sha256: "429a6b73ade8285cb21f83bacf89e2821dd1720ea7faa3cb518ffe04b4e00efc"
+  "1.13.0":
+    url: "https://github.com/gabime/spdlog/archive/v1.13.0.tar.gz"
+    sha256: "534f2ee1a4dcbeb22249856edfb2be76a1cf4f708a20b0ac2ed090ee24cfdbc9"
+  "1.12.0":
+    url: "https://github.com/gabime/spdlog/archive/v1.12.0.tar.gz"
+    sha256: "4dccf2d10f410c1e2feaff89966bfc49a1abb29ef6f08246335b110e001e09a9"
+  "1.11.0":
+    url: "https://github.com/gabime/spdlog/archive/v1.11.0.tar.gz"
+    sha256: "ca5cae8d6cac15dae0ec63b21d6ad3530070650f68076f3a4a862ca293a858bb"
+  "1.10.0":
+    url: "https://github.com/gabime/spdlog/archive/v1.10.0.tar.gz"
+    sha256: "697f91700237dbae2326b90469be32b876b2b44888302afbc7aceb68bcfe8224"
+  "1.9.2":
+    url: "https://github.com/gabime/spdlog/archive/v1.9.2.tar.gz"
+    sha256: "6fff9215f5cb81760be4cc16d033526d1080427d236e86d70bb02994f85e3d38"
+  "1.9.1":
+    url: "https://github.com/gabime/spdlog/archive/v1.9.1.tar.gz"
+    sha256: "9a452cfa24408baccc9b2bc2d421d68172a7630c99e9504a14754be840d31a62"
+  "1.8.5":
+    url: "https://github.com/gabime/spdlog/archive/v1.8.5.tar.gz"
+    sha256: "944d0bd7c763ac721398dca2bb0f3b5ed16f67cef36810ede5061f35a543b4b8"
+patches:
+  "1.11.0":
+    - patch_file: "patches/1.11.0-0001-fix-fmt10-build.patch"
+      patch_description: "Fix fmt 10.0.0 build"
+      patch_type: "conan"
+      patch_source: "https://github.com/gabime/spdlog/pull/2694"
diff --git a/utils/ci/conan/recipes/spdlog/all/conanfile.py b/utils/ci/conan/recipes/spdlog/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..c5dec245ba075bd40cf4a51f891e2fccb412742e
--- /dev/null
+++ b/utils/ci/conan/recipes/spdlog/all/conanfile.py
@@ -0,0 +1,209 @@
+from conan import ConanFile
+from conan.errors import ConanInvalidConfiguration
+from conan.tools.build import check_min_cppstd
+from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout
+from conan.tools.files import get, copy, rmdir, replace_in_file, apply_conandata_patches, export_conandata_patches
+from conan.tools.microsoft import check_min_vs, is_msvc, is_msvc_static_runtime
+from conan.tools.scm import Version
+import os
+
+required_conan_version = ">=1.53.0"
+
+
+class SpdlogConan(ConanFile):
+    name = "spdlog"
+    package_type = "library"
+    description = "Fast C++ logging library"
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://github.com/gabime/spdlog"
+    topics = ("logger", "logging", "log-filtering", "file sink", "header-only")
+    license = "MIT"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+        "header_only": [True, False],
+        "wchar_support": [True, False],
+        "wchar_filenames": [True, False],
+        "no_exceptions": [True, False],
+        "use_std_fmt": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+        "header_only": False,
+        "wchar_support": False,
+        "wchar_filenames": False,
+        "no_exceptions": False,
+        "use_std_fmt": False,
+    }
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+        if Version(self.version) < "1.10.0":
+            del self.options.use_std_fmt
+
+    def configure(self):
+        if self.options.get_safe("shared") or self.options.header_only:
+            self.options.rm_safe("fPIC")
+        if self.options.header_only:
+            self.options.rm_safe("shared")
+
+    def layout(self):
+        cmake_layout(self, src_folder="src")
+
+    def requirements(self):
+        if not self.options.get_safe("use_std_fmt"):
+            self_version = Version(self.version)
+            fmt_version = "7.1.3"
+
+            if self_version >= "1.12.0":
+                fmt_version = "10.2.1"
+            elif self_version >= "1.11.0":
+                fmt_version = "10.0.0"
+            elif self_version >= "1.10.0":
+                fmt_version = "8.1.1"
+            elif self_version >= "1.9.0":
+                fmt_version = "8.0.1"
+            elif self_version >= "1.7.0":
+                fmt_version = "7.1.3"
+
+            self.requires(f"fmt/{fmt_version}", transitive_headers=True, transitive_libs=True)
+
+    def package_id(self):
+        if self.info.options.header_only:
+            self.info.clear()
+
+    @property
+    def _std_fmt_compilers_minimum_version(self):
+        return {
+            "gcc": "13",
+            "clang": "14",
+            "apple-clang": "15",
+            "Visual Studio": "16",
+            "msvc": "192",
+        }
+
+    def validate(self):
+        if self.settings.get_safe("compiler.cppstd"):
+            if self.options.get_safe("use_std_fmt"):
+                check_min_cppstd(self, 20)
+            else:
+                check_min_cppstd(self, 11)
+        if self.settings.os != "Windows" and (self.options.wchar_support or self.options.wchar_filenames):
+            raise ConanInvalidConfiguration("wchar is only supported under windows")
+        if self.options.get_safe("shared") and is_msvc_static_runtime(self):
+            raise ConanInvalidConfiguration("Visual Studio build for shared library with MT runtime is not supported")
+
+        if self.options.get_safe("use_std_fmt"):
+            check_min_vs(self, self._std_fmt_compilers_minimum_version["msvc"])
+            if not is_msvc(self):
+                compiler_name = str(self.settings.compiler)
+                minimum_version = self._std_fmt_compilers_minimum_version.get(compiler_name, False)
+                if not minimum_version:
+                    self.output.warning(f"{self.name} recipe lacks information about the {compiler_name} compiler support.")
+                elif Version(self.settings.compiler.version) < minimum_version:
+                    raise ConanInvalidConfiguration(
+                        f"{self.ref} using std::fmt requires std::fmt, which your compiler does not support."
+                    )
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version], strip_root=True)
+
+    def generate(self):
+        if not self.options.header_only:
+            tc = CMakeToolchain(self)
+            tc.variables["SPDLOG_BUILD_EXAMPLE"] = False
+            tc.variables["SPDLOG_BUILD_EXAMPLE_HO"] = False
+            tc.variables["SPDLOG_BUILD_TESTS"] = False
+            tc.variables["SPDLOG_BUILD_TESTS_HO"] = False
+            tc.variables["SPDLOG_BUILD_BENCH"] = False
+            if not self.options.get_safe("use_std_fmt"):
+                fmt = self.dependencies["fmt"]
+                tc.variables["SPDLOG_FMT_EXTERNAL"] = not fmt.options.header_only
+                tc.variables["SPDLOG_FMT_EXTERNAL_HO"] = fmt.options.header_only
+            tc.variables["SPDLOG_BUILD_SHARED"] = not self.options.header_only and self.options.shared
+            tc.variables["SPDLOG_WCHAR_SUPPORT"] = self.options.wchar_support
+            tc.variables["SPDLOG_WCHAR_FILENAMES"] = self.options.wchar_filenames
+            tc.variables["SPDLOG_INSTALL"] = True
+            tc.variables["SPDLOG_NO_EXCEPTIONS"] = self.options.no_exceptions
+            tc.variables["SPDLOG_USE_STD_FORMAT"] = self.options.get_safe("use_std_fmt")
+            if self.settings.os in ("iOS", "tvOS", "watchOS"):
+                tc.variables["SPDLOG_NO_TLS"] = True
+            tc.cache_variables["CMAKE_POLICY_DEFAULT_CMP0091"] = "NEW"
+            tc.generate()
+        cmake_deps = CMakeDeps(self)
+        cmake_deps.generate()
+
+    def _disable_werror(self):
+        replace_in_file(self, os.path.join(self.source_folder, "cmake", "utils.cmake"), "/WX", "")
+
+    def _use_cpp20_for_std_format(self):
+        # This is properly set in later versions
+        if self.options.get_safe("use_std_fmt") and Version(self.version) < "1.12":
+            replace_in_file(self, os.path.join(self.source_folder, "CMakeLists.txt"),
+                            "CMAKE_CXX_STANDARD 11", "CMAKE_CXX_STANDARD 20")
+
+    def build(self):
+        apply_conandata_patches(self)
+        self._disable_werror()
+        self._use_cpp20_for_std_format()
+        if not self.options.header_only:
+            cmake = CMake(self)
+            cmake.configure()
+            cmake.build()
+
+    def package(self):
+        copy(self, "LICENSE", dst=os.path.join(self.package_folder, "licenses"), src=self.source_folder)
+        if self.options.header_only:
+            copy(self,
+                 src=os.path.join(self.source_folder, "include"),
+                 pattern="*.h", dst=os.path.join(self.package_folder, "include"),
+                 # Unvendor bundled dependencies https://github.com/gabime/spdlog/commit/18495bf25dad3a4e8c2fe3777a5f79acecde27e3
+                 excludes=("spdlog/fmt/bundled/*"))
+        else:
+            cmake = CMake(self)
+            cmake.install()
+            rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
+            rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
+            rmdir(self, os.path.join(self.package_folder, "lib", "spdlog", "cmake"))
+
+    def package_info(self):
+        target = "spdlog_header_only" if self.options.header_only else "spdlog"
+        self.cpp_info.set_property("cmake_file_name", "spdlog")
+        self.cpp_info.set_property("cmake_target_name", f"spdlog::{target}")
+        self.cpp_info.set_property("pkg_config_name", "spdlog")
+
+        # TODO: back to global scope in conan v2 once legacy generators removed
+        self.cpp_info.components["libspdlog"].set_property("cmake_target_name", f"spdlog::{target}")
+        if self.options.get_safe("use_std_fmt"):
+            self.cpp_info.components["libspdlog"].defines.append("SPDLOG_USE_STD_FORMAT")
+        else:
+            self.cpp_info.components["libspdlog"].requires = ["fmt::fmt"]
+            self.cpp_info.components["libspdlog"].defines.append("SPDLOG_FMT_EXTERNAL")
+
+        if self.options.header_only:
+            self.cpp_info.components["libspdlog"].libdirs = []
+        else:
+            suffix = "d" if self.settings.build_type == "Debug" else ""
+            self.cpp_info.components["libspdlog"].libs = [f"spdlog{suffix}"]
+            self.cpp_info.components["libspdlog"].defines.append("SPDLOG_COMPILED_LIB")
+        if self.options.wchar_support:
+            self.cpp_info.components["libspdlog"].defines.append("SPDLOG_WCHAR_TO_UTF8_SUPPORT")
+        if self.options.wchar_filenames:
+            self.cpp_info.components["libspdlog"].defines.append("SPDLOG_WCHAR_FILENAMES")
+        if self.options.no_exceptions:
+            self.cpp_info.components["libspdlog"].defines.append("SPDLOG_NO_EXCEPTIONS")
+        if self.settings.os in ["Linux", "FreeBSD"]:
+            self.cpp_info.components["libspdlog"].system_libs = ["pthread"]
+        if self.options.header_only and self.settings.os in ("iOS", "tvOS", "watchOS"):
+            self.cpp_info.components["libspdlog"].defines.append("SPDLOG_NO_TLS")
+
+        self.cpp_info.names["cmake_find_package"] = "spdlog"
+        self.cpp_info.names["cmake_find_package_multi"] = "spdlog"
+        self.cpp_info.components["libspdlog"].names["cmake_find_package"] = target
+        self.cpp_info.components["libspdlog"].names["cmake_find_package_multi"] = target
diff --git a/utils/ci/conan/recipes/spdlog/all/patches/1.11.0-0001-fix-fmt10-build.patch b/utils/ci/conan/recipes/spdlog/all/patches/1.11.0-0001-fix-fmt10-build.patch
new file mode 100644
index 0000000000000000000000000000000000000000..613990e4eb0525890db968ca539dffe466b93e64
--- /dev/null
+++ b/utils/ci/conan/recipes/spdlog/all/patches/1.11.0-0001-fix-fmt10-build.patch
@@ -0,0 +1,34 @@
+From 576210a1363822a132657090b9f37e305bd0e2c2 Mon Sep 17 00:00:00 2001
+From: pwqbot <ding00000804@gmail.com>
+Date: Tue, 20 Jun 2023 10:41:48 +0800
+Subject: [PATCH] fix fmt build
+
+---
+ include/spdlog/common.h | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/include/spdlog/common.h b/include/spdlog/common.h
+index f97fd48c..00f4d728 100644
+--- a/include/spdlog/common.h
++++ b/include/spdlog/common.h
+@@ -160,12 +160,19 @@ using format_string_t = fmt::format_string<Args...>;
+ template<class T>
+ using remove_cvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
+ 
++template<typename Char>
++#    if FMT_VERSION >= 90101
++using fmt_runtime_string = fmt::runtime_format_string<Char>;
++#    else
++using fmt_runtime_string = fmt::basic_runtime<Char>;
++#    endif
++
+ // clang doesn't like SFINAE disabled constructor in std::is_convertible<> so have to repeat the condition from basic_format_string here,
+ // in addition, fmt::basic_runtime<Char> is only convertible to basic_format_string<Char> but not basic_string_view<Char>
+ template<class T, class Char = char>
+ struct is_convertible_to_basic_format_string
+     : std::integral_constant<bool,
+-          std::is_convertible<T, fmt::basic_string_view<Char>>::value || std::is_same<remove_cvref_t<T>, fmt::basic_runtime<Char>>::value>
++          std::is_convertible<T, fmt::basic_string_view<Char>>::value || std::is_same<remove_cvref_t<T>, fmt_runtime_string<Char>>::value>
+ {};
+ 
+ #    if defined(SPDLOG_WCHAR_FILENAMES) || defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT)
diff --git a/utils/ci/conan/recipes/spdlog/config.yml b/utils/ci/conan/recipes/spdlog/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c6637b62befb242ff777adabbabb2f726cf4a7da
--- /dev/null
+++ b/utils/ci/conan/recipes/spdlog/config.yml
@@ -0,0 +1,19 @@
+versions:
+  "1.14.1":
+    folder: "all"
+  "1.14.0":
+    folder: "all"
+  "1.13.0":
+    folder: "all"
+  "1.12.0":
+    folder: "all"
+  "1.11.0":
+    folder: "all"
+  "1.10.0":
+    folder: "all"
+  "1.9.2":
+    folder: "all"
+  "1.9.1":
+    folder: "all"
+  "1.8.5":
+    folder: "all"
diff --git a/utils/ci/conan/recipes/stochastics/all/conandata.yml b/utils/ci/conan/recipes/stochastics/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..85181a70a32a9ea17f749c4110b511441e8b46fa
--- /dev/null
+++ b/utils/ci/conan/recipes/stochastics/all/conandata.yml
@@ -0,0 +1,23 @@
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# conan data file for building stochastics library with Conan
+################################################################################
+
+sources:
+  "0.8.0":
+    url: https://gitlab.eclipse.org/eclipse/openpass/stochastics-library.git
+    sha256: b6d331a00c8569df7fe27f600eff59780c0b5cab
+  "0.9.0":
+    url: https://gitlab.eclipse.org/eclipse/openpass/stochastics-library.git
+    sha256: 04852059eb3032d8f45773bb1144f3e604f2e68a
+  "commitid":
+    url: https://gitlab.eclipse.org/eclipse/openpass/stochastics-library.git
diff --git a/utils/ci/conan/recipes/stochastics/all/conanfile.py b/utils/ci/conan/recipes/stochastics/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..d1b0ae36f5cbf8173e09121d19f37bd3f0e71c81
--- /dev/null
+++ b/utils/ci/conan/recipes/stochastics/all/conanfile.py
@@ -0,0 +1,82 @@
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# Install file for building stochastics with Conan
+################################################################################
+
+from conan import ConanFile
+from conan.tools.scm import Git
+from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps
+from conan.tools.files import rm, export_conandata_patches, apply_conandata_patches
+import os
+
+
+required_conan_version = ">=2.2.0"
+
+class StochasticsLibraryRecipe(ConanFile):
+    name = "stochastics"
+    settings = "os", "compiler", "build_type", "arch"
+    options = {"shared": [True, False], "fPIC": [True, False],
+               "commit_id_value":[None, "ANY"]}
+    default_options = {"shared": False, "fPIC": True,
+                        "commit_id_value": None}
+    exports_sources = "*"
+    no_copy_source = False
+    short_paths = True
+    commit = None
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        if self.options.commit_id_value:
+            self.commit = self.options.commit_id_value
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.generate()
+
+    def _get_url_sha(self):
+        if self.version != "commitid" :
+            url = self.conan_data["sources"][self.version]["url"]
+            self.commit = self.conan_data["sources"][self.version]["sha256"]
+        else:
+            url = self.conan_data["sources"]["commitid"]["url"]
+        return url
+
+    def source(self):
+        url = self._get_url_sha()
+        git = Git(self)
+        git.clone(url=url, target=self.name)
+        git.folder=self.name
+        git.checkout(commit=self.commit)
+
+    def build(self):
+        apply_conandata_patches(self)
+        cmake = CMake(self)
+        cmake.configure(build_script_folder=self.name)
+        cmake.build()
+
+    def package(self):
+        cmake = CMake(self)
+        cmake.install()
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "none")
+        self.cpp_info.set_property("cmake_module_file_name", "Stochastics")
+        self.cpp_info.set_property("cmake_file_name", "Stochastics")
+        self.cpp_info.set_property("cmake_target_name", "Stochastics::Stochastics")
diff --git a/utils/ci/conan/recipes/stochastics/config.yml b/utils/ci/conan/recipes/stochastics/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..710d0bcfa6a1859b6eb380fb3da1156533b8db15
--- /dev/null
+++ b/utils/ci/conan/recipes/stochastics/config.yml
@@ -0,0 +1,20 @@
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# config file for building stochastics library with Conan
+################################################################################
+versions:
+  "0.8.0":
+    folder: "all"
+  "0.9.0":
+    folder: "all"
+  "commitid":
+    folder: "all"
diff --git a/utils/ci/conan/recipe/units/all/conandata.yml b/utils/ci/conan/recipes/units/all/conandata.yml
similarity index 93%
rename from utils/ci/conan/recipe/units/all/conandata.yml
rename to utils/ci/conan/recipes/units/all/conandata.yml
index c518b3ab417b9185d1e93abc0195f0adaafb6b56..4b910fad9447ed219764d89d227e73cc64c4e99f 100644
--- a/utils/ci/conan/recipe/units/all/conandata.yml
+++ b/utils/ci/conan/recipes/units/all/conandata.yml
@@ -16,6 +16,8 @@ sources:
   "2.3.3":
     url: https://github.com/nholthaus/units.git
     sha256: "b04d436aaae198939e46194a43ea65b32e44ca6e"
+  "commitid":
+    url: https://github.com/nholthaus/units.git
 patches:
   "2.3.3":
     - patch_file: "patches/pascal-name-conflict.patch"
diff --git a/utils/ci/conan/recipe/units/all/conanfile.py b/utils/ci/conan/recipes/units/all/conanfile.py
similarity index 75%
rename from utils/ci/conan/recipe/units/all/conanfile.py
rename to utils/ci/conan/recipes/units/all/conanfile.py
index 38ed8f66c71891c87fa096fbc16d573414756c0a..1d221db9eb04adf344b31f7d4073e8aaaea82a27 100644
--- a/utils/ci/conan/recipe/units/all/conanfile.py
+++ b/utils/ci/conan/recipes/units/all/conanfile.py
@@ -24,18 +24,29 @@ class UnitsConan(ConanFile):
     settings = "os", "compiler", "build_type", "arch"
     options = {"shared": [True, False],
                "fPIC": [True, False],
-               "units_Tests": [True, False]}
+               "units_Tests": [True, False],
+               "commit_id_value":[None, "ANY"]
+               }
+
     default_options = {"shared": False,
                        "fPIC": True,
-                       "units_Tests": False}
+                       "units_Tests": False,
+                        "commit_id_value": None}
     exports_sources = "*"
     no_copy_source = False
     short_paths = True
+    commit = None
 
     def config_options(self):
         if self.settings.os == "Windows":
             del self.options.fPIC
 
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        if self.options.commit_id_value:
+            self.commit = self.options.commit_id_value
+
     def export_sources(self):
         export_conandata_patches(self)
 
@@ -45,20 +56,19 @@ class UnitsConan(ConanFile):
         tc.generate()
 
     def _get_url_sha(self):
-        if "CommitID" in self.version:
-            url = self.conan_data["sources"][self.version.split("_")[0]]["url"]
-            sha256 = self.version.split("_")[1]
-        else:
+        if self.version != "commitid" :
             url = self.conan_data["sources"][self.version]["url"]
-            sha256 = self.conan_data["sources"][self.version]["sha256"]
-        return url, sha256
+            self.commit = self.conan_data["sources"][self.version]["sha256"]
+        else:
+            url = self.conan_data["sources"]["commitid"]["url"]
+        return url
 
     def source(self):
-        url, sha256 = self._get_url_sha()
+        url = self._get_url_sha()
         git = Git(self)
         git.clone(url=url, target=self.name)
         git.folder=self.name
-        git.checkout(commit=sha256)
+        git.checkout(commit=self.commit)
 
     def build(self):
         apply_conandata_patches(self)
diff --git a/utils/ci/conan/recipe/units/all/patches/pascal-name-conflict.patch b/utils/ci/conan/recipes/units/all/patches/pascal-name-conflict.patch
similarity index 100%
rename from utils/ci/conan/recipe/units/all/patches/pascal-name-conflict.patch
rename to utils/ci/conan/recipes/units/all/patches/pascal-name-conflict.patch
diff --git a/utils/ci/conan/recipe/units/config.yml b/utils/ci/conan/recipes/units/config.yml
similarity index 95%
rename from utils/ci/conan/recipe/units/config.yml
rename to utils/ci/conan/recipes/units/config.yml
index 8a4ef3d16410473ed8d1fb936fcd9798891d0523..7cd883e5ccb30f53b2432fccdc4bfa5402012709 100644
--- a/utils/ci/conan/recipe/units/config.yml
+++ b/utils/ci/conan/recipes/units/config.yml
@@ -15,3 +15,5 @@
 versions:
   "2.3.3":
     folder: "all"
+  "commitid":
+    folder: "all"
diff --git a/utils/ci/conan/recipe/yase/all/conandata.yml b/utils/ci/conan/recipes/yase/all/conandata.yml
similarity index 98%
rename from utils/ci/conan/recipe/yase/all/conandata.yml
rename to utils/ci/conan/recipes/yase/all/conandata.yml
index 6a49f838e47b82ccab9ffc2f75df85504a570d7a..f0366162fb7a8f66734e4c3849654250e24e5a52 100644
--- a/utils/ci/conan/recipe/yase/all/conandata.yml
+++ b/utils/ci/conan/recipes/yase/all/conandata.yml
@@ -17,5 +17,5 @@ sources:
     url: https://gitlab.eclipse.org/eclipse/openpass/yase.git
     sha256: "d0c0e58d17358044cc9018c74308b45f6097ecfb"
 
-  "default":
+  "commitid":
     url: https://gitlab.eclipse.org/eclipse/openpass/yase.git
diff --git a/utils/ci/conan/recipe/yase/all/conanfile.py b/utils/ci/conan/recipes/yase/all/conanfile.py
similarity index 76%
rename from utils/ci/conan/recipe/yase/all/conanfile.py
rename to utils/ci/conan/recipes/yase/all/conanfile.py
index 2878d14159614e630563b68664036522dc86856b..f2b00508dc9ce16f2c2b757d63af18486dc51901 100644
--- a/utils/ci/conan/recipe/yase/all/conanfile.py
+++ b/utils/ci/conan/recipes/yase/all/conanfile.py
@@ -22,37 +22,44 @@ required_conan_version = ">=1.53"
 class YaseConan(ConanFile):
     name = "yase"
     settings = "os", "compiler", "build_type", "arch"
-    options = {"shared": [True, False], "fPIC": [True, False], "yase_TEST": [True, False]}
-    default_options = {"shared": True, "fPIC": False, "yase_TEST": False}
+    options = {"shared": [True, False], "fPIC": [True, False], "yase_TEST": [True, False],"commit_id_value":[None, "ANY"]}
+    default_options = {"shared": True, "fPIC": False, "yase_TEST": False,
+                       "commit_id_value": None}
     exports_sources = "*"
     short_paths = True
     no_copy_source = False
+    commit = None
 
     def config_options(self):
         if self.settings.os == "Windows":
             del self.options.fPIC
 
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        if self.options.commit_id_value:
+            self.commit = self.options.commit_id_value
+
     def generate(self):
         tc = CMakeToolchain(self)
         tc.cache_variables["Yase_BUILD_TESTS"] = self.options.yase_TEST
         tc.generate()
 
     def _get_url_sha(self):
-        if self.version in self.conan_data["sources"]:
+        if self.version != "commitid" :
             url = self.conan_data["sources"][self.version]["url"]
-            sha256 = self.conan_data["sources"][self.version]["sha256"]
+            self.commit = self.conan_data["sources"][self.version]["sha256"]
         else:
-            url = self.conan_data["sources"]["default"]["url"]
-            sha256 = self.version
+            url = self.conan_data["sources"]["commitid"]["url"]
 
-        return url, sha256
+        return url
 
     def source(self):
-        url, sha256 = self._get_url_sha()
+        url = self._get_url_sha()
         git = Git(self)
         git.clone(url=url, target=self.name)
         git.folder=self.name
-        git.checkout(commit=sha256)
+        git.checkout(commit=self.commit)
 
     def build(self):
         cmake = CMake(self)
@@ -66,4 +73,5 @@ class YaseConan(ConanFile):
         rm(self, "conandata.yml", self.package_folder)
 
     def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "none")
         self.cpp_info.components["agnostic_behavior_tree"].set_property("cmake_target_name", "Yase::libagnostic_behavior_tree")
diff --git a/utils/ci/conan/recipe/yase/config.yml b/utils/ci/conan/recipes/yase/config.yml
similarity index 95%
rename from utils/ci/conan/recipe/yase/config.yml
rename to utils/ci/conan/recipes/yase/config.yml
index 2ece7f2cbc73d51597464743351c78d4d78772ae..08b482d865a0adaaf86e2da65ed713f2645f94b9 100644
--- a/utils/ci/conan/recipe/yase/config.yml
+++ b/utils/ci/conan/recipes/yase/config.yml
@@ -15,3 +15,6 @@
 versions:
   "0.1":
     folder: "all"
+
+  "commitid":
+    folder: "all"
diff --git a/utils/ci/conan/recipes/zlib/all/conandata.yml b/utils/ci/conan/recipes/zlib/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e069fd42a135c41f11f2b0501b67ae18574557f7
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/conandata.yml
@@ -0,0 +1,57 @@
+sources:
+  "1.3.1":
+    url:
+      - "https://zlib.net/fossils/zlib-1.3.1.tar.gz"
+      - "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz"
+    sha256: "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23"
+  "1.3":
+    url:
+      - "https://zlib.net/fossils/zlib-1.3.tar.gz"
+      - "https://github.com/madler/zlib/releases/download/v1.3/zlib-1.3.tar.gz"
+    sha256: "ff0ba4c292013dbc27530b3a81e1f9a813cd39de01ca5e0f8bf355702efa593e"
+  "1.2.13":
+    url:
+      - "https://zlib.net/fossils/zlib-1.2.13.tar.gz"
+      - "https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz"
+    sha256: "b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30"
+  "1.2.12":
+    url: "https://zlib.net/fossils/zlib-1.2.12.tar.gz"
+    sha256: "91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9"
+  "1.2.11":
+    url: "https://zlib.net/fossils/zlib-1.2.11.tar.gz"
+    sha256: "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1"
+patches:
+  "1.3.1":
+    - patch_file: "patches/1.3.1/0001-fix-cmake.patch"
+      patch_description: "separate static/shared builds, disable debug suffix"
+      patch_type: "conan"
+  "1.3":
+    - patch_file: "patches/1.3/0001-fix-cmake.patch"
+      patch_description: "separate static/shared builds, disable debug suffix, disable building examples"
+      patch_type: "conan"
+  "1.2.13":
+    - patch_file: "patches/1.2.13/0001-Fix-cmake.patch"
+      patch_description: "separate static/shared builds, disable debug suffix, disable building examples"
+      patch_type: "conan"
+  "1.2.12":
+    - patch_file: "patches/1.2.x/0001-fix-cmake.patch"
+      patch_description: "separate static/shared builds, disable debug suffix, disable building examples"
+      patch_type: "conan"
+    - patch_file: "patches/1.2.x/0004-Fix-a-bug-when-getting-a-gzip-header-extra-field-wit.patch"
+      patch_description: "CVE-2022-37434: Fix a bug when getting a gzip header extra field with inflate()"
+      patch_type: "vulnerability"
+      patch_source: "https://github.com/madler/zlib/commit/eff308af425b67093bab25f80f1ae950166bece1"
+      sha256: "15e3c177dc2a034a22e02490a97ba5b1719aae3f8129a06c16d727b661d1650f"
+    - patch_file: "patches/1.2.x/0005-Fix-extra-field-processing-bug-that-dereferences-NUL.patch"
+      patch_description: "CVE-2022-37434: Fix extra field processing bug that dereferences NULL state->head"
+      patch_type: "vulnerability"
+      patch_source: "https://github.com/madler/zlib/commit/1eb7682f845ac9e9bf9ae35bbfb3bad5dacbd91d"
+      sha256: "cdd69eb3251728b1875c8ecae6427b50aa750b4045ef984ab79b6c07b7e6dd3a"
+  "1.2.11":
+    - patch_file: "patches/1.2.x/0001-fix-cmake.patch"
+      patch_description: "separate static/shared builds, disable debug suffix, disable building examples"
+      patch_type: "conan"
+    - patch_file: "patches/1.2.x/0003-gzguts-fix-widechar-condition.patch"
+      patch_description: "fix condition for WIDECHAR usage"
+      patch_type: "portability"
+      patch_source: "https://github.com/madler/zlib/issues/268"
diff --git a/utils/ci/conan/recipes/zlib/all/conanfile.py b/utils/ci/conan/recipes/zlib/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..834fcf918bf94198a078df2fa0f11e99a70e38b0
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/conanfile.py
@@ -0,0 +1,110 @@
+from conan import ConanFile
+from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
+from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, load, replace_in_file, save
+from conan.tools.scm import Version
+import os
+
+required_conan_version = ">=1.53.0"
+
+
+class ZlibConan(ConanFile):
+    name = "zlib"
+    package_type = "library"
+    url = "https://github.com/conan-io/conan-center-index"
+    homepage = "https://zlib.net"
+    license = "Zlib"
+    description = ("A Massively Spiffy Yet Delicately Unobtrusive Compression Library "
+                   "(Also Free, Not to Mention Unencumbered by Patents)")
+    topics = ("zlib", "compression")
+
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+    }
+
+    @property
+    def _is_mingw(self):
+        return self.settings.os == "Windows" and self.settings.compiler == "gcc"
+
+    def export_sources(self):
+        export_conandata_patches(self)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            del self.options.fPIC
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+        self.settings.rm_safe("compiler.libcxx")
+        self.settings.rm_safe("compiler.cppstd")
+
+    def layout(self):
+        cmake_layout(self, src_folder="src")
+
+    def source(self):
+        get(self, **self.conan_data["sources"][self.version],
+            destination=self.source_folder, strip_root=True)
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.variables["SKIP_INSTALL_ALL"] = False
+        tc.variables["SKIP_INSTALL_LIBRARIES"] = False
+        tc.variables["SKIP_INSTALL_HEADERS"] = False
+        tc.variables["SKIP_INSTALL_FILES"] = True
+        # Correct for misuse of "${CMAKE_INSTALL_PREFIX}/" in CMakeLists.txt
+        tc.variables["INSTALL_LIB_DIR"] = "lib"
+        tc.variables["INSTALL_INC_DIR"] = "include"
+        tc.variables["ZLIB_BUILD_EXAMPLES"] = False
+        tc.generate()
+
+    def _patch_sources(self):
+        apply_conandata_patches(self)
+
+        is_apple_clang12 = self.settings.compiler == "apple-clang" and Version(self.settings.compiler.version) >= "12.0"
+        if not is_apple_clang12:
+            for filename in ['zconf.h', 'zconf.h.cmakein', 'zconf.h.in']:
+                filepath = os.path.join(self.source_folder, filename)
+                replace_in_file(self, filepath,
+                                      '#ifdef HAVE_UNISTD_H    '
+                                      '/* may be set to #if 1 by ./configure */',
+                                      '#if defined(HAVE_UNISTD_H) && (1-HAVE_UNISTD_H-1 != 0)')
+                replace_in_file(self, filepath,
+                                      '#ifdef HAVE_STDARG_H    '
+                                      '/* may be set to #if 1 by ./configure */',
+                                      '#if defined(HAVE_STDARG_H) && (1-HAVE_STDARG_H-1 != 0)')
+
+    def build(self):
+        self._patch_sources()
+        cmake = CMake(self)
+        cmake.configure()
+        cmake.build()
+
+    def _extract_license(self):
+        tmp = load(self, os.path.join(self.source_folder, "zlib.h"))
+        license_contents = tmp[2:tmp.find("*/", 1)]
+        return license_contents
+
+    def package(self):
+        save(self, os.path.join(self.package_folder, "licenses", "LICENSE"), self._extract_license())
+        cmake = CMake(self)
+        cmake.install()
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_find_mode", "both")
+        self.cpp_info.set_property("cmake_file_name", "ZLIB")
+        self.cpp_info.set_property("cmake_target_name", "ZLIB::ZLIB")
+        self.cpp_info.set_property("pkg_config_name", "zlib")
+        if self.settings.os == "Windows" and not self._is_mingw:
+            libname = "zdll" if self.options.shared else "zlib"
+        else:
+            libname = "z"
+        self.cpp_info.libs = [libname]
+
+        self.cpp_info.names["cmake_find_package"] = "ZLIB"
+        self.cpp_info.names["cmake_find_package_multi"] = "ZLIB"
diff --git a/utils/ci/conan/recipes/zlib/all/patches/1.2.13/0001-Fix-cmake.patch b/utils/ci/conan/recipes/zlib/all/patches/1.2.13/0001-Fix-cmake.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a0748ec590d9052476378a543ec995ab0bbec2b6
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/patches/1.2.13/0001-Fix-cmake.patch
@@ -0,0 +1,118 @@
+From 9a709a43549fbe23ca41eeb450d4c71e3b78c8c4 Mon Sep 17 00:00:00 2001
+From: Mikhail Lappo <miklelappo@gmail.com>
+Date: Fri, 14 Oct 2022 13:29:56 +0200
+Subject: [PATCH] Fix cmake
+
+---
+ CMakeLists.txt | 33 +++++++++++++++++++++------------
+ 1 file changed, 21 insertions(+), 12 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index b412dc7..a5284ed 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,4 +1,4 @@
+-cmake_minimum_required(VERSION 2.4.4)
++cmake_minimum_required(VERSION 3.0) # it's important to have https://cmake.org/cmake/help/latest/policy/CMP0042.html#policy:CMP0042
+ set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
+ 
+ project(zlib C)
+@@ -57,7 +57,6 @@ endif()
+ check_include_file(unistd.h Z_HAVE_UNISTD_H)
+ 
+ if(MSVC)
+-    set(CMAKE_DEBUG_POSTFIX "d")
+     add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
+     add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
+     include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+@@ -80,7 +79,7 @@ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
+ 		${ZLIB_PC} @ONLY)
+ configure_file(	${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
+ 		${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
+-include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
++include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+ 
+ 
+ #============================================================================
+@@ -120,7 +119,7 @@ set(ZLIB_SRCS
+     zutil.c
+ )
+ 
+-if(NOT MINGW)
++if(MSVC)
+     set(ZLIB_DLL_SRCS
+         win32/zlib1.rc # If present will override custom build rule below.
+     )
+@@ -131,7 +130,7 @@ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
+ string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
+     "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})
+ 
+-if(MINGW)
++if(WIN32 AND NOT MSVC)
+     # This gets us DLL resource information when compiling on MinGW.
+     if(NOT CMAKE_RC_COMPILER)
+         set(CMAKE_RC_COMPILER windres.exe)
+@@ -145,12 +144,15 @@ if(MINGW)
+                             -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
+                             -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
+     set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
+-endif(MINGW)
++endif()
+ 
++if(BUILD_SHARED_LIBS)
+ add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+-add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+ set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
+ set_target_properties(zlib PROPERTIES SOVERSION 1)
++else()
++add_library(zlib STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
++endif()
+ 
+ if(NOT CYGWIN)
+     # This property causes shared libraries on Linux to have the full version
+@@ -163,19 +165,24 @@ if(NOT CYGWIN)
+     set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
+ endif()
+ 
+-if(UNIX)
++if(WIN32 AND NOT MINGW)
++    if(BUILD_SHARED_LIBS)
++        set_target_properties(zlib PROPERTIES ARCHIVE_OUTPUT_NAME zdll)
++    endif()
++else()
+     # On unix-like platforms the library is almost always called libz
+-   set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
++   set_target_properties(zlib PROPERTIES OUTPUT_NAME z)
+    if(NOT APPLE)
+      set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
+    endif()
+-elseif(BUILD_SHARED_LIBS AND WIN32)
++endif()
++if(BUILD_SHARED_LIBS AND WIN32)
+     # Creates zlib1.dll when building shared library version
+-    set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
++    set_target_properties(zlib PROPERTIES PREFIX "" RUNTIME_OUTPUT_NAME "zlib1")
+ endif()
+ 
+ if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
+-    install(TARGETS zlib zlibstatic
++    install(TARGETS zlib
+         RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+         ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
+         LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
+@@ -194,6 +201,7 @@ endif()
+ # Example binaries
+ #============================================================================
+ 
++if(0)
+ add_executable(example test/example.c)
+ target_link_libraries(example zlib)
+ add_test(example example)
+@@ -211,3 +219,4 @@ if(HAVE_OFF64_T)
+     target_link_libraries(minigzip64 zlib)
+     set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
+ endif()
++endif()
+-- 
+2.24.3 (Apple Git-128)
+
diff --git a/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0001-fix-cmake.patch b/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0001-fix-cmake.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f99f0b52196825f6a7ec36650858d3c49dd69990
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0001-fix-cmake.patch
@@ -0,0 +1,104 @@
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,4 +1,4 @@
+-cmake_minimum_required(VERSION 2.4.4)
++cmake_minimum_required(VERSION 3.0) # it's important to have https://cmake.org/cmake/help/latest/policy/CMP0042.html#policy:CMP0042
+ set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
+ 
+ project(zlib C)
+@@ -60,7 +60,6 @@ endif()
+ check_include_file(unistd.h Z_HAVE_UNISTD_H)
+ 
+ if(MSVC)
+-    set(CMAKE_DEBUG_POSTFIX "d")
+     add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
+     add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
+     include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+@@ -83,7 +82,7 @@ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
+ 		${ZLIB_PC} @ONLY)
+ configure_file(	${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
+ 		${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
+-include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
++include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+ 
+ 
+ #============================================================================
+@@ -123,7 +122,7 @@ set(ZLIB_SRCS
+     zutil.c
+ )
+ 
+-if(NOT MINGW)
++if(MSVC)
+     set(ZLIB_DLL_SRCS
+         win32/zlib1.rc # If present will override custom build rule below.
+     )
+@@ -167,7 +166,7 @@ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
+ string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
+     "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})
+ 
+-if(MINGW)
++if(WIN32 AND NOT MSVC)
+     # This gets us DLL resource information when compiling on MinGW.
+     if(NOT CMAKE_RC_COMPILER)
+         set(CMAKE_RC_COMPILER windres.exe)
+@@ -181,12 +180,15 @@ if(MINGW)
+                             -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
+                             -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
+     set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
+-endif(MINGW)
++endif()
+ 
++if(BUILD_SHARED_LIBS)
+ add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+-add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+ set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
+ set_target_properties(zlib PROPERTIES SOVERSION 1)
++else()
++add_library(zlib STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
++endif()
+ 
+ if(NOT CYGWIN)
+     # This property causes shared libraries on Linux to have the full version
+@@ -199,19 +201,24 @@ if(NOT CYGWIN)
+     set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
+ endif()
+ 
+-if(UNIX)
++if(WIN32 AND NOT MINGW)
++    if(BUILD_SHARED_LIBS)
++        set_target_properties(zlib PROPERTIES ARCHIVE_OUTPUT_NAME zdll)
++    endif()
++else()
+     # On unix-like platforms the library is almost always called libz
+-   set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
++   set_target_properties(zlib PROPERTIES OUTPUT_NAME z)
+    if(NOT APPLE)
+      set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
+    endif()
+-elseif(BUILD_SHARED_LIBS AND WIN32)
++endif()
++if(BUILD_SHARED_LIBS AND WIN32)
+     # Creates zlib1.dll when building shared library version
+-    set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
++    set_target_properties(zlib PROPERTIES PREFIX "" RUNTIME_OUTPUT_NAME "zlib1")
+ endif()
+ 
+ if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
+-    install(TARGETS zlib zlibstatic
++    install(TARGETS zlib
+         RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+         ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
+         LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
+@@ -230,6 +237,7 @@ endif()
+ # Example binaries
+ #============================================================================
+ 
++if(0)
+ add_executable(example test/example.c)
+ target_link_libraries(example zlib)
+ add_test(example example)
+@@ -247,3 +255,4 @@ if(HAVE_OFF64_T)
+     target_link_libraries(minigzip64 zlib)
+     set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
+ endif()
++endif()
diff --git a/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0003-gzguts-fix-widechar-condition.patch b/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0003-gzguts-fix-widechar-condition.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3de4978c30661734f5fbd7807f230fcedf83c508
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0003-gzguts-fix-widechar-condition.patch
@@ -0,0 +1,13 @@
+diff --git a/gzguts.h b/gzguts.h
+index 990a4d2..6378d46 100644
+--- a/gzguts.h
++++ b/gzguts.h
+@@ -39,7 +39,7 @@
+ #  include <io.h>
+ #endif
+ 
+-#if defined(_WIN32) || defined(__CYGWIN__)
++#if defined(_WIN32)
+ #  define WIDECHAR
+ #endif
+ 
diff --git a/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0004-Fix-a-bug-when-getting-a-gzip-header-extra-field-wit.patch b/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0004-Fix-a-bug-when-getting-a-gzip-header-extra-field-wit.patch
new file mode 100644
index 0000000000000000000000000000000000000000..80eed3e0c3e95da7559506b309b72a0758fad4d3
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0004-Fix-a-bug-when-getting-a-gzip-header-extra-field-wit.patch
@@ -0,0 +1,35 @@
+From eff308af425b67093bab25f80f1ae950166bece1 Mon Sep 17 00:00:00 2001
+From: Mark Adler <fork@madler.net>
+Date: Sat, 30 Jul 2022 15:51:11 -0700
+Subject: [PATCH] Fix a bug when getting a gzip header extra field with
+ inflate().
+
+If the extra field was larger than the space the user provided with
+inflateGetHeader(), and if multiple calls of inflate() delivered
+the extra header data, then there could be a buffer overflow of the
+provided space. This commit assures that provided space is not
+exceeded.
+---
+ inflate.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/inflate.c b/inflate.c
+index 7be8c63..7a72897 100644
+--- a/inflate.c
++++ b/inflate.c
+@@ -763,9 +763,10 @@ int flush;
+                 copy = state->length;
+                 if (copy > have) copy = have;
+                 if (copy) {
++                    len = state->head->extra_len - state->length;
+                     if (state->head != Z_NULL &&
+-                        state->head->extra != Z_NULL) {
+-                        len = state->head->extra_len - state->length;
++                        state->head->extra != Z_NULL &&
++                        len < state->head->extra_max) {
+                         zmemcpy(state->head->extra + len, next,
+                                 len + copy > state->head->extra_max ?
+                                 state->head->extra_max - len : copy);
+-- 
+2.25.1
+
diff --git a/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0005-Fix-extra-field-processing-bug-that-dereferences-NUL.patch b/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0005-Fix-extra-field-processing-bug-that-dereferences-NUL.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f34c4019fbf355210640f546abf14f1eeae01c41
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/patches/1.2.x/0005-Fix-extra-field-processing-bug-that-dereferences-NUL.patch
@@ -0,0 +1,32 @@
+From 1eb7682f845ac9e9bf9ae35bbfb3bad5dacbd91d Mon Sep 17 00:00:00 2001
+From: Mark Adler <fork@madler.net>
+Date: Mon, 8 Aug 2022 10:50:09 -0700
+Subject: [PATCH] Fix extra field processing bug that dereferences NULL
+ state->head.
+
+The recent commit to fix a gzip header extra field processing bug
+introduced the new bug fixed here.
+---
+ inflate.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/inflate.c b/inflate.c
+index 7a72897..2a3c4fe 100644
+--- a/inflate.c
++++ b/inflate.c
+@@ -763,10 +763,10 @@ int flush;
+                 copy = state->length;
+                 if (copy > have) copy = have;
+                 if (copy) {
+-                    len = state->head->extra_len - state->length;
+                     if (state->head != Z_NULL &&
+                         state->head->extra != Z_NULL &&
+-                        len < state->head->extra_max) {
++                        (len = state->head->extra_len - state->length) <
++                            state->head->extra_max) {
+                         zmemcpy(state->head->extra + len, next,
+                                 len + copy > state->head->extra_max ?
+                                 state->head->extra_max - len : copy);
+-- 
+2.25.1
+
diff --git a/utils/ci/conan/recipes/zlib/all/patches/1.3.1/0001-fix-cmake.patch b/utils/ci/conan/recipes/zlib/all/patches/1.3.1/0001-fix-cmake.patch
new file mode 100644
index 0000000000000000000000000000000000000000..036af67bc9b3842fa2dfe8f56247190da3c87090
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/patches/1.3.1/0001-fix-cmake.patch
@@ -0,0 +1,81 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 15ceebe..2f08574 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -59,7 +59,6 @@ endif()
+ check_include_file(unistd.h Z_HAVE_UNISTD_H)
+ 
+ if(MSVC)
+-    set(CMAKE_DEBUG_POSTFIX "d")
+     add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
+     add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
+     include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+@@ -122,7 +121,7 @@ set(ZLIB_SRCS
+     zutil.c
+ )
+ 
+-if(NOT MINGW)
++if(MSVC)
+     set(ZLIB_DLL_SRCS
+         win32/zlib1.rc # If present will override custom build rule below.
+     )
+@@ -133,7 +132,7 @@ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
+ string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
+     "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})
+ 
+-if(MINGW)
++if(WIN32 AND NOT MSVC)
+     # This gets us DLL resource information when compiling on MinGW.
+     if(NOT CMAKE_RC_COMPILER)
+         set(CMAKE_RC_COMPILER windres.exe)
+@@ -147,14 +146,16 @@ if(MINGW)
+                             -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
+                             -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
+     set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
+-endif(MINGW)
++endif()
+ 
++if(BUILD_SHARED_LIBS)
+ add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+ target_include_directories(zlib PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+-add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+-target_include_directories(zlibstatic PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+ set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
+ set_target_properties(zlib PROPERTIES SOVERSION 1)
++else()
++add_library(zlib STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
++endif()
+ 
+ if(NOT CYGWIN)
+     # This property causes shared libraries on Linux to have the full version
+@@ -167,19 +168,25 @@ if(NOT CYGWIN)
+     set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
+ endif()
+ 
+-if(UNIX)
++if(WIN32 AND NOT MINGW)
++    if(BUILD_SHARED_LIBS)
++        set_target_properties(zlib PROPERTIES ARCHIVE_OUTPUT_NAME zdll)
++    endif()
++else()
+     # On unix-like platforms the library is almost always called libz
+-   set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
++   set_target_properties(zlib PROPERTIES OUTPUT_NAME z)
+    if(NOT APPLE AND NOT(CMAKE_SYSTEM_NAME STREQUAL AIX))
+      set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
+    endif()
+-elseif(BUILD_SHARED_LIBS AND WIN32)
++endif()
++if(BUILD_SHARED_LIBS AND WIN32)
+     # Creates zlib1.dll when building shared library version
+-    set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
++    set_target_properties(zlib PROPERTIES PREFIX "" RUNTIME_OUTPUT_NAME "zlib1")
+ endif()
+ 
++
+ if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
+-    install(TARGETS zlib zlibstatic
++    install(TARGETS zlib
+         RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+         ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
+         LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
diff --git a/utils/ci/conan/recipes/zlib/all/patches/1.3/0001-fix-cmake.patch b/utils/ci/conan/recipes/zlib/all/patches/1.3/0001-fix-cmake.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b2aa69d0684cf86ca65aec1a5d1b6b51c86295c5
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/patches/1.3/0001-fix-cmake.patch
@@ -0,0 +1,92 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 7f1b69f..618ea02 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -57,7 +57,6 @@ endif()
+ check_include_file(unistd.h Z_HAVE_UNISTD_H)
+ 
+ if(MSVC)
+-    set(CMAKE_DEBUG_POSTFIX "d")
+     add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
+     add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
+     include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+@@ -120,7 +119,7 @@ set(ZLIB_SRCS
+     zutil.c
+ )
+ 
+-if(NOT MINGW)
++if(MSVC)
+     set(ZLIB_DLL_SRCS
+         win32/zlib1.rc # If present will override custom build rule below.
+     )
+@@ -131,7 +130,7 @@ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
+ string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
+     "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})
+ 
+-if(MINGW)
++if(WIN32 AND NOT MSVC)
+     # This gets us DLL resource information when compiling on MinGW.
+     if(NOT CMAKE_RC_COMPILER)
+         set(CMAKE_RC_COMPILER windres.exe)
+@@ -145,12 +144,16 @@ if(MINGW)
+                             -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
+                             -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
+     set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
+-endif(MINGW)
++endif()
+ 
++if(BUILD_SHARED_LIBS)
+ add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+ add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+ set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
+ set_target_properties(zlib PROPERTIES SOVERSION 1)
++else()
++add_library(zlib STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
++endif()
+ 
+ if(NOT CYGWIN)
+     # This property causes shared libraries on Linux to have the full version
+@@ -163,19 +166,24 @@ if(NOT CYGWIN)
+     set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
+ endif()
+ 
+-if(UNIX)
++if(WIN32 AND NOT MINGW)
++    if(BUILD_SHARED_LIBS)
++        set_target_properties(zlib PROPERTIES ARCHIVE_OUTPUT_NAME zdll)
++    endif()
++else()
+     # On unix-like platforms the library is almost always called libz
+-   set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
++   set_target_properties(zlib PROPERTIES OUTPUT_NAME z)
+    if(NOT APPLE)
+      set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
+    endif()
+-elseif(BUILD_SHARED_LIBS AND WIN32)
++endif()
++if(BUILD_SHARED_LIBS AND WIN32)
+     # Creates zlib1.dll when building shared library version
+-    set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
++    set_target_properties(zlib PROPERTIES PREFIX "" RUNTIME_OUTPUT_NAME "zlib1")
+ endif()
+ 
+ if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
+-    install(TARGETS zlib zlibstatic
++    install(TARGETS zlib
+         RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+         ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
+         LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
+@@ -193,7 +201,7 @@ endif()
+ #============================================================================
+ # Example binaries
+ #============================================================================
+-
++if(0)
+ add_executable(example test/example.c)
+ target_link_libraries(example zlib)
+ add_test(example example)
+@@ -211,3 +219,4 @@ if(HAVE_OFF64_T)
+     target_link_libraries(minigzip64 zlib)
+     set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
+ endif()
++endif()
diff --git a/utils/ci/conan/recipes/zlib/all/patches/1.3/0002-gzguts-xcode12-compile-fix.patch b/utils/ci/conan/recipes/zlib/all/patches/1.3/0002-gzguts-xcode12-compile-fix.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d299f4962fa59db7e18a45a024c2dda2e1bce26c
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/all/patches/1.3/0002-gzguts-xcode12-compile-fix.patch
@@ -0,0 +1,15 @@
+diff --git a/gzguts.h b/gzguts.h
+index f937504..c4654b5 100644
+--- a/gzguts.h
++++ b/gzguts.h
+@@ -25,6 +25,10 @@
+ #  include <limits.h>
+ #endif
+ 
++#ifdef __APPLE__
++#include <unistd.h>
++#endif
++
+ #ifndef _POSIX_SOURCE
+ #  define _POSIX_SOURCE
+ #endif
diff --git a/utils/ci/conan/recipes/zlib/config.yml b/utils/ci/conan/recipes/zlib/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..79c9c7d4f77854589317ead456150a0be043a38b
--- /dev/null
+++ b/utils/ci/conan/recipes/zlib/config.yml
@@ -0,0 +1,11 @@
+versions:
+  "1.3.1":
+    folder: all
+  "1.3":
+    folder: all
+  "1.2.13":
+    folder: all
+  "1.2.12":
+    folder: all
+  "1.2.11":
+    folder: all
diff --git a/utils/ci/conan/recipes/zulu-openjdk/all/conandata.yml b/utils/ci/conan/recipes/zulu-openjdk/all/conandata.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9e14b09c940cf15ef0fd000b9feaef17c416fb60
--- /dev/null
+++ b/utils/ci/conan/recipes/zulu-openjdk/all/conandata.yml
@@ -0,0 +1,96 @@
+sources:
+  "21.0.1":
+    "Windows":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu21.30.15-ca-jdk21.0.1-win_x64.zip"
+        sha256: "f6541ceed2eb0b793fd27f22d9f8192ad1c9c4c53e528dd0a1e6ec8d7c3a33d3"
+    "Linux":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu21.30.15-ca-jdk21.0.1-linux_x64.tar.gz"
+        sha256: "bf4842dd3a17cfe85523be5848b5ec3bc3d811afc74feab791befa4c895c4449"
+      "armv8":
+        url: "https://cdn.azul.com/zulu/bin/zulu21.30.15-ca-jdk21.0.1-linux_aarch64.tar.gz"
+        sha256: "00863e2b9910a5ed4f55183b89459d2162147e871d96ab532479ab06d9fae03b"
+    "Macos":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu21.30.15-ca-jdk21.0.1-macosx_x64.tar.gz"
+        sha256: "667e3945ffd394317b5faf1f5bd4847d1f1d091f76543df27d9b3a2ee7bf7a7e"
+      "armv8":
+        url: "https://cdn.azul.com/zulu/bin/zulu21.30.15-ca-jdk21.0.1-macosx_aarch64.tar.gz"
+        sha256: "6e89b6ed60c0efcc1b5bb7c6b36710ce746751b316a16cc3f9915470c4eb2a00"
+  "17.0.9":
+    "Windows":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu17.46.19-ca-jdk17.0.9-win_x64.zip"
+        sha256: "32e110628ea0bd750b84e0f937e7c98874505e76a0590d759565dfa803f89ccf"
+    "Linux":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu17.46.19-ca-jdk17.0.9-linux_x64.tar.gz"
+        sha256: "5317630424ee4e4d2c1024240d2e6f94a7c06d17b01dd36859df4a4d679fc287"
+      "armv8":
+        url: "https://cdn.azul.com/zulu/bin/zulu17.46.19-ca-jdk17.0.9-linux_aarch64.tar.gz"
+        sha256: "90062201e7911696a449431a61dc0a55cd10cda516a9f2db54c410633a79302a"
+    "Macos":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu17.46.19-ca-jdk17.0.9-macosx_x64.tar.gz"
+        sha256: "19271b74c3f3b21f4978eda8f09908c063c456cea57265d71475ceefef5aa0ac"
+      "armv8":
+        url: "https://cdn.azul.com/zulu/bin/zulu17.46.19-ca-jdk17.0.9-macosx_aarch64.tar.gz"
+        sha256: "d6837676e55b97772b6512e253fdaf8ab282bb216c0f8366b6c5905cd02b5056"
+  "11.0.19":
+    "Windows":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.64.19-ca-jdk11.0.19-win_x64.zip"
+        sha256: "19ef5239adddd63b47dd574119eeaacd116376e1a7a2449d013c2d23987c78a0"
+    "Linux":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.64.19-ca-jdk11.0.19-linux_x64.tar.gz"
+        sha256: "8b963105ad195c8f622b34dbac663ce11e5f73f4c84edd6dd1d364a26798b540"
+      "armv8":
+        url: "https://cdn.azul.com/zulu-embedded/bin/zulu11.64.19-ca-jdk11.0.19-linux_aarch64.tar.gz"
+        sha256: "edfea52958b765732e4ee97b821e78d6ebf66a69fc21bdf6035c38b0e2939820"
+    "Macos":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.64.19-ca-jdk11.0.19-macosx_x64.tar.gz"
+        sha256: "222630bd333f901f53cd0d2341975ec9a31fd6846166d4ce86e8a57a3d734ac5"
+      "armv8":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.64.19-ca-jdk11.0.19-macosx_aarch64.tar.gz"
+        sha256: "f0d84d5f1ae9d67bbb28d4e97fe365692fcdf8f5ad49c57b525281ebb5807577"
+  "11.0.15":
+    "Windows":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-win_x64.zip"
+        sha256: "a106c77389a63b6bd963a087d5f01171bd32aa3ee7377ecef87531390dcb9050"
+    "Linux":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-linux_x64.tar.gz"
+        sha256: "e064b61d93304012351242bf0823c6a2e41d9e28add7ea7f05378b7243d34247"
+      "armv8":
+        url: "https://cdn.azul.com/zulu-embedded/bin/zulu11.56.19-ca-jdk11.0.15-linux_aarch64.tar.gz"
+        sha256: "fc7c41a0005180d4ca471c90d01e049469e0614cf774566d4cf383caa29d1a97"
+    "Macos":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_x64.tar.gz"
+        sha256: "2614e5c5de8e989d4d81759de4c333aa5b867b17ab9ee78754309ba65c7f6f55"
+      "armv8":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_aarch64.tar.gz"
+        sha256: "6bb0d2c6e8a29dcd9c577bbb2986352ba12481a9549ac2c0bcfd00ed60e538d2"
+  "11.0.12":
+    "Windows":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.50.19-ca-jdk11.0.12-win_x64.zip"
+        sha256: "42ae65e75d615a3f06a674978e1fa85fdf078cad94e553fee3e779b2b42bb015"
+    "Linux":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.50.19-ca-jdk11.0.12-linux_x64.tar.gz"
+        sha256: "b8e8a63b79bc312aa90f3558edbea59e71495ef1a9c340e38900dd28a1c579f3"
+      "armv8":
+        url: "https://cdn.azul.com/zulu-embedded/bin/zulu11.50.19-ca-jdk11.0.12-linux_aarch64.tar.gz"
+        sha256: "61254688067454d3ccf0ef25993b5dcab7b56c8129e53b73566c28a8dd4d48fb"
+    "Macos":
+      "x86_64":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.50.19-ca-jdk11.0.12-macosx_x64.tar.gz"
+        sha256: "0b8c8b7cf89c7c55b7e2239b47201d704e8d2170884875b00f3103cf0662d6d7"
+      "armv8":
+        url: "https://cdn.azul.com/zulu/bin/zulu11.50.19-ca-jdk11.0.12-macosx_aarch64.tar.gz"
+        sha256: "e908a0b4c0da08d41c3e19230f819b364ff2e5f1dafd62d2cf991a85a34d3a17"
diff --git a/utils/ci/conan/recipes/zulu-openjdk/all/conanfile.py b/utils/ci/conan/recipes/zulu-openjdk/all/conanfile.py
new file mode 100644
index 0000000000000000000000000000000000000000..648597913dd65858463cd1bc30f16eaae8441f19
--- /dev/null
+++ b/utils/ci/conan/recipes/zulu-openjdk/all/conanfile.py
@@ -0,0 +1,77 @@
+from conan import ConanFile
+from conan.errors import ConanInvalidConfiguration
+from conan.tools.files import get, copy
+import os
+
+required_conan_version = ">=1.53.0"
+
+class ZuluOpenJDK(ConanFile):
+    name = "zulu-openjdk"
+    description = "A OpenJDK distribution"
+    license = "https://www.azul.com/products/zulu-and-zulu-enterprise/zulu-terms-of-use/"
+    url = "https://github.com/conan-io/conan-center-index/"
+    homepage = "https://www.azul.com"
+    topics = ("java", "jdk", "openjdk")
+    package_type = "application"
+    settings = "os", "arch", "compiler", "build_type"
+
+    @property
+    def _settings_build(self):
+        return getattr(self, "settings_build", self.settings)
+
+    @property
+    def _jni_folder(self):
+        folder = {"Linux": "linux", "Macos": "darwin", "Windows": "win32"}.get(str(self._settings_build.os))
+        return os.path.join("include", folder)
+
+    def package_id(self):
+        del self.info.settings.compiler
+        del self.info.settings.build_type
+
+    def validate(self):
+        supported_archs = ["x86_64", "armv8"]
+        if self._settings_build.arch not in supported_archs:
+            raise ConanInvalidConfiguration(f"Unsupported Architecture ({self._settings_build.arch}). "
+                                            f"This version {self.version} currently only supports {supported_archs}.")
+        supported_os = ["Windows", "Macos", "Linux"]
+        if self._settings_build.os not in supported_os:
+            raise ConanInvalidConfiguration(f"Unsupported os ({self._settings_build.os}). "
+                                            f"This package currently only support {supported_os}.")
+
+    def build(self):
+        get(self, **self.conan_data["sources"][self.version][str(self._settings_build.os)][str(self._settings_build.arch)], strip_root=True)
+
+    def package(self):
+        copy(self, pattern="*", dst=os.path.join(self.package_folder, "bin"),
+             src=os.path.join(self.source_folder, "bin"),
+             excludes=("msvcp140.dll", "vcruntime140.dll", "vcruntime140_1.dll"))
+        copy(self, pattern="*", dst=os.path.join(self.package_folder, "include"),
+             src=os.path.join(self.source_folder, "include"))
+        copy(self, pattern="*", dst=os.path.join(self.package_folder, "lib"),
+             src=os.path.join(self.source_folder, "lib"))
+        copy(self, pattern="*", dst=os.path.join(self.package_folder, "res"),
+             src=os.path.join(self.source_folder, "conf"))
+        # conf folder is required for security settings, to avoid
+        # java.lang.SecurityException: Can't read cryptographic policy directory: unlimited
+        # https://github.com/conan-io/conan-center-index/pull/4491#issuecomment-774555069
+        copy(self, pattern="*", dst=os.path.join(self.package_folder, "conf"),
+             src=os.path.join(self.source_folder, "conf"))
+        copy(self, pattern="*", dst=os.path.join(self.package_folder, "licenses"),
+             src=os.path.join(self.source_folder, "legal"))
+        copy(self, pattern="*", dst=os.path.join(self.package_folder, "lib", "jmods"),
+             src=os.path.join(self.source_folder, "jmods"))
+
+    def package_info(self):
+        self.cpp_info.includedirs.append(self._jni_folder)
+        self.cpp_info.libdirs = []
+
+        java_home = self.package_folder
+        bin_path = os.path.join(java_home, "bin")
+
+        self.output.info(f"Creating JAVA_HOME environment variable with : {java_home}")
+        self.env_info.JAVA_HOME = java_home
+        self.buildenv_info.define_path("JAVA_HOME", java_home)
+        self.runenv_info.define_path("JAVA_HOME", java_home)
+
+        self.output.info(f"Appending PATH environment variable with : {bin_path}")
+        self.env_info.PATH.append(bin_path)
diff --git a/utils/ci/conan/recipes/zulu-openjdk/config.yml b/utils/ci/conan/recipes/zulu-openjdk/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d9b1272d1abe98acd1a941a1c3cd052589338c08
--- /dev/null
+++ b/utils/ci/conan/recipes/zulu-openjdk/config.yml
@@ -0,0 +1,11 @@
+versions:
+  "21.0.1":
+    folder: all
+  "17.0.9":
+    folder: all
+  "11.0.19":
+    folder: all
+  "11.0.15":
+    folder: all
+  "11.0.12":
+    folder: all
diff --git a/utils/ci/conan/script/10_prepare_msys2.sh b/utils/ci/conan/script/10_prepare_msys2.sh
index 1b4b460bcf3a9ef025a309e690659aedc3250f6c..796aae77e87c6bb6dd2ba513cdd99d9488f67f8d 100644
--- a/utils/ci/conan/script/10_prepare_msys2.sh
+++ b/utils/ci/conan/script/10_prepare_msys2.sh
@@ -24,8 +24,6 @@ yes | pacman -S mingw-w64-x86_64-gcc
 yes | pacman -S mingw-w64-x86_64-gdb
 yes | pacman -S mingw-w64-x86_64-cmake
 yes | pacman -S mingw-w64-x86_64-doxygen
-yes | pacman -S mingw-w64-x86_64-qt5
-yes | pacman -S mingw-w64-x86_64-qt5-debug
 yes | pacman -S mingw-w64-x86_64-make
 yes | pacman -S mingw-w64-x86_64-boost
 yes | pacman -S mingw-w64-x86_64-protobuf
diff --git a/utils/ci/conan/script/XX_prepare_msys2_compatible.sh b/utils/ci/conan/script/XX_prepare_msys2_compatible.sh
index 57d4e2bd64bd147ad03c5854eab6137e3af636f6..2ef65cbf89ac16a109d58c9bf071eae7e8b5c2e2 100644
--- a/utils/ci/conan/script/XX_prepare_msys2_compatible.sh
+++ b/utils/ci/conan/script/XX_prepare_msys2_compatible.sh
@@ -21,22 +21,16 @@ wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-gcc-10.2.0-6-any.pkg.
 wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-gdb-10.1-2-any.pkg.tar.zst
 wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-cmake-3.19.2-1-any.pkg.tar.zst
 wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-doxygen-1.8.20-1-any.pkg.tar.zst
-wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-qt5-5.15.2-5-any.pkg.tar.zst # yes | pacman -S mingw-w64-x86_64-qt5
-wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-qt5-debug-5.15.2-5-any.pkg.tar.zst # yes | pacman -S mingw-w64-x86_64-qt5-debug
 yes | pacman -U mingw-w64-x86_64-gcc-libs-10.2.0-6-any.pkg.tar.zst # yes | pacman -S mingw-w64-x86_64-gcc
 yes | pacman -U mingw-w64-x86_64-gcc-10.2.0-6-any.pkg.tar.zst # yes | pacman -S mingw-w64-x86_64-gcc
 yes | pacman -U mingw-w64-x86_64-gdb-10.1-2-any.pkg.tar.zst # yes | pacman -S mingw-w64-x86_64-gdb
 yes | pacman -U mingw-w64-x86_64-cmake-3.19.2-1-any.pkg.tar.zst # yes | pacman -S mingw-w64-x86_64-cmake
 yes | pacman -U mingw-w64-x86_64-doxygen-1.8.20-1-any.pkg.tar.zst # yes | pacman -S mingw-w64-x86_64-doxygen
-yes | pacman -U mingw-w64-x86_64-qt5-5.15.2-5-any.pkg.tar.zst
-yes | pacman -U mingw-w64-x86_64-qt5-debug-5.15.2-5-any.pkg.tar.zst
 # rm mingw-w64-x86_64-gcc-libs-10.2.0-6-any.pkg.tar.zst
 # rm mingw-w64-x86_64-gcc-10.2.0-6-any.pkg.tar.zst
 # rm mingw-w64-x86_64-gdb-10.1-2-any.pkg.tar.zst
 # rm mingw-w64-x86_64-cmake-3.19.2-1-any.pkg.tar.zst
 # rm mingw-w64-x86_64-doxygen-1.8.20-1-any.pkg.tar.zst
-# rm mingw-w64-x86_64-qt5-5.15.2-5-any.pkg.tar.zst
-# rm mingw-w64-x86_64-qt5-debug-5.15.2-5-any.pkg.tar.zst
 
 
 ## automatic installation of latest versions
diff --git a/utils/ci/scripts/10_prepare.sh b/utils/ci/scripts/10_prepare.sh
index fcfd94d8af37d589773a889c11aedec4f226dfe6..fc430beba94d7071517eb270ee649bd255cd16a5 100755
--- a/utils/ci/scripts/10_prepare.sh
+++ b/utils/ci/scripts/10_prepare.sh
@@ -29,19 +29,20 @@ if [[ -z "${CROSS_COMPILE_WINDOWS}" ]]; then
   rm -f repo/sim/tests/endToEndTests/pyOpenPASS/result_*.xml
   # prepare
   mkdir build
-else  
+else
   rm -rf artifacts build-fmi-library build-osi deps
   rm -f repo/sim/tests/endToEndTests/pyOpenPASS/result_*.xml
 fi
 
+# wipe old python env if exists
+rm -rf "repo/.env"
+
 printenv
 
 if [[ "${OSTYPE}" = "msys" ]]; then
   pacman -Q
 
   echo "list of native windows python packages"
-  "${PYTHON_WINDOWS_EXE}" -m pip list -v
 fi
 
 exit 0
-
diff --git a/utils/ci/scripts/14_prepare_python_env.sh b/utils/ci/scripts/14_prepare_python_env.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ca253c7887e3d792f90c4bcde47d718823b47649
--- /dev/null
+++ b/utils/ci/scripts/14_prepare_python_env.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# This script creates a python virtual environments
+# and install python packages mentioned in the requirements.txt
+################################################################################
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+OP_REPO_DIR="${OP_REPO_DIR:=$SCRIPT_DIR/../../..}"
+
+echo "Python virtual environment (.env) is being created at ${OP_REPO_DIR}"
+
+if [ ! -f "${OP_REPO_DIR}/requirements.txt" ]; then
+    echo "Error: requirements.txt not found at ${OP_REPO_DIR}!"
+    exit 1
+fi
+
+"${PYTHON_EXECUTABLE}" -m venv "${OP_REPO_DIR}/.env"
+
+if [[ "${OSTYPE}" = "msys" ]]; then
+    venv_python_executable="${OP_REPO_DIR}/.env/Scripts/python.exe"
+else
+    venv_python_executable="${OP_REPO_DIR}/.env/bin/python3"
+fi
+
+"${venv_python_executable}" -m pip install --upgrade pip
+
+"${venv_python_executable}" -m pip install -r "${OP_REPO_DIR}/requirements.txt"  || { echo "Failed to install dependencies"; exit 1; }
+
+echo "Following packages are installed successfully in the virtual environment at ${OP_REPO_DIR}/.env."
+
+"${venv_python_executable}" -m pip list -v
diff --git a/utils/ci/scripts/15_prepare_thirdParty.sh b/utils/ci/scripts/15_prepare_thirdParty.sh
index 48f2e4ff05428338efb46e5fa6f22989db37a183..c3362140956d7af1d0eac7f2a7781dd6d827bed4 100755
--- a/utils/ci/scripts/15_prepare_thirdParty.sh
+++ b/utils/ci/scripts/15_prepare_thirdParty.sh
@@ -2,7 +2,7 @@
 
 ################################################################################
 # Copyright (c) 2021 ITK Engineering GmbH
-#               2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2022-2024 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
@@ -15,218 +15,93 @@
 # This script prepares the thirdParty dependencies
 ################################################################################
 
-MYDIR="$(dirname "$(readlink -f $0)")"
-cd "$MYDIR/../../.."
+SCRIPT_DIR="$(dirname "$(readlink -f $0)")"
 
-REPO_ROOT="$PWD"
-file="$REPO_ROOT/utils/ci/conan/conanfile.txt" # Accessing the path of conanfile.txt
+if [[ -z "${PYTHON_EXECUTABLE}" ]]; then
+  echo "Error: Environment variable PYTHON_EXECUTABLE not set."
+  exit 1
+fi
 
-# requires by OSI conan build
-if [[ -z "$WORKSPACE" ]]; then
-  export WORKSPACE="$REPO_ROOT/.."
+# Check if the environment variable is defined
+# NOTE: This check is necessary for this shell script to work locally
+if [[ -z "${OP_REPO_DIR}" || -z ${OP_BASE_DIR} || -z ${OP_DEPS_DIR} ]]; then
+  # If not defined, set a default value
+  OP_REPO_DIR="$SCRIPT_DIR/../../.."
+  OP_BASE_DIR="$SCRIPT_DIR/../../../.."
+  OP_DEPS_DIR="$SCRIPT_DIR/../../../../deps"
+  echo "Warning: At least one of the OP_REPO_DIR, OP_BASE_DIR and OP_DEPS_DIR variables is not set. Setting the following values:
+        OP_REPO_DIR is ${OP_REPO_DIR}
+        OP_BASE_DIR is ${OP_BASE_DIR}
+        OP_DEPS_DIR is ${OP_DEPS_DIR}"
 fi
 
+# Set the default value
+conanfile="$OP_REPO_DIR/utils/ci/conan/conanfile.txt" # Accessing the path of conanfile.txt
+build_type="build_type=Release"
+build_strategy="--build=missing"
+
 # Set python command depending on OS
 if [[ "${OSTYPE}" = "msys" ]]; then
-  PYTHON_COMMAND="${PYTHON_WINDOWS_EXE}"
   export CONAN_CMAKE_GENERATOR="MSYS Makefiles"
-  conanprofile="$REPO_ROOT/utils/ci/conan/recipe/conanprofile_windows"
-  conanprofilehost="$REPO_ROOT/utils/ci/conan/recipe/conanprofile_windows"
+  conanprofile="$OP_REPO_DIR/utils/ci/conan/conanprofile_windows"
+  conanprofilehost="$OP_REPO_DIR/utils/ci/conan/conanprofile_windows"
+  # rm -rf /c/Windows/system32/config/systemprofile/.conan2
 else
-  PYTHON_COMMAND=python3
-  conanprofile="$REPO_ROOT/utils/ci/conan/recipe/conanprofile_linux"
-  conanprofilehost="$REPO_ROOT/utils/ci/conan/recipe/conanprofile_linux"
+  conanprofilehost="$OP_REPO_DIR/utils/ci/conan/conanprofile_linux"
+  conanprofile="$OP_REPO_DIR/utils/ci/conan/conanprofile_linux"
 fi
-
+export CONAN_REVISIONS_ENABLED=1
 # required for cross compilation
 if [[ "${CROSS_COMPILE}" = true ]]; then
-  conanprofilehost="$REPO_ROOT/utils/ci/conan/recipe/conanprofile_crosscompilation"
+  conanprofilehost="$OP_REPO_DIR/utils/ci/conan/conanprofile_crosscompilation"
+  CONAN_ARGS="$update -pr:b \"$conanprofile\" -pr:h=\"$conanprofilehost\""
+else
+  CONAN_ARGS="-pr:a $conanprofile"
 fi
 
-# Function to extract the option for the given package as mentioned in conanfile.txt
-ExtractOptionsAndQueries() {
-
-  for option in "${listOfOptions[@]}"; do
-    # Check if the option belongs to the concerned package
-    if [[ $option == ${packageName}* ]]; then
-        # Append "-o " before the matched variable
-        packageOptions+="-o ${option} "
-        packageQueries+="$(echo "$option" | grep -oP "${packageName}.*" | cut -d':' -f2-) AND "
-    fi
-  done
-
-  # Remove the trailing " AND "
-  packageQueries="${packageQueries% AND }"
-}
-
-# Function to build package other than protobuf with the given options in conanfile.txt
-BuildPackage() {
-
-  # Extract version
-  packageVersion=$(echo $each_requirement | awk -F'[@/]' '{print $2}')
-
-  # Extract user
-  packageUser=$(echo $each_requirement | awk -F'[@/]' '{print $3}')
-
-  # Extract channel
-  packageChannel=$(echo $each_requirement | awk -F'[@/]' '{print $4}')
-
-  if [[ "$packageName" == "libxml2" ]]; then
-    "$PYTHON_COMMAND" -m conans.conan create "$REPO_ROOT"/utils/ci/conan/recipe/"$packageName"/all --name $packageName --version $packageVersion --build=missing $packageOptions -pr:b "$conanprofile" -pr:h="$conanprofilehost"
-    status=$?
-    if [[ "$status" -gt 0 ]]; then
-      echo "Error: Failed to create the $each_requirement $packageOptions"
-      "$PYTHON_COMMAND" -m conans.conan remove -c "$each_requirement"
-      exit 1
-    fi
-  else
-    "$PYTHON_COMMAND" -m conans.conan create "$REPO_ROOT"/utils/ci/conan/recipe/"$packageName"/all --name $packageName --version $packageVersion --user $packageUser --channel $packageChannel --build=missing $packageOptions -pr:b "$conanprofile" -pr:h="$conanprofilehost"
-    status=$?
-    if [[ "$status" -gt 0 ]]; then
-      echo "Error: Failed to create the $each_requirement $packageOptions"
-      "$PYTHON_COMMAND" -m conans.conan remove -c "$each_requirement"
-      exit 1
-    fi
-  fi
-}
-
-# Function to parse the conanfile.txt and list out requirements and options
-ListOutRequirementsAndOptions() {
-    local file="$1"
-    local start_pattern="$2"
-    local end_pattern="$3"
-    local -n section_array="$4"
-    local in_section=false
-
-    while read -r line; do
-      line=${line//[[:space:]]}   # trim all whitespace
-
-      if [[ $line = '' ]]; then
-        continue
-      elif [[ $line =~ $start_pattern ]]; then
-        in_section=true
-        continue
-      elif [[ $line =~ $end_pattern ]]; then
-        in_section=false
-        continue
-      elif $in_section; then
-        section_array+=("$line")
-      fi
-    done < "$file"
-    section_array=("${section_array[@]}")
-}
-
-# List out requirements
-listOfRequirements=()
-ListOutRequirementsAndOptions "$file" "\[requires\]" "^\[" listOfRequirements
-
-# List out options
-listOfOptions=()
-ListOutRequirementsAndOptions "$file" "\[options\]" "^\[" listOfOptions
+# Check if build_type argument is provided
+# Process arguments
+while [[ "$#" -gt 0 ]]; do
+    case $1 in
+        -d|--debug) build_type="build_type=Debug" ;;
+        -pr|--profile)
+          shift
+          if [[ -n "$1" && ! "$1" =~ ^- ]]; then
+              conanprofile="$1"
+          else
+              echo "Error: --profile requires a path argument."
+              exit 1
+          fi;;
+        --build=*) build_strategy="$1" ;;
+        -u|--update) update="--update" ;;
+        *) echo "Error: Unknown parameter passed: $1"; exit 1 ;;
+    esac
+    shift
+done
 
-echo "list of available packages"
-"$PYTHON_COMMAND" -m conans.conan list *@openpass/testing
-"$PYTHON_COMMAND" -m conans.conan list *@
+"$PYTHON_EXECUTABLE" -m conans.conan remote add eclipse-conan-local-repo ${OP_REPO_DIR}/utils/ci/conan --force
+# remove conancenter remote if it exists, update it and add it back.
+# sideeffect: local remote is set as default (added first)
+"$PYTHON_EXECUTABLE" -m conans.conan remote remove conancenter
+"$PYTHON_EXECUTABLE" -m conans.conan remote add conancenter  https://center2.conan.io
+"$PYTHON_EXECUTABLE" -m conans.conan remote list
 
 # Note: If there is a change in recipe of the existing package and would want to
-# reinstall the existing package. Then execute conan remove <package> command
+# reinstall the existing package. Then execute conan remove "package/version" command
 # before executing the below "for" loop
 
-# Iterate over the list of requirements
-for each_requirement in "${listOfRequirements[@]}"; do
-
-  # Name of the package
-  packageName="${each_requirement%%/*}"
-  # options command to create the package with the particular option as mentioned in conanfile.txt
-  packageOptions=""
-  # queries command to check the package with the particular option as mentioned in conanfile.txt is available in local or not
-  packageQueries=""
-
-  # If the requirement is protobuf, qt or boost, then we follow the different method,
-  # as we are using conancenter to install and need both shared and static binaries
-  if [[ "$packageName" == "protobuf" ]]; then
-    continue
-  fi
-
-  if [[ "$packageName" == "boost" ]]; then
-    continue
-  fi
+# Clean deps folder before installing
+rm -rf "$OP_DEPS_DIR"
 
-  if [[ "$packageName" == "qt" ]]; then
-    continue
-  fi
-
-  if [[ "$packageName" == "zlib" ]]; then
-    continue
-  fi
-
-  if [[ "$packageName" == "minizip" ]]; then
-    continue
-  fi
-
-  if [[ "$packageName" == "gtest" ]]; then
-    continue
-  fi
-
-  if [[ "$packageName" == "b2" ]]; then
-    continue
-  fi
-
-  if [[ "$packageName" == "msys2" ]]; then
-    continue
-  fi
-
-  if [[ "$packageName" == "libiconv" ]]; then
-    continue
-  fi
-
-  # Extract options and queries for each package
-  ExtractOptionsAndQueries
-
-  # Check if the package is already available in the local
-  # conan search results failure if the package is not at all available
-  # and just informs that a particular package with the given option is not available, if the same package with another option is available.
-  # Therefore, it is important to parse the output and check if the package is available or not
-  searchResult=$("$PYTHON_COMMAND" -m conans.conan list -p "$packageQueries" $each_requirement 2>&1)
-
-  # If requirement with the given option is already available, then just install them into deps folder.
-  if ! echo "$searchResult" | grep -q -e "no packages for reference" -e "ERROR:"; then
-    echo "Package $each_requirement $packageOptions is already available."
-  # If requirement with the given option is not available, then create and install them into deps folder.
-  else
-    echo "Package $each_requirement $packageOptions is not available. Building..."
-    BuildPackage
-  fi
-
-done
+# # Clean conan cache to prevent issues from cached recipies due to aborted builds
+# "$PYTHON_EXECUTABLE" -m conans.conan list "*"
+# "$PYTHON_EXECUTABLE" -m conans.conan remove -c "*"
+# "$PYTHON_EXECUTABLE" -m conans.conan cache clean
+# "$PYTHON_EXECUTABLE" -m conans.conan list "*"
 
 # Command to install all the packages into the required folder.
-# --build=missing argument is necessary as at this point protobuf is checked and if not available it builds from conancenter
+# --build=missing argument is necessary as if the package is not available it builds from my-local-repo (utils/ci/conan/recipes)
+"$PYTHON_EXECUTABLE" -m conans.conan install $conanfile $CONAN_ARGS $build_strategy --deployer=direct_deploy -of="$OP_DEPS_DIR" -s:a $build_type -r eclipse-conan-local-repo || { "$PYTHON_EXECUTABLE" -m conans.conan remote remove -c eclipse-conan-local-repo; "$PYTHON_EXECUTABLE" -m conans.conan cache clean --source --build "*/*"; exit 1;}
 
-if [[ "${CROSS_COMPILE}" = true ]]; then
-  "$PYTHON_COMMAND" -m conans.conan install $file -o qt/*:cross_compile=x86_64-w64-mingw32- -o qt/*:with_freetype=False --build=missing --deployer=direct_deploy -of="$REPO_ROOT/../deps" -pr:b "$conanprofile" -pr:h="$conanprofilehost" || exit 1
-else
-  "$PYTHON_COMMAND" -m conans.conan install $file --build=missing --deployer=direct_deploy -of="$REPO_ROOT/../deps" -pr:b "$conanprofile" -pr:h="$conanprofilehost" || exit 1
-fi
-mv $REPO_ROOT/../deps/direct_deploy/protobuf $REPO_ROOT/../deps/direct_deploy/protobuf-shared   # rename the deployed protobuf folder as protobuf-shared (to distinguish between protobuf static and shared)
-
-"$PYTHON_COMMAND" -m conans.conan install --requires=protobuf/3.20.0@ --build=missing  --deployer=direct_deploy -of="$REPO_ROOT/../deps" -g CMakeDeps -o protobuf/*:shared=False -pr:b "$conanprofile" -pr:h="$conanprofilehost"
-status=$?
-if [[ "$status" -gt 0 ]]; then
-  echo "Error: Failed to install and deploy the protobuf static"
-  exit 1
-fi
-
-# Apply protobuf patch on port_def.inc and port_undef.inc files
-# to avoid GetMessage name conflict on msys
-if [[ "${OSTYPE}" = "msys" || "${CROSS_COMPILE}" = true ]]; then
-  cd $REPO_ROOT/../deps/direct_deploy/protobuf
-  patch -p0 < $REPO_ROOT/utils/ci/scripts/patches/protobuf.patch
-  cd $REPO_ROOT/../deps/direct_deploy/protobuf-shared
-  patch -p0 < $REPO_ROOT/utils/ci/scripts/patches/protobuf.patch
-fi
-
-if [[ "${CROSS_COMPILE}" = true ]]; then
-  cd $REPO_ROOT/../deps
-  sed -i 's/set(zlib_INCLUDE_DIRS_RELEASE )/set(zlib_INCLUDE_DIRS_RELEASE "${zlib_PACKAGE_FOLDER_RELEASE}\/include")/' ZLIB-release-x86_64-data.cmake
-fi
\ No newline at end of file
+"$PYTHON_EXECUTABLE" -m conans.conan remote remove eclipse-conan-local-repo
+"$PYTHON_EXECUTABLE" -m conans.conan cache clean --source --build "*/*"
diff --git a/utils/ci/scripts/20_configure.sh b/utils/ci/scripts/20_configure.sh
index 407601bb2dbd7c84da1d253c7e191c03446ff04f..cdaddaaff61b13542164b297bd315ae01105eefb 100755
--- a/utils/ci/scripts/20_configure.sh
+++ b/utils/ci/scripts/20_configure.sh
@@ -25,6 +25,7 @@ function join_paths()
 MYDIR="$(dirname "$(readlink -f $0)")"
 cd "$MYDIR/../../../../build" || exit 1
 
+OP_REPO_DIR="${OP_REPO_DIR:=$MYDIR/../../..}"
 # dependencies built previously
 DEPS=(
   "$PWD/../deps/direct_deploy/fmilibrary"
@@ -38,7 +39,6 @@ DEPS=(
   "$PWD/../deps/direct_deploy/openscenario_engine"
   "$PWD/../deps/direct_deploy/gtest"
   "$PWD/../deps/direct_deploy/boost"
-  "$PWD/../deps/direct_deploy/qt"
   "$PWD/../deps/direct_deploy/minizip"
   "$PWD/../deps/direct_deploy/libiconv"
   "$PWD/../deps/direct_deploy/libxml2"
@@ -59,11 +59,6 @@ if [[ "${OSTYPE}" = "msys" ]]; then
   # set the correct CMake generator
   CMAKE_GENERATOR_ARG="-GMSYS Makefiles"
 
-  # set python command
-  if [[ -n "${PYTHON_WINDOWS_EXE}" ]]; then
-    CMAKE_PYTHON_COMMAND_ARG="-DPython3_EXECUTABLE=${PYTHON_WINDOWS_EXE}"
-  fi
-
   # prepare dependency paths
   # it seems cmake doesn't like MSYS paths starting with drive letters (e.g. /c/thirdParty/...)
   # cygpath is used here to format the paths in "mixed format" (e.g. c:/thirdparty/...)
@@ -86,10 +81,14 @@ elif [[ -n "${GIT_BRANCH}" || -n "${GIT_COMMIT}" ]]; then
   CMAKE_VERSION_ARG="-DSIMCORE_VERSION_TAG=${GIT_BRANCH:-no-branch}_${GIT_COMMIT}"
 fi
 
+case "${OSTYPE}" in
+    msys*) source "${OP_REPO_DIR}/.env/Scripts/activate" ;;
+    *)     source "${OP_REPO_DIR}/.env/bin/activate" ;;
+esac
+
 cmake \
   "$CMAKE_GENERATOR_ARG" \
-  "$CMAKE_PYTHON_COMMAND_ARG" \
-  "$CMAKE_VERSION_ARG" \
+  $CMAKE_VERSION_ARG \
   "$CMAKE_C_COMPILER" \
   "$CMAKE_CXX_COMPILER" \
   "$CMAKE_SYSTEM_NAME" \
diff --git a/utils/ci/scripts/25_check_inline_docu.sh b/utils/ci/scripts/25_check_inline_docu.sh
index 1b049fc987545eb7c42361a3ad6132b6b0b385c0..4931d1707875b7def1536aee6f0ecdc2d4058da7 100755
--- a/utils/ci/scripts/25_check_inline_docu.sh
+++ b/utils/ci/scripts/25_check_inline_docu.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 ################################################################################
-# Copyright (c) 2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# Copyright (c) 2022-2024 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
@@ -86,7 +86,9 @@ filter "1.8.17" \
 # bug description - https://github.com/doxygen/doxygen/issues/8091
 filter "1.9.1" \
      "Filtering Doxygen warnings \"Member OpenPASS_ ... is not documented\" (see https://github.com/doxygen/doxygen/issues/8091)" \
-     "/warning: Member OpenPASS_.*is not documented/d"
+     "/warning: Member OpenPASS_.*is not documented/d" \
+     "/.*OpenPASS_.* has multiple @param documentation sections/d" \
+     "/^\s*$/d"
 
 # dealing with DOT issues bugs in Doxygen 1.9.6 (or later)
 # bug description - https://github.com/doxygen/doxygen/issues/8091
@@ -96,19 +98,24 @@ filter "1.9.6" \
      "/error: Problems running dot: exit code=2, command='dot.exe'/d" \
      "/^\s*$/d"
 
-# filtering warnings related to missing Mantle_API documenation
-echo "Filtering warnings related to missing Mantle_API documenation"
-sed -i "/conanThirdParty\/MantleAPI/d" DoxygenWarningLog.txt
-sed -i "/  parameter 'map_file_path'/d" DoxygenWarningLog.txt
-sed -i "/  parameter 'map_details'/d" DoxygenWarningLog.txt
-sed -i "/  parameter 'lateral_state'/d" DoxygenWarningLog.txt
-sed -i "/  parameter 'longitudinal_state'/d" DoxygenWarningLog.txt
-sed -i "/core::LaneLocationQueryService::GetRelativeLaneId/d" DoxygenWarningLog.txt
-sed -i "/  parameter 'relative_lane_target'/d" DoxygenWarningLog.txt
-sed -i "/of member mantle_api::/d" DoxygenWarningLog.txt
+# hotfixing Doxygen 1.10.0 (or later)
+# we have to update our codebase: https://github.com/doxygen/doxygen/pull/10289
+filter "1.10.0" \
+     "Filtering Doxygen warning: Found non-existing group" \
+     "/warning: Found non-existing group/d"
+
+# hotfixing Doxygen 1.10.0 (or later)
+# we might have to update our codebase: https://stackoverflow.com/questions/11678567/doxygen-warning-documented-function-not-declared-or-defined
+filter "1.10.0" \
+    "Filtering Doxygen warning: documented symbol was not declared or defined" \
+    "/warning: documented symbol '.*std::function\(.*\)' was not declared or defined\./d"
+
+# filtering issues related to dependency MantleAPI
+sed -i "/include\/MantleAPI/d" DoxygenWarningLog.txt
 
 # filtering warnings not related to in-line documentation
 sed -i "/Detected potential recursive class relation/d" DoxygenWarningLog.txt
+sed -i "/warning: argument 'param' from the argument list of EgoAgentInterface::executeQuery has multiple @param documentation sections/d" DoxygenWarningLog.txt
 
 # remove blank lines
 sed -i '/^\s*$/d' DoxygenWarningLog.txt
@@ -119,6 +126,6 @@ then
      cat DoxygenWarningLog.txt
      exit 1
 else
-     echo "SUCCESS: No Doxygen warnings found"
+     echo "No Doxygen warnings found"
      exit 0
 fi
diff --git a/utils/ci/scripts/30_build.sh b/utils/ci/scripts/30_build.sh
index 467e693e7ad13f150256f35f15793beb27fa1100..0ceb9f5c9d713cc6b4f6a215748d88c6c80add91 100755
--- a/utils/ci/scripts/30_build.sh
+++ b/utils/ci/scripts/30_build.sh
@@ -2,6 +2,7 @@
 
 ################################################################################
 # Copyright (c) 2021 in-tech GmbH
+#               2024 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
@@ -15,6 +16,7 @@
 ################################################################################
 
 MYDIR="$(dirname "$(readlink -f $0)")"
+OP_REPO_DIR="${OP_REPO_DIR:=$MYDIR/../../..}"
 cd "$MYDIR/../../../../build" || exit 1
 
 if hash nproc 2>/dev/null; then
@@ -25,11 +27,16 @@ else
   MAKE_JOB_COUNT=1
 fi
 
-make -j$MAKE_JOB_COUNT install
+case "${OSTYPE}" in
+    msys*) source "${OP_REPO_DIR}/.env/Scripts/activate" ;;
+    *)     source "${OP_REPO_DIR}/.env/bin/activate" ;;
+esac
+
+make -j$MAKE_JOB_COUNT install || exit 1
 
 if [[ "${CROSS_COMPILE}" = true ]]; then
   cd ../dist/opSimulation
-  cp $MYDIR/../../../../deps/direct_deploy/yase/bin/libagnostic_behavior_tree.dll $MYDIR/../../../../dist/opSimulation 
-  cp $MYDIR/../../../../deps/direct_deploy/openscenario_engine/bin/libOpenScenarioEngine.dll $MYDIR/../../../../dist/opSimulation 
+  cp $MYDIR/../../../../deps/direct_deploy/yase/bin/libagnostic_behavior_tree.dll $MYDIR/../../../../dist/opSimulation
+  cp $MYDIR/../../../../deps/direct_deploy/openscenario_engine/bin/libOpenScenarioEngine.dll $MYDIR/../../../../dist/opSimulation
   cp $MYDIR/../../../../deps/direct_deploy/openscenario_api/lib/*.dll $MYDIR/../../../../dist/opSimulation
-fi
\ No newline at end of file
+fi
diff --git a/utils/ci/scripts/55_endtoend.sh b/utils/ci/scripts/55_endtoend.sh
index 8e12e005b2f19457022aa07175b00d42c17e1cf3..d7fcffdaadce5ab436c1f70ff1735773b51db910 100755
--- a/utils/ci/scripts/55_endtoend.sh
+++ b/utils/ci/scripts/55_endtoend.sh
@@ -2,7 +2,7 @@
 
 ################################################################################
 # Copyright (c) 2021 in-tech GmbH
-#               2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+#               2023-2024 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
@@ -16,6 +16,7 @@
 ################################################################################
 
 MYDIR="$(dirname "$(readlink -f $0)")"
+OP_REPO_DIR="${OP_REPO_DIR:=$MYDIR/../../..}"
 
 if [[ "${CROSS_COMPILE}" = true ]]; then
   echo "When cross compiling, end-to-end test is not executed on build system"
@@ -28,5 +29,13 @@ if [[ "${OSTYPE}" = "msys" ]]; then
 fi
 # END OF HOTFIX
 
-cd "$MYDIR/../../../../build"
-make pyOpenPASS
+case "${OSTYPE}" in
+    msys*) source "${OP_REPO_DIR}/.env/Scripts/activate" ;;
+    *)     source "${OP_REPO_DIR}/.env/bin/activate" ;;
+esac
+
+cd "$MYDIR/../../../../build" || exit 1
+make pyOpenPASS || exit 1
+
+cd "$MYDIR/../../../../dist" || exit 1
+rm -rf opSimulation/artifacts || exit 1
diff --git a/utils/ci/scripts/60_check_clang_format.sh b/utils/ci/scripts/60_check_clang_format.sh
index d5921b26e1953710e7b5727249dbf774658d4933..58955710edea172b37e1d214c1db22e7126a65d2 100755
--- a/utils/ci/scripts/60_check_clang_format.sh
+++ b/utils/ci/scripts/60_check_clang_format.sh
@@ -1,7 +1,7 @@
 #!/usr/bin/env bash
 
 ################################################################################
-# Copyright (c) 2022-2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# Copyright (c) 2022-2024 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
@@ -24,13 +24,13 @@ if [[ "${OSTYPE}" = "msys" ]]; then
   exit 0
 fi
 
-clang-format --version
+clang-format-15 --version
 
-for file in $(find . -type f \( -name "*.h" -o -name "*.cpp" \) ! -path "./sim/deps/*" ! -path "./build/*" ! -path "./gui/*" ! -path "./.git/*"); do
-    if $(clang-format -output-replacements-xml $file | grep -c "<replacement " > /dev/null); then
-        if [[ ! "$file" =~ version\.h$ ]]; then # filtering version.h as it is autogenerated
+for file in $(find . -type f \( -name "*.h" -o -name "*.cpp" \) ! -path "./sim/deps/*" ! -path "./build/*" ! -path "./gui/*" ! -path "./.git/*" ! -path "./.env/*"); do
+    if $(clang-format-15 -output-replacements-xml $file | grep -c "<replacement " > /dev/null); then
+        if [[ ! "$file" =~ version\.h$ && ! "$file" =~ version\.cpp$ ]]; then # filtering version.h as it is autogenerated
             echo "ERROR [clang-format]: $file is not formatted properly"
-            clang-format --style=file --dry-run --Werror "$file"
+            clang-format-15 --style=file --dry-run --Werror "$file"
             exit_code=1
         fi
     fi
diff --git a/utils/ci/scripts/62_static_analysis.sh b/utils/ci/scripts/62_static_analysis.sh
index dd8e80bfccb7d45ee0fc695975a3a008df4b0b41..3c15f27313490d896310fe9a44ae9d376cebdc9c 100755
--- a/utils/ci/scripts/62_static_analysis.sh
+++ b/utils/ci/scripts/62_static_analysis.sh
@@ -36,11 +36,10 @@ CLANG_TIDY_CHECK_EXCLUDE_DIRS=(
   "contrib"
   "deps"
   "doc"
+  ".env"
 )
 
-CLANG_TIDY_CHECK_EXCLUDE_FILES=(
-  tests/unitTests/components/Algorithm_RouteControl/tst_ut_RouteControl.cpp
-)
+CLANG_TIDY_CHECK_EXCLUDE_FILES=()
 
 # as array variables cannot be exported, source the actual clang-tidy check script
 . ${MYDIR}/check_clang_tidy.sh
diff --git a/utils/ci/scripts/65_check_include_style.sh b/utils/ci/scripts/65_check_include_style.sh
index 19201bbb8a57b1d6df6e6c6f8cdac84c1f650876..e64e18b9221c83d0abbfba6edf76b080f64351cc 100644
--- a/utils/ci/scripts/65_check_include_style.sh
+++ b/utils/ci/scripts/65_check_include_style.sh
@@ -1,7 +1,7 @@
 #!/usr/bin/env bash
 
 ################################################################################
-# Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# Copyright (c) 2023-2024 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,7 +31,7 @@ while IFS= read -r file; do
         filename=$(basename "$include" | sed 's/["><]//g')
 
         # Use find to search for the filename in all subdirectories
-        file_count=$(find sim ! -path "sim/deps/*" -name "$filename" | wc -l)
+        file_count=$(find sim ! -path "sim/deps/*" ! -path ".env/*" -name "$filename" | wc -l)
 
         if [[ $file_count -gt 0 ]]; then
             if [[ "$include" != "\""*"\""  ]]; then
@@ -45,7 +45,7 @@ while IFS= read -r file; do
             fi
         fi
     done
-done < <(find ./sim -type f \( -name "*.h" -o -name "*.cpp" \) ! -path "./sim/deps/*" ! -path "./sim/contrib/*" ! -path "./sim/doc/*" ! -path "./build/*" ! -path "./gui/*" ! -path "./.git/*")
+done < <(find ./sim -type f \( -name "*.h" -o -name "*.cpp" \) ! -path "./sim/deps/*" ! -path "./.env/*" ! -path "./sim/contrib/*" ! -path "./sim/doc/*" ! -path "./build/*" ! -path "./gui/*" ! -path "./.git/*")
 
 if [ $exit_code -eq 0 ]; then
     echo "SUCCESS [header-include-style]: Header files are enclosed correctly"
diff --git a/utils/ci/scripts/89_check_version.sh b/utils/ci/scripts/89_check_version.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8c923258a19d1160d6220d5c001a7c8ba3725e19
--- /dev/null
+++ b/utils/ci/scripts/89_check_version.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+#####################################################################################
+# Copyright (c) 2024 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
+#####################################################################################
+
+#####################################################################################
+# This script checks if the opSimulation version is correctly set when GIT_TAG is set
+#####################################################################################
+
+if [[ -z "${TAG_NAME}" ]]; then
+  echo "TAG_NAME is not set. The version check is only for the TAG build"
+  exit
+fi
+
+MYDIR="$(dirname "$(readlink -f $0)")"
+cd "$MYDIR/../../../../dist/opSimulation" || exit 1
+
+if [[ "${OSTYPE}" = "msys" ]]; then
+  OP_EXE_NAME=opSimulation.exe
+else
+  OP_EXE_NAME=opSimulation
+fi
+
+# Execute the command and capture its output
+version_output=$(./$OP_EXE_NAME --version 2>&1)
+exit_status=$?
+
+# Check if the command was successful
+if [[ $exit_status -ne 0 ]]; then
+  echo "Failed to execute ./${OP_EXE_NAME} --version"
+  echo "Error: $version_output"
+  exit 1
+fi
+
+# Check if the output is exactly the tag name
+if [[ "$version_output" == *"${TAG_NAME}" ]]; then
+    echo "Version is correctly set: $version_output"
+else
+    echo "Version is falsely set: $version_output"
+    exit 1
+fi
diff --git a/utils/ci/scripts/90_pack_artifacts.sh b/utils/ci/scripts/90_pack_artifacts.sh
index 14f4f9bbd6e8469d359429ae012a7d1218c4e56a..6bf805f2680d1a9708cee40d4fc2c5a0bbd60f06 100755
--- a/utils/ci/scripts/90_pack_artifacts.sh
+++ b/utils/ci/scripts/90_pack_artifacts.sh
@@ -21,22 +21,27 @@ cd "$MYDIR/../../../../dist" || exit 1
 SIM_NAME=openPASS_SIM
 E2E_NAME=openPASS_EndToEndTests
 
-mkdir -p ../artifacts/testreport || exit 1
-
 if [[ "${OSTYPE}" = "msys" ]]; then
-  mv opSimulation/testreport ../artifacts/testreport/linux
-  $MYDIR/util_zip.sh ../artifacts/${E2E_NAME}.zip opSimulation/artifacts
+  PLATFORM="windows"
+  ARCHIVE_TOOL="$MYDIR/util_zip.sh"
+  ARCHIVE_EXT="zip"
 else
-  mv opSimulation/testreport ../artifacts/testreport/windows
-  $MYDIR/util_tar.sh ../artifacts/${E2E_NAME}.tar.gz opSimulation/artifacts
+  PLATFORM="linux"
+  ARCHIVE_TOOL="$MYDIR/util_tar.sh"
+  ARCHIVE_EXT="tar.gz"
 fi
 
-rm -rf opSimulation/artifacts opSimulation/configs opSimulation/results
-mkdir opSimulation/configs
+mkdir -p ../artifacts/testreport || exit 1
+mv opSimulation/testreport ../artifacts/testreport/$PLATFORM
 
-if [[ "${OSTYPE}" = "msys" ]]; then
-  $MYDIR/util_zip.sh ../artifacts/${SIM_NAME}.zip opSimulation
-else
-  $MYDIR/util_tar.sh ../artifacts/${SIM_NAME}.tar.gz opSimulation
+if [ -d "opSimulation/artifacts" ]; then
+  if [ -n "$(ls -A "opSimulation/artifacts")" ]; then
+    $ARCHIVE_TOOL ../artifacts/${E2E_NAME}.${ARCHIVE_EXT} opSimulation/artifacts
+  fi
+  rm -rf opSimulation/artifacts
 fi
 
+rm -rf opSimulation/configs opSimulation/results
+mkdir opSimulation/configs
+
+$ARCHIVE_TOOL ../artifacts/${SIM_NAME}.${ARCHIVE_EXT} opSimulation
diff --git a/utils/ci/scripts/auto_deploy_docu.sh b/utils/ci/scripts/auto_deploy_docu.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4dbee2063d5ca75b30e0420f1f10aacd82f2c6e2
--- /dev/null
+++ b/utils/ci/scripts/auto_deploy_docu.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+################################################################################
+# Copyright (c) 2024 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
+################################################################################
+
+################################################################################
+# This script creates a merge request at openpass-docs-site
+# The script should be triggered when a git tag is being built
+# Upon merging, the documentation at the webspace will be updated
+################################################################################
+
+# Exit the script if any command fails
+set -e
+set -o pipefail
+
+MYDIR="$(dirname "$(readlink -f $0)")"
+cd "$MYDIR/../../.." || exit 1
+
+if [ -z "${TAG_NAME}" ]; then
+    echo "Automatic deployment of documentation happens only when tag is set. Skipping now"
+    exit 0
+fi
+# Define paths and variables
+REPO_DIR="$PWD"
+BASE_DIR="$REPO_DIR/.."
+BUILD_DIR="$BASE_DIR/build"
+GENERATED_HTML_PATH="$BUILD_DIR/doc/html"  # Path where 'make doc' generates HTML files
+DOCS_REPO_NAME="openpass-docs-site"
+DOCS_BRANCH_NAME="doc-${TAG_NAME}"
+
+# Git credentials
+GIT_USER_NAME="openpass-bot"
+GIT_USER_EMAIL="openpass-bot@eclipse.org"
+
+# Clone the openpass-docs-site repository and create a new branch
+cd "$BASE_DIR" || exit 1
+git clone https://${GIT_USER_NAME}:${GITLAB_BOT_TOKEN}@gitlab.eclipse.org/eclipse/openpass/${DOCS_REPO_NAME}.git "$DOCS_REPO_NAME"
+cd "$BASE_DIR/$DOCS_REPO_NAME" || exit 1
+git checkout -b "$DOCS_BRANCH_NAME"
+
+# Configure Git user credentials locally
+git config --local user.name "$GIT_USER_NAME"
+git config --local user.email "$GIT_USER_EMAIL"
+
+# Remove old documentation and copy new one
+cd "$BASE_DIR/$DOCS_REPO_NAME/content/html" || exit 1
+rm -rf *
+cp -r "$GENERATED_HTML_PATH/"* .
+# Commit and push the changes
+git add --all
+git commit -m "Update docs for opSimulation $TAG_NAME"
+git push -u origin "$DOCS_BRANCH_NAME"
+
+# Create merge request using GitLab API
+MERGE_REQUEST_URL="https://gitlab.eclipse.org/api/v4/projects/7034/merge_requests"
+
+# JSON data for the merge request
+merge_request_data=$(cat <<EOF
+{
+  "source_branch": "${DOCS_BRANCH_NAME}",
+  "target_branch": "master",
+  "title": "Update docs for opSimulation $TAG_NAME",
+  "description": ""
+}
+EOF
+)
+
+# Create a merge request
+curl --header "PRIVATE-TOKEN: ${GITLAB_BOT_TOKEN}" \
+    --header "Content-Type: application/json" \
+    --request POST \
+    --data "${merge_request_data}" \
+    "${MERGE_REQUEST_URL}"
diff --git a/utils/ci/scripts/build_core_and_e2e.sh b/utils/ci/scripts/build_core_and_e2e.sh
index 63b2626a008fc32edb790317a704fe809b49fa67..ef92583deec8701d03d7402c9e2cc8031ffb57e7 100755
--- a/utils/ci/scripts/build_core_and_e2e.sh
+++ b/utils/ci/scripts/build_core_and_e2e.sh
@@ -2,6 +2,7 @@
 
 ################################################################################
 # Copyright (c) 2021 in-tech GmbH
+#               2024 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,7 @@ cd "$MYDIR" || exit 1
 
 export CCACHE_DIR=$MYDIR/../../../../ccache
 
-for SCRIPT in 30_build.sh 55_endtoend.sh 80_doc.sh 90_pack_artifacts.sh; do
+for SCRIPT in 30_build.sh 55_endtoend.sh 80_doc.sh 89_check_version.sh 90_pack_artifacts.sh; do
   echo
   echo "======================================================================="
   echo "Executing ${SCRIPT}..."
@@ -28,4 +29,3 @@ for SCRIPT in 30_build.sh 55_endtoend.sh 80_doc.sh 90_pack_artifacts.sh; do
 
   ./$SCRIPT || exit 1
 done
-
diff --git a/utils/ci/scripts/build_prepare.sh b/utils/ci/scripts/build_prepare.sh
index f3c0a8d81a9479d29187bc445759e3d4851dcea1..884195f1713023fc87d9df668e016821a88b903d 100755
--- a/utils/ci/scripts/build_prepare.sh
+++ b/utils/ci/scripts/build_prepare.sh
@@ -2,6 +2,7 @@
 
 ################################################################################
 # Copyright (c) 2021 in-tech GmbH
+#               2024 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,7 @@ cd "$MYDIR" || exit 1
 
 export CCACHE_DIR=$MYDIR/../../../../ccache
 
-for SCRIPT in 10_prepare.sh 15_prepare_thirdParty.sh 20_configure.sh; do
+for SCRIPT in 10_prepare.sh 14_prepare_python_env.sh 15_prepare_thirdParty.sh 20_configure.sh; do
   echo
   echo "======================================================================="
   echo "Executing ${SCRIPT}..."
@@ -28,4 +29,3 @@ for SCRIPT in 10_prepare.sh 15_prepare_thirdParty.sh 20_configure.sh; do
 
   ./$SCRIPT || exit 1
 done
-
diff --git a/utils/ci/scripts/cleanup.sh b/utils/ci/scripts/cleanup.sh
index 61f29f061efecc8f53fc92c0086e061dc1005f71..b92139b7914ae72f44264302bc31b65aa247c228 100755
--- a/utils/ci/scripts/cleanup.sh
+++ b/utils/ci/scripts/cleanup.sh
@@ -35,4 +35,5 @@ else
   cd "$CTCACHE_BASE_DIR"
   find . -type d -mtime +90 -exec rm -rf {} +
 fi
+exit 0
 
diff --git a/utils/ci/scripts/nightly/10_install_msys.sh b/utils/ci/scripts/nightly/10_install_msys.sh
index 858ce910389bb53e195975ebff1a218361396785..c3f72ffc9935d9b6569f3b563c2ff0386168e7d5 100644
--- a/utils/ci/scripts/nightly/10_install_msys.sh
+++ b/utils/ci/scripts/nightly/10_install_msys.sh
@@ -21,7 +21,7 @@ cd "$MYDIR/../../../../.." || exit 1
 MSYS_INSTALL_FOLDER="/c/msys-nightly"
 
 # Removes msys2 package, if present
-conan remove --force msys2/* 
+conan remove --force msys2/*
 
 # Installs msys2 and other relevant packages required to build openPASS
-conan install msys2/cci.latest@ -g deploy --install-folder="${MSYS_INSTALL_FOLDER}" --build=missing -o msys2:no_kill=True -o msys2:additional_packages=mingw-w64-x86_64-boost,mingw-w64-x86_64-ccache,mingw-w64-x86_64-cmake,mingw-w64-x86_64-doxygen,mingw-w64-x86_64-gcc,mingw-w64-x86_64-gdb,mingw-w64-x86_64-graphviz,mingw-w64-x86_64-gtest,mingw-w64-x86_64-qt5,make,mingw-w64-x86_64-python,mingw-w64-x86_64-python-pip,mingw-w64-x86_64-python-lxml,mingw-w64-x86_64-zziplib,mingw-w64-x86_64-texlive-bin,mingw-w64-x86_64-texlive-core,mingw-w64-x86_64-texlive-font-utils,libxslt-devel,mingw-w64-x86_64-clang,mingw-w64-x86_64-texlive-latex-extra,zip
+conan install msys2/cci.latest@ -g deploy --install-folder="${MSYS_INSTALL_FOLDER}" --build=missing -o msys2:no_kill=True -o msys2:additional_packages=mingw-w64-x86_64-boost,mingw-w64-x86_64-ccache,mingw-w64-x86_64-cmake,mingw-w64-x86_64-doxygen,mingw-w64-x86_64-gcc,mingw-w64-x86_64-gdb,mingw-w64-x86_64-graphviz,mingw-w64-x86_64-gtest,make,mingw-w64-x86_64-python,mingw-w64-x86_64-python-pip,mingw-w64-x86_64-python-lxml,mingw-w64-x86_64-zziplib,mingw-w64-x86_64-texlive-bin,mingw-w64-x86_64-texlive-core,mingw-w64-x86_64-texlive-font-utils,libxslt-devel,mingw-w64-x86_64-clang,mingw-w64-x86_64-texlive-latex-extra,zip
diff --git a/utils/ci/scripts/setup_env.sh b/utils/ci/scripts/setup_env.sh
index cdb287e9311b819485f71ba37069401a19821605..fdd38b7fbbf8561ee68e1220a91a5a840942b471 100755
--- a/utils/ci/scripts/setup_env.sh
+++ b/utils/ci/scripts/setup_env.sh
@@ -28,12 +28,10 @@ apt-get -qq update && apt-get -qq dist-upgrade && apt-get install -qq -y --no-in
     libgmock-dev \
     libgtest-dev \
     libprotobuf-dev \
-    libqt5xmlpatterns5-dev \
     protobuf-compiler \
     python3 \
     python3-distutils \
     python3-pip \
-    qtbase5-dev \
     && apt-get -qq clean
 
 apt-get install -qq -y --no-install-recommends \
diff --git a/utils/ci/scripts/util_tar.sh b/utils/ci/scripts/util_tar.sh
index 1be50485dea789b888d76a1c377686a73325465c..baf0309646ad1c24ef6c70b779232afdf23f9c6f 100755
--- a/utils/ci/scripts/util_tar.sh
+++ b/utils/ci/scripts/util_tar.sh
@@ -26,4 +26,4 @@ SRCFILES=("$@")
 
 # not quoted to allow glob expansion
 echo Archiving into $ARTIFACT_PATH: ${SRCFILES[@]}
-tar zcvf "$ARTIFACT_PATH" ${SRCFILES[@]}
+tar zcf "$ARTIFACT_PATH" ${SRCFILES[@]}
diff --git a/utils/ci/scripts/util_zip.sh b/utils/ci/scripts/util_zip.sh
index 2764533b212d08d885d3f5e50e4bfe3aee79d0ce..9bd8d31aa2bbb7ab21946eca47cadf8de9738db4 100755
--- a/utils/ci/scripts/util_zip.sh
+++ b/utils/ci/scripts/util_zip.sh
@@ -26,4 +26,4 @@ SRCFILES=("$@")
 
 # not quoted to allow glob expansion
 echo Archiving into $ARTIFACT_PATH: ${SRCFILES[@]}
-zip -r -9 "$ARTIFACT_PATH" ${SRCFILES[@]}
+zip -q -r -9 "$ARTIFACT_PATH" ${SRCFILES[@]}