diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
index 0b877909c4a35e5b867d21de7840b1625b5e74dc..02b2bcae49014e801c59d001fe9150dcae7a1b95 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
@@ -32,6 +32,12 @@ namespace armarx::armem::base
         /// An optional confidence, may be used for things like decay.
         float confidence = 1.0;
 
+        /// An optional value indicating the last access
+        Time lastAccessed = Time::Invalid();
+
+        /// A counter how often the instance has been accessed
+        unsigned long accessed = 0;
+
 
         bool operator==(const EntityInstanceMetadata& other) const;
         inline bool operator!=(const EntityInstanceMetadata& other) const
diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp
index f2baa4865ff5d2a832e61acc857863d2c6ca545a..1495b275baa88a14aecb9487db781ac0236b57d5 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/base/converter/object/json/JsonConverter.cpp
@@ -1,5 +1,6 @@
 #include "JsonConverter.h"
 
+#include <ArmarXCore/core/logging/Logging.h>
 #include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
 
 namespace armarx::armem::server::ltm::converter::object
diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/detail/CoreSegmentBase.h b/source/RobotAPI/libraries/armem/server/ltm/base/detail/CoreSegmentBase.h
index b975b352f007c8ebd3364af641ef75c3a7fc6a08..ebe21f4c1c35a03ab8a0b5219d26e57417c4533a 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/base/detail/CoreSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/base/detail/CoreSegmentBase.h
@@ -65,7 +65,7 @@ namespace armarx::armem::server::ltm
         }
 
         /// iterate over all provider segments of this ltm
-        virtual bool forEachProviderSegment(std::function<void(ProviderSegmentT&)>&& func) const = 0;
+        virtual bool forEachProviderSegment(std::function<void(ProviderSegmentT&)> func) const = 0;
 
         /// find provider segment
         virtual std::shared_ptr<ProviderSegmentT> findProviderSegment(const std::string&) const = 0;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h b/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h
index c0973aa90b7d54a3efde6f331e8ddaab65e0393b..1b32ee2c9fc10bdb476b36b7046f46fc8518e462 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h
@@ -123,7 +123,7 @@ namespace armarx::armem::server::ltm
         }
 
         /// iterate over all core segments of this ltm
-        virtual bool forEachCoreSegment(std::function<void(CoreSegmentT&)>&& func) const = 0;
+        virtual bool forEachCoreSegment(std::function<void(CoreSegmentT&)> func) const = 0;
 
         /// find core segment
         virtual std::shared_ptr<CoreSegmentT> findCoreSegment(const std::string&) const = 0; // TODO make unique!!
diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/detail/ProviderSegmentBase.h b/source/RobotAPI/libraries/armem/server/ltm/base/detail/ProviderSegmentBase.h
index b5aa8f0ee95711001d378f06ef5c674266dc021b..c241d7889621f534991733baf82973e28428a641 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/base/detail/ProviderSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/base/detail/ProviderSegmentBase.h
@@ -65,7 +65,7 @@ namespace armarx::armem::server::ltm
         }
 
         /// iterate over all core segments of this ltm
-        virtual bool forEachEntity(std::function<void(EntityT&)>&& func) const = 0;
+        virtual bool forEachEntity(std::function<void(EntityT&)> func) const = 0;
 
         /// find entity segment
         virtual std::shared_ptr<EntityT> findEntity(const std::string&) const = 0;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp
index 785276d04bd1e366be172ba7a07560a96a0c7755..cfc859a5f89418247c1d7f383cfea1b5bce8aa2a 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.cpp
@@ -16,7 +16,7 @@ namespace armarx::armem::server::ltm::disk
     {
     }
 
