From 50fd26ffae9e0f7831b7eae9355e8fdf90b9b942 Mon Sep 17 00:00:00 2001
From: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu>
Date: Tue, 7 Dec 2021 17:06:29 +0100
Subject: [PATCH] updates to code generation and readers and writers to
 correctly generate the path

---
 .../SkillProviderExample.cpp                  | 11 +--
 .../server/SkillsMemory/SkillsMemory.cpp      | 47 ++++++++++-
 .../armem/server/RemoteGuiAronDataVisitor.h   |  3 +-
 .../armem_gui/instance/serialize_path.cpp     |  4 +-
 .../libraries/armem_skills/aron/Skill.xml     | 20 ++++-
 .../client/SkillProviderComponentPlugin.cpp   | 34 ++++++--
 .../client/SkillProviderComponentPlugin.h     | 15 ++--
 .../segment/ExecutableSkillLibrarySegment.cpp | 25 ++++--
 .../segment/ExecutableSkillLibrarySegment.h   |  8 +-
 .../segment/SkillExecutionRequestSegment.cpp  |  5 +-
 .../segment/SkillExecutionRequestSegment.h    |  2 +
 source/RobotAPI/libraries/aron/core/Path.cpp  | 77 +++++++++++--------
 source/RobotAPI/libraries/aron/core/Path.h    | 18 ++---
 .../codewriter/cpp/generator/Generator.cpp    | 13 ++--
 .../codewriter/cpp/generator/Generator.h      |  8 +-
 .../cpp/generator/container/Dict.cpp          | 22 ++++--
 .../codewriter/cpp/generator/container/Dict.h |  6 +-
 .../cpp/generator/container/List.cpp          | 24 ++++--
 .../codewriter/cpp/generator/container/List.h |  6 +-
 .../cpp/generator/container/Object.cpp        |  9 ++-
 .../cpp/generator/container/Object.h          |  6 +-
 .../cpp/generator/container/Pair.cpp          | 28 ++++---
 .../codewriter/cpp/generator/container/Pair.h |  6 +-
 .../cpp/generator/container/Tuple.cpp         | 19 +++--
 .../cpp/generator/container/Tuple.h           |  6 +-
 .../cpp/generator/detail/PrimitiveGenerator.h |  7 +-
 .../codewriter/cpp/generator/enum/IntEnum.cpp |  9 ++-
 .../codewriter/cpp/generator/enum/IntEnum.h   |  6 +-
 .../cpp/generator/ndarray/Image.cpp           | 12 ++-
 .../codewriter/cpp/generator/ndarray/Image.h  |  6 +-
 .../cpp/generator/ndarray/Matrix.cpp          | 18 +++--
 .../codewriter/cpp/generator/ndarray/Matrix.h |  6 +-
 .../cpp/generator/ndarray/NDArray.cpp         |  6 +-
 .../cpp/generator/ndarray/NDArray.h           |  6 +-
 .../cpp/generator/ndarray/Orientation.cpp     | 11 ++-
 .../cpp/generator/ndarray/Orientation.h       |  6 +-
 .../cpp/generator/ndarray/PointCloud.cpp      | 11 ++-
 .../cpp/generator/ndarray/PointCloud.h        |  6 +-
 .../codewriter/cpp/generator/ndarray/Pose.cpp | 11 ++-
 .../codewriter/cpp/generator/ndarray/Pose.h   |  6 +-
 .../cpp/generator/ndarray/Position.cpp        | 11 ++-
 .../cpp/generator/ndarray/Position.h          |  6 +-
 .../cpp/generator/ndarray/Quaternion.cpp      | 11 ++-
 .../cpp/generator/ndarray/Quaternion.h        |  6 +-
 .../cpp/generator/primitive/Bool.cpp          |  2 +-
 .../codewriter/cpp/generator/primitive/Bool.h |  2 +-
 .../cpp/generator/primitive/Double.cpp        |  2 +-
 .../cpp/generator/primitive/Double.h          |  2 +-
 .../cpp/generator/primitive/Float.cpp         |  2 +-
 .../cpp/generator/primitive/Float.h           |  2 +-
 .../cpp/generator/primitive/Int.cpp           |  2 +-
 .../codewriter/cpp/generator/primitive/Int.h  |  2 +-
 .../cpp/generator/primitive/Long.cpp          |  2 +-
 .../codewriter/cpp/generator/primitive/Long.h |  2 +-
 .../cpp/generator/primitive/String.cpp        |  2 +-
 .../cpp/generator/primitive/String.h          |  2 +-
 .../cpp/generator/primitive/Time.cpp          |  9 ++-
 .../codewriter/cpp/generator/primitive/Time.h |  6 +-
 .../cpp/generator/toplevel/IntEnumClass.cpp   | 10 ++-
 .../cpp/generator/toplevel/IntEnumClass.h     |  6 +-
 .../cpp/generator/toplevel/ObjectClass.cpp    | 20 +++--
 .../cpp/generator/toplevel/ObjectClass.h      |  6 +-
 .../libraries/aron/core/data/rw/Writer.h      | 44 +++++------
 .../nlohmannJSON/NlohmannJSONWriter.cpp       | 18 ++---
 .../writer/nlohmannJSON/NlohmannJSONWriter.h  | 18 ++---
 .../data/rw/writer/variant/VariantWriter.cpp  | 36 ++++-----
 .../data/rw/writer/variant/VariantWriter.h    | 18 ++---
 .../aron/core/data/variant/container/Dict.cpp | 11 ++-
 .../aron/core/data/variant/container/Dict.h   |  2 +
 .../aron/core/data/variant/container/List.cpp |  2 +-
 .../aron/core/test/aronNavigateTest.cpp       | 22 +++---
 .../aron/core/typereader/xml/Factory.cpp      | 12 +--
 72 files changed, 513 insertions(+), 334 deletions(-)

diff --git a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp
index 57056f83a..3404a3312 100644
--- a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp
+++ b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp
@@ -28,10 +28,7 @@ namespace armarx::skills::example
 
     std::string SkillProviderExample::getDefaultName() const
     {
-        // If you want to use the memory, it must contain the core segment name
-        // common means that all robots can execute this skill
-        // the later packages (armar6, armar3) may add other skill providers with robot specific skills
-        return "CommonSkill/SkillProviderExample";
+        return "SkillProviderExample";
     }
 
     void SkillProviderExample::onInitComponent()
@@ -39,17 +36,17 @@ namespace armarx::skills::example
         // Add example skill
         {
             skills::SkillDescription helloWorldDesc;
-            helloWorldDesc.acceptedType = nullptr;
+            helloWorldDesc.acceptedType = nullptr; // accept everything
             helloWorldDesc.documentation = "This skill logs a message on ARMARX_IMPORTANT";
             helloWorldDesc.name = "HelloWorld";
-            addSkill(HelloWorldSkill(), helloWorldDesc);
+            addSkill(std::make_shared<HelloWorldSkill>(), helloWorldDesc);
         }
 
         // Add another example skill
         {
             skills::SkillDescription fooDesc;
             fooDesc.acceptedType = nullptr;
-            fooDesc.documentation = "This skill does nothing.";
+            fooDesc.documentation = "This skill does exactly nothing.";
             fooDesc.name = "Foo";
             addSkill([](const aron::data::DictPtr&){ return true; }, fooDesc);
         }
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
index f5396f815..dbeb06e78 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
@@ -61,6 +61,8 @@ namespace armarx
 
         const std::string prefix = "mem.";
         statechartListenerProviderSegment.defineProperties(defs, prefix + "statechartlistener.");
+        executableSkillCoreSegment.defineProperties(defs, prefix + "executableskill.");
+        skillExecutionRequestCoreSegment.defineProperties(defs, prefix + "executionrequest.");
 
         setMemoryName("Skill");
         return defs;
@@ -76,6 +78,8 @@ namespace armarx
     void SkillsMemory::onInitComponent()
     {
         statechartListenerProviderSegment.init();
+        executableSkillCoreSegment.init();
+        skillExecutionRequestCoreSegment.init();
     }
 
 
@@ -107,8 +111,31 @@ namespace armarx
 
     armem::data::CommitResult SkillsMemory::commit(const armem::data::Commit& commit, const Ice::Current&)
     {
-        // This function is overloaded to trigger the remote gui rebuild.
+        // This function is overloaded to trigger the remote gui rebuild and to check for skill executions
         armem::data::CommitResult result = ReadWritePluginUser::commit(commit);
+
+        for (const auto& up : commit.updates)
+        {
+            if (up.entityID.coreSegmentName == skills::segment::SkillExecutionRequestCoreSegment::CoreSegmentName)
+            {
+                for (const auto& instance : up.instancesData)
+                {
+                    ARMARX_CHECK_NOT_NULL(instance);
+
+                    auto aron = aron::data::Variant::FromAronDTO(instance);
+                    auto dict = aron::data::Dict::DynamicCastAndCheck(aron);
+
+                    // we got a skill execution request
+                    skills::arondto::SkillExecutionRequest request;
+                    request.fromAron(dict);
+
+                    auto params = aron::data::Dict::DynamicCastAndCheck(dict->at("params")); // ToDo remov and add to request
+
+                    executableSkillCoreSegment.directlyExecuteSkill(request, params);
+                }
+            }
+        }
+
         tab.rebuild = true;
         return result;
     }
@@ -129,7 +156,23 @@ namespace armarx
 
     void SkillsMemory::executeSkill(const std::string& skillProviderName, const skills::SkillParametrization& params, const Ice::Current &current)
     {
-        executableSkillCoreSegment.directlyExecuteSkill(skillProviderName, params);
+        // override directly execution to add a request to the memory
+        armem::Commit comm;
+        auto& entityUpdate = comm.add();
+
+        skills::arondto::SkillExecutionRequest request;
+        request.clientId = "";
+        request.providerName = skillProviderName;
+        request.skillName = params.name;
+
+        auto aron = request.toAron();
+        aron->addElement("params", aron::data::Variant::FromAronDTO(params.params));
+
+        entityUpdate.instancesData = { aron };
+        entityUpdate.confidence = 1.0;
+        entityUpdate.timeCreated = armem::Time::now();
+
+        iceAdapter().commit(comm); // commit and notify
     }
 
     void SkillsMemory::reportStatechartTransitionWithParameters(const ProfilerStatechartTransitionWithParameters& x, const Ice::Current&)
diff --git a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
index 093fca38a..dfe5299f7 100644
--- a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
+++ b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
@@ -94,8 +94,9 @@ namespace armarx::armem::server
         void visitString(const aron::data::VariantPtr& string) override
         {
             ARMARX_CHECK_NOT_NULL(string);
+            auto s = aron::data::String::DynamicCastAndCheck(string);
             const std::string key = string->getPath().getLastElement();
-            this->addValueLabel(key, *aron::data::String::DynamicCastAndCheck(string), "string");
+            this->addValueLabel(key, *s, "string");
         }
 
         void visitNDArray(const aron::data::VariantPtr& array) override
