From d8a9b0573c05737355db057b3c0ca1b7d7653f71 Mon Sep 17 00:00:00 2001
From: "fabian.peller-konrad@kit.edu" <fabian.peller-konrad@kit.edu>
Date: Wed, 19 May 2021 15:39:55 +0200
Subject: [PATCH] aron fixes for better code generation. Finalized maybe types.
 Merged master and armem/dev into aron/dev. Fixed build issues. Repaired
 ArMemMemoryTest test since an update now adds a provider segment (instead of
 throwing MisingEntryException)

---
 .../server/ExampleMemory/aron/ExampleData.xml |   2 +-
 .../server/ObjectMemory/ObjectMemory.cpp      |   4 +-
 .../RobotStateMemory/RobotStateMemory.cpp     |   2 +-
 .../server/SkillsMemory/SkillsMemory.cpp      |   4 +-
 .../aron_conversions/objpose.cpp              |   4 +-
 .../libraries/armem/core/aron_conversions.cpp |   4 +-
 .../core/workingmemory/EntityInstance.cpp     |  16 +-
 .../libraries/armem/test/ArMemMemoryTest.cpp  |   5 +-
 .../articulated_object_class/Segment.cpp      |   2 +-
 .../articulated_object_instance/Segment.cpp   |   2 +-
 .../armem_robot/aron_conversions.cpp          |   9 +-
 .../armem_robot_mapping/aron_conversions.cpp  |  12 +-
 .../armem_robot_state/aron_conversions.cpp    |   4 +-
 .../server/description/Segment.cpp            |   4 +-
 .../server/localization/Segment.cpp           |   2 +-
 .../codegenerator/codeWriter/cpp/Writer.cpp   |   8 +-
 .../codeWriter/cpp/serializer/Serializer.cpp  | 260 +++++++++++++++---
 .../codeWriter/cpp/serializer/Serializer.h    |   3 +
 .../cpp/serializer/container/Dict.cpp         |  41 ++-
 .../cpp/serializer/container/List.cpp         |  38 +--
 .../cpp/serializer/container/Object.cpp       |  46 ++--
 .../cpp/serializer/container/Pair.cpp         |  68 ++---
 .../cpp/serializer/container/Tuple.cpp        |  64 ++---
 .../detail/PrimitiveSerializerBase.h          |  24 +-
 .../cpp/serializer/detail/SerializerBase.h    |  16 +-
 .../cpp/serializer/enum/IntEnum.cpp           |  19 +-
 .../cpp/serializer/ndarray/EigenMatrix.cpp    |  32 +--
 .../serializer/ndarray/EigenQuaternion.cpp    |  32 +--
 .../cpp/serializer/ndarray/IVTCByteImage.cpp  |  40 +--
 .../cpp/serializer/ndarray/NDArray.cpp        |  20 +-
 .../cpp/serializer/ndarray/OpenCVMat.cpp      |  70 +++--
 .../cpp/serializer/ndarray/OpenCVMat.h        |   6 +-
 .../cpp/serializer/ndarray/Orientation.cpp    |  32 +--
 .../cpp/serializer/ndarray/PCLPointCloud.cpp  |  39 ++-
 .../cpp/serializer/ndarray/Pose.cpp           |  32 +--
 .../cpp/serializer/ndarray/Position.cpp       |  32 +--
 .../cpp/serializer/primitive/Bool.cpp         |   4 +-
 .../cpp/serializer/primitive/Double.cpp       |   4 +-
 .../cpp/serializer/primitive/Float.cpp        |   4 +-
 .../cpp/serializer/primitive/Int.cpp          |   4 +-
 .../cpp/serializer/primitive/Long.cpp         |   4 +-
 .../cpp/serializer/primitive/String.cpp       |   4 +-
 .../cpp/serializer/primitive/Time.cpp         |  16 +-
 .../cpp/serializer/toplevel/IntEnumClass.cpp  |  58 ++--
 .../cpp/serializer/toplevel/ObjectClass.cpp   |  75 +++--
 .../core/codegenerator/typeReader/xml/Data.h  |   6 +-
 .../reader/navigator/NavigatorReader.cpp      |   8 +-
 .../aron/core/io/dataIO/visitor/Visitor.cpp   |   1 +
 .../aron/core/navigator/data/Navigator.cpp    |   1 +
 .../core/navigator/data/complex/NDArray.cpp   |   8 +
 .../core/navigator/data/complex/NDArray.h     |   4 +
 .../core/navigator/data/container/List.cpp    |  10 +-
 .../aron/core/navigator/data/container/List.h |   3 +
 .../data/detail/PrimitiveNavigatorBase.h      |   9 +
 .../libraries/aron/core/test/aronTest.cpp     | 162 +++++++++--
 .../aron/core/test/xmls/IVTCByteImageTest.xml |   4 +-
 56 files changed, 843 insertions(+), 544 deletions(-)

diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.xml b/source/RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.xml
index 7acb4e6d4..dd0bdb301 100644
--- a/source/RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.xml
+++ b/source/RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.xml
@@ -33,7 +33,7 @@
         <EigenMatrix rows="4" cols="4" type="float" />
       </ObjectChild>
       <ObjectChild key='the_ivt_image'>
-        <IVTCByteImage type="GrayScale" />
+        <IVTCByteImage type="GrayScale" raw_ptr="true"/>
       </ObjectChild>
 
       <ObjectChild key='the_float_list'>
diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
index 837fcbcf8..25b56fcb8 100644
--- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
+++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
@@ -158,8 +158,8 @@ namespace armarx::armem::server::obj
 
         // {
         //     std::lock_guard g(server::ComponentPluginUser::workingMemoryMutex);
-        //     // server::ComponentPluginUser::workingMemory.addCoreSegment("ArticulatedObjectInstance"); // TODO , arondto::::toInitialAronType());
-        //     server::ComponentPluginUser::workingMemory.addCoreSegment("ArticulatedObjectClass"); // TODO , arondto::::toInitialAronType());
+        //     // server::ComponentPluginUser::workingMemory.addCoreSegment("ArticulatedObjectInstance"); // TODO , arondto::::toAronType());
+        //     server::ComponentPluginUser::workingMemory.addCoreSegment("ArticulatedObjectClass"); // TODO , arondto::::toAronType());
         // }
 
         createRemoteGuiTab();
diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
index 5aba12106..90d970813 100644
--- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
+++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
@@ -32,7 +32,7 @@
 // Header
 #include "ArmarXCore/core/logging/Logging.h"
 #include "RobotAPI/libraries/armem/core/Time.h"
-#include "RobotAPI/libraries/aron/core/navigator/data/primitive/Primitive.h"
+#include "RobotAPI/libraries/aron/core/navigator/data/AllNavigators.h"
 #include "RobotAPI/libraries/core/Pose.h"
 
 // Simox
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
index 8a03cc159..c0a9fd2f3 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
@@ -70,8 +70,8 @@ namespace armarx
         workingMemory.name() = p.memoryName;
 
         {
-            armarx::armem::wm::CoreSegment& c = workingMemory.addCoreSegment(p.statechartCoreSegmentName, armarx::armem::arondto::Statechart::Transition::toInitialAronType());
-            c.addProviderSegment("Transitions", armarx::armem::arondto::Statechart::Transition::toInitialAronType());
+            armarx::armem::wm::CoreSegment& c = workingMemory.addCoreSegment(p.statechartCoreSegmentName, armarx::armem::arondto::Statechart::Transition::toAronType());
+            c.addProviderSegment("Transitions", armarx::armem::arondto::Statechart::Transition::toAronType());
         }
     }
 
diff --git a/source/RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.cpp b/source/RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.cpp
index 2de8a3da0..4ca668696 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.cpp
@@ -80,7 +80,7 @@ void armarx::objpose::fromAron(const arondto::ObjectPose& dto, ObjectPose& bo)
 
     bo.confidence = dto.confidence;
 
-    bo.timestamp = IceUtil::Time::microSeconds(dto.timestamp);
+    bo.timestamp = dto.timestamp;
 
     if (dto.localOOBBValid)
     {
@@ -122,7 +122,7 @@ void armarx::objpose::toAron(arondto::ObjectPose& dto, const ObjectPose& bo)
 
     dto.confidence = bo.confidence;
 
-    dto.timestamp = bo.timestamp.toMicroSeconds();
+    dto.timestamp = bo.timestamp;
 
     if (bo.localOOBB)
     {
diff --git a/source/RobotAPI/libraries/armem/core/aron_conversions.cpp b/source/RobotAPI/libraries/armem/core/aron_conversions.cpp
index ed2197e66..1f8e33c40 100644
--- a/source/RobotAPI/libraries/armem/core/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/aron_conversions.cpp
@@ -7,7 +7,7 @@ void armarx::armem::fromAron(const arondto::MemoryID& dto, MemoryID& bo)
     bo.coreSegmentName = dto.coreSegmentName;
     bo.providerSegmentName = dto.providerSegmentName;
     bo.entityName = dto.entityName;
-    bo.timestamp = IceUtil::Time::microSeconds(dto.timestamp);
+    bo.timestamp = dto.timestamp;
     bo.instanceIndex = dto.instanceIndex;
 }
 
@@ -17,7 +17,7 @@ void armarx::armem::toAron(arondto::MemoryID& dto, const MemoryID& bo)
     dto.coreSegmentName = bo.coreSegmentName;
     dto.providerSegmentName = bo.providerSegmentName;
     dto.entityName = bo.entityName;
-    dto.timestamp = bo.timestamp.toMicroSeconds();
+    dto.timestamp = bo.timestamp;
     dto.instanceIndex = bo.instanceIndex;
 }
 
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
index 95e508bde..6149449c7 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
@@ -10,7 +10,7 @@ std::ostream& armarx::armem::wm::operator<<(std::ostream& os, const EntityInstan
        << "\n- t_sent =     \t" << armem::toStringMicroSeconds(d.timeSent) << " us"
        << "\n- t_arrived =  \t" << armem::toStringMicroSeconds(d.timeArrived) << " us"
        << "\n- confidence = \t" << d.confidence << " us"
-          ;
+       ;
     return os;
 }
 
@@ -28,9 +28,17 @@ namespace armarx::armem::wm
 
     bool EntityInstance::equalsDeep(const EntityInstance& other) const
     {
-        return id() == other.id()
-               && _metadata == other.metadata()
-               && _data->equalsDeep(other.data());
+        if (_data and other.data())
+        {
+            return id() == other.id()
+                   && _metadata == other.metadata()
+                   && *_data == *other.data();
+        }
+        if (_data or other.data())
+        {
+            return false;
+        }
+        return id() == other.id() && _metadata == other.metadata();
     }
 
     void EntityInstance::update(const EntityUpdate& update, int index)
diff --git a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
index 7588230d8..984c1f8e5 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
@@ -627,8 +627,9 @@ BOOST_AUTO_TEST_CASE(test_segment_setup)
     {
         update.entityID = armem::MemoryID::fromString("Memory/OtherCoreSegment");
         BOOST_CHECK_THROW(coreSegment.update(update), armem::error::ContainerNameMismatch);
-        update.entityID = armem::MemoryID::fromString("Memory/ImageRGB/MissingProvider");
-        BOOST_CHECK_THROW(coreSegment.update(update), armem::error::MissingEntry);
+        // This adds the segment now (changed default behavior)
+        //update.entityID = armem::MemoryID::fromString("Memory/ImageRGB/MissingProvider");
+        //BOOST_CHECK_THROW(coreSegment.update(update), armem::error::MissingEntry);
     }
 
     armem::wm::ProviderSegment& providerSegment = coreSegment.addProviderSegment("SomeRGBImageProvider");
diff --git a/source/RobotAPI/libraries/armem_objects/server/articulated_object_class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/articulated_object_class/Segment.cpp
index 422b8e6be..b2e6be2f6 100644
--- a/source/RobotAPI/libraries/armem_objects/server/articulated_object_class/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/articulated_object_class/Segment.cpp
@@ -48,7 +48,7 @@ namespace armarx::armem::server::obj::articulated_object_class
     {
         ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
 
-        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreClassSegmentName, arondto::RobotDescription::toInitialAronType());
+        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreClassSegmentName, arondto::RobotDescription::toAronType());
         coreSegment->setMaxHistorySize(p.maxHistorySize);
 
         if (p.loadFromObjectsPackage)