-    bool CoreSegment::forEachProviderSegment(std::function<void(ProviderSegment&)>&& func) const
+    bool CoreSegment::forEachProviderSegment(std::function<void(ProviderSegment&)> func) const
     {
         auto mPath = getMemoryBasePathForMode(currentMode, currentExport);
         auto relPath = getRelativePathForMode(currentMode);
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h
index 6dfc00e7e5e37814027cfc10a3be53dd83dff603..78ff8be3f12d35eeebbed370cc04559b37a57822 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/CoreSegment.h
@@ -18,7 +18,7 @@ namespace armarx::armem::server::ltm::disk
 
         CoreSegment(const std::filesystem::path& parentPath, const MemoryID& id, const std::shared_ptr<Processors>& p, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e);
 
-        bool forEachProviderSegment(std::function<void(ProviderSegment&)>&& func) const override;
+        bool forEachProviderSegment(std::function<void(ProviderSegment&)> func) const override;
 
         std::shared_ptr<ProviderSegment> findProviderSegment(const std::string&) const override;
 
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp
index 72ed4653638d77adf1c1dc760354c8dcf12d43d3..f1706a545a0f3d81cee3637e3bef3f5eb7df0e17 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/EntitySnapshot.cpp
@@ -80,6 +80,7 @@ namespace armarx::armem::server::ltm::disk
 
                 if (std::find(allFilesInIndexFolder.begin(), allFilesInIndexFolder.end(), dataFilename) != allFilesInIndexFolder.end())
                 {
+                    //ARMARX_INFO << "Convert data for entity " << id();
                     auto datafilecontent = util::readDataFromFile(mPath, relDataPath);
                     auto dataaron = dictConverter.convert(datafilecontent, "");
                     datadict = aron::data::Dict::DynamicCastAndCheck(dataaron);
@@ -110,6 +111,7 @@ namespace armarx::armem::server::ltm::disk
                     ARMARX_ERROR << "Could not find the data file '" << relDataPath.string() << "'. Continuing without data.";
                 }
 
+                //ARMARX_INFO << "Convert metadata for entity " << id();
                 if (std::find(allFilesInIndexFolder.begin(), allFilesInIndexFolder.end(), metadataFilename) != allFilesInIndexFolder.end())
                 {
                     auto metadatafilecontent = util::readDataFromFile(mPath, relMetadataPath);
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp
index 6d0b4e1fa18ee244643c5fc45755af0468d056db..a2a374c6de24e4fd1dca370149841d79f85de027 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.cpp
@@ -65,7 +65,7 @@ namespace armarx::armem::server::ltm::disk
         }
     }
 
-    bool Memory::forEachCoreSegment(std::function<void(CoreSegment&)>&& func) const
+    bool Memory::forEachCoreSegment(std::function<void(CoreSegment&)> func) const
     {
         for (unsigned long i = 0; i <= maxExportIndex; ++i)
         {
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h
index c9f1e95b216a0dd0dac6ff67c9f28c9ef1b38d5c..afd3a09004eea72c406ebfea844ffa80b257fc84 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/Memory.h
@@ -29,7 +29,7 @@ namespace armarx::armem::server::ltm::disk
 
         void configure(const nlohmann::json& config) final;
 
-        bool forEachCoreSegment(std::function<void(CoreSegment&)>&& func) const final;
+        bool forEachCoreSegment(std::function<void(CoreSegment&)> func) const final;
         std::shared_ptr<CoreSegment> findCoreSegment(const std::string& coreSegmentName) const final;
 
     protected:
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp
index ede13058b8a8abbca1eb348b3fa483234e4eae76..32500f7d6a799f678d5fdf1fce09024d93c4a796 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.cpp
@@ -18,7 +18,7 @@ namespace armarx::armem::server::ltm::disk
     {
     }
 
-    bool ProviderSegment::forEachEntity(std::function<void(Entity&)>&& func) const
+    bool ProviderSegment::forEachEntity(std::function<void(Entity&)> func) const
     {
         auto mPath = getMemoryBasePathForMode(currentMode, currentExport);
         auto relPath = getRelativePathForMode(currentMode);
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h
index 0402f4b98408b73719ea2d2889d02c195186aac6..dfa7c42714310a042dc344c043794eca4536ea00 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/ProviderSegment.h
@@ -17,7 +17,7 @@ namespace armarx::armem::server::ltm::disk
     public:
         ProviderSegment(const std::filesystem::path& parentPath, const MemoryID& id, const std::shared_ptr<Processors>& p, const DiskMemoryItem::MemoryEncodingMode mode, const unsigned long e);
 
-        bool forEachEntity(std::function<void(Entity&)>&& func) const override;
+        bool forEachEntity(std::function<void(Entity&)> func) const override;
 
         std::shared_ptr<Entity> findEntity(const std::string&) const override;
 
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/detail/util/filesystem_util.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/detail/util/filesystem_util.cpp
index daea3fcfc439326545a79ad00ac53e9133afa195..6b6bfdc1be88e30507e2a5d865b94c44abfb090d 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/disk/detail/util/filesystem_util.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/detail/util/filesystem_util.cpp
@@ -97,6 +97,7 @@ namespace armarx::armem::server::ltm::disk
                     ret.push_back(subdirPath.filename());
                 }
             }
+            std::sort(ret.begin(), ret.end());
             return ret;
         }
 
@@ -111,6 +112,7 @@ namespace armarx::armem::server::ltm::disk
                     ret.push_back(subdirPath.filename());
                 }
             }
+            std::sort(ret.begin(), ret.end());
             return ret;
         }
     }
diff --git a/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp b/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp
index 7999a6a5752cd1bc9432f9caec95a6f928645a20..edaa7bb5c5d92b57b0edf3918d1674db34337680 100644
--- a/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp
+++ b/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp
@@ -31,9 +31,16 @@
 #include <RobotAPI/libraries/aron/core/data/variant/All.h>
 #include <RobotAPI/libraries/aron/core/type/variant/All.h>
 