diff --git a/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp
index a01b0b462..3141eb165 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp
@@ -30,6 +30,8 @@ armarx::aron::Path armarx::armem::gui::instance::deserializePath(const QStringLi
     {
         pathItems.push_back(qpath.at(i).toStdString());
     }
-    aron::Path path(qpath.at(0).toStdString(), qpath.at(1).toStdString(), pathItems);
+    aron::Path path(pathItems);
+    path.setRootIdentifier(qpath.at(0).toStdString());
+    path.setDelimeter(qpath.at(1).toStdString());
     return path;
 }
diff --git a/source/RobotAPI/libraries/armem_skills/aron/Skill.xml b/source/RobotAPI/libraries/armem_skills/aron/Skill.xml
index 398a5b682..46af4143e 100644
--- a/source/RobotAPI/libraries/armem_skills/aron/Skill.xml
+++ b/source/RobotAPI/libraries/armem_skills/aron/Skill.xml
@@ -24,14 +24,30 @@ The memory should look like the following:
                 <String />
             </ObjectChild>
 
-            <ObjectChild key='ice_info'>
+            <ObjectChild key='iceInfo'>
                 <String />
             </ObjectChild>
 
-            <ObjectChild key='accepted_type_json'>
+            <ObjectChild key='acceptedTypeJson'>
+                <String />
+            </ObjectChild>
+        </Object>
+
+        <Object name='armarx::skills::arondto::SkillExecutionRequest'>
+            <ObjectChild key='providerName'>
                 <String />
             </ObjectChild>
 
+            <ObjectChild key='skillName'>
+                <String />
+            </ObjectChild>
+
+            <ObjectChild key='clientId'>
+                <String />
+            </ObjectChild>
+
+            <!-- ToDo: add params wih any type -->
         </Object>
+
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp
index ca0129810..d47ca065f 100644
--- a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp
@@ -37,7 +37,7 @@ namespace armarx
         addPlugin(plugin);
     }
 
-    void SkillProviderComponentPluginUser::addSkill(const skills::SkillImplementation& fun, const skills::SkillDescription& desc)
+    void SkillProviderComponentPluginUser::addSkill(const skills::SkillImplementationPtr& fun, const skills::SkillDescription& desc)
     {
         std::lock_guard l(skillsMutex);
         std::string skillName = desc.name;
@@ -55,7 +55,7 @@ namespace armarx
 
     void SkillProviderComponentPluginUser::addSkill(const skills::LambdaSkillImplementation::FunT& f, const skills::SkillDescription& desc)
     {
-        skills::LambdaSkillImplementation lmbda(f);
+        auto lmbda = std::make_shared<skills::LambdaSkillImplementation>(f);
         addSkill(lmbda, desc);
     }
 
@@ -90,9 +90,17 @@ namespace armarx
 
         auto& impl = skillImplementations.at(skillName);
 
-        impl.task->join();
+        if (impl.task.joinable())
+        {
+            impl.task.join();
+        }
+
+        // update input params
         impl.status.usedParams = params.params;
-        impl.task->start();
+
+        // recreate thread and execute skill
+        impl.stop = false;
+        impl.task = std::thread{ [&] { impl.execute(); } };
     }
 
     skills::SkillStatus SkillProviderComponentPluginUser::abortSkill(const std::string& skillName, const Ice::Current &current)
@@ -101,13 +109,15 @@ namespace armarx
         if (skillImplementations.count(skillName))
         {
             auto& impl = skillImplementations.at(skillName);
-            if (impl.task->isRunning())
+            impl.stop = true;
+            if (impl.task.joinable())
             {
-                impl.task->stop();
+                impl.task.join();
 
                 std::lock_guard l(impl.skillStatusMutex);
                 impl.status.status = skills::Execution::Aborted;
             }
+
             return skillImplementations.at(skillName).status;
         }
         return {};
@@ -115,6 +125,7 @@ namespace armarx
 
     void SkillProviderComponentPluginUser::SkillImplementationWrapper::execute()
     {
+        ARMARX_INFO_S << "Executing skill: " << description.name;
         try
         {
             // wait for dependencies
@@ -122,7 +133,10 @@ namespace armarx
                 std::lock_guard l(skillStatusMutex);
                 status.status = skills::Execution::RunningButWaitingForDependencies;
             }
-            auto initialized = skill.init();
+
+            if (stop) return;
+            auto initialized = skill->init();
+            if (stop) return;
 
             if (initialized != skills::SkillImplementation::Status::Succeeded)
             {
@@ -138,8 +152,12 @@ namespace armarx
                 std::lock_guard l(skillStatusMutex);
                 status.status = skills::Execution::Running;
             }
+
+            if (stop) return;
             auto params = std::make_shared<aron::data::Dict>(status.usedParams);
-            auto result = skill.execute(params);
+            auto result = skill->execute(params);
+            if (stop) return;
+
             {
                 std::lock_guard l(skillStatusMutex);
                 status.status = ((result == skills::SkillImplementation::Status::Succeeded) ? skills::Execution::Succeeded : skills::Execution::Failed);
diff --git a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.h b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.h
index b3fa26531..666ee05e1 100644
--- a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.h
+++ b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.h
@@ -2,6 +2,7 @@
 
 #include <mutex>
 #include <queue>
+#include <thread>
 #include <functional>
 
 #include <ArmarXCore/core/ComponentPlugin.h>
@@ -53,6 +54,7 @@ namespace armarx
 
             virtual Status execute(const aron::data::DictPtr&)
             {
+                ARMARX_WARNING_S << "You have to override this method!";
                 return Status::Succeeded;
             }
 
@@ -97,6 +99,9 @@ namespace armarx
         private:
             FunT fun;
         };
+
+        using SkillImplementationPtr = std::shared_ptr<SkillImplementation>;
+        using LambdaSkillImplementationPtr = std::shared_ptr<LambdaSkillImplementation>;
     }
 
 
@@ -108,20 +113,20 @@ namespace armarx
         struct SkillImplementationWrapper
         {
             skills::SkillDescription description;
-            skills::SkillImplementation skill;
+            skills::SkillImplementationPtr skill;
 
             // Current execution status
             skills::SkillStatus status;
 
             // Task
             mutable std::mutex skillStatusMutex;
-            RunningTask<SkillImplementationWrapper>::pointer_type task;
+            std::atomic_bool stop = false;
+            std::thread task;
 
-            SkillImplementationWrapper(const skills::SkillImplementation& fun, const skills::SkillDescription& desc) :
+            SkillImplementationWrapper(const skills::SkillImplementationPtr& fun, const skills::SkillDescription& desc) :
                 description(desc), skill(fun)
             {
                 status.status = skills::Execution::Status::Idle;
-                task = new RunningTask<SkillImplementationWrapper>(this, &SkillImplementationWrapper::execute, description.documentation);
             }
 
             SkillImplementationWrapper(const SkillImplementationWrapper& s) :
@@ -140,7 +145,7 @@ namespace armarx
 
     protected:
         void addSkill(const skills::LambdaSkillImplementation::FunT&, const skills::SkillDescription&);
-        void addSkill(const skills::SkillImplementation&, const skills::SkillDescription&);
+        void addSkill(const skills::SkillImplementationPtr&, const skills::SkillDescription&);
 
     private:
         armarx::plugins::SkillProviderComponentPlugin* plugin = nullptr;
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
index 10914c7da..8b9d00133 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
@@ -10,10 +10,8 @@
 
 namespace armarx::skills::segment
 {
-    std::string ExecutableSkillCoreSegmentName = "ExecutableSkill";
-
     ExecutableSkillLibraryProviderSegment::ExecutableSkillLibraryProviderSegment(const std::string& provName, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory):
-        Base(iceMemory, provName, ExecutableSkillCoreSegmentName, skills::arondto::SkillDescription::toAronType()),
+        Base(iceMemory, provName, ExecutableSkillLibraryCoreSegment::CoreSegmentName, skills::arondto::SkillDescription::toAronType()),
         skillProvider(prx)
     {
     }
@@ -36,12 +34,12 @@ namespace armarx::skills::segment
             skills::arondto::SkillDescription skillDescription;
             skillDescription.name = desc.name;
             skillDescription.documentation = desc.documentation;
-            skillDescription.ice_info = "TODO";
+            skillDescription.iceInfo = skillProvider->ice_toString();
             skillDescription.robot = desc.robot;
             if (desc.acceptedType)
             {
                 aron::type::VariantPtr t = aron::type::Variant::FromAronDTO(*desc.acceptedType);
-                skillDescription.accepted_type_json = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(t).dump(2);
+                skillDescription.acceptedTypeJson = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(t).dump(2);
             }
 
             armem::Commit commit;
@@ -56,8 +54,16 @@ namespace armarx::skills::segment
         }
     }
 
+    void ExecutableSkillLibraryProviderSegment::directlyExecuteSkill(const skills::arondto::SkillExecutionRequest& req, const aron::data::DictPtr& params)
+    {
+        skills::SkillParametrization parameterization;
+        parameterization.name = req.skillName;
+        parameterization.params = params->toAronDictPtr();
+        skillProvider->executeSkill(parameterization); // ToDo: put in thread?
+    }
+
     ExecutableSkillLibraryCoreSegment::ExecutableSkillLibraryCoreSegment(armem::server::MemoryToIceAdapter& iceMemory):
-        Base(iceMemory, ExecutableSkillCoreSegmentName, skills::arondto::SkillDescription::toAronType())
+        Base(iceMemory, CoreSegmentName, skills::arondto::SkillDescription::toAronType())
     {
     }
 
@@ -89,9 +95,12 @@ namespace armarx::skills::segment
         providerSegments.erase(providerName);
     }
 
-    void ExecutableSkillLibraryCoreSegment::directlyExecuteSkill(const std::string& providerName, const skills::SkillParametrization& params)
+    void ExecutableSkillLibraryCoreSegment::directlyExecuteSkill(const skills::arondto::SkillExecutionRequest& req, const aron::data::DictPtr& params)
     {
-
+        if (const auto& it = providerSegments.find(req.providerName); it != providerSegments.end())
+        {
+            it->second.directlyExecuteSkill(req, params);
+        }
     }
 
     size_t ExecutableSkillLibraryCoreSegment::size() const
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h
index 7e4a5dcb1..2f8652067 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h
@@ -10,6 +10,8 @@
 
 #include <RobotAPI/interface/skills/SkillProviderInterface.h>
 
+#include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h>
+
 namespace armarx::skills::segment
 {
     class ExecutableSkillLibraryProviderSegment :
@@ -23,6 +25,8 @@ namespace armarx::skills::segment
         void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix);
         void init();
 