diff --git a/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Segment.cpp
index c7fa562a6..dba8c91a8 100644
--- a/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/articulated_object_instance/Segment.cpp
@@ -49,7 +49,7 @@ namespace armarx::armem::server::obj::articulated_object_instance
     {
         ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
 
-        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreInstanceSegmentName, arondto::Robot::toInitialAronType());
+        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreInstanceSegmentName, arondto::Robot::toAronType());
         coreSegment->setMaxHistorySize(p.maxHistorySize);
 
     }
diff --git a/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp
index 6a56d19f3..601f17d65 100644
--- a/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp
@@ -8,11 +8,6 @@ namespace armarx::armem::robot
 {
 
     /* to be moved */
-    void fromAron(const long& dto, IceUtil::Time& time)
-    {
-        time = IceUtil::Time::microSeconds(dto);
-    }
-
     void toAron(long& dto, const IceUtil::Time& time)
     {
         dto = time.toMicroSeconds();
@@ -51,14 +46,14 @@ namespace armarx::armem::robot
 
     void fromAron(const arondto::RobotState& dto, RobotState& bo)
     {
-        fromAron(dto.timestamp, bo.timestamp);
+        bo.timestamp = dto.timestamp;
         bo.globalPose.matrix() = dto.globalPose;
         bo.jointMap            = dto.jointMap;
     }
 
     void toAron(arondto::RobotState& dto, const RobotState& bo)
     {
-        toAron(dto.timestamp, bo.timestamp);
+        dto.timestamp = bo.timestamp;
         dto.globalPose = bo.globalPose.matrix();
         dto.jointMap   = bo.jointMap;
     }
diff --git a/source/RobotAPI/libraries/armem_robot_mapping/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot_mapping/aron_conversions.cpp
index b37a88381..9b4535719 100644
--- a/source/RobotAPI/libraries/armem_robot_mapping/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem_robot_mapping/aron_conversions.cpp
@@ -16,18 +16,12 @@ namespace armarx
 {
 
     /************ fromAron ************/
-
-    armem::Time timeFromAron(const int64_t timestamp)
-    {
-        return armem::Time::microSeconds(timestamp);
-    }
-
     SensorHeader fromAron(const arondto::SensorHeader& aronSensorHeader)
     {
 
         return {.agent = aronSensorHeader.agent,
                 .frame = aronSensorHeader.frame,
-                .timestamp = timeFromAron(aronSensorHeader.timestamp)};
+                .timestamp = aronSensorHeader.timestamp};
     }
 
     void fromAron(const arondto::LaserScanStamped& aronLaserScan,
@@ -70,7 +64,7 @@ namespace armarx
 
         aronSensorHeader.agent = sensorHeader.agent;
         aronSensorHeader.frame = sensorHeader.frame;
-        aronSensorHeader.timestamp = toAron(sensorHeader.timestamp);
+        aronSensorHeader.timestamp = sensorHeader.timestamp;
 
         return aronSensorHeader;
     }
@@ -97,4 +91,4 @@ namespace armarx
         toAron(laserScanStamped, aronLaserScanStamped);
     }
 
-} // namespace armarx
\ No newline at end of file
+} // namespace armarx
diff --git a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp
index 27fecee2e..785d25bdc 100644
--- a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp
@@ -38,7 +38,7 @@ namespace armarx::armem
         aron::toAron(dto.parentFrame, bo.parentFrame);
         aron::toAron(dto.frame, bo.frame);
         aron::toAron(dto.agent, bo.agent);
-        armarx::toAron(dto.timestamp, bo.timestamp);
+        dto.timestamp = bo.timestamp;
     }
 
     void fromAron(const arondto::TransformHeader& dto, robot_state::TransformHeader& bo)
@@ -46,7 +46,7 @@ namespace armarx::armem
         aron::fromAron(dto.parentFrame, bo.parentFrame);
         aron::fromAron(dto.frame, bo.frame);
         aron::fromAron(dto.agent, bo.agent);
-        armarx::fromAron(dto.timestamp, bo.timestamp);
+        bo.timestamp = dto.timestamp;
     }
 
     /* JointState */
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
index 826c5b484..67fc09b09 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
@@ -55,7 +55,7 @@ namespace armarx::armem::server::robot_state::description
         ARMARX_INFO << "Adding core segment '" << p.coreSegment << "'";
 
         coreSegment = &iceMemory.workingMemory->addCoreSegment(
-                          p.coreSegment, arondto::RobotDescription::toInitialAronType());
+                          p.coreSegment, arondto::RobotDescription::toAronType());
         coreSegment->setMaxHistorySize(p.maxHistorySize);
     }
 
@@ -73,7 +73,7 @@ namespace armarx::armem::server::robot_state::description
         const Time now = TimeUtil::GetTime();
 
         const MemoryID providerID = coreSegment->id().withProviderSegmentName(robotDescription.name);
-        coreSegment->addProviderSegment(providerID.providerSegmentName, arondto::RobotDescription::toInitialAronType());
+        coreSegment->addProviderSegment(providerID.providerSegmentName, arondto::RobotDescription::toAronType());
 
         EntityUpdate update;
         update.entityID = providerID.withEntityName("description");
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
index 6858f0c34..108c80691 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
@@ -61,7 +61,7 @@ namespace armarx::armem::server::robot_state::localization
         ARMARX_INFO << "Adding core segment '" << p.coreSegment << "'";
 
         coreSegment = &iceMemory.workingMemory->addCoreSegment(
-                          p.coreSegment, arondto::Transform::toInitialAronType());
+                          p.coreSegment, arondto::Transform::toAronType());
         coreSegment->setMaxHistorySize(p.maxHistorySize);
     }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
index 0cdf58d6d..86dc28743 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
@@ -132,22 +132,22 @@ namespace armarx::aron::cppserializer
                 }
             }
 
-            std::cout << "Generate Type classes" << std::endl;
+            //std::cout << "Generate Type classes" << std::endl;
             generateInnerTypeObjects(c, publicGenerateObjectType->nestedObjects);
 
             // ctor
             c->addCtor(serializer->toCtor(c->getName()));
 
             // Generic methods
-            std::cout << "Generate equals method" << std::endl;
+            //std::cout << "Generate equals method" << std::endl;
             CppMethodPtr equals = serializer->toEqualsMethod();
             c->addMethod(equals);
 
-            std::cout << "Generate reset method" << std::endl;
+            //std::cout << "Generate reset method" << std::endl;
             CppMethodPtr resetHard = serializer->toResetHardMethod();
             c->addMethod(resetHard);
 
-            std::cout << "Generate init method" << std::endl;
+            //std::cout << "Generate init method" << std::endl;
             CppMethodPtr resetSoft = serializer->toResetSoftMethod();
             c->addMethod(resetSoft);
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp
index 4265939ef..757995c47 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp
@@ -42,12 +42,13 @@ namespace armarx::aron::cppserializer
 
     const std::map<std::string, std::string> Serializer::ESCAPE_ACCESSORS =
     {
-        {"->", "_ptr_"},
-        {".", "_dot_"},
-        {"[", "_lbrE_"},
-        {"]", "_rbrE_"},
-        {"(", "_lbrR_"},
-        {")", "_rbrR_"}
+        {"->", "__ptr__"},
+        {".", "__dot__"},
+        {"[", "__lbrC__"},
+        {"]", "__rbrC__"},
+        {"(", "__lbrR__"},
+        {")", "__rbrR__"},
+        {"*", "__ast__"},
     };
 
     const SerializerFactoryPtr Serializer::FACTORY = SerializerFactoryPtr(new SerializerFactory());
