From 8a645a7a14c4e737c0c1136d1c4b9e11019e3eb1 Mon Sep 17 00:00:00 2001
From: jroyan <jerome.royan@b-com.com>
Date: Tue, 24 Sep 2024 16:28:13 +0200
Subject: [PATCH] update to build and run with last openAPI commit

---
 EtsiClientGen/CMakeLists.txt                  | 207 +++-------------
 EtsiClientGen/patches/applyPatches.sh         |  27 ++-
 EtsiClientGen/patches/applyYamlPatch.sh       |   2 +
 .../fixCEncodingInformationStructure.patch    |   4 +-
 EtsiClientGen/patches/fixCError.patch         |  46 ----
 .../fixCRelocalizationInformation.patch       |  34 +++
 .../fixCRelocalizationInformationAPI.patch    |  33 +++
 EtsiClientGen/patches/fixCTrackable.patch     | 223 +++++++++++++-----
 EtsiClientGen/patches/fixCTrackableType.patch |  31 +++
 .../patches/fixCTypeWorldStorage.patch        |  31 +++
 EtsiClientGen/patches/fixCUnitSystem.patch    |  29 +++
 EtsiClientGen/patches/fixCWorldAnchor.patch   | 139 +++++++++++
 ...horAPI.patch => fixCWorldAnchorsAPI.patch} |   0
 EtsiClientGen/patches/fixCWorldLink.patch     | 203 +++++++++++++++-
 EtsiClientGen/patches/fixCWorldLinkAPI.patch  |  36 ---
 EtsiClientGen/patches/fixCWorldLinksAPI.patch |   6 +-
 EtsiClientGen/patches/fixCommonOpenAPI.patch  | 107 +++++++++
 EtsiClientGen/patches/fixHeaderError.patch    |  37 ---
 .../patches/fixHeaderTrackableType.patch      |  13 +-
 .../patches/fixHeaderTypeWorldStorage.patch   |  26 ++
 .../patches/fixHeaderUnitSystem.patch         |   8 +-
 arf005                                        |   2 +-
 package.json                                  |   7 +-
 23 files changed, 860 insertions(+), 391 deletions(-)
 create mode 100755 EtsiClientGen/patches/applyYamlPatch.sh
 delete mode 100644 EtsiClientGen/patches/fixCError.patch
 create mode 100644 EtsiClientGen/patches/fixCRelocalizationInformation.patch
 create mode 100644 EtsiClientGen/patches/fixCRelocalizationInformationAPI.patch
 create mode 100644 EtsiClientGen/patches/fixCTypeWorldStorage.patch
 create mode 100644 EtsiClientGen/patches/fixCUnitSystem.patch
 create mode 100644 EtsiClientGen/patches/fixCWorldAnchor.patch
 rename EtsiClientGen/patches/{fixCWorldAnchorAPI.patch => fixCWorldAnchorsAPI.patch} (100%)
 delete mode 100644 EtsiClientGen/patches/fixCWorldLinkAPI.patch
 create mode 100644 EtsiClientGen/patches/fixCommonOpenAPI.patch
 delete mode 100644 EtsiClientGen/patches/fixHeaderError.patch
 create mode 100644 EtsiClientGen/patches/fixHeaderTypeWorldStorage.patch

diff --git a/EtsiClientGen/CMakeLists.txt b/EtsiClientGen/CMakeLists.txt
index 2dafe10..63c56bc 100644
--- a/EtsiClientGen/CMakeLists.txt
+++ b/EtsiClientGen/CMakeLists.txt
@@ -14,97 +14,36 @@ option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
 find_package(OpenSSL)
 find_package(CURL REQUIRED)
 
-#if (OPENSSL_FOUND)
-#    message (STATUS "OPENSSL found")
-
-#    set(CMAKE_C_FLAGS "-DOPENSSL")
-#    if(CMAKE_VERSION VERSION_LESS 3.4)
-#        include_directories(${OPENSSL_INCLUDE_DIR})
-#        include_directories(${OPENSSL_INCLUDE_DIRS})
-#        link_directories(${OPENSSL_LIBRARIES})
-#    endif()
-
-#    message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
-#else()
-#    message (STATUS "OpenSSL Not found.")
-#endif()
-
 set(pkgName "worldStorageCClient")
 
 # this default version can be overridden in PreTarget.cmake
 set(PROJECT_VERSION_MAJOR 2)
-set(PROJECT_VERSION_MINOR 1)
+set(PROJECT_VERSION_MINOR 0)
 set(PROJECT_VERSION_PATCH 0)
 