+        void directlyExecuteSkill(const skills::arondto::SkillExecutionRequest&, const aron::data::DictPtr& params);
+
     private:
         SkillProviderInterfacePrx skillProvider;
     };
@@ -33,6 +37,8 @@ namespace armarx::skills::segment
         using Base = armem::server::segment::SpecializedCoreSegment;
 
     public:
+        static constexpr const char* CoreSegmentName = "ExecutableSkill";
+
         ExecutableSkillLibraryCoreSegment(armem::server::MemoryToIceAdapter& iceMemory);
 
         void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix);
@@ -40,7 +46,7 @@ namespace armarx::skills::segment
 
         void addSkillProvider(const std::string& providerName, const SkillProviderInterfacePrx& provider);
         void removeSkillProvider(const std::string& providerName);
-        void directlyExecuteSkill(const std::string& providerName, const skills::SkillParametrization& params);
+        void directlyExecuteSkill(const skills::arondto::SkillExecutionRequest&, const aron::data::DictPtr& params);
 
         size_t size() const;
 
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
index f4b656230..158e8c5e1 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
@@ -10,10 +10,9 @@
 
 namespace armarx::skills::segment
 {
-    std::string StringExecutionRequestCoreSegmentName = "SkillExecutionRequest";
 
     SkillExecutionRequestProviderSegment::SkillExecutionRequestProviderSegment(const std::string& provName, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory):
-        Base(iceMemory, provName, StringExecutionRequestCoreSegmentName)
+        Base(iceMemory, provName, SkillExecutionRequestCoreSegment::CoreSegmentName, skills::arondto::SkillExecutionRequest::toAronType())
     {
     }
 
@@ -28,7 +27,7 @@ namespace armarx::skills::segment
     }
 
     SkillExecutionRequestCoreSegment::SkillExecutionRequestCoreSegment(armem::server::MemoryToIceAdapter& iceMemory):
-        Base(iceMemory, StringExecutionRequestCoreSegmentName)
+        Base(iceMemory, CoreSegmentName, skills::arondto::SkillExecutionRequest::toAronType())
     {
     }
 
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h
index 9f9b38486..d4e8ba98f 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h
@@ -30,6 +30,8 @@ namespace armarx::skills::segment
         using Base = armem::server::segment::SpecializedCoreSegment;
 
     public:
+        static constexpr const char* CoreSegmentName = "SkillExecutionRequest";
+
         SkillExecutionRequestCoreSegment(armem::server::MemoryToIceAdapter& iceMemory);
 
         void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix);
diff --git a/source/RobotAPI/libraries/aron/core/Path.cpp b/source/RobotAPI/libraries/aron/core/Path.cpp
index 98d3a574b..c1a0ef6b6 100644
--- a/source/RobotAPI/libraries/aron/core/Path.cpp
+++ b/source/RobotAPI/libraries/aron/core/Path.cpp
@@ -30,7 +30,7 @@
 namespace armarx::aron
 {
     Path::Path() :
-        rootIdentifier("\\"),
+        rootIdentifier("_ARON"),
         delimeter("->")
     {
 
@@ -39,22 +39,6 @@ namespace armarx::aron
     Path::Path(const std::vector<std::string>& p) :
         path(p)
     {
-
-    }
-
-    Path::Path(const std::string& s, const std::string& d):
-        rootIdentifier(s),
-        delimeter(d)
-    {
-
-    }
-
-    Path::Path(const std::string& s, const std::string& d, const std::vector<std::string>& p) :
-        rootIdentifier(s),
-        delimeter(d),
-        path(p)
-    {
-
     }
 
     Path::Path(const Path& p) :
@@ -65,19 +49,6 @@ namespace armarx::aron
 
     }
 
-    Path::Path(const Path& p, const std::string& s) :
-        Path(p)
-    {
-        append(s);
-    }
-
-    Path::Path(const Path& p, const std::string& s, const std::string& s2) :
-        Path(p)
-    {
-        append(s);
-        append(s2);
-    }
-
     Path::Path(const Path& pa, const std::vector<std::string>& p) :
         Path(pa)
     {
@@ -156,18 +127,54 @@ namespace armarx::aron
         return ss.str();
     }
 
+    Path Path::FromString(const std::string& s, const std::string& rootIdentifier, const std::string& delimeter)
+    {
+        std::vector<std::string> elements = simox::alg::split(s, delimeter);
+        if (elements.size())
+        {
+            elements[0] = simox::alg::remove_prefix(elements[0], rootIdentifier);
+        }
+        return Path(elements);
+    }
+
+    Path Path::withIndex(int i) const
+    {
+        return Path(*this, {std::to_string(i)});
+    }
+
+    Path Path::withElement(const std::string& s) const
+    {
+        return Path(*this, {s});
+    }
+
+    Path Path::withAcceptedType() const
+    {
+        return Path(*this, {"::accepted_type"});
+    }
+
+    Path Path::withAcceptedTypeIndex(int i) const
+    {
+        return Path(*this, {"::accepted_type_" + std::to_string(i)});
+    }
+
     Path Path::withDetachedLastElement() const
     {
         std::vector<std::string> p = path;
         p.pop_back();
-        return Path(rootIdentifier, delimeter, p);
+        auto ret = Path(p);
+        ret.setRootIdentifier(rootIdentifier);
+        ret.setDelimeter(delimeter);
+        return ret;
     }
 
     Path Path::withDetachedFirstElement() const
     {
         std::vector<std::string> p = path;
         p.erase(p.begin());
-        return Path(rootIdentifier, delimeter, p);
+        auto ret = Path(p);
+        ret.setRootIdentifier(rootIdentifier);
+        ret.setDelimeter(delimeter);
+        return ret;
     }
 
     Path Path::getWithoutPrefix(const Path& pref) const
@@ -185,6 +192,10 @@ namespace armarx::aron
             }
         }
         std::vector<std::string> elementsWithoutPrefix(path.begin() + firstWithoutMatch, path.end());
-        return Path(rootIdentifier, delimeter, elementsWithoutPrefix);
+
+        auto ret = Path(elementsWithoutPrefix);
+        ret.setRootIdentifier(rootIdentifier);
+        ret.setDelimeter(delimeter);
+        return ret;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/Path.h b/source/RobotAPI/libraries/aron/core/Path.h
index ab96e3fb8..941345a75 100644
--- a/source/RobotAPI/libraries/aron/core/Path.h
+++ b/source/RobotAPI/libraries/aron/core/Path.h
@@ -42,21 +42,9 @@ namespace armarx::aron
         /// constructor, taking a list of strings (a path)
         Path(const std::vector<std::string>&);
 
-        /// constructor for setting the root identifier and the delimeter
-        Path(const std::string&, const std::string&);
-
-        /// constructor for setting the root identifier and the delimeter and the path
-        Path(const std::string&, const std::string&, const std::vector<std::string>&);
-
         /// copy constructor
         Path(const Path&);
 
-        /// append constructor
-        Path(const Path&, const std::string&);
-
-        /// append constructor
-        Path(const Path&, const std::string&, const std::string&);
-
         /// append constructor
         Path(const Path&, const std::vector<std::string>&);
 
@@ -69,6 +57,11 @@ namespace armarx::aron
         bool hasElement() const;
         size_t size() const;
 
+        Path withIndex(int) const;
+        Path withElement(const std::string&) const;
+        Path withAcceptedType() const;
+        Path withAcceptedTypeIndex(int) const;
+
         void setRootIdentifier(const std::string&);
         std::string getRootIdentifier() const;
 
@@ -76,6 +69,7 @@ namespace armarx::aron
         std::string getDelimeter() const;
 
         std::string toString() const;
+        static Path FromString(const std::string&, const std::string& rootIdentifier = "_ARON", const std::string& delimeter = "->");
 
         Path withDetachedFirstElement() const;
         Path withDetachedLastElement() const;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp
index e54134fba..ca25e51b7 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.cpp
@@ -39,6 +39,7 @@ namespace armarx::aron::codegenerator::cpp
     const std::string Generator::ARON_READER_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_r";
     const std::string Generator::ARON_WRITER_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_w";
     const std::string Generator::ARON_VARIANT_RETURN_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_variant";
+    const std::string Generator::ARON_PATH_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_p";
 
     const SerializerFactoryPtr Generator::FACTORY = SerializerFactoryPtr(new GeneratorFactory());
 
@@ -163,9 +164,9 @@ namespace armarx::aron::codegenerator::cpp
         doc << "@brief writeType() - This method returns a new type from the class structure using a type writer implementation. This function is static. \n";
         doc << "@return - the result of the writer implementation";
 
-        CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nstatic T writeType(armarx::aron::type::WriterInterface<T>& " + ARON_WRITER_ACCESSOR + ", armarx::aron::type::Maybe "+ ARON_MAYBE_TYPE_ACCESSOR +" = armarx::aron::type::Maybe::eNone)", doc.str()));
+        CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nstatic T writeType(armarx::aron::type::WriterInterface<T>& " + ARON_WRITER_ACCESSOR + ", armarx::aron::type::Maybe "+ ARON_MAYBE_TYPE_ACCESSOR +" = armarx::aron::type::Maybe::eNone, const armarx::aron::Path& "+ARON_PATH_ACCESSOR+" = armarx::aron::Path())", doc.str()));
         std::string dummy;
-        CppBlockPtr b = this->getWriteTypeBlock("", "", dummy);
+        CppBlockPtr b = this->getWriteTypeBlock("", "", Path(), dummy);
         m->setBlock(b);
         return m;
     }
@@ -177,10 +178,10 @@ namespace armarx::aron::codegenerator::cpp
         doc << "@param w - The writer implementation\n";
         doc << "@return - the result of the writer implementation";
 
-        CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nT write(armarx::aron::data::WriterInterface<T>& " + ARON_WRITER_ACCESSOR + ") const", doc.str()));
+        CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nT write(armarx::aron::data::WriterInterface<T>& " + ARON_WRITER_ACCESSOR + ", const armarx::aron::Path& "+ARON_PATH_ACCESSOR+" = armarx::aron::Path()) const", doc.str()));
         std::string dummy;
         CppBlockPtr b = std::make_shared<CppBlock>();
-        b->appendBlock(this->getWriteBlock("", dummy));
+        b->appendBlock(this->getWriteBlock("", Path(), dummy));
         m->setBlock(b);
         return m;
     }
@@ -192,7 +193,7 @@ namespace armarx::aron::codegenerator::cpp
         doc << "@param r - The reader implementation\n";
         doc << "@return - nothing";
 