@@ -78,35 +79,54 @@ namespace armarx::aron::cppserializer
 
     CppBlockPtr Serializer::ResolveMaybeWriteBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
     {
+        CppBlockPtr b = std::make_shared<CppBlock>();
+
+        if (!accessor.empty())
+        {
+            b->addLine("// Generate WriteInterface API calls for " + accessor);
+        }
+        else
+        {
+            b->addLine("// Generate WriteInterface API calls for the top level object " + ExtractCppTypename(typenavigator));
+        }
+
         if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
-            CppBlockPtr b = std::make_shared<CppBlock>();
-            if (typenavigator->getMaybe() == type::Maybe::eOptional)
-            {
-                b->addLine("if (" + accessor + ".has_value())");
-                b->addBlock(block_if_data);
-            }
-            if (typenavigator->getMaybe() == type::Maybe::eRawPointer)
+            switch (typenavigator->getMaybe())
             {
-                b->addLine("if (" + accessor + " == NULL)");
-                b->addBlock(block_if_data);
-            }
-            if (typenavigator->getMaybe() == type::Maybe::eSharedPointer || typenavigator->getMaybe() == type::Maybe::eUniquePointer)
-            {
-                b->addLine("if (" + accessor + " == nullptr)");
-                b->addBlock(block_if_data);
+                case type::Maybe::eOptional:
+                {
+                    b->addLine("if (" + accessor + ".has_value())");
+                    b->addBlock(block_if_data);
+                    break;
+                }
+                case type::Maybe::eRawPointer:
+                {
+                    b->addLine("if (" + accessor + " != NULL)");
+                    b->addBlock(block_if_data);
+                    break;
+                }
+                case type::Maybe::eSharedPointer:
+                case type::Maybe::eUniquePointer:
+                {
+                    b->addLine("if (" + accessor + " != nullptr)");
+                    b->addBlock(block_if_data);
+                    break;
+                }
+                default:
+                {
+                    throw error::MaybeNotValidException("Serializer", "ResolveMaybeWriteBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath());
+                }
             }
 
             b->addLine("else");
             CppBlockPtr block_if_no_data = std::make_shared<CppBlock>();
-            block_if_no_data->addLine("w.writeNull();");
+            block_if_no_data->addLine("w.writeNull(); // The maybe type '" + accessor + "' has no data, so we simply write NULL (resulting in a AronData nullhandle)");
             b->addBlock(block_if_no_data);
             return b;
         }
-        else
-        {
-            return block_if_data;
-        }
+        b->appendBlock(block_if_data);
+        return b;
     }
 
     CppBlockPtr Serializer::ResolveMaybeReadBlock(const std::string& accessor, const std::string& readElement, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
@@ -114,22 +134,194 @@ namespace armarx::aron::cppserializer
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR;
 
+        CppBlockPtr resolved_block = std::make_shared<CppBlock>();
+
+        if (!accessor.empty())
+        {
+            resolved_block->addLine("// Generate ReadInterface API calls for " + accessor);
+        }
+        else
+        {
+            resolved_block->addLine("// Generate ReadInterface API calls for the top level object " + ExtractCppTypename(typenavigator));
+        }
+
+        if (!readElement.empty())
+        {
+            resolved_block->addLine("auto " + read_start_result_accessor + " = " + readElement + "; // of " + accessor);
+        }
+
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
+        {
+            resolved_block->addLine("if (" + read_start_result_accessor + ".success)");
+            CppBlockPtr if_success = std::make_shared<CppBlock>();
+
+            switch (typenavigator->getMaybe())
+            {
+                case type::Maybe::eOptional:
+                {
+                    auto s = FromAronTypeNaviagtorPtr(typenavigator);
+                    if_success->addLine(accessor + " = " + s->getFullTypenameGenerator() + "();");
+                    if_success->appendBlock(block_if_data);
+                    break;
+                }
+                case type::Maybe::eRawPointer:
+                {
+                    auto s = FromAronTypeNaviagtorPtr(typenavigator);
+                    if_success->addLine(accessor + " = " + s->getFullTypenameGenerator() + "();");
+                    if_success->appendBlock(block_if_data);
+                    break;
+                }
+                case type::Maybe::eSharedPointer:
+                case type::Maybe::eUniquePointer:
+                {
+                    auto s = FromAronTypeNaviagtorPtr(typenavigator);
+                    if_success->addLine(accessor + " = " + s->getFullTypenameGenerator() + "();");
+                    if_success->appendBlock(block_if_data);
+                    break;
+                }
+                default:
+                {
+                    throw error::MaybeNotValidException("Serializer", "ResolveMaybeReadBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath());
+                }
+            }
+            resolved_block->addBlock(if_success);
+            return resolved_block;
+        }
+        resolved_block->appendBlock(block_if_data);
+        return resolved_block;
+    }
+
+    CppBlockPtr Serializer::ResolveMaybeEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
+    {
         CppBlockPtr b = std::make_shared<CppBlock>();
-        b->addLine("auto " + read_start_result_accessor + " = " + readElement + ";");
-        if (typenavigator->getMaybe() == type::Maybe::eOptional)
+        if (!accessor.empty())
+        {
+            b->addLine("// Comparing " + accessor + " and " + otherInstanceAccessor);
+        }
+        else
         {
-            b->addLine("if (" + read_start_result_accessor + ".success)");
+            b->addLine("// Comparing two objects of type " + ExtractCppTypename(typenavigator));
+        }
 
-            CppBlockPtr b2 = std::make_shared<CppBlock>();
-            b2->addLine(accessor + ".emplace();");
-            b2->appendBlock(block_if_data);
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
+        {
+            switch (typenavigator->getMaybe())
+            {
+                case type::Maybe::eOptional:
+                {
+                    b->addLine("if (" + accessor + ".has_value() and " + otherInstanceAccessor + ".has_value()) // both have a value set");
+                    b->addBlock(block_if_data);
+                    b->addLine("if ((" + accessor + ".has_value() and !" + otherInstanceAccessor + ".has_value()) or (!" + accessor + ".has_value() and " + otherInstanceAccessor + ".has_value())) // only one has a value set (XOR)");
+                    b->addLine("\t return false;");
+                    break;
+                }
+                case type::Maybe::eRawPointer:
+                {
+                    b->addLine("if (" + accessor + " != NULL and " + otherInstanceAccessor + " != NULL) // both have a value set");
+                    b->addBlock(block_if_data);
+                    b->addLine("if ((" + accessor + " != NULL and " + otherInstanceAccessor + " == NULL) or (" + accessor + " == NULL and " + otherInstanceAccessor + " != NULL)) // only one has a value set (XOR)");
+                    b->addLine("\t return false;");
+                    break;
+                }
+                case type::Maybe::eSharedPointer:
+                case type::Maybe::eUniquePointer:
+                {
+                    b->addLine("if (" + accessor + " != nullptr and " + otherInstanceAccessor + " != nullptr) // both have a value set");
+                    b->addBlock(block_if_data);
+                    b->addLine("if ((" + accessor + " != nullptr and " + otherInstanceAccessor + " == nullptr) or (" + accessor + " == nullptr and " + otherInstanceAccessor + " != nullptr)) // only one has a value set (XOR)");
+                    b->addLine("\t return false;");
+                    break;
+                }
+                default:
+                {
+                    throw error::MaybeNotValidException("Serializer", "ResolveMaybeEqualsBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath());
+                }
+            }
+            return b;
+        }
+        b->appendBlock(block_if_data);
+        return b;
+    }
 
-            b->addBlock(b2);
+    CppBlockPtr Serializer::ResolveMaybeResetSoftBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
+    {
+        CppBlockPtr b = std::make_shared<CppBlock>();
+
+        if (!accessor.empty())
+        {
+            b->addLine("// Resetting soft member " + accessor);
         }
         else
         {
-            b->appendBlock(block_if_data);
+            b->addLine("// Ressetting soft the type " + ExtractCppTypename(typenavigator));
+        }
+
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
+        {
+            switch (typenavigator->getMaybe())
+            {
+                case type::Maybe::eOptional:
+                {
+                    b->addLine("if (" + accessor + ".has_value())");
+                    b->addBlock(block_if_data);
+                    break;
+                }
+                case type::Maybe::eRawPointer:
+                {
+                    b->addLine("if (" + accessor + " != NULL)");
+                    b->addBlock(block_if_data);
+                    break;
+                }
+                case type::Maybe::eSharedPointer:
+                case type::Maybe::eUniquePointer:
+                {
+                    b->addLine("if (" + accessor + " != nullptr)");
+                    b->addBlock(block_if_data);
+                    break;
+                }
+                default:
+                {
+                    throw error::MaybeNotValidException("Serializer", "ResolveMaybeResetSoftBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath());
+                }
+            }
+            return b;
+        }
+        b->appendBlock(block_if_data);
+        return b;
+    }
+
+    CppBlockPtr Serializer::ResolveMaybeResetHardBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
+    {
+        CppBlockPtr b = std::make_shared<CppBlock>();
+        if (!accessor.empty())
+        {
+            b->addLine("// Resetting hard member " + accessor);
+        }
+        else
+        {
+            b->addLine("// Ressetting hard the type " + ExtractCppTypename(typenavigator));
+        }
+
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
+        {
+            switch (typenavigator->getMaybe())
+            {
+                case type::Maybe::eOptional:
+                case type::Maybe::eRawPointer:
+                case type::Maybe::eSharedPointer:
+                case type::Maybe::eUniquePointer:
+                {
+                    b->addLine(accessor + " = {};");
+                    break;
+                }
+                default:
+                {
+                    throw error::MaybeNotValidException("Serializer", "ResolveMaybeResetSoftBlock", "Unkown Maybe type (perhaps forgot to add in switch case?)", typenavigator->getMaybe(), typenavigator->getPath());
+                }
+            }
+            return b;
         }
+        b->appendBlock(block_if_data);
         return b;
     }
 
@@ -156,7 +348,7 @@ namespace armarx::aron::cppserializer
     std::string Serializer::ExtractCppTypename(const typenavigator::NavigatorPtr& n)
     {
         SerializerPtr cpp = Serializer::FromAronTypeNaviagtorPtr(n);
-        return cpp->getFullCppTypename();
+        return cpp->getCoreCppTypename();
     }
 
     std::vector<std::string> Serializer::ExtractCppTypenames(const std::vector<typenavigator::NavigatorPtr>& n)
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h
index 1914c0e7c..ce4f11e9b 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h
@@ -116,6 +116,9 @@ namespace armarx::aron::cppserializer
         static std::string ResolveMaybeAccessor(const std::string&, const typenavigator::NavigatorPtr&);
         static CppBlockPtr ResolveMaybeWriteBlock(const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&);
         static CppBlockPtr ResolveMaybeReadBlock(const std::string&, const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&);
+        static CppBlockPtr ResolveMaybeEqualsBlock(const std::string&, const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&);
+        static CppBlockPtr ResolveMaybeResetSoftBlock(const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&);
+        static CppBlockPtr ResolveMaybeResetHardBlock(const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&);
 
     protected:
         static const std::string READ_START_RETURN_TYPE_ACCESSOR;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp
index d5ee832a5..10b3470db 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp
@@ -30,45 +30,44 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     DictSerializer::DictSerializer(const typenavigator::DictNavigatorPtr& e) :
         detail::ContainerSerializerBase<typenavigator::DictNavigator, DictSerializer>("std::map<std::string, " + FromAronTypeNaviagtorPtr(e->getAcceptedType())->getFullCppTypename() + ">",
-                   simox::meta::get_type_name(typeid(data::AronDict)),
-                   simox::meta::get_type_name(typeid(type::AronDict)), e)
+                simox::meta::get_type_name(typeid(data::AronDict)),
+                simox::meta::get_type_name(typeid(type::AronDict)), e)
     {
     }
 
     // virtual implementations
     CppBlockPtr DictSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = {};");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
+
+        block_if_data->addLine(accessor + nextEl() + "clear();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr DictSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = {};");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr DictSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartDict({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
-
-        std::string escaped_accessor = EscapeAccessor(accessor);
-        std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR;
+        b->addLine("w.writeStartDict({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
 
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
         CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getFullCppTypename());
         b->appendBlock(b2);
-        b->addLine("w.writeEndDict();");
+        b->addLine("w.writeEndDict(); // of " + accessor);
         return b;
     }
 
     CppBlockPtr DictSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
-        block_if_data->addLine("w.writeStartDict();");
+        block_if_data->addLine("w.writeStartDict(); // of " + accessor);
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator_key = escaped_accessor + DICT_KEY_ACCESSOR;
@@ -83,7 +82,7 @@ namespace armarx::aron::cppserializer::serializer
         b2->addLine("w.writeKey(" + accessor_iterator_key + ");");
         b2->appendBlock(type_s->getWriteBlock(accessor_iterator_val));
         block_if_data->addBlock(b2);
-        block_if_data->addLine("w.writeEndDict();");
+        block_if_data->addLine("w.writeEndDict(); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -98,10 +97,10 @@ namespace armarx::aron::cppserializer::serializer
 
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
 
-        block_if_data->addLine("while(!r.readEndDict())");
+        block_if_data->addLine("while(!r.readEndDict()) // of " + accessor);
         CppBlockPtr b2 = CppBlockPtr(new CppBlock());
 
-        b2->addLine("std::string " + accessor_iterator_key + " = r.readKey();");
+        b2->addLine("std::string " + accessor_iterator_key + " = r.readKey(); // in dict " + accessor);
         b2->addLine(type_s->getFullCppTypename() + " " + accessor_iterator + ";");
         b2->appendBlock(type_s->getReadBlock(accessor_iterator));
         b2->addLine(accessor + nextEl() + "insert({" + accessor_iterator_key + ", " + accessor_iterator + "});");
@@ -112,10 +111,10 @@ namespace armarx::aron::cppserializer::serializer
 
     CppBlockPtr DictSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp
index 1aa21fe91..b0fb56473 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp
@@ -29,43 +29,45 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     ListSerializer::ListSerializer(const typenavigator::ListNavigatorPtr& e) :
         detail::ContainerSerializerBase<typenavigator::ListNavigator, ListSerializer>("std::vector<" + FromAronTypeNaviagtorPtr(e->getAcceptedType())->getFullCppTypename() + ">",
-                   simox::meta::get_type_name(typeid(data::AronList)),
-                   simox::meta::get_type_name(typeid(type::AronList)), e)
+                simox::meta::get_type_name(typeid(data::AronList)),
+                simox::meta::get_type_name(typeid(type::AronList)), e)
     {
     }
 
     CppBlockPtr ListSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = {};");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
+
+        block_if_data->addLine(accessor + nextEl() + "clear();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr ListSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = {};");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr ListSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr ListSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
 
-        b->addLine("w.writeStartList({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeStartList({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
 
         CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getFullCppTypename());
         b->appendBlock(b2);
 
-        b->addLine("w.writeEndList();");
+        b->addLine("w.writeEndList(); // of " + accessor);
         return b;
     }
 
     CppBlockPtr ListSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeStartList();");
+        block_if_data->addLine("w.writeStartList(); // of " + accessor);
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + LIST_ITERATOR_ACCESSOR;
@@ -73,7 +75,7 @@ namespace armarx::aron::cppserializer::serializer
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
         block_if_data->addLine("for(unsigned int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "size(); ++" + accessor_iterator + ")");
         block_if_data->addBlock(type_s->getWriteBlock(accessor + nextEl() + "at(" + accessor_iterator + ")"));
-        block_if_data->addLine("w.writeEndList();");
+        block_if_data->addLine("w.writeEndList(); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -85,7 +87,7 @@ namespace armarx::aron::cppserializer::serializer
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + LIST_ITERATOR_ACCESSOR;
 
-        block_if_data->addLine("while(!r.readEndList())");
+        block_if_data->addLine("while(!r.readEndList()) // of " + accessor);
         CppBlockPtr b2 = CppBlockPtr(new CppBlock());
 
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
@@ -99,9 +101,9 @@ namespace armarx::aron::cppserializer::serializer
 
     CppBlockPtr ListSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp
index c5dd78ce3..1ffbe7db2 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp
@@ -30,50 +30,38 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     ObjectSerializer::ObjectSerializer(const typenavigator::ObjectNavigatorPtr& e) :
         detail::ContainerSerializerBase<typenavigator::ObjectNavigator, ObjectSerializer>(e->getObjectName(),
-                   simox::meta::get_type_name(typeid(data::AronDict)),
-                   simox::meta::get_type_name(typeid(type::AronObject)), e)
+                simox::meta::get_type_name(typeid(data::AronDict)),
+                simox::meta::get_type_name(typeid(type::AronObject)), e)
     {
     }
 
     CppBlockPtr ObjectSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->getMaybe() != type::Maybe::eNone)
-        {
-            b->addLine(accessor + " = {};");
-        }
-        else
-        {
-            b->addLine(accessor + nextEl() + "resetSoft();");
-        }
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
+
+        block_if_data->addLine(accessor + nextEl() + "resetSoft();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr ObjectSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->getMaybe() != type::Maybe::eNone)
-        {
-            b->addLine(accessor + " = {};");
-        }
-        else
-        {
-            b->addLine(accessor + nextEl() + "resetHard();");
-        }
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr ObjectSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + "::writeType(w, " + MAYBE_TO_STRING(typenavigator->getMaybe()) + ");");
+        b->addLine(accessor + "::writeType(w, " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "); // of " + accessor);
         return b;
     }
 
     CppBlockPtr ObjectSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine(accessor + nextEl() + "write(w);");
