diff --git a/source/RobotAPI/libraries/aron/core/Path.cpp b/source/RobotAPI/libraries/aron/core/Path.cpp
index c1a0ef6b621506c0e855117dac81d6e3689b13b2..bcc51b5d3e2974766b8e0aa84e034410602c8698 100644
--- a/source/RobotAPI/libraries/aron/core/Path.cpp
+++ b/source/RobotAPI/libraries/aron/core/Path.cpp
@@ -137,24 +137,44 @@ namespace armarx::aron
         return Path(elements);
     }
 
-    Path Path::withIndex(int i) const
+    Path Path::withIndex(int i, bool escape) const
     {
-        return Path(*this, {std::to_string(i)});
+        std::string el = std::to_string(i);
+        if (escape)
+        {
+            el = "\"" + el + "\"";
+        }
+        return Path(*this, {el});
     }
 
-    Path Path::withElement(const std::string& s) const
+    Path Path::withElement(const std::string& s, bool escape) const
     {
-        return Path(*this, {s});
+        std::string el = s;
+        if (escape)
+        {
+            el = "\"" + el + "\"";
+        }
+        return Path(*this, {el});
     }
 
-    Path Path::withAcceptedType() const
+    Path Path::withAcceptedType(bool escape) const
     {
-        return Path(*this, {"::accepted_type"});
+        std::string el = "::accepted_type";
+        if (escape)
+        {
+            el = "\"" + el + "\"";
+        }
+        return Path(*this, {el});
     }
 
-    Path Path::withAcceptedTypeIndex(int i) const
+    Path Path::withAcceptedTypeIndex(int i, bool escape) const
     {
-        return Path(*this, {"::accepted_type_" + std::to_string(i)});
+        std::string el = "::accepted_type_" + std::to_string(i);
+        if (escape)
+        {
+            el = "\"" + el + "\"";
+        }
+        return Path(*this, {el});
     }
 
     Path Path::withDetachedLastElement() const
diff --git a/source/RobotAPI/libraries/aron/core/Path.h b/source/RobotAPI/libraries/aron/core/Path.h
index 941345a759c4c9f31b0e87ddd39263194ebb95e0..a9ffffc8a993e39ec70d980a5e8cc50df49a42c1 100644
--- a/source/RobotAPI/libraries/aron/core/Path.h
+++ b/source/RobotAPI/libraries/aron/core/Path.h
@@ -57,10 +57,10 @@ 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;
+        Path withIndex(int, bool escape = false) const;
+        Path withElement(const std::string&, bool escape = false) const;
+        Path withAcceptedType(bool escape = false) const;
+        Path withAcceptedTypeIndex(int, bool escape = false) const;
 
         void setRootIdentifier(const std::string&);
         std::string getRootIdentifier() 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 ca25e51b7032bbf96dcc6b910289df4412e7fc19..b09de439d8552793e3cdd8437799dbd19a28b127 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
@@ -193,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, const armarx::aron::Path& "+ARON_PATH_ACCESSOR+" = armarx::aron::Path())", doc.str()));
+        CppMethodPtr m = CppMethodPtr(new CppMethod("template<class T>\nvoid read(armarx::aron::data::ReaderInterface<T>& " + ARON_READER_ACCESSOR + ", T& input)", doc.str()));
         CppBlockPtr b = std::make_shared<CppBlock>();
         b->addLine("using TNonConst = typename std::remove_const<T>::type;");
 
@@ -209,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("", Path(), "input"));
+        b->appendBlock(this->getReadBlock("", "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 e200e3157731965b0ee3f17be937a477190ed0ce..870715276cf3cd791bb406f4108338ea7bda7203 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
@@ -134,7 +134,7 @@ namespace armarx::aron::codegenerator::cpp
         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 Path&, const std::string& variantAccessor) const = 0;
+        virtual CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const = 0;
 
         CppMethodPtr toEqualsMethod() const;
         virtual CppBlockPtr getEqualsBlock(const std::string& cppAccessorThis, const std::string& cppAccessorOther) const;
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 1579bf11ff346ec44fd60792ec6842d9da093a12..b42286150ae700c5efa0b702e97f09ee8854476e 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
@@ -51,10 +51,12 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         auto type_s = FromAronType(*type.getAcceptedType());
         std::string nextVariantAccessor;
-        Path nextPath = p.withAcceptedType();
+        Path nextPath = p.withAcceptedType(true);
         b->appendBlock(type_s->getWriteTypeBlock(type_s->getCoreCppTypename(), cppAccessor + nextEl() + "accepted_type", nextPath, nextVariantAccessor));
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeDict(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " + nextVariantAccessor + "); // of " + cppAccessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeDict(" + nextVariantAccessor + ", " +
+                   conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
 
         return b;
     }
@@ -88,12 +90,12 @@ namespace armarx::aron::codegenerator::cpp::generator
         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);
+                               "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 Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Dict::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -108,9 +110,8 @@ 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, nextPath, accessor_iterator_value));
+            for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, 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 d503a291e4edd09f36f5b7ea58b347dbac70b228..7db7bf2ca9cc5d58518aa799c7a2d18decfebc6c 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
@@ -40,6 +40,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 0b9de6d85826fb329b6bf3a4b18995cf963a9264..a7fbcd3ad8f19fec91251ce6bf1c5074feab6774 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
@@ -50,11 +50,13 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         auto type_s = FromAronType(*type.getAcceptedType());
         std::string nextVariantAccessor;
-        Path nextPath = p.withAcceptedType();
+        Path nextPath = p.withAcceptedType(true);
         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);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeList(" + nextVariantAccessor + ", " +
+                   conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -89,17 +91,15 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr List::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr List::getReadBlock(const std::string& cppAccessor, 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>();
@@ -107,11 +107,9 @@ namespace armarx::aron::codegenerator::cpp::generator
             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, nextPath, accessor_iterator_value));
+            for_loop->appendBlock(type_s->getReadBlock(accessor_iterator_tmp, 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 149c10c523a97f5ca36689531fc21d4c551cd8ae..c126af2ad3aa868b365a6f38c312ef5b93a92a68 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
@@ -41,6 +41,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 838db5b0dcabeff6a30a453a515e694901293e27..faf7d6f2dcc2ef324b11b2521bd1fa9bceed7932 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
@@ -49,7 +49,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + getCoreCppTypename() + "::writeType(" + ARON_WRITER_ACCESSOR + ", " + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + cppAccessor);
+        b->addLine("auto " + variantAccessor + " = " + getCoreCppTypename() + "::writeType(" + ARON_WRITER_ACCESSOR + ", " +
+                   conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -64,7 +66,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Object::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Object::getReadBlock(const std::string& cppAccessor, 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 63296a64372dd0f41dd7553865491e95df5f7dd4..a1a5af406007f0fc061ebf4eacb876fd4c55e394 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
@@ -41,6 +41,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 c258ddc8addb60f451d62e44b001f29619184ebb..d0fe5fc4729db68f048e070dd8b76d7035a19fee 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
@@ -69,7 +69,10 @@ namespace armarx::aron::codegenerator::cpp::generator
         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);
+        block_if_data->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePair(" + firstVariantAccessor + ", " +
+                               secondVariantAccessor + ", " +
+                               conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return block_if_data;
     }
 
@@ -101,7 +104,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Pair::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Pair::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -111,13 +114,11 @@ namespace armarx::aron::codegenerator::cpp::generator
         block_if_data->addLine("" + ARON_READER_ACCESSOR + ".readList("+elements_accessor+"); // of " + cppAccessor);
 
         auto child_s1 = FromAronType(*type.getFirstAcceptedType());
-        Path firstPath = p.withElement("\"0\"");
-        CppBlockPtr b21 = child_s1->getReadBlock(cppAccessor + nextEl() + "first", firstPath, elements_accessor+"[0]");
+        CppBlockPtr b21 = child_s1->getReadBlock(cppAccessor + nextEl() + "first", elements_accessor+"[0]");
         block_if_data->appendBlock(b21);
 
         auto child_s2 = FromAronType(*type.getSecondAcceptedType());
-        Path secondPath = p.withElement("\"1\"");
-        CppBlockPtr b22 = child_s2->getReadBlock(cppAccessor + nextEl() + "second", secondPath, elements_accessor+"[1]");
+        CppBlockPtr b22 = child_s2->getReadBlock(cppAccessor + nextEl() + "second", 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 04cccc5067ee53f453743a778d16d869adee3aec..0fc1c8f3ec11379c2692b9d07c8e93ebac244631 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
@@ -41,6 +41,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 dce8fcf233f20e26f9f8e336b65f70cfcb644311..ce09ac5050b7dc86a27790b0b31203d6de8af1a5 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
@@ -69,7 +69,9 @@ namespace armarx::aron::codegenerator::cpp::generator
             block_if_data->appendBlock(b2);
             block_if_data->addLine(acceptedTypesAccessor + ".push_back(" + nextVariantAccessor + ");");
         }
-        block_if_data->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeTuple("+conversion::Maybe2CppString.at(type.getMaybe())+", "+acceptedTypesAccessor+"); // of " + cppAccessor);
+        block_if_data->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeTuple(" + acceptedTypesAccessor + ", " +
+                               conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                               "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return block_if_data;
     }
 
@@ -101,7 +103,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Tuple::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Tuple::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
@@ -115,8 +117,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         for (const auto& type : type.getAcceptedTypes())
         {
             auto type_s = FromAronType(*type);
-            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) + "]");
+            CppBlockPtr b2 = type_s->getReadBlock("std::get<" + std::to_string(i) + ">(" + resolved_accessor + ")", 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 2ed85c206c31611d07c1b2df84f71985a8dcc79f..ada4efb7a85083d3be3509483dd6236ce1ff72b7 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
@@ -41,6 +41,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 27381337413d6f350c11847b236bcdef55937673..c4ebdfacb0c7622493726d37eb6245c52b8179b3 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
@@ -51,7 +51,7 @@ namespace armarx::aron::codegenerator::cpp::generator::detail
             return this->resolveMaybeWriteBlock(block_if_data, cppAccessor);
         }
 
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, 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 9547f5ff563e19f1d470fdee22cb8987ca939345..a36899f7240a28b6c439eaafe506a751ffbfe999 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
@@ -62,7 +62,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto "+variantAccessor+" = " +getCoreCppTypename() + "::writeType(" + ARON_WRITER_ACCESSOR + ", " + conversion::Maybe2CppString.at(type.getMaybe()) + ");");
+        b->addLine("auto "+variantAccessor+" = " +getCoreCppTypename() + "::writeType(" + ARON_WRITER_ACCESSOR + ", " +
+                   conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -78,7 +80,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr IntEnum::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr IntEnum::getReadBlock(const std::string& cppAccessor, 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 694cb7dc11c1ed4b3c14881bd9ef100aa99e721a..f472129d93a75d6f3219151bb48017f1109e4eee 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
@@ -48,6 +48,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 f6d6ba2c763df223f58336da2b33a351d60e6143..466f4deb5e81d8c00c3a32f69cae80dd6932735c 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
@@ -65,7 +65,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeImage(" + conversion::PixelType2CppString.at(type.getPixelType()) + ", " + conversion::Maybe2CppString.at(type.getMaybe()) + ");  // of " + cppAccessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeImage(" + conversion::PixelType2CppString.at(type.getPixelType()) + ", " +
+                   conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -87,7 +89,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
 
-    CppBlockPtr Image::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Image::getReadBlock(const std::string& cppAccessor, 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 027dfba2e3102edaa6d2909bdf7492954d013ee8..a6722dbbeabed393b0eba5190be363b9c34f8d0e 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
@@ -46,7 +46,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 4c2b71fa834526c4be21fad9ec8a95dc24b37608..d653183867d90a3d63213a5c5751c4c31c2ab984 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
@@ -57,9 +57,12 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr b = std::make_shared<CppBlock>();
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
-        const std::string line_if_data = "auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeMatrix((int) " + std::to_string(type.getRows()) + ", (int) " + std::to_string(type.getCols()) + ", " + conversion::MatrixElementType2CppString.at(type.getElementType()) + ", " + conversion::Maybe2CppString.at(type.getMaybe()) + ")";
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeMatrix((int) " + std::to_string(type.getRows()) + ", " +
+                "(int) " + std::to_string(type.getCols()) + ", " +
+                conversion::MatrixElementType2CppString.at(type.getElementType()) + ", " +
+                conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
 
-        b->addLine(line_if_data + "; // of " + cppAccessor);
         return b;
     }
 
@@ -79,7 +82,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Matrix::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Matrix::getReadBlock(const std::string& cppAccessor, 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 f4c6c1e661fb25650f72b5a3f9242c75817d6054..491a3d19de4f6d4cf3c659897ebeab5ae05f22a7 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
@@ -44,7 +44,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 5981ba326bc459cf3d1223993f9ffbdda6dcf785..440aa5197b1f3bd84d1f31cc1dc165b17865143c 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
@@ -54,7 +54,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return b;
     }
 
-    CppBlockPtr NDArray::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string&) const
+    CppBlockPtr NDArray::getReadBlock(const std::string& cppAccessor, 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 9adc6be067409c4a15978a50cade08b133e851b2..428ca861d7ce36ba3a79bbe6c664511c20d9e412 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
@@ -44,6 +44,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 829fb7483914c8df18c09dca049849050dc5f96a..e650162243dcf5b1a2d096faa0fb2e9496e6ead4 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
@@ -48,7 +48,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeOrientation(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + cppAccessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeOrientation(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -66,7 +67,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Orientation::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Orientation::getReadBlock(const std::string& cppAccessor, 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 5b3b7d4cfc94e52709e8ffca77fae829595d4f19..e2c48cba179f025aa1fa3fd60f56fd8cda3a6463 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
@@ -42,7 +42,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(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& variantAccessor) const override;
-        CppBlockPtr getReadBlock(const std::string& cppAccessor, const Path&, const std::string& variantAccessor) const override;
+        CppBlockPtr getReadBlock(const std::string& cppAccessor, 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 f0e6448b153f17599aac1c0e1d837bd1c4e76fa6..ef64710682085b28bc86457ca22ea1863d65d692 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
@@ -65,7 +65,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePointCloud(" + conversion::VoxelType2CppString.at(type.getVoxelType()) + ", " + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + cppAccessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePointCloud(" + conversion::VoxelType2CppString.at(type.getVoxelType()) + ", " +
+                   conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -83,7 +85,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr PointCloud::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr PointCloud::getReadBlock(const std::string& cppAccessor, 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 302e9114b3c3e2a1bb4e9b2f83d078e62075f7da..3c1770656c5c40035129e34373523fc971bf2216 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
@@ -43,7 +43,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 029ce03489316cad172d3278f40e285795d3a6b9..c6116c2f85128609b6dd5357600f9b2b71ad3873 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
@@ -52,7 +52,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePose(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + cppAccessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePose(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -70,7 +71,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Pose::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Pose::getReadBlock(const std::string& cppAccessor, 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 dc142f3ee6d28449f3278f82192165361486cce8..1cc292cf7cccbf2e980ef13102fb6b9cb2b78441 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
@@ -41,7 +41,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 1cdddae372c3470629005f3f53c8b8af7fd316e5..34da5638614d5ce43c95986dcb3df6b0775d8616 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
@@ -52,7 +52,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePosition(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + cppAccessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writePosition(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -70,7 +71,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Position::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Position::getReadBlock(const std::string& cppAccessor, 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 251b27c7cc43e72cd75df4aed3867235c1482f91..f0c12560b01e85ca5be736bd559054bf2b46a310 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
@@ -41,7 +41,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 7bdc3fd6aa2833f33a1b19c670f76825b0a3fea4..e5b0aeb6ad780dbc8b3702f54939c16411da3766 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
@@ -59,7 +59,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeQuaternion(" + conversion::QuaternionElementType2Cpp.at(type.getElementType()) + ", " + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + cppAccessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeQuaternion(" + conversion::QuaternionElementType2Cpp.at(type.getElementType()) + ", " +
+                   conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
         return b;
     }
 
@@ -77,7 +79,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Quaternion::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Quaternion::getReadBlock(const std::string& cppAccessor, 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 af1ff9aa9e51d5e46d8284da51ef63d61c81b8ee..cc39ad162402f7489ed1c698f076ee80ff6a97bd 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
@@ -44,7 +44,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 5cc283fc2d6853039e969d733131609ab2b76830..96a072070f84fcc3fca990103fcde71d6b15e8b6 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
@@ -41,7 +41,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(accessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeBool(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + accessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeBool(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
 }
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 ee262c12ba6303ee617dc166a4e3901e4fa94905..ba2a91499ca23401ed9ba967c2091447cec6ecde 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
@@ -45,7 +45,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(accessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeDouble(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + accessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeDouble(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
 }
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 ba009be5959604d654bf61701761195006ad9410..a0161aa678fc5a0335c2741bd1d03ddcc923ce24 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
@@ -45,7 +45,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(accessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeFloat(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + accessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeFloat(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
 }
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 a7d815f15aab6898b89b283275d1613f8eb03021..ca09f8b02176f0dbd6c0196e766865f78e133e98 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
@@ -45,7 +45,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(accessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeInt(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + accessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeInt(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
 }
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 cfc6d86c55233c209343fa3ed48beb77604ea669..bc9a136ae898757102160ccd26b0b8e8d637f3d5 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
@@ -45,7 +45,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(accessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeLong(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + accessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeLong(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
 }
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 f2c48085d9ad4cd09b9fe7099cf1264446688bdc..83a818f00b4589a0eab84e1117386fed8b914082 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
@@ -45,7 +45,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(accessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeString(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + accessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeString(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
 }
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 bfbacd20807304a202a4501961a1c270dd1e6a0d..d836e3cabaebf6c46ac4cf090e9953a4597893b0 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
@@ -45,7 +45,8 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(accessor);
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
-        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeTime(" + conversion::Maybe2CppString.at(type.getMaybe()) + "); // of " + accessor);
+        b->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeTime(" + conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
+                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
 
@@ -61,7 +62,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
 
-    CppBlockPtr Time::getReadBlock(const std::string& cppAccessor, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr Time::getReadBlock(const std::string& cppAccessor, 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 caa92b1bf15f9e5964e9cb9e20a5e68472c1d5a7..00a0fe530a715fe032ba70b24495819e2363e80d 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
@@ -40,6 +40,6 @@ namespace armarx::aron::codegenerator::cpp::generator
         /* virtual implementations */
         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 getReadBlock(const std::string& cppAccessor, 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 8853abb334b1293521514f635004654f1ed2a8a2..16e93a66da0070428bb492ab2cf37d320d27fc91 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
@@ -104,7 +104,10 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         b->addLine("//TODO: ");
         b->addLine("std::map<std::string, int> " + INT_ENUM_VALUE_MAP + ";");
-        b->addLine("return " + ARON_WRITER_ACCESSOR + ".writeIntEnum(\"" + type.getEnumName() + "\", "+INT_ENUM_VALUE_MAP+", "+ ARON_MAYBE_TYPE_ACCESSOR + ");");
+        b->addLine("return " + ARON_WRITER_ACCESSOR + ".writeIntEnum(\"" + type.getEnumName() + "\", " +
+                   INT_ENUM_VALUE_MAP + ", " +
+                   ARON_MAYBE_TYPE_ACCESSOR + ", " +
+                   ARON_PATH_ACCESSOR + ");");
         return b;
 
         return b;
@@ -114,12 +117,12 @@ namespace armarx::aron::codegenerator::cpp::generator
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
 
-        block_if_data->addLine("return " + ARON_WRITER_ACCESSOR + ".writePrimitive(EnumToValueMap.at(value), "+
+        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 Path& p, const std::string& variantAccessor) const
+    CppBlockPtr IntEnumClass::getReadBlock(const std::string&, 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 ec4617d2c8e5c0a65898d6b49599327d3b056280..1d105b79c70e809d0b94614c648078e1897e92a4 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
@@ -46,7 +46,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, 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 bde9b45c30fd8bfe844223ffef69659eb9151243..7b8c63115bab0edba5bf2842a6e8ae69988db841 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
@@ -101,26 +101,27 @@ namespace armarx::aron::codegenerator::cpp::generator
             b->addLine("// get base class of " + this->getFullCppTypename());
             b->addLine("auto " + OBJECT_EXTENDS_ACCESSOR + " = " + extends_s->getFullCppTypename() + "::writeType(" + ARON_WRITER_ACCESSOR + ", ::armarx::aron::type::Maybe::eNone);");
         }
+        else
+        {
+            b->addLine("auto " + OBJECT_EXTENDS_ACCESSOR + " = std::nullopt;");
+        }
 
         b->addLine("// members of " + this->getFullCppTypename());
         for (const auto& [key, child] : type.getMemberTypes())
         {
             const auto child_s = FromAronType(*child);
             std::string child_return_variant;
-            Path nextPath = p.withElement("\"" + key + "\"");
+            Path nextPath = p.withElement(key, true);
             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 + ");");
         }
 
-        if (type.getExtends() != nullptr)
-        {
-            b->addLine("return " + ARON_WRITER_ACCESSOR + ".writeObject(\"" + type.getObjectName() + "\", "+ARON_MAYBE_TYPE_ACCESSOR+", " + OBJECT_MEMBERS_ACCESSOR + ", " + OBJECT_EXTENDS_ACCESSOR + ");");
-        }
-        else
-        {
-            b->addLine("return " + ARON_WRITER_ACCESSOR + ".writeObject(\"" + type.getObjectName() + "\", "+ARON_MAYBE_TYPE_ACCESSOR+", " + OBJECT_MEMBERS_ACCESSOR + ", std::nullopt);");
-        }
+        b->addLine("return " + ARON_WRITER_ACCESSOR + ".writeObject(\"" + type.getObjectName() + "\", " +
+                   OBJECT_MEMBERS_ACCESSOR + ", " +
+                   OBJECT_EXTENDS_ACCESSOR + ", " +
+                   ARON_MAYBE_TYPE_ACCESSOR + ", " +
+                   ARON_PATH_ACCESSOR + "); // of top level object " + getCoreCppTypename());;
 
         return b;
     }
@@ -148,7 +149,7 @@ namespace armarx::aron::codegenerator::cpp::generator
             const auto child_s = FromAronType(*child);
             std::string child_return_variant;
 
-            Path nextPath = p.withElement("\"" + key + "\"");
+            Path nextPath = p.withElement(key, true);
             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);
@@ -161,7 +162,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         return block_if_data;
     }
 
-    CppBlockPtr ObjectClass::getReadBlock(const std::string&, const Path& p, const std::string& variantAccessor) const
+    CppBlockPtr ObjectClass::getReadBlock(const std::string&, 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";
@@ -181,8 +182,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         {
             const auto child_s = FromAronType(*child);
             const std::string child_variant_accessor = OBJECT_MEMBERS_ACCESSOR + ".at(\"" + key + "\")";
-            Path nextPath = p.withElement("\"" + key + "\"");
-            block_if_data->appendBlock(child_s->getReadBlock(key, nextPath, child_variant_accessor));
+            block_if_data->appendBlock(child_s->getReadBlock(key, 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 27fd14a7b4e4e823fd9f96958b0bbaaf1e2b75be..8d7a996ef5e0baa081257a4bae4ce09b9425a8a5 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
@@ -43,7 +43,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) 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 getReadBlock(const std::string& cppAccessor, const std::string&) const override;
         CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/converter/Converter.h b/source/RobotAPI/libraries/aron/core/data/converter/Converter.h
index f0573af75ff15dbf2740b09d5c590732bfb3fc73..3c74e41973d965e8a3ee3e79dcc9265e7c5dd5bb 100644
--- a/source/RobotAPI/libraries/aron/core/data/converter/Converter.h
+++ b/source/RobotAPI/libraries/aron/core/data/converter/Converter.h
@@ -64,27 +64,29 @@ namespace armarx::aron::data
         {
             std::map<std::string, ReaderInputTypeNonConst> elementsOfInput;
             std::map<std::string, WriterReturnType> elementsReturn;
-            r.readDict(o, elementsOfInput);
+            Path p;
+            r.readDict(o, elementsOfInput, p);
             for (const auto& [key, value] : elementsOfInput)
             {
                 auto converted = readAndWrite<DerivedT>(value);
                 elementsReturn.insert({key, converted});
             }
 
-            last_returned = w.writeDict(elementsReturn);
+            last_returned = w.writeDict(elementsReturn, std::nullopt, p);
         };
 
         void visitList(ReaderInputType& o) final
         {
             std::vector<ReaderInputTypeNonConst> elementsOfInput;
             std::vector<WriterReturnType> elementsReturn;
-            r.readList(o, elementsOfInput);
+            Path p;
+            r.readList(o, elementsOfInput, p);
             for (const auto& value : elementsOfInput)
             {
                 auto converted = readAndWrite<DerivedT>(value);
                 elementsReturn.push_back(converted);
             }
-            last_returned = w.writeList(elementsReturn);
+            last_returned = w.writeList(elementsReturn, p);
         };
 
         void visitNDArray(ReaderInputType& o) final
@@ -92,50 +94,57 @@ namespace armarx::aron::data
             std::string type;
             std::vector<int> shape;
             std::vector<unsigned char> data;
-            r.readNDArray(o, shape, type, data);
-            last_returned = w.writeNDArray(shape, type, data.data());
+            Path p;
+            r.readNDArray(o, shape, type, data, p);
+            last_returned = w.writeNDArray(shape, type, data.data(), p);
         };
 
         void visitInt(ReaderInputType& o) final
         {
             int i;
-            r.readInt(o, i);
-            last_returned = w.writeInt(i);
+            Path p;
+            r.readInt(o, i, p);
+            last_returned = w.writeInt(i, p);
         };
 
         void visitLong(ReaderInputType& o) final
         {
             long i;
-            r.readLong(o, i);
-            last_returned = w.writeLong(i);
+            Path p;
+            r.readLong(o, i, p);
+            last_returned = w.writeLong(i, p);
         };
 
         void visitFloat(ReaderInputType& o) final
         {
             float i;
-            r.readFloat(o, i);
-            last_returned = w.writeFloat(i);
+            Path p;
+            r.readFloat(o, i, p);
+            last_returned = w.writeFloat(i, p);
         };
 
         void visitDouble(ReaderInputType& o) final
         {
             double i;
-            r.readDouble(o, i);
-            last_returned = w.writeDouble(i);
+            Path p;
+            r.readDouble(o, i, p);
+            last_returned = w.writeDouble(i, p);
         };
 
         void visitBool(ReaderInputType& o) final
         {
             bool i;
-            r.readBool(o, i);
-            last_returned = w.writeBool(i);
+            Path p;
+            r.readBool(o, i, p);
+            last_returned = w.writeBool(i, p);
         };
 
         void visitString(ReaderInputType& o) final
         {
             std::string i;
-            r.readString(o, i);
-            last_returned = w.writeString(i);
+            Path p;
+            r.readString(o, i, p);
+            last_returned = w.writeString(i, p);
         };
     };
 
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/Reader.h b/source/RobotAPI/libraries/aron/core/data/rw/Reader.h
index d3642c15790434c0b89b0444c83e6a671f442bb2..3c14c097d8583f9d8ff54f4b769dbb6335627e4d 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/data/rw/Reader.h
@@ -27,6 +27,7 @@
 #include <optional>
 
 // ArmarX
+#include <RobotAPI/libraries/aron/core/Path.h>
 #include <RobotAPI/libraries/aron/core/Descriptor.h>
 
 namespace armarx::aron::data
@@ -40,25 +41,110 @@ namespace armarx::aron::data
 
         virtual ~ReaderInterface() = default;
 
-        virtual void readList(InputType& input, std::vector<InputTypeNonConst>& elements) = 0;
-        virtual void readDict(InputType& input, std::map<std::string, InputTypeNonConst>& elements) = 0;
+        virtual void readList(InputType& input, std::vector<InputTypeNonConst>& elements, Path&) = 0;
+        virtual void readDict(InputType& input, std::map<std::string, InputTypeNonConst>& elements, Path&) = 0;
 
-        virtual void readNDArray(InputType& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data) = 0;
+        virtual void readNDArray(InputType& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data, Path&) = 0;
 
-        virtual void readInt(InputType& input, int& i) = 0;
-        virtual void readLong(InputType& input, long& i) = 0;
-        virtual void readFloat(InputType& input, float& i) = 0;
-        virtual void readDouble(InputType& input, double& i) = 0;
-        virtual void readString(InputType& input, std::string& s) = 0;
-        virtual void readBool(InputType& input, bool& i) = 0;
+        virtual void readInt(InputType& input, int& i, Path&) = 0;
+        virtual void readLong(InputType& input, long& i, Path&) = 0;
+        virtual void readFloat(InputType& input, float& i, Path&) = 0;
+        virtual void readDouble(InputType& input, double& i, Path&) = 0;
+        virtual void readString(InputType& input, std::string& s, Path&) = 0;
+        virtual void readBool(InputType& input, bool& i, Path&) = 0;
 
         virtual bool readNull(InputType& input) // defaulted implementation
         {
             InputType nil = {};
-            return input == nil;
+            return (input == nil);
         }
 
         // Convenience methods
+        void readPrimitive(InputType& input, int& i, Path& p)
+        {
+            return readInt(input, i, p);
+        }
+
+        void readPrimitive(InputType& input, long& i, Path& p)
+        {
+            return readLong(input, i, p);
+        }
+
+        void readPrimitive(InputType& input, float& i, Path& p)
+        {
+            return readFloat(input, i, p);
+        }
+
+        void readPrimitive(InputType& input, double& i, Path& p)
+        {
+            return readDouble(input, i, p);
+        }
+
+        void readPrimitive(InputType& input, std::string& i, Path& p)
+        {
+            return readString(input, i, p);
+        }
+
+        void readPrimitive(InputType& input, bool& i, Path& p)
+        {
+            return readBool(input, i, p);
+        }
+
+        // Convenience methods without path object
+        void readList(InputType& input, std::vector<InputTypeNonConst>& elements)
+        {
+            Path p;
+            return readList(input, elements, p);
+        }
+
+        void readDict(InputType& input, std::map<std::string, InputTypeNonConst>& elements)
+        {
+            Path p;
+            return readDict(input, elements, p);
+        }
+
+        void readNDArray(InputType& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data)
+        {
+            Path p;
+            return readNDArray(input, shape, typeAsString, data, p);
+        }
+
+        void readInt(InputType& input, int& i)
+        {
+            Path p;
+            return readInt(input, i, p);
+        }
+
+        void readLong(InputType& input, long& i)
+        {
+            Path p;
+            return readLong(input, i, p);
+        }
+
+        void readFloat(InputType& input, float& i)
+        {
+            Path p;
+            return readFloat(input, i, p);
+        }
+
+        void readDouble(InputType& input, double& i)
+        {
+            Path p;
+            return readDouble(input, i, p);
+        }
+
+        void readString(InputType& input, std::string& s)
+        {
+            Path p;
+            return readString(input, s, p);
+        }
+
+        void readBool(InputType& input, bool& i)
+        {
+            Path p;
+            return readBool(input, i, p);
+        }
+
         void readPrimitive(InputType& input, int& i)
         {
             return readInt(input, i);
@@ -88,6 +174,8 @@ namespace armarx::aron::data
         {
             return readBool(input, i);
         }
+
+
     };
 
     template <class T>
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/Writer.h b/source/RobotAPI/libraries/aron/core/data/rw/Writer.h
index f75438b52bc186389fb0b541a8c166ff27aa57f4..42a363b3d2c8f756585251c5c8098fe02bdfa1bf 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/data/rw/Writer.h
@@ -50,7 +50,7 @@ namespace armarx::aron::data
         virtual ReturnType writeString(const std::string& i, const Path& p) = 0;
         virtual ReturnType writeBool(const bool i, const Path& p) = 0;
 
-        virtual ReturnType writeNull(const Path& p = Path()) // defaulted implementation
+        virtual ReturnType writeNull() // defaulted implementation
         {
             return {};
         }
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/json/Data.h b/source/RobotAPI/libraries/aron/core/data/rw/json/Data.h
index b26eeff05139b1016db34ff5d452bc4c5cb7852a..0506a13262efc971870fc444ba3b40dd18a4d5f3 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/json/Data.h
+++ b/source/RobotAPI/libraries/aron/core/data/rw/json/Data.h
@@ -32,6 +32,7 @@ namespace armarx::aron::data::rw::json
     namespace constantes
     {
         const std::string TYPE_SLUG = "_ARON_TYPE";
+        const std::string PATH_SLUG = "_ARON_PATH";
         const std::string VERSION_SLUG = "_ARON_VERSION";
 
         const std::string KEY_SLUG = "_ARON_KEY";
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp b/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp
index 9719e0e35b1d4a040356eaf309f464ae44a01816..cece44b58ab1bfaf1f24d6a95c95b545d43363aa 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp
@@ -36,68 +36,73 @@ namespace armarx::aron::data::reader
     namespace
     {
         /// Throw an exception if the type is other than expected
-        void checkInputForCorrectType(const nlohmann::json& input, const std::string& expectedType)
+        void getAronMetaInformationForType(const nlohmann::json& input, const std::string& expectedType, Path& p)
         {
+            // check type
             if (input[rw::json::constantes::TYPE_SLUG] != expectedType)
             {
                 throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Wrong type in json encountered.", input[rw::json::constantes::TYPE_SLUG], expectedType);
             }
+
+            // set path
+            std::vector<std::string> pathElements = input[rw::json::constantes::PATH_SLUG];
+            p = Path(pathElements);
         }
     }
 
-    void NlohmannJSONReader::readList(const nlohmann::json& input, std::vector<nlohmann::json>& elements)
+    void NlohmannJSONReader::readList(const nlohmann::json& input, std::vector<nlohmann::json>& elements, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::LIST_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::LIST_TYPENAME_SLUG, p);
         elements = input[rw::json::constantes::ELEMENTS_SLUG].get<std::vector<nlohmann::json>>();
     }
 
-    void NlohmannJSONReader::readDict(const nlohmann::json& input, std::map<std::string, nlohmann::json>& elements)
+    void NlohmannJSONReader::readDict(const nlohmann::json& input, std::map<std::string, nlohmann::json>& elements, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::DICT_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::DICT_TYPENAME_SLUG, p);
         elements = input[rw::json::constantes::ELEMENTS_SLUG].get<std::map<std::string, nlohmann::json>>();
     }
 
-    void NlohmannJSONReader::readNDArray(const nlohmann::json& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data)
+    void NlohmannJSONReader::readNDArray(const nlohmann::json& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::NDARRAY_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::NDARRAY_TYPENAME_SLUG, p);
         shape = input[rw::json::constantes::DIMENSIONS_SLUG].get<std::vector<int>>();
         typeAsString = input[rw::json::constantes::USED_TYPE_SLUG];
         data = input[rw::json::constantes::DATA_SLUG].get<std::vector<unsigned char>>();
     }
 
-    void NlohmannJSONReader::readInt(const nlohmann::json& input, int& i)
+    void NlohmannJSONReader::readInt(const nlohmann::json& input, int& i, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::INT_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::INT_TYPENAME_SLUG, p);
         i = input[rw::json::constantes::VALUE_SLUG];
     }
 
-    void NlohmannJSONReader::readLong(const nlohmann::json& input, long& i)
+    void NlohmannJSONReader::readLong(const nlohmann::json& input, long& i, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::LONG_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::LONG_TYPENAME_SLUG, p);
         i = input[rw::json::constantes::VALUE_SLUG];
     }
 
-    void NlohmannJSONReader::readFloat(const nlohmann::json& input, float& i)
+    void NlohmannJSONReader::readFloat(const nlohmann::json& input, float& i, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::FLOAT_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::FLOAT_TYPENAME_SLUG, p);
         i = input[rw::json::constantes::VALUE_SLUG];
     }
 
-    void NlohmannJSONReader::readDouble(const nlohmann::json& input, double& i)
+    void NlohmannJSONReader::readDouble(const nlohmann::json& input, double& i, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::DOUBLE_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::DOUBLE_TYPENAME_SLUG, p);
         i = input[rw::json::constantes::VALUE_SLUG];
     }
 
-    void NlohmannJSONReader::readString(const nlohmann::json& input, std::string& i)
+    void NlohmannJSONReader::readString(const nlohmann::json& input, std::string& i, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::STRING_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::STRING_TYPENAME_SLUG, p);
         i = input[rw::json::constantes::VALUE_SLUG];
     }
 
-    void NlohmannJSONReader::readBool(const nlohmann::json& input, bool& i)
+    void NlohmannJSONReader::readBool(const nlohmann::json& input, bool& i, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::BOOL_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::BOOL_TYPENAME_SLUG, p);
         i = input[rw::json::constantes::VALUE_SLUG];
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.h b/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.h
index 53b1c360b1149237c1497f186750b831210e590b..575dee835eb3e1f8842e3bcd20dba30a675921a3 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.h
+++ b/source/RobotAPI/libraries/aron/core/data/rw/reader/nlohmannJSON/NlohmannJSONReader.h
@@ -33,22 +33,22 @@
 namespace armarx::aron::data::reader
 {
     class NlohmannJSONReader :
-        virtual public ReaderInterface<const nlohmann::json>
+        public ReaderInterface<const nlohmann::json>
     {
     public:
         // constructors
         NlohmannJSONReader() = default;
 
-        virtual void readList(const nlohmann::json& input, std::vector<nlohmann::json>& elements) override;
-        virtual void readDict(const nlohmann::json& input, std::map<std::string, nlohmann::json>& elements) override;
+        void readList(InputType& input, std::vector<InputTypeNonConst>& elements, Path& p) override;
+        void readDict(InputType& input, std::map<std::string, InputTypeNonConst>& elements, Path& p) override;
 
-        virtual void readNDArray(const nlohmann::json& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data) override;
+        void readNDArray(InputType& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data, Path& p) override;
 
-        virtual void readInt(const nlohmann::json& input, int& i) override;
-        virtual void readLong(const nlohmann::json& input, long& i) override;
-        virtual void readFloat(const nlohmann::json& input, float& i) override;
-        virtual void readDouble(const nlohmann::json& input, double& i) override;
-        virtual void readString(const nlohmann::json& input, std::string& s) override;
-        virtual void readBool(const nlohmann::json& input, bool& i) override;
+        void readInt(InputType& input, int& i, Path& p) override;
+        void readLong(InputType& input, long& i, Path& p) override;
+        void readFloat(InputType& input, float& i, Path& p) override;
+        void readDouble(InputType& input, double& i, Path& p) override;
+        void readString(InputType& input, std::string& s, Path& p) override;
+        void readBool(InputType& input, bool& i, Path& p) override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/reader/variant/VariantReader.cpp b/source/RobotAPI/libraries/aron/core/data/rw/reader/variant/VariantReader.cpp
index cb1f3cbec377ee2da4564f1cc1030294d1164876..2eaea65364239a216ca92e1e06266bf3588e8cd1 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/reader/variant/VariantReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/rw/reader/variant/VariantReader.cpp
@@ -33,59 +33,77 @@
 
 namespace armarx::aron::data::reader
 {
-    void VariantReader::readList(const data::VariantPtr& input, std::vector<data::VariantPtr>& elements)
+    void VariantReader::readList(const data::VariantPtr& input, std::vector<data::VariantPtr>& elements, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::List::DynamicCastAndCheck(input);
         elements = o->getElements();
+        p = o->getPath();
     }
 
-    void VariantReader::readDict(const data::VariantPtr& input, std::map<std::string, data::VariantPtr>& elements)
+    void VariantReader::readDict(const data::VariantPtr& input, std::map<std::string, data::VariantPtr>& elements, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::Dict::DynamicCastAndCheck(input);
         elements = o->getElements();
+        p = o->getPath();
     }
 
-    void VariantReader::readNDArray(const data::VariantPtr& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data)
+    void VariantReader::readNDArray(const data::VariantPtr& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::NDArray::DynamicCastAndCheck(input);
         shape = o->getShape();
         typeAsString = o->getType();
         data = o->getDataAsVector();
+        p = o->getPath();
     }
 
-    void VariantReader::readInt(const data::VariantPtr& input, int& i)
+    void VariantReader::readInt(const data::VariantPtr& input, int& i, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::Int::DynamicCastAndCheck(input);
         i = o->getValue();
+        p = o->getPath();
     }
 
-    void VariantReader::readLong(const data::VariantPtr& input, long& i)
+    void VariantReader::readLong(const data::VariantPtr& input, long& i, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::Long::DynamicCastAndCheck(input);
         i = o->getValue();
+        p = o->getPath();
     }
 
-    void VariantReader::readFloat(const data::VariantPtr& input, float& i)
+    void VariantReader::readFloat(const data::VariantPtr& input, float& i, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::Float::DynamicCastAndCheck(input);
         i = o->getValue();
+        p = o->getPath();
     }
 
-    void VariantReader::readDouble(const data::VariantPtr& input, double& i)
+    void VariantReader::readDouble(const data::VariantPtr& input, double& i, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::Double::DynamicCastAndCheck(input);
         i = o->getValue();
+        p = o->getPath();
     }
 
-    void VariantReader::readString(const data::VariantPtr& input, std::string& i)
+    void VariantReader::readString(const data::VariantPtr& input, std::string& i, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::String::DynamicCastAndCheck(input);
         i = o->getValue();
+        p = o->getPath();
     }
 
-    void VariantReader::readBool(const data::VariantPtr& input, bool& i)
+    void VariantReader::readBool(const data::VariantPtr& input, bool& i, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = data::Bool::DynamicCastAndCheck(input);
         i = o->getValue();
+        p = o->getPath();
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/rw/reader/variant/VariantReader.h b/source/RobotAPI/libraries/aron/core/data/rw/reader/variant/VariantReader.h
index 33a1a5258e10848aab2fa37a4f71f88a4a57bfb7..14d2b40b363e50e6dbbeca2c8289037996e7f92c 100644
--- a/source/RobotAPI/libraries/aron/core/data/rw/reader/variant/VariantReader.h
+++ b/source/RobotAPI/libraries/aron/core/data/rw/reader/variant/VariantReader.h
@@ -34,22 +34,22 @@
 namespace armarx::aron::data::reader
 {
     class VariantReader :
-        virtual public ReaderInterface<const data::VariantPtr>
+        public ReaderInterface<const data::VariantPtr>
     {
     public:
         // constructors
         VariantReader() = default;
 
-        virtual void readList(const data::VariantPtr& input, std::vector<data::VariantPtr>& elements) override;
-        virtual void readDict(const data::VariantPtr& input, std::map<std::string, data::VariantPtr>& elements) override;
+        void readList(InputType& input, std::vector<InputTypeNonConst>& elements, Path& p) override;
+        void readDict(InputType& input, std::map<std::string, InputTypeNonConst>& elements, Path& p) override;
 
-        virtual void readNDArray(const data::VariantPtr& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data) override;
+        void readNDArray(InputType& input, std::vector<int>& shape, std::string& typeAsString, std::vector<unsigned char>& data, Path& p) override;
 
-        virtual void readInt(const data::VariantPtr& input, int& i) override;
-        virtual void readLong(const data::VariantPtr& input, long& i) override;
-        virtual void readFloat(const data::VariantPtr& input, float& i) override;
-        virtual void readDouble(const data::VariantPtr& input, double& i) override;
-        virtual void readString(const data::VariantPtr& input, std::string& s) override;
-        virtual void readBool(const data::VariantPtr& input, bool& i) override;
+        void readInt(InputType& input, int& i, Path& p) override;
+        void readLong(InputType& input, long& i, Path& p) override;
+        void readFloat(InputType& input, float& i, Path& p) override;
+        void readDouble(InputType& input, double& i, Path& p) override;
+        void readString(InputType& input, std::string& s, Path& p) override;
+        void readBool(InputType& input, bool& i, Path& p) override;
     };
 }
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 bfd75e274daafc4cf52ea733d7f594b359234f5e..55b7a5e32f5cba4032a34ae6c1b82c0dd7421d8a 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
@@ -34,33 +34,34 @@ namespace armarx::aron::data::writer
     namespace
     {
         /// Set important members for json object (aron meta information)
-        void setupAronInformationForType(nlohmann::json& json, const std::string& type)
+        void setupAronMetaInformationForType(nlohmann::json& json, const std::string& type, const Path& p)
         {
             json[rw::json::constantes::TYPE_SLUG] = type;
+            json[rw::json::constantes::PATH_SLUG] = p.getPath();
         }
     }
 
-    nlohmann::json NlohmannJSONWriter::writeList(const std::vector<nlohmann::json>& elements, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeList(const std::vector<nlohmann::json>& elements, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::LIST_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::LIST_TYPENAME_SLUG, p);
         o[rw::json::constantes::ELEMENTS_SLUG] = elements;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeDict(const std::map<std::string, nlohmann::json>& elements, const std::optional<nlohmann::json>& extends, const Path& p)
     {
         auto o = extends ? extends.value() : nlohmann::json();
 
-        setupAronInformationForType(o, rw::json::constantes::DICT_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::DICT_TYPENAME_SLUG, p);
         o[rw::json::constantes::ELEMENTS_SLUG] = elements;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeNDArray(const std::vector<int>& shape, const std::string& typeAsString, const unsigned char* data, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::NDARRAY_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::NDARRAY_TYPENAME_SLUG, p);
         o[rw::json::constantes::DIMENSIONS_SLUG] = shape;
         o[rw::json::constantes::USED_TYPE_SLUG] = typeAsString;
 
@@ -71,50 +72,50 @@ namespace armarx::aron::data::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeInt(const int i, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeInt(const int i, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::INT_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::INT_TYPENAME_SLUG, p);
         o[rw::json::constantes::VALUE_SLUG] = i;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeLong(const long i, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeLong(const long i, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::LONG_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::LONG_TYPENAME_SLUG, p);
         o[rw::json::constantes::VALUE_SLUG] = i;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeFloat(const float i, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeFloat(const float i, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::FLOAT_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::FLOAT_TYPENAME_SLUG, p);
         o[rw::json::constantes::VALUE_SLUG] = i;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeDouble(const double i, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeDouble(const double i, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::DOUBLE_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::DOUBLE_TYPENAME_SLUG, p);
         o[rw::json::constantes::VALUE_SLUG] = i;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeString(const std::string& i, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeString(const std::string& i, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::STRING_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::STRING_TYPENAME_SLUG, p);
         o[rw::json::constantes::VALUE_SLUG] = i;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeBool(const bool i, const Path&)
+    nlohmann::json NlohmannJSONWriter::writeBool(const bool i, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::BOOL_TYPENAME_SLUG);
+        setupAronMetaInformationForType(o, rw::json::constantes::BOOL_TYPENAME_SLUG, p);
         o[rw::json::constantes::VALUE_SLUG] = i;
         return o;
     }
diff --git a/source/RobotAPI/libraries/aron/core/type/converter/Converter.h b/source/RobotAPI/libraries/aron/core/type/converter/Converter.h
index a983de6289bbb221ef350409918505fb6cc9ab8c..cc7ab4a23cad0b36b5410b8e66e0c183e9f4242e 100644
--- a/source/RobotAPI/libraries/aron/core/type/converter/Converter.h
+++ b/source/RobotAPI/libraries/aron/core/type/converter/Converter.h
@@ -66,36 +66,39 @@ namespace armarx::aron::type
             std::string name;
             type::Maybe maybe;
             std::map<std::string, WriterReturnType> elementsReturn;
-            r.readObject(o, name, elementsOfInput, maybe);
+            Path p;
+            r.readObject(o, name, elementsOfInput, maybe, p);
             for (const auto& [key, value] : elementsOfInput)
             {
                 auto converted = readAndWrite<DerivedT>(value);
                 elementsReturn.insert({key, converted});
             }
 
-            last_returned = w.writeObject(name, maybe, elementsReturn);
+            last_returned = w.writeObject(name, elementsReturn, std::nullopt, maybe, p);
         }
 
         void visitDict(ReaderInputType& o) final
         {
             ReaderInputTypeNonConst acceptedType;
             type::Maybe maybe;
-            r.readDict(o, acceptedType, maybe);
+            Path p;
+            r.readDict(o, acceptedType, maybe, p);
 
             auto converted = readAndWrite<DerivedT>(acceptedType);
 
-            last_returned = w.writeDict(maybe, converted);
+            last_returned = w.writeDict(converted, maybe, p);
         };
 
         void visitList(ReaderInputType& o) final
         {
             ReaderInputTypeNonConst acceptedType;
             type::Maybe maybe;
-            r.readList(o, acceptedType, maybe);
+            Path p;
+            r.readList(o, acceptedType, maybe, p);
 
             auto converted = readAndWrite<DerivedT>(acceptedType);
 
-            last_returned = w.writeList(maybe, converted);
+            last_returned = w.writeList(converted, maybe, p);
         };
 
         void visitPair(ReaderInputType& o) final
@@ -103,12 +106,13 @@ namespace armarx::aron::type
             ReaderInputTypeNonConst acceptedType1;
             ReaderInputTypeNonConst acceptedType2;
             type::Maybe maybe;
-            r.readPair(o, acceptedType1, acceptedType2, maybe);
+            Path p;
+            r.readPair(o, acceptedType1, acceptedType2, maybe, p);
 
             auto converted1 = readAndWrite<DerivedT>(acceptedType1);
             auto converted2 = readAndWrite<DerivedT>(acceptedType2);
 
-            last_returned = w.writePair(maybe, converted1, converted2);
+            last_returned = w.writePair(converted1, converted2, maybe, p);
         };
 
         void visitTuple(ReaderInputType& o) final
@@ -116,7 +120,8 @@ namespace armarx::aron::type
             std::vector<ReaderInputTypeNonConst> acceptedTypes;
             std::vector<WriterReturnType> elementsReturn;
             type::Maybe maybe;
-            r.readTuple(o, acceptedTypes, maybe);
+            Path p;
+            r.readTuple(o, acceptedTypes, maybe, p);
 
             for (const auto& el : acceptedTypes)
             {
@@ -124,7 +129,7 @@ namespace armarx::aron::type
                 elementsReturn.push_back(converted);
             }
 
-            last_returned = w.writeTuple(maybe, elementsReturn);
+            last_returned = w.writeTuple(elementsReturn, maybe, p);
         };
 
         void visitNDArray(ReaderInputType& o) final
@@ -132,8 +137,9 @@ namespace armarx::aron::type
             type::Maybe maybe;
             type::ndarray::ElementType type;
             int ndim;
-            r.readNDArray(o, ndim, type, maybe);
-            last_returned = w.writeNDArray(ndim, type, maybe);
+            Path p;
+            r.readNDArray(o, ndim, type, maybe, p);
+            last_returned = w.writeNDArray(ndim, type, maybe, p);
         };
 
         void visitMatrix(ReaderInputType& o) final
@@ -142,53 +148,60 @@ namespace armarx::aron::type
             type::matrix::ElementType type;
             int rows;
             int cols;
-            r.readMatrix(o, rows, cols, type, maybe);
-            last_returned = w.writeMatrix(rows, cols, type, maybe);
+            Path p;
+            r.readMatrix(o, rows, cols, type, maybe, p);
+            last_returned = w.writeMatrix(rows, cols, type, maybe, p);
         };
 
         void visitOrientation(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readOrientation(o, maybe);
-            last_returned = w.writeOrientation(maybe);
+            Path p;
+            r.readOrientation(o, maybe, p);
+            last_returned = w.writeOrientation(maybe, p);
         };
 
         void visitQuaternion(ReaderInputType& o) final
         {
             type::Maybe maybe;
             type::quaternion::ElementType type;
-            r.readQuaternion(o, type, maybe);
-            last_returned = w.writeQuaternion(type, maybe);
+            Path p;
+            r.readQuaternion(o, type, maybe, p);
+            last_returned = w.writeQuaternion(type, maybe, p);
         };
 
         void visitPosition(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readPosition(o, maybe);
-            last_returned = w.writePosition(maybe);
+            Path p;
+            r.readPosition(o, maybe, p);
+            last_returned = w.writePosition(maybe, p);
         };
 
         void visitPose(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readPose(o, maybe);
-            last_returned = w.writePose(maybe);
+            Path p;
+            r.readPose(o, maybe, p);
+            last_returned = w.writePose(maybe, p);
         };
 
         void visitImage(ReaderInputType& o) final
         {
             type::Maybe maybe;
             type::image::PixelType type;
-            r.readImage(o, type, maybe);
-            last_returned = w.writeImage(type, maybe);
+            Path p;
+            r.readImage(o, type, maybe, p);
+            last_returned = w.writeImage(type, maybe, p);
         };
 
         void visitPointCloud(ReaderInputType& o) final
         {
             type::Maybe maybe;
             type::pointcloud::VoxelType type;
-            r.readPointCloud(o, type, maybe);
-            last_returned = w.writePointCloud(type, maybe);
+            Path p;
+            r.readPointCloud(o, type, maybe, p);
+            last_returned = w.writePointCloud(type, maybe, p);
         };
 
         void visitIntEnum(ReaderInputType& o) final
@@ -196,57 +209,65 @@ namespace armarx::aron::type
             type::Maybe maybe;
             std::string name;
             std::map<std::string, int> values;
-            r.readIntEnum(o, name, values, maybe);
-            last_returned = w.writeIntEnum(name, values, maybe);
+            Path p;
+            r.readIntEnum(o, name, values, maybe, p);
+            last_returned = w.writeIntEnum(name, values, maybe, p);
         };
 
         void visitInt(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readInt(o, maybe);
-            last_returned = w.writeInt(maybe);
+            Path p;
+            r.readInt(o, maybe, p);
+            last_returned = w.writeInt(maybe, p);
         };
 
         void visitLong(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readLong(o, maybe);
-            last_returned = w.writeLong(maybe);
+            Path p;
+            r.readLong(o, maybe, p);
+            last_returned = w.writeLong(maybe, p);
         };
 
         void visitFloat(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readFloat(o, maybe);
-            last_returned = w.writeFloat(maybe);
+            Path p;
+            r.readFloat(o, maybe, p);
+            last_returned = w.writeFloat(maybe, p);
         };
 
         void visitDouble(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readDouble(o, maybe);
-            last_returned = w.writeDouble(maybe);
+            Path p;
+            r.readDouble(o, maybe, p);
+            last_returned = w.writeDouble(maybe, p);
         };
 
         void visitBool(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readBool(o, maybe);
-            last_returned = w.writeBool(maybe);
+            Path p;
+            r.readBool(o, maybe, p);
+            last_returned = w.writeBool(maybe, p);
         };
 
         void visitString(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readString(o, maybe);
-            last_returned = w.writeString(maybe);
+            Path p;
+            r.readString(o, maybe, p);
+            last_returned = w.writeString(maybe, p);
         };
 
         void visitTime(ReaderInputType& o) final
         {
             type::Maybe maybe;
-            r.readTime(o, maybe);
-            last_returned = w.writeTime(maybe);
+            Path p;
+            r.readTime(o, maybe, p);
+            last_returned = w.writeTime(maybe, p);
         };
     };
 
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/Reader.h b/source/RobotAPI/libraries/aron/core/type/rw/Reader.h
index 61d457807cc01809fd65d1cbac034b36e3f8a958..53c0ae381098b782fa59c8a801b572f79d6b9eba 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/type/rw/Reader.h
@@ -44,67 +44,67 @@ namespace armarx::aron::type
         virtual ~ReaderInterface() = default;
 
         /// Extract information from an Object type
-        virtual void readObject(const InputType& input, std::string& name, std::map<std::string, InputTypeNonConst>& memberTypes, type::Maybe& maybe) = 0;
+        virtual void readObject(const InputType& input, std::string& name, std::map<std::string, InputTypeNonConst>& memberTypes, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a list type
-        virtual void readList(const InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe) = 0;
+        virtual void readList(const InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a dict type
-        virtual void readDict(const InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe) = 0;
+        virtual void readDict(const InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a tuple type
-        virtual void readTuple(const InputType& input, std::vector<InputTypeNonConst>& acceptedTypes, type::Maybe& maybe) = 0;
+        virtual void readTuple(const InputType& input, std::vector<InputTypeNonConst>& acceptedTypes, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a pair type
-        virtual void readPair(const InputType& input, InputTypeNonConst& acceptedTypes1, InputTypeNonConst& acceptedTypes2, type::Maybe& maybe) = 0;
+        virtual void readPair(const InputType& input, InputTypeNonConst& acceptedTypes1, InputTypeNonConst& acceptedTypes2, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a ndarray type
-        virtual void readNDArray(const InputType& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe) = 0;
+        virtual void readNDArray(const InputType& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a matrix type
-        virtual void readMatrix(const InputType& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe) = 0;
+        virtual void readMatrix(const InputType& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a quaternion type
-        virtual void readQuaternion(const InputType& input, type::quaternion::ElementType& type, type::Maybe& maybe) = 0;
+        virtual void readQuaternion(const InputType& input, type::quaternion::ElementType& type, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a pointcloud type
-        virtual void readPointCloud(const InputType& input, type::pointcloud::VoxelType& type, type::Maybe& maybe) = 0;
+        virtual void readPointCloud(const InputType& input, type::pointcloud::VoxelType& type, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an image type
-        virtual void readImage(const InputType& input, type::image::PixelType& type, type::Maybe& maybe) = 0;
+        virtual void readImage(const InputType& input, type::image::PixelType& type, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a position type
-        virtual void readPosition(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readPosition(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an orientation type
-        virtual void readOrientation(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readOrientation(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from a pose type
-        virtual void readPose(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readPose(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an int enum type
-        virtual void readIntEnum(const InputType& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe) = 0;
+        virtual void readIntEnum(const InputType& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an int type
-        virtual void readInt(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readInt(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an long type
-        virtual void readLong(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readLong(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an float type
-        virtual void readFloat(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readFloat(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an double type
-        virtual void readDouble(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readDouble(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an string type
-        virtual void readString(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readString(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an bool type
-        virtual void readBool(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readBool(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Extract information from an time type
-        virtual void readTime(const InputType& input, type::Maybe& maybe) = 0;
+        virtual void readTime(const InputType& input, type::Maybe& maybe, Path& p) = 0;
 
         /// Check if input is null
         virtual bool readNull(InputType& input) // defaulted implementation
@@ -112,6 +112,133 @@ namespace armarx::aron::type
             InputType nil = {};
             return input == nil;
         }
+
+        // Convenience methods without path
+        void readObject(const InputType& input, std::string& name, std::map<std::string, InputTypeNonConst>& memberTypes, type::Maybe& maybe)
+        {
+            Path p;
+            return readObject(input, name, memberTypes, maybe, p);
+        }
+
+        void readList(const InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe)
+        {
+            Path p;
+            return readList(input, acceptedType, maybe, p);
+        }
+
+        void readDict(const InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe)
+        {
+            Path p;
+            return readDict(input, acceptedType, maybe, p);
+        }
+
+        void readTuple(const InputType& input, std::vector<InputTypeNonConst>& acceptedTypes, type::Maybe& maybe)
+        {
+            Path p;
+            return readTuple(input, acceptedTypes, maybe, p);
+        }
+
+        void readPair(const InputType& input, InputTypeNonConst& acceptedTypes1, InputTypeNonConst& acceptedTypes2, type::Maybe& maybe)
+        {
+            Path p;
+            return readPair(input, acceptedTypes1, acceptedTypes2, maybe, p);
+        }
+
+        void readNDArray(const InputType& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe)
+        {
+            Path p;
+            return readNDArray(input, ndim, type, maybe, p);
+        }
+
+        void readMatrix(const InputType& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe)
+        {
+            Path p;
+            return readMatrix(input, rows, cols, type, maybe, p);
+        }
+
+        void readQuaternion(const InputType& input, type::quaternion::ElementType& type, type::Maybe& maybe)
+        {
+            Path p;
+            return readQuaternion(input, type, maybe, p);
+        }
+
+        void readPointCloud(const InputType& input, type::pointcloud::VoxelType& type, type::Maybe& maybe)
+        {
+            Path p;
+            return readPointCloud(input, type, maybe, p);
+        }
+
+        void readImage(const InputType& input, type::image::PixelType& type, type::Maybe& maybe)
+        {
+            Path p;
+            return readImage(input, type, maybe, p);
+        }
+
+        void readPosition(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readPosition(input, maybe, p);
+        }
+
+        void readOrientation(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readOrientation(input, maybe, p);
+        }
+
+        void readPose(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readPose(input, maybe, p);
+        }
+
+        void readIntEnum(const InputType& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe)
+        {
+            Path p;
+            return readIntEnum(input, name, acceptedValues, maybe, p);
+        }
+
+        void readInt(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readInt(input, maybe, p);
+        }
+
+        void readLong(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readLong(input, maybe, p);
+        }
+
+        void readFloat(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readFloat(input, maybe, p);
+        }
+
+        void readDouble(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readDouble(input, maybe, p);
+        }
+
+        void readString(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readString(input, maybe, p);
+        }
+
+        void readBool(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readBool(input, maybe, p);
+        }
+
+        void readTime(const InputType& input, type::Maybe& maybe)
+        {
+            Path p;
+            return readTime(input, maybe, p);
+        }
     };
 
     template <class T>
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/Writer.h b/source/RobotAPI/libraries/aron/core/type/rw/Writer.h
index 256aba2d3ccb11127783d8134bf64ea166aa834d..ae4796a9f8b6c74ebd0320df322eb4099728c028 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/type/rw/Writer.h
@@ -43,71 +43,72 @@ namespace armarx::aron::type
         virtual ~WriterInterface() = default;
 
         /// Construct an object from the params
-        virtual ReturnType writeObject(const std::string& name, const type::Maybe maybe, const std::map<std::string, ReturnType>& memberTypes, const std::optional<ReturnType>& extends) = 0;
+        virtual ReturnType writeObject(const std::string& name, const std::map<std::string, ReturnType>& memberTypes, const std::optional<ReturnType>& extends, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a list from the params
-        virtual ReturnType writeList(const type::Maybe maybe, const ReturnType& acceptedType) = 0;
+        virtual ReturnType writeList(const ReturnType& acceptedType, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a dict from the params
-        virtual ReturnType writeDict(const type::Maybe maybe, const ReturnType& acceptedType) = 0;
+        virtual ReturnType writeDict(const ReturnType& acceptedType, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a pair from the params
-        virtual ReturnType writePair(const type::Maybe maybe, const ReturnType& acceptedType1, const ReturnType& acceptedType2) = 0;
+        virtual ReturnType writePair(const ReturnType& acceptedType1, const ReturnType& acceptedType2, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a tuple from the params
-        virtual ReturnType writeTuple(const type::Maybe maybe, const std::vector<ReturnType>& acceptedTypes) = 0;
+        virtual ReturnType writeTuple(const std::vector<ReturnType>& acceptedTypes, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a ndarray from the params
-        virtual ReturnType writeNDArray(const int ndim, const type::ndarray::ElementType, const type::Maybe maybe) = 0;
+        virtual ReturnType writeNDArray(const int ndim, const type::ndarray::ElementType, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a matrix from the params
-        virtual ReturnType writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe) = 0;
+        virtual ReturnType writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a quaternion from the params
-        virtual ReturnType writeQuaternion(const type::quaternion::ElementType, const type::Maybe maybe) = 0;
+        virtual ReturnType writeQuaternion(const type::quaternion::ElementType, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a image from the params
-        virtual ReturnType writeImage(const type::image::PixelType, const type::Maybe maybe) = 0;
+        virtual ReturnType writeImage(const type::image::PixelType, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a pointcloud from the params
-        virtual ReturnType writePointCloud(const type::pointcloud::VoxelType, const type::Maybe maybe) = 0;
+        virtual ReturnType writePointCloud(const type::pointcloud::VoxelType, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a position from the params
-        virtual ReturnType writePosition(const type::Maybe maybe) = 0;
+        virtual ReturnType writePosition(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a orientation from the params
-        virtual ReturnType writeOrientation(const type::Maybe maybe) = 0;
+        virtual ReturnType writeOrientation(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a pose from the params
-        virtual ReturnType writePose(const type::Maybe maybe) = 0;
+        virtual ReturnType writePose(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a int enum from the params
-        virtual ReturnType writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe) = 0;
+        virtual ReturnType writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a int from the params
-        virtual ReturnType writeInt(const type::Maybe maybe) = 0;
+        virtual ReturnType writeInt(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a long from the params
-        virtual ReturnType writeLong(const type::Maybe maybe) = 0;
+        virtual ReturnType writeLong(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a float from the params
-        virtual ReturnType writeFloat(const type::Maybe maybe) = 0;
+        virtual ReturnType writeFloat(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a double from the params
-        virtual ReturnType writeDouble(const type::Maybe maybe) = 0;
+        virtual ReturnType writeDouble(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a string from the params
-        virtual ReturnType writeString(const type::Maybe maybe) = 0;
+        virtual ReturnType writeString(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a bool from the params
-        virtual ReturnType writeBool(const type::Maybe maybe) = 0;
+        virtual ReturnType writeBool(const type::Maybe maybe, const Path& p) = 0;
 
         /// Construct a time from the params
-        virtual ReturnType writeTime(const type::Maybe maybe) = 0;
+        virtual ReturnType writeTime(const type::Maybe maybe, const Path& p) = 0;
 
         /// write a null
-        virtual ReturnType writeNull() // defaulted implementation
+        virtual ReturnType writeNull(const Path& p = Path()) // defaulted implementation
         {
+            (void) p;
             return {};
         }
     };
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/json/Data.h b/source/RobotAPI/libraries/aron/core/type/rw/json/Data.h
index b4e84415be729077b554d5d26a47734f8d758300..fbaff7c102faa1a636e81fb36d35cafa19fa8a86 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/json/Data.h
+++ b/source/RobotAPI/libraries/aron/core/type/rw/json/Data.h
@@ -36,6 +36,7 @@ namespace armarx::aron::type::rw::json
     {
         const std::string MAYBE_SLUG = "_ARON_MAYBE";
         const std::string TYPE_SLUG = "_ARON_TYPE";
+        const std::string PATH_SLUG = "_ARON_PATH";
         const std::string VERSION_SLUG = "_ARON_VERSION";
 
         const std::string KEY_SLUG = "_ARON_KEY";
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp b/source/RobotAPI/libraries/aron/core/type/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp
index eefe1e62e1ca93ecc6fa5069bb054640a71813e0..2ae071ed8e433076946b37d9d9bd2bdc403d9dbf 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/rw/reader/nlohmannJSON/NlohmannJSONReader.cpp
@@ -34,51 +34,55 @@ namespace armarx::aron::type::reader
     namespace
     {
         /// Throw an exception if the type is other than expected
-        void checkInputForCorrectType(const nlohmann::json& input, const std::string& expectedType)
+        void getAronMetaInformationForType(const nlohmann::json& input, const std::string& expectedType, Path& p)
         {
             if (input[rw::json::constantes::TYPE_SLUG] != expectedType)
             {
                 throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Wrong type in json encountered.", input[rw::json::constantes::TYPE_SLUG], expectedType);
             }
+
+            // get Path
+            std::vector<std::string> pathElements = input[rw::json::constantes::PATH_SLUG];
+            p = Path(pathElements);
         }
     }
 
-    void NlohmannJSONReader::readObject(const nlohmann::json& input, std::string& name, std::map<std::string, nlohmann::json>& memberTypes, type::Maybe& maybe)
+    void NlohmannJSONReader::readObject(const nlohmann::json& input, std::string& name, std::map<std::string, nlohmann::json>& memberTypes, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::OBJECT_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::OBJECT_TYPENAME_SLUG, p);
 
         name = input[rw::json::constantes::NAME_SLUG];
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
 
         memberTypes = input[rw::json::constantes::MEMBERS_SLUG].get<std::map<std::string, nlohmann::json>>();
     }
-    void NlohmannJSONReader::readList(const nlohmann::json& input, nlohmann::json& acceptedType, type::Maybe& maybe)
+    void NlohmannJSONReader::readList(const nlohmann::json& input, nlohmann::json& acceptedType, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::LIST_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::LIST_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         acceptedType = input[rw::json::constantes::ACCEPTED_TYPE_SLUG];
     }
 
-    void NlohmannJSONReader::readDict(const nlohmann::json& input, nlohmann::json& acceptedType, type::Maybe& maybe)
+    void NlohmannJSONReader::readDict(const nlohmann::json& input, nlohmann::json& acceptedType, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::DICT_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::DICT_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         acceptedType = input[rw::json::constantes::ACCEPTED_TYPE_SLUG];
     }
 
-    void NlohmannJSONReader::readTuple(const nlohmann::json& input, std::vector<nlohmann::json>& acceptedTypes, type::Maybe& maybe)
+    void NlohmannJSONReader::readTuple(const nlohmann::json& input, std::vector<nlohmann::json>& acceptedTypes, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::TUPLE_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::TUPLE_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         acceptedTypes = input[rw::json::constantes::ACCEPTED_TYPE_SLUG].get<std::vector<nlohmann::json>>();
     }
 
-    void NlohmannJSONReader::readPair(const nlohmann::json& input, nlohmann::json& acceptedType1, nlohmann::json& acceptedType2, type::Maybe& maybe)
+    void NlohmannJSONReader::readPair(const nlohmann::json& input, nlohmann::json& acceptedType1, nlohmann::json& acceptedType2, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::PAIR_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::PAIR_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         auto list = input[rw::json::constantes::ACCEPTED_TYPE_SLUG].get<std::vector<nlohmann::json>>();
@@ -86,18 +90,18 @@ namespace armarx::aron::type::reader
         acceptedType2 = list[1];
     }
 
-    void NlohmannJSONReader::readNDArray(const nlohmann::json& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe)
+    void NlohmannJSONReader::readNDArray(const nlohmann::json& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::NDARRAY_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::NDARRAY_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         ndim = input[rw::json::constantes::DIMENSIONS_SLUG];
         type = input[rw::json::constantes::USED_TYPE_SLUG];
     }
 
-    void NlohmannJSONReader::readMatrix(const nlohmann::json& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe)
+    void NlohmannJSONReader::readMatrix(const nlohmann::json& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::MATRIX_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::MATRIX_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         auto list = input[rw::json::constantes::DIMENSIONS_SLUG].get<std::vector<nlohmann::json>>();
@@ -106,54 +110,54 @@ namespace armarx::aron::type::reader
         type = input[rw::json::constantes::USED_TYPE_SLUG];
     }
 
-    void NlohmannJSONReader::readQuaternion(const nlohmann::json& input, type::quaternion::ElementType& type, type::Maybe& maybe)
+    void NlohmannJSONReader::readQuaternion(const nlohmann::json& input, type::quaternion::ElementType& type, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::QUATERNION_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::QUATERNION_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         type = input[rw::json::constantes::USED_TYPE_SLUG];
     }
 
-    void NlohmannJSONReader::readPointCloud(const nlohmann::json& input, type::pointcloud::VoxelType& type, type::Maybe& maybe)
+    void NlohmannJSONReader::readPointCloud(const nlohmann::json& input, type::pointcloud::VoxelType& type, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::POINT_CLOUD_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::POINT_CLOUD_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         type = input[rw::json::constantes::USED_TYPE_SLUG];
     }
 
-    void NlohmannJSONReader::readImage(const nlohmann::json& input, type::image::PixelType& type, type::Maybe& maybe)
+    void NlohmannJSONReader::readImage(const nlohmann::json& input, type::image::PixelType& type, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::IMAGE_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::IMAGE_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
         type = input[rw::json::constantes::USED_TYPE_SLUG];
     }
 
-    void NlohmannJSONReader::readPosition(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readPosition(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::POSITION_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::POSITION_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readOrientation(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readOrientation(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::ORIENTATION_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::ORIENTATION_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readPose(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readPose(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::POSE_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::POSE_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readIntEnum(const nlohmann::json& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe)
+    void NlohmannJSONReader::readIntEnum(const nlohmann::json& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::INT_ENUM_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::INT_ENUM_TYPENAME_SLUG, p);
 
         name = input[rw::json::constantes::NAME_SLUG];
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
@@ -161,51 +165,51 @@ namespace armarx::aron::type::reader
         acceptedValues = input[rw::json::constantes::ELEMENTS_SLUG].get<std::map<std::string, int>>();
     }
 
-    void NlohmannJSONReader::readInt(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readInt(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::INT_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::INT_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readLong(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readLong(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::LONG_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::LONG_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readFloat(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readFloat(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::FLOAT_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::FLOAT_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readDouble(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readDouble(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::DOUBLE_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::DOUBLE_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readString(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readString(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::STRING_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::STRING_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readBool(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readBool(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::BOOL_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::BOOL_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
 
-    void NlohmannJSONReader::readTime(const nlohmann::json& input, type::Maybe& maybe)
+    void NlohmannJSONReader::readTime(const nlohmann::json& input, type::Maybe& maybe, Path& p)
     {
-        checkInputForCorrectType(input, rw::json::constantes::TIME_TYPENAME_SLUG);
+        getAronMetaInformationForType(input, rw::json::constantes::TIME_TYPENAME_SLUG, p);
 
         maybe = rw::json::conversion::String2Maybe.at(input[rw::json::constantes::MAYBE_SLUG]);
     }
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/reader/nlohmannJSON/NlohmannJSONReader.h b/source/RobotAPI/libraries/aron/core/type/rw/reader/nlohmannJSON/NlohmannJSONReader.h
index 555aa43e880d6f5afbdb27252c7388bc61fa0a0b..4666244c26fa6563a8bf2f477e30f260a04b38de 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/reader/nlohmannJSON/NlohmannJSONReader.h
+++ b/source/RobotAPI/libraries/aron/core/type/rw/reader/nlohmannJSON/NlohmannJSONReader.h
@@ -39,29 +39,29 @@ namespace armarx::aron::type::reader
         // constructors
         NlohmannJSONReader() = default;
 
-        void readObject(InputType& input, std::string& name, std::map<std::string, InputTypeNonConst>& memberTypes, type::Maybe& maybe) override;
-        void readList(InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe) override;
-        void readDict(InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe) override;
-        void readTuple(InputType& input, std::vector<InputTypeNonConst>& acceptedTypes, type::Maybe& maybe) override;
-        void readPair(InputType& input, InputTypeNonConst& acceptedType1, InputTypeNonConst& acceptedType2, type::Maybe& maybe) override;
+        void readObject(InputType& input, std::string& name, std::map<std::string, InputTypeNonConst>& memberTypes, type::Maybe& maybe, Path& p) override;
+        void readList(InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe, Path& p) override;
+        void readDict(InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe, Path& p) override;
+        void readTuple(InputType& input, std::vector<InputTypeNonConst>& acceptedTypes, type::Maybe& maybe, Path& p) override;
+        void readPair(InputType& input, InputTypeNonConst& acceptedType1, InputTypeNonConst& acceptedType2, type::Maybe& maybe, Path& p) override;
 
-        void readNDArray(InputType& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe) override;
-        void readMatrix(InputType& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe) override;
-        void readQuaternion(InputType& input, type::quaternion::ElementType& type, type::Maybe& maybe) override;
-        void readPointCloud(InputType& input, type::pointcloud::VoxelType& type, type::Maybe& maybe) override;
-        void readImage(InputType& input, type::image::PixelType& type, type::Maybe& maybe) override;
-        void readPosition(InputType& input, type::Maybe& maybe) override;
-        void readOrientation(InputType& input, type::Maybe& maybe) override;
-        void readPose(InputType& input, type::Maybe& maybe) override;
+        void readNDArray(InputType& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe, Path& p) override;
+        void readMatrix(InputType& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe, Path& p) override;
+        void readQuaternion(InputType& input, type::quaternion::ElementType& type, type::Maybe& maybe, Path& p) override;
+        void readPointCloud(InputType& input, type::pointcloud::VoxelType& type, type::Maybe& maybe, Path& p) override;
+        void readImage(InputType& input, type::image::PixelType& type, type::Maybe& maybe, Path& p) override;
+        void readPosition(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readOrientation(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readPose(InputType& input, type::Maybe& maybe, Path& p) override;
 
-        void readIntEnum(InputType& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe) override;
+        void readIntEnum(InputType& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe, Path& p) override;
 
-        void readInt(InputType& input, type::Maybe& maybe) override;
-        void readLong(InputType& input, type::Maybe& maybe) override;
-        void readFloat(InputType& input, type::Maybe& maybe) override;
-        void readDouble(InputType& input, type::Maybe& maybe) override;
-        void readString(InputType& input, type::Maybe& maybe) override;
-        void readBool(InputType& input, type::Maybe& maybe) override;
-        void readTime(InputType& input, type::Maybe& maybe) override;
+        void readInt(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readLong(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readFloat(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readDouble(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readString(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readBool(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readTime(InputType& input, type::Maybe& maybe, Path& p) override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/reader/variant/VariantReader.cpp b/source/RobotAPI/libraries/aron/core/type/rw/reader/variant/VariantReader.cpp
index 2568a1543c6aae294697226749eba910338a80f8..26c6180abb37a34be93d6f22e06e8127224f0a30 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/reader/variant/VariantReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/rw/reader/variant/VariantReader.cpp
@@ -32,166 +32,208 @@
 
 namespace armarx::aron::type::reader
 {
-    void VariantReader::readObject(const aron::type::VariantPtr& input, std::string& name, std::map<std::string, aron::type::VariantPtr>& memberTypes, type::Maybe& maybe)
+    void VariantReader::readObject(const aron::type::VariantPtr& input, std::string& name, std::map<std::string, aron::type::VariantPtr>& memberTypes, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Object::DynamicCastAndCheck(input);
 
         name = o->getObjectName();
         maybe = o->getMaybe();
         memberTypes = o->getMemberTypes();
+        p = o->getPath();
     }
-    void VariantReader::readList(const aron::type::VariantPtr& input, aron::type::VariantPtr& acceptedType, type::Maybe& maybe)
+    void VariantReader::readList(const aron::type::VariantPtr& input, aron::type::VariantPtr& acceptedType, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::List::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         acceptedType = o->getAcceptedType();
+        p = o->getPath();
     }
 
-    void VariantReader::readDict(const aron::type::VariantPtr& input, aron::type::VariantPtr& acceptedType, type::Maybe& maybe)
+    void VariantReader::readDict(const aron::type::VariantPtr& input, aron::type::VariantPtr& acceptedType, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Dict::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         acceptedType = o->getAcceptedType();
+        p = o->getPath();
     }
 
-    void VariantReader::readTuple(const aron::type::VariantPtr& input, std::vector<aron::type::VariantPtr>& acceptedTypes, type::Maybe& maybe)
+    void VariantReader::readTuple(const aron::type::VariantPtr& input, std::vector<aron::type::VariantPtr>& acceptedTypes, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Tuple::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         acceptedTypes = o->getAcceptedTypes();
+        p = o->getPath();
     }
 
-    void VariantReader::readPair(const aron::type::VariantPtr& input, aron::type::VariantPtr& acceptedType1, aron::type::VariantPtr& acceptedType2, type::Maybe& maybe)
+    void VariantReader::readPair(const aron::type::VariantPtr& input, aron::type::VariantPtr& acceptedType1, aron::type::VariantPtr& acceptedType2, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Pair::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         acceptedType1 = o->getAcceptedTypes().first;
         acceptedType2 = o->getAcceptedTypes().second;
+        p = o->getPath();
     }
 
-    void VariantReader::readNDArray(const aron::type::VariantPtr& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe)
+    void VariantReader::readNDArray(const aron::type::VariantPtr& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::NDArray::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         ndim = o->getNumberDimensions();
         type = o->getElementType();
+        p = o->getPath();
     }
 
-    void VariantReader::readMatrix(const aron::type::VariantPtr& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe)
+    void VariantReader::readMatrix(const aron::type::VariantPtr& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Matrix::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         rows = o->getRows();
         cols = o->getCols();
         type = o->getElementType();
+        p = o->getPath();
     }
 
-    void VariantReader::readQuaternion(const aron::type::VariantPtr& input, type::quaternion::ElementType& type, type::Maybe& maybe)
+    void VariantReader::readQuaternion(const aron::type::VariantPtr& input, type::quaternion::ElementType& type, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Quaternion::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         type = o->getElementType();
+        p = o->getPath();
     }
 
-    void VariantReader::readPointCloud(const aron::type::VariantPtr& input, type::pointcloud::VoxelType& type, type::Maybe& maybe)
+    void VariantReader::readPointCloud(const aron::type::VariantPtr& input, type::pointcloud::VoxelType& type, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::PointCloud::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         type = o->getVoxelType();
+        p = o->getPath();
     }
 
-    void VariantReader::readImage(const aron::type::VariantPtr& input, type::image::PixelType& type, type::Maybe& maybe)
+    void VariantReader::readImage(const aron::type::VariantPtr& input, type::image::PixelType& type, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Image::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
         type = o->getPixelType();
+        p = o->getPath();
     }
 
-    void VariantReader::readPosition(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readPosition(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Position::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readOrientation(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readOrientation(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Orientation::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readPose(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readPose(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Pose::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readIntEnum(const aron::type::VariantPtr& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe)
+    void VariantReader::readIntEnum(const aron::type::VariantPtr& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::IntEnum::DynamicCastAndCheck(input);
 
         name = o->getEnumName();
         acceptedValues = o->getAcceptedValueMap();
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readInt(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readInt(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Int::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readLong(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readLong(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Long::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readFloat(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readFloat(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Float::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readDouble(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readDouble(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Double::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readString(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readString(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::String::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readBool(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readBool(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Bool::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 
-    void VariantReader::readTime(const aron::type::VariantPtr& input, type::Maybe& maybe)
+    void VariantReader::readTime(const aron::type::VariantPtr& input, type::Maybe& maybe, Path& p)
     {
+        ARMARX_CHECK_NOT_NULL(input);
         auto o = type::Time::DynamicCastAndCheck(input);
 
         maybe = o->getMaybe();
+        p = o->getPath();
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/reader/variant/VariantReader.h b/source/RobotAPI/libraries/aron/core/type/rw/reader/variant/VariantReader.h
index 6ce41ec9609b961c5d0e7404c81401ddb7ddd71d..ec223069810938234ec0be26357dea2423e05569 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/reader/variant/VariantReader.h
+++ b/source/RobotAPI/libraries/aron/core/type/rw/reader/variant/VariantReader.h
@@ -40,29 +40,29 @@ namespace armarx::aron::type::reader
         // constructors
         VariantReader() = default;
 
-        void readObject(InputType& input, std::string& name, std::map<std::string, InputTypeNonConst>& memberTypes, type::Maybe& maybe) override;
-        void readList(InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe) override;
-        void readDict(InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe) override;
-        void readTuple(InputType& input, std::vector<InputTypeNonConst>& acceptedTypes, type::Maybe& maybe) override;
-        void readPair(InputType& input, InputTypeNonConst& acceptedType1, InputTypeNonConst& acceptedType2, type::Maybe& maybe) override;
+        void readObject(InputType& input, std::string& name, std::map<std::string, InputTypeNonConst>& memberTypes, type::Maybe& maybe, Path& p) override;
+        void readList(InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe, Path& p) override;
+        void readDict(InputType& input, InputTypeNonConst& acceptedType, type::Maybe& maybe, Path& p) override;
+        void readTuple(InputType& input, std::vector<InputTypeNonConst>& acceptedTypes, type::Maybe& maybe, Path& p) override;
+        void readPair(InputType& input, InputTypeNonConst& acceptedType1, InputTypeNonConst& acceptedType2, type::Maybe& maybe, Path& p) override;
 
-        void readNDArray(InputType& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe) override;
-        void readMatrix(InputType& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe) override;
-        void readQuaternion(InputType& input, type::quaternion::ElementType& type, type::Maybe& maybe) override;
-        void readPointCloud(InputType& input, type::pointcloud::VoxelType& type, type::Maybe& maybe) override;
-        void readImage(InputType& input, type::image::PixelType& type, type::Maybe& maybe) override;
-        void readPosition(InputType& input, type::Maybe& maybe) override;
-        void readOrientation(InputType& input, type::Maybe& maybe) override;
-        void readPose(InputType& input, type::Maybe& maybe) override;
+        void readNDArray(InputType& input, int& ndim, type::ndarray::ElementType& type, type::Maybe& maybe, Path& p) override;
+        void readMatrix(InputType& input, int& rows, int& cols, type::matrix::ElementType& type, type::Maybe& maybe, Path& p) override;
+        void readQuaternion(InputType& input, type::quaternion::ElementType& type, type::Maybe& maybe, Path& p) override;
+        void readPointCloud(InputType& input, type::pointcloud::VoxelType& type, type::Maybe& maybe, Path& p) override;
+        void readImage(InputType& input, type::image::PixelType& type, type::Maybe& maybe, Path& p) override;
+        void readPosition(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readOrientation(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readPose(InputType& input, type::Maybe& maybe, Path& p) override;
 
-        void readIntEnum(InputType& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe) override;
+        void readIntEnum(InputType& input, std::string& name, std::map<std::string, int>& acceptedValues, type::Maybe& maybe, Path& p) override;
 
-        void readInt(InputType& input, type::Maybe& maybe) override;
-        void readLong(InputType& input, type::Maybe& maybe) override;
-        void readFloat(InputType& input, type::Maybe& maybe) override;
-        void readDouble(InputType& input, type::Maybe& maybe) override;
-        void readString(InputType& input, type::Maybe& maybe) override;
-        void readBool(InputType& input, type::Maybe& maybe) override;
-        void readTime(InputType& input, type::Maybe& maybe) override;
+        void readInt(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readLong(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readFloat(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readDouble(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readString(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readBool(InputType& input, type::Maybe& maybe, Path& p) override;
+        void readTime(InputType& input, type::Maybe& maybe, Path& p) override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp b/source/RobotAPI/libraries/aron/core/type/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp
index 5ce67f26c47d70e6e45f447ca36ad7d97b240aa8..303ee55bc8f826ad7896bdc88c3b18e17ce9eeff 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/rw/writer/nlohmannJSON/NlohmannJSONWriter.cpp
@@ -32,17 +32,18 @@ namespace armarx::aron::type::writer
     namespace
     {
         /// Set important members for json object (aron meta information)
-        void setupAronInformationForType(nlohmann::json& json, const std::string& type, const type::Maybe& maybe)
+        void setupAronMetaInformationForType(nlohmann::json& json, const std::string& type, const type::Maybe& maybe, const Path& p)
         {
             json[rw::json::constantes::TYPE_SLUG] = type;
+            json[rw::json::constantes::PATH_SLUG] = p.getPath();
             json[rw::json::constantes::MAYBE_SLUG] = rw::json::conversion::Maybe2String.at(maybe);
         }
     }
 
-    nlohmann::json NlohmannJSONWriter::writeObject(const std::string& name, const type::Maybe maybe, const std::map<std::string, nlohmann::json>& memberTypes, const std::optional<nlohmann::json>& extends)
+    nlohmann::json NlohmannJSONWriter::writeObject(const std::string& name, const std::map<std::string, nlohmann::json>& memberTypes, const std::optional<nlohmann::json>& extends, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::OBJECT_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::OBJECT_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::NAME_SLUG] = name;
         if (extends.has_value())
         {
@@ -57,105 +58,105 @@ namespace armarx::aron::type::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeList(const type::Maybe maybe, const nlohmann::json& acceptedType)
+    nlohmann::json NlohmannJSONWriter::writeList(const nlohmann::json& acceptedType, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::LIST_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::LIST_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::ACCEPTED_TYPE_SLUG] = acceptedType;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeDict(const type::Maybe maybe, const nlohmann::json& acceptedType)
+    nlohmann::json NlohmannJSONWriter::writeDict(const nlohmann::json& acceptedType, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::DICT_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::DICT_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::ACCEPTED_TYPE_SLUG] = acceptedType;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writePair(const type::Maybe maybe, const nlohmann::json& acceptedType1, const nlohmann::json& acceptedType2)
+    nlohmann::json NlohmannJSONWriter::writePair(const nlohmann::json& acceptedType1, const nlohmann::json& acceptedType2, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::PAIR_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::PAIR_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::ACCEPTED_TYPE_SLUG] = {acceptedType1, acceptedType2};
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeTuple(const type::Maybe maybe, const std::vector<nlohmann::json>& acceptedTypes)
+    nlohmann::json NlohmannJSONWriter::writeTuple(const std::vector<nlohmann::json>& acceptedTypes, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::TUPLE_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::TUPLE_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::ACCEPTED_TYPE_SLUG] = acceptedTypes;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeNDArray(const int ndim, const type::ndarray::ElementType type, const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeNDArray(const int ndim, const type::ndarray::ElementType type, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::NDARRAY_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::NDARRAY_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::USED_TYPE_SLUG] = rw::json::conversion::NDArrayType2String.at(type);
         o[rw::json::constantes::DIMENSIONS_SLUG] = ndim;
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::MATRIX_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::MATRIX_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::USED_TYPE_SLUG] = rw::json::conversion::MatrixType2String.at(type);
         o[rw::json::constantes::DIMENSIONS_SLUG] = {rows, cols};
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeQuaternion(const type::quaternion::ElementType type, const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeQuaternion(const type::quaternion::ElementType type, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::QUATERNION_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::QUATERNION_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::USED_TYPE_SLUG] = rw::json::conversion::QuaternionType2String.at(type);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeImage(const type::image::PixelType type, const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeImage(const type::image::PixelType type, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::IMAGE_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::IMAGE_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::USED_TYPE_SLUG] = rw::json::conversion::PixelType2String.at(type);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writePointCloud(const type::pointcloud::VoxelType type, const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writePointCloud(const type::pointcloud::VoxelType type, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::POINT_CLOUD_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::POINT_CLOUD_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::USED_TYPE_SLUG] = rw::json::conversion::VoxelType2String.at(type);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writePosition(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writePosition(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::POSITION_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::POSITION_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeOrientation(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeOrientation(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::ORIENTATION_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::ORIENTATION_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writePose(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writePose(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::POSE_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::POSE_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::INT_ENUM_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::INT_ENUM_TYPENAME_SLUG, maybe, p);
         o[rw::json::constantes::NAME_SLUG] = name;
 
         o[rw::json::constantes::ELEMENTS_SLUG] = nlohmann::json(nlohmann::json::value_t::object);
@@ -166,52 +167,52 @@ namespace armarx::aron::type::writer
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeInt(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeInt(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::INT_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::INT_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeLong(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeLong(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::LONG_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::LONG_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeFloat(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeFloat(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::FLOAT_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::FLOAT_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeDouble(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeDouble(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::DOUBLE_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::DOUBLE_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeString(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeString(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::STRING_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::STRING_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeBool(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeBool(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::BOOL_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::BOOL_TYPENAME_SLUG, maybe, p);
         return o;
     }
 
-    nlohmann::json NlohmannJSONWriter::writeTime(const type::Maybe maybe)
+    nlohmann::json NlohmannJSONWriter::writeTime(const type::Maybe maybe, const Path& p)
     {
         nlohmann::json o;
-        setupAronInformationForType(o, rw::json::constantes::TIME_TYPENAME_SLUG, maybe);
+        setupAronMetaInformationForType(o, rw::json::constantes::TIME_TYPENAME_SLUG, maybe, p);
         return o;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/writer/nlohmannJSON/NlohmannJSONWriter.h b/source/RobotAPI/libraries/aron/core/type/rw/writer/nlohmannJSON/NlohmannJSONWriter.h
index 0733514e9712080957023c85050597423d0097b3..ce15b29325c9aa22705e6b53f31034a9405e7452 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/writer/nlohmannJSON/NlohmannJSONWriter.h
+++ b/source/RobotAPI/libraries/aron/core/type/rw/writer/nlohmannJSON/NlohmannJSONWriter.h
@@ -39,29 +39,29 @@ namespace armarx::aron::type::writer
     public:
         NlohmannJSONWriter() = default;
 
-        virtual ReturnType writeObject(const std::string& name, const type::Maybe maybe, const std::map<std::string, ReturnType>& memberTypes, const std::optional<ReturnType>& extends = std::nullopt) override;
-        virtual ReturnType writeList(const type::Maybe maybe, const ReturnType& acceptedType) override;
-        virtual ReturnType writeDict(const type::Maybe maybe, const ReturnType& acceptedType) override;
-        virtual ReturnType writePair(const type::Maybe maybe, const ReturnType& acceptedType1, const ReturnType& acceptedType2) override;
-        virtual ReturnType writeTuple(const type::Maybe maybe, const std::vector<ReturnType>& acceptedTypes) override;
+        ReturnType writeObject(const std::string& name, const std::map<std::string, ReturnType>& memberTypes, const std::optional<ReturnType>& extends, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeList(const ReturnType& acceptedType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeDict(const ReturnType& acceptedType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writePair(const ReturnType& acceptedType1, const ReturnType& acceptedType2, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeTuple(const std::vector<ReturnType>& acceptedTypes, const type::Maybe maybe, const Path& p = Path()) override;
 
-        virtual ReturnType writeNDArray(const int ndim, const type::ndarray::ElementType, const type::Maybe maybe) override;
-        virtual ReturnType writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe) override;
-        virtual ReturnType writeQuaternion(const type::quaternion::ElementType, const type::Maybe maybe) override;
-        virtual ReturnType writeImage(const type::image::PixelType, const type::Maybe maybe) override;
-        virtual ReturnType writePointCloud(const type::pointcloud::VoxelType, const type::Maybe maybe) override;
-        virtual ReturnType writePosition(const type::Maybe maybe) override;
-        virtual ReturnType writeOrientation(const type::Maybe maybe) override;
-        virtual ReturnType writePose(const type::Maybe maybe) override;
+        ReturnType writeNDArray(const int ndim, const type::ndarray::ElementType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeQuaternion(const type::quaternion::ElementType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeImage(const type::image::PixelType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writePointCloud(const type::pointcloud::VoxelType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writePosition(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeOrientation(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writePose(const type::Maybe maybe, const Path& p = Path()) override;
 
-        virtual ReturnType writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe) override;
+        ReturnType writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe, const Path& p = Path()) override;
 
-        virtual ReturnType writeInt(const type::Maybe maybe) override;
-        virtual ReturnType writeLong(const type::Maybe maybe) override;
-        virtual ReturnType writeFloat(const type::Maybe maybe) override;
-        virtual ReturnType writeDouble(const type::Maybe maybe) override;
-        virtual ReturnType writeString(const type::Maybe maybe) override;
-        virtual ReturnType writeBool(const type::Maybe maybe) override;
-        virtual ReturnType writeTime(const type::Maybe maybe) override;
+        ReturnType writeInt(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeLong(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeFloat(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeDouble(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeString(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeBool(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeTime(const type::Maybe maybe, const Path& p = Path()) override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/writer/variant/VariantWriter.cpp b/source/RobotAPI/libraries/aron/core/type/rw/writer/variant/VariantWriter.cpp
index 40d0871bf24f0889d8f5e0687633a2b2dca0a722..8c16a0c860b37a9d1897da6e72ebd74f3baeb1d2 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/writer/variant/VariantWriter.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/rw/writer/variant/VariantWriter.cpp
@@ -29,9 +29,9 @@
 namespace armarx::aron::type::writer
 {
     // interface
-    aron::type::VariantPtr VariantWriter::writeObject(const std::string& name, const type::Maybe maybe, const std::map<std::string, aron::type::VariantPtr>& memberTypes, const std::optional<aron::type::VariantPtr>& extends)
+    aron::type::VariantPtr VariantWriter::writeObject(const std::string& name, const std::map<std::string, aron::type::VariantPtr>& memberTypes, const std::optional<aron::type::VariantPtr>& extends, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Object>(name, memberTypes);
+        auto o = std::make_shared<type::Object>(name, memberTypes, p);
         o->setMaybe(maybe);
         if (extends.has_value())
         {
@@ -41,43 +41,43 @@ namespace armarx::aron::type::writer
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeList(const type::Maybe maybe, const aron::type::VariantPtr& acceptedType)
+    aron::type::VariantPtr VariantWriter::writeList(const aron::type::VariantPtr& acceptedType, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::List>(acceptedType);
+        auto o = std::make_shared<type::List>(acceptedType, p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeDict(const type::Maybe maybe, const aron::type::VariantPtr& acceptedType)
+    aron::type::VariantPtr VariantWriter::writeDict(const aron::type::VariantPtr& acceptedType, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Dict>(acceptedType);
+        auto o = std::make_shared<type::Dict>(acceptedType, p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writePair(const type::Maybe maybe, const aron::type::VariantPtr& acceptedType1, const aron::type::VariantPtr& acceptedType2)
+    aron::type::VariantPtr VariantWriter::writePair(const aron::type::VariantPtr& acceptedType1, const aron::type::VariantPtr& acceptedType2, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Pair>(acceptedType1, acceptedType2);
+        auto o = std::make_shared<type::Pair>(acceptedType1, acceptedType2, p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeTuple(const type::Maybe maybe, const std::vector<aron::type::VariantPtr>& acceptedTypes)
+    aron::type::VariantPtr VariantWriter::writeTuple(const std::vector<aron::type::VariantPtr>& acceptedTypes, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Tuple>(acceptedTypes);
+        auto o = std::make_shared<type::Tuple>(acceptedTypes, p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeNDArray(const int ndim, const type::ndarray::ElementType, const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeNDArray(const int ndim, const type::ndarray::ElementType, const type::Maybe maybe, const Path& p)
     {
-       auto o = std::make_shared<type::NDArray>();
+       auto o = std::make_shared<type::NDArray>(p);
        return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Matrix>();
+        auto o = std::make_shared<type::Matrix>(p);
         o->setMaybe(maybe);
         o->setRows(rows);
         o->setCols(cols);
@@ -85,103 +85,103 @@ namespace armarx::aron::type::writer
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeQuaternion(const type::quaternion::ElementType type, const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeQuaternion(const type::quaternion::ElementType type, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Quaternion>();
+        auto o = std::make_shared<type::Quaternion>(p);
         o->setMaybe(maybe);
         o->setElementType(type);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeImage(const type::image::PixelType type, const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeImage(const type::image::PixelType type, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Image>();
+        auto o = std::make_shared<type::Image>(p);
         o->setMaybe(maybe);
         o->setPixelType(type);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writePointCloud(const type::pointcloud::VoxelType type, const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writePointCloud(const type::pointcloud::VoxelType type, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::PointCloud>();
+        auto o = std::make_shared<type::PointCloud>(p);
         o->setMaybe(maybe);
         o->setVoxelType(type);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writePosition(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writePosition(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Position>();
+        auto o = std::make_shared<type::Position>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeOrientation(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeOrientation(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Orientation>();
+        auto o = std::make_shared<type::Orientation>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writePose(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writePose(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Pose>();
+        auto o = std::make_shared<type::Pose>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::IntEnum>(name, acceptedValues);
+        auto o = std::make_shared<type::IntEnum>(name, acceptedValues, p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeInt(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeInt(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Int>();
+        auto o = std::make_shared<type::Int>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeLong(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeLong(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Long>();
+        auto o = std::make_shared<type::Long>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeFloat(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeFloat(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Float>();
+        auto o = std::make_shared<type::Float>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeDouble(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeDouble(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Double>();
+        auto o = std::make_shared<type::Double>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeString(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeString(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::String>();
+        auto o = std::make_shared<type::String>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeBool(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeBool(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Bool>();
+        auto o = std::make_shared<type::Bool>(p);
         o->setMaybe(maybe);
         return o;
     }
 
-    aron::type::VariantPtr VariantWriter::writeTime(const type::Maybe maybe)
+    aron::type::VariantPtr VariantWriter::writeTime(const type::Maybe maybe, const Path& p)
     {
-        auto o = std::make_shared<type::Time>();
+        auto o = std::make_shared<type::Time>(p);
         o->setMaybe(maybe);
         return o;
     }
diff --git a/source/RobotAPI/libraries/aron/core/type/rw/writer/variant/VariantWriter.h b/source/RobotAPI/libraries/aron/core/type/rw/writer/variant/VariantWriter.h
index 3a17a435edb1e4b0e4bb1b6b5b8e9ef3763d60fa..daf3b994432e40f3ca65c0eeaaff82fb8ce82503 100644
--- a/source/RobotAPI/libraries/aron/core/type/rw/writer/variant/VariantWriter.h
+++ b/source/RobotAPI/libraries/aron/core/type/rw/writer/variant/VariantWriter.h
@@ -35,29 +35,29 @@ namespace armarx::aron::type::writer
     public:
         VariantWriter() = default;
 
-        virtual ReturnType writeObject(const std::string& name, const type::Maybe maybe, const std::map<std::string, ReturnType>& memberTypes, const std::optional<ReturnType>& extends = std::nullopt) override;
-        virtual ReturnType writeList(const type::Maybe maybe, const ReturnType& acceptedType) override;
-        virtual ReturnType writeDict(const type::Maybe maybe, const ReturnType& acceptedType) override;
-        virtual ReturnType writePair(const type::Maybe maybe, const ReturnType& acceptedType1, const ReturnType& acceptedType2) override;
-        virtual ReturnType writeTuple(const type::Maybe maybe, const std::vector<ReturnType>& acceptedTypes) override;
-
-        virtual ReturnType writeNDArray(const int ndim, const type::ndarray::ElementType, const type::Maybe maybe) override;
-        virtual ReturnType writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe) override;
-        virtual ReturnType writeQuaternion(const type::quaternion::ElementType, const type::Maybe maybe) override;
-        virtual ReturnType writeImage(const type::image::PixelType, const type::Maybe maybe) override;
-        virtual ReturnType writePointCloud(const type::pointcloud::VoxelType, const type::Maybe maybe) override;
-        virtual ReturnType writePosition(const type::Maybe maybe) override;
-        virtual ReturnType writeOrientation(const type::Maybe maybe) override;
-        virtual ReturnType writePose(const type::Maybe maybe) override;
-
-        virtual ReturnType writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe) override;
-
-        virtual ReturnType writeInt(const type::Maybe maybe) override;
-        virtual ReturnType writeLong(const type::Maybe maybe) override;
-        virtual ReturnType writeFloat(const type::Maybe maybe) override;
-        virtual ReturnType writeDouble(const type::Maybe maybe) override;
-        virtual ReturnType writeString(const type::Maybe maybe) override;
-        virtual ReturnType writeBool(const type::Maybe maybe) override;
-        virtual ReturnType writeTime(const type::Maybe maybe) override;
+        ReturnType writeObject(const std::string& name, const std::map<std::string, ReturnType>& memberTypes, const std::optional<ReturnType>& extends, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeList(const ReturnType& acceptedType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeDict(const ReturnType& acceptedType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writePair(const ReturnType& acceptedType1, const ReturnType& acceptedType2, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeTuple(const std::vector<ReturnType>& acceptedTypes, const type::Maybe maybe, const Path& p = Path()) override;
+
+        ReturnType writeNDArray(const int ndim, const type::ndarray::ElementType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeMatrix(const int rows, const int cols, const type::matrix::ElementType type, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeQuaternion(const type::quaternion::ElementType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeImage(const type::image::PixelType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writePointCloud(const type::pointcloud::VoxelType, const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writePosition(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeOrientation(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writePose(const type::Maybe maybe, const Path& p = Path()) override;
+
+        ReturnType writeIntEnum(const std::string& name, const std::map<std::string, int>& acceptedValues, const type::Maybe maybe, const Path& p = Path()) override;
+
+        ReturnType writeInt(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeLong(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeFloat(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeDouble(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeString(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeBool(const type::Maybe maybe, const Path& p = Path()) override;
+        ReturnType writeTime(const type::Maybe maybe, const Path& p = Path()) override;
     };
 }