-        CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nvoid read(armarx::aron::data::ReaderInterface<T>& " + ARON_READER_ACCESSOR + ", T& input)", doc.str()));
+        CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nvoid read(armarx::aron::data::ReaderInterface<T>& " + ARON_READER_ACCESSOR + ", T& input, const armarx::aron::Path& "+ARON_PATH_ACCESSOR+" = armarx::aron::Path())", doc.str()));
         CppBlockPtr b = std::make_shared<CppBlock>();
         b->addLine("using TNonConst = typename std::remove_const<T>::type;");
 
@@ -208,7 +209,7 @@ namespace armarx::aron::codegenerator::cpp
         b->addLine("this->resetSoft();");
         b->addLine("if (" + ARON_READER_ACCESSOR + ".readNull(input))");
         b->addLineAsBlock("throw armarx::aron::error::AronException(__PRETTY_FUNCTION__, \"The input to the read method must not be null.\");");
-        b->appendBlock(this->getReadBlock("", "input"));
+        b->appendBlock(this->getReadBlock("", Path(), "input"));
         m->setBlock(b);
         return m;
     }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h
index 3978677fd..e200e3157 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/Generator.h
@@ -128,13 +128,13 @@ namespace armarx::aron::codegenerator::cpp
         virtual CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const;
 
         CppMethodPtr toWriteTypeMethod() const;
-        virtual CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const = 0;
+        virtual CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const = 0;
 
         CppMethodPtr toWriteMethod() const;
-        virtual CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const = 0;
+        virtual CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const = 0;
 
         CppMethodPtr toReadMethod() const;
-        virtual CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const = 0;
+        virtual CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const = 0;
 
         CppMethodPtr toEqualsMethod() const;
         virtual CppBlockPtr getEqualsBlock(const std::string& cppAccessorThis, const std::string& cppAccessorOther) const;
@@ -143,7 +143,6 @@ namespace armarx::aron::codegenerator::cpp
 
         // static methods
         static std::string EscapeAccessor(const std::string&);
-        static std::string UnescapeAccessor(const std::string&);
 
         static std::string ExtractCppTypename(const type::Variant&);
         static std::vector<std::string> ExtractCppTypenames(const std::vector<type::VariantPtr>&);
@@ -167,6 +166,7 @@ namespace armarx::aron::codegenerator::cpp
         static const std::string ARON_VARIABLE_PREFIX;
 
         static const std::string ARON_MAYBE_TYPE_ACCESSOR;
+        static const std::string ARON_PATH_ACCESSOR;
         static const std::string ARON_READER_ACCESSOR;
         static const std::string ARON_WRITER_ACCESSOR;
         static const std::string ARON_VARIANT_RETURN_ACCESSOR;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.cpp
index 96d978cb6..1579bf11f 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.cpp
@@ -43,7 +43,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Dict::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Dict::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -51,15 +51,15 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         auto type_s = FromAronType(*type.getAcceptedType());
         std::string nextVariantAccessor;
-        b->appendBlock(type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextVariantAccessor));
+        Path nextPath = p.withAcceptedType();
+        b->appendBlock(type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextPath, nextVariantAccessor));
 
-        //block_if_data->addLine("auto " + variantAccessor + )
         b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeDict(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " + nextVariantAccessor + "); // of " + cppAccessor);
 
         return b;
     }
 
-    CppBlockPtr Dict::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Dict::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -77,18 +77,23 @@ namespace armarx::aron::codegenerator::cpp::generator
             auto type_s = FromAronType(*type.getAcceptedType());
             CppBlockPtr for_loop = std::make_shared<CppBlock>();
             std::string nextVariantAccessor;
-            auto child_b = type_s->getWriteBlock(accessor_iterator_val, nextVariantAccessor);
+            Path nextPath = p.withElement(accessor_iterator_key);
+            auto child_b = type_s->getWriteBlock(accessor_iterator_val, nextPath, nextVariantAccessor);
             for_loop->addLine("auto " + nextVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();");
             for_loop->appendBlock(child_b);
             for_loop->addLine(elementsAccessor + ".emplace(" + accessor_iterator_key + ", " + nextVariantAccessor + ");");
             block_if_data->addBlock(for_loop);
         }
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeDict(" + elementsAccessor + "); // of " + cppAccessor);
+
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR +
+                               ".writeDict(" + elementsAccessor + ", " +
+                               "std::nullopt, " +
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ",")+"})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Dict::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Dict::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -103,8 +108,9 @@ namespace armarx::aron::codegenerator::cpp::generator
             auto type_s = FromAronType(*type.getAcceptedType());
             CppBlockPtr for_loop = std::make_shared<CppBlock>();
             std::string accessor_iterator_tmp = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_dictTmp";
+            Path nextPath = p.withElement(accessor_iterator_key);
             for_loop->addLine(type_s->getFullCppTypename() + " " + accessor_iterator_tmp +";");
-            for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, accessor_iterator_value));
+            for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, nextPath, accessor_iterator_value));
             for_loop->addLine(cppAccessor + nextEl() + "insert({" + accessor_iterator_key + ", " + accessor_iterator_tmp + "});");
             block_if_data->addBlock(for_loop);
         }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.h
index b20b13a3d..d503a291e 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Dict.h
@@ -38,8 +38,8 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.cpp
index 36d5c73e9..0b9de6d85 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.cpp
@@ -42,7 +42,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr List::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr List::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -50,14 +50,15 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         auto type_s = FromAronType(*type.getAcceptedType());
         std::string nextVariantAccessor;
-        CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextVariantAccessor);
+        Path nextPath = p.withAcceptedType();
+        CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextPath, nextVariantAccessor);
         b->appendBlock(b2);
 
         b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeList(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " + nextVariantAccessor + "); // of " + cppAccessor);
         return b;
     }
 
-    CppBlockPtr List::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr List::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -73,35 +74,44 @@ namespace armarx::aron::codegenerator::cpp::generator
         {
             std::string nextVariantAccessor;
             auto for_loop = std::make_shared<CppBlock>();
-            auto child_b = type_s->getWriteBlock(cppAccessor + nextEl() + "at(" + accessor_iterator + ")", nextVariantAccessor);
+            Path nextPath = p.withElement("std::to_string(" + accessor_iterator + ")");
+            auto child_b = type_s->getWriteBlock(cppAccessor + nextEl() + "at(" + accessor_iterator + ")", nextPath, nextVariantAccessor);
             for_loop->addLine("auto " + nextVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();");
             for_loop->appendBlock(child_b);
             for_loop->addLine(elementsAccessor + ".push_back(" + nextVariantAccessor + ");");
             block_if_data->addBlock(for_loop);
         }
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeList(" + elementsAccessor + "); // of " + cppAccessor);
+
+        Path path = this->type.getPath();
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeList(" + elementsAccessor + ", " +
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr List::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr List::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         std::string elements_accessor = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_listElements";
         std::string accessor_iterator_value = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_listValue";
+        std::string accessor_iterator = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_it";
 
         block_if_data->addLine("std::vector<TNonConst> " + elements_accessor + ";");
         block_if_data->addLine("" + ARON_READER_ACCESSOR + ".readList(" + variantAccessor + ", " + elements_accessor + ");");
+        block_if_data->addLine("unsigned int " + accessor_iterator + " = 0;");
         block_if_data->addLine("for (const auto& " + accessor_iterator_value + " : " + elements_accessor + ")");
         {
             CppBlockPtr for_loop = std::make_shared<CppBlock>();
+
             auto type_s = FromAronType(*type.getAcceptedType());
 
             std::string accessor_iterator_tmp = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_listTmp";
+            Path nextPath = p.withElement("std::to_string(" + accessor_iterator + ")");
             for_loop->addLine(type_s->getFullCppTypename() + " " + accessor_iterator_tmp + ";");
-            for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, accessor_iterator_value));
+            for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, nextPath, accessor_iterator_value));
             for_loop->addLine(cppAccessor + nextEl() + "push_back(" + accessor_iterator_tmp + ");");
+            for_loop->addLine(accessor_iterator + "++;");
             block_if_data->addBlock(for_loop);
         }
         return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.h
index 79867c9ff..149c10c52 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/List.h
@@ -39,8 +39,8 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.cpp
index 2a2d784bd..838db5b0d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.cpp
@@ -43,7 +43,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Object::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Object::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -53,17 +53,18 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr Object::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Object::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        block_if_data->addLine(variantAccessor + " = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + "); // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + ", "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Object::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Object::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         if (const auto reset = resolveMaybeGenerator(cppAccessor); !reset.empty())
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.h
index 274106676..63296a643 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Object.h
@@ -39,8 +39,8 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.cpp
index 9ca8dab0d..c258ddc8a 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.cpp
@@ -49,7 +49,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Pair::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Pair::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -58,20 +58,22 @@ namespace armarx::aron::codegenerator::cpp::generator
         auto child_s1 = FromAronType(*type.getFirstAcceptedType());
         std::string accessor_iterator1 = cppAccessor + nextEl() + "first";
         std::string firstVariantAccessor;
-        CppBlockPtr b21 = child_s1->getWriteTypeBlock(child_s1->getCoreCppTypename(), accessor_iterator1, firstVariantAccessor);
+        Path firstPath = p.withAcceptedTypeIndex(0);
+        CppBlockPtr b21 = child_s1->getWriteTypeBlock(child_s1->getCoreCppTypename(), accessor_iterator1, firstPath, firstVariantAccessor);
         block_if_data->appendBlock(b21);
 
         auto child_s2 = FromAronType(*type.getSecondAcceptedType());
         std::string accessor_iterator2 = cppAccessor + nextEl() + "second";
         std::string secondVariantAccessor;
-        CppBlockPtr b22 = child_s2->getWriteTypeBlock(child_s2->getCoreCppTypename(), accessor_iterator2, secondVariantAccessor);
+        Path secondPath = p.withAcceptedTypeIndex(1);
+        CppBlockPtr b22 = child_s2->getWriteTypeBlock(child_s2->getCoreCppTypename(), accessor_iterator2, secondPath, secondVariantAccessor);
         block_if_data->appendBlock(b22);
 
         block_if_data->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePair("+conversion::Maybe2CppString.at(type.getMaybe())+", "+firstVariantAccessor+", "+secondVariantAccessor+"); // of " + cppAccessor);
         return block_if_data;
     }
 
-    CppBlockPtr Pair::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Pair::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -80,22 +82,26 @@ namespace armarx::aron::codegenerator::cpp::generator
         auto child_s1 = FromAronType(*type.getFirstAcceptedType());
         std::string accessor_iterator1 = cppAccessor + nextEl() + "first";
         std::string firstVariantAccessor;