+        block_if_data->addLine(accessor + nextEl() + "write(w); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -81,16 +69,16 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr ObjectSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine(accessor + nextEl() + "read(r, true);");
+        block_if_data->addLine(accessor + nextEl() + "read(r, true); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartDict()", block_if_data, typenavigator);
     }
 
     CppBlockPtr ObjectSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp
index 5b7fac538..6f78c2996 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp
@@ -29,55 +29,37 @@ namespace armarx::aron::cppserializer::serializer
 {
     PairSerializer::PairSerializer(const typenavigator::PairNavigatorPtr& e) :
         detail::ContainerSerializerBase<typenavigator::PairNavigator, PairSerializer>("std::pair<" + ExtractCppTypename(e->getFirstAcceptedType()) + ", " + ExtractCppTypename(e->getSecondAcceptedType()) + ">",
-                   simox::meta::get_type_name(typeid(data::AronList)),
-                   simox::meta::get_type_name(typeid(type::AronPair)), e)
+                simox::meta::get_type_name(typeid(data::AronList)),
+                simox::meta::get_type_name(typeid(type::AronPair)), e)
     {
     }
 
     CppBlockPtr PairSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->getMaybe() != type::Maybe::eNone)
-        {
-            b->addLine(accessor + " = {};");
-        }
-        else
-        {
-            auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
-            CppBlockPtr b21 = child_s1->getResetHardBlock(accessor + nextEl() + "first");
-            b->appendBlock(b21);
-
-            auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
-            CppBlockPtr b22 = child_s2->getResetHardBlock(accessor + nextEl() + "second");
-            b->appendBlock(b22);
-        }
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PairSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->getMaybe() != type::Maybe::eNone)
-        {
-            b->addLine(accessor + " = {};");
-        }
-        else
-        {
-            auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
-            CppBlockPtr b21 = child_s1->getResetSoftBlock(accessor + nextEl() + "first");
-            b->appendBlock(b21);
-
-            auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
-            CppBlockPtr b22 = child_s2->getResetSoftBlock(accessor + nextEl() + "second");
-            b->appendBlock(b22);
-        }
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
+
+        auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
+        CppBlockPtr b21 = child_s1->getResetSoftBlock(accessor + nextEl() + "first");
+        block_if_data->appendBlock(b21);
+
+        auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
+        CppBlockPtr b22 = child_s2->getResetSoftBlock(accessor + nextEl() + "second");
+        block_if_data->appendBlock(b22);
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PairSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartPair({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeStartPair({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
 
         std::string escaped_accessor = EscapeAccessor(accessor);
 
@@ -93,14 +75,14 @@ namespace armarx::aron::cppserializer::serializer
         CppBlockPtr b22 = child_s2->getWriteTypeBlock(accessor_iterator2);
         b->appendBlock(b22);
 
-        b->addLine("w.writeEndPair();");
+        b->addLine("w.writeEndPair(); // of " + accessor);
         return b;
     }
 
     CppBlockPtr PairSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeStartList();");
+        block_if_data->addLine("w.writeStartList(); // of " + accessor);
 
         auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
         CppBlockPtr b21 = child_s1->getWriteBlock(accessor + nextEl() + "first");
@@ -110,7 +92,7 @@ namespace armarx::aron::cppserializer::serializer
         CppBlockPtr b22 = child_s2->getWriteBlock(accessor + nextEl() + "second");
         block_if_data->appendBlock(b22);
 
-        block_if_data->addLine("w.writeEndList();");
+        block_if_data->addLine("w.writeEndList(); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -127,16 +109,16 @@ namespace armarx::aron::cppserializer::serializer
         CppBlockPtr b22 = child_s2->getReadBlock(accessor + nextEl() + "second");
         block_if_data->appendBlock(b22);
 
-        block_if_data->addLine("r.readEndList();");
+        block_if_data->addLine("r.readEndList(); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PairSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp
index 643f16570..dab5b33a0 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp
@@ -29,55 +29,37 @@ namespace armarx::aron::cppserializer::serializer
 {
     TupleSerializer::TupleSerializer(const typenavigator::TupleNavigatorPtr& e) :
         detail::ContainerSerializerBase<typenavigator::TupleNavigator, TupleSerializer>("std::tuple<" + simox::alg::join(ExtractCppTypenames(e->getAcceptedTypes()), ", ") + ">",
-                   simox::meta::get_type_name(typeid(data::AronList)),
-                   simox::meta::get_type_name(typeid(type::AronTuple)), e)
+                simox::meta::get_type_name(typeid(data::AronList)),
+                simox::meta::get_type_name(typeid(type::AronTuple)), e)
     {
     }
 
     CppBlockPtr TupleSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->getMaybe() != type::Maybe::eNone)
-        {
-            b->addLine(accessor + " = {};");
-        }
-        else
-        {
-            unsigned int i = 0;
-            for (const auto& child : typenavigator->getAcceptedTypes())
-            {
-                auto child_s = FromAronTypeNaviagtorPtr(child);
-                CppBlockPtr b2 = child_s->getResetHardBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
-                b->appendBlock(b2);
-            }
-        }
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr TupleSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->getMaybe() != type::Maybe::eNone)
-        {
-            b->addLine(accessor + " = {};");
-        }
-        else
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
+
+        unsigned int i = 0;
+        for (const auto& child : typenavigator->getAcceptedTypes())
         {
-            unsigned int i = 0;
-            for (const auto& type : typenavigator->getAcceptedTypes())
-            {
-                auto type_s = FromAronTypeNaviagtorPtr(type);
-                CppBlockPtr b2 = type_s->getResetSoftBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
-                b->appendBlock(b2);
-            }
+            auto child_s = FromAronTypeNaviagtorPtr(child);
+            CppBlockPtr b2 = child_s->getResetSoftBlock("std::get<" + std::to_string(i++) + ">(" + resolved_accessor + ")");
+            block_if_data->appendBlock(b2);
         }
-        return b;
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr TupleSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartTuple({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeStartTuple({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         unsigned int i = 0;
@@ -89,14 +71,14 @@ namespace armarx::aron::cppserializer::serializer
             CppBlockPtr b2 = type_s->getWriteTypeBlock(accessor_iterator);
             b->appendBlock(b2);
         }
-        b->addLine("w.writeEndTuple();");
+        b->addLine("w.writeEndTuple(); // of " + accessor);
         return b;
     }
 
     CppBlockPtr TupleSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeStartList();");
+        block_if_data->addLine("w.writeStartList(); // of " + accessor);
 
         std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
 
@@ -107,7 +89,7 @@ namespace armarx::aron::cppserializer::serializer
             CppBlockPtr b2 = type_s->getWriteBlock("std::get<" + std::to_string(i++) + ">(" + resolved_accessor + ")");
             block_if_data->appendBlock(b2);
         }
-        block_if_data->addLine("w.writeEndList();");
+        block_if_data->addLine("w.writeEndList(); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -125,16 +107,16 @@ namespace armarx::aron::cppserializer::serializer
             CppBlockPtr b2 = type_s->getReadBlock("std::get<" + std::to_string(i++) + ">(" + resolved_accessor + ")");
             block_if_data->appendBlock(b2);
         }
-        block_if_data->addLine("r.readEndList();");
+        block_if_data->addLine("r.readEndList(); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator);
     }
 
     CppBlockPtr TupleSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/PrimitiveSerializerBase.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/PrimitiveSerializerBase.h
index ef187424d..171f4defb 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/PrimitiveSerializerBase.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/PrimitiveSerializerBase.h
@@ -46,23 +46,23 @@ namespace armarx::aron::cppserializer::detail
 
         virtual CppBlockPtr getResetHardBlock(const std::string& accessor) const
         {
-            CppBlockPtr b = CppBlockPtr(new CppBlock());
-            b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-            return b;
+            CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+            block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+            return this->ResolveMaybeResetHardBlock(accessor, block_if_data, this->typenavigator);
         }
 
         virtual CppBlockPtr getResetSoftBlock(const std::string& accessor) const
         {
-            CppBlockPtr b = CppBlockPtr(new CppBlock());
-            b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
-            return b;
+            CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+            block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();");
+            return this->ResolveMaybeResetSoftBlock(accessor, block_if_data, this->typenavigator);
         }
 
         virtual CppBlockPtr getWriteBlock(const std::string& accessor) const override
         {
             CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
             std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator);
-            block_if_data->addLine("w.writePrimitive(" + resolved_accessor + ");");
+            block_if_data->addLine("w.writePrimitive(" + resolved_accessor + "); // of " + accessor);
 
             return this->ResolveMaybeWriteBlock(accessor, block_if_data, this->typenavigator);
         }
@@ -71,16 +71,16 @@ namespace armarx::aron::cppserializer::detail
         {
             CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
             std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator);
-            block_if_data->addLine("r.readEndPrimitive(" + resolved_accessor + ");");
+            block_if_data->addLine("r.readEndPrimitive(" + resolved_accessor + "); // of " + accessor);
             return this->ResolveMaybeReadBlock(accessor, "r.readStartPrimitive()", block_if_data, this->typenavigator);
         }
 
         virtual CppBlockPtr getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const override
         {
-            CppBlockPtr b = CppBlockPtr(new CppBlock());
-            b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
-            b->addLine("\t return false;");
-            return b;
+            CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+            block_if_data->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
+            block_if_data->addLine("\t return false;");
+            return this->ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, this->typenavigator);
         }
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/SerializerBase.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/SerializerBase.h
index 06370ed75..4b2dd5f89 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/SerializerBase.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/SerializerBase.h
@@ -60,7 +60,7 @@ namespace armarx::aron::cppserializer::detail
                 case type::Maybe::eOptional:
                     return "std::optional<" + getCoreCppTypename() + ">";
                 case type::Maybe::eRawPointer:
-                    return "*" + getCoreCppTypename();
+                    return getCoreCppTypename() + "*";
                 case type::Maybe::eSharedPointer:
                     return "std::shared_ptr<" + getCoreCppTypename() + ">";
                 case type::Maybe::eUniquePointer:
@@ -124,6 +124,20 @@ namespace armarx::aron::cppserializer::detail
             }
         }
 