-#if( (DEFINED CURL_INCLUDE_DIR) AND (DEFINED CURL_LIBRARIES))
-#    include_directories(${CURL_INCLUDE_DIR})
-#    set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} ${CURL_LIBRARIES} )
-#else()
-#    find_package(CURL 7.58.0 REQUIRED)
-#    if(CURL_FOUND)
-#        include_directories(${CURL_INCLUDE_DIR})
-#        set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} ${CURL_LIBRARIES} )
-#    else(CURL_FOUND)
-#        message(FATAL_ERROR "Could not find the CURL library and development files.")
-#    endif()
-#endif()
-
-set(SRCS
-    src/list.c
-    src/apiKey.c
-    src/apiClient.c
-    src/binary.c
-    external/cJSON.c
-    model/object.c
-    model/capability.c
-    model/encoding_information_structure.c
-    model/error.c
-    model/get_relocalization_information_200_response.c
-    model/get_relocalization_information_uuids_parameter_inner.c
-    model/mode_world_storage.c
-    model/relocalization_information.c
-    model/relocalization_information_reloc_objects_inner.c
-    model/trackable.c
-    model/trackable_type.c
-    model/type_world_storage.c
-    model/unit_system.c
-    model/world_anchor.c
-    model/world_link.c
-    api/DefaultAPI.c
-    api/RelocalizationInformationAPI.c
-    api/TrackablesAPI.c
-    api/WorldAnchorsAPI.c
-    api/WorldLinksAPI.c
+set(GENERATED_SOURCES_INCLUDE_DIRS
+    ${CMAKE_CURRENT_LIST_DIR}/include
+    ${CMAKE_CURRENT_LIST_DIR}/external
+    ${CMAKE_CURRENT_LIST_DIR}/model
+    ${CMAKE_CURRENT_LIST_DIR}/api
+)
 
+file(GLOB SRCS
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/external/*.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/model/*.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/api/*.c
 )
 
-set(HDRS
-    include/apiClient.h
-    include/list.h
-    include/binary.h
-    include/keyValuePair.h
-    external/cJSON.h
-    model/object.h
-    model/capability.h
-    model/encoding_information_structure.h
-    model/error.h
-    model/get_relocalization_information_200_response.h
-    model/get_relocalization_information_uuids_parameter_inner.h
-    model/mode_world_storage.h
-    model/relocalization_information.h
-    model/relocalization_information_reloc_objects_inner.h
-    model/trackable.h
-    model/trackable_type.h
-    model/type_world_storage.h
-    model/unit_system.h
-    model/world_anchor.h
-    model/world_link.h
-    api/DefaultAPI.h
-    api/RelocalizationInformationAPI.h
-    api/TrackablesAPI.h
-    api/WorldAnchorsAPI.h
-    api/WorldLinksAPI.h
+file(GLOB HDRS
+    ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/external/*.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/model/*.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/api/*.h
+)
 
+include_directories(
+    ${GENERATED_SOURCES_INCLUDE_DIRS}
 )
 
 include(PreTarget.cmake OPTIONAL)
@@ -112,12 +51,17 @@ include(PreTarget.cmake OPTIONAL)
 set(PROJECT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
 
 # Add library with project file with project name as library name
-add_library(${pkgName} STATIC ${SRCS} ${HDRS})
-# Link dependent libraries
-#if(NOT CMAKE_VERSION VERSION_LESS 3.4)
-#    target_link_libraries(${pkgName} PRIVATE OpenSSL::SSL OpenSSL::Crypto)
-#endif()
-#target_link_libraries(${pkgName} PUBLIC ${CURL_LIBRARIES} )
+add_library(${pkgName} STATIC)
+
+target_sources(${pkgName}
+    PRIVATE
+        ${SRCS})
+
+target_include_directories(${pkgName}
+    PUBLIC
+        ${GENERATED_SOURCES_INCLUDE_DIRS}
+)
+
 target_link_libraries(${pkgName}
     PUBLIC
     openssl::openssl
@@ -125,98 +69,11 @@ target_link_libraries(${pkgName}
     -lpthread
     )
 
-target_include_directories(
-    ${pkgName} PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
-    $<INSTALL_INTERFACE:include>
-)
-
-#include(PostTarget.cmake OPTIONAL)
-
-# installation of libraries, headers, and config files
-#if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in)
-#    install(TARGETS ${pkgName} DESTINATION lib)
-#    foreach(HDR_FILE ${HDRS})
-#        get_filename_component(HDR_DIRECTORY ${HDR_FILE} DIRECTORY)
-#        get_filename_component(ABSOLUTE_HDR_DIRECTORY ${HDR_DIRECTORY} ABSOLUTE)
-#        file(RELATIVE_PATH RELATIVE_HDR_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${ABSOLUTE_HDR_DIRECTORY})
-#        install(FILES ${HDR_FILE} DESTINATION include/${pkgName}/${RELATIVE_HDR_PATH})
-#    endforeach()
-#else()
-#    include(GNUInstallDirs)
-#    install(TARGETS ${pkgName} DESTINATION lib EXPORT ${pkgName}Targets)
     install(TARGETS ${pkgName} DESTINATION lib)
+#    install(FILES  ${HDRS} DESTINATION include/${pkgName})
     foreach(HDR_FILE ${HDRS})
         get_filename_component(HDR_DIRECTORY ${HDR_FILE} DIRECTORY)
         get_filename_component(ABSOLUTE_HDR_DIRECTORY ${HDR_DIRECTORY} ABSOLUTE)
         file(RELATIVE_PATH RELATIVE_HDR_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${ABSOLUTE_HDR_DIRECTORY})
         install(FILES ${HDR_FILE} DESTINATION include/${pkgName}/${RELATIVE_HDR_PATH})
     endforeach()
-
-#    include(CMakePackageConfigHelpers)
-#    write_basic_package_version_file(
-#            "${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}ConfigVersion.cmake"
-#            VERSION "${PROJECT_VERSION_STRING}"
-#            COMPATIBILITY AnyNewerVersion
-#    )
-
-#    export(EXPORT ${pkgName}Targets
-#            FILE "${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}Targets.cmake"
-#            NAMESPACE ${pkgName}::
-#            )
-
-#    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
-#            "${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}Config.cmake"
-#            @ONLY
-#            )
-
-#    set(ConfigPackageLocation lib/cmake/${pkgName})
-#    install(EXPORT ${pkgName}Targets
-#            FILE
-#            ${pkgName}Targets.cmake
-#            NAMESPACE
-#            ${pkgName}::
-#            DESTINATION
-#            ${ConfigPackageLocation}
-#            )
-#   install(
-#            FILES
-#            "${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}Config.cmake"
-#            "${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}ConfigVersion.cmake"
-#            DESTINATION
-#            ${ConfigPackageLocation}
-#    )
-#endif()
-
-# make installation packages
-#include(Packing.cmake OPTIONAL)
-
-# Setting file variables to null
-#set(SRCS "")
-#set(HDRS "")
-
-
-## This section shows how to use the above compiled library to compile the source files
-## set source files
-#set(SRCS
-#    unit-tests/manual-DefaultAPI.c
-#    unit-tests/manual-RelocalizationInformationAPI.c
-#    unit-tests/manual-TrackablesAPI.c
-#    unit-tests/manual-WorldAnchorsAPI.c
-#    unit-tests/manual-WorldLinksAPI.c
-#)
-
-##set header files
-#set(HDRS
-#)
-
-## loop over all files in SRCS variable
-#foreach(SOURCE_FILE ${SRCS})
-#    # Get only the file name from the file as add_executable does not support executable with slash("/")
-#    get_filename_component(FILE_NAME_ONLY ${SOURCE_FILE} NAME_WE)
-#    # Remove .c from the file name and set it as executable name
-#    string( REPLACE ".c" "" EXECUTABLE_FILE ${FILE_NAME_ONLY})
-#    # Add executable for every source file in  SRCS
-#    add_executable(unit-${EXECUTABLE_FILE} ${SOURCE_FILE})
-#    # Link above created library to executable and dependent library curl
-#    target_link_libraries(unit-${EXECUTABLE_FILE} ${CURL_LIBRARIES} ${pkgName} )
-#endforeach(SOURCE_FILE ${SRCS})
diff --git a/EtsiClientGen/patches/applyPatches.sh b/EtsiClientGen/patches/applyPatches.sh
index 1dfd8e6..3c71722 100755
--- a/EtsiClientGen/patches/applyPatches.sh
+++ b/EtsiClientGen/patches/applyPatches.sh
@@ -1,17 +1,26 @@
 #!/bin/bash
-#patch -u ../model/encoding_information_structure.c -i fixCEncodingInformationStructure.patch
-#patch -u ../model/error.c -i fixCError.patch
-#patch -u ../model/trackable.c -i fixCTrackable.patch
 patch -u ../api/TrackablesAPI.c -i fixCTrackableAPI.patch
-#patch -u ../model/trackable_type.c -i fixCTrackableType.patch
-patch -u ../api/WorldAnchorsAPI.c -i fixCWorldAnchorAPI.patch
-patch -u ../model/world_link.c -i fixCWorldLink.patch
 patch -u ../api/WorldLinksAPI.c -i fixCWorldLinksAPI.patch
-#patch -u ../model/error.h -i fixHeaderError.patch
+patch -u ../api/WorldAnchorsAPI.c -i fixCWorldAnchorsAPI.patch
+patch -u ../api/RelocalizationInformationAPI.c -i fixCRelocalizationInformationAPI.patch
+
 patch -u ../model/trackable.h -i fixHeaderTrackable.patch
-#patch -u ../model/trackable_type.h -i fixHeaderTrackableType.patch
-#patch -u ../model/unit_system.h -i fixHeaderUnitSystem.patch
+patch -u ../model/trackable.c -i fixCTrackable.patch
 patch -u ../model/world_link.h -i fixHeaderWorldLink.patch
+patch -u ../model/world_link.c -i fixCWorldLink.patch
+patch -u ../model/world_anchor.c -i fixCWorldAnchor.patch
+patch -u ../model/relocalization_information.c -i fixCRelocalizationInformation.patch
+patch -u ../model/trackable_type.h -i fixHeaderTrackableType.patch
+patch -u ../model/trackable_type.c -i fixCTrackableType.patch
+patch -u ../model/unit_system.h -i fixHeaderUnitSystem.patch
+patch -u ../model/unit_system.c -i fixCUnitSystem.patch
+patch -u ../model/type_world_storage.h -i fixHeaderTypeWorldStorage.patch
+patch -u ../model/type_world_storage.c -i fixCTypeWorldStorage.patch
+patch -u ../model/encoding_information_structure.c -i fixCEncodingInformationStructure.patch
+
+
+
+
 
 
 
diff --git a/EtsiClientGen/patches/applyYamlPatch.sh b/EtsiClientGen/patches/applyYamlPatch.sh
new file mode 100755
index 0000000..c2c36a6
--- /dev/null
+++ b/EtsiClientGen/patches/applyYamlPatch.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+cp ../arf005/API/common/commonopenapi.yaml ../arf005/API/common/commonopenapiOriginal.yaml && patch -u ../arf005/API/common/commonopenapi.yaml -i patches/fixCommonOpenAPI.patch
\ No newline at end of file
diff --git a/EtsiClientGen/patches/fixCEncodingInformationStructure.patch b/EtsiClientGen/patches/fixCEncodingInformationStructure.patch
index d931482..1c59759 100644
--- a/EtsiClientGen/patches/fixCEncodingInformationStructure.patch
+++ b/EtsiClientGen/patches/fixCEncodingInformationStructure.patch
@@ -1,5 +1,5 @@
---- encoding_information_structure_origin.c	2024-05-28 14:41:34.817357145 +0200
-+++ encoding_information_structure.c	2024-05-22 18:34:03.566752000 +0200
+--- encoding_information_structure.c	2024-09-24 10:49:45.759574129 +0200
++++ encoding_information_structure_corrected.c	2024-09-24 10:33:23.787521014 +0200
 @@ -56,7 +56,7 @@
      if (world_storage_api_encoding_information_structure_DATAFORMAT_NULL == encoding_information_structure->data_format) {
          goto fail;
diff --git a/EtsiClientGen/patches/fixCError.patch b/EtsiClientGen/patches/fixCError.patch
deleted file mode 100644
index 4e39e74..0000000
--- a/EtsiClientGen/patches/fixCError.patch
+++ /dev/null
@@ -1,46 +0,0 @@
---- error_origin.c	2024-05-28 14:41:34.827357147 +0200
-+++ error.c	2024-05-21 17:10:43.422284000 +0200
-@@ -5,11 +5,11 @@
- 
- 
- 
--error_t *error_create(
-+error__t *error_create(
-     int code,
-     char *message
-     ) {
--    error_t *error_local_var = malloc(sizeof(error_t));
-+    error__t *error_local_var = malloc(sizeof(error__t));
-     if (!error_local_var) {
-         return NULL;
-     }
-@@ -20,7 +20,7 @@
- }
- 
- 
--void error_free(error_t *error) {
-+void error_free(error__t *error) {
-     if(NULL == error){
-         return ;
-     }
-@@ -32,7 +32,7 @@
-     free(error);
- }
- 
--cJSON *error_convertToJSON(error_t *error) {
-+cJSON *error_convertToJSON(error__t *error) {
-     cJSON *item = cJSON_CreateObject();
- 
-     // error->code
-@@ -60,9 +60,9 @@
-     return NULL;
- }
- 
--error_t *error_parseFromJSON(cJSON *errorJSON){
-+error__t *error_parseFromJSON(cJSON *errorJSON){
- 
--    error_t *error_local_var = NULL;
-+    error__t *error_local_var = NULL;
- 
-     // error->code
-     cJSON *code = cJSON_GetObjectItemCaseSensitive(errorJSON, "code");
diff --git a/EtsiClientGen/patches/fixCRelocalizationInformation.patch b/EtsiClientGen/patches/fixCRelocalizationInformation.patch
new file mode 100644
index 0000000..f89113c
--- /dev/null
+++ b/EtsiClientGen/patches/fixCRelocalizationInformation.patch
@@ -0,0 +1,34 @@
+--- relocalization_information.c	2024-09-24 10:36:39.887514876 +0200
++++ relocalization_information_corrected.c	2024-09-24 10:34:40.147520509 +0200
+@@ -75,11 +75,17 @@
+ 
+     // relocalization_information->request_type
+     if(relocalization_information->request_type != world_storage_api_relocalization_information__NULL) {
+-    cJSON *request_type_local_JSON = type_world_storage_convertToJSON(relocalization_information->request_type);
++    cJSON *request_type_local_JSON = type_world_storage_type_world_storage_convertToJSON(*relocalization_information->request_type);
+     if(request_type_local_JSON == NULL) {
+         goto fail; // custom
+     }
+-    cJSON_AddItemToObject(item, "requestType", request_type_local_JSON);
++    char *type_str = cJSON_GetStringValue(request_type_local_JSON);
++    if (type_str == NULL) {
++        goto fail;
++    }
++    if (cJSON_AddStringToObject(item, "requestType", type_str) == NULL) {
++        goto fail;
++    }
+     if(item->child == NULL) {
+         goto fail;
+     }
+@@ -133,9 +139,10 @@
+     }
+ 
+     // relocalization_information->request_type
++    request_type_local_nonprim = (type_world_storage_t *)malloc(sizeof(type_world_storage_t));
+     cJSON *request_type = cJSON_GetObjectItemCaseSensitive(relocalization_informationJSON, "requestType");
+     if (request_type) { 
+-    request_type_local_nonprim = type_world_storage_parseFromJSON(request_type); //custom
++        *request_type_local_nonprim = type_world_storage_type_world_storage_parseFromJSON(request_type); //custom
+     }
+ 
+     // relocalization_information->reloc_objects
diff --git a/EtsiClientGen/patches/fixCRelocalizationInformationAPI.patch b/EtsiClientGen/patches/fixCRelocalizationInformationAPI.patch
new file mode 100644
index 0000000..0fb19c7
--- /dev/null
+++ b/EtsiClientGen/patches/fixCRelocalizationInformationAPI.patch
@@ -0,0 +1,33 @@
+--- RelocalizationInformationAPI.c	2024-09-24 12:40:39.813589333 +0200
++++ RelocalizationInformationAPI_corrected.c	2024-09-24 12:47:02.502313400 +0200
+@@ -47,14 +47,28 @@
+     // query parameters
+     if (uuids)
+     {
+-        list_addElement(localVarQueryParameters,uuids);
++        listEntry_t *uuid = NULL;
++        list_ForEach(uuid, uuids) {
++            char *element = (char *)uuid->data;
++            char *key = strdup("uuids");
++            keyValuePair_t *keyPair = keyValuePair_create(key, element);
++            list_addElement(localVarQueryParameters, keyPair);
++        }
+     }
+ 
++
+     // query parameters
+     if (capabilities)
+     {
+-        list_addElement(localVarQueryParameters,capabilities);
++        listEntry_t *cap = NULL;
++        list_ForEach(cap, capabilities) {
++           char *element = (char *)cap->data;
++            char *key = strdup("capabilities");
++            keyValuePair_t *keyPair = keyValuePair_create(key, element);
++            list_addElement(localVarQueryParameters, keyPair);
++        }
+     }
++    
+     list_addElement(localVarHeaderType,"application/json"); //produces
+     apiClient_invoke(apiClient,
+                     localVarPath,
diff --git a/EtsiClientGen/patches/fixCTrackable.patch b/EtsiClientGen/patches/fixCTrackable.patch
index 8440edc..8db2e0d 100644
--- a/EtsiClientGen/patches/fixCTrackable.patch
+++ b/EtsiClientGen/patches/fixCTrackable.patch
@@ -1,54 +1,7 @@
---- trackable_origin.c	2024-05-28 14:41:34.877357153 +0200
-+++ trackable.c	2024-05-22 18:50:02.874278000 +0200
-@@ -3,42 +3,6 @@
- #include <stdio.h>
- #include "trackable.h"
- 
--
--char* trackable_trackable_type_ToString(world_storage_api_trackable__e trackable_type) {
--    char* trackable_typeArray[] =  { "NULL", "FIDUCIAL_MARKER", "IMAGE_MARKER", "MESH", "MAP", "GEOPOSE", "OTHER" };
--    return trackable_typeArray[trackable_type];
--}
--
--world_storage_api_trackable__e trackable_trackable_type_FromString(char* trackable_type){
--    int stringToReturn = 0;
--    char *trackable_typeArray[] =  { "NULL", "FIDUCIAL_MARKER", "IMAGE_MARKER", "MESH", "MAP", "GEOPOSE", "OTHER" };
--    size_t sizeofArray = sizeof(trackable_typeArray) / sizeof(trackable_typeArray[0]);
--    while(stringToReturn < sizeofArray) {
--        if(strcmp(trackable_type, trackable_typeArray[stringToReturn]) == 0) {
--            return stringToReturn;
--        }
--        stringToReturn++;
--    }
--    return 0;
--}
--char* trackable_unit_ToString(world_storage_api_trackable__e unit) {
--    char* unitArray[] =  { "NULL", "MM", "CM", "DM", "M", "DAM", "HM", "KM", "INCH", "FOOT", "YARD", "MILE" };
--    return unitArray[unit];
--}
--
--world_storage_api_trackable__e trackable_unit_FromString(char* unit){
--    int stringToReturn = 0;
--    char *unitArray[] =  { "NULL", "MM", "CM", "DM", "M", "DAM", "HM", "KM", "INCH", "FOOT", "YARD", "MILE" };
--    size_t sizeofArray = sizeof(unitArray) / sizeof(unitArray[0]);
--    while(stringToReturn < sizeofArray) {
--        if(strcmp(unit, unitArray[stringToReturn]) == 0) {
--            return stringToReturn;
--        }
--        stringToReturn++;
--    }
--    return 0;
--}
--
- trackable_t *trackable_create(
-     char *uuid,
-     char *name,
-@@ -162,10 +126,10 @@
- 
- 
-     // trackable->trackable_type
--    if (world_storage_api_trackable__NULL == trackable->trackable_type) {
-+    if (world_storage_api_trackable_type__NULL == trackable->trackable_type) {
+--- trackable.c	2024-09-24 10:36:39.897514879 +0200
++++ trackable_corrected.c	2024-09-24 10:33:09.037517067 +0200
+@@ -165,11 +165,18 @@
+     if (world_storage_api_trackable__NULL == trackable->trackable_type) {
          goto fail;
      }
 -    cJSON *trackable_type_local_JSON = trackable_type_convertToJSON(trackable->trackable_type);
@@ -56,12 +9,20 @@
      if(trackable_type_local_JSON == NULL) {
          goto fail; // custom
      }
-@@ -217,10 +181,10 @@
- 
- 
-     // trackable->unit
--    if (world_storage_api_trackable__NULL == trackable->unit) {
-+    if (world_storage_api_unit_system__NULL == trackable->unit) {
+-    cJSON_AddItemToObject(item, "trackableType", trackable_type_local_JSON);
++    char *type_str = cJSON_GetStringValue(trackable_type_local_JSON);
++    if (type_str == NULL) {
++        goto fail;
++    }
++    if (cJSON_AddStringToObject(item, "trackableType", type_str) == NULL) {
++        goto fail;
++    }
++
+     if(item->child == NULL) {
+         goto fail;
+     }
+@@ -220,11 +227,17 @@
+     if (world_storage_api_trackable__NULL == trackable->unit) {
          goto fail;
      }
 -    cJSON *unit_local_JSON = unit_system_convertToJSON(trackable->unit);
@@ -69,7 +30,64 @@
      if(unit_local_JSON == NULL) {
          goto fail; // custom
      }
-@@ -342,7 +306,7 @@
+-    cJSON_AddItemToObject(item, "unit", unit_local_JSON);
++    char *unit_str = cJSON_GetStringValue(unit_local_JSON);
++    if (unit_str == NULL) {
++        goto fail;
++    }
++    if (cJSON_AddStringToObject(item, "unit", unit_str) == NULL) {
++        goto fail;
++    }
+     if(item->child == NULL) {
+         goto fail;
+     }
+@@ -249,22 +262,25 @@
+ 
+ 
+     // trackable->keyvalue_tags
+-    if (!trackable->keyvalue_tags) {
+-        goto fail;
+-    }
+-    cJSON *keyvalue_tags = cJSON_AddObjectToObject(item, "keyvalueTags");
+-    if(keyvalue_tags == NULL) {
+-        goto fail; //primitive map container
+-    }
+-    cJSON *localMapObject = keyvalue_tags;
+-    listEntry_t *keyvalue_tagsListEntry;
+     if (trackable->keyvalue_tags) {
+-    list_ForEach(keyvalue_tagsListEntry, trackable->keyvalue_tags) {
+-        keyValuePair_t *localKeyValue = (keyValuePair_t*)keyvalue_tagsListEntry->data;
+-    }
++        cJSON *keyvalue_tags_JSON = cJSON_CreateObject();
++        listEntry_t *listEntry = NULL;
++        list_ForEach(listEntry, trackable->keyvalue_tags) {
++            
++            keyValuePair_t *pair = (keyValuePair_t *)listEntry->data;
++            if (pair && pair->value) {
++                cJSON *values_array = cJSON_CreateArray();
++                listEntry_t *valueEntry = NULL;
++                list_ForEach(valueEntry, (list_t*)pair->value) {
++                    char *value = (char *)valueEntry->data;
++                    cJSON_AddItemToArray(values_array, cJSON_CreateString(value));
++                }
++                cJSON_AddItemToObject(keyvalue_tags_JSON, pair->key, values_array);
++            }
++        }
++        cJSON_AddItemToObject(item, "keyvalueTags", keyvalue_tags_JSON);
+     }
+ 
+-
+     // trackable->confidence
+     if(trackable->confidence) {
+     if(cJSON_AddNumberToObject(item, "confidence", trackable->confidence) == NULL) {
+@@ -336,13 +352,14 @@
+     }
+ 
+     // trackable->trackable_type
++    trackable_type_local_nonprim = (trackable_type_t *)malloc(sizeof(trackable_type_t));
+     cJSON *trackable_type = cJSON_GetObjectItemCaseSensitive(trackableJSON, "trackableType");
+     if (!trackable_type) {
+         goto end;
      }
  
      
@@ -78,12 +96,99 @@
  
      // trackable->trackable_encoding_information
      cJSON *trackable_encoding_information = cJSON_GetObjectItemCaseSensitive(trackableJSON, "trackableEncodingInformation");
-@@ -400,7 +364,7 @@
+@@ -394,13 +411,14 @@
      }
  
+     // trackable->unit
++    unit_local_nonprim = (unit_system_t *)malloc(sizeof(unit_system_t));
+     cJSON *unit = cJSON_GetObjectItemCaseSensitive(trackableJSON, "unit");
+     if (!unit) {
+         goto end;
+     }
+-
      
 -    unit_local_nonprim = unit_system_parseFromJSON(unit); //custom
++
 +    *unit_local_nonprim = unit_system_unit_system_parseFromJSON(unit); //custom
  
      // trackable->trackable_size
      cJSON *trackable_size = cJSON_GetObjectItemCaseSensitive(trackableJSON, "trackableSize");
+@@ -432,24 +450,43 @@
+ 
+     // trackable->keyvalue_tags
+     cJSON *keyvalue_tags = cJSON_GetObjectItemCaseSensitive(trackableJSON, "keyvalueTags");
+-    if (!keyvalue_tags) {
+-        goto end;
+-    }
+-
+-    
+-    cJSON *keyvalue_tags_local_map = NULL;
+-    if(!cJSON_IsObject(keyvalue_tags) && !cJSON_IsNull(keyvalue_tags))
+-    {
+-        goto end;//primitive map container
+-    }
+-    if(cJSON_IsObject(keyvalue_tags))
+-    {
++    if (keyvalue_tags) {
++        if (!cJSON_IsObject(keyvalue_tags)) {
++            goto end;
++        }
+         keyvalue_tagsList = list_createList();
+-        keyValuePair_t *localMapKeyPair;
+-        cJSON_ArrayForEach(keyvalue_tags_local_map, keyvalue_tags)
+-        {
+-            cJSON *localMapObject = keyvalue_tags_local_map;
+-            list_addElement(keyvalue_tagsList , localMapKeyPair);
++        if (!keyvalue_tagsList) {
++            goto end;
++        }
++        cJSON *key = NULL;
++        cJSON_ArrayForEach(key, keyvalue_tags) {
++            if (cJSON_IsArray(key)) {
++                list_t *valuesList = list_createList();
++                if (!valuesList) {
++                    goto end;
++                }
++                cJSON *value = NULL;
++                cJSON_ArrayForEach(value, key) {
++                    if (cJSON_IsString(value)) {
++                        char *valueString = strdup(value->valuestring);
++                        if (!valueString) {
++                            goto end;
++                        }
++                        list_addElement(valuesList, valueString);
++                    }
++                }
++                keyValuePair_t *pair = malloc(sizeof(keyValuePair_t));
++                if (!pair) {
++                    goto end;
++                }
++                pair->key = strdup(key->string);
++                if (!pair->key) {
++                    free(pair);
++                    goto end;
++                }
++                pair->value = valuesList;
++                list_addElement(keyvalue_tagsList, pair);
++            }
+         }
+     }
+ 
+@@ -480,7 +517,7 @@
+     return trackable_local_var;
+ end:
+     if (trackable_type_local_nonprim) {
+-        trackable_type_free(trackable_type_local_nonprim);
++        free(trackable_type_local_nonprim);
+         trackable_type_local_nonprim = NULL;
+     }
+     if (trackable_encoding_information_local_nonprim) {
+@@ -497,7 +534,7 @@
+         local_crsList = NULL;
+     }
+     if (unit_local_nonprim) {
+-        unit_system_free(unit_local_nonprim);
++        free(unit_local_nonprim);
+         unit_local_nonprim = NULL;
+     }
+     if (trackable_sizeList) {
diff --git a/EtsiClientGen/patches/fixCTrackableType.patch b/EtsiClientGen/patches/fixCTrackableType.patch
index e69de29..5e59767 100644
--- a/EtsiClientGen/patches/fixCTrackableType.patch
+++ b/EtsiClientGen/patches/fixCTrackableType.patch
@@ -0,0 +1,31 @@
+--- trackable_type.c	2024-09-24 10:41:35.625293525 +0200
++++ trackable_type_corrected.c	2024-09-24 10:34:24.617518820 +0200
+@@ -23,8 +23,9 @@
+ }
+ 
+ cJSON *trackable_type_trackable_type_convertToJSON(world_storage_api_trackable_type__e trackable_type) {
+-    cJSON *item = cJSON_CreateObject();
+-    if(cJSON_AddStringToObject(item, "trackable_type", trackable_type_trackable_type_ToString(trackable_type)) == NULL) {
++    cJSON *item =cJSON_CreateString(trackable_type_trackable_type_ToString(trackable_type));;
++    if(item == NULL) {
++
+         goto fail;
+     }
+     return item;
+@@ -34,13 +35,12 @@
+ }
+ 
+ world_storage_api_trackable_type__e trackable_type_trackable_type_parseFromJSON(cJSON *trackable_typeJSON) {
+-    world_storage_api_trackable_type__e *trackable_type = NULL;
+     world_storage_api_trackable_type__e trackable_typeVariable;
+-    cJSON *trackable_typeVar = cJSON_GetObjectItemCaseSensitive(trackable_typeJSON, "trackable_type");
+-    if(!cJSON_IsString(trackable_typeVar) || (trackable_typeVar->valuestring == NULL)){
++    if(!cJSON_IsString(trackable_typeJSON)){
++
+         goto end;
+     }
+-    trackable_typeVariable = trackable_type_trackable_type_FromString(trackable_typeVar->valuestring);
++    trackable_typeVariable = trackable_type_trackable_type_FromString(trackable_typeJSON->valuestring);
+     return trackable_typeVariable;
+ end:
+     return 0;
diff --git a/EtsiClientGen/patches/fixCTypeWorldStorage.patch b/EtsiClientGen/patches/fixCTypeWorldStorage.patch
new file mode 100644
index 0000000..df7e52f
--- /dev/null
+++ b/EtsiClientGen/patches/fixCTypeWorldStorage.patch
@@ -0,0 +1,31 @@
+--- type_world_storage.c	2024-09-24 10:50:11.879568737 +0200
++++ type_world_storage_corrected.c	2024-09-24 10:51:42.190336300 +0200
+@@ -23,8 +23,10 @@
+ }
+ 
+ cJSON *type_world_storage_type_world_storage_convertToJSON(world_storage_api_type_world_storage__e type_world_storage) {
+-    cJSON *item = cJSON_CreateObject();
+-    if(cJSON_AddStringToObject(item, "type_world_storage", type_world_storage_type_world_storage_ToString(type_world_storage)) == NULL) {
++    cJSON *item = cJSON_CreateString(type_world_storage_type_world_storage_ToString(type_world_storage));
++    if(item == NULL) {
++        
++
+         goto fail;
+     }
+     return item;
+@@ -34,13 +36,11 @@
+ }
+ 
+ world_storage_api_type_world_storage__e type_world_storage_type_world_storage_parseFromJSON(cJSON *type_world_storageJSON) {
+-    world_storage_api_type_world_storage__e *type_world_storage = NULL;
+     world_storage_api_type_world_storage__e type_world_storageVariable;
+-    cJSON *type_world_storageVar = cJSON_GetObjectItemCaseSensitive(type_world_storageJSON, "type_world_storage");
+-    if(!cJSON_IsString(type_world_storageVar) || (type_world_storageVar->valuestring == NULL)){
++    if(!cJSON_IsString(type_world_storageJSON)){
+         goto end;
+     }
+-    type_world_storageVariable = type_world_storage_type_world_storage_FromString(type_world_storageVar->valuestring);
++    type_world_storageVariable = type_world_storage_type_world_storage_FromString(type_world_storageJSON->valuestring);
+     return type_world_storageVariable;
+ end:
+     return 0;
diff --git a/EtsiClientGen/patches/fixCUnitSystem.patch b/EtsiClientGen/patches/fixCUnitSystem.patch
new file mode 100644
index 0000000..2f9bdb8
--- /dev/null
+++ b/EtsiClientGen/patches/fixCUnitSystem.patch
@@ -0,0 +1,29 @@
+--- unit_system.c	2024-09-24 10:50:11.879568737 +0200
++++ unit_system_corrected.c	2024-09-24 10:54:29.880310200 +0200
+@@ -23,8 +23,8 @@
+ }
+ 
+ cJSON *unit_system_unit_system_convertToJSON(world_storage_api_unit_system__e unit_system) {
+-    cJSON *item = cJSON_CreateObject();
+-    if(cJSON_AddStringToObject(item, "unit_system", unit_system_unit_system_ToString(unit_system)) == NULL) {
++    cJSON *item = cJSON_CreateString(unit_system_unit_system_ToString(unit_system));
++    if (item == NULL) {
+         goto fail;
+     }
+     return item;
+@@ -34,13 +34,11 @@
+ }
+ 
+ world_storage_api_unit_system__e unit_system_unit_system_parseFromJSON(cJSON *unit_systemJSON) {
+-    world_storage_api_unit_system__e *unit_system = NULL;
+     world_storage_api_unit_system__e unit_systemVariable;
+-    cJSON *unit_systemVar = cJSON_GetObjectItemCaseSensitive(unit_systemJSON, "unit_system");
+-    if(!cJSON_IsString(unit_systemVar) || (unit_systemVar->valuestring == NULL)){
++    if(!cJSON_IsString(unit_systemJSON)){
+         goto end;
+     }
+-    unit_systemVariable = unit_system_unit_system_FromString(unit_systemVar->valuestring);
++    unit_systemVariable = unit_system_unit_system_FromString(unit_systemJSON->valuestring);
+     return unit_systemVariable;
+ end:
+     return 0;
diff --git a/EtsiClientGen/patches/fixCWorldAnchor.patch b/EtsiClientGen/patches/fixCWorldAnchor.patch
new file mode 100644
index 0000000..5bac89f
--- /dev/null
+++ b/EtsiClientGen/patches/fixCWorldAnchor.patch
@@ -0,0 +1,139 @@
+--- world_anchor.c	2024-09-24 10:36:39.937514888 +0200
++++ world_anchor_corrected.c	2024-09-24 10:32:46.927512827 +0200
+@@ -146,11 +146,17 @@
+     if (world_storage_api_world_anchor__NULL == world_anchor->unit) {
+         goto fail;
+     }
+-    cJSON *unit_local_JSON = unit_system_convertToJSON(world_anchor->unit);
++    cJSON *unit_local_JSON = unit_system_unit_system_convertToJSON(*world_anchor->unit);
+     if(unit_local_JSON == NULL) {
+         goto fail; // custom
+     }
+-    cJSON_AddItemToObject(item, "unit", unit_local_JSON);
++    char *unit_str = cJSON_GetStringValue(unit_local_JSON);
++    if (unit_str == NULL) {
++        goto fail;
++    }
++    if (cJSON_AddStringToObject(item, "unit", unit_str) == NULL) {
++        goto fail;
++    }
+     if(item->child == NULL) {
+         goto fail;
+     }
+@@ -175,19 +181,23 @@
+ 
+ 
+     // world_anchor->keyvalue_tags
+-    if (!world_anchor->keyvalue_tags) {
+-        goto fail;
+-    }
+-    cJSON *keyvalue_tags = cJSON_AddObjectToObject(item, "keyvalueTags");
+-    if(keyvalue_tags == NULL) {
+-        goto fail; //primitive map container
+-    }
+-    cJSON *localMapObject = keyvalue_tags;
+-    listEntry_t *keyvalue_tagsListEntry;
+     if (world_anchor->keyvalue_tags) {
+-    list_ForEach(keyvalue_tagsListEntry, world_anchor->keyvalue_tags) {
+-        keyValuePair_t *localKeyValue = (keyValuePair_t*)keyvalue_tagsListEntry->data;
+-    }
++        cJSON *keyvalue_tags_JSON = cJSON_CreateObject();
++        listEntry_t *listEntry = NULL;
++        list_ForEach(listEntry, world_anchor->keyvalue_tags) {
++            
++            keyValuePair_t *pair = (keyValuePair_t *)listEntry->data;
++            if (pair && pair->value) {
++                cJSON *values_array = cJSON_CreateArray();
++                listEntry_t *valueEntry = NULL;
++                list_ForEach(valueEntry, (list_t*)pair->value) {
++                    char *value = (char *)valueEntry->data;
++                    cJSON_AddItemToArray(values_array, cJSON_CreateString(value));
++                }
++                cJSON_AddItemToObject(keyvalue_tags_JSON, pair->key, values_array);
++            }
++        }
++        cJSON_AddItemToObject(item, "keyvalueTags", keyvalue_tags_JSON);
+     }
+ 
+     return item;
+@@ -276,13 +286,14 @@
+     }
+ 
+     // world_anchor->unit
++    unit_local_nonprim = (unit_system_t *)malloc(sizeof(unit_system_t));
+     cJSON *unit = cJSON_GetObjectItemCaseSensitive(world_anchorJSON, "unit");
+     if (!unit) {
+         goto end;
+     }
+ 
+     
+-    unit_local_nonprim = unit_system_parseFromJSON(unit); //custom
++    *unit_local_nonprim = unit_system_unit_system_parseFromJSON(unit); //custom
+ 
+     // world_anchor->world_anchor_size
+     cJSON *world_anchor_size = cJSON_GetObjectItemCaseSensitive(world_anchorJSON, "worldAnchorSize");
+@@ -314,28 +325,46 @@
+ 
+     // world_anchor->keyvalue_tags
+     cJSON *keyvalue_tags = cJSON_GetObjectItemCaseSensitive(world_anchorJSON, "keyvalueTags");
+-    if (!keyvalue_tags) {
+-        goto end;
+-    }
+-
+-    
+-    cJSON *keyvalue_tags_local_map = NULL;
+-    if(!cJSON_IsObject(keyvalue_tags) && !cJSON_IsNull(keyvalue_tags))
+-    {
+-        goto end;//primitive map container
+-    }
+-    if(cJSON_IsObject(keyvalue_tags))
+-    {
++    if (keyvalue_tags) {
++        if(!cJSON_IsObject(keyvalue_tags)) {
++            goto end;
++        }
+         keyvalue_tagsList = list_createList();
+-        keyValuePair_t *localMapKeyPair;
+-        cJSON_ArrayForEach(keyvalue_tags_local_map, keyvalue_tags)
+-        {
+-            cJSON *localMapObject = keyvalue_tags_local_map;
+-            list_addElement(keyvalue_tagsList , localMapKeyPair);
++        if (!keyvalue_tagsList) {
++            goto end;
++        }
++        cJSON *key = NULL;
++        cJSON_ArrayForEach(key, keyvalue_tags) {
++            if (cJSON_IsArray(key)) {
++                list_t *valuesList = list_createList();
++                if (!valuesList) {
++                    goto end;
++                }
++                cJSON *value = NULL;
++                cJSON_ArrayForEach(value, key) {
++                    if (cJSON_IsString(value)) {
++                        char *valueString = strdup(value->valuestring);
++                        if (!valueString) {
++                            goto end;
++                        }
++                        list_addElement(valuesList, valueString);
++                    }
++                }
++                keyValuePair_t *pair = malloc(sizeof(keyValuePair_t));
++                if (!pair) {
++                    goto end;
++                }
++                pair->key = strdup(key->string);
++                if (!pair->key) {
++                    free(pair);
++                    goto end;
++                }
++                pair->value = valuesList;
++                list_addElement(keyvalue_tagsList, pair);
++            }
+         }
+     }
+ 
+-
+     world_anchor_local_var = world_anchor_create (
+         uuid && !cJSON_IsNull(uuid) ? strdup(uuid->valuestring) : NULL,
+         strdup(name->valuestring),
diff --git a/EtsiClientGen/patches/fixCWorldAnchorAPI.patch b/EtsiClientGen/patches/fixCWorldAnchorsAPI.patch
similarity index 100%
rename from EtsiClientGen/patches/fixCWorldAnchorAPI.patch
rename to EtsiClientGen/patches/fixCWorldAnchorsAPI.patch
diff --git a/EtsiClientGen/patches/fixCWorldLink.patch b/EtsiClientGen/patches/fixCWorldLink.patch
index a9b6a9b..9dda6a3 100644
--- a/EtsiClientGen/patches/fixCWorldLink.patch
+++ b/EtsiClientGen/patches/fixCWorldLink.patch
@@ -1,5 +1,5 @@
---- world_link_origin.c	2024-05-17 23:43:30.883486119 +0200
-+++ world_link.c	2024-05-17 23:43:53.193634445 +0200
+--- world_link.c	2024-09-24 12:39:53.283530971 +0200
++++ world_link_corrected.c	2024-09-24 12:39:28.875931800 +0200
 @@ -4,58 +4,6 @@
  #include "world_link.h"
  
@@ -59,7 +59,7 @@
  world_link_t *world_link_create(
      char *uuid,
      char *creator_uuid,
-@@ -177,7 +125,7 @@
+@@ -177,28 +125,40 @@
  
  
      // world_link->type_from
@@ -67,17 +67,47 @@
 +    if (world_storage_api_type_world_storage__NULL == world_link->type_from) {
          goto fail;
      }
-     cJSON *type_from_local_JSON = type_world_storage_convertToJSON(world_link->type_from);
-@@ -191,7 +139,7 @@
- 
+-    cJSON *type_from_local_JSON = type_world_storage_convertToJSON(world_link->type_from);
++    cJSON *type_from_local_JSON = type_world_storage_type_world_storage_convertToJSON(*world_link->type_from);
+     if(type_from_local_JSON == NULL) {
+         goto fail; // custom
+     }
+-    cJSON_AddItemToObject(item, "typeFrom", type_from_local_JSON);
++    char *type_from_str = cJSON_GetStringValue(type_from_local_JSON);    
++    if (type_from_str == NULL) {      
++        goto fail;
++    }
++   if (cJSON_AddStringToObject(item, "typeFrom", type_from_str) == NULL) {  
++        goto fail;
++    }
+     if(item->child == NULL) {
+         goto fail;
+     }
  
+-
      // world_link->type_to
 -    if (world_storage_api_world_link__NULL == world_link->type_to) {
 +    if (world_storage_api_type_world_storage__NULL == world_link->type_to) {
          goto fail;
      }
-     cJSON *type_to_local_JSON = type_world_storage_convertToJSON(world_link->type_to);
-@@ -223,7 +171,7 @@
+-    cJSON *type_to_local_JSON = type_world_storage_convertToJSON(world_link->type_to);
++    cJSON *type_to_local_JSON = type_world_storage_type_world_storage_convertToJSON(*world_link->type_to);
+     if(type_to_local_JSON == NULL) {
+         goto fail; // custom
+     }
+-    cJSON_AddItemToObject(item, "typeTo", type_to_local_JSON);
++    char *type_to_str = cJSON_GetStringValue(type_to_local_JSON);
++    if (type_to_str == NULL) {
++        goto fail;
++    }
++   if (cJSON_AddStringToObject(item, "typeTo", type_to_str) == NULL) {
++        goto fail;
++    }
++
+     if(item->child == NULL) {
+         goto fail;
+     }
+@@ -223,33 +183,44 @@
  
  
      // world_link->unit
@@ -85,4 +115,159 @@
 +    if (world_storage_api_unit_system__NULL == world_link->unit) {
          goto fail;
      }
-     cJSON *unit_local_JSON = unit_system_convertToJSON(world_link->unit);
+-    cJSON *unit_local_JSON = unit_system_convertToJSON(world_link->unit);
++    cJSON *unit_local_JSON = unit_system_unit_system_convertToJSON(*world_link->unit);
+     if(unit_local_JSON == NULL) {
+         goto fail; // custom
+     }
+-    cJSON_AddItemToObject(item, "unit", unit_local_JSON);
++    char *unit_str = cJSON_GetStringValue(unit_local_JSON);
++    if (unit_str == NULL) {
++        goto fail;
++    }
++    if (cJSON_AddStringToObject(item, "unit", unit_str) == NULL) {
++        goto fail;
++    }
++
+     if(item->child == NULL) {
+         goto fail;
+     }
+ 
+ 
+     // world_link->keyvalue_tags
+-    if (!world_link->keyvalue_tags) {
+-        goto fail;
+-    }
+-    cJSON *keyvalue_tags = cJSON_AddObjectToObject(item, "keyvalueTags");
+-    if(keyvalue_tags == NULL) {
+-        goto fail; //primitive map container
+-    }
+-    cJSON *localMapObject = keyvalue_tags;
+-    listEntry_t *keyvalue_tagsListEntry;
+     if (world_link->keyvalue_tags) {
+-    list_ForEach(keyvalue_tagsListEntry, world_link->keyvalue_tags) {
+-        keyValuePair_t *localKeyValue = (keyValuePair_t*)keyvalue_tagsListEntry->data;
+-    }
++        cJSON *keyvalue_tags_JSON = cJSON_CreateObject();
++        listEntry_t *listEntry = NULL;
++        list_ForEach(listEntry, world_link->keyvalue_tags) {
++            
++            keyValuePair_t *pair = (keyValuePair_t *)listEntry->data;
++            if (pair && pair->value) {
++                cJSON *values_array = cJSON_CreateArray();
++                listEntry_t *valueEntry = NULL;
++                list_ForEach(valueEntry, (list_t*)pair->value) {
++                    char *value = (char *)valueEntry->data;
++                    cJSON_AddItemToArray(values_array, cJSON_CreateString(value));
++                }
++                cJSON_AddItemToObject(keyvalue_tags_JSON, pair->key, values_array);
++            }
++        }
++        cJSON_AddItemToObject(item, "keyvalueTags", keyvalue_tags_JSON);
+     }
+ 
+     return item;
+@@ -325,22 +296,24 @@
+     }
+ 
+     // world_link->type_from
++    type_from_local_nonprim = (type_world_storage_t *)malloc(sizeof(type_world_storage_t));
+     cJSON *type_from = cJSON_GetObjectItemCaseSensitive(world_linkJSON, "typeFrom");
+     if (!type_from) {
+         goto end;
+     }
+ 
+     
+-    type_from_local_nonprim = type_world_storage_parseFromJSON(type_from); //custom
++    *type_from_local_nonprim = type_world_storage_type_world_storage_parseFromJSON(type_from); //custom
+ 
+     // world_link->type_to
++    type_to_local_nonprim = (type_world_storage_t *)malloc(sizeof(type_world_storage_t));
+     cJSON *type_to = cJSON_GetObjectItemCaseSensitive(world_linkJSON, "typeTo");
+     if (!type_to) {
+         goto end;
+     }
+ 
+     
+-    type_to_local_nonprim = type_world_storage_parseFromJSON(type_to); //custom
++    *type_to_local_nonprim = type_world_storage_type_world_storage_parseFromJSON(type_to); //custom
+ 
+     // world_link->transform
+     cJSON *transform = cJSON_GetObjectItemCaseSensitive(world_linkJSON, "transform");
+@@ -371,38 +344,57 @@
+     }
+ 
+     // world_link->unit
++    unit_local_nonprim = (unit_system_t *)malloc(sizeof(unit_system_t));
+     cJSON *unit = cJSON_GetObjectItemCaseSensitive(world_linkJSON, "unit");
+     if (!unit) {
+         goto end;
+     }
+ 
+     
+-    unit_local_nonprim = unit_system_parseFromJSON(unit); //custom
++    *unit_local_nonprim = unit_system_unit_system_parseFromJSON(unit); //custom
+ 
+     // world_link->keyvalue_tags
+     cJSON *keyvalue_tags = cJSON_GetObjectItemCaseSensitive(world_linkJSON, "keyvalueTags");
+-    if (!keyvalue_tags) {
+-        goto end;
+-    }
+-
+-    
+-    cJSON *keyvalue_tags_local_map = NULL;
+-    if(!cJSON_IsObject(keyvalue_tags) && !cJSON_IsNull(keyvalue_tags))
+-    {
+-        goto end;//primitive map container
+-    }
+-    if(cJSON_IsObject(keyvalue_tags))
+-    {
++    if (keyvalue_tags) {
++        if (!cJSON_IsObject(keyvalue_tags)) {
++            goto end;
++        }
+         keyvalue_tagsList = list_createList();
+-        keyValuePair_t *localMapKeyPair;
+-        cJSON_ArrayForEach(keyvalue_tags_local_map, keyvalue_tags)
+-        {
+-            cJSON *localMapObject = keyvalue_tags_local_map;
+-            list_addElement(keyvalue_tagsList , localMapKeyPair);
++        if (!keyvalue_tagsList) {
++            goto end;
++        }
++        cJSON *key = NULL;
++        cJSON_ArrayForEach(key, keyvalue_tags) {
++            if (cJSON_IsArray(key)) {
++                list_t *valuesList = list_createList();
++                if (!valuesList) {
++                    goto end;
++                }
++                cJSON *value = NULL;
++                cJSON_ArrayForEach(value, key) {
++                    if (cJSON_IsString(value)) {
++                        char *valueString = strdup(value->valuestring);
++                        if (!valueString) {
++                            goto end;
++                        }
++                        list_addElement(valuesList, valueString);
++                    }
++                }
++                keyValuePair_t *pair = malloc(sizeof(keyValuePair_t));
++                if (!pair) {
++                    goto end;
++                }
++                pair->key = strdup(key->string);
++                if (!pair->key) {
++                    free(pair);
++                    goto end;
++                }
++                pair->value = valuesList;
++                list_addElement(keyvalue_tagsList, pair);
++            }
+         }
+     }
+ 
+-
+     world_link_local_var = world_link_create (
+         uuid && !cJSON_IsNull(uuid) ? strdup(uuid->valuestring) : NULL,
+         strdup(creator_uuid->valuestring),
diff --git a/EtsiClientGen/patches/fixCWorldLinkAPI.patch b/EtsiClientGen/patches/fixCWorldLinkAPI.patch
deleted file mode 100644
index 39f5867..0000000
--- a/EtsiClientGen/patches/fixCWorldLinkAPI.patch
+++ /dev/null
@@ -1,36 +0,0 @@
---- WorldLinksAPI.c	2024-09-02 13:42:52.254209754 +0200
-+++ WorldLinksAPI_corrected.c	2024-09-02 13:41:49.032856993 +0200
-@@ -156,15 +156,6 @@
-     sprintf(localVarToReplace_worldLinkUUID, "{%s}", "worldLinkUUID");
- 
-     localVarPath = strReplace(localVarPath, localVarToReplace_worldLinkUUID, worldLinkUUID);
--    if(worldLinkUUID == NULL) {
--        goto end;
--    }
--    char* localVarToReplace_worldLinkUUID = malloc(sizeOfPathParams_worldLinkUUID);
--    sprintf(localVarToReplace_worldLinkUUID, "{%s}", "worldLinkUUID");
--
--    localVarPath = strReplace(localVarPath, localVarToReplace_worldLinkUUID, worldLinkUUID);
--
--
- 
-     // header parameters
-     char *keyHeader_token = NULL;
-@@ -266,16 +257,7 @@
-     sprintf(localVarToReplace_worldLinkUUID, "{%s}", "worldLinkUUID");
- 
-     localVarPath = strReplace(localVarPath, localVarToReplace_worldLinkUUID, worldLinkUUID);
--    if(worldLinkUUID == NULL) {
--        goto end;
--    }
--    char* localVarToReplace_worldLinkUUID = malloc(sizeOfPathParams_worldLinkUUID);
--    sprintf(localVarToReplace_worldLinkUUID, "{%s}", "worldLinkUUID");
--
--    localVarPath = strReplace(localVarPath, localVarToReplace_worldLinkUUID, worldLinkUUID);
--
--
--
-+ 
-     // header parameters
-     char *keyHeader_token = NULL;
-     char * valueHeader_token = 0;
diff --git a/EtsiClientGen/patches/fixCWorldLinksAPI.patch b/EtsiClientGen/patches/fixCWorldLinksAPI.patch
index 5f603b6..fce3fa7 100644
--- a/EtsiClientGen/patches/fixCWorldLinksAPI.patch
+++ b/EtsiClientGen/patches/fixCWorldLinksAPI.patch
@@ -1,5 +1,5 @@
---- WorldLinksAPI.c	2024-09-17 23:30:43.463539480 +0200
-+++ WorldLinksAPI_corrected.c	2024-09-17 23:30:37.923482059 +0200
+--- WorldLinksAPI.c	2024-09-24 15:47:06.664747821 +0200
++++ WorldLinksAPI_corrected.c	2024-09-24 15:46:51.276018300 +0200
 @@ -156,16 +156,7 @@
      sprintf(localVarToReplace_worldLinkUUID, "{%s}", "worldLinkUUID");
  
@@ -18,7 +18,7 @@
      // header parameters
      char *keyHeader_token = NULL;
      char * valueHeader_token = 0;
-@@ -266,15 +257,6 @@
+@@ -270,15 +261,6 @@
      sprintf(localVarToReplace_worldLinkUUID, "{%s}", "worldLinkUUID");
  
      localVarPath = strReplace(localVarPath, localVarToReplace_worldLinkUUID, worldLinkUUID);
diff --git a/EtsiClientGen/patches/fixCommonOpenAPI.patch b/EtsiClientGen/patches/fixCommonOpenAPI.patch
new file mode 100644
index 0000000..4dba501
--- /dev/null
+++ b/EtsiClientGen/patches/fixCommonOpenAPI.patch
@@ -0,0 +1,107 @@
+diff --git a/API/common/commonopenapi.yaml b/API/common/commonopenapi.yaml
+index 138ff61..28abc48 100644
+--- a/API/common/commonopenapi.yaml
++++ b/API/common/commonopenapi.yaml
+@@ -101,7 +101,7 @@ components:
+           type: string
+           example: "Success 2xx"
+ 
+-    Error:
++    ErrorMessage:
+       type: object
+       properties:
+         message:
+@@ -205,7 +205,7 @@ components:
+         content:
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+               example: "Bad request"
+ 
+       400_InvalidUUID:
+@@ -213,7 +213,7 @@ components:
+         content:
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+               example: "The format of the UUID is incorrect"
+ 
+       401_NullResponse: 
+@@ -221,7 +221,7 @@ components:
+         content:
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+               example: "Null response"
+ 
+       403_Forbidden:
+@@ -229,7 +229,7 @@ components:
+         content: 
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+               example: "Not allowed"
+               
+       404_NotFound:
+@@ -237,7 +237,7 @@ components:
+         content:
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+               example: "Not found"
+ 
+       404_NotFoundUUID:
+@@ -245,7 +245,7 @@ components:
+         content:
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+               example: "Element not found"
+                 
+       405_NotSupported:
+@@ -253,7 +253,7 @@ components:
+         content:
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+               example: "Not supported"        
+ 
+       4xx_UnexpectedError:      # Can be referenced as '#/components/responses/GenericError'
+@@ -261,14 +261,14 @@ components:
+         content:
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+ 
+       409_NotEmptyUUID:
+         description: Invalid UUID, id must be a Nil value.
+         content: 
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+               example: "The element you sent has already a value and can't be sent to the world storage"
+ 
+       ########################
+@@ -279,11 +279,11 @@ components:
+         content: 
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
+ 
+       5xx_UnexpectedError:
+         description: Unexpected server error.
+         content:
+           application/json:
+             schema:
+-              $ref: '#/components/schemas/Error'
++              $ref: '#/components/schemas/ErrorMessage'
diff --git a/EtsiClientGen/patches/fixHeaderError.patch b/EtsiClientGen/patches/fixHeaderError.patch
deleted file mode 100644
index a66ab2f..0000000
--- a/EtsiClientGen/patches/fixHeaderError.patch
+++ /dev/null
@@ -1,37 +0,0 @@
---- error_origin.h	2024-05-28 14:41:34.817357145 +0200
-+++ error.h	2024-05-21 17:10:12.662278000 +0200
-@@ -13,27 +13,27 @@
- #include "../include/keyValuePair.h"
- #include "../include/binary.h"
- 
--typedef struct error_t error_t;
-+typedef struct error__t error__t;
- 
- 
- 
- 
--typedef struct error_t {
-+typedef struct error__t {
-     int code; //numeric
-     char *message; // string
- 
--} error_t;
-+} error__t;
- 
--error_t *error_create(
-+error__t *error_create(
-     int code,
-     char *message
- );
- 
--void error_free(error_t *error);
-+void error_free(error__t *error);
- 
--error_t *error_parseFromJSON(cJSON *errorJSON);
-+error__t *error_parseFromJSON(cJSON *errorJSON);
- 
--cJSON *error_convertToJSON(error_t *error);
-+cJSON *error_convertToJSON(error__t *error);
- 
- #endif /* _error_H_ */
- 
diff --git a/EtsiClientGen/patches/fixHeaderTrackableType.patch b/EtsiClientGen/patches/fixHeaderTrackableType.patch
index ffd6214..97579f8 100644
--- a/EtsiClientGen/patches/fixHeaderTrackableType.patch
+++ b/EtsiClientGen/patches/fixHeaderTrackableType.patch
@@ -1,15 +1,14 @@
---- trackable_type_origin.h	2024-05-28 14:41:34.877357153 +0200
-+++ trackable_type.h	2024-05-22 17:57:49.859596000 +0200
-@@ -13,20 +13,20 @@
+--- trackable_type.h	2024-09-24 10:41:35.615292793 +0200
++++ trackable_type_corrected.h	2024-09-24 10:34:14.237518388 +0200
+@@ -13,20 +13,18 @@
  #include "../include/keyValuePair.h"
  #include "../include/binary.h"
  
 -typedef struct trackable_type_t trackable_type_t;
+-
+-
+ // Enum  for trackable_type
  
- 
--// Enum  for trackable_type
- 
-+// Enum  for trackable_type
  typedef enum { world_storage_api_trackable_type__NULL = 0, world_storage_api_trackable_type__FIDUCIAL_MARKER, world_storage_api_trackable_type__IMAGE_MARKER, world_storage_api_trackable_type__MESH, world_storage_api_trackable_type__MAP, world_storage_api_trackable_type__GEOPOSE, world_storage_api_trackable_type__OTHER } world_storage_api_trackable_type__e;
 +typedef world_storage_api_trackable_type__e trackable_type_t;
  
diff --git a/EtsiClientGen/patches/fixHeaderTypeWorldStorage.patch b/EtsiClientGen/patches/fixHeaderTypeWorldStorage.patch
new file mode 100644
index 0000000..b2cb24a
--- /dev/null
+++ b/EtsiClientGen/patches/fixHeaderTypeWorldStorage.patch
@@ -0,0 +1,26 @@
+--- type_world_storage.h	2024-09-24 10:50:11.879568737 +0200
++++ type_world_storage_corrected.h	2024-09-24 10:53:25.510780600 +0200
+@@ -13,20 +13,18 @@
+ #include "../include/keyValuePair.h"
+ #include "../include/binary.h"
+ 
+-typedef struct type_world_storage_t type_world_storage_t;
+-
+-
+ // Enum  for type_world_storage
+ 
+ typedef enum { world_storage_api_type_world_storage__NULL = 0, world_storage_api_type_world_storage__TRACKABLE, world_storage_api_type_world_storage__ANCHOR, world_storage_api_type_world_storage__UNKNOWN } world_storage_api_type_world_storage__e;
++typedef world_storage_api_type_world_storage__e type_world_storage_t;
+ 
+ char* type_world_storage_type_world_storage_ToString(world_storage_api_type_world_storage__e type_world_storage);
+ 
+ world_storage_api_type_world_storage__e type_world_storage_type_world_storage_FromString(char* type_world_storage);
+ 
+-//cJSON *type_world_storage_type_world_storage_convertToJSON(world_storage_api_type_world_storage__e type_world_storage);
++cJSON *type_world_storage_type_world_storage_convertToJSON(world_storage_api_type_world_storage__e type_world_storage);
+ 
+-//world_storage_api_type_world_storage__e type_world_storage_type_world_storage_parseFromJSON(cJSON *type_world_storageJSON);
++world_storage_api_type_world_storage__e type_world_storage_type_world_storage_parseFromJSON(cJSON *type_world_storageJSON);
+ 
+ #endif /* _type_world_storage_H_ */
+ 
diff --git a/EtsiClientGen/patches/fixHeaderUnitSystem.patch b/EtsiClientGen/patches/fixHeaderUnitSystem.patch
index 6ee54be..5571f0e 100644
--- a/EtsiClientGen/patches/fixHeaderUnitSystem.patch
+++ b/EtsiClientGen/patches/fixHeaderUnitSystem.patch
@@ -1,6 +1,6 @@
---- unit_system_origin.h	2024-05-28 14:41:34.887357155 +0200
-+++ unit_system.h	2024-05-22 18:37:07.017974000 +0200
-@@ -13,20 +13,17 @@
+--- unit_system.h	2024-09-24 10:41:35.635294256 +0200
++++ unit_system_corrected.h	2024-09-22 21:05:43.053799949 +0200
+@@ -13,20 +13,18 @@
  #include "../include/keyValuePair.h"
  #include "../include/binary.h"
  
@@ -8,7 +8,7 @@
 -
 -
  // Enum  for unit_system
--
+ 
  typedef enum { world_storage_api_unit_system__NULL = 0, world_storage_api_unit_system__MM, world_storage_api_unit_system__CM, world_storage_api_unit_system__DM, world_storage_api_unit_system__M, world_storage_api_unit_system__DAM, world_storage_api_unit_system__HM, world_storage_api_unit_system__KM, world_storage_api_unit_system__INCH, world_storage_api_unit_system__FOOT, world_storage_api_unit_system__YARD, world_storage_api_unit_system__MILE } world_storage_api_unit_system__e;
 +typedef world_storage_api_unit_system__e unit_system_t;
  
diff --git a/arf005 b/arf005
index 5734880..7e50e43 160000
--- a/arf005
+++ b/arf005
@@ -1 +1 @@
-Subproject commit 5734880080c52572af65fe6d2703228ed6ee5653
+Subproject commit 7e50e43e90a8dcd958944e8e9ceda05c7668db48
diff --git a/package.json b/package.json
index 24b8bbf..98b9d6a 100644
--- a/package.json
+++ b/package.json
@@ -14,13 +14,14 @@
     "Last change: June 2024"
   ],
   "name": "worldstoragecclient",
-  "version": "2.1.0",
+  "version": "2.0.0",
   "description": "ISG ARF World Storage C client based on libcurl",
   "main": "index.js",
   "scripts": {
-    "generate": "cd EtsiClientGen && java -jar /usr/local/lib/node_modules/@openapitools/openapi-generator-cli/versions/7.5.0.jar generate -i ../arf005/API/worldstorage/worldstorageopenapi.yaml --skip-validate-spec -g c -o . && cd patches && ./applyPatches.sh",
+    "generate": "cd EtsiClientGen && ./patches/applyYamlPatch.sh && java -jar /usr/local/lib/node_modules/@openapitools/openapi-generator-cli/versions/7.5.0.jar generate -i ../arf005/API/worldstorage/worldstorageopenapi.yaml --skip-validate-spec -g c -o . && cd patches && ./applyPatches.sh && sudo mv -f ../../arf005/API/common/commonopenapiOriginal.yaml ../../arf005/API/common/commonopenapi.yaml",
     "dependencies": "",
-    "build": "cd EtsiClientGen && conan install . --build=missing -s build_type=Debug && cd build && cmake -DCMAKE_BUILD_TYPE=Debug .. --preset conan-debug && cd Debug && cmake --build . && sudo make install"
+    "build": "cd EtsiClientGen && conan install . --build=missing && cd build && cmake .. --preset conan-release && cd Release && cmake --build . && sudo make install",
+    "buildDebug": "cd EtsiClientGen && conan install -s build_type=Debug . --build=missing && cd build && cmake .. --preset conan-debug && cd Debug && cmake --build . --config Debug && sudo make install"
   },
   "generator-cli": {
     "version": "7.5.0"
-- 
GitLab