-        CppBlockPtr b21 = child_s1->getWriteBlock(accessor_iterator1, firstVariantAccessor);
+        Path firstPath = p.withElement("\"0\"");
+        CppBlockPtr b21 = child_s1->getWriteBlock(accessor_iterator1, firstPath, firstVariantAccessor);
         block_if_data->addLine("auto " + firstVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();");
         block_if_data->appendBlock(b21);
 
         auto child_s2 = FromAronType(*type.getSecondAcceptedType());
         std::string accessor_iterator2 = cppAccessor + nextEl() + "second";
         std::string secondVariantAccessor;
-        CppBlockPtr b22 = child_s2->getWriteBlock(accessor_iterator2, secondVariantAccessor);
+        Path secondPath = p.withElement("\"1\"");
+        CppBlockPtr b22 = child_s2->getWriteBlock(accessor_iterator2, secondPath, secondVariantAccessor);
         block_if_data->addLine("auto " + secondVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();");
         block_if_data->appendBlock(b22);
 
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePair("+firstVariantAccessor+", "+secondVariantAccessor+"); // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePair("+firstVariantAccessor+", "+
+                               secondVariantAccessor+", " +
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Pair::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Pair::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -105,11 +111,13 @@ namespace armarx::aron::codegenerator::cpp::generator
         block_if_data->addLine("" + ARON_READER_ACCESSOR + ".readList("+elements_accessor+"); // of " + cppAccessor);
 
         auto child_s1 = FromAronType(*type.getFirstAcceptedType());
-        CppBlockPtr b21 = child_s1->getReadBlock(cppAccessor + nextEl() + "first", elements_accessor+"[0]");
+        Path firstPath = p.withElement("\"0\"");
+        CppBlockPtr b21 = child_s1->getReadBlock(cppAccessor + nextEl() + "first", firstPath, elements_accessor+"[0]");
         block_if_data->appendBlock(b21);
 
         auto child_s2 = FromAronType(*type.getSecondAcceptedType());
-        CppBlockPtr b22 = child_s2->getReadBlock(cppAccessor + nextEl() + "second", elements_accessor+"[1]");
+        Path secondPath = p.withElement("\"1\"");
+        CppBlockPtr b22 = child_s2->getReadBlock(cppAccessor + nextEl() + "second", secondPath, elements_accessor+"[1]");
         block_if_data->appendBlock(b22);
 
         return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.h
index 196ce6f51..04cccc506 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Pair.h
@@ -39,8 +39,8 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.cpp
index 61f992774..dce8fcf23 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.cpp
@@ -48,7 +48,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Tuple::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Tuple::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string resolved_accessor = resolveMaybeAccessor(cppAccessor);
@@ -64,7 +64,8 @@ namespace armarx::aron::codegenerator::cpp::generator
             std::string accessor_iterator = "std::get<" + std::to_string(i) + ">("+resolved_accessor+");";
             auto type_s = FromAronType(*type);
             std::string nextVariantAccessor;
-            CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), accessor_iterator, nextVariantAccessor);
+            Path nextPath = p.withAcceptedTypeIndex(i++);
+            CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), accessor_iterator, nextPath, nextVariantAccessor);
             block_if_data->appendBlock(b2);
             block_if_data->addLine(acceptedTypesAccessor + ".push_back(" + nextVariantAccessor + ");");
         }
@@ -72,7 +73,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return block_if_data;
     }
 
-    CppBlockPtr Tuple::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Tuple::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string resolved_accessor = resolveMaybeAccessor(cppAccessor);
@@ -88,16 +89,19 @@ namespace armarx::aron::codegenerator::cpp::generator
             std::string accessor_iterator = "std::get<" + std::to_string(i) + ">("+resolved_accessor+");";
             auto type_s = FromAronType(*type);
             std::string nextVariantAccessor;
-            CppBlockPtr b2 = type_s->getWriteBlock(accessor_iterator, nextVariantAccessor);
+            Path nextPath = p.withElement("\"" + std::to_string(i++) + "\"");
+            CppBlockPtr b2 = type_s->getWriteBlock(accessor_iterator, nextPath, nextVariantAccessor);
             block_if_data->addLine("auto " + nextVariantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNull();");
             block_if_data->appendBlock(b2);
             block_if_data->addLine(elementsAccessor + ".push_back(" + nextVariantAccessor + ");");
         }
-        block_if_data->addLine(variantAccessor+ " = " + ARON_WRITER_ACCESSOR + ".writeTuple("+elementsAccessor+"); // of " + cppAccessor);
+
+        block_if_data->addLine(variantAccessor+ " = " + ARON_WRITER_ACCESSOR + ".writeTuple("+elementsAccessor+", "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Tuple::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Tuple::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -111,7 +115,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         for (const auto& type : type.getAcceptedTypes())
         {
             auto type_s = FromAronType(*type);
-            CppBlockPtr b2 = type_s->getReadBlock("std::get<" + std::to_string(i) + ">(" + resolved_accessor + ")", elements_accessor+"[" + std::to_string(i) + "]");
+            Path nextPath = p.withElement("\"" + std::to_string(i) + "\"");
+            CppBlockPtr b2 = type_s->getReadBlock("std::get<" + std::to_string(i) + ">(" + resolved_accessor + ")", nextPath, elements_accessor+"[" + std::to_string(i) + "]");
             block_if_data->appendBlock(b2);
             i++;
         }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.h
index 55d03d174..2ed85c206 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/container/Tuple.h
@@ -39,8 +39,8 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/detail/PrimitiveGenerator.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/detail/PrimitiveGenerator.h
index b617536e1..273813374 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/detail/PrimitiveGenerator.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/detail/PrimitiveGenerator.h
@@ -38,19 +38,20 @@ namespace armarx::aron::codegenerator::cpp::generator::detail
         using SpecializedGeneratorBase<typeT, DerivedT>::SpecializedGeneratorBase;
         virtual ~PrimitiveGenerator() = default;
 
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override
         {
             auto block_if_data = std::make_shared<CppBlock>();
             std::string resolved_accessor = this->resolveMaybeAccessor(cppAccessor);
             std::string escaped_accessor = this->EscapeAccessor(cppAccessor);
             variantAccessor = Generator::ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-            block_if_data->addLine(variantAccessor + " = " + this->ARON_WRITER_ACCESSOR + ".writePrimitive(" + resolved_accessor + "); // of " + cppAccessor);
+            block_if_data->addLine(variantAccessor + " = " + this->ARON_WRITER_ACCESSOR + ".writePrimitive(" + resolved_accessor + ", "+
+                                   "armarx::aron::Path("+this->ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
 
             return this->resolveMaybeWriteBlock(block_if_data, cppAccessor);
         }
 
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override
         {
             auto block_if_data = std::make_shared<CppBlock>();
             std::string resolved_accessor = this->resolveMaybeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp
index ee638f0ab..9547f5ff5 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp
@@ -56,7 +56,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr IntEnum::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr IntEnum::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -66,18 +66,19 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr IntEnum::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr IntEnum::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        block_if_data->addLine(variantAccessor+" = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + ");");
+        block_if_data->addLine(variantAccessor+" = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + ", "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr IntEnum::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr IntEnum::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         if (const auto reset = resolveMaybeGenerator(cppAccessor); !reset.empty())
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.h
index 1d0e35b09..694cb7dc1 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/enum/IntEnum.h
@@ -46,8 +46,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         // virtual implementations
         CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const override;
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.cpp
index d0d5043c2..f6d6ba2c7 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.cpp
@@ -59,7 +59,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
 
-    CppBlockPtr Image::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Image::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -70,7 +70,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
 
-    CppBlockPtr Image::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Image::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -78,12 +78,16 @@ namespace armarx::aron::codegenerator::cpp::generator
         const std::string shape_vec = ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_imageShape";
         block_if_data->addLine("std::vector<int> " + shape_vec + "(" + cppAccessor + nextEl() + "size.p, " + cppAccessor + nextEl() + "size.p + " + cppAccessor + nextEl() + "dims);");
         block_if_data->addLine(shape_vec+".push_back(" + cppAccessor + nextEl() + "elemSize());");
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray(" + shape_vec + ", std::to_string(" + cppAccessor + nextEl() + "type()), reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data)); // of " + cppAccessor);
+
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray(" + shape_vec + ", "+
+                               "std::to_string(" + cppAccessor + nextEl() + "type()), "+
+                               "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data), "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
 
-    CppBlockPtr Image::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Image::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.h
index 8c56ead46..027dfba2e 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Image.h
@@ -44,9 +44,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         // virtual implementations
         CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const override;
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
         CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
     public:
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp
index 547522026..4c2b71fa8 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp
@@ -52,7 +52,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Matrix::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Matrix::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -63,21 +63,23 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr Matrix::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Matrix::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
-        const std::string line_if_data = "" + ARON_WRITER_ACCESSOR + ".writeNDArray({(int) " + cppAccessor + nextEl() + "rows(), (int) " + cppAccessor + nextEl() +
-                "cols(), " + std::to_string(ElementType2Cpp.at(type.getElementType()).second) + "}, \"" +
-                ElementType2Cpp.at(type.getElementType()).first + "\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() +
-                "data()));";
 
-        block_if_data->addLine(variantAccessor + " = " + line_if_data + " // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({(int) " + cppAccessor + nextEl() + "rows(), "+
+                "(int) " + cppAccessor + nextEl() + "cols(), " +
+                std::to_string(ElementType2Cpp.at(type.getElementType()).second) + "}, "+
+                "\"" + ElementType2Cpp.at(type.getElementType()).first + "\", "+
+                "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data()), " +
+                "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
+
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Matrix::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Matrix::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.h
index 44a78d9ed..f4c6c1e66 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Matrix.h
@@ -42,9 +42,9 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
         CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
     public:
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.cpp
index ae7db10ce..5981ba326 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.cpp
@@ -42,19 +42,19 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr NDArray::getWriteTypeBlock(const std::string&, const std::string&, std::string&) const
+    CppBlockPtr NDArray::getWriteTypeBlock(const std::string&, const std::string&, const Path& p, std::string&) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         return b;
     }
 
-    CppBlockPtr NDArray::getWriteBlock(const std::string& cppAccessor, std::string&) const
+    CppBlockPtr NDArray::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string&) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         return b;
     }
 
-    CppBlockPtr NDArray::getReadBlock(const std::string& cppAccessor, const std::string&) const
+    CppBlockPtr NDArray::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string&) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         return b;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.h
index 8127f2c6b..9adc6be06 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/NDArray.h
@@ -42,8 +42,8 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.cpp
index 47f8a30c2..829fb7483 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.cpp
@@ -42,7 +42,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Orientation::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Orientation::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -52,18 +52,21 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr Orientation::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Orientation::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({1, 4, 4}, \"float\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "coeffs().data())); // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({1, 4, 4}, "+
+                               "\"float\", "+
+                               "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "coeffs().data()), "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Orientation::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Orientation::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.h
index d7f5f6586..5b3b7d4cf 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Orientation.h
@@ -40,9 +40,9 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string&) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
         CppBlockPtr getEqualsBlock(const std::string& cppAccessor, const std::string&) const override;
 
     };
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.cpp
index c0fbed112..f0e6448b1 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.cpp
@@ -59,7 +59,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr PointCloud::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr PointCloud::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -69,18 +69,21 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr PointCloud::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr PointCloud::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({" + cppAccessor + nextEl() + "width, " + cppAccessor + nextEl() + "height, " + std::to_string(VoxelType2Cpp.at(type.getVoxelType()).second) + "}, \"" + VoxelType2Cpp.at(type.getVoxelType()).first + "\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "points.data())); // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({" + cppAccessor + nextEl() + "width, " + cppAccessor + nextEl() + "height, " + std::to_string(VoxelType2Cpp.at(type.getVoxelType()).second) + "}, "+
+                               "\"" + VoxelType2Cpp.at(type.getVoxelType()).first + "\", "+
+                               "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "points.data()), "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr PointCloud::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr PointCloud::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.h
index fb267a966..302e9114b 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/PointCloud.h
@@ -41,9 +41,9 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
         CppBlockPtr getEqualsBlock(const std::string& cppAccessor, const std::string&) const override;
 
     public:
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp
index b377dde0f..029ce0348 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp
@@ -46,7 +46,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Pose::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Pose::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -56,18 +56,21 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr Pose::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Pose::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({4, 4, 4}, \"float\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data())); // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({4, 4, 4}, "+
+                               "\"float\", "+
+                               "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data()), "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Pose::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Pose::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.h
index b684debf1..dc142f3ee 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.h
@@ -39,9 +39,9 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
         CppBlockPtr getEqualsBlock(const std::string& cppAccessor, const std::string&) const override;
 
     };
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.cpp
index 37c38e8af..1cdddae37 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.cpp
@@ -46,7 +46,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Position::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Position::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -56,18 +56,21 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr Position::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Position::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({3, 1, 4}, \"float\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data())); // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({3, 1, 4}, "+
+                               "\"float\", "+
+                               "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "data()), "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Position::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Position::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.h
index 28021af44..251b27c7c 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Position.h
@@ -39,9 +39,9 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
         CppBlockPtr getEqualsBlock(const std::string& cppAccessor, const std::string&) const override;
 
     };
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.cpp
index 3a207ab39..7bdc3fd6a 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.cpp
@@ -53,7 +53,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Quaternion::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Quaternion::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -63,18 +63,21 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr Quaternion::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Quaternion::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({1, 4, " + std::to_string(ElementType2Cpp.at(type.getElementType()).second) + "}, \"" + ElementType2Cpp.at(type.getElementType()).first + "\", reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "coeffs().data())); // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeNDArray({1, 4, " + std::to_string(ElementType2Cpp.at(type.getElementType()).second) + "}, "+
+                               "\"" + ElementType2Cpp.at(type.getElementType()).first + "\", "+
+                               "reinterpret_cast<const unsigned char*>(" + cppAccessor + nextEl() + "coeffs().data()), "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Quaternion::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Quaternion::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.h
index c552274d3..af1ff9aa9 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Quaternion.h
@@ -42,9 +42,9 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
         CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
     public:
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp
index ccd49acd0..5cc283fc2 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp
@@ -35,7 +35,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
     /* virtual implementations */