+        std::string toPointerAccessor(const std::string& accessor) const
+        {
+            switch (typenavigator->getMaybe())
+            {
+                case type::Maybe::eRawPointer:
+                    return accessor;
+                case type::Maybe::eSharedPointer:
+                case type::Maybe::eUniquePointer:
+                    return accessor + ".get()";
+                default:
+                    throw error::MaybeNotValidException("SerializerBase", "toPointerAccessor", "Received invalid maybe enum (not a pointer?)", typenavigator->getMaybe(), typenavigator->getPath());
+            }
+        }
+
     protected:
         typename TypenavigatorT::PointerType typenavigator;
     };
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp
index 73b9cfa58..e412f52b5 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp
@@ -29,23 +29,18 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     IntEnumSerializer::IntEnumSerializer(const typenavigator::IntEnumNavigatorPtr& e) :
         detail::SerializerBase<typenavigator::IntEnumNavigator, IntEnumSerializer>(e->getEnumName(),
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronIntEnum)), e)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronIntEnum)), e)
     {
     }
 
     CppBlockPtr IntEnumSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->getMaybe() != type::Maybe::eNone)
-        {
-            b->addLine(accessor + " = {};");
-        }
-        else
-        {
-            b->addLine(accessor + nextEl() + "resetSoft();");
-        }
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
+
+        block_if_data->addLine(accessor + nextEl() + "resetSoft();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr IntEnumSerializer::getWriteTypeBlock(const std::string& accessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp
index 34c90f38a..790d6157d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp
@@ -41,37 +41,37 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     EigenMatrixSerializer::EigenMatrixSerializer(const typenavigator::EigenMatrixNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::EigenMatrixNavigator, EigenMatrixSerializer>("Eigen::Matrix<" + ACCEPTED_TYPES.at(n->getTypename()).first + ", " + std::to_string(n->getRows()) + ", " + std::to_string(n->getCols()) + ">",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronEigenMatrix)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronEigenMatrix)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr EigenMatrixSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr EigenMatrixSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr EigenMatrixSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr EigenMatrixSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeEigenMatrix({" + std::to_string(typenavigator->getRows()) + ", " + std::to_string(typenavigator->getCols()) + ", \"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeEigenMatrix({(int) " + std::to_string(typenavigator->getRows()) + ", (int) " + std::to_string(typenavigator->getCols()) + ", \"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr EigenMatrixSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "rows(), " + accessor + nextEl() + "cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data()));");
+        block_if_data->addLine("w.writeNDArray({(int) " + accessor + nextEl() + "rows(), (int) " + accessor + nextEl() + "cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -79,15 +79,15 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr EigenMatrixSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data()));");
+        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr EigenMatrixSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + ResolveMaybeAccessor(otherInstanceAccessor, typenavigator) + ")))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + ResolveMaybeAccessor(otherInstanceAccessor, typenavigator) + ")))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp
index 17eca9bd2..8e697ab6d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp
@@ -36,37 +36,37 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     EigenQuaternionSerializer::EigenQuaternionSerializer(const typenavigator::EigenQuaternionNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::EigenQuaternionNavigator, EigenQuaternionSerializer>("Eigen::Quaternion<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronEigenQuaternion)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronEigenQuaternion)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr EigenQuaternionSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr EigenQuaternionSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr EigenQuaternionSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr EigenQuaternionSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeEigenQuaternion({\"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeEigenQuaternion({\"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr EigenQuaternionSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data()));");
+        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -74,15 +74,15 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr EigenQuaternionSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data()));");
+        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr EigenQuaternionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp
index f7f4a1d03..e33934d35 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp
@@ -37,37 +37,41 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     IVTCByteImageSerializer::IVTCByteImageSerializer(const typenavigator::IVTCByteImageNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::IVTCByteImageNavigator, IVTCByteImageSerializer>("CByteImage",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronIVTCByteImage)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronIVTCByteImage)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
+        if (typenavigator->getMaybe() == type::Maybe::eNone or typenavigator->getMaybe() == type::Maybe::eOptional)
+        {
+            throw error::MaybeNotValidException("IVTCByteImageSerializer", "IVTCByteImageSerializer", "An IVTCByteImage must be a pointer!", typenavigator->getMaybe(), typenavigator->getPath());
+        }
     }
 
     CppBlockPtr IVTCByteImageSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr IVTCByteImageSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + nextEl() + "Set(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + accessor + nextEl() + "type);");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + nextEl() + "Set(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + accessor + nextEl() + "type);");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr IVTCByteImageSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr IVTCByteImageSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeIVTCByteImage({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeIVTCByteImage({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr IVTCByteImageSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + accessor + nextEl() + "bytesPerPixel}, std::to_string(" + accessor + nextEl() + "type), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "pixels));");
+        block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + accessor + nextEl() + "bytesPerPixel}, std::to_string(" + accessor + nextEl() + "type), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "pixels)); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -79,18 +83,18 @@ namespace armarx::aron::cppserializer::serializer
         std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR;
 
         block_if_data->addLine(accessor + nextEl() + "Set(" + read_start_result_accessor + ".dims[0], " + read_start_result_accessor + ".dims[1], static_cast<CByteImage::ImageType>(std::stoi(" + read_start_result_accessor + ".type)));");
-        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "pixels));");
+        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "pixels)); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr IVTCByteImageSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + nextEl() + "IsCompatible(" + otherInstanceAccessor + ".get())))");
-        b->addLine("\t return false;");
-        b->addLine("if (not (memcmp(" + accessor + nextEl() + "pixels, " + otherInstanceAccessor + nextEl() + "pixels, " + accessor + nextEl() + "width * " + accessor + nextEl() + "height * " + accessor + nextEl() + "bytesPerPixel) == 0))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + nextEl() + "IsCompatible(" + toPointerAccessor(otherInstanceAccessor) + ")))");
+        block_if_data->addLine("\t return false;");
+        block_if_data->addLine("if (not (memcmp(" + accessor + nextEl() + "pixels, " + otherInstanceAccessor + nextEl() + "pixels, " + accessor + nextEl() + "width * " + accessor + nextEl() + "height * " + accessor + nextEl() + "bytesPerPixel) == 0))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/NDArray.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/NDArray.cpp
index 43e7f183f..67eb03720 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/NDArray.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/NDArray.cpp
@@ -29,24 +29,24 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     NDArraySerializer::NDArraySerializer(const typenavigator::NDArrayNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::NDArrayNavigator, NDArraySerializer>("NDArray",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronNDArray)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronNDArray)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr NDArraySerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr NDArraySerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr NDArraySerializer::getWriteTypeBlock(const std::string&) const
@@ -69,8 +69,8 @@ namespace armarx::aron::cppserializer::serializer
 
     CppBlockPtr NDArraySerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp
index 3631eb1ff..da0e3c013 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp
@@ -41,20 +41,13 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     OpenCVMatSerializer::OpenCVMatSerializer(const typenavigator::OpenCVMatNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::OpenCVMatNavigator, OpenCVMatSerializer>("cv::Mat",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronOpenCVMat)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronOpenCVMat)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
-    CppBlockPtr OpenCVMatSerializer::getResetHardBlock(const std::string& accessor) const
-    {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
-    }
-
-    CppBlockPtr OpenCVMatSerializer::getResetSoftBlock(const std::string& accessor) const
+    std::pair<CppBlockPtr, std::string> OpenCVMatSerializer::getDimensionsFromAccessor(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
 
@@ -66,15 +59,35 @@ namespace armarx::aron::cppserializer::serializer
         b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "dims; ++" + accessor_iterator + ")");
         CppBlockPtr b2 = CppBlockPtr(new CppBlock());
         b2->addLine(accessor_dimensions + ".push_back(" + accessor + nextEl() + "size[" + accessor_iterator + "]);");
-        b->appendBlock(b2);
-        b->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor_dimensions + ", " + accessor + nextEl() + "type());");
-        return b;
+        b->addBlock(b2);
+        return {b, accessor_dimensions};
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getResetHardBlock(const std::string& accessor) const
+    {
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getResetSoftBlock(const std::string& accessor) const
+    {
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+
+        auto [get_dim_block, accessor_dimensions] = getDimensionsFromAccessor(accessor);
+        block_if_data->appendBlock(get_dim_block);
+        block_if_data->addLine("if (!" + accessor_dimensions + ".empty())");
+        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
+        b2->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor_dimensions + ", " + accessor + nextEl() + "type());");
+        block_if_data->addBlock(b2);
+
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr OpenCVMatSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr OpenCVMatSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeOpenCVMat({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeOpenCVMat({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
@@ -83,16 +96,11 @@ namespace armarx::aron::cppserializer::serializer
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
 
         std::string escaped_accessor = EscapeAccessor(accessor);
-        std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR;
-        std::string accessor_iterator = escaped_accessor + ITERATOR_ACCESSOR;
 
-        block_if_data->addLine("std::vector<int> " + accessor_dimensions + ";");
-        block_if_data->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "dims; ++" + accessor_iterator + ")");
-        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
-        b2->addLine(accessor_dimensions + ".push_back(" + accessor + nextEl() + "size[" + accessor_iterator + "]);");
-        block_if_data->appendBlock(b2);
+        auto [get_dim_block, accessor_dimensions] = getDimensionsFromAccessor(accessor);
+        block_if_data->appendBlock(get_dim_block);
         block_if_data->addLine(accessor_dimensions + ".push_back(" + accessor + nextEl() + "elemSize());");
-        block_if_data->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + nextEl() + "type()), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data));");
+        block_if_data->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + nextEl() + "type()), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data)); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -103,17 +111,21 @@ namespace armarx::aron::cppserializer::serializer
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR;
 
-        block_if_data->addLine(accessor + " = " + getCoreCppTypename() + "(std::vector<int>({" + read_start_result_accessor + ".dims.begin(), std::prev(" + read_start_result_accessor + ".dims.end())}), std::stoi(" + read_start_result_accessor + ".type));");
-        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data));");
+        block_if_data->addLine("if (!" + read_start_result_accessor + ".dims.empty())");
+        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
+        b2->addLine(accessor + " = " + getCoreCppTypename() + "(std::vector<int>({" + read_start_result_accessor + ".dims.begin(), std::prev(" + read_start_result_accessor + ".dims.end())}), std::stoi(" + read_start_result_accessor + ".type));");
+        b2->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data)); // of " + accessor);
+        block_if_data->addBlock(b2);
+
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr OpenCVMatSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (cv::countNonZero(" + accessor + " != " + otherInstanceAccessor + ") != 0)");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (cv::countNonZero(" + accessor + " != " + otherInstanceAccessor + ") != 0)");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h
index 089891a87..4ed162490 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h
@@ -40,7 +40,7 @@ namespace armarx::aron::cppserializer::serializer
     typedef std::shared_ptr<OpenCVMatSerializer> AronOpenCVMatTypeCppSerializerPtr;
 
     class OpenCVMatSerializer :
-            virtual public detail::NDArraySerializerBase<typenavigator::OpenCVMatNavigator, OpenCVMatSerializer>
+        virtual public detail::NDArraySerializerBase<typenavigator::OpenCVMatNavigator, OpenCVMatSerializer>
     {
     public:
         using PointerType = AronOpenCVMatTypeCppSerializerPtr;
@@ -57,10 +57,14 @@ namespace armarx::aron::cppserializer::serializer
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
         virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
+    private:
+        std::pair<CppBlockPtr, std::string> getDimensionsFromAccessor(const std::string& accessor) const;
+
     private:
         // members
         static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES;
         static constexpr const char* ITERATOR_ACCESSOR = "_iterator";
         static constexpr const char* DIMENSION_ACCESSOR = "_dimensions";
+        static constexpr const char* NUM_DIMENSION_ACCESSOR = "_num_dimensions";
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp
index 13023745e..c10d1adfb 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp
@@ -29,37 +29,37 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     OrientationSerializer::OrientationSerializer(const typenavigator::OrientationNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::OrientationNavigator, OrientationSerializer>("Eigen::Quaternion<" + n->ACCEPTED_TYPE + ">",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronOrientation)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronOrientation)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr OrientationSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr OrientationSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr OrientationSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr OrientationSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeOrientation({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeOrientation({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr OrientationSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data()));");
+        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -67,16 +67,16 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr OrientationSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data()));");
+        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "coeffs().data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr OrientationSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp
index 09196a8b6..8229554f6 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp
@@ -42,44 +42,37 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     PCLPointCloudSerializer::PCLPointCloudSerializer(const typenavigator::PCLPointCloudNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::PCLPointCloudNavigator, PCLPointCloudSerializer>("pcl::PointCloud<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronPCLPointCloud)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronPCLPointCloud)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr PCLPointCloudSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PCLPointCloudSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->getMaybe() != type::Maybe::eNone)
-        {
-            b->addLine(accessor + " = {};");
-        }
-        else
-        {
-            b->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height);");
-        }
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height);");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr PCLPointCloudSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr PCLPointCloudSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writePCLPointCloud({\"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writePCLPointCloud({\"" + typenavigator->getTypename() + "\", " + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr PCLPointCloudSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "points.data()));");
+        block_if_data->addLine("w.writeNDArray({" + accessor + nextEl() + "width, " + accessor + nextEl() + "height, " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "points.data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -91,18 +84,18 @@ namespace armarx::aron::cppserializer::serializer
         std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR;
 
         block_if_data->addLine(accessor + " = " + getCoreCppTypename() + "(" + read_start_result_accessor + ".dims[0], " + read_start_result_accessor + ".dims[1]);");
-        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "points.data()));");
+        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "points.data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PCLPointCloudSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (" + accessor + nextEl() + "width != " + otherInstanceAccessor + nextEl() + "width || " + accessor + nextEl() + "height != " + otherInstanceAccessor + nextEl() + "height)");
-        b->addLine("\t return false;");
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (" + accessor + nextEl() + "width != " + otherInstanceAccessor + nextEl() + "width || " + accessor + nextEl() + "height != " + otherInstanceAccessor + nextEl() + "height)");
+        block_if_data->addLine("\t return false;");
         //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)");
         //b->addLine("\t return false;");