+#include <RobotAPI/libraries/armem/server/ltm/disk/Memory.h>
 
 //#include "../core/io/diskWriter/NlohmannJSON/NlohmannJSONDiskWriter.h"
 
+// TODO: REMOVE ME!!
+#include <VirtualRobot/Robot.h>
+#include <VirtualRobot/RobotNodeSet.h>
+#include <VirtualRobot/Import/SimoxXMLFactory.h>
+#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
+
 #include <filesystem>
 #include <iostream>
 
@@ -205,6 +212,61 @@ BOOST_AUTO_TEST_CASE(test_memory_export__easy_bool_setup)
     run<aron::type::Bool>("TestMemory_BoolSetup", "theBool");
 }
 
+BOOST_AUTO_TEST_CASE(test_memory_export__easy_fabian_setup)
+{
+    std::filesystem::path memoryExport = "/home/fabian/repos/projects/ltmtools/data/sim_2022_09_15";
+
+    armem::server::ltm::disk::Memory ltm(memoryExport, "Object");
+    auto ltm_c_seg = ltm.findCoreSegment("Instance");
+
+    ltm_c_seg->forEachProviderSegment([](const armem::server::ltm::disk::ProviderSegment& ltm_p_seg){
+        ltm_p_seg.forEachEntity([](const armem::server::ltm::disk::Entity& ltm_e){
+            ltm_e.forEachSnapshot([](const armem::server::ltm::disk::EntitySnapshot& ltm_snapshot){
+                armem::wm::EntitySnapshot s;
+                ltm_snapshot.loadAllReferences(s);
+                ltm_snapshot.resolve(s);
+
+                auto i = s.getInstance(0);
+                auto data = i.data();
+
+
+
+                auto p = data->getElement("pose");
+                auto p2 = armarx::aron::data::Dict::DynamicCastAndCheck(p);
+
+                armarx::objpose::arondto::ObjectPose px;
+                px.fromAron(p2);
+
+                auto a = p2->getElement("attachment");
+                auto a2 = armarx::aron::data::Dict::DynamicCastAndCheck(a);
+
+                armarx::objpose::arondto::ObjectAttachmentInfo ax;
+                ax.fromAron(a2);
+
+                if (ax.agentName != "")
+                {
+                    ARMARX_INFO << (ax.poseInFrame);
+                }
+            });
+        });
+    });
+
+
+    //auto ltm_p_seg = ltm_c_seg->findProviderSegment("Armar3");
+    //auto ltm_e = ltm_p_seg->findEntity("Armar3");
+
+    //armem::wm::Entity e;
+    //ltm_e->loadAllReferences(e);
+    //ltm_e->resolve(e);
+
+    //std::function<void(armarx::armem::wm::EntitySnapshot)> f = [](armem::wm::EntitySnapshot s){ ARMARX_INFO << s.id(); };
+
+    //e.forEachSnapshot(f);
+    //auto wm = ltm.loadAllAndResolve();
+
+
+}
+
 /*
 BOOST_AUTO_TEST_CASE(test_memory_export__easy_rainer_setup)
 {
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 72a657218790d389d14283f7c22fb02ce183c357..85c6403e5e4452848c31ffbc3f59aa39c3fe46ee 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/Writer.cpp
@@ -253,7 +253,6 @@ namespace armarx::aron::codegenerator::cpp
             c->addInherit("public armarx::aron::cpp::AronGeneratedClass");
 
             // ctor
-            c->addCtor(generator.toCopyCtor(c->getName()));
             c->addCtor(generator.toInnerEnumCtor(c->getName()));
 
             // Specific methods
@@ -336,6 +335,10 @@ namespace armarx::aron::codegenerator::cpp
 
         // ctor
         c->addCtor(gen.toCtor(c->getName()));
+        c->addCtor(gen.toCopyCtor(c->getName()));
+
+        // dtor
+        c->addMethod(gen.toDtor(c->getName()));
 
         // Generic methods
         //std::cout << "Generate equals method" << std::endl;
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
index add1b800c01ad8186008d55574559e0705527a4b..98986e925c3f744a8b339108e372e05e95600709 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
@@ -41,6 +41,7 @@ namespace armarx::aron::codegenerator::cpp
     const std::string Generator::ARON_TEMPLATE_INSTANTIATIONS_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_tmpls";
     const std::string Generator::ARON_VARIANT_RETURN_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_variant";
     const std::string Generator::ARON_PATH_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_p";
+    const std::string Generator::ARON_OTHER_ACCESSOR = Generator::ARON_VARIABLE_PREFIX + "_o";
 
     const SerializerFactoryPtr Generator::FACTORY = SerializerFactoryPtr(new GeneratorFactory());
 
@@ -168,17 +169,52 @@ namespace armarx::aron::codegenerator::cpp
 
     CppCtorPtr Generator::toCtor(const std::string& name) const
     {
-        CppCtorPtr c = CppCtorPtr(new CppCtor(name + "()"));
-        std::vector<std::pair<std::string, std::string>> initList = this->getCtorInitializers("");
-        CppBlockPtr b = std::make_shared<CppBlock>();
-        b->addLine("resetHard();");
-        b->appendBlock(this->getCtorBlock(""));
-        c->addInitListEntries(initList);
-        c->setBlock(b);
+        CppBlockPtr b = this->getCtorBlock("");
+        auto initList = this->getCtorInitializers("");
+
+        if (b->size() > 0 || initList.second)
+        {
+            CppCtorPtr c = CppCtorPtr(new CppCtor(name + "()"));
+            c->addInitListEntries(initList.first);
+            c->setBlock(b);
+            return c;
+        }
 
+        CppCtorPtr c = CppCtorPtr(new CppCtor(name + "() = default;"));
         return c;
     }
 
+    CppCtorPtr Generator::toCopyCtor(const std::string& name) const
+    {
+        CppBlockPtr b = this->getCopyCtorBlock("");
+        auto initList = this->getCopyCtorInitializers("");
+
+        if (b->size() > 0 || initList.second)
+        {
+            CppCtorPtr c = CppCtorPtr(new CppCtor(name + "(const " + name + "& " + ARON_OTHER_ACCESSOR + ")"));
+            c->addInitListEntries(initList.first);
+            c->setBlock(b);
+            return c;
+        }
+
+        CppCtorPtr c = CppCtorPtr(new CppCtor(name + "(const " + name + "& " + ARON_OTHER_ACCESSOR + ") = default;"));
+        return c;
+    }
+
+    CppMethodPtr Generator::toDtor(const std::string& name) const
+    {
+        CppBlockPtr b = this->getDtorBlock("");
+        if (b->size() > 0)
+        {
+            CppMethodPtr m = CppMethodPtr(new CppMethod("virtual ~" + name + "()"));
+            m->setBlock(b);
+            return m;
+        }
+
+        CppMethodPtr m = CppMethodPtr(new CppMethod("virtual ~" + name + "() = default;"));
+        return m;
+    }
+
     CppMethodPtr Generator::toResetSoftMethod() const
     {
         std::stringstream doc;
@@ -338,9 +374,9 @@ namespace armarx::aron::codegenerator::cpp
         return {field};
     }
 
-    std::vector<std::pair<std::string, std::string>> Generator::getCtorInitializers(const std::string&) const
+    std::pair<std::vector<std::pair<std::string, std::string>>, bool> Generator::getCtorInitializers(const std::string&) const
     {
-        return {};
+        return {{}, false};
     }
 
     CppBlockPtr Generator::getCtorBlock(const std::string&) const
@@ -348,6 +384,27 @@ namespace armarx::aron::codegenerator::cpp
         return std::make_shared<CppBlock>();
     }
 
+    std::pair<std::vector<std::pair<std::string, std::string>>, bool> Generator::getCopyCtorInitializers(const std::string& name) const
+    {
+        const auto& t = getType();
+        if (t.getMaybe() == type::Maybe::UNIQUE_PTR || t.getMaybe() == type::Maybe::RAW_PTR)
+        {
+            return {{{name, ARON_OTHER_ACCESSOR + "." + name + " ? " + resolveMaybeGenerator("*" + ARON_OTHER_ACCESSOR + "." + name) + " : nullptr"}}, true};
+        }
+
+        return {{{name, ARON_OTHER_ACCESSOR + "." + name}}, false};
+    }
+
+    CppBlockPtr Generator::getCopyCtorBlock(const std::string&) const
+    {
+        return std::make_shared<CppBlock>();
+    }
+
+    CppBlockPtr Generator::getDtorBlock(const std::string&) const
+    {
+        return std::make_shared<CppBlock>();
+    }
+
     CppBlockPtr Generator::getResetHardBlock(const std::string& cppAccessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
@@ -389,24 +446,35 @@ namespace armarx::aron::codegenerator::cpp
         return s;
     }
 
-    std::string Generator::resolveMaybeGenerator(const std::string& s) const
+    std::string Generator::resolveMaybeGenerator(const std::string& args) const
     {
         const auto& t = getType();
         if (t.getMaybe() == type::Maybe::OPTIONAL)
         {
-            return s + " = std::make_optional<" + getInstantiatedCppTypename() + ">();";
+            return "std::make_optional<" + getInstantiatedCppTypename() + ">(" + args + ")";
         }
         if (t.getMaybe() == type::Maybe::RAW_PTR)
         {
-            return s + " = new " + getInstantiatedCppTypename() + "();";
+            return "new " + getInstantiatedCppTypename() + "(" + args + ")";
         }
         if (t.getMaybe() == type::Maybe::SHARED_PTR)
         {
-            return s + " = std::make_shared<" + getInstantiatedCppTypename() + ">();";
+            return "std::make_shared<" + getInstantiatedCppTypename() + ">(" + args + ")";
         }
         if (t.getMaybe() == type::Maybe::UNIQUE_PTR)
         {
-            return s + " = std::make_unique<" + getInstantiatedCppTypename() + ">();";
+            return "std::make_unique<" + getInstantiatedCppTypename() + ">(" + args + ")";
+        }
+        return "";
+
+    }
+
+    std::string Generator::resolveMaybeGeneratorWithSetter(const std::string& s, const std::string& args) const
+    {
+        auto gen = resolveMaybeGenerator(args);
+        if (!gen.empty())
+        {
+            return s + " = " + gen + ";";
         }
         return "";
     }
@@ -497,7 +565,7 @@ namespace armarx::aron::codegenerator::cpp
             b->addLine("if (not (" + ARON_READER_ACCESSOR + ".readNull(" + variantAccessor + "))) // if aron contains data");
             {
                 CppBlockPtr ifb = std::make_shared<CppBlock>();
-                ifb->addLine(resolveMaybeGenerator(cppAccessor));
+                ifb->addLine(resolveMaybeGeneratorWithSetter(cppAccessor));
                 ifb->appendBlock(block_if_data);
                 b->addBlock(ifb);
             }
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 7b9c15a7d4c6f1409db4999b906933bff64f3370..18bec1e225a6fbae97c71c10a7bd82a21ba5604b 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
@@ -91,9 +91,16 @@ namespace armarx::aron::codegenerator::cpp
         virtual std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const;
 
         CppCtorPtr toCtor(const std::string&) const;
-        virtual std::vector<std::pair<std::string, std::string>> getCtorInitializers(const std::string&) const;
+        virtual std::pair<std::vector<std::pair<std::string, std::string>>, bool> getCtorInitializers(const std::string&) const;
         virtual CppBlockPtr getCtorBlock(const std::string&) const;
 
+        CppCtorPtr toCopyCtor(const std::string&) const;
+        virtual std::pair<std::vector<std::pair<std::string, std::string>>, bool> getCopyCtorInitializers(const std::string&) const;
+        virtual CppBlockPtr getCopyCtorBlock(const std::string&) const;
+
+        CppMethodPtr toDtor(const std::string&) const;
+        virtual CppBlockPtr getDtorBlock(const std::string&) const;
+
         CppMethodPtr toResetSoftMethod() const;
         virtual CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const;
 
@@ -127,7 +134,8 @@ namespace armarx::aron::codegenerator::cpp
         std::string toPointerAccessor(const std::string&) const;
 
         std::string resolveMaybeAccessor(const std::string&) const;
-        std::string resolveMaybeGenerator(const std::string&) const;
+        std::string resolveMaybeGenerator(const std::string& args = "") const;
+        std::string resolveMaybeGeneratorWithSetter(const std::string&, const std::string& args = "") const;
 
         CppBlockPtr resolveMaybeResetHardBlock(const CppBlockPtr&, const std::string&) const;
         CppBlockPtr resolveMaybeResetSoftBlock(const CppBlockPtr&, const std::string&) const;
@@ -144,6 +152,7 @@ namespace armarx::aron::codegenerator::cpp
         static const std::string ARON_WRITER_ACCESSOR;
         static const std::string ARON_TEMPLATE_INSTANTIATIONS_ACCESSOR;
         static const std::string ARON_VARIANT_RETURN_ACCESSOR;
+        static const std::string ARON_OTHER_ACCESSOR;
 
     private:
         static const SerializerFactoryPtr FACTORY;
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 5b734427b84bbd9fa139f6518110b55b7daf48ae..617a658199e8380a3c6fe02ad13a5a13fad1e886 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
@@ -57,7 +57,7 @@ namespace armarx::aron::codegenerator::cpp::generator
             bool b = std::find(x.disallowedBases.begin(), x.disallowedBases.end(), t.getPath().getRootIdentifier()) == x.disallowedBases.end();
             return b;
         }
-        return true;
+        return false;
     }
 
     std::string checkForInstantiationTypenameReplacement(const type::Object& t)
@@ -99,7 +99,8 @@ namespace armarx::aron::codegenerator::cpp::generator
             checkForInstantiationTypenameReplacement(e),
             checkForClassNameReplacement(e),
             simox::meta::get_type_name<data::dto::Dict>(),
-            simox::meta::get_type_name<type::dto::AronObject>(), e)
+            simox::meta::get_type_name<type::dto::AronObject>(), e),
+        has_been_replaced(checkForAllowedReplacement(e))
     {
     }
 
@@ -160,7 +161,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         std::string escaped_accessor = EscapeAccessor(cppAccessor);
         std::string resolved_accessor = resolveMaybeAccessor(cppAccessor);
 
-        if (const auto reset = resolveMaybeGenerator(cppAccessor); !reset.empty())
+        if (const auto reset = resolveMaybeGeneratorWithSetter(cppAccessor); !reset.empty())
         {
             block_if_data->addLine(reset);
         }
@@ -169,5 +170,31 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor);
     }
+
+
+
+    CppBlockPtr Object::getResetHardBlock(const std::string& cppAccessor) const
+    {
+        if (has_been_replaced)
+        {
+            return Base::getResetHardBlock(cppAccessor);
+        }
+
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + nextEl() + "resetHard();");
+        return resolveMaybeResetHardBlock(block_if_data, cppAccessor);
+    }
+
+    CppBlockPtr Object::getResetSoftBlock(const std::string& cppAccessor) const
+    {
+        if (has_been_replaced)
+        {
+            return Base::getResetHardBlock(cppAccessor);
+        }
+
+        auto block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + nextEl() + "resetSoft();");
+        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
+    }
 }
 
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 b1a2995c443f4e680725fdcbfbf4ac6374d7c712..942dc161a8792b9b9455c08db5c40eba79260605 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
@@ -37,12 +37,14 @@ namespace armarx::aron::codegenerator::cpp::generator
         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
+        std::vector<std::string> disallowedBases; // disallow replacement if used in a specific class
     };
 
     class Object :
         public detail::ContainerGenerator<type::Object, Object>
     {
+        using Base = detail::ContainerGenerator<type::Object, Object>;
+
     public:
         // constructors
         Object(const type::Object&);
@@ -53,5 +55,10 @@ namespace armarx::aron::codegenerator::cpp::generator
         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;
+        CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
+        CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
+
+    private:
+        bool has_been_replaced = false;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp
index c818db64a05d881f8f3efee3ae9d2a767c8383ed..00a9ab35d7f52eb757963c97355403377459737e 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/enum/IntEnum.cpp
@@ -88,7 +88,7 @@ namespace armarx::aron::codegenerator::cpp::generator
     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())
+        if (const auto reset = resolveMaybeGeneratorWithSetter(cppAccessor); !reset.empty())
         {
             block_if_data->addLine(reset);
         }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp
index fb3572e26adb9a61cf7bcde1396a1a2cb4bfff26..7dcadbb33ae84d70a180e89763ca37a634946268 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.cpp
@@ -49,4 +49,18 @@ namespace armarx::aron::codegenerator::cpp::generator
                    "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
+
+    CppBlockPtr Bool::getResetHardBlock(const std::string& cppAccessor) const
+    {
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = false;");
+        return resolveMaybeResetHardBlock(block_if_data, cppAccessor);
+    }
+
+    CppBlockPtr Bool::getResetSoftBlock(const std::string& cppAccessor) const
+    {
+        auto block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = false;");
+        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.h
index 85172f3de8745ac5b2feb465cd9ff8408e94cd56..381adec7bc759c7a20aedd54229dd499253110d1 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Bool.h
@@ -40,5 +40,7 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         /* virtual implementations */
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final;
+        CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
+        CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.cpp
index 7076794550d8e149f496677c079da4a3b7517e03..735f3ad9dc4efdf0f00a34093671644aebb0eb3f 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.cpp
@@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator
                    "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