-    CppBlockPtr Bool::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const
+    CppBlockPtr Bool::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(accessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.h
index 6d6681083..082859e00 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Bool.h
@@ -39,6 +39,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         virtual ~Bool() = default;
 
         /* virtual implementations */
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.cpp
index 72f7a79c1..ee262c12b 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.cpp
@@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
     /* virtual implementations */
-    CppBlockPtr Double::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const
+    CppBlockPtr Double::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(accessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.h
index 6e7f57589..dc65d42d9 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Double.h
@@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         virtual ~Double() = default;
 
         /* virtual implementations */
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.cpp
index 7b7667321..ba009be59 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.cpp
@@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
     /* virtual implementations */
-    CppBlockPtr Float::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const
+    CppBlockPtr Float::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(accessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.h
index c2fd86a8e..3e4381262 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Float.h
@@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         virtual ~Float() = default;
 
         /* virtual implementations */
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.cpp
index 4688a18cc..a7d815f15 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.cpp
@@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
     /* virtual implementations */
-    CppBlockPtr Int::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const
+    CppBlockPtr Int::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(accessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.h
index de61c2786..a57193e00 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Int.h
@@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         virtual ~Int() = default;
 
         /* virtual implementations */
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.cpp
index a2463ffa6..cfc6d86c5 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.cpp
@@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
     /* virtual implementations */
-    CppBlockPtr Long::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const
+    CppBlockPtr Long::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(accessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.h
index 265f1c1ce..c16b8c439 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Long.h
@@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         virtual ~Long() = default;
 
         /* virtual implementations */
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.cpp
index 75e3314fa..f2c48085d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.cpp
@@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
     /* virtual implementations */
-    CppBlockPtr String::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const
+    CppBlockPtr String::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(accessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.h
index 0e795d06e..254cd4e84 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/String.h
@@ -38,6 +38,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         virtual ~String() = default;
 
         /* virtual implementations */
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.cpp
index befc258ee..bfbacd208 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.cpp
@@ -39,7 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
     /* virtual implementations */
-    CppBlockPtr Time::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, std::string& variantAccessor) const
+    CppBlockPtr Time::getWriteTypeBlock(const std::string& typeAccessor, const std::string& accessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(accessor);
@@ -49,18 +49,19 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr Time::getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const
+    CppBlockPtr Time::getWriteBlock(const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePrimitive(" + cppAccessor + nextEl() + "toMicroSeconds()); // of " + cppAccessor);
+        block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePrimitive(" + cppAccessor + nextEl() + "toMicroSeconds(), "+
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {" + simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Time::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
+    CppBlockPtr Time::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.h
index a56233e1a..caa92b1bf 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/primitive/Time.h
@@ -38,8 +38,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         virtual ~Time() = default;
 
         /* virtual implementations */
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
index 7c2bfead4..8853abb33 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
@@ -96,7 +96,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return block_if_data;
     }
 
-    CppBlockPtr IntEnumClass::getWriteTypeBlock(const std::string&, const std::string&, std::string&) const
+    CppBlockPtr IntEnumClass::getWriteTypeBlock(const std::string&, const std::string&, const Path& p, std::string&) const
     {
         static const std::string INT_ENUM_VALUE_MAP = ARON_VARIABLE_PREFIX + "_str2ValueMap";
 
@@ -110,14 +110,16 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr IntEnumClass::getWriteBlock(const std::string&, std::string&) const
+    CppBlockPtr IntEnumClass::getWriteBlock(const std::string&, const Path& p, std::string&) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
-        block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writePrimitive(EnumToValueMap.at(value)); // of top level enum " + getCoreCppTypename());
+
+        block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writePrimitive(EnumToValueMap.at(value), "+
+                               ARON_PATH_ACCESSOR + "); // of top level enum " + getCoreCppTypename());
         return block_if_data;
     }
 
-    CppBlockPtr IntEnumClass::getReadBlock(const std::string&, const std::string& variantAccessor) const
+    CppBlockPtr IntEnumClass::getReadBlock(const std::string&, const Path& p, const std::string& variantAccessor) const
     {
         static const std::string INT_ENUM_TMP_VALUE = ARON_VARIABLE_PREFIX + "_tmpValue";
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h
index ce3ac5c96..ec4617d2c 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h
@@ -44,9 +44,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const override;
         CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const override;
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
         CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
         // TODO: Move some of those methods to upper class for enums (if we want to support multiple enums)
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
index e46d4272f..bde9b45c3 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
@@ -87,7 +87,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return block_if_data;
     }
 
-    CppBlockPtr ObjectClass::getWriteTypeBlock(const std::string&, const std::string&, std::string&) const
+    CppBlockPtr ObjectClass::getWriteTypeBlock(const std::string&, const std::string&, const Path& p, std::string&) const
     {
         static const std::string OBJECT_MEMBERS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectMembers";
         static const std::string OBJECT_EXTENDS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectExtends";
@@ -107,7 +107,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         {
             const auto child_s = FromAronType(*child);
             std::string child_return_variant;
-            CppBlockPtr child_b = child_s->getWriteTypeBlock(child_s->getFullCppTypename(), key, child_return_variant);
+            Path nextPath = p.withElement("\"" + key + "\"");
+            CppBlockPtr child_b = child_s->getWriteTypeBlock(child_s->getFullCppTypename(), key, nextPath, child_return_variant);
             b->appendBlock(child_b);
             b->addLine(OBJECT_MEMBERS_ACCESSOR + ".emplace(\"" + key + "\", " + child_return_variant + ");");
         }
@@ -124,7 +125,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr ObjectClass::getWriteBlock(const std::string&, std::string&) const
+    CppBlockPtr ObjectClass::getWriteBlock(const std::string&, const Path& p, std::string&) const
     {
         static const std::string OBJECT_MEMBERS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectMembers";
         static const std::string OBJECT_EXTENDS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectExtends";
@@ -146,17 +147,21 @@ namespace armarx::aron::codegenerator::cpp::generator
         {
             const auto child_s = FromAronType(*child);
             std::string child_return_variant;
-            CppBlockPtr child_b = child_s->getWriteBlock(key, child_return_variant);
+
+            Path nextPath = p.withElement("\"" + key + "\"");
+            CppBlockPtr child_b = child_s->getWriteBlock(key, nextPath, child_return_variant);
             block_if_data->addLine("auto " + child_return_variant + " = " + ARON_WRITER_ACCESSOR + ".writeNull();");
             block_if_data->appendBlock(child_b);
             block_if_data->addLine(OBJECT_MEMBERS_ACCESSOR + ".emplace(\"" + key + "\", " + child_return_variant + ");");
         }
 
-        block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writeDict("+OBJECT_MEMBERS_ACCESSOR+", " + OBJECT_EXTENDS_ACCESSOR + "); // of top level object " + getCoreCppTypename());
+        block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writeDict("+OBJECT_MEMBERS_ACCESSOR+", " +
+                               OBJECT_EXTENDS_ACCESSOR + ", "+
+                               ARON_PATH_ACCESSOR + "); // of top level object " + getCoreCppTypename());
         return block_if_data;
     }
 
-    CppBlockPtr ObjectClass::getReadBlock(const std::string&, const std::string& variantAccessor) const
+    CppBlockPtr ObjectClass::getReadBlock(const std::string&, const Path& p, const std::string& variantAccessor) const
     {
         static const std::string OBJECT_MEMBERS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectMembers";
         static const std::string OBJECT_EXTENDS_ACCESSOR = ARON_VARIABLE_PREFIX + "_objectExtends";
@@ -176,7 +181,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         {
             const auto child_s = FromAronType(*child);
             const std::string child_variant_accessor = OBJECT_MEMBERS_ACCESSOR + ".at(\"" + key + "\")";
-            block_if_data->appendBlock(child_s->getReadBlock(key, child_variant_accessor));
+            Path nextPath = p.withElement("\"" + key + "\"");
+            block_if_data->appendBlock(child_s->getReadBlock(key, nextPath, child_variant_accessor));
         }
         return block_if_data;
     }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h
index 56ccc97a8..27fd14a7b 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h
@@ -41,9 +41,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const override;
         CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const override;
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const override;
-        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, std::string& variantAccessor) const override;
-        CppBlockPtr getWriteBlock(const std::string& cppAccessor, std::string&) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string&) const override;
+        CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const override;
+        CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string&) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string&) const override;
         CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/Writer.h b/source/RobotAPI/libraries/aron/core/data/rw/Writer.h
index edd43903f..f75438b52 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/data/rw/Writer.h
@@ -38,52 +38,52 @@ namespace armarx::aron::data
 
         virtual ~WriterInterface() = default;
 
-        virtual ReturnType writeList(const std::vector<ReturnType>& elements) = 0;
-        virtual ReturnType writeDict(const std::map<std::string, ReturnType>& elements, const std::optional<ReturnType>& extends = std::nullopt) = 0;
+        virtual ReturnType writeList(const std::vector<ReturnType>& elements, const Path& p) = 0;
+        virtual ReturnType writeDict(const std::map<std::string, ReturnType>& elements, const std::optional<ReturnType>& extends, const Path& p) = 0;
 
-        virtual ReturnType writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data) = 0;
+        virtual ReturnType writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p) = 0;
 
-        virtual ReturnType writeInt(const int i) = 0;
-        virtual ReturnType writeLong(const long i) = 0;
-        virtual ReturnType writeFloat(const float i) = 0;
-        virtual ReturnType writeDouble(const double i) = 0;
-        virtual ReturnType writeString(const std::string& i) = 0;
-        virtual ReturnType writeBool(const bool i) = 0;
+        virtual ReturnType writeInt(const int i, const Path& p) = 0;
+        virtual ReturnType writeLong(const long i, const Path& p) = 0;
+        virtual ReturnType writeFloat(const float i, const Path& p) = 0;
+        virtual ReturnType writeDouble(const double i, const Path& p) = 0;
+        virtual ReturnType writeString(const std::string& i, const Path& p) = 0;
+        virtual ReturnType writeBool(const bool i, const Path& p) = 0;
 
-        virtual ReturnType writeNull() // defaulted implementation
+        virtual ReturnType writeNull(const Path& p = Path()) // defaulted implementation
         {
             return {};
         }
 
         // Convenience methods
-        ReturnType writePrimitive(const int i)
+        ReturnType writePrimitive(const int i, const Path& p = Path())
         {
-            return writeInt(i);
+            return writeInt(i, p);
         }
 
-        ReturnType writePrimitive(const long i)
+        ReturnType writePrimitive(const long i, const Path& p = Path())
         {
-            return writeLong(i);
+            return writeLong(i, p);
         }
 
-        ReturnType writePrimitive(const float i)
+        ReturnType writePrimitive(const float i, const Path& p = Path())
         {
-            return writeFloat(i);
+            return writeFloat(i, p);
         }
 
-        ReturnType writePrimitive(const double i)
+        ReturnType writePrimitive(const double i, const Path& p = Path())
         {
-            return writeDouble(i);
+            return writeDouble(i, p);
         }
 
-        ReturnType writePrimitive(const std::string& i)
+        ReturnType writePrimitive(const std::string& i, const Path& p = Path())
         {
-            return writeString(i);
+            return writeString(i, p);
         }
 
-        ReturnType writePrimitive(const bool i)
+        ReturnType writePrimitive(const bool i, const Path& p = Path())
         {
-            return writeBool(i);
+            return writeBool(i, p);
         }
     };
 
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp b/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp
index 6a119999a..bfd75e274 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp
@@ -40,7 +40,7 @@ namespace armarx::aron::data::writer
         }
     }
 