-        return b;
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp
index f755e5442..93e340f51 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp
@@ -29,37 +29,37 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     PoseSerializer::PoseSerializer(const typenavigator::PoseNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::PoseNavigator, PoseSerializer>("Eigen::Matrix<" + n->ACCEPTED_TYPE + ", " + simox::alg::to_string(n->ACCEPTED_DIMENSION, ", ") + ">",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronPose)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronPose)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr PoseSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PoseSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr PoseSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr PoseSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writePose({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writePose({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr PoseSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data()));");
+        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -67,16 +67,16 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr PoseSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data()));");
+        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PoseSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp
index 109294d85..b4409c2f9 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp
@@ -29,37 +29,37 @@ namespace armarx::aron::cppserializer::serializer
     // constructors
     PositionSerializer::PositionSerializer(const typenavigator::PositionNavigatorPtr& n) :
         detail::NDArraySerializerBase<typenavigator::PositionNavigator, PositionSerializer>("Eigen::Matrix<" + n->ACCEPTED_TYPE + ", " + simox::alg::to_string(n->ACCEPTED_DIMENSION, ", ") + ">",
-                   simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronPosition)), n)
+                simox::meta::get_type_name(typeid(data::AronNDArray)),
+                simox::meta::get_type_name(typeid(type::AronPosition)), n)
     {
         ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr PositionSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PositionSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + " = " + this->getFullCppTypename() + "();");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr PositionSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr PositionSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writePosition({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writePosition({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
     CppBlockPtr PositionSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data()));");
+        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->ACCEPTED_DIMENSION, ", ") + ", 4}, \"" + typenavigator->ACCEPTED_TYPE + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
 
         return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
@@ -67,16 +67,16 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr PositionSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data()));");
+        block_if_data->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + nextEl() + "data())); // of " + accessor);
         return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PositionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Bool.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Bool.cpp
index cb0dcfdbb..c0bb65832 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Bool.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Bool.cpp
@@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer
     }
 
     /* virtual implementations */