+
+    CppBlockPtr Double::getResetHardBlock(const std::string& cppAccessor) const
+    {
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = 0.0;");
+        return resolveMaybeResetHardBlock(block_if_data, cppAccessor);
+    }
+
+    CppBlockPtr Double::getResetSoftBlock(const std::string& cppAccessor) const
+    {
+        auto block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = 0.0;");
+        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.h
index e109cc626500ce4004f2b69b670ed9574c947ea5..b9a96a077e225aad5b0871882e86e20f85fb3685 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Double.h
@@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         /* virtual implementations */
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final;
+        CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
+        CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.cpp
index 6c740a79206d323e0b6e9bf0b66c19d82eb1593a..d3d27ea6c34713b3d81074c1ab64e37ed696d69c 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.cpp
@@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator
                    "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
+
+    CppBlockPtr Float::getResetHardBlock(const std::string& cppAccessor) const
+    {
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = 0.0f;");
+        return resolveMaybeResetHardBlock(block_if_data, cppAccessor);
+    }
+
+    CppBlockPtr Float::getResetSoftBlock(const std::string& cppAccessor) const
+    {
+        auto block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = 0.0f;");
+        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.h
index a2f52f4fb7d78ebcefcd96ba3eba8d0b31fc7dcb..f1c88c502f92b7d86afc7668eda0710f0f3351b7 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Float.h
@@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         /* virtual implementations */
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final;
+        CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
+        CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.cpp
index 9242126f54ae10d3ee26fd6e242de8014c6a23f7..7a976bd83fffa4ad52bec05c2a5392bbf7400798 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.cpp
@@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator
                    "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
+
+    CppBlockPtr Int::getResetHardBlock(const std::string& cppAccessor) const
+    {
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = 0;");
+        return resolveMaybeResetHardBlock(block_if_data, cppAccessor);
+    }
+
+    CppBlockPtr Int::getResetSoftBlock(const std::string& cppAccessor) const
+    {
+        auto block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = 0;");
+        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.h
index eb18e445473f402c2be373da523ba92336a4ab48..b21abee9cef1850a1d55da0369a530b65585c210 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Int.h
@@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         /* virtual implementations */
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final;
+        CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
+        CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.cpp
index 2231f3305264746bb5c31855cac0e6a5c3d712b0..fe6cd5e87f6f3db26873c351987f91d86556d27b 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.cpp
@@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator
                    "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
+
+    CppBlockPtr Long::getResetHardBlock(const std::string& cppAccessor) const
+    {
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = 0;");
+        return resolveMaybeResetHardBlock(block_if_data, cppAccessor);
+    }
+
+    CppBlockPtr Long::getResetSoftBlock(const std::string& cppAccessor) const
+    {
+        auto block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = 0;");
+        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.h
index 8e74bf85b421ff3101af4f86a3edcdc91858559a..09d923e487108a7c2c0927156af77c21fddf79ec 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/Long.h
@@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         /* virtual implementations */
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final;
+        CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
+        CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.cpp
index a335fafcbd33ffca5c0a1658aaa1da5ccfeb4cc6..d51ee9ed159a5abb82442a5501ffebb3500aad15 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.cpp
@@ -50,4 +50,18 @@ namespace armarx::aron::codegenerator::cpp::generator
                    "armarx::aron::Path("+ARON_PATH_ACCESSOR+", {"+simox::alg::join(p.getPath(), ", ")+"})); // of " + typeAccessor);
         return b;
     }
+
+    CppBlockPtr String::getResetHardBlock(const std::string& cppAccessor) const
+    {
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = \"\";");
+        return resolveMaybeResetHardBlock(block_if_data, cppAccessor);
+    }
+
+    CppBlockPtr String::getResetSoftBlock(const std::string& cppAccessor) const
+    {
+        auto block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine(cppAccessor + " = \"\";");
+        return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.h
index 7db96c8713e04a479d4f1623043f633d4d429f84..fd854ccee807d549fbe1448643eb31a4f069bcc8 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/primitive/String.h
@@ -39,5 +39,7 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         /* virtual implementations */
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path& p, std::string& variantAccessor) const final;
+        CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
+        CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
index c1c77424ba3d97dc217bd846bb1335023761fa2a..95677e1215ae6c317bec02186c23b71f91992089 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
@@ -147,12 +147,18 @@ namespace armarx::aron::codegenerator::cpp::generator
     }
 
 