-    nlohmann::json NlohmannJSONWriter::writeList(const std::vector<nlohmann::json>& elements)
+    nlohmann::json NlohmannJSONWriter::writeList(const std::vector<nlohmann::json>& elements, const Path&)
     {
         nlohmann::json o;
         setupAronInformationForType(o, rw::json::constantes::LIST_TYPENAME_SLUG);
@@ -48,7 +48,7 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends)
+    nlohmann::json NlohmannJSONWriter::writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends, const Path&)
     {
         auto o = extends ? extends.value() : nlohmann::json();
 
@@ -57,7 +57,7 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data)
+    nlohmann::json NlohmannJSONWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path&)
     {
         nlohmann::json o;
         setupAronInformationForType(o, rw::json::constantes::NDARRAY_TYPENAME_SLUG);
@@ -71,7 +71,7 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeInt(const int i)
+    nlohmann::json NlohmannJSONWriter::writeInt(const int i, const Path&)
     {
         nlohmann::json o;
         setupAronInformationForType(o, rw::json::constantes::INT_TYPENAME_SLUG);
@@ -79,7 +79,7 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeLong(const long i)
+    nlohmann::json NlohmannJSONWriter::writeLong(const long i, const Path&)
     {
         nlohmann::json o;
         setupAronInformationForType(o, rw::json::constantes::LONG_TYPENAME_SLUG);
@@ -87,7 +87,7 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeFloat(const float i)
+    nlohmann::json NlohmannJSONWriter::writeFloat(const float i, const Path&)
     {
         nlohmann::json o;
         setupAronInformationForType(o, rw::json::constantes::FLOAT_TYPENAME_SLUG);
@@ -95,7 +95,7 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeDouble(const double i)
+    nlohmann::json NlohmannJSONWriter::writeDouble(const double i, const Path&)
     {
         nlohmann::json o;
         setupAronInformationForType(o, rw::json::constantes::DOUBLE_TYPENAME_SLUG);
@@ -103,7 +103,7 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeString(const std::string& i)
+    nlohmann::json NlohmannJSONWriter::writeString(const std::string& i, const Path&)
     {
         nlohmann::json o;
         setupAronInformationForType(o, rw::json::constantes::STRING_TYPENAME_SLUG);
@@ -111,7 +111,7 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeBool(const bool i)
+    nlohmann::json NlohmannJSONWriter::writeBool(const bool i, const Path&)
     {
         nlohmann::json o;
         setupAronInformationForType(o, rw::json::constantes::BOOL_TYPENAME_SLUG);
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.h b/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.h
index 799713333..fd281e5bc 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.h
+++ b/source/RobotAPI/libraries/aron/core/data/rw/writer/nlohmannJSON/NlohmannJSONWriter.h
@@ -39,16 +39,16 @@ namespace armarx::aron::data::writer
     public:
         NlohmannJSONWriter() = default;
 
-        nlohmann::json writeList(const std::vector<nlohmann::json>& elements) override;
-        nlohmann::json writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends = std::nullopt) override;
+        nlohmann::json writeList(const std::vector<nlohmann::json>& elements, const Path& p = Path()) override;
+        nlohmann::json writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends = std::nullopt, const Path& p = Path()) override;
 
-        nlohmann::json writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data) override;
+        nlohmann::json writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p = Path()) override;
 
-        nlohmann::json writeInt(const int i) override;
-        nlohmann::json writeLong(const long i) override;
-        nlohmann::json writeFloat(const float i) override;
-        nlohmann::json writeDouble(const double i) override;
-        nlohmann::json writeString(const std::string& i) override;
-        nlohmann::json writeBool(const bool i) override;
+        nlohmann::json writeInt(const int i, const Path& p = Path()) override;
+        nlohmann::json writeLong(const long i, const Path& p = Path()) override;
+        nlohmann::json writeFloat(const float i, const Path& p = Path()) override;
+        nlohmann::json writeDouble(const double i, const Path& p = Path()) override;
+        nlohmann::json writeString(const std::string& i, const Path& p = Path()) override;
+        nlohmann::json writeBool(const bool i, const Path& p = Path()) override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.cpp b/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.cpp
index dd2c4d839..d7aaa4b0c 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.cpp
@@ -32,9 +32,9 @@
 namespace armarx::aron::data::writer
 {
 
-    data::VariantPtr VariantWriter::writeList(const std::vector<data::VariantPtr>& elements)
+    data::VariantPtr VariantWriter::writeList(const std::vector<data::VariantPtr>& elements, const Path& p)
     {
-        auto o = std::make_shared<data::List>();
+        auto o = std::make_shared<data::List>(p);
         for (const auto& el : elements)
         {
             o->addElement(el);
@@ -42,9 +42,9 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    data::VariantPtr VariantWriter::writeDict(const std::map<std::string, data::VariantPtr>& elements, const std::optional<data::VariantPtr>& extends)
+    data::VariantPtr VariantWriter::writeDict(const std::map<std::string, data::VariantPtr>& elements, const std::optional<data::VariantPtr>& extends, const Path& p)
     {
-        auto o = extends ? data::Dict::DynamicCastAndCheck(extends.value()) : std::make_shared<data::Dict>();
+        auto o = extends ? data::Dict::DynamicCastAndCheck(extends.value()) : std::make_shared<data::Dict>(p);
 
         for(const auto& [key, value] : elements)
         {
@@ -53,9 +53,9 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    data::VariantPtr VariantWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data)
+    data::VariantPtr VariantWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p)
     {
-        auto o = std::make_shared<data::NDArray>();
+        auto o = std::make_shared<data::NDArray>(p);
         o->setShape(shape);
         o->setType(typeAsString);
         int size = shape.empty() ? 0 : std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<int>());
@@ -63,44 +63,44 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    data::VariantPtr VariantWriter::writeInt(const int i)
+    data::VariantPtr VariantWriter::writeInt(const int i, const Path& p)
     {
-        auto o = std::make_shared<data::Int>();
+        auto o = std::make_shared<data::Int>(p);
         o->setValue(i);
         return o;
     }
 
-    data::VariantPtr VariantWriter::writeLong(const long i)
+    data::VariantPtr VariantWriter::writeLong(const long i, const Path& p)
     {
-        auto o = std::make_shared<data::Long>();
+        auto o = std::make_shared<data::Long>(p);
         o->setValue(i);
         return o;
     }
 
-    data::VariantPtr VariantWriter::writeFloat(const float i)
+    data::VariantPtr VariantWriter::writeFloat(const float i, const Path& p)
     {
-        auto o = std::make_shared<data::Float>();
+        auto o = std::make_shared<data::Float>(p);
         o->setValue(i);
         return o;
     }
 
-    data::VariantPtr VariantWriter::writeDouble(const double i)
+    data::VariantPtr VariantWriter::writeDouble(const double i, const Path& p)
     {
-        auto o = std::make_shared<data::Double>();
+        auto o = std::make_shared<data::Double>(p);
         o->setValue(i);
         return o;
     }
 
-    data::VariantPtr VariantWriter::writeString(const std::string& i)
+    data::VariantPtr VariantWriter::writeString(const std::string& i, const Path& p)
     {
-        auto o = std::make_shared<data::String>();
+        auto o = std::make_shared<data::String>(p);
         o->setValue(i);
         return o;
     }
 
-    data::VariantPtr VariantWriter::writeBool(const bool i)
+    data::VariantPtr VariantWriter::writeBool(const bool i, const Path& p)
     {
-        auto o = std::make_shared<data::Bool>();
+        auto o = std::make_shared<data::Bool>(p);
         o->setValue(i);
         return o;
     }
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.h b/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.h
index d984ae53c..9f46f49ac 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.h
+++ b/source/RobotAPI/libraries/aron/core/data/rw/writer/variant/VariantWriter.h
@@ -38,16 +38,16 @@ namespace armarx::aron::data::writer
     public:
         VariantWriter() = default;
 
-        data::VariantPtr writeList(const std::vector<data::VariantPtr>& elements) override;
-        data::VariantPtr writeDict(const std::map<std::string, data::VariantPtr>& elements, const std::optional<data::VariantPtr>& extends = std::nullopt) override;
+        data::VariantPtr writeList(const std::vector<data::VariantPtr>& elements, const Path& p = Path()) override;
+        data::VariantPtr writeDict(const std::map<std::string, data::VariantPtr>& elements, const std::optional<data::VariantPtr>& extends = std::nullopt, const Path& p = Path()) override;
 
-        data::VariantPtr writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data) override;
+        data::VariantPtr writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p = Path()) override;
 
-        data::VariantPtr writeInt(const int i) override;
-        data::VariantPtr writeLong(const long i) override;
-        data::VariantPtr writeFloat(const float i) override;
-        data::VariantPtr writeDouble(const double i) override;
-        data::VariantPtr writeString(const std::string& i) override;
-        data::VariantPtr writeBool(const bool i) override;
+        data::VariantPtr writeInt(const int i, const Path& p = Path()) override;
+        data::VariantPtr writeLong(const long i, const Path& p = Path()) override;
+        data::VariantPtr writeFloat(const float i, const Path& p = Path()) override;
+        data::VariantPtr writeDouble(const double i, const Path& p = Path()) override;
+        data::VariantPtr writeString(const std::string& i, const Path& p = Path()) override;
+        data::VariantPtr writeBool(const bool i, const Path& p = Path()) override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
index 5f1da4558..e2d53ad04 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
@@ -43,7 +43,7 @@ namespace armarx::aron::data
     {
         for (const auto& [key, dataPtr] : this->aron->elements)
         {
-            childrenNavigators[key] = Variant::FromAronDTO(dataPtr, Path(path, key));
+            childrenNavigators[key] = Variant::FromAronDTO(dataPtr, path.withElement(key));
         }
     }
 
@@ -84,6 +84,10 @@ namespace armarx::aron::data
         }
         return *this == *other;
     }
+    VariantPtr Dict::operator[](const std::string& s) const
+    {
+        return getElement(s);
+    }
 
     // static methods
     DictPtr Dict::FromAronDictPtr(const data::dto::DictPtr& aron)
@@ -176,6 +180,11 @@ namespace armarx::aron::data
         aron->elements.clear();
     }
 
+    VariantPtr Dict::at(const std::string& s) const
+    {
+        return getElement(s);
+    }
+
     // virtual implementations
     std::string Dict::getShortName() const
     {
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
index b5463de9c..69315653a 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
@@ -51,6 +51,7 @@ namespace armarx::aron::data
         // operators
         virtual bool operator==(const Dict&) const override;
         bool operator==(const DictPtr&) const override;
+        VariantPtr operator[](const std::string&) const;
 
         static PointerType FromAronDictPtr(const data::dto::DictPtr& aron);
         static data::dto::DictPtr ToAronDictPtr(const PointerType& navigator);
@@ -66,6 +67,7 @@ namespace armarx::aron::data
         VariantPtr getElement(const std::string&) const;
         std::map<std::string, VariantPtr> getElements() const;
 
+        VariantPtr at(const std::string&) const;
         void removeElement(const std::string& key);
         void clear();
 
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
index 6be5ed1d2..2389e7ad5 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
@@ -45,7 +45,7 @@ namespace armarx::aron::data
         unsigned int i = 0;
         for (const auto& dataPtr : l->elements)
         {
-            childrenNavigators.push_back(FromAronDTO(dataPtr, Path(path, std::to_string(i++))));
+            childrenNavigators.push_back(FromAronDTO(dataPtr, path.withIndex(i++)));
         }
     }
 
diff --git a/source/RobotAPI/libraries/aron/core/test/aronNavigateTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronNavigateTest.cpp
index ebc491ef2..e7d0393c6 100644
--- a/source/RobotAPI/libraries/aron/core/test/aronNavigateTest.cpp
+++ b/source/RobotAPI/libraries/aron/core/test/aronNavigateTest.cpp
@@ -56,24 +56,26 @@ BOOST_AUTO_TEST_CASE(AronNavigateTest)
     // test Path
     data::DictPtr aron = k.toAron();
     Path path = aron->getPath(); // should be empty since aron is top level object
-    Path memberReached(path, "reached");
-    Path memberJointValues(path, "jointValues");
-    Path indexJointValues0(memberJointValues, "0");
-    Path indexJointValues1(memberJointValues, "1");
+    Path memberReached = path.withElement("reached");
+    Path memberJointValues = path.withElement("jointValues");
+    Path indexJointValues0 = memberJointValues.withElement("0");
+    Path indexJointValues1 = memberJointValues.withElement("1");
 
-    BOOST_CHECK_EQUAL(path.toString(), "\\");
+    std::string root = path.getRootIdentifier();
+
+    BOOST_CHECK_EQUAL(path.toString(), root);
     BOOST_CHECK_EQUAL(path.size(), 0);
 
-    BOOST_CHECK_EQUAL(memberReached.toString(), "\\->reached");
+    BOOST_CHECK_EQUAL(memberReached.toString(), root+"->reached");
     BOOST_CHECK_EQUAL(memberReached.size(), 1);
 
-    BOOST_CHECK_EQUAL(memberJointValues.toString(), "\\->jointValues");
+    BOOST_CHECK_EQUAL(memberJointValues.toString(), root+"->jointValues");
     BOOST_CHECK_EQUAL(memberJointValues.size(), 1);
 
-    BOOST_CHECK_EQUAL(indexJointValues0.toString(), "\\->jointValues->0");
+    BOOST_CHECK_EQUAL(indexJointValues0.toString(), root+"->jointValues->0");
     BOOST_CHECK_EQUAL(indexJointValues0.size(), 2);
 
-    BOOST_CHECK_EQUAL(indexJointValues1.toString(), "\\->jointValues->1");
+    BOOST_CHECK_EQUAL(indexJointValues1.toString(), root+"->jointValues->1");
     BOOST_CHECK_EQUAL(indexJointValues1.size(), 2);
 
     data::BoolPtr reached = data::Bool::DynamicCastAndCheck(aron->navigateAbsolute(memberReached));
@@ -89,6 +91,6 @@ BOOST_AUTO_TEST_CASE(AronNavigateTest)
     }
 
     Path diff = indexJointValues1.getWithoutPrefix(indexJointValues0);