-    CppBlockPtr BoolSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr BoolSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeBool({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeBool({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Double.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Double.cpp
index aa1b6deb2..62a47a280 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Double.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Double.cpp
@@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer
     }
 
     /* virtual implementations */
-    CppBlockPtr DoubleSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr DoubleSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeDouble({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeDouble({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Float.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Float.cpp
index b48272103..06cbd8c1a 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Float.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Float.cpp
@@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer
     }
 
     /* virtual implementations */
-    CppBlockPtr FloatSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr FloatSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeFloat({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeFloat({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Int.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Int.cpp
index fb460dffb..7458faa28 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Int.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Int.cpp
@@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer
     }
 
     /* virtual implementations */
-    CppBlockPtr IntSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr IntSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeInt({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeInt({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.cpp
index 90f03a5f5..754f4818d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.cpp
@@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer
     }
 
     /* virtual implementations */
-    CppBlockPtr LongSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr LongSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeLong({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeLong({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.cpp
index f815628ff..89e3603ee 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.cpp
@@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer
     }
 
     /* virtual implementations */
-    CppBlockPtr StringSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr StringSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeString({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeString({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.cpp
index 39e5c6717..e76d5e1ba 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.cpp
@@ -39,10 +39,10 @@ namespace armarx::aron::cppserializer::serializer
     }
 
     /* virtual implementations */
-    CppBlockPtr TimeSerializer::getWriteTypeBlock(const std::string&) const
+    CppBlockPtr TimeSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeTime({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeTime({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "}); // of " + accessor);
         return b;
     }
 
@@ -50,7 +50,7 @@ namespace armarx::aron::cppserializer::serializer
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator);
-        block_if_data->addLine("w.writePrimitive(" + resolved_accessor + nextEl() + "toMicroSeconds());");
+        block_if_data->addLine("w.writePrimitive(" + resolved_accessor + nextEl() + "toMicroSeconds()); // of " + accessor);
 
         return this->ResolveMaybeWriteBlock(accessor, block_if_data, this->typenavigator);
     }
@@ -58,12 +58,12 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr TimeSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-        std::string escaped_accessor = this->EscapeAccessor(accessor);
-        std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator);
+        std::string escaped_accessor = EscapeAccessor(accessor);
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
         block_if_data->addLine("long " + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + ";");
-        block_if_data->addLine("r.readEndPrimitive(" + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + ");");
-        block_if_data->addLine(accessor + nextEl() + "microSeconds(" + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + ");");
-        return this->ResolveMaybeReadBlock(accessor, "r.readStartPrimitive()", block_if_data, this->typenavigator);
+        block_if_data->addLine("r.readEndPrimitive(" + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + "); // of " + accessor);
+        block_if_data->addLine(resolved_accessor + " = IceUtil::Time::microSeconds(" + escaped_accessor + TIME_SETTER_ACCESSOR_SUFFIX + ");");
+        return this->ResolveMaybeReadBlock(accessor, "r.readStartPrimitive()", block_if_data, typenavigator);
     }
 
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
index 6f1fa5a13..e4d844b9e 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
@@ -66,59 +66,59 @@ namespace armarx::aron::cppserializer::serializer
         enum_to_value << "\t}";
         value_to_enum << "\t}";
 
-        fields.push_back(std::make_shared<CppField>("const std::map<" + std::string(IMPL_ENUM) + ", std::string>", "EnumToStringMap", enum_to_name.str()));
-        fields.push_back(std::make_shared<CppField>("const std::map<std::string, " + std::string(IMPL_ENUM) + ">", "StringToEnumMap", name_to_enum.str()));
-        fields.push_back(std::make_shared<CppField>("const std::map<" + std::string(IMPL_ENUM) + ", int>", "EnumToValueMap", enum_to_value.str()));
-        fields.push_back(std::make_shared<CppField>("const std::map<int, " + std::string(IMPL_ENUM) + ">", "ValueToEnumMap", value_to_enum.str()));
+        fields.push_back(std::make_shared<CppField>("const std::map<" + std::string(IMPL_ENUM) + ", std::string>", "EnumToStringMap", enum_to_name.str(), "Mapping enum values to readable strings"));
+        fields.push_back(std::make_shared<CppField>("const std::map<std::string, " + std::string(IMPL_ENUM) + ">", "StringToEnumMap", name_to_enum.str(), "Mapping readable strings to enum values"));
+        fields.push_back(std::make_shared<CppField>("const std::map<" + std::string(IMPL_ENUM) + ", int>", "EnumToValueMap", enum_to_value.str(), "Mapping enum values to a int value"));
+        fields.push_back(std::make_shared<CppField>("const std::map<int, " + std::string(IMPL_ENUM) + ">", "ValueToEnumMap", value_to_enum.str(), "Mapping int values to a enum"));
 
-        fields.push_back(std::make_shared<CppField>(std::string(IMPL_ENUM), "value"));
+        fields.push_back(std::make_shared<CppField>(std::string(IMPL_ENUM), "value", "", "The current value of the enum object"));
 
         return fields;
     }
 
-    CppBlockPtr IntEnumClassSerializer::getResetSoftBlock(const std::string&) const
+    CppBlockPtr IntEnumClassSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("value = {};");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("value = {};");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr IntEnumClassSerializer::getResetHardBlock(const std::string&) const
+    CppBlockPtr IntEnumClassSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("value = {};");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("value = {};");
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr IntEnumClassSerializer::getWriteTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeInt({__aronMaybeType});");
+        b->addLine("w.writeInt({__aronMaybeType}); // of top level enum " + getCoreCppTypename());
         return b;
     }
 
-    CppBlockPtr IntEnumClassSerializer::getWriteBlock(const std::string&) const
+    CppBlockPtr IntEnumClassSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writePrimitive(EnumToValueMap.at(value));");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("w.writePrimitive(EnumToValueMap.at(value)); // of top level enum " + getCoreCppTypename());
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr IntEnumClassSerializer::getReadBlock(const std::string&) const
+    CppBlockPtr IntEnumClassSerializer::getReadBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("int temporary;");
-        b->addLine("r.readEndPrimitive(temporary);");
-        b->addLine("value = ValueToEnumMap.at(temporary);");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("int temporary;");
+        block_if_data->addLine("r.readEndPrimitive(temporary); // of top level enum " + getCoreCppTypename());
+        block_if_data->addLine("value = ValueToEnumMap.at(temporary);");
+        return ResolveMaybeReadBlock(accessor, "r.readStartPrimitive()", block_if_data, typenavigator);
     }
 
-    CppBlockPtr IntEnumClassSerializer::getEqualsBlock(const std::string&, const std::string& otherInstanceAccessor) const
+    CppBlockPtr IntEnumClassSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (value == " + otherInstanceAccessor + ".value))");
-        b->addLine("\t return false;");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("if (not (value == " + otherInstanceAccessor + ".value))");
+        block_if_data->addLine("\t return false;");
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp
index f4d2f4fe9..e674c2445 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp
@@ -61,40 +61,40 @@ namespace armarx::aron::cppserializer::serializer
         return b;
     }
 
-    CppBlockPtr ObjectClassSerializer::getResetSoftBlock(const std::string&) const
+    CppBlockPtr ObjectClassSerializer::getResetSoftBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         if (typenavigator->getExtends() != nullptr)
         {
             const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends());
-            b->addLine(extends_s->getFullCppTypename() + "::resetSoft();");
+            block_if_data->addLine(extends_s->getFullCppTypename() + "::resetSoft();");
         }
 
         for (const auto& [key, child] : typenavigator->getMemberTypes())
         {
             auto child_s = FromAronTypeNaviagtorPtr(child);
             CppBlockPtr b2 = child_s->getResetSoftBlock(key);
-            b->appendBlock(b2);
+            block_if_data->appendBlock(b2);
         }
-        return b;
+        return ResolveMaybeResetSoftBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr ObjectClassSerializer::getResetHardBlock(const std::string&) const
+    CppBlockPtr ObjectClassSerializer::getResetHardBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         if (typenavigator->getExtends() != nullptr)
         {
             const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends());
-            b->addLine(extends_s->getFullCppTypename() + "::resetHard();");
+            block_if_data->addLine(extends_s->getFullCppTypename() + "::resetHard();");
         }
 
         for (const auto& [key, child] : typenavigator->getMemberTypes())
         {
             const auto child_s = FromAronTypeNaviagtorPtr(child);
             CppBlockPtr b2 = child_s->getResetHardBlock(key);
-            b->appendBlock(b2);
+            block_if_data->appendBlock(b2);
         }
-        return b;
+        return ResolveMaybeResetHardBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr ObjectClassSerializer::getWriteTypeBlock(const std::string&) const
@@ -106,7 +106,7 @@ namespace armarx::aron::cppserializer::serializer
             b->addLine(extends_s->getFullCppTypename() + "::writeType(w);");
         }
 
-        b->addLine("w.writeStartObject({\"" + typenavigator->getObjectName() + "\", __aronMaybeType});");
+        b->addLine("w.writeStartObject({\"" + typenavigator->getObjectName() + "\", __aronMaybeType}); // of top level object " + getCoreCppTypename());
         for (const auto& [key, child] : typenavigator->getMemberTypes())
         {
             const auto child_s = FromAronTypeNaviagtorPtr(child);
@@ -115,20 +115,20 @@ namespace armarx::aron::cppserializer::serializer
             b->appendBlock(b2);
         }
 
-        b->addLine("w.writeEndObject();");
+        b->addLine("w.writeEndObject(); // of top level object " + getCoreCppTypename());
         return b;
     }
 
-    CppBlockPtr ObjectClassSerializer::getWriteBlock(const std::string&) const
+    CppBlockPtr ObjectClassSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         if (typenavigator->getExtends() != nullptr)
         {
             const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends());
-            b->addLine(extends_s->getFullCppTypename() + "::write(w, aron_type);");
+            block_if_data->addLine(extends_s->getFullCppTypename() + "::write(w, aron_type);");
         }
 
-        b->addLine("w.writeStartDict();");
+        block_if_data->addLine("w.writeStartDict(); // of top level object " + getCoreCppTypename());
         for (const auto& [key, child] : typenavigator->getMemberTypes())
         {
             const auto child_s = FromAronTypeNaviagtorPtr(child);
@@ -136,57 +136,52 @@ namespace armarx::aron::cppserializer::serializer
 
             child_b->addLine("w.writeKey(\"" + key + "\");");
             child_b->appendBlock(child_s->getWriteBlock(key));
-            b->appendBlock(child_b);
+            block_if_data->appendBlock(child_b);
         }
-        b->addLine("w.writeEndDict();");
-        return b;
+        block_if_data->addLine("w.writeEndDict(); // of top level object " + getCoreCppTypename());
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
-    CppBlockPtr ObjectClassSerializer::getReadBlock(const std::string&) const
+    CppBlockPtr ObjectClassSerializer::getReadBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         if (typenavigator->getExtends() != nullptr)
         {
             const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends());
-            b->addLine(extends_s->getFullCppTypename() + "::read(r);");
+            block_if_data->addLine(extends_s->getFullCppTypename() + "::read(r);");
         }
 
-        b->addLine("if(!skip_first_readStartDict)");
+        block_if_data->addLine("if(!skip_first_readStartDict)");
         auto readStartDict = std::make_shared<CppBlock>();
-        readStartDict->addLine("r.readStartDict();");
-        b->addBlock(readStartDict);
+        readStartDict->addLine("r.readStartDict(); // of top level object " + getCoreCppTypename());
+        block_if_data->addBlock(readStartDict);
 
         for (const auto& [key, child] : typenavigator->getMemberTypes())
         {
             const auto child_s = FromAronTypeNaviagtorPtr(child);
-            CppBlockPtr q = CppBlockPtr(new CppBlock());
-
-            CppBlockPtr child_b = child_s->getReadBlock(key);
-            q->appendBlock(child_b);
-            b->addLine("r.loadMember(\"" + key + "\");");
-            b->appendBlock(q);
-
+            block_if_data->addLine("r.loadMember(\"" + key + "\");");
+            block_if_data->appendBlock(child_s->getReadBlock(key));
         }
-        b->addLine("r.readEndDict();");
-        return b;
+        block_if_data->addLine("r.readEndDict(); // of top level object " + getCoreCppTypename());
+        return ResolveMaybeReadBlock(accessor, "", block_if_data, typenavigator);
     }
 
-    CppBlockPtr ObjectClassSerializer::getEqualsBlock(const std::string&, const std::string& otherInstanceAccessor) const
+    CppBlockPtr ObjectClassSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         if (typenavigator->getExtends() != nullptr)
         {
             const auto extends_s = FromAronTypeNaviagtorPtr(typenavigator->getExtends());
-            b->addLine("if (not (" + extends_s->getFullCppTypename() + "::operator== (" + otherInstanceAccessor + ")))");
-            b->addLine("\t return false;");
+            block_if_data->addLine("if (not (" + extends_s->getFullCppTypename() + "::operator== (" + otherInstanceAccessor + ")))");
+            block_if_data->addLine("\t return false;");
         }
         for (const auto& [key, child] : typenavigator->getMemberTypes())
         {
             auto child_s = FromAronTypeNaviagtorPtr(child);
             CppBlockPtr b2 = child_s->getEqualsBlock(key, otherInstanceAccessor + "." + key);
-            b->appendBlock(b2);
+            block_if_data->appendBlock(b2);
         }
-        return b;
+        return ResolveMaybeEqualsBlock(accessor, otherInstanceAccessor, block_if_data, typenavigator);
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h
index f4c1f26e2..852bf2bbd 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h
@@ -74,9 +74,9 @@ namespace armarx::aron::xmltypereader
         static constexpr const char* COLS_ATTRIBUTE_NAME = "cols";
         static constexpr const char* DIMENSIONS_ATTRIBUTE_NAME = "dimensions";
         static constexpr const char* OPTIONAL_NAME = "optional";
-        static constexpr const char* RAW_PTR_NAME = "rawptr";
-        static constexpr const char* SHARED_PTR_NAME = "sharedptr";
-        static constexpr const char* UNIQUE_PTR_NAME = "uniqueptr";
+        static constexpr const char* RAW_PTR_NAME = "raw_ptr";
+        static constexpr const char* SHARED_PTR_NAME = "shared_ptr";
+        static constexpr const char* UNIQUE_PTR_NAME = "unique_ptr";
 
         // Second level tags. Only important if in specific top level tag
         static constexpr const char* OBJECT_CHILD_TAG = "objectchild";
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp
index 7565aa64b..665b1b125 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp
@@ -80,7 +80,7 @@ namespace armarx::aron::dataIO::reader
         auto token = stack.top();
         datanavigator::DictNavigator::DynamicCastAndCheck(token->getElement());
 
-        std::cout << "We are at: " << token->getCurrentIndex() << "/" << token->getElementChildrenSize() << std::endl;
+        //std::cout << "We are at: " << token->getCurrentIndex() << "/" << token->getElementChildrenSize() << std::endl;
 
         if (token->finishedElement())
         {
@@ -120,7 +120,7 @@ namespace armarx::aron::dataIO::reader
         auto token = stack.top();
         datanavigator::ListNavigator::DynamicCastAndCheck(token->getElement());
 
-        std::cout << "We are at: " << token->getCurrentIndex() << "/" << token->getElementChildrenSize() << std::endl;
+        //std::cout << "We are at: " << token->getCurrentIndex() << "/" << token->getElementChildrenSize() << std::endl;
         if (token->finishedElement())
         {
             stack.pop();
@@ -241,13 +241,13 @@ namespace armarx::aron::dataIO::reader
     {
         auto token = stack.top();
         auto s = token->getCurrentKey();
-        std::cout << "Read key: " << s << std::endl;
+        //std::cout << "Read key: " << s << std::endl;
         return s;
     }
 
     void NavigatorReader::loadMember(const std::string& k)
     {
-        std::cout << "Loading member " << k << std::endl;
+        //std::cout << "Loading member " << k << std::endl;
         auto token = stack.top();
         token->setCurrentKey(k);
     }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp
index a505284ef..e66463490 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp
@@ -61,6 +61,7 @@ namespace armarx::aron::dataIO
                 writer.writeStartDict();
                 for (const auto& [key, value] : casted->elements)
                 {
+                    //std::cout << "Visit writer for " << key << std::endl;
                     writer.writeKey(key);
                     Visitor::VisitAndSetup(writer, value);
                 }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/Navigator.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/Navigator.cpp
index 24adf0c75..ff4a18c89 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/Navigator.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/Navigator.cpp
@@ -27,6 +27,7 @@
 // ArmarX
 #include "../../Exception.h"
 #include "NavigatorFactory.h"
+#include "container/Dict.h"
 
 
 namespace armarx::aron::datanavigator
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.cpp
index bd43a9a24..c21af9e90 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.cpp
@@ -91,6 +91,14 @@ namespace armarx::aron::datanavigator
     }
 
     // public member functions
+    DictNavigatorPtr NDArrayNavigator::getAsDict() const
+    {
+        auto dict = std::make_shared<DictNavigator>();
+        auto copy_this = FromAronData(toAronDataPtr(), getPath());
+        dict->addElement("data", copy_this);
+        return dict;
+    }
+
     unsigned char* NDArrayNavigator::getData() const
     {
         return aron->data.data();
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h b/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h
index 8e51803c1..fb7461791 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h
@@ -35,6 +35,8 @@
 #include "../detail/NavigatorBase.h"
 
 // ArmarX
+#include "../container/Dict.h"
+
 #include "../../type/ndarray/EigenMatrix.h"
 #include "../../type/ndarray/EigenQuaternion.h"
 #include "../../type/ndarray/IVTCByteImage.h"
@@ -70,6 +72,8 @@ namespace armarx::aron::datanavigator
         static std::string DimensionsToString(const std::vector<int>& dimensions);
 
         // public member functions
+        DictNavigatorPtr getAsDict() const;
+
         unsigned char* getData() const;
         void setData(unsigned int, const unsigned char*);
 
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp
index 3c328cb01..eb4c74fd6 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp
@@ -72,7 +72,7 @@ namespace armarx::aron::datanavigator
         {
             if (!nav)
             {
-                if(!other.getElement(i))
+                if (!other.getElement(i))
                 {
                     return false;
                 }
@@ -102,6 +102,14 @@ namespace armarx::aron::datanavigator
     }
 
     // public member functions
+    DictNavigatorPtr ListNavigator::getAsDict() const
+    {
+        auto dict = std::make_shared<DictNavigator>();
+        auto copy_this = FromAronData(toAronDataPtr(), getPath());
+        dict->addElement("data", copy_this);
+        return dict;
+    }
+
     void ListNavigator::addElement(const NavigatorPtr& n)
     {
         if (n)
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.h b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.h
index 1b9104e2f..d46607c13 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.h
@@ -30,6 +30,7 @@
 #include "../detail/NavigatorBase.h"
 
 // ArmarX
+#include "Dict.h"
 #include "../../type/container/List.h"
 
 namespace armarx::aron::datanavigator
@@ -55,6 +56,8 @@ namespace armarx::aron::datanavigator
         static data::AronListPtr ToAronListPtr(const PointerType& navigator);
 
         // public member functions
+        DictNavigatorPtr getAsDict() const;
+
         data::AronListPtr toAronListPtr() const;
 
         void addElement(const NavigatorPtr&);
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/detail/PrimitiveNavigatorBase.h b/source/RobotAPI/libraries/aron/core/navigator/data/detail/PrimitiveNavigatorBase.h
index 6edd96d7b..d18112d5f 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/detail/PrimitiveNavigatorBase.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/detail/PrimitiveNavigatorBase.h
@@ -32,6 +32,7 @@
 #include "NavigatorBase.h"
 
 // ArmarX
+#include "../container/Dict.h"
 
 namespace armarx::aron::datanavigator::detail
 {
@@ -74,6 +75,14 @@ namespace armarx::aron::datanavigator::detail
         // static methods
 
         /* public member functions */
+        DictNavigatorPtr getAsDict() const
+        {
+            auto dict = std::make_shared<DictNavigator>();
+            auto copy_this = FromAronData(this->toAronDataPtr(), this->getPath());
+            dict->addElement("data", copy_this);
+            return dict;
+        }
+
         void setValue(const ValueT& x)
         {
             this->aron->value = x;
diff --git a/source/RobotAPI/libraries/aron/core/test/aronTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronTest.cpp
index a2d07c93f..17a3ddf27 100644
--- a/source/RobotAPI/libraries/aron/core/test/aronTest.cpp
+++ b/source/RobotAPI/libraries/aron/core/test/aronTest.cpp
@@ -90,50 +90,100 @@ using namespace aron;
 template <typename T>
 void runTestWithInstances(T& k1, T& k2)
 {
+    bool echo = true;
+
     Randomizer r;
 
-    std::cout << "\t getting type 1" << std::endl;
+    if (echo)
+    {
+        std::cout << "\t getting type 1" << std::endl;
+    }
     typenavigator::ObjectNavigatorPtr k1_type_nav = k1.toAronType();
     type::AronObjectPtr k1_type = k1_type_nav->toAronObjectPtr();
     BOOST_CHECK_EQUAL((bool) k1_type, true);
 
-    std::cout << "\t getting type 2" << std::endl;
+    if (echo)
+    {
+        std::cout << "\t getting type 2" << std::endl;
+    }
     typenavigator::ObjectNavigatorPtr k2_type_nav = k2.toAronType();
     type::AronObjectPtr k2_type = k2_type_nav->toAronObjectPtr();
     BOOST_CHECK_EQUAL((bool) k2_type, true);
 
     datanavigator::DictNavigatorPtr k1_aron_nav = k1.toAron();
 
-    std::cout << "\t initialize aron 1 randomly" << std::endl;
+    if (echo)
+    {
+        std::cout << "\t initialize aron 1 randomly" << std::endl;
+    }
     r.initializeRandomly(k1_aron_nav, k1_type_nav);
 
-    std::cout << "\t getting aron 1" << std::endl;
+    if (echo)
+    {
+        std::cout << "\t getting aron 1" << std::endl;
+    }
     data::AronDictPtr k1_aron = k1_aron_nav->toAronDictPtr();
     BOOST_CHECK_EQUAL((bool) k1_aron, true);
 
-    std::cout << "K1 Aron:" << std::endl;
-    std::cout << armarx::aron::Debug::AronDataPtrToString(k1_aron) << std::endl;
+    if (echo)
+    {
+        std::cout << "K1 Aron:" << std::endl;
+    }
+    if (echo)
+    {
+        std::cout << armarx::aron::Debug::AronDataPtrToString(k1_aron) << std::endl;
+    }
+
+    if (echo)
+    {
+        std::cout << "K2 Aron:" << std::endl;
+    }
+    if (echo)
+    {
+        std::cout << armarx::aron::Debug::AronDataPtrToString(k2.toAron()->toAronDictPtr()) << std::endl;
+    }
 
-    std::cout << "\t setting aron 2 from aron 1" << std::endl;
+    if (echo)
+    {
+        std::cout << "\t setting aron 2 from aron 1" << std::endl;
+    }
     k2.fromAron(k1_aron);
 
-    std::cout << "\t getting aron 2" << std::endl;
+    if (echo)
+    {
+        std::cout << "\t getting aron 2" << std::endl;
+    }
     datanavigator::DictNavigatorPtr k2_aron_nav = k2.toAron();
     data::AronDictPtr k2_aron = k2_aron_nav->toAronDictPtr();
     BOOST_CHECK_EQUAL((bool) k2_aron, true);
 
-    //std::cout << "K2 Aron:" << std::endl;
-    //std::cout << AronDebug::AronDataPtrToString(k2_aron) << std::endl;
+    //if (echo) std::cout << "K2 Aron:" << std::endl;
+    //if (echo) std::cout << armarx::aron::Debug::AronDataPtrToString(k2_aron) << std::endl;
 
-    std::cout << "\t setting aron 1 from aron 2 and check for equality" << std::endl;
+    if (echo)
+    {
+        std::cout << "\t setting aron 1 from aron 2 and check for equality" << std::endl;
+    }
 
     k1.fromAron(k2_aron_nav);
 
-    //std::cout << "K1 Aron:" << std::endl;
-    //std::cout << armarx::aron::Debug::AronDataPtrToString(k1_aron) << std::endl;
+    if (echo)
+    {
+        std::cout << "K1 Aron:" << std::endl;
+    }
+    if (echo)
+    {
+        std::cout << armarx::aron::Debug::AronDataPtrToString(k1.toAron()->toAronDictPtr()) << std::endl;
+    }
 
-    //std::cout << "K2 Aron:" << std::endl;
-    //std::cout << armarx::aron::Debug::AronDataPtrToString(k2_aron) << std::endl;
+    if (echo)
+    {
+        std::cout << "K2 Aron:" << std::endl;
+    }
+    if (echo)
+    {
+        std::cout << armarx::aron::Debug::AronDataPtrToString(k2.toAron()->toAronDictPtr()) << std::endl;
+    }
 
     BOOST_CHECK_EQUAL((k1 == k2), true);
 
@@ -152,7 +202,10 @@ void runTestWithInstances(T& k1, T& k2)
 
     k1.fromAron(k1_aron);
 
-    std::cout << "\t check JSON export of k and k2 for equality" << std::endl;
+    if (echo)
+    {
+        std::cout << "\t check JSON export of k and k2 for equality" << std::endl;
+    }
     armarx::aron::dataIO::writer::NlohmannJSONWriter json_writer_for_k1;
     armarx::aron::dataIO::writer::NlohmannJSONWriter json_writer_for_k2;
 
@@ -164,6 +217,15 @@ void runTestWithInstances(T& k1, T& k2)
     armarx::aron::dataIO::Visitor::VisitAndSetup(direct_json_writer_for_k1, k1_aron);
     nlohmann::json direct_k1_aron_json = direct_json_writer_for_k1.getResult();
     std::string direct_k1_aron_json_str = direct_k1_aron_json.dump(4);
+
+    if (echo)
+    {
+        std::cout << "\t K1 as json: " << std::endl << k1_aron_json_str << std::endl;
+    }
+    if (echo)
+    {
+        std::cout << "\t K1 as direct json: " << std::endl << direct_k1_aron_json_str << std::endl;
+    }
     BOOST_CHECK_EQUAL((k1_aron_json_str == direct_k1_aron_json_str), true);
 
     armarx::aron::dataIO::reader::NlohmannJSONReader json_reader_for_k2(k1_aron_json);
@@ -173,11 +235,44 @@ void runTestWithInstances(T& k1, T& k2)
     nlohmann::json k2_aron_json = json_writer_for_k2.getResult();
     std::string k2_aron_json_str = k2_aron_json.dump(4);
 
-    //std::cout << "\t K1 as json: " << std::endl << k1_aron_json_str << std::endl;
-    //std::cout << "\t K2 as json: " << std::endl << k2_aron_json_str << std::endl;
+    if (echo)
+    {
+        std::cout << "\t K1 as json: " << std::endl << k1_aron_json_str << std::endl;
+    }
+    if (echo)
+    {
+        std::cout << "\t K2 as json: " << std::endl << k2_aron_json_str << std::endl;
+    }
     BOOST_CHECK_EQUAL((k1_aron_json_str == k2_aron_json_str), true);
 }
 
+BOOST_AUTO_TEST_CASE(AssignmentTest)
+{
+    std::cout << "Aron Assignment test" << std::endl;
+    float f = 5.0;
+    double d = 42.0;
+    int i = 666;
+    long l = 123;
+    std::string s = "Hello World";
+    bool b = true;
+
+    aron::datanavigator::FloatNavigator fn = f;
+    aron::datanavigator::DoubleNavigator dn = d;
+    aron::datanavigator::IntNavigator in = i;
+    aron::datanavigator::LongNavigator ln = l;
+    aron::datanavigator::StringNavigator sn = s;
+    aron::datanavigator::BoolNavigator bn = b;
+
+    BOOST_CHECK_EQUAL((float) fn == f, true);
+    BOOST_CHECK_EQUAL((double) dn == d, true);
+    BOOST_CHECK_EQUAL((int) in == i, true);
+    BOOST_CHECK_EQUAL((long) ln == l, true);
+    BOOST_CHECK_EQUAL((std::string) sn == s, true);
+    BOOST_CHECK_EQUAL((bool) bn == b, true);
+
+
+}
+
 
 BOOST_AUTO_TEST_CASE(AronNaturalIKTest)
 {
@@ -268,11 +363,18 @@ BOOST_AUTO_TEST_CASE(AronImageTest)
     std::cout << "Running Image test" << std::endl;
     IVTCByteImageTest ii;
     IVTCByteImageTest ii2;
-    ii.the_grayscale_image->Set(100, 100, CByteImage::eGrayScale);
-    ii2.the_grayscale_image->Set(10, 10, CByteImage::eGrayScale);
 
-    ii.the_rgb_image->Set(50, 50, CByteImage::eRGB24);
-    ii2.the_rgb_image->Set(10, 10, CByteImage::eRGB24);
+    ii.the_grayscale_image = std::make_shared<CByteImage>();
+    ii2.the_grayscale_image = std::make_shared<CByteImage>();
+
+    ii.the_rgb_image = std::make_shared<CByteImage>();
+    ii2.the_rgb_image = std::make_shared<CByteImage>();
+
+    ii.the_grayscale_image->Set(5, 5, CByteImage::eGrayScale);
+    ii2.the_grayscale_image->Set(7, 7, CByteImage::eGrayScale);
+
+    ii.the_rgb_image->Set(5, 5, CByteImage::eRGB24);
+    ii2.the_rgb_image->Set(7, 7, CByteImage::eRGB24);
 
     runTestWithInstances<IVTCByteImageTest>(ii, ii2);
 }
@@ -291,10 +393,10 @@ BOOST_AUTO_TEST_CASE(AronOpenCVTest)
     OpenCVMatTest ocv;
     OpenCVMatTest ocv2;
 
-    ocv.the_2d_opencv_matrix = cv::Mat(2, 2, CV_64FC4);
-    ocv.the_3d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2}), CV_64FC4);
-    ocv.the_4d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2, 2}), CV_64FC4);
-    ocv.the_5d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2, 2, 2}), CV_64FC4);
+    ocv.the_2d_opencv_matrix = cv::Mat(2, 2, CV_64F);
+    ocv.the_3d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2}), CV_32F);
+    ocv.the_4d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2, 2}), CV_16S);
+    ocv.the_5d_opencv_matrix = cv::Mat(std::vector<int>({2, 2, 2, 2, 2}), CV_8U);
 
     runTestWithInstances<OpenCVMatTest>(ocv, ocv2);
 }