-    CppCtorPtr IntEnumClass::toCopyCtor(const std::string& name) const
+    /*CppCtorPtr IntEnumClass::toCopyCtor(const std::string& name) const
     {
         CppCtorPtr c = std::make_shared<CppCtor>(name + "(const " + getFullInstantiatedCppTypename() + "& i)");
         std::vector<std::pair<std::string, std::string>> initList = {{"value", "i.value"}};
         c->addInitListEntries(initList);
+        c->setBlock(std::make_shared<CppBlock>());
         return c;
+    }*/
+
+    std::pair<std::vector<std::pair<std::string, std::string>>, bool> IntEnumClass::getCopyCtorInitializers(const std::string&) const
+    {
+        return {{{"value", ARON_OTHER_ACCESSOR + ".value"}}, false};
     }
 
     CppCtorPtr IntEnumClass::toInnerEnumCtor(const std::string& name) const
@@ -160,6 +166,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppCtorPtr c = std::make_shared<CppCtor>(name + "(const " + std::string(IMPL_ENUM) + " e)");
         std::vector<std::pair<std::string, std::string>> initList = {{"value", "e"}};
         c->addInitListEntries(initList);
+        c->setBlock(std::make_shared<CppBlock>());
         return c;
     }
 
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h
index b03310d425bb6783f618e9548d573a87b87c77dc..10d6ca0c14d8100e71d78944f24fd3f46870b8e1 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.h
@@ -42,6 +42,9 @@ namespace armarx::aron::codegenerator::cpp::generator
 
         // virtual implementations
         std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const final;