-    BOOST_CHECK_EQUAL(diff.toString(), "\\->1");
+    BOOST_CHECK_EQUAL(diff.toString(), root+"->1");
     BOOST_CHECK_EQUAL(diff.size(), 1);
 }
diff --git a/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp b/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp
index f9e023a84..3d2ba252c 100644
--- a/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp
+++ b/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp
@@ -187,7 +187,7 @@ namespace armarx::aron::typereader::xml
             std::vector<RapidXmlReaderNode> children = objectChild.nodes();
 
             auto maybe = getMaybe(children[0]);
-            type::VariantPtr childNavigator = create(children[0], Path(path, key));
+            type::VariantPtr childNavigator = create(children[0], path.withElement(key));
 
             childNavigator->setMaybe(maybe);
             members.insert({key, childNavigator});
@@ -213,7 +213,7 @@ namespace armarx::aron::typereader::xml
 
         std::vector<RapidXmlReaderNode> c = node.nodes();
         const RapidXmlReaderNode typeNode = c[0];
-        type::VariantPtr type = create(typeNode, Path(path, "::accepted-type"));
+        type::VariantPtr type = create(typeNode, path.withAcceptedType());
         type->setMaybe(getMaybe(typeNode));
 
         auto o = std::make_shared<type::List>(type, path);
@@ -226,7 +226,7 @@ namespace armarx::aron::typereader::xml
 
         std::vector<RapidXmlReaderNode> c = node.nodes();
         const RapidXmlReaderNode typeNode = c[0];
-        type::VariantPtr type = create(typeNode, Path(path, "::accepted-type"));
+        type::VariantPtr type = create(typeNode, path.withAcceptedType());
         type->setMaybe(getMaybe(typeNode));
 
         auto o = std::make_shared<type::Dict>(type, path);
@@ -247,7 +247,7 @@ namespace armarx::aron::typereader::xml
             std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes();
             const RapidXmlReaderNode typeNode = typeNodeChildren[0];
 
-            type::VariantPtr type = create(typeNode, Path(path, "::accepted_type_" + std::to_string(i++)));
+            type::VariantPtr type = create(typeNode, path.withAcceptedTypeIndex(i++));
             type->setMaybe(getMaybe(typeNode));
 
             elementTypes.push_back(type);
@@ -264,11 +264,11 @@ namespace armarx::aron::typereader::xml
         std::vector<RapidXmlReaderNode> c = node.nodes();
         const RapidXmlReaderNode type1Node = c[0];
 
-        type::VariantPtr type1 = create(type1Node, Path(path, "::accepted_type_" + std::to_string(0)));
+        type::VariantPtr type1 = create(type1Node, path.withAcceptedTypeIndex(0));
         type1->setMaybe(getMaybe(type1Node));
 
         const RapidXmlReaderNode type2Node = c[1];
-        type::VariantPtr type2 = create(type2Node, Path(path, "::accepted_type_" + std::to_string(1)));
+        type::VariantPtr type2 = create(type2Node, path.withAcceptedTypeIndex(1));
         type2->setMaybe(getMaybe(type2Node));
 
         auto o = std::make_shared<type::Pair>(type1, type2, path);
-- 
GitLab