@@ -305,11 +407,11 @@ BOOST_AUTO_TEST_CASE(AronPCLPointCloudTest)
     PointCloudTest pc;
     PointCloudTest pc2;
 
-    pc.the_xyzrgb_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGB>(20, 20);
-    pc.the_xyzrgba_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGBA>(20, 20);
+    pc.the_xyzrgb_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGB>(5, 5);
+    pc.the_xyzrgba_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGBA>(7, 7);
 
-    pc2.the_xyzrgb_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGB>(50, 50);
-    pc2.the_xyzrgba_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGBA>(50, 50);
+    pc2.the_xyzrgb_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGB>(4, 4);
+    pc2.the_xyzrgba_pcl_pointcloud = pcl::PointCloud<pcl::PointXYZRGBA>(3, 3);
 
     runTestWithInstances<PointCloudTest>(pc, pc2);
 }
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml
index cd1dfccc4..38ac4391e 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml
@@ -7,11 +7,11 @@
         <Object name='armarx::IVTCByteImageTest'>
 
             <ObjectChild key='the_grayscale_image'>
-                <IVTCByteImage width="25" height="25" type="GrayScale" sharedptr="ja" />
+                <IVTCByteImage width="25" height="25" type="GrayScale" shared_ptr="ja" />
             </ObjectChild>
 
             <ObjectChild key='the_rgb_image'>
-                <IVTCByteImage width="1920" height="1080" type="RGB24" sharedptr="ja" />
+                <IVTCByteImage width="1920" height="1080" type="RGB24" shared_ptr="ja" />
             </ObjectChild>
 
         </Object>
-- 
GitLab