+
+        std::pair<std::vector<std::pair<std::string, std::string>>, bool> getCopyCtorInitializers(const std::string&) const final;
+
         CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const final;
@@ -50,7 +53,7 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const final;
 
         // TODO: Move some of those methods to upper class for enums (if we want to support multiple enums)
-        CppCtorPtr toCopyCtor(const std::string&) const;
+        //CppCtorPtr toCopyCtor(const std::string&) const;
         CppCtorPtr toInnerEnumCtor(const std::string&) const;
         CppEnumPtr toInnerEnumDefinition() const;
         CppMethodPtr toIntMethod() const;
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
index 0d54dc8bf173b1262ecbc938a6c1678fb1dff8b2..bac3ce6239066682e134f21cbd6e968873823626 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
@@ -236,5 +236,26 @@ namespace armarx::aron::codegenerator::cpp::generator
         }
         return block_if_data;
     }
+
+    std::pair<std::vector<std::pair<std::string, std::string>>, bool> ObjectClass::getCopyCtorInitializers(const std::string&) const
+    {
+        std::vector<std::pair<std::string, std::string>> ret;
+
+        if (type.getExtends() != nullptr)
+        {
+            const auto extends_s = FromAronType(*type.getExtends());
+            ret.push_back({extends_s->getFullInstantiatedCppTypename(), ARON_OTHER_ACCESSOR});
+        }
+
+        bool anyComplex = false;
+        for (const auto& [key, child] : type.getMemberTypes())
+        {
+            auto child_s = FromAronType(*child);
+            auto initList = child_s->getCopyCtorInitializers(key);
+            simox::alg::append(ret, initList.first);
+            anyComplex = anyComplex || initList.second;
+        }
+        return {ret, anyComplex};
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h
index dd8e7d3d95bb291a54aeba45d46bae8bbf336834..772d138cb7cc521753ce6bd3086bb076d475b462 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.h
@@ -40,6 +40,9 @@ namespace armarx::aron::codegenerator::cpp::generator
         // virtual implementations
         std::vector<std::string> getRequiredIncludes() const final;
         std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const final;
+
+        std::pair<std::vector<std::pair<std::string, std::string>>, bool> getCopyCtorInitializers(const std::string&) const final;
+
         CppBlockPtr getResetHardBlock(const std::string& cppAccessor) const final;
         CppBlockPtr getResetSoftBlock(const std::string& cppAccessor) const final;
         CppBlockPtr getWriteTypeBlock(const std::string& typeAccessor, const std::string& cppAccessor, const Path&, std::string& variantAccessor) const final;
diff --git a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp
index e6429e7fe75ba54fea8a38c6f41398c0d149d2a5..3729e90a5812a192c256f2deaaa13bbecad71bab 100644
--- a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp
+++ b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp
@@ -1,5 +1,7 @@
 #include "NLohmannJSONConverter.h"
 
+#include <ArmarXCore/core/logging/Logging.h>
+
 namespace armarx::aron::converter
 {
     nlohmann::json AronNlohmannJSONConverter::ConvertToNlohmannJSON(const data::VariantPtr& aron)
diff --git a/source/RobotAPI/libraries/aron/core/Exception.h b/source/RobotAPI/libraries/aron/core/Exception.h
index 52de8098900e7a8dc5538aa4d53453cffe52a7e5..977107f84e4446bf0c18e2297bfb6e0c1315c2e4 100644
--- a/source/RobotAPI/libraries/aron/core/Exception.h
+++ b/source/RobotAPI/libraries/aron/core/Exception.h
@@ -26,6 +26,7 @@
 // STD/STL
 
 // ArmarX
+#include <ArmarXCore/core/logging/Logging.h>
 #include <RobotAPI/interface/aron.h>
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 #include <ArmarXCore/core/exceptions/Exception.h>
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 21fdfc82b0fdec76910890100721d6f5ee19654c..e6beb0e9aab36bc5aa245155b7a42b3d0acb82ab 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
@@ -52,7 +52,8 @@ namespace armarx::aron::data::reader
 
     data::Descriptor NlohmannJSONReader::getDescriptor(InputType& input)
     {
-        return ConstNlohmannJSONVisitor::GetDescriptor(input);
+        auto ret = ConstNlohmannJSONVisitor::GetDescriptor(input);
+        return ret;
     }
 
     void NlohmannJSONReader::readList(const nlohmann::json& input, std::vector<nlohmann::json>& elements, Path& p)
diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
index 84adf5c1ea7643ece74e2bc3e224e5df075f7a12..e80e7d37e071585f8b6f3ae0e7d0f81d280b49e4 100644
--- a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
@@ -33,6 +33,7 @@ namespace armarx::aron::data
             return data::Descriptor::UNKNOWN;
         }
         std::string t = n[armarx::aron::data::rw::json::constantes::TYPE_SLUG];
+
         return armarx::aron::data::rw::json::conversion::String2Descriptor.at(t);
     }