From 046fb632e608d40fedd237ca02d493e803d2f3a7 Mon Sep 17 00:00:00 2001
From: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu>
Date: Mon, 11 Jul 2022 17:42:56 +0200
Subject: [PATCH] aron read and write of dto types moved to rw part in aron
 common. Moved base class of aron generated classes to aron core to have the
 concept for aron conversions and rw templates.

---
 source/RobotAPI/libraries/armem/util/util.h   |  11 +-
 .../armem_reasoning/aron_conversions.h        |   1 -
 .../armem_robot_state/aron_conversions.h      |   7 +-
 .../aron/codegeneration/CMakeLists.txt        |   1 -
 .../codegenerator/codewriter/cpp/Writer.cpp   |  29 ++--
 .../codewriter/cpp/generator/Factory.cpp      |   2 +-
 .../codewriter/cpp/generator/Generator.h      |   2 +-
 .../cpp/generator/container/Object.cpp        | 164 +++++++-----------
 .../cpp/generator/container/Object.h          |  17 +-
 .../codegeneration/typereader/xml/Factory.cpp |  39 +++--
 .../codegeneration/typereader/xml/Factory.h   |   2 +-
 .../aron/common/aron_conversions/framed.cpp   |  52 +++++-
 .../common/aron_conversions/packagepath.cpp   |   1 +
 .../common/aron_conversions/packagepath.h     |   7 +-
 .../aron/common/aron_conversions/time.cpp     |  35 ++--
 .../libraries/aron/common/rw/framed.h         |  45 ++++-
 .../RobotAPI/libraries/aron/common/rw/time.h  |  18 +-
 .../libraries/aron/core/CMakeLists.txt        |   5 +
 .../RobotAPI/libraries/aron/core/Exception.h  |  14 ++
 .../libraries/aron/core/aron_conversions.h    |  18 +-
 .../codegeneration}/cpp/AronGeneratedClass.h  |  14 +-
 source/RobotAPI/libraries/aron/core/rw.cpp    |   6 +
 source/RobotAPI/libraries/aron/core/rw.h      |  48 +++++
 23 files changed, 335 insertions(+), 203 deletions(-)
 rename source/RobotAPI/libraries/aron/{codegeneration/codegenerator/codewriter => core/codegeneration}/cpp/AronGeneratedClass.h (92%)
 create mode 100644 source/RobotAPI/libraries/aron/core/rw.cpp
 create mode 100644 source/RobotAPI/libraries/aron/core/rw.h

diff --git a/source/RobotAPI/libraries/armem/util/util.h b/source/RobotAPI/libraries/armem/util/util.h
index d6f9c58a2..2f45b843a 100644
--- a/source/RobotAPI/libraries/armem/util/util.h
+++ b/source/RobotAPI/libraries/armem/util/util.h
@@ -28,7 +28,7 @@
 
 #include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
 #include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
-#include <RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/AronGeneratedClass.h>
+#include <RobotAPI/libraries/aron/core/codegeneration/cpp/AronGeneratedClass.h>
 
 
 namespace armarx::armem
@@ -44,8 +44,7 @@ namespace armarx::armem
     template <typename AronClass>
     std::optional<AronClass> tryCast(const wm::EntityInstance& item)
     {
-        static_assert(std::is_base_of<armarx::aron::codegenerator::cpp::AronGeneratedClass,
-                      AronClass>::value);
+        static_assert(std::is_base_of<armarx::aron::cpp::AronGeneratedClass, AronClass>::value);
 
 
         if (!item.data())
@@ -82,8 +81,7 @@ namespace armarx::armem
     std::vector<AronClass>
     allOfType(const std::map<std::string, wm::Entity>& entities)
     {
-        static_assert(std::is_base_of<armarx::aron::codegenerator::cpp::AronGeneratedClass,
-                      AronClass>::value);
+        static_assert(std::is_base_of<armarx::aron::cpp::AronGeneratedClass, AronClass>::value);
 
         std::vector<AronClass> outV;
 
@@ -129,8 +127,7 @@ namespace armarx::armem
     auto transformAllOfType(const std::map<std::string, wm::Entity>& entities,
                             auto pred) -> std::vector<decltype(pred(AronClass()))>
     {
-        static_assert(std::is_base_of<armarx::aron::codegenerator::cpp::AronGeneratedClass,
-                      AronClass>::value);
+        static_assert(std::is_base_of<armarx::aron::cpp::AronGeneratedClass, AronClass>::value);
 
         std::vector<decltype(pred(AronClass()))> outV;
 
diff --git a/source/RobotAPI/libraries/armem_reasoning/aron_conversions.h b/source/RobotAPI/libraries/armem_reasoning/aron_conversions.h
index 2e4d7c8bb..5f06a01cd 100644
--- a/source/RobotAPI/libraries/armem_reasoning/aron_conversions.h
+++ b/source/RobotAPI/libraries/armem_reasoning/aron_conversions.h
@@ -23,7 +23,6 @@
 #pragma once
 
 #include <RobotAPI/libraries/aron/core/data/variant/forward_declarations.h>
-#include <RobotAPI/libraries/armem_reasoning/aron/Anticipation.aron.generated.h>
 
 namespace armarx::armem::server::reasoning
 {
diff --git a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.h b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.h
index 17fe89152..75c339c7f 100644
--- a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.h
+++ b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.h
@@ -22,7 +22,6 @@
 #pragma once
 
 #include <RobotAPI/libraries/armem_robot/types.h>
-#include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h>
 
 namespace armarx::armem
 {
@@ -35,6 +34,12 @@ namespace armarx::armem
 
     } // namespace robot_state
 
+    namespace prop::arondto
+    {
+        struct Platform;
+        struct ForceTorque;
+    }
+
     namespace arondto
     {
         struct Transform;
diff --git a/source/RobotAPI/libraries/aron/codegeneration/CMakeLists.txt b/source/RobotAPI/libraries/aron/codegeneration/CMakeLists.txt
index 3aed01744..c3a800811 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/CMakeLists.txt
+++ b/source/RobotAPI/libraries/aron/codegeneration/CMakeLists.txt
@@ -66,7 +66,6 @@ set(LIB_HEADERS
     codegenerator/codewriter/CodeWriter.h
     codegenerator/codewriter/Factory.h
 
-    codegenerator/codewriter/cpp/AronGeneratedClass.h
     codegenerator/codewriter/cpp/Writer.h
     codegenerator/codewriter/cpp/generator/Generator.h
     codegenerator/codewriter/cpp/generator/detail/SpecializedGenerator.h
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp
index 2ebbab1cc..e53f578f0 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp
@@ -151,7 +151,7 @@ namespace armarx::aron::codegenerator::cpp
                 std::vector<std::string> tmpl_requires;
                 for (auto& t : type->getTemplates())
                 {
-                    tmpl_requires.push_back("armarx::aron::codegenerator::cpp::isAronGeneratedClass<" + t + ">");
+                    tmpl_requires.push_back("armarx::aron::cpp::isAronGeneratedClass<" + t + ">");
                     tmpl.push_back("class " + t);
                 }
                 std::string templateDef = "template <" + simox::alg::join(tmpl, ", ") + ">";
@@ -167,7 +167,7 @@ namespace armarx::aron::codegenerator::cpp
             }
             else
             {
-                c->addInherit("public armarx::aron::codegenerator::cpp::AronGeneratedClass");
+                c->addInherit("public armarx::aron::cpp::AronGeneratedClass");
             }
 
             // Writermethods
@@ -250,7 +250,7 @@ namespace armarx::aron::codegenerator::cpp
             CppClassPtr c = setupBasicCppClass(publicGenerateIntEnumType, generator);
             setupMemberFields(c, publicGenerateIntEnumType.doc_values, generator);
 
-            c->addInherit("public armarx::aron::codegenerator::cpp::AronGeneratedClass");
+            c->addInherit("public armarx::aron::cpp::AronGeneratedClass");
 
             // ctor
             c->addCtor(generator.toCopyCtor(c->getName()));
@@ -311,12 +311,6 @@ namespace armarx::aron::codegenerator::cpp
         c->addClassDoc(classDoc);
         c->setPragmaOnceIncludeGuard(true);
 
-        // add basic includes
-        c->addInclude("<memory>");
-        c->addInclude("<string>");
-        c->addInclude("<vector>");
-        c->addInclude("<map>");
-
         // add predefined includes from generator app (e.g. coming from reader)
         for (const std::string& s : additionalIncludes)
         {
@@ -326,17 +320,20 @@ namespace armarx::aron::codegenerator::cpp
             }
         }
 
-        // add aron includes
-        c->addInclude("<RobotAPI/interface/aron.h>");
-        c->addInclude("<RobotAPI/libraries/aron/core/aron_conversions.h>");
-        c->addInclude("<RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/AronGeneratedClass.h>");
-
         // add generator includes (e.g. coming from dto types)
-        for (const auto& i : gen.getRequiredIncludes())
+        for (const auto& s : gen.getRequiredIncludes())
         {
-            c->addInclude(i);
+            if (!s.empty())
+            {
+                c->addInclude(s);
+            }
         }
 
+        // add aron includes
+        c->addInclude("<RobotAPI/libraries/aron/core/aron_conversions.h>");
+        c->addInclude("<RobotAPI/libraries/aron/core/rw.h>");
+        c->addInclude("<RobotAPI/libraries/aron/core/codegeneration/cpp/AronGeneratedClass.h>");
+
         // ctor
         c->addCtor(gen.toCtor(c->getName()));
 
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Factory.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Factory.cpp
index d159608a2..c83144cb7 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Factory.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Factory.cpp
@@ -58,7 +58,7 @@ namespace armarx::aron::codegenerator::cpp
             case type::Descriptor::ANY_OBJECT: return std::make_unique<generator::AnyObject>(dynamic_cast<const type::AnyObject&>(n));
             case type::Descriptor::UNKNOWN: break;
         }
-        throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Cannot create a generator", std::to_string((int) desc), path);
+        throw error::AronEOFException(__PRETTY_FUNCTION__);
     }
 
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.h
index 57b140cc6..7b9c15a7d 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.h
@@ -70,7 +70,7 @@ namespace armarx::aron::codegenerator::cpp
     public:
         // constructors
         Generator() = delete;
-        Generator(const std::string& instantiatedCppTypename /* used for templates */, const std::string& classCppTypename, const std::string& aronDataTypename, const std::string& aronTypeTypename);
+        Generator(const std::string& instantiatedCppTypename /* used for templates, e.g. vector<string> */, const std::string& classCppTypename /* the raw typename, e.g. vector<T> */, const std::string& aronDataTypename, const std::string& aronTypeTypename);
         virtual ~Generator() = default;
 
         // public member methods
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.cpp
index 63405700d..826626601 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.cpp
@@ -29,64 +29,78 @@
 
 namespace armarx::aron::codegenerator::cpp::generator
 {
+    const std::map<std::string, DTOObjectReplacement> DTO_REPLACEMENTS =
+    {
+        { "armarx::arondto::DateTime", {"armarx::arondto::DateTime", "armarx::arondto::DateTime", "armarx::core::time::DateTime", "armarx::core::time::DateTime",
+            {"<ArmarXCore/core/time/DateTime.h>", "<RobotAPI/libraries/aron/common/rw/time.h>", "<RobotAPI/libraries/aron/common/aron/time.aron.generated.h>"},
+            {}}},
+        { "armarx::arondto::Duration", {"armarx::arondto::Duration", "armarx::arondto::Duration", "armarx::core::time::Duration", "armarx::core::time::Duration",
+            {"<ArmarXCore/core/time/Duration.h>", "<RobotAPI/libraries/aron/common/rw/time.h>", "<RobotAPI/libraries/aron/common/aron/time.aron.generated.h>"},
+            {"armarx::arondto::Frequency", "armarx::arondto::DateTime"}}},
+        { "armarx::arondto::FramedPosition", {"armarx::arondto::FramedPosition", "armarx::arondto::FramedPosition", "armarx::FramedPosition", "armarx::FramedPosition",
+            {"<RobotAPI/libraries/core/FramedPose.h>", "<RobotAPI/libraries/aron/common/rw/framed.h>", "<RobotAPI/libraries/aron/common/aron/framed.aron.generated.h>"},
+            {}}},
+        { "armarx::arondto::FramedOrientation", {"armarx::arondto::FramedOrientation", "armarx::arondto::FramedOrientation", "armarx::FramedOrientation", "armarx::FramedOrientation",
+            {"<RobotAPI/libraries/core/FramedPose.h>", "<RobotAPI/libraries/aron/common/rw/framed.h>", "<RobotAPI/libraries/aron/common/aron/framed.aron.generated.h>"},
+            {}}},
+        { "armarx::arondto::FramedPose", {"armarx::arondto::FramedPose", "armarx::arondto::FramedPose", "armarx::FramedPose", "armarx::FramedPose",
+            {"<RobotAPI/libraries/core/FramedPose.h>", "<RobotAPI/libraries/aron/common/rw/framed.h>", "<RobotAPI/libraries/aron/common/aron/framed.aron.generated.h>"},
+            {}}}
+    };
+
+    bool checkForAllowedReplacement(const type::Object& t)
+    {
+        std::string name = t.getObjectNameWithTemplates();
+        if (DTO_REPLACEMENTS.count(name) > 0)
+        {
+            auto x = DTO_REPLACEMENTS.at(name);
+            bool b = std::find(x.disallowedBases.begin(), x.disallowedBases.end(), t.getPath().getRootIdentifier()) == x.disallowedBases.end();
+            return b;
+        }
+        return true;
+    }
+
+    std::string checkForInstantiationTypenameReplacement(const type::Object& t)
+    {
+        std::string name = t.getObjectNameWithTemplates();
+        if (checkForAllowedReplacement(t) && DTO_REPLACEMENTS.count(name) > 0)
+        {
+            auto x = DTO_REPLACEMENTS.at(name);
+            return x.replacedInstantiatedTypename;
+        }
+        return t.getObjectNameWithTemplateInstantiations();
+    }
 
-    namespace
+    std::string checkForClassNameReplacement(const type::Object& t)
     {
-        std::pair<std::string, bool> checkForDtoTypeReplacements(const std::string& c)
+        std::string name = t.getObjectNameWithTemplates();
+        if (checkForAllowedReplacement(t) && DTO_REPLACEMENTS.count(name) > 0)
         {
-            static const std::map<std::string, std::string> DTO_REPLACEMENTS =
-            {
-                {"armarx::arondto::Duration", "armarx::core::time::Duration"},
-                {"armarx::arondto::DateTime", "armarx::core::time::DateTime"},
-                {"armarx::arondto::FramedPosition", "armarx::FramedPosition"},
-                {"armarx::arondto::FramedOrientation", "armarx::FramedOrientation"},
-                {"armarx::arondto::FramedPose", "armarx::FramedPose"}
-            };
-
-            if (DTO_REPLACEMENTS.count(c) > 0)
-            {
-                auto s = DTO_REPLACEMENTS.at(c);
-                return {s, true};
-            }
-
-            // dont change the input
-            return {c, false};
+            auto x = DTO_REPLACEMENTS.at(name);
+            return x.replacedTypename;
         }
+        return name;
+    }
 
-        std::vector<std::string> checkForAdditionalIncludes(const std::string& c)
+    std::vector<std::string> checkForAdditionalIncludes(const type::Object& t)
+    {
+        std::string name = t.getObjectNameWithTemplates();
+        if (checkForAllowedReplacement(t) && DTO_REPLACEMENTS.count(name) > 0)
         {
-            static const std::map<std::string, std::vector<std::string>> DTO_REPLACEMENTS =
-            {
-                {"armarx::arondto::Duration", {"<ArmarXCore/core/time/Duration.h>", "<RobotAPI/libraries/aron/common/aron_conversions/time.h>", "<RobotAPI/libraries/aron/common/aron/time.aron.generated.h>"}},
-                {"armarx::arondto::DateTime", {"<ArmarXCore/core/time/DateTime.h>", "<RobotAPI/libraries/aron/common/aron_conversions/time.h>", "<RobotAPI/libraries/aron/common/aron/time.aron.generated.h>"}},
-                {"armarx::arondto::FramedPosition", {"<RobotAPI/libraries/core/FramedPose.h>", "<RobotAPI/libraries/aron/common/aron_conversions/framed.h>", "<RobotAPI/libraries/aron/common/aron/framed.aron.generated.h>"}},
-                {"armarx::arondto::FramedOrientation", {"<RobotAPI/libraries/core/FramedPose.h>", "<RobotAPI/libraries/aron/common/aron_conversions/framed.h>", "<RobotAPI/libraries/aron/common/aron/framed.aron.generated.h>"}},
-                {"armarx::arondto::FramedPose", {"<RobotAPI/libraries/core/FramedPose.h>", "<RobotAPI/libraries/aron/common/aron_conversions/framed.h>", "<RobotAPI/libraries/aron/common/aron/framed.aron.generated.h>"}}
-            };
-
-            if (DTO_REPLACEMENTS.count(c) > 0)
-            {
-                return DTO_REPLACEMENTS.at(c);
-            }
-
-            // dont change the input
-            return {};
+            auto x = DTO_REPLACEMENTS.at(name);
+            return x.additionalIncludes;
         }
+        return {};
     }
 
     // constructors
     Object::Object(const type::Object& e) :
         detail::ContainerGenerator<type::Object, Object>(
-            e.getObjectNameWithTemplateInstantiations(),
-            e.getObjectNameWithTemplates(),
+            checkForInstantiationTypenameReplacement(e),
+            checkForClassNameReplacement(e),
             simox::meta::get_type_name<data::dto::Dict>(),
-            simox::meta::get_type_name<type::dto::AronObject>(), e),
-        isDtoReplacedObject(checkForDtoTypeReplacements(e.getObjectNameWithTemplateInstantiations()).second)
+            simox::meta::get_type_name<type::dto::AronObject>(), e)
     {
-        if (isDtoReplacedObject && getClassCppTypename() != getInstantiatedCppTypename())
-        {
-            throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Templates in dto replaced objects are not supported yet!", getInstantiatedCppTypename(), type.getPath());
-        }
     }
 
 
@@ -103,40 +117,11 @@ namespace armarx::aron::codegenerator::cpp::generator
         }
 
         // also check for additional includes from dto replacements
-        ret = simox::alg::appended(ret, checkForAdditionalIncludes(type.getObjectNameWithTemplates()));
+        ret = simox::alg::appended(ret, checkForAdditionalIncludes(type));
 
         return ret;
     }
 
-    std::vector<CppFieldPtr> Object::getPublicVariableDeclarations(const std::string& name) const
-    {
-        auto r = checkForDtoTypeReplacements(this->getFullInstantiatedCppTypename());
-        auto field = std::make_shared<CppField>(r.first, name);
-        return {field};
-    }
-
-    CppBlockPtr Object::getResetSoftBlock(const std::string& cppAccessor) const
-    {
-        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
-        if (isDtoReplacedObject)
-        {
-            block_if_data->addLine(cppAccessor + " = {};");
-        }
-        else
-        {
-            block_if_data->addLine(cppAccessor + nextEl() + "resetSoft();");
-        }
-        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
-    }
-
-    CppBlockPtr Object::getResetHardBlock(const std::string& cppAccessor) const
-    {
-        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
-        auto r = checkForDtoTypeReplacements(this->getFullInstantiatedCppTypename());
-        block_if_data->addLine(cppAccessor + " = " + r.first + "();");
-        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
-    }
-
     CppBlockPtr Object::getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const
     {
         CppBlockPtr b = std::make_shared<CppBlock>();
@@ -164,19 +149,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
 
         // if is dto replacement
-        if (isDtoReplacedObject)
-        {
-            auto variantAccessorTmp = variantAccessor + "_tmp";
-            block_if_data->addLine("auto " + variantAccessorTmp + " = " + getClassCppTypename() + "();");
-            block_if_data->addLine("armarx::toAron("+variantAccessorTmp+", "+resolved_accessor+");");
-            block_if_data->addLine(variantAccessor + " = " + variantAccessorTmp + ".write(" + ARON_WRITER_ACCESSOR + ", "+
-                                   "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
-        }
-        else
-        {
-            block_if_data->addLine(variantAccessor + " = " + cppAccessor + nextEl() + "write(" + ARON_WRITER_ACCESSOR + ", "+
-                                       "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
-        }
+        block_if_data->addLine("armarx::aron::write(" + ARON_WRITER_ACCESSOR + ", " + resolved_accessor + ", " + variantAccessor + ", " + "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + cppAccessor);
 
         return resolveMaybeWriteBlock(block_if_data, cppAccessor);
     }
@@ -184,24 +157,15 @@ namespace armarx::aron::codegenerator::cpp::generator
     CppBlockPtr Object::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 resolved_accessor = resolveMaybeAccessor(cppAccessor);
+
         if (const auto reset = resolveMaybeGenerator(cppAccessor); !reset.empty())
         {
             block_if_data->addLine(reset);
         }
 
-        if (isDtoReplacedObject)
-        {
-            std::string escaped_accessor = EscapeAccessor(cppAccessor);
-            std::string resolved_accessor = resolveMaybeAccessor(cppAccessor);
-            std::string variantAccessorTmp = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor + "_tmp";
-            block_if_data->addLine("auto " + variantAccessorTmp + " = " + getClassCppTypename() + "();");
-            block_if_data->addLine(variantAccessorTmp + ".read(" + ARON_READER_ACCESSOR + ", " + variantAccessor + ");");
-            block_if_data->addLine("armarx::fromAron(" + variantAccessorTmp + ", " + resolved_accessor + "); // of " + cppAccessor);
-        }
-        else
-        {
-            block_if_data->addLine(cppAccessor + nextEl() + "read(" + ARON_READER_ACCESSOR + ", " + variantAccessor + "); // of " + cppAccessor);
-        }
+        block_if_data->addLine("armarx::aron::read(" + ARON_READER_ACCESSOR + ", " + variantAccessor + ", " + resolved_accessor + "); // of " + cppAccessor);
 
         return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor);
     }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.h
index 28b94bfe1..b1a2995c4 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/container/Object.h
@@ -29,6 +29,17 @@
 
 namespace armarx::aron::codegenerator::cpp::generator
 {
+    struct DTOObjectReplacement
+    {
+        std::string originalTypeName;
+        std::string originalInstantiatedTypename;
+        std::string replacedTypename;
+        std::string replacedInstantiatedTypename;
+
+        std::vector<std::string> additionalIncludes; // additional includes for the replaced type and aron conversions
+        std::vector<std::string> disallowedBases; // disallow replacement if the used in a specific class
+    };
+
     class Object :
         public detail::ContainerGenerator<type::Object, Object>
     {
@@ -39,14 +50,8 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         std::vector<std::string> getRequiredIncludes() const final;
-        std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const final;
-        CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
-        CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const final;
         CppBlockPtr getWriteBlock(const std::string& cppAccessor, const Path&, std::string& variantAccessor) const final;
         CppBlockPtr getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const final;
-
-    private:
-        bool isDtoReplacedObject = false;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/typereader/xml/Factory.cpp b/source/RobotAPI/libraries/aron/codegeneration/typereader/xml/Factory.cpp
index 9aa67cac2..9f4717957 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/typereader/xml/Factory.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/typereader/xml/Factory.cpp
@@ -35,8 +35,6 @@
 
 namespace armarx::aron::typereader::xml
 {
-    //std::map<std::string, typereader::GenerateObjectInfo> ReaderFactory::allGeneratedPublicObjects;
-    //std::map<std::string, typereader::GenerateIntEnumInfo> ReaderFactory::allGeneratedPublicIntEnums;
 
     type::VariantPtr ReaderFactory::create(const RapidXmlReaderNode& node, const Path& path)
     {
@@ -72,10 +70,7 @@ namespace armarx::aron::typereader::xml
             nodeToUse = reader->getRoot();
         }
 
-        std::string tagToUse = simox::alg::to_lower(nodeToUse.name());
-        std::string nodeNameToUse = nodeToUse.name();
-
-        auto it = String2Descriptor.find(tagToUse);
+        auto it = String2Descriptor.find(simox::alg::to_lower(nodeToUse.name()));
         auto descriptor = (it == String2Descriptor.end() ? type::Descriptor::UNKNOWN : it->second);
 
         switch(descriptor)
@@ -98,17 +93,19 @@ namespace armarx::aron::typereader::xml
             case type::Descriptor::STRING: return createString(nodeToUse, path);
             case type::Descriptor::BOOL: return createBool(nodeToUse, path);
             case type::Descriptor::ANY_OBJECT: return createAnyObject(nodeToUse, path);
-            default: return findExistingObject(nodeNameToUse);
+            case type::Descriptor::UNKNOWN: return findExistingObject(nodeToUse.name(), path);
         }
+
+        throw aron::error::AronEOFException(__PRETTY_FUNCTION__);
     }
 
-    type::VariantPtr ReaderFactory::findExistingObject(const std::string& name) const
+    type::VariantPtr ReaderFactory::findExistingObject(const std::string& name, const Path& path) const
     {
         const auto public_intenum_it = allGeneratedPublicIntEnums.find(name);
         if (public_intenum_it != allGeneratedPublicIntEnums.end())
         {
             // copy the navigator
-            auto v = type::Variant::FromAronDTO(*public_intenum_it->second.correspondingType->toAronDTO());
+            auto v = type::Variant::FromAronDTO(*public_intenum_it->second.correspondingType->toAronDTO(), path);
             return v;
         }
 
@@ -116,7 +113,7 @@ namespace armarx::aron::typereader::xml
         if (public_obj_it != allGeneratedPublicObjects.end())
         {
             // copy the navigator and set instantiation template args
-            auto v = type::Variant::FromAronDTO(*public_obj_it->second.correspondingType->toAronDTO());
+            auto v = type::Variant::FromAronDTO(*public_obj_it->second.correspondingType->toAronDTO(), path);
             return v;
         }
 
@@ -124,16 +121,16 @@ namespace armarx::aron::typereader::xml
         if(public_known_it != allPreviouslyKnownPublicTypes.end())
         {
             // create an empty navigator
-            auto v = std::make_shared<aron::type::Object>(*public_known_it);
+            auto v = std::make_shared<aron::type::Object>(*public_known_it, std::vector<std::string>(), std::vector<std::string>(), std::map<std::string, type::VariantPtr>(), path);
             return v;
         }
 
-        // only works during generation process (not for top-level)
+        // only works during generation process (not for top-level). Used for templates.
         const auto private_known_it = std::find(allPreviouslyKnownPrivateTypes.begin(), allPreviouslyKnownPrivateTypes.end(), name);
         if(private_known_it != allPreviouslyKnownPrivateTypes.end())
         {
             // create an empty navigator
-            auto v = std::make_shared<aron::type::Object>(*private_known_it);
+            auto v = std::make_shared<aron::type::Object>(*private_known_it, std::vector<std::string>(), std::vector<std::string>(), std::map<std::string, type::VariantPtr>(), path);
             return v;
         }
 
@@ -196,6 +193,10 @@ namespace armarx::aron::typereader::xml
         // reset private known types
         allPreviouslyKnownPrivateTypes = templates;
 
+        // set objPath
+        aron::Path objPath = path; // copy, just in case there are special things set
+        objPath.setRootIdentifier(name); // set the root identifier to the obj name
+
         std::map<std::string, type::VariantPtr> members;
         for (const RapidXmlReaderNode& objectChild : node.nodes())
         {
@@ -215,7 +216,7 @@ namespace armarx::aron::typereader::xml
             std::vector<RapidXmlReaderNode> children = objectChild.nodes();
 
             auto maybe = getMaybe(children[0]);
-            type::VariantPtr childNavigator = create(children[0], path.withElement(key));
+            type::VariantPtr childNavigator = create(children[0], objPath.withElement(key));
 
             if (childNavigator->getDescriptor() == aron::type::Descriptor::OBJECT)
             {
@@ -233,11 +234,11 @@ namespace armarx::aron::typereader::xml
         }
 
         // set the new object
-        auto aronObjectType = std::make_shared<type::Object>(name, templates, std::vector<std::string>(), members, path);
+        auto aronObjectType = std::make_shared<type::Object>(name, templates, std::vector<std::string>(), members, objPath);
 
         if (extends != "")
         {
-            auto parentObj = type::Object::DynamicCastAndCheck(findExistingObject(extends));
+            auto parentObj = type::Object::DynamicCastAndCheck(findExistingObject(extends, Path()));
             aronObjectType->setExtends(parentObj);
         }
 
@@ -489,7 +490,11 @@ namespace armarx::aron::typereader::xml
 
             acceptedValues.emplace(key, std::stoi(value));
         }
-        auto o = std::make_shared<type::IntEnum>(name, acceptedValues, path);
+
+        // create the int enum
+        aron::Path enumPath = path; // copy, just in case there are special things set
+        enumPath.setRootIdentifier(name); // set the root identifier to the obj name
+        auto o = std::make_shared<type::IntEnum>(name, acceptedValues, enumPath);
         newEnumInfo.correspondingType = o;
 
         allGeneratedPublicIntEnums.emplace(newEnumInfo.typeName, newEnumInfo);
diff --git a/source/RobotAPI/libraries/aron/codegeneration/typereader/xml/Factory.h b/source/RobotAPI/libraries/aron/codegeneration/typereader/xml/Factory.h
index 814349d16..4771cdb4b 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/typereader/xml/Factory.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/typereader/xml/Factory.h
@@ -52,7 +52,7 @@ namespace armarx::aron::typereader::xml
     private:
 
         /// check, whether a given name corresponds to an already created object name.
-        type::VariantPtr findExistingObject(const std::string& n) const;
+        type::VariantPtr findExistingObject(const std::string& n, const Path& path) const;
 
         /// check, if the type should be a maybe type
         type::Maybe getMaybe(const RapidXmlReaderNode&) const;
diff --git a/source/RobotAPI/libraries/aron/common/aron_conversions/framed.cpp b/source/RobotAPI/libraries/aron/common/aron_conversions/framed.cpp
index e7139063b..857c3a46b 100644
--- a/source/RobotAPI/libraries/aron/common/aron_conversions/framed.cpp
+++ b/source/RobotAPI/libraries/aron/common/aron_conversions/framed.cpp
@@ -6,31 +6,71 @@ namespace armarx
 {
     void fromAron(const arondto::FramedPosition& dto, armarx::FramedPosition& bo)
     {
-
+        bo.frame = dto.header.frame;
+        bo.agent = dto.header.agent;
+        bo.x = dto.position.x();
+        bo.y = dto.position.y();
+        bo.z = dto.position.z();
     }
 
     void toAron(arondto::FramedPosition& dto, const armarx::FramedPosition& bo)
     {
-
+        dto.header.frame = bo.frame;
+        dto.header.agent = bo.agent;
+        dto.position.x() = bo.x;
+        dto.position.y() = bo.y;
+        dto.position.z() = bo.z;
     }
 
     void fromAron(const arondto::FramedOrientation& dto, armarx::FramedOrientation& bo)
     {
-
+        bo.frame = dto.header.frame;
+        bo.agent = dto.header.agent;
+        bo.qw = dto.orientation.w();
+        bo.qx = dto.orientation.x();
+        bo.qy = dto.orientation.y();
+        bo.qz = dto.orientation.z();
     }
 
     void toAron(arondto::FramedOrientation& dto, const armarx::FramedOrientation& bo)
     {
-
+        dto.header.frame = bo.frame;
+        dto.header.agent = bo.agent;
+        dto.orientation.w() = bo.qw;
+        dto.orientation.x() = bo.qx;
+        dto.orientation.y() = bo.qy;
+        dto.orientation.z() = bo.qz;
     }
 
     void fromAron(const arondto::FramedPose& dto, armarx::FramedPose& bo)
     {
-
+        bo.frame = dto.header.frame;
+        bo.agent = dto.header.agent;
+        auto vec = Eigen::Vector3f(dto.pose.block<3,1>(0,3));
+        bo.position->x = vec.x();
+        bo.position->y = vec.y();
+        bo.position->z = vec.z();
+        auto quat = Eigen::Quaternionf(dto.pose.block<3,3>(0,0));
+        bo.orientation->qw = quat.w();
+        bo.orientation->qx = quat.x();
+        bo.orientation->qy = quat.y();
+        bo.orientation->qz = quat.z();
     }
 
     void toAron(arondto::FramedPose& dto, const armarx::FramedPose& bo)
     {
-
+        dto.header.frame = bo.frame;
+        dto.header.agent = bo.agent;
+        Eigen::Vector3f vec;
+        vec.x() = bo.position->x;
+        vec.y() = bo.position->y;
+        vec.z() = bo.position->z;
+        Eigen::Quaternionf quat;
+        quat.w() = bo.orientation->qw;
+        quat.x() = bo.orientation->qx;
+        quat.y() = bo.orientation->qy;
+        quat.z() = bo.orientation->qz;
+        dto.pose.block<3,1>(0,3) = vec;
+        dto.pose.block<3,3>(0,0) = quat.toRotationMatrix();
     }
 }
diff --git a/source/RobotAPI/libraries/aron/common/aron_conversions/packagepath.cpp b/source/RobotAPI/libraries/aron/common/aron_conversions/packagepath.cpp
index 7df2ad622..a1168648b 100644
--- a/source/RobotAPI/libraries/aron/common/aron_conversions/packagepath.cpp
+++ b/source/RobotAPI/libraries/aron/common/aron_conversions/packagepath.cpp
@@ -1,5 +1,6 @@
 #include "packagepath.h"
 
+#include <RobotAPI/libraries/aron/common/aron/PackagePath.aron.generated.h>
 
 /* PackagePath */
 
diff --git a/source/RobotAPI/libraries/aron/common/aron_conversions/packagepath.h b/source/RobotAPI/libraries/aron/common/aron_conversions/packagepath.h
index a5661de19..3dea6b7f3 100644
--- a/source/RobotAPI/libraries/aron/common/aron_conversions/packagepath.h
+++ b/source/RobotAPI/libraries/aron/common/aron_conversions/packagepath.h
@@ -1,10 +1,13 @@
 #pragma once
 
 #include <RobotAPI/libraries/aron/core/aron_conversions.h>
-
 #include <ArmarXCore/core/PackagePath.h>
-#include <RobotAPI/libraries/aron/common/aron/PackagePath.aron.generated.h>
 
+// arondto forward declarations
+namespace armarx::arondto
+{
+    class PackagePath;
+}
 
 namespace armarx
 {
diff --git a/source/RobotAPI/libraries/aron/common/aron_conversions/time.cpp b/source/RobotAPI/libraries/aron/common/aron_conversions/time.cpp
index 154079cb9..a1d0825a4 100644
--- a/source/RobotAPI/libraries/aron/common/aron_conversions/time.cpp
+++ b/source/RobotAPI/libraries/aron/common/aron_conversions/time.cpp
@@ -27,7 +27,7 @@ void IceUtil::toAron(IceUtil::Time& dto, const armarx::DateTime& bo)
     toIce(dto, bo);
 }
 
-void armarx::fromAron(const arondto::ClockType& dto, ClockType& bo)
+void armarx::fromAron(const arondto::ClockType& dto, armarx::ClockType& bo)
 {
     switch (dto.value)
     {
@@ -46,7 +46,7 @@ void armarx::fromAron(const arondto::ClockType& dto, ClockType& bo)
     }
 }
 
-void armarx::toAron(arondto::ClockType& dto, const ClockType& bo)
+void armarx::toAron(arondto::ClockType& dto, const armarx::ClockType& bo)
 {
     switch (bo)
     {
@@ -65,38 +65,43 @@ void armarx::toAron(arondto::ClockType& dto, const ClockType& bo)
     }
 }
 
-void armarx::fromAron(const arondto::Duration& dto, Duration& bo)
+void armarx::fromAron(const arondto::Duration& dto, armarx::Duration& bo)
 {
     bo = Duration::MicroSeconds(dto.microSeconds);
 }
 
-void armarx::toAron(arondto::Duration& dto, const Duration& bo)
+void armarx::toAron(arondto::Duration& dto, const armarx::Duration& bo)
 {
     dto.microSeconds = bo.toMicroSeconds();
 }
 
-void armarx::fromAron(const arondto::Frequency& dto, Frequency& bo)
+void armarx::fromAron(const arondto::Frequency& dto, armarx::Frequency& bo)
 {
-    bo = Frequency(dto.cycleDuration);
+    Duration cycleDuration;
+    fromAron(dto.cycleDuration, cycleDuration);
+
+    bo = Frequency(cycleDuration);
 }
 
-void armarx::toAron(arondto::Frequency& dto, const Frequency& bo)
+void armarx::toAron(arondto::Frequency& dto, const armarx::Frequency& bo)
 {
-    dto.cycleDuration = bo.toCycleDuration();
+    toAron(dto.cycleDuration, bo.toCycleDuration());
 }
 
-void armarx::fromAron(const arondto::DateTime& dto, DateTime& bo)
+void armarx::fromAron(const arondto::DateTime& dto, armarx::DateTime& bo)
 {
     ClockType clockType;
     fromAron(dto.clockType, clockType);
-    bo = DateTime(dto.timeSinceEpoch, clockType, dto.hostname);
+
+    Duration timeSinceEpoch;
+    fromAron(dto.timeSinceEpoch, timeSinceEpoch);
+
+    bo = DateTime(timeSinceEpoch, clockType, dto.hostname);
 }
 
-void armarx::toAron(arondto::DateTime& dto, const DateTime& bo)
+void armarx::toAron(arondto::DateTime& dto, const armarx::DateTime& bo)
 {
-    dto.timeSinceEpoch = bo.toDurationSinceEpoch();
-    arondto::ClockType clockType;
-    toAron(clockType, bo.clockType());
-    dto.clockType = clockType;
+    toAron(dto.clockType, bo.clockType());
+    toAron(dto.timeSinceEpoch, bo.toDurationSinceEpoch());
     dto.hostname = bo.hostname();
 }
diff --git a/source/RobotAPI/libraries/aron/common/rw/framed.h b/source/RobotAPI/libraries/aron/common/rw/framed.h
index bedc47f6f..21d3aae5a 100644
--- a/source/RobotAPI/libraries/aron/common/rw/framed.h
+++ b/source/RobotAPI/libraries/aron/common/rw/framed.h
@@ -1,7 +1,6 @@
 #pragma once
 
 #include "../aron_conversions/framed.h"
-
 #include <RobotAPI/libraries/aron/common/aron/framed.aron.generated.h>
 
 namespace armarx
@@ -10,23 +9,57 @@ namespace armarx
     namespace aron
     {
         template<class ReaderT>
-        armarx::FramedPosition readFramedPosition(ReaderT& aron_r, typename ReaderT::InputType& input)
+        void read(ReaderT& aron_r, typename ReaderT::InputType& input, armarx::FramedPosition& ret)
         {
             arondto::FramedPosition aron;
             aron.read(aron_r, input);
 
-            armarx::FramedPosition ret;
             armarx::fromAron(aron, ret);
-            return ret;
         }
 
         template<class WriterT>
-        typename WriterT::ReturnType writeFramedPosition(WriterT& aron_w, const armarx::FramedPosition& input, const armarx::aron::Path& aron_p = armarx::aron::Path())
+        void write(WriterT& aron_w, const armarx::FramedPosition& input, typename WriterT::ReturnType& ret, const armarx::aron::Path& aron_p = armarx::aron::Path())
         {
             arondto::FramedPosition aron;
             armarx::toAron(aron, input);
-            return aron.write(aron_w, aron_p);
+            ret = aron.write(aron_w, aron_p);
+        }
+
+        template<class ReaderT>
+        void read(ReaderT& aron_r, typename ReaderT::InputType& input, armarx::FramedOrientation& ret)
+        {
+            arondto::FramedOrientation aron;
+            aron.read(aron_r, input);
+
+            armarx::fromAron(aron, ret);
+        }
+
+        template<class WriterT>
+        void write(WriterT& aron_w, const armarx::FramedOrientation& input, typename WriterT::ReturnType& ret, const armarx::aron::Path& aron_p = armarx::aron::Path())
+        {
+            arondto::FramedOrientation aron;
+            armarx::toAron(aron, input);
+            ret = aron.write(aron_w, aron_p);
+        }
+
+        template<class ReaderT>
+        void read(ReaderT& aron_r, typename ReaderT::InputType& input, armarx::FramedPose& ret)
+        {
+            arondto::FramedPose aron;
+            aron.read(aron_r, input);
+
+            armarx::fromAron(aron, ret);
+        }
+
+        template<class WriterT>
+        void write(WriterT& aron_w, const armarx::FramedPose& input, typename WriterT::ReturnType& ret, const armarx::aron::Path& aron_p = armarx::aron::Path())
+        {
+            arondto::FramedPose aron;
+            armarx::toAron(aron, input);
+            ret = aron.write(aron_w, aron_p);
         }
     }
 
 }  // namespace armarx
+
+
diff --git a/source/RobotAPI/libraries/aron/common/rw/time.h b/source/RobotAPI/libraries/aron/common/rw/time.h
index 02ebe2b4a..0549d82f1 100644
--- a/source/RobotAPI/libraries/aron/common/rw/time.h
+++ b/source/RobotAPI/libraries/aron/common/rw/time.h
@@ -1,7 +1,6 @@
 #pragma once
 
 #include "../aron_conversions/time.h"
-
 #include <RobotAPI/libraries/aron/common/aron/time.aron.generated.h>
 
 namespace armarx
@@ -10,44 +9,41 @@ namespace armarx
     namespace aron
     {
         template<class ReaderT>
-        armarx::core::time::DateTime readDateTime(ReaderT& aron_r, typename ReaderT::InputType& input)
+        void read(ReaderT& aron_r, typename ReaderT::InputType& input, armarx::core::time::DateTime& ret)
         {
             arondto::DateTime aron;
             aron.read(aron_r, input);
 
-            armarx::core::time::DateTime ret;
             armarx::fromAron(aron, ret);
-            return ret;
         }
 
         template<class WriterT>
-        typename WriterT::ReturnType writeDateTime(WriterT& aron_w, const armarx::core::time::DateTime& input, const armarx::aron::Path& aron_p = armarx::aron::Path())
+        void write(WriterT& aron_w, const armarx::core::time::DateTime& input, typename WriterT::ReturnType& ret, const armarx::aron::Path& aron_p = armarx::aron::Path())
         {
             arondto::DateTime aron;
             armarx::toAron(aron, input);
-            return aron.write(aron_w, aron_p);
+            ret = aron.write(aron_w, aron_p);
         }
 
 
 
         template<class ReaderT>
-        armarx::core::time::Duration readDuration(ReaderT& aron_r, typename ReaderT::InputType& input)
+        void read(ReaderT& aron_r, typename ReaderT::InputType& input, armarx::core::time::Duration& ret)
         {
             arondto::Duration aron;
             aron.read(aron_r, input);
 
-            armarx::core::time::Duration ret;
             armarx::fromAron(aron, ret);
-            return ret;
         }
 
         template<class WriterT>
-        typename WriterT::ReturnType writeDuration(WriterT& aron_w, const armarx::core::time::Duration& input, const armarx::aron::Path& aron_p = armarx::aron::Path())
+        void write(WriterT& aron_w, const armarx::core::time::Duration& input, typename WriterT::ReturnType& ret, const armarx::aron::Path& aron_p = armarx::aron::Path())
         {
             arondto::Duration aron;
             armarx::toAron(aron, input);
-            return aron.write(aron_w, aron_p);
+            ret = aron.write(aron_w, aron_p);
         }
     }
 
 }  // namespace armarx
+
diff --git a/source/RobotAPI/libraries/aron/core/CMakeLists.txt b/source/RobotAPI/libraries/aron/core/CMakeLists.txt
index 90cb3c1e3..654c0b851 100644
--- a/source/RobotAPI/libraries/aron/core/CMakeLists.txt
+++ b/source/RobotAPI/libraries/aron/core/CMakeLists.txt
@@ -19,6 +19,8 @@ set(LIB_FILES
     Path.cpp
 
     aron_conversions.cpp
+    rw.cpp
+
 
     data/variant/Variant.cpp
     data/variant/detail/SpecializedVariant.cpp
@@ -105,6 +107,9 @@ set(LIB_HEADERS
     Path.h
 
     aron_conversions.h
+    rw.h
+
+    codegeneration/cpp/AronGeneratedClass.h
 
     data/variant/Variant.h
     data/variant/detail/SpecializedVariant.h
diff --git a/source/RobotAPI/libraries/aron/core/Exception.h b/source/RobotAPI/libraries/aron/core/Exception.h
index 05e782043..52de80989 100644
--- a/source/RobotAPI/libraries/aron/core/Exception.h
+++ b/source/RobotAPI/libraries/aron/core/Exception.h
@@ -54,6 +54,20 @@ namespace armarx::aron::error
         }
     };
 
+    /**
+     * @brief A base class for aron exceptions. All aron exceptions inherit from this class
+     */
+    class AronEOFException :
+        public AronException
+    {
+    public:
+        AronEOFException() = delete;
+        AronEOFException(const std::string& prettymethod) :
+            AronException(prettymethod, "REACHED THE END OF A NON VOID METHOD. PERHAPS YOU FORGOT TO ADD A VALUE TO SOME SWITCH-CASE STATEMEMT?.")
+        {
+        }
+    };
+
     /**
      * @brief The NotImplementedYetException class
      */
diff --git a/source/RobotAPI/libraries/aron/core/aron_conversions.h b/source/RobotAPI/libraries/aron/core/aron_conversions.h
index 1cef1c931..f2e0d4447 100644
--- a/source/RobotAPI/libraries/aron/core/aron_conversions.h
+++ b/source/RobotAPI/libraries/aron/core/aron_conversions.h
@@ -6,6 +6,7 @@
 #include <vector>
 
 #include "Path.h"
+#include "codegeneration/cpp/AronGeneratedClass.h"
 
 namespace armarx::aron
 {
@@ -52,6 +53,11 @@ namespace armarx::aron
      * @endcode
      */
 
+    // Helper concept to avoid ambiguities
+    template<typename DtoT, typename BoT>
+    concept DtoAndBoAreSame = std::is_same<DtoT, BoT>::value;
+
+
     // Same type
     template <class T>
     void toAron(T& dto, const T& bo)
@@ -66,7 +72,6 @@ namespace armarx::aron
 
 
     // Generic return version
-
     template <class DtoT, class BoT>
     DtoT toAron(const BoT& bo)
     {
@@ -89,7 +94,6 @@ namespace armarx::aron
 
 
     // std::unique_ptr
-
     template <class DtoT, class BoT>
     void toAron(DtoT& dto, const std::unique_ptr<BoT>& bo)
     {
@@ -98,6 +102,7 @@ namespace armarx::aron
             toAron(dto, *bo);
         }
     }
+
     template <class DtoT, class BoT>
     void fromAron(const DtoT& dto, std::unique_ptr<BoT>& bo)
     {
@@ -107,7 +112,6 @@ namespace armarx::aron
 
 
     // std::optional
-
     template <class DtoT, class BoT>
     void toAron(std::optional<DtoT>& dto, const std::optional<BoT>& bo)
     {
@@ -121,6 +125,7 @@ namespace armarx::aron
             dto = std::nullopt;
         }
     }
+
     template <class DtoT, class BoT>
     void fromAron(const std::optional<DtoT>& dto, std::optional<BoT>& bo)
     {
@@ -149,6 +154,7 @@ namespace armarx::aron
             dto = {};
         }
     }
+
     template <class DtoT, class BoT>
     void fromAron(const DtoT& dto, bool dtoValid, BoT& bo, bool& boValid)
     {
@@ -176,6 +182,7 @@ namespace armarx::aron
             dto = {};
         }
     }
+
     template <class DtoT, class BoT>
     void fromAron(const DtoT& dto, bool dtoValid, std::optional<BoT>& bo)
     {
@@ -190,13 +197,8 @@ namespace armarx::aron
         }
     }
 
-    // Helper concept to avoid ambiguities
-    template<typename DtoT, typename BoT>
-    concept DtoAndBoAreSame = std::is_same<DtoT, BoT>::value;
-
 
     // std::vector
-
     template <class DtoT, class BoT>
     requires (!DtoAndBoAreSame<DtoT, BoT>)
     void toAron(std::vector<DtoT>& dtos, const std::vector<BoT>& bos)
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/AronGeneratedClass.h b/source/RobotAPI/libraries/aron/core/codegeneration/cpp/AronGeneratedClass.h
similarity index 92%
rename from source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/AronGeneratedClass.h
rename to source/RobotAPI/libraries/aron/core/codegeneration/cpp/AronGeneratedClass.h
index eb4d5da66..c97c0acbb 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/AronGeneratedClass.h
+++ b/source/RobotAPI/libraries/aron/core/codegeneration/cpp/AronGeneratedClass.h
@@ -26,19 +26,22 @@
 // STD/STL
 #include <memory>
 #include <string>
+#include <vector>
+#include <map>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Exception.h>
 
-#include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
 #include <RobotAPI/libraries/aron/core/data/rw/Reader.h>
 #include <RobotAPI/libraries/aron/core/data/rw/Writer.h>
 #include <RobotAPI/libraries/aron/core/type/rw/Writer.h>
 
-#include <RobotAPI/libraries/aron/core/data/variant/All.h>
+// ARON
+#include <RobotAPI/interface/aron.h>
 
 
-namespace armarx::aron::codegenerator::cpp
+namespace armarx::aron::cpp
 {
     class AronGeneratedClass
     {
@@ -56,3 +59,8 @@ namespace armarx::aron::codegenerator::cpp
     template <class T>
     concept isAronGeneratedClass = std::is_base_of<AronGeneratedClass, T>::value;
 }
+
+namespace armarx::aron::codegenerator::cpp
+{
+    using AronGeneratedClass = aron::cpp::AronGeneratedClass;
+}
diff --git a/source/RobotAPI/libraries/aron/core/rw.cpp b/source/RobotAPI/libraries/aron/core/rw.cpp
new file mode 100644
index 000000000..add7a1803
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/rw.cpp
@@ -0,0 +1,6 @@
+#include "aron_conversions.h"
+
+namespace armarx::aron
+{
+
+}
diff --git a/source/RobotAPI/libraries/aron/core/rw.h b/source/RobotAPI/libraries/aron/core/rw.h
new file mode 100644
index 000000000..a03fa1892
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/rw.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <map>
+#include <memory>
+#include <optional>
+#include <vector>
+
+#include "aron_conversions.h"
+#include "data/rw/Reader.h"
+#include "data/rw/Writer.h"
+
+#include "codegeneration/cpp/AronGeneratedClass.h"
+
+namespace armarx::aron
+{
+    template<class ReaderT, class T>
+    requires (data::isReader<ReaderT> && cpp::isAronGeneratedClass<T>)
+    void read(ReaderT& aron_r, typename ReaderT::InputType& input, T& ret)
+    {
+        ret.read(aron_r, input);
+    }
+
+    template<class WriterT, class T>
+    requires (data::isWriter<WriterT> && cpp::isAronGeneratedClass<T>)
+    void write(WriterT& aron_w, const T& input, typename WriterT::ReturnType& ret, const armarx::aron::Path& aron_p = armarx::aron::Path())
+    {
+        ret = input.write(aron_w, aron_p);
+    }
+
+    template<class ReaderT, class DtoT, class BoT>
+    requires (data::isReader<ReaderT> && cpp::isAronGeneratedClass<DtoT> && !DtoAndBoAreSame<DtoT, BoT>)
+    void read(ReaderT& aron_r, typename ReaderT::InputType& input, BoT& ret)
+    {
+        DtoT aron;
+        aron.read(aron_r, input);
+
+        fromAron(aron, ret);
+    }
+
+    template<class WriterT, class DtoT, class BoT>
+    requires (data::isWriter<WriterT> && cpp::isAronGeneratedClass<DtoT> && !DtoAndBoAreSame<DtoT, BoT>)
+    void write(WriterT& aron_w, const BoT& input, typename WriterT::ReturnType& ret, const armarx::aron::Path& aron_p = armarx::aron::Path())
+    {
+        DtoT aron;
+        toAron(aron, input);
+        ret = aron.write(aron_w, aron_p);
+    }
+}
-- 
GitLab