From 3083faf5c8944fd1c08504f070051c7acebd0ecf Mon Sep 17 00:00:00 2001
From: "fabian.peller-konrad@kit.edu" <fabian.peller-konrad@kit.edu>
Date: Fri, 14 May 2021 19:32:20 +0200
Subject: [PATCH] aron refactoring. Optional and Ptr improvements + auto
 include cpp filenames from aron include

---
 source/RobotAPI/interface/aron/Aron.ice       |  2 +-
 .../RobotAPI/libraries/aron/core/Exception.h  | 18 +++++
 .../RobotAPI/libraries/aron/core/Randomizer.h |  8 +--
 .../codeWriter/cpp/AronCppClass.h             |  4 +-
 .../codegenerator/codeWriter/cpp/Writer.cpp   | 46 +++++++------
 .../cpp/serializer/AllSerializers.h           |  8 ++-
 .../codeWriter/cpp/serializer/Serializer.cpp  | 37 +++++++---
 .../codeWriter/cpp/serializer/Serializer.h    |  6 +-
 .../cpp/serializer/SerializerFactory.cpp      | 37 +++-------
 .../cpp/serializer/container/Dict.cpp         | 13 ++--
 .../cpp/serializer/container/Dict.h           |  4 +-
 .../cpp/serializer/container/List.cpp         | 13 ++--
 .../cpp/serializer/container/List.h           |  2 -
 .../cpp/serializer/container/Object.cpp       | 19 +++---
 .../cpp/serializer/container/Object.h         |  4 +-
 .../cpp/serializer/container/Pair.cpp         | 24 +++----
 .../cpp/serializer/container/Pair.h           |  5 +-
 .../cpp/serializer/container/Tuple.cpp        | 21 +++---
 .../cpp/serializer/container/Tuple.h          |  4 +-
 .../detail/ContainerSerializerBase.h          |  7 +-
 .../serializer/detail/NDArraySerializerBase.h |  6 +-
 .../detail/PrimitiveSerializerBase.h          | 31 +++++++--
 .../cpp/serializer/detail/SerializerBase.h    | 17 +++--
 .../cpp/serializer/enum/IntEnum.cpp           |  7 +-
 .../cpp/serializer/ndarray/EigenMatrix.cpp    | 12 ++--
 .../serializer/ndarray/EigenQuaternion.cpp    | 10 +--
 .../cpp/serializer/ndarray/IVTCByteImage.cpp  | 17 ++---
 .../cpp/serializer/ndarray/IVTCByteImage.h    |  1 -
 .../cpp/serializer/ndarray/NDArray.cpp        |  6 +-
 .../cpp/serializer/ndarray/OpenCVMat.cpp      | 10 +--
 .../cpp/serializer/ndarray/Orientation.cpp    | 10 +--
 .../cpp/serializer/ndarray/PCLPointCloud.cpp  | 10 +--
 .../cpp/serializer/ndarray/PCLPointCloud.h    |  1 -
 .../cpp/serializer/ndarray/Pose.cpp           | 10 +--
 .../cpp/serializer/ndarray/Position.cpp       | 10 +--
 .../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/Long.h           | 12 ++--
 .../cpp/serializer/primitive/String.cpp       |  4 +-
 .../cpp/serializer/primitive/String.h         | 12 ++--
 .../cpp/serializer/primitive/Time.cpp         | 25 ++++++-
 .../cpp/serializer/primitive/Time.h           |  5 ++
 .../cpp/serializer/toplevel/IntEnumClass.cpp  |  8 +--
 .../cpp/serializer/toplevel/IntEnumClass.h    |  1 -
 .../cpp/serializer/toplevel/ObjectClass.cpp   |  9 +--
 .../codegenerator/typeReader/xml/Data.cpp     | 23 +++++++
 .../core/codegenerator/typeReader/xml/Data.h  |  9 +--
 .../codegenerator/typeReader/xml/Reader.cpp   | 13 ++--
 .../codegenerator/typeReader/xml/Reader.h     |  4 +-
 .../typeReader/xml/ReaderFactory.cpp          | 68 ++++++++++---------
 .../typeReader/xml/ReaderFactory.h            |  1 +
 .../core/io/typeIO/converter/Converter.cpp    | 38 +++++------
 .../aron/core/io/typeIO/visitor/Visitor.cpp   | 40 +++++------
 .../core/navigator/data/primitive/String.h    |  3 -
 .../aron/core/test/xmls/IVTCByteImageTest.xml |  4 +-
 .../aron/core/test/xmls/OptionalTest.xml      |  2 +-
 59 files changed, 413 insertions(+), 328 deletions(-)

diff --git a/source/RobotAPI/interface/aron/Aron.ice b/source/RobotAPI/interface/aron/Aron.ice
index c24e5cc1b..d40861c76 100644
--- a/source/RobotAPI/interface/aron/Aron.ice
+++ b/source/RobotAPI/interface/aron/Aron.ice
@@ -53,7 +53,7 @@ module armarx
             };
 
             class AronType {
-                Maybe maybe; // Every type can be optional or not
+                Maybe maybe = Maybe::eNone; // Every type can have a maye type flag or not
             }
             sequence<AronType> AronTypeList;
             dictionary<string, AronType> AronTypeDict;
diff --git a/source/RobotAPI/libraries/aron/core/Exception.h b/source/RobotAPI/libraries/aron/core/Exception.h
index bebe98d2a..5bd308a21 100644
--- a/source/RobotAPI/libraries/aron/core/Exception.h
+++ b/source/RobotAPI/libraries/aron/core/Exception.h
@@ -124,6 +124,24 @@ namespace armarx::aron::error
         }
     };
 
+    class MaybeNotValidException :
+        public AronException
+    {
+    public:
+        MaybeNotValidException() = delete;
+        MaybeNotValidException(const std::string& caller, const std::string& method, const std::string& reason, const type::Maybe maybe) :
+            AronException(caller, method, reason + ". The name of the maybe-type was: " + type::MAYBE_TO_STRING(maybe))
+        {
+
+        }
+
+        MaybeNotValidException(const std::string& caller, const std::string& method, const std::string& reason, const type::Maybe maybe, const Path& path) :
+            AronException(caller, method, reason + ". The name of the maybe-type was: " + type::MAYBE_TO_STRING(maybe), path)
+        {
+
+        }
+    };
+
     class StringNotValidException :
         public AronException
     {
diff --git a/source/RobotAPI/libraries/aron/core/Randomizer.h b/source/RobotAPI/libraries/aron/core/Randomizer.h
index b92bc4497..71b174230 100644
--- a/source/RobotAPI/libraries/aron/core/Randomizer.h
+++ b/source/RobotAPI/libraries/aron/core/Randomizer.h
@@ -170,9 +170,9 @@ namespace armarx::aron
             }
         }
 
-        datanavigator::NavigatorPtr generateAronDataFromType(const typenavigator::NavigatorPtr& type, bool ignore_optional = false) const
+        datanavigator::NavigatorPtr generateAronDataFromType(const typenavigator::NavigatorPtr& type, bool ignore_maybe = false) const
         {
-            if (type->isOptional() && !ignore_optional)
+            if (type->getMaybe() != type::Maybe::eNone && !ignore_maybe)
             {
                 if (fiftyPercentChance())
                 {
@@ -243,9 +243,9 @@ case type::Descriptor::e##upperType: \
         {
             if (!data)
             {
-                if (!type->isOptional())
+                if (!type->getMaybe() != type::Maybe::eNone)
                 {
-                    throw error::AronException("Randomizer", "initializeRandomly", "The data is null but the type is not optional. This is not valid.");
+                    throw error::AronException("Randomizer", "initializeRandomly", "The data is null but the type is not a maybe type. This is not valid.");
                 }
 
                 if (fiftyPercentChance()) // 50% chance
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h
index 8325b4d00..d50039b43 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h
@@ -47,8 +47,8 @@ namespace armarx::aron::cppserializer
 
     public:
         AronCppClass() = default;
-        virtual void reset() = 0;
-        virtual void initialize() = 0;
+        virtual void resetHard() = 0;
+        virtual void resetSoft() = 0;
         virtual void read(armarx::aron::dataIO::ReaderInterface& r, bool skip_first_readStartDict = false) = 0;
         virtual void write(armarx::aron::dataIO::WriterInterface& w) const = 0;
     };
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 1643b64c7..0cdf58d6d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
@@ -90,7 +90,7 @@ namespace armarx::aron::cppserializer
         {
             const auto& nav = publicGenerateObjectType->correspondingType;
 
-            //std::cout << "Generating: " << publicGenerateObjectType->correspondingObjectType->getName() << std::endl;
+            //std::cout << "Generating: " << nav->getName() << std::endl;
 
             // Convert to Object type and create class object
             if (nav == nullptr)
@@ -110,7 +110,7 @@ namespace armarx::aron::cppserializer
             }
             else
             {
-                c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass");
+                c->addInherit("public armarx::aron::cppserializer::AronCppClass");
                 c->addInclude("<RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h>");
             }
 
@@ -132,24 +132,24 @@ 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;
-            CppMethodPtr reset = serializer->toResetMethod();
-            c->addMethod(reset);
+            std::cout << "Generate reset method" << std::endl;
+            CppMethodPtr resetHard = serializer->toResetHardMethod();
+            c->addMethod(resetHard);
 
-            //std::cout << "Generate init method" << std::endl;
-            CppMethodPtr setup = serializer->toInitializeMethod();
-            c->addMethod(setup);
+            std::cout << "Generate init method" << std::endl;
+            CppMethodPtr resetSoft = serializer->toResetSoftMethod();
+            c->addMethod(resetSoft);
 
             //std::cout << "Generate writeInit method" << std::endl;
             CppMethodPtr writeType = serializer->toWriteTypeMethod();
@@ -174,6 +174,8 @@ namespace armarx::aron::cppserializer
                 c->addMethod(convert);
             }
 
+            //std::cout << "set member vars" << std::endl;
+
             // Add methods to set the member variables
             for (const codegeneratorhelper::ReaderInfoPtr& info : dataReaders)
             {
@@ -185,6 +187,8 @@ namespace armarx::aron::cppserializer
                 c->addMethod(convert);
             }
 
+            //std::cout << "type writer methods" << std::endl;
+
             // Typewritermethods
             for (const codegeneratorhelper::WriterInfoPtr& info : initialTypeWriters)
             {
@@ -196,6 +200,8 @@ namespace armarx::aron::cppserializer
                 c->addMethod(convert);
             }
 
+            //std::cout << "push back" << std::endl;
+
             typeClasses.push_back(c);
         }
     }
@@ -226,7 +232,7 @@ namespace armarx::aron::cppserializer
             c->addInclude("<map>");
             c->addInclude("<RobotAPI/interface/aron.h>");
 
-            c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass");
+            c->addInherit("virtual public armarx::aron::cppserializer::AronCppClass");
             c->addInclude("<RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h>");
 
             // ctor
@@ -262,12 +268,12 @@ namespace armarx::aron::cppserializer
             c->addMethod(equals);
 
             //std::cout << "Generate reset method" << std::endl;
-            CppMethodPtr reset = serializer->toResetMethod();
-            c->addMethod(reset);
+            CppMethodPtr resetHard = serializer->toResetHardMethod();
+            c->addMethod(resetHard);
 
             //std::cout << "Generate init method" << std::endl;
-            CppMethodPtr setup = serializer->toInitializeMethod();
-            c->addMethod(setup);
+            CppMethodPtr resetSoft = serializer->toResetSoftMethod();
+            c->addMethod(resetSoft);
 
             //std::cout << "Generate writeInit method" << std::endl;
             CppMethodPtr writeInitialType = serializer->toWriteTypeMethod();
@@ -304,17 +310,17 @@ namespace armarx::aron::cppserializer
             }
             else
             {
-                c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass");
+                c->addInherit("virtual public armarx::aron::cppserializer::AronCppClass");
             }
 
             CppMethodPtr equals = serializer->toEqualsMethod();
             c->addMethod(equals);
 
-            CppMethodPtr reset = serializer->toResetMethod();
-            c->addMethod(reset);
+            CppMethodPtr resetHard = serializer->toResetHardMethod();
+            c->addMethod(resetHard);
 
-            CppMethodPtr setup = serializer->toInitializeMethod();
-            c->addMethod(setup);
+            CppMethodPtr resetSoft = serializer->toResetSoftMethod();
+            c->addMethod(resetSoft);
 
             CppMethodPtr writeInitialType = serializer->toWriteTypeMethod();
             c->addMethod(writeInitialType);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/AllSerializers.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/AllSerializers.h
index 20c5ab2be..dd01bd127 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/AllSerializers.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/AllSerializers.h
@@ -15,4 +15,10 @@
 #include "ndarray/Orientation.h"
 #include "ndarray/Pose.h"
 #include "enum/IntEnum.h"
-#include "primitive/Primitive.h"
+#include "primitive/Int.h"
+#include "primitive/Long.h"
+#include "primitive/Float.h"
+#include "primitive/Double.h"
+#include "primitive/String.h"
+#include "primitive/Bool.h"
+#include "primitive/Time.h"
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 d574ed3d2..4265939ef 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
@@ -63,22 +63,40 @@ namespace armarx::aron::cppserializer
     }
 
     // static methods
-    std::string Serializer::ResolveOptionalAccessor(const std::string& s, const typenavigator::NavigatorPtr& t)
+    std::string Serializer::ResolveMaybeAccessor(const std::string& s, const typenavigator::NavigatorPtr& t)
     {
         if (t->getMaybe() == type::Maybe::eOptional)
         {
             return s + ".value()";
         }
+        if (t->getMaybe() == type::Maybe::eRawPointer || t->getMaybe() == type::Maybe::eSharedPointer || t->getMaybe() == type::Maybe::eUniquePointer)
+        {
+            return "*" + s;
+        }
         return s;
     }
 
-    CppBlockPtr Serializer::ResolveOptionalWriteBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
+    CppBlockPtr Serializer::ResolveMaybeWriteBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
     {
-        if (typenavigator->getMaybe() == type::Maybe::eOptional)
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
             CppBlockPtr b = std::make_shared<CppBlock>();
-            b->addLine("if (" + accessor + ".has_value())");
-            b->addBlock(block_if_data);
+            if (typenavigator->getMaybe() == type::Maybe::eOptional)
+            {
+                b->addLine("if (" + accessor + ".has_value())");
+                b->addBlock(block_if_data);
+            }
+            if (typenavigator->getMaybe() == type::Maybe::eRawPointer)
+            {
+                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);
+            }
+
             b->addLine("else");
             CppBlockPtr block_if_no_data = std::make_shared<CppBlock>();
             block_if_no_data->addLine("w.writeNull();");
@@ -91,7 +109,7 @@ namespace armarx::aron::cppserializer
         }
     }
 
-    CppBlockPtr Serializer::ResolveOptionalReadBlock(const std::string& accessor, const std::string& readElement, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
+    CppBlockPtr Serializer::ResolveMaybeReadBlock(const std::string& accessor, const std::string& readElement, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
     {
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string read_start_result_accessor = escaped_accessor + READ_START_RETURN_TYPE_ACCESSOR;
@@ -153,6 +171,7 @@ namespace armarx::aron::cppserializer
 
     SerializerPtr Serializer::FromAronTypeNaviagtorPtr(const typenavigator::NavigatorPtr& n)
     {
+        ARMARX_CHECK_NOT_NULL(n);
         return FACTORY->create(n, n->getPath());
     }
 
@@ -187,7 +206,7 @@ namespace armarx::aron::cppserializer
         CppCtorPtr c = CppCtorPtr(new CppCtor(name + "()"));
         std::vector<std::pair<std::string, std::string>> initList = this->getCtorInitializers("");
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("initialize();");
+        b->addLine("resetHard();");
         b->appendBlock(this->getCtorBlock(""));
         c->addInitListEntries(initList);
         c->setBlock(b);
@@ -225,7 +244,7 @@ namespace armarx::aron::cppserializer
         doc << "@brief writeType() - This method returns a new type from the class structure using a type writer implementation. This function is static. \n";
         doc << "@return - the result of the writer implementation";
 
-        CppMethodPtr m = CppMethodPtr(new CppMethod("static void writeType(armarx::aron::typeIO::WriterInterface& w, bool type_is_optional = false)", doc.str()));
+        CppMethodPtr m = CppMethodPtr(new CppMethod("static void writeType(armarx::aron::typeIO::WriterInterface& w, armarx::aron::type::Maybe __aronMaybeType = armarx::aron::type::Maybe::eNone)", doc.str()));
         CppBlockPtr b = this->getWriteTypeBlock("");
         m->setBlock(b);
         return m;
@@ -253,7 +272,7 @@ namespace armarx::aron::cppserializer
 
         CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void read(armarx::aron::dataIO::ReaderInterface& r, bool skip_first_readStartDict = false) override", doc.str()));
         CppBlockPtr b = std::make_shared<CppBlock>();
-        b->addLine("this->reset();");
+        b->addLine("this->resetSoft();");
         b->appendBlock(this->getReadBlock(""));
         m->setBlock(b);
         return m;
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 ad74b45c4..1914c0e7c 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
@@ -113,9 +113,9 @@ namespace armarx::aron::cppserializer
 
         static SerializerPtr FromAronTypeNaviagtorPtr(const typenavigator::NavigatorPtr&);
 
-        static std::string ResolveOptionalAccessor(const std::string&, const typenavigator::NavigatorPtr&);
-        static CppBlockPtr ResolveOptionalWriteBlock(const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&);
-        static CppBlockPtr ResolveOptionalReadBlock(const std::string&, const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&);
+        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&);
 
     protected:
         static const std::string READ_START_RETURN_TYPE_ACCESSOR;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/SerializerFactory.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/SerializerFactory.cpp
index 34820852e..080176c57 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/SerializerFactory.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/SerializerFactory.cpp
@@ -34,38 +34,19 @@ namespace armarx::aron::cppserializer
     // Access method
     SerializerPtr SerializerFactory::create(const typenavigator::NavigatorPtr& n, const Path& path) const
     {
+#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
+   {type::Descriptor::e##upperType, SerializerFactoryPtr(new upperType##SerializerFactory())},
         static const std::map<type::Descriptor, SerializerFactoryPtr> Factories =
         {
-            {type::Descriptor::eObject, SerializerFactoryPtr(new ObjectSerializerFactory())},
-            {type::Descriptor::eDict, SerializerFactoryPtr(new DictSerializerFactory())},
-            {type::Descriptor::eList, SerializerFactoryPtr(new ListSerializerFactory())},
-            {type::Descriptor::eTuple, SerializerFactoryPtr(new TupleSerializerFactory())},
-            {type::Descriptor::ePair, SerializerFactoryPtr(new PairSerializerFactory())},
-            {type::Descriptor::eNDArray, SerializerFactoryPtr(new NDArraySerializerFactory())},
-            {type::Descriptor::eEigenMatrix, SerializerFactoryPtr(new EigenMatrixSerializerFactory())},
-            {type::Descriptor::eEigenQuaternion, SerializerFactoryPtr(new EigenQuaternionSerializerFactory())},
-            {type::Descriptor::eIVTCByteImage, SerializerFactoryPtr(new IVTCByteImageSerializerFactory())},
-            {type::Descriptor::eOpenCVMat, SerializerFactoryPtr(new OpenCVMatSerializerFactory())},
-            {type::Descriptor::ePCLPointCloud, SerializerFactoryPtr(new PCLPointCloudSerializerFactory())},
-            {type::Descriptor::ePosition, SerializerFactoryPtr(new PositionSerializerFactory())},
-            {type::Descriptor::eOrientation, SerializerFactoryPtr(new OrientationSerializerFactory())},
-            {type::Descriptor::ePose, SerializerFactoryPtr(new PoseSerializerFactory())},
-            {type::Descriptor::eIntEnum, SerializerFactoryPtr(new IntEnumSerializerFactory())},
-            {type::Descriptor::eInt, SerializerFactoryPtr(new IntSerializerFactory())},
-            {type::Descriptor::eLong, SerializerFactoryPtr(new LongSerializerFactory())},
-            {type::Descriptor::eFloat, SerializerFactoryPtr(new FloatSerializerFactory())},
-            {type::Descriptor::eDouble, SerializerFactoryPtr(new DoubleSerializerFactory())},
-            {type::Descriptor::eString, SerializerFactoryPtr(new StringSerializerFactory())},
-            {type::Descriptor::eBool, SerializerFactoryPtr(new BoolSerializerFactory())},
-            {type::Descriptor::eTime, SerializerFactoryPtr(new TimeSerializerFactory())}
+            HANDLE_ALL_ARON_TYPES
         };
+#undef RUN_ARON_MACRO
 
         //CheckIfPtrIsNull("NavigatorFactory", "create", path, n);
-        auto res = n->toAronPtr();
-        auto factory_iterator = Factories.find(Resolver::GetDescriptor(res));
+        auto factory_iterator = Factories.find(n->getDescriptor());
         if (factory_iterator == Factories.end())
         {
-            throw error::AronException("NavigatorFactory", "create", "Cannot find the desired factory for input (ice_id): " + res->ice_id() + ". Cannot create navigator", path);
+            throw error::AronException("NavigatorFactory", "create", "Cannot find the desired factory for input (ice_id): " + n->toAronPtr()->ice_id() + ". Cannot create navigator", path);
         }
         return factory_iterator->second->createSpecific(n, path);
     }
@@ -77,11 +58,9 @@ namespace armarx::aron::cppserializer
 
     // Factories
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    SerializerPtr upperType##SerializerFactory::createSpecific(const typenavigator::NavigatorPtr& n, const Path& path) const \
+    SerializerPtr upperType##SerializerFactory::createSpecific(const typenavigator::NavigatorPtr& n, const Path&) const \
     { \
-        /*CheckIfInputIsNull("Aron"+std::string(#upperType)+"TypeCppSerializerFactory", "createSpecific[BeforeCast]", path, n); */\
-        typenavigator::upperType##NavigatorPtr casted = typenavigator::upperType##Navigator::DynamicCast(n); \
-        /*CheckIfInputIsNull("Aron"+std::string(#upperType)+"TypeCppSerializerFactory", "createSpecific[AfterCast]", path, casted); */\
+        typenavigator::upperType##NavigatorPtr casted = typenavigator::upperType##Navigator::DynamicCastAndCheck(n); \
         return SerializerPtr(new serializer::upperType##Serializer(casted)); \
     }
 
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 cec291fd1..d5ee832a5 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
@@ -29,10 +29,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     DictSerializer::DictSerializer(const typenavigator::DictNavigatorPtr& e) :
-        Serializer("std::map<std::string, " + FromAronTypeNaviagtorPtr(e->getAcceptedType())->getFullCppTypename() + ">",
+        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))),
-        detail::SerializerBase<typenavigator::DictNavigator, DictSerializer>(e)
+                   simox::meta::get_type_name(typeid(type::AronDict)), e)
     {
     }
 
@@ -54,7 +53,7 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr DictSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartDict({" + std::string(typenavigator->isOptional() ? "true" : "false") + "});");
+        b->addLine("w.writeStartDict({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR;
@@ -75,7 +74,7 @@ namespace armarx::aron::cppserializer::serializer
         std::string accessor_iterator_key = escaped_accessor + DICT_KEY_ACCESSOR;
         std::string accessor_iterator_val = escaped_accessor + DICT_VALUE_ACCESSOR;
 
-        std::string resolved_accessor = ResolveOptionalAccessor(accessor, typenavigator);
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
 
         block_if_data->addLine("for (const auto& [" + accessor_iterator_key + ", " + accessor_iterator_val + "] : " + resolved_accessor + ") ");
 
@@ -86,7 +85,7 @@ namespace armarx::aron::cppserializer::serializer
         block_if_data->addBlock(b2);
         block_if_data->addLine("w.writeEndDict();");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr DictSerializer::getReadBlock(const std::string& accessor) const
@@ -108,7 +107,7 @@ namespace armarx::aron::cppserializer::serializer
         b2->addLine(accessor + nextEl() + "insert({" + accessor_iterator_key + ", " + accessor_iterator + "});");
 
         block_if_data->addBlock(b2);
-        return ResolveOptionalReadBlock(accessor, "r.readStartDict()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartDict()", block_if_data, typenavigator);
     }
 
     CppBlockPtr DictSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.h
index 287585d2d..9bd48144a 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.h
@@ -40,7 +40,7 @@ namespace armarx::aron::cppserializer::serializer
     typedef std::shared_ptr<DictSerializer> DictSerializerPtr;
 
     class DictSerializer :
-        virtual public detail::ContainerSerializerBase<typenavigator::DictNavigator, DictSerializer>
+        public detail::ContainerSerializerBase<typenavigator::DictNavigator, DictSerializer>
     {
     public:
         using PointerType = DictSerializerPtr;
@@ -63,7 +63,5 @@ namespace armarx::aron::cppserializer::serializer
         static constexpr const char* DICT_ITERATOR_ACCESSOR = "_iterator";
         static constexpr const char* DICT_KEY_ACCESSOR = "_key";
         static constexpr const char* DICT_VALUE_ACCESSOR = "_value";
-
-        typenavigator::DictNavigatorPtr 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 7d1e67b70..1aa21fe91 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
@@ -28,12 +28,10 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     ListSerializer::ListSerializer(const typenavigator::ListNavigatorPtr& e) :
-        Serializer("std::vector<" + FromAronTypeNaviagtorPtr(e->getAcceptedType())->getFullCppTypename() + ">",
+        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))),
-        detail::SerializerBase<typenavigator::ListNavigator, ListSerializer>(e)
+                   simox::meta::get_type_name(typeid(type::AronList)), e)
     {
-
     }
 
     CppBlockPtr ListSerializer::getResetSoftBlock(const std::string& accessor) const
@@ -53,7 +51,8 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr ListSerializer::getWriteTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartList({" + std::string(typenavigator->isOptional() ? "true" : "false") + "});");
+
+        b->addLine("w.writeStartList({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
 
         CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getFullCppTypename());
@@ -76,7 +75,7 @@ namespace armarx::aron::cppserializer::serializer
         block_if_data->addBlock(type_s->getWriteBlock(accessor + nextEl() + "at(" + accessor_iterator + ")"));
         block_if_data->addLine("w.writeEndList();");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr ListSerializer::getReadBlock(const std::string& accessor) const
@@ -95,7 +94,7 @@ namespace armarx::aron::cppserializer::serializer
         b2->addLine(accessor + nextEl() + "push_back(" + accessor_iterator + ");");
 
         block_if_data->addBlock(b2);
-        return ResolveOptionalReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator);
     }
 
     CppBlockPtr ListSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.h
index 7073196ab..6b8afaabe 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.h
@@ -59,7 +59,5 @@ namespace armarx::aron::cppserializer::serializer
     private:
         // members
         static constexpr const char* LIST_ITERATOR_ACCESSOR = "_iterator";
-
-        typenavigator::ListNavigatorPtr 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 61f952777..c5dd78ce3 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
@@ -29,23 +29,22 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     ObjectSerializer::ObjectSerializer(const typenavigator::ObjectNavigatorPtr& e) :
-        Serializer(e->getObjectName(),
+        detail::ContainerSerializerBase<typenavigator::ObjectNavigator, ObjectSerializer>(e->getObjectName(),
                    simox::meta::get_type_name(typeid(data::AronDict)),
-                   simox::meta::get_type_name(typeid(type::AronObject))),
-        detail::SerializerBase<typenavigator::DictNavigator, DictSerializer>(e)
+                   simox::meta::get_type_name(typeid(type::AronObject)), e)
     {
     }
 
     CppBlockPtr ObjectSerializer::getResetSoftBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->isOptional())
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
             b->addLine(accessor + " = {};");
         }
         else
         {
-            b->addLine(accessor + nextEl() + "reset();");
+            b->addLine(accessor + nextEl() + "resetSoft();");
         }
         return b;
     }
@@ -53,13 +52,13 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr ObjectSerializer::getResetHardBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->isOptional())
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
             b->addLine(accessor + " = {};");
         }
         else
         {
-            b->addLine(accessor + nextEl() + "initialize();");
+            b->addLine(accessor + nextEl() + "resetHard();");
         }
         return b;
     }
@@ -67,7 +66,7 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr ObjectSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + "::writeType(w, " + std::string(typenavigator->isOptional() ? "true" : "false") + ");");
+        b->addLine(accessor + "::writeType(w, " + MAYBE_TO_STRING(typenavigator->getMaybe()) + ");");
         return b;
     }
 
@@ -76,14 +75,14 @@ namespace armarx::aron::cppserializer::serializer
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         block_if_data->addLine(accessor + nextEl() + "write(w);");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr ObjectSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         block_if_data->addLine(accessor + nextEl() + "read(r, true);");
-        return ResolveOptionalReadBlock(accessor, "r.readStartDict()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartDict()", block_if_data, typenavigator);
     }
 
     CppBlockPtr ObjectSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.h
index 071abc6a0..d04a44557 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.h
@@ -41,7 +41,7 @@ namespace armarx::aron::cppserializer::serializer
     typedef std::shared_ptr<ObjectSerializer> ObjectSerializerPtr;
 
     class ObjectSerializer :
-        virtual public detail::ContainerSerializerBase<typenavigator::ObjectNavigator, ObjectSerializer>
+        public detail::ContainerSerializerBase<typenavigator::ObjectNavigator, ObjectSerializer>
     {
     public:
         using PointerType = ObjectSerializerPtr;
@@ -61,7 +61,5 @@ namespace armarx::aron::cppserializer::serializer
     private:
         // members
         static constexpr const char* EXTENDS_ITERATOR_ACCESSOR = "_extends";
-
-        typenavigator::ObjectNavigatorPtr 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 75cc12ead..5b7fac538 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
@@ -28,29 +28,27 @@
 namespace armarx::aron::cppserializer::serializer
 {
     PairSerializer::PairSerializer(const typenavigator::PairNavigatorPtr& e) :
-        Serializer("std::pair<" + ExtractCppTypename(e->getFirstAcceptedType()) + ", " + ExtractCppTypename(e->getSecondAcceptedType()) + ">",
+        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))),
-        detail::SerializerBase<typenavigator::PairNavigator, PairSerializer>(e)
+                   simox::meta::get_type_name(typeid(type::AronPair)), e)
     {
-
     }
 
     CppBlockPtr PairSerializer::getResetHardBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->isOptional())
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
             b->addLine(accessor + " = {};");
         }
         else
         {
             auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
-            CppBlockPtr b21 = child_s1->getInitializeBlock(accessor + nextEl() + "first");
+            CppBlockPtr b21 = child_s1->getResetHardBlock(accessor + nextEl() + "first");
             b->appendBlock(b21);
 
             auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
-            CppBlockPtr b22 = child_s2->getInitializeBlock(accessor + nextEl() + "second");
+            CppBlockPtr b22 = child_s2->getResetHardBlock(accessor + nextEl() + "second");
             b->appendBlock(b22);
         }
         return b;
@@ -59,18 +57,18 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr PairSerializer::getResetSoftBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->isOptional())
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
             b->addLine(accessor + " = {};");
         }
         else
         {
             auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
-            CppBlockPtr b21 = child_s1->getResetBlock(accessor + nextEl() + "first");
+            CppBlockPtr b21 = child_s1->getResetSoftBlock(accessor + nextEl() + "first");
             b->appendBlock(b21);
 
             auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
-            CppBlockPtr b22 = child_s2->getResetBlock(accessor + nextEl() + "second");
+            CppBlockPtr b22 = child_s2->getResetSoftBlock(accessor + nextEl() + "second");
             b->appendBlock(b22);
         }
         return b;
@@ -79,7 +77,7 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr PairSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartPair({" + std::string(typenavigator->isOptional() ? "true" : "false") + "});");
+        b->addLine("w.writeStartPair({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
 
@@ -114,7 +112,7 @@ namespace armarx::aron::cppserializer::serializer
 
         block_if_data->addLine("w.writeEndList();");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PairSerializer::getReadBlock(const std::string& accessor) const
@@ -130,7 +128,7 @@ namespace armarx::aron::cppserializer::serializer
         block_if_data->appendBlock(b22);
 
         block_if_data->addLine("r.readEndList();");
-        return ResolveOptionalReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PairSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.h
index fb9a71970..a7ef2495b 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.h
@@ -40,7 +40,7 @@ namespace armarx::aron::cppserializer::serializer
     typedef std::shared_ptr<PairSerializer> PairSerializerPtr;
 
     class PairSerializer :
-        virtual public detail::ContainerSerializerBase<typenavigator::PairNavigator, PairSerializer>
+        public detail::ContainerSerializerBase<typenavigator::PairNavigator, PairSerializer>
     {
     public:
         using PointerType = PairSerializerPtr;
@@ -61,8 +61,5 @@ namespace armarx::aron::cppserializer::serializer
         // members
         static constexpr const char* PAIR_FIRST_ACCESSOR = "_first";
         static constexpr const char* PAIR_SECOND_ACCESSOR = "_second";
-
-
-        typenavigator::PairNavigatorPtr 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 abe891a15..643f16570 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
@@ -28,10 +28,9 @@
 namespace armarx::aron::cppserializer::serializer
 {
     TupleSerializer::TupleSerializer(const typenavigator::TupleNavigatorPtr& e) :
-        Serializer("std::tuple<" + simox::alg::join(ExtractCppTypenames(e->getAcceptedTypes()), ", ") + ">",
+        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))),
-        detail::SerializerBase<typenavigator::TupleNavigator, TupleSerializer>(e)
+                   simox::meta::get_type_name(typeid(type::AronTuple)), e)
     {
     }
 
@@ -48,7 +47,7 @@ namespace armarx::aron::cppserializer::serializer
             for (const auto& child : typenavigator->getAcceptedTypes())
             {
                 auto child_s = FromAronTypeNaviagtorPtr(child);
-                CppBlockPtr b2 = child_s->getInitializeBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
+                CppBlockPtr b2 = child_s->getResetHardBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
                 b->appendBlock(b2);
             }
         }
@@ -58,7 +57,7 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr TupleSerializer::getResetSoftBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->isOptional())
+        if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
             b->addLine(accessor + " = {};");
         }
@@ -68,7 +67,7 @@ namespace armarx::aron::cppserializer::serializer
             for (const auto& type : typenavigator->getAcceptedTypes())
             {
                 auto type_s = FromAronTypeNaviagtorPtr(type);
-                CppBlockPtr b2 = type_s->getResetBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
+                CppBlockPtr b2 = type_s->getResetSoftBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
                 b->appendBlock(b2);
             }
         }
@@ -78,7 +77,7 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr TupleSerializer::getWriteTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartTuple({" + std::string(typenavigator->isOptional() ? "true" : "false") + "});");
+        b->addLine("w.writeStartTuple({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         unsigned int i = 0;
@@ -99,7 +98,7 @@ namespace armarx::aron::cppserializer::serializer
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         block_if_data->addLine("w.writeStartList();");
 
-        std::string resolved_accessor = ResolveOptionalAccessor(accessor, typenavigator);
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
 
         unsigned int i = 0;
         for (const auto& type : typenavigator->getAcceptedTypes())
@@ -110,14 +109,14 @@ namespace armarx::aron::cppserializer::serializer
         }
         block_if_data->addLine("w.writeEndList();");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr TupleSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
 
-        std::string resolved_accessor = ResolveOptionalAccessor(accessor, typenavigator);
+        std::string resolved_accessor = ResolveMaybeAccessor(accessor, typenavigator);
 
         unsigned int i = 0;
         for (const auto& type : typenavigator->getAcceptedTypes())
@@ -127,7 +126,7 @@ namespace armarx::aron::cppserializer::serializer
             block_if_data->appendBlock(b2);
         }
         block_if_data->addLine("r.readEndList();");
-        return ResolveOptionalReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartList()", block_if_data, typenavigator);
     }
 
     CppBlockPtr TupleSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.h
index 3cb5cc67c..d8ec0bf42 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.h
@@ -40,7 +40,7 @@ namespace armarx::aron::cppserializer::serializer
     typedef std::shared_ptr<TupleSerializer> TupleSerializerPtr;
 
     class TupleSerializer :
-        virtual public detail::ContainerSerializerBase<typenavigator::TupleNavigator, TupleSerializer>
+        public detail::ContainerSerializerBase<typenavigator::TupleNavigator, TupleSerializer>
     {
     public:
         using PointerType = TupleSerializerPtr;
@@ -60,7 +60,5 @@ namespace armarx::aron::cppserializer::serializer
     private:
         // members
         static constexpr const char* TUPLE_ITERATOR_ACCESSOR = "_iterator";
-
-        typenavigator::TupleNavigatorPtr typenavigator;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/ContainerSerializerBase.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/ContainerSerializerBase.h
index 6275e328b..d2ca8f77e 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/ContainerSerializerBase.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/ContainerSerializerBase.h
@@ -37,9 +37,12 @@ namespace armarx::aron::cppserializer::detail
 {
     template<typename TypenavigatorT, typename DerivedT>
     class ContainerSerializerBase :
-        virtual public SerializerBase<TypenavigatorT, DerivedT>
+        public SerializerBase<TypenavigatorT, DerivedT>
     {
-
     public:
+        ContainerSerializerBase(const std::string& cppName, const std::string& aronDataTypename, const std::string& aronTypeTypename, const typename TypenavigatorT::PointerType& t) :
+            SerializerBase<TypenavigatorT, DerivedT>(cppName, aronDataTypename, aronTypeTypename, t)
+        {
+        }
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/NDArraySerializerBase.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/NDArraySerializerBase.h
index 7025af0ec..67b6c0435 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/NDArraySerializerBase.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/detail/NDArraySerializerBase.h
@@ -37,9 +37,11 @@ namespace armarx::aron::cppserializer::detail
 {
     template<typename TypenavigatorT, typename DerivedT>
     class NDArraySerializerBase :
-        virtual public SerializerBase<TypenavigatorT, DerivedT>
+        public SerializerBase<TypenavigatorT, DerivedT>
     {
-
     public:
+        NDArraySerializerBase(const std::string& cppName, const std::string& aronDataTypename, const std::string& aronTypeTypename, const typename TypenavigatorT::PointerType& t) :
+            SerializerBase<TypenavigatorT, DerivedT>(cppName, aronDataTypename, aronTypeTypename, t)
+        {}
     };
 }
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 2747635d9..ef187424d 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
@@ -37,32 +37,49 @@ namespace armarx::aron::cppserializer::detail
 {
     template<typename TypenavigatorT, typename DerivedT>
     class PrimitiveSerializerBase :
-        virtual public SerializerBase<TypenavigatorT, DerivedT>
+        public SerializerBase<TypenavigatorT, DerivedT>
     {
-
     public:
+        PrimitiveSerializerBase(const std::string& cppName, const std::string& aronDataTypename, const std::string& aronTypeTypename, const typename TypenavigatorT::PointerType& t) :
+            SerializerBase<TypenavigatorT, DerivedT>(cppName, aronDataTypename, aronTypeTypename, t)
+        {}
+
+        virtual CppBlockPtr getResetHardBlock(const std::string& accessor) const
+        {
+            CppBlockPtr b = CppBlockPtr(new CppBlock());
+            b->addLine(accessor + " = " + this->getFullTypenameGenerator() + "();");
+            return b;
+        }
+
+        virtual CppBlockPtr getResetSoftBlock(const std::string& accessor) const
+        {
+            CppBlockPtr b = CppBlockPtr(new CppBlock());
+            b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
+            return b;
+        }
+
         virtual CppBlockPtr getWriteBlock(const std::string& accessor) const override
         {
             CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-            std::string resolved_accessor = ResolveOptionalAccessor(accessor, this->typenavigator);
+            std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator);
             block_if_data->addLine("w.writePrimitive(" + resolved_accessor + ");");
 
-            return ResolveOptionalWriteBlock(accessor, block_if_data, this->typenavigator);
+            return this->ResolveMaybeWriteBlock(accessor, block_if_data, this->typenavigator);
         }
 
         virtual CppBlockPtr getReadBlock(const std::string& accessor) const override
         {
             CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
-            std::string resolved_accessor = ResolveOptionalAccessor(accessor, this->typenavigator);
+            std::string resolved_accessor = this->ResolveMaybeAccessor(accessor, this->typenavigator);
             block_if_data->addLine("r.readEndPrimitive(" + resolved_accessor + ");");
-            return ResolveOptionalReadBlock(accessor, "r.readStartPrimitive()", block_if_data, this->typenavigator);
+            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;");
+            b->addLine("\t return false;");
             return b;
         }
     };
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 637c5de5e..06370ed75 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
@@ -37,15 +37,15 @@ namespace armarx::aron::cppserializer::detail
 {
     template<typename TypenavigatorT, typename DerivedT>
     class SerializerBase :
-        virtual public cppserializer::Serializer
+        public cppserializer::Serializer
     {
     public:
         using PointerType = std::shared_ptr<DerivedT>;
         using TypenavigatorType = TypenavigatorT;
 
     public:
-        SerializerBase() = default;
-        SerializerBase(const typename TypenavigatorType::PointerType& t) :
+        SerializerBase(const std::string& cppName, const std::string& aronDataTypename, const std::string& aronTypeTypename, const typename TypenavigatorType::PointerType& t) :
+            Serializer(cppName, aronDataTypename, aronTypeTypename),
             typenavigator(t)
         {
             ARMARX_CHECK_NOT_NULL(typenavigator);
@@ -57,6 +57,8 @@ namespace armarx::aron::cppserializer::detail
             {
                 case type::Maybe::eNone:
                     return getCoreCppTypename();
+                case type::Maybe::eOptional:
+                    return "std::optional<" + getCoreCppTypename() + ">";
                 case type::Maybe::eRawPointer:
                     return "*" + getCoreCppTypename();
                 case type::Maybe::eSharedPointer:
@@ -64,7 +66,7 @@ namespace armarx::aron::cppserializer::detail
                 case type::Maybe::eUniquePointer:
                     return "std::unique_ptr<" + getCoreCppTypename() + ">";
                 default:
-                    throw error::AronException("Serializer", "getFullCppTypename", "Received unknown maybe enum");
+                    throw error::MaybeNotValidException("SerializerBase", "getFullCppTypename", "Received unknown maybe enum", typenavigator->getMaybe(), typenavigator->getPath());
             }
         }
 
@@ -74,6 +76,8 @@ namespace armarx::aron::cppserializer::detail
             {
                 case type::Maybe::eNone:
                     return getCoreCppTypename();
+                case type::Maybe::eOptional:
+                    return "std::make_optional<" + getCoreCppTypename() + ">";
                 case type::Maybe::eRawPointer:
                     return "new " + getCoreCppTypename();
                 case type::Maybe::eSharedPointer:
@@ -81,7 +85,7 @@ namespace armarx::aron::cppserializer::detail
                 case type::Maybe::eUniquePointer:
                     return "std::make_unique<" + getCoreCppTypename() + ">";
                 default:
-                    throw error::AronException("Serializer", "getFullTypenameGenerator", "Received unknown maybe enum");
+                    throw error::MaybeNotValidException("SerializerBase", "getFullTypenameGenerator", "Received unknown maybe enum", typenavigator->getMaybe(), typenavigator->getPath());
             }
         }
 
@@ -110,12 +114,13 @@ namespace armarx::aron::cppserializer::detail
             {
                 case type::Maybe::eNone:
                     return ".";
+                case type::Maybe::eOptional:
                 case type::Maybe::eRawPointer:
                 case type::Maybe::eSharedPointer:
                 case type::Maybe::eUniquePointer:
                     return "->";
                 default:
-                    throw error::AronException("Serializer", "nextEl", "Received unknown maybe enum");
+                    throw error::MaybeNotValidException("SerializerBase", "nextEl", "Received unknown maybe enum", typenavigator->getMaybe(), typenavigator->getPath());
             }
         }
 
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 70deabc17..73b9cfa58 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
@@ -28,10 +28,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     IntEnumSerializer::IntEnumSerializer(const typenavigator::IntEnumNavigatorPtr& e) :
-        Serializer(e->getEnumName(),
+        detail::SerializerBase<typenavigator::IntEnumNavigator, IntEnumSerializer>(e->getEnumName(),
                    simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronIntEnum))),
-        detail::SerializerBase<typenavigator::IntEnumNavigator, IntEnumSerializer>(e)
+                   simox::meta::get_type_name(typeid(type::AronIntEnum)), e)
     {
     }
 
@@ -75,7 +74,7 @@ namespace armarx::aron::cppserializer::serializer
         CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
         block_if_data->addLine(accessor + nextEl() + "write(w);");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr IntEnumSerializer::getReadBlock(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 b4c02b76e..34c90f38a 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
@@ -40,11 +40,11 @@ namespace armarx::aron::cppserializer::serializer
 
     // constructors
     EigenMatrixSerializer::EigenMatrixSerializer(const typenavigator::EigenMatrixNavigatorPtr& n) :
-        Serializer("Eigen::Matrix<" + ACCEPTED_TYPES.at(n->getTypename()).first + ", " + std::to_string(n->getRows()) + ", " + std::to_string(n->getCols()) + ">",
+        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))),
-        detail::SerializerBase<typenavigator::EigenMatrixNavigator, EigenMatrixSerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronEigenMatrix)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr EigenMatrixSerializer::getResetHardBlock(const std::string& accessor) const
@@ -73,20 +73,20 @@ namespace armarx::aron::cppserializer::serializer
         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()));");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     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()));");
-        return ResolveOptionalReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
+        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(" + otherInstanceAccessor + ")))");
+        b->addLine("if (not (" + accessor + nextEl() + "isApprox(" + ResolveMaybeAccessor(otherInstanceAccessor, typenavigator) + ")))");
         b->addLine("\t return false;");
         return b;
     }
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 fe619bd29..17eca9bd2 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
@@ -35,11 +35,11 @@ namespace armarx::aron::cppserializer::serializer
 
     // constructors
     EigenQuaternionSerializer::EigenQuaternionSerializer(const typenavigator::EigenQuaternionNavigatorPtr& n) :
-        Serializer("Eigen::Quaternion<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">",
+        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))),
-                   detail::SerializerBase<typenavigator::EigenQuaternionNavigator, EigenQuaternionSerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronEigenQuaternion)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr EigenQuaternionSerializer::getResetHardBlock(const std::string& accessor) const
@@ -68,14 +68,14 @@ namespace armarx::aron::cppserializer::serializer
         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()));");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     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()));");
-        return ResolveOptionalReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr EigenQuaternionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
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 88b4fed73..f7f4a1d03 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
@@ -36,11 +36,11 @@ namespace armarx::aron::cppserializer::serializer
 
     // constructors
     IVTCByteImageSerializer::IVTCByteImageSerializer(const typenavigator::IVTCByteImageNavigatorPtr& n) :
-        Serializer("CByteImage",
+        detail::NDArraySerializerBase<typenavigator::IVTCByteImageNavigator, IVTCByteImageSerializer>("CByteImage",
                    simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronIVTCByteImage))),
-        detail::SerializerBase<typenavigator::IVTCByteImageNavigator, IVTCByteImageSerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronIVTCByteImage)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr IVTCByteImageSerializer::getResetHardBlock(const std::string& accessor) const
@@ -50,13 +50,6 @@ namespace armarx::aron::cppserializer::serializer
         return b;
     }
 
-    CppBlockPtr IVTCByteImageSerializer::getResetSoftBlock(const std::string& accessor) const
-    {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + this->getFullCppTypename() + "();");
-        return b;
-    }
-
     CppBlockPtr IVTCByteImageSerializer::getResetSoftBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
@@ -76,7 +69,7 @@ namespace armarx::aron::cppserializer::serializer
         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));");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr IVTCByteImageSerializer::getReadBlock(const std::string& accessor) const
@@ -87,7 +80,7 @@ namespace armarx::aron::cppserializer::serializer
 
         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));");
-        return ResolveOptionalReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr IVTCByteImageSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.h
index 98383381a..07e618429 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.h
@@ -53,7 +53,6 @@ namespace armarx::aron::cppserializer::serializer
         virtual CppBlockPtr getResetHardBlock(const std::string& accessor) const override;
         virtual CppBlockPtr getResetSoftBlock(const std::string& accessor) const override;
         virtual CppBlockPtr getWriteTypeBlock(const std::string&) const override;
-        virtual CppBlockPtr getResetSoftBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteBlock(const std::string&) const override;
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
         virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
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 1c2623320..43e7f183f 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
@@ -28,11 +28,11 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     NDArraySerializer::NDArraySerializer(const typenavigator::NDArrayNavigatorPtr& n) :
-        Serializer("NDArray",
+        detail::NDArraySerializerBase<typenavigator::NDArrayNavigator, NDArraySerializer>("NDArray",
                    simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronNDArray))),
-        detail::SerializerBase<typenavigator::NDArrayNavigator, NDArraySerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronNDArray)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr NDArraySerializer::getResetHardBlock(const std::string& accessor) const
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 83e4c4689..3631eb1ff 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
@@ -40,11 +40,11 @@ namespace armarx::aron::cppserializer::serializer
 
     // constructors
     OpenCVMatSerializer::OpenCVMatSerializer(const typenavigator::OpenCVMatNavigatorPtr& n) :
-        Serializer("cv::Mat",
+        detail::NDArraySerializerBase<typenavigator::OpenCVMatNavigator, OpenCVMatSerializer>("cv::Mat",
                    simox::meta::get_type_name(typeid(data::AronNDArray)),
-                   simox::meta::get_type_name(typeid(type::AronOpenCVMat))),
-        detail::SerializerBase<typenavigator::OpenCVMatNavigator, OpenCVMatSerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronOpenCVMat)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr OpenCVMatSerializer::getResetHardBlock(const std::string& accessor) const
@@ -94,7 +94,7 @@ namespace armarx::aron::cppserializer::serializer
         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));");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr OpenCVMatSerializer::getReadBlock(const std::string& accessor) const
@@ -105,7 +105,7 @@ namespace armarx::aron::cppserializer::serializer
 
         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));");
-        return ResolveOptionalReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr OpenCVMatSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
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 428fd4553..13023745e 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
@@ -28,11 +28,11 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     OrientationSerializer::OrientationSerializer(const typenavigator::OrientationNavigatorPtr& n) :
-        Serializer("Eigen::Quaternion<" + n->ACCEPTED_TYPE + ">",
+        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))),
-        detail::SerializerBase<typenavigator::OrientationNavigator, OrientationSerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronOrientation)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr OrientationSerializer::getResetHardBlock(const std::string& accessor) const
@@ -61,14 +61,14 @@ namespace armarx::aron::cppserializer::serializer
         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()));");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     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()));");
-        return ResolveOptionalReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr OrientationSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
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 e86b8ec3f..09196a8b6 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
@@ -41,11 +41,11 @@ namespace armarx::aron::cppserializer::serializer
 
     // constructors
     PCLPointCloudSerializer::PCLPointCloudSerializer(const typenavigator::PCLPointCloudNavigatorPtr& n) :
-        Serializer("pcl::PointCloud<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">",
+        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))),
-        detail::SerializerBase<typenavigator::PCLPointCloudNavigator, PCLPointCloudSerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronPCLPointCloud)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr PCLPointCloudSerializer::getResetHardBlock(const std::string& accessor) const
@@ -81,7 +81,7 @@ namespace armarx::aron::cppserializer::serializer
         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()));");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PCLPointCloudSerializer::getReadBlock(const std::string& accessor) const
@@ -92,7 +92,7 @@ namespace armarx::aron::cppserializer::serializer
 
         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()));");
-        return ResolveOptionalReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PCLPointCloudSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.h
index 9c6ee7f80..88d9b337b 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.h
@@ -52,7 +52,6 @@ namespace armarx::aron::cppserializer::serializer
         virtual CppBlockPtr getResetHardBlock(const std::string& accessor) const override;
         virtual CppBlockPtr getResetSoftBlock(const std::string& accessor) const override;
         virtual CppBlockPtr getWriteTypeBlock(const std::string&) const override;
-        virtual CppBlockPtr getResetSoftBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteBlock(const std::string&) const override;
         virtual CppBlockPtr getReadBlock(const std::string&) const override;
         virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
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 4583bf988..f755e5442 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
@@ -28,11 +28,11 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     PoseSerializer::PoseSerializer(const typenavigator::PoseNavigatorPtr& n) :
-        Serializer("Eigen::Matrix<" + n->ACCEPTED_TYPE + ", " + simox::alg::to_string(n->ACCEPTED_DIMENSION, ", ") + ">",
+        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))),
-        detail::SerializerBase<typenavigator::PoseNavigator, PoseSerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronPose)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr PoseSerializer::getResetHardBlock(const std::string& accessor) const
@@ -61,14 +61,14 @@ namespace armarx::aron::cppserializer::serializer
         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()));");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     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()));");
-        return ResolveOptionalReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PoseSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
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 d14b7f593..109294d85 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
@@ -28,11 +28,11 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     PositionSerializer::PositionSerializer(const typenavigator::PositionNavigatorPtr& n) :
-        Serializer("Eigen::Matrix<" + n->ACCEPTED_TYPE + ", " + simox::alg::to_string(n->ACCEPTED_DIMENSION, ", ") + ">",
+        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))),
-        detail::SerializerBase<typenavigator::PositionNavigator, PositionSerializer>(n)
+                   simox::meta::get_type_name(typeid(type::AronPosition)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     CppBlockPtr PositionSerializer::getResetHardBlock(const std::string& accessor) const
@@ -61,14 +61,14 @@ namespace armarx::aron::cppserializer::serializer
         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()));");
 
-        return ResolveOptionalWriteBlock(accessor, block_if_data, typenavigator);
+        return ResolveMaybeWriteBlock(accessor, block_if_data, typenavigator);
     }
 
     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()));");
-        return ResolveOptionalReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
+        return ResolveMaybeReadBlock(accessor, "r.readStartNDArray()", block_if_data, typenavigator);
     }
 
     CppBlockPtr PositionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
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 dfe9fe835..cb0dcfdbb 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
@@ -33,9 +33,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     /* constructors */
     BoolSerializer::BoolSerializer(const typenavigator::BoolNavigatorPtr& e) :
-        Serializer("bool", simox::meta::get_type_name(typeid(data::AronBool)), simox::meta::get_type_name(typeid(type::AronBool))),
-        detail::SerializerBase<typenavigator::BoolNavigator, BoolSerializer>(e)
+        detail::PrimitiveSerializerBase<typenavigator::BoolNavigator, BoolSerializer>("bool", simox::meta::get_type_name(typeid(data::AronBool)), simox::meta::get_type_name(typeid(type::AronBool)), e)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     /* virtual implementations */
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 04605d022..aa1b6deb2 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
@@ -33,9 +33,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     /* constructors */
     DoubleSerializer::DoubleSerializer(const typenavigator::DoubleNavigatorPtr& e) :
-        Serializer("double", simox::meta::get_type_name(typeid(data::AronDouble)), simox::meta::get_type_name(typeid(type::AronDouble))),
-        detail::SerializerBase<typenavigator::DoubleNavigator, DoubleSerializer>(e)
+        detail::PrimitiveSerializerBase<typenavigator::DoubleNavigator, DoubleSerializer>("double", simox::meta::get_type_name(typeid(data::AronDouble)), simox::meta::get_type_name(typeid(type::AronDouble)), e)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     /* virtual implementations */
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 4092ae79f..b48272103 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
@@ -33,9 +33,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     /* constructors */
     FloatSerializer::FloatSerializer(const typenavigator::FloatNavigatorPtr& e) :
-        Serializer("float", simox::meta::get_type_name(typeid(data::AronFloat)), simox::meta::get_type_name(typeid(type::AronFloat))),
-        detail::SerializerBase<typenavigator::FloatNavigator, FloatSerializer>(e)
+        detail::PrimitiveSerializerBase<typenavigator::FloatNavigator, FloatSerializer>("float", simox::meta::get_type_name(typeid(data::AronFloat)), simox::meta::get_type_name(typeid(type::AronFloat)), e)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     /* virtual implementations */
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 fb1f6a3df..fb460dffb 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
@@ -33,9 +33,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     /* constructors */
     IntSerializer::IntSerializer(const typenavigator::IntNavigatorPtr& e) :
-        Serializer("int", simox::meta::get_type_name(typeid(data::AronInt)), simox::meta::get_type_name(typeid(type::AronInt))),
-        detail::SerializerBase<typenavigator::IntNavigator, IntSerializer>(e)
+        detail::PrimitiveSerializerBase<typenavigator::IntNavigator, IntSerializer>("int", simox::meta::get_type_name(typeid(data::AronInt)), simox::meta::get_type_name(typeid(type::AronInt)), e)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     /* virtual implementations */
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 9fe388f6e..90f03a5f5 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
@@ -33,9 +33,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     /* constructors */
     LongSerializer::LongSerializer(const typenavigator::LongNavigatorPtr& e) :
-        Serializer("long", simox::meta::get_type_name(typeid(data::AronLong)), simox::meta::get_type_name(typeid(type::AronLong))),
-        detail::SerializerBase<typenavigator::LongNavigator, LongSerializer>(e)
+        detail::PrimitiveSerializerBase<typenavigator::LongNavigator, LongSerializer>("long", simox::meta::get_type_name(typeid(data::AronLong)), simox::meta::get_type_name(typeid(type::AronLong)), e)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     /* virtual implementations */
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.h
index 7bb6311bd..5d0d0948e 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Long.h
@@ -30,19 +30,19 @@
 #include "../detail/PrimitiveSerializerBase.h"
 
 // ArmarX
-#include "../../../../../navigator/type/primitive/Int.h"
+#include "../../../../../navigator/type/primitive/Long.h"
 
 namespace armarx::aron::cppserializer::serializer
 {
-    class IntSerializer;
-    typedef std::shared_ptr<IntSerializer> IntSerializerPtr;
+    class LongSerializer;
+    typedef std::shared_ptr<LongSerializer> LongSerializerPtr;
 
-    class IntSerializer :
-        virtual public detail::PrimitiveSerializerBase<typenavigator::IntNavigator, IntSerializer>
+    class LongSerializer :
+        virtual public detail::PrimitiveSerializerBase<typenavigator::LongNavigator, LongSerializer>
     {
     public:
         /* constructors */
-        IntSerializer(const typenavigator::IntNavigatorPtr& e);
+        LongSerializer(const typenavigator::LongNavigatorPtr& e);
 
         /* virtual implementations */
         virtual CppBlockPtr getWriteTypeBlock(const std::string& accessor) const override;
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 6d8284087..f815628ff 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
@@ -33,9 +33,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     /* constructors */
     StringSerializer::StringSerializer(const typenavigator::StringNavigatorPtr& e) :
-        Serializer("std::string", simox::meta::get_type_name(typeid(data::AronString)), simox::meta::get_type_name(typeid(type::AronString))),
-        detail::SerializerBase<typenavigator::StringNavigator, StringSerializer>(e)
+        detail::PrimitiveSerializerBase<typenavigator::StringNavigator, StringSerializer>("std::string", simox::meta::get_type_name(typeid(data::AronString)), simox::meta::get_type_name(typeid(type::AronString)), e)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     /* virtual implementations */
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.h
index 7bb6311bd..d6bc43272 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/String.h
@@ -30,19 +30,19 @@
 #include "../detail/PrimitiveSerializerBase.h"
 
 // ArmarX
-#include "../../../../../navigator/type/primitive/Int.h"
+#include "../../../../../navigator/type/primitive/String.h"
 
 namespace armarx::aron::cppserializer::serializer
 {
-    class IntSerializer;
-    typedef std::shared_ptr<IntSerializer> IntSerializerPtr;
+    class StringSerializer;
+    typedef std::shared_ptr<StringSerializer> StringSerializerPtr;
 
-    class IntSerializer :
-        virtual public detail::PrimitiveSerializerBase<typenavigator::IntNavigator, IntSerializer>
+    class StringSerializer :
+        virtual public detail::PrimitiveSerializerBase<typenavigator::StringNavigator, StringSerializer>
     {
     public:
         /* constructors */
-        IntSerializer(const typenavigator::IntNavigatorPtr& e);
+        StringSerializer(const typenavigator::StringNavigatorPtr& e);
 
         /* virtual implementations */
         virtual CppBlockPtr getWriteTypeBlock(const std::string& accessor) const override;
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 ec8d94b14..39e5c6717 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
@@ -33,9 +33,9 @@ namespace armarx::aron::cppserializer::serializer
 {
     /* constructors */
     TimeSerializer::TimeSerializer(const typenavigator::TimeNavigatorPtr& e) :
-        Serializer("Time", simox::meta::get_type_name(typeid(data::AronLong)), simox::meta::get_type_name(typeid(type::AronTime))),
-        detail::SerializerBase<typenavigator::TimeNavigator, TimeSerializer>(e)
+        detail::PrimitiveSerializerBase<typenavigator::TimeNavigator, TimeSerializer>("IceUtil::Time", simox::meta::get_type_name(typeid(data::AronLong)), simox::meta::get_type_name(typeid(type::AronTime)), e)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
     }
 
     /* virtual implementations */
@@ -45,4 +45,25 @@ namespace armarx::aron::cppserializer::serializer
         b->addLine("w.writeTime({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
         return b;
     }
+
+    CppBlockPtr TimeSerializer::getWriteBlock(const std::string& accessor) const
+    {
+        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());");
+
+        return this->ResolveMaybeWriteBlock(accessor, block_if_data, this->typenavigator);
+    }
+
+    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);
+        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);
+    }
+
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.h
index 6a0b1929b..ff06aff3e 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Time.h
@@ -46,5 +46,10 @@ namespace armarx::aron::cppserializer::serializer
 
         /* virtual implementations */
         virtual CppBlockPtr getWriteTypeBlock(const std::string& accessor) const override;
+        virtual CppBlockPtr getWriteBlock(const std::string& accessor) const override;
+        virtual CppBlockPtr getReadBlock(const std::string& accessor) const override;
+
+    private:
+        static const constexpr char* TIME_SETTER_ACCESSOR_SUFFIX = "__time_setter";
     };
 }
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 a1922e0b3..6f1fa5a13 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
@@ -28,12 +28,12 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     IntEnumClassSerializer::IntEnumClassSerializer(const typenavigator::IntEnumNavigatorPtr& n) :
-        Serializer(n->getEnumName(), simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIntEnum))),
-        detail::SerializerBase<typenavigator::IntEnumNavigator, IntEnumClassSerializer>(n)
+        detail::SerializerBase<typenavigator::IntEnumNavigator, IntEnumClassSerializer>(n->getEnumName(), simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIntEnum)), n)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
         if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
-            throw error::AronException("IntEnumClassSerializer", "IntEnumClassSerializer", "Somehow the optional flag of a top level int enum declaration is set. This is not valid!");
+            throw error::MaybeNotValidException("IntEnumClassSerializer", "IntEnumClassSerializer", "Somehow the maybe flag of a top level int enum declaration is set. This is not valid!", typenavigator->getMaybe(), typenavigator->getPath());
         }
     }
 
@@ -93,7 +93,7 @@ namespace armarx::aron::cppserializer::serializer
     CppBlockPtr IntEnumClassSerializer::getWriteTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeInt({" + MAYBE_TO_STRING(typenavigator->getMaybe()) + "});");
+        b->addLine("w.writeInt({__aronMaybeType});");
         return b;
     }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
index 96a933957..8bc3ce9e2 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
@@ -48,7 +48,6 @@ namespace armarx::aron::cppserializer::serializer
 
         // virtual implementations
         std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const;
-        virtual std::vector<std::pair<std::string, std::string>> getCtorInitializers(const std::string&) const override;
         virtual CppBlockPtr getResetHardBlock(const std::string&) const override;
         virtual CppBlockPtr getResetSoftBlock(const std::string&) const override;
         virtual CppBlockPtr getWriteTypeBlock(const std::string&) const override;
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 2884e62a9..f4d2f4fe9 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
@@ -29,12 +29,12 @@ namespace armarx::aron::cppserializer::serializer
 {
     // constructors
     ObjectClassSerializer::ObjectClassSerializer(const typenavigator::ObjectNavigatorPtr& e) :
-        Serializer(e->getObjectName(), simox::meta::get_type_name(typeid(data::AronDict)), simox::meta::get_type_name(typeid(type::AronObject))),
-        detail::SerializerBase<typenavigator::ObjectNavigator, ObjectClassSerializer>(e)
+        detail::SerializerBase<typenavigator::ObjectNavigator, ObjectClassSerializer>(e->getObjectName(), simox::meta::get_type_name(typeid(data::AronDict)), simox::meta::get_type_name(typeid(type::AronObject)), e)
     {
+        ARMARX_CHECK_NOT_NULL(typenavigator);
         if (typenavigator->getMaybe() != type::Maybe::eNone)
         {
-            throw error::AronException("ObjectClassSerializer", "ObjectClassSerializer", "Somehow the optional flag of a top level object declaration is set. This is not valid!");
+            throw error::MaybeNotValidException("ObjectClassSerializer", "ObjectClassSerializer", "Somehow the maybe flag of a top level object declaration is set. This is not valid!", typenavigator->getMaybe(), typenavigator->getPath());
         }
     }
 
@@ -106,7 +106,7 @@ namespace armarx::aron::cppserializer::serializer
             b->addLine(extends_s->getFullCppTypename() + "::writeType(w);");
         }
 
-        b->addLine("w.writeStartObject({\"" + typenavigator->getObjectName() + "\", type_is_optional});");
+        b->addLine("w.writeStartObject({\"" + typenavigator->getObjectName() + "\", __aronMaybeType});");
         for (const auto& [key, child] : typenavigator->getMemberTypes())
         {
             const auto child_s = FromAronTypeNaviagtorPtr(child);
@@ -114,6 +114,7 @@ namespace armarx::aron::cppserializer::serializer
             CppBlockPtr b2 = child_s->getWriteTypeBlock(child_s->getCoreCppTypename());
             b->appendBlock(b2);
         }
+
         b->addLine("w.writeEndObject();");
         return b;
     }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.cpp
index 8b1378917..9a2b8a18a 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.cpp
@@ -1 +1,24 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T),
+ * Karlsruhe Institute of Technology (KIT), all rights reserved.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Fabian Peller-Konrad (fabian dot peller-konrad at kit dot edu)
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
 
+#include "Data.h"
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 b0aee6f1e..f4c1f26e2 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h
@@ -32,10 +32,7 @@
 
 #include <RobotAPI/libraries/aron/core/Concepts.h>
 
-#include <RobotAPI/libraries/aron/core/navigator/type/Navigator.h>
-#include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h>
-#include <RobotAPI/libraries/aron/core/navigator/type/container/List.h>
-#include <RobotAPI/libraries/aron/core/navigator/type/primitive/Primitive.h>
+#include <RobotAPI/libraries/aron/core/navigator/type/AllNavigators.h>
 
 
 namespace armarx::aron::xmltypereader
@@ -52,6 +49,7 @@ namespace armarx::aron::xmltypereader
         static constexpr const char* CODE_INCLUDES_TAG = "codeincludes";
         static constexpr const char* INCLUDES_TAG = "aronincludes";
         static constexpr const char* GENERATE_TYPES_TAG = "generatetypes";
+        static constexpr const char* AUTO_CODE_INCLUDE = "autoinclude";
 
         static constexpr const char* INCLUDE_TAG = "include";
         static constexpr const char* GENERATE_OBJECT_TAG = "object";
@@ -76,6 +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";
 
         // 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/codegenerator/typeReader/xml/Reader.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp
index bc2cc0b58..944f755f4 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp
@@ -129,7 +129,7 @@ namespace armarx::aron::xmltypereader
             std::vector<RapidXmlReaderNode> includes = children[cpp_includes_index].nodes();
             for (const auto& include : includes)
             {
-                this->codeIncludes.push_back(readCppInclude(include));
+                this->codeIncludes.push_back(readCodeInclude(include));
             }
         }
 
@@ -169,7 +169,7 @@ namespace armarx::aron::xmltypereader
         }
     }
 
-    std::string Reader::readCppInclude(const RapidXmlReaderNode& node) const
+    std::string Reader::readCodeInclude(const RapidXmlReaderNode& node)
     {
         Data::EnforceTagName(node, Data::INCLUDE_TAG);
         Data::EnforceAttribute(node, Data::INCLUDE_ATTRIBUTE_NAME);
@@ -177,16 +177,21 @@ namespace armarx::aron::xmltypereader
         return include;
     }
 
-    std::string Reader::readAronInclude(const RapidXmlReaderNode& node) const
+    std::string Reader::readAronInclude(const RapidXmlReaderNode& node)
     {
         Data::EnforceTagName(node, Data::INCLUDE_TAG);
-
         const std::string xmlinclude = Data::GetAttribute(node, Data::INCLUDE_ATTRIBUTE_NAME);
 
         // parse parent xml file and add objects to alreday known
         Reader anotherReader;
         anotherReader.parseFile(xmlinclude);
 
+        if (Data::HasAttribute(node, Data::AUTO_CODE_INCLUDE))
+        {
+            std::string codeinclude = simox::alg::replace_last(xmlinclude, ".xml", ".aron.generated.h");
+            this->codeIncludes.push_back(codeinclude);
+        }
+
         return xmlinclude;
     }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h
index e19083a9a..387b2888d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h
@@ -56,8 +56,8 @@ namespace armarx::aron::xmltypereader
     private:
         void parse(const RapidXmlReaderPtr& node);
 
-        std::string readCppInclude(const RapidXmlReaderNode& node) const;
-        std::string readAronInclude(const RapidXmlReaderNode& node) const;
+        std::string readCodeInclude(const RapidXmlReaderNode& node);
+        std::string readAronInclude(const RapidXmlReaderNode& node);
 
         typenavigator::ObjectNavigatorPtr readGenerateObject(const RapidXmlReaderNode& node) const;
         typenavigator::IntEnumNavigatorPtr readGenerateIntEnum(const RapidXmlReaderNode& node) const;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp
index fb6ef9bae..2a7310d54 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp
@@ -78,19 +78,40 @@ namespace armarx::aron::xmltypereader
         if (public_intenum_it != AllPublicIntEnums.end())
         {
             // copy the navigator
-            return typenavigator::Navigator::FromAronType(public_intenum_it->second->correspondingType->getResult());
+            return typenavigator::Navigator::FromAronType(public_intenum_it->second->correspondingType->toAronTypePtr());
         }
 
         const auto public_obj_it = AllPublicObjects.find(name);
         if (public_obj_it != AllPublicObjects.end())
         {
             // copy the navigator
-            return typenavigator::Navigator::FromAronType(public_obj_it->second->correspondingType->getResult());
+            return typenavigator::Navigator::FromAronType(public_obj_it->second->correspondingType->toAronTypePtr());
         }
 
         throw error::StringNotValidException("XMLReaderFactory", "ResolveTypename", "Could not find a tag. You can only access already finished public objects.", name);
     }
 
+    type::Maybe ReaderFactory::GetMaybe(const RapidXmlReaderNode& n)
+    {
+        if (Data::AttributeIsTrue(n, Data::OPTIONAL_NAME))
+        {
+            return type::Maybe::eOptional;
+        }
+        if (Data::AttributeIsTrue(n, Data::RAW_PTR_NAME))
+        {
+            return type::Maybe::eRawPointer;
+        }
+        if (Data::AttributeIsTrue(n, Data::SHARED_PTR_NAME))
+        {
+            return type::Maybe::eSharedPointer;
+        }
+        if (Data::AttributeIsTrue(n, Data::UNIQUE_PTR_NAME))
+        {
+            return type::Maybe::eUniquePointer;
+        }
+        return type::Maybe::eNone;
+    }
+
     // Object type
     typenavigator::NavigatorPtr ObjectReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
     {
@@ -132,10 +153,10 @@ namespace armarx::aron::xmltypereader
 
             std::vector<RapidXmlReaderNode> children = objectChild.nodes();
 
-            bool isOptional = Data::AttributeIsTrue(children[0], Data::OPTIONAL_NAME);
+            auto maybe = GetMaybe(children[0]);
             typenavigator::NavigatorPtr childNavigator = create(children[0], Path(path, key));
 
-            childNavigator->setOptional(isOptional);
+            childNavigator->setMaybe(maybe);
             aronObjectType->addMemberType(key, childNavigator);
         }
         ObjectGenerationStack.pop();
@@ -153,6 +174,7 @@ namespace armarx::aron::xmltypereader
             aronObjectType = typenavigator::ObjectNavigator::DynamicCastAndCheck(ResolveTypename(simox::alg::to_lower(newObject->typeName))); // make a copy
         }
 
+        ARMARX_CHECK_NOT_NULL(aronObjectType);
         return aronObjectType;
     }
 
@@ -165,9 +187,9 @@ namespace armarx::aron::xmltypereader
         Data::EnforceChildSize(node, 1);
         std::vector<RapidXmlReaderNode> listTypeNodeChildren = node.nodes();
         const RapidXmlReaderNode typeNode = listTypeNodeChildren[0];
-        bool isOptional = Data::AttributeIsTrue(typeNode, Data::OPTIONAL_NAME);
+        auto maybe = GetMaybe(typeNode);
         typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type"));
-        type->setOptional(isOptional);
+        type->setMaybe(maybe);
 
         list->setAcceptedType(type);
         return list;
@@ -182,9 +204,9 @@ namespace armarx::aron::xmltypereader
         Data::EnforceChildSize(node, 1);
         std::vector<RapidXmlReaderNode> dictTypeNodeChildren = node.nodes();
         const RapidXmlReaderNode typeNode = dictTypeNodeChildren[0];
-        bool isOptional = Data::AttributeIsTrue(typeNode, Data::OPTIONAL_NAME);
+        auto maybe = GetMaybe(typeNode);
         typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type"));
-        type->setOptional(isOptional);
+        type->setMaybe(maybe);
 
         dict->setAcceptedType(type);
         return dict;
@@ -209,10 +231,10 @@ namespace armarx::aron::xmltypereader
 
             std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes();
             const RapidXmlReaderNode typeNode = typeNodeChildren[0];
-            bool isOptional = Data::AttributeIsTrue(typeNode, Data::OPTIONAL_NAME);
+            auto maybe = GetMaybe(typeNode);
 
             typenavigator::NavigatorPtr type = create(typeNode, Path(path, "<" + std::to_string(i++) + ">"));
-            type->setOptional(isOptional);
+            type->setMaybe(maybe);
 
             tuple->addAcceptedType(type);
         }
@@ -236,20 +258,20 @@ namespace armarx::aron::xmltypereader
         std::vector<RapidXmlReaderNode> type1NodeChildren = nodeChildren[0].nodes();
         const RapidXmlReaderNode type1Node = type1NodeChildren[0];
 
-        bool isOptional1 = Data::AttributeIsTrue(type1Node, Data::OPTIONAL_NAME);
+        auto maybe1 = GetMaybe(type1Node);
 
         typenavigator::NavigatorPtr type1 = create(type1Node, Path(path, std::to_string(0)));
-        type1->setOptional(isOptional1);
+        type1->setMaybe(maybe1);
         pair->setFirstAcceptedType(type1);
 
         Data::EnforceChildSize(nodeChildren[1], 1);
         std::vector<RapidXmlReaderNode> type2NodeChildren = nodeChildren[1].nodes();
         const RapidXmlReaderNode type2Node = type2NodeChildren[0];
 
-        bool isOptional2 = Data::AttributeIsTrue(type2Node, Data::OPTIONAL_NAME);
+        auto maybe2 = GetMaybe(type2Node);
 
         typenavigator::NavigatorPtr type2 = create(type2Node, Path(path, std::to_string(1)));
-        type2->setOptional(isOptional2);
+        type2->setMaybe(maybe2);
         pair->setSecondAcceptedType(type2);
 
         return pair;
@@ -265,12 +287,6 @@ namespace armarx::aron::xmltypereader
     typenavigator::NavigatorPtr IVTCByteImageReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
     {
         Data::EnforceTagName(node, Data::GENERATE_IVT_CBYTE_IMAGE_MEMBER_TAG);
-        //Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME);
-
-        //int width = std::stoi(Data::GetAttributeWithDefault(node, Data::WIDTH_ATTRIBUTE_NAME, "1"));
-        //int height = std::stoi(Data::GetAttributeWithDefault(node, Data::HEIGHT_ATTRIBUTE_NAME, "1"));
-        //std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);;
-
         typenavigator::IVTCByteImageNavigatorPtr complex(new typenavigator::IVTCByteImageNavigator(path));
         return complex;
     }
@@ -309,15 +325,8 @@ namespace armarx::aron::xmltypereader
     typenavigator::NavigatorPtr OpenCVMatReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
     {
         Data::EnforceTagName(node, Data::GENERATE_OPENCV_MAT_MEMBER_TAG);
-        //Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME);
-
-        //std::vector<std::string> dimensions_as_strings = simox::alg::split(Data::GetAttributeWithDefault(node, Data::DIMENSIONS_ATTRIBUTE_NAME, "1"), ",");
-        //std::vector<int> dimensions = simox::alg::to_vec<int>(dimensions_as_strings);
-        //std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);
 
         typenavigator::OpenCVMatNavigatorPtr complex(new typenavigator::OpenCVMatNavigator(path));
-        //complex->setDimensions(dimensions);
-        //complex->setTypename(type);
         return complex;
     }
 
@@ -326,14 +335,9 @@ namespace armarx::aron::xmltypereader
     {
         Data::EnforceTagName(node, Data::GENERATE_PCL_POINTCLOUD_MEMBER_TAG);
         Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME);
-
-        //int width = std::stoi(Data::GetAttributeWithDefault(node, Data::WIDTH_ATTRIBUTE_NAME, "1"));
-        //int height = std::stoi(Data::GetAttributeWithDefault(node, Data::HEIGHT_ATTRIBUTE_NAME, "1"));
         std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);;
 
         typenavigator::PCLPointCloudNavigatorPtr complex(new typenavigator::PCLPointCloudNavigator(path));
-        //complex->setWidth(width);
-        //complex->setHeight(height);
         complex->setTypename(type);
         return complex;
     }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h
index 88e7ad01d..f94ed41ec 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h
@@ -55,6 +55,7 @@ namespace armarx::aron::xmltypereader
 
     protected:
         static typenavigator::NavigatorPtr ResolveTypename(const std::string&);
+        static type::Maybe GetMaybe(const RapidXmlReaderNode&);
 
     public:
         static std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr> AllPublicObjects;
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp
index fe1f4eb36..f5df053b9 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp
@@ -35,7 +35,7 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eObject:
             {
                 const auto readStartObject = reader.readStartObject();
-                writer.writeStartObject({readStartObject.name, readStartObject.isOptional});
+                writer.writeStartObject({readStartObject.name, readStartObject.maybe});
 
                 for (unsigned int i = 0; i < readStartObject.elements; ++i)
                 {
@@ -51,7 +51,7 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eDict:
             {
                 const auto readStartDict = reader.readStartDict();
-                writer.writeStartDict({readStartDict.isOptional});
+                writer.writeStartDict({readStartDict.maybe});
 
                 Converter::ReadAndConvert(reader, writer);
 
@@ -62,7 +62,7 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eTuple:
             {
                 const auto readStartTuple = reader.readStartTuple();
-                writer.writeStartTuple({readStartTuple.isOptional});
+                writer.writeStartTuple({readStartTuple.maybe});
 
                 for (unsigned int i = 0; i < readStartTuple.elements; ++i)
                 {
@@ -76,7 +76,7 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eList:
             {
                 const auto readStartList = reader.readStartList();
-                writer.writeStartList({readStartList.isOptional});
+                writer.writeStartList({readStartList.maybe});
 
                 Converter::ReadAndConvert(reader, writer);
 
@@ -87,91 +87,91 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eEigenMatrix:
             {
                 const auto readEigenMatrix = reader.readEigenMatrix();
-                writer.writeEigenMatrix({readEigenMatrix.rows, readEigenMatrix.cols, readEigenMatrix.type, readEigenMatrix.isOptional});
+                writer.writeEigenMatrix({readEigenMatrix.rows, readEigenMatrix.cols, readEigenMatrix.type, readEigenMatrix.maybe});
                 break;
             }
             case type::Descriptor::eEigenQuaternion:
             {
                 const auto readEigenQuaternion = reader.readEigenQuaternion();
-                writer.writeEigenQuaternion({readEigenQuaternion.type, readEigenQuaternion.isOptional});
+                writer.writeEigenQuaternion({readEigenQuaternion.type, readEigenQuaternion.maybe});
                 break;
             }
             case type::Descriptor::eIVTCByteImage:
             {
                 const auto readIVTCByteImage = reader.readIVTCByteImage();
-                writer.writeIVTCByteImage({readIVTCByteImage.isOptional});
+                writer.writeIVTCByteImage({readIVTCByteImage.maybe});
                 break;
             }
             case type::Descriptor::eOpenCVMat:
             {
                 const auto readOpenCVMat = reader.readOpenCVMat();
-                writer.writeOpenCVMat({readOpenCVMat.isOptional});
+                writer.writeOpenCVMat({readOpenCVMat.maybe});
                 break;
             }
             case type::Descriptor::ePCLPointCloud:
             {
                 const auto readPCLPointCloud = reader.readPCLPointCloud();
-                writer.writePCLPointCloud({readPCLPointCloud.type, readPCLPointCloud.isOptional});
+                writer.writePCLPointCloud({readPCLPointCloud.type, readPCLPointCloud.maybe});
                 break;
             }
             case type::Descriptor::ePosition:
             {
                 const auto readPosition = reader.readPosition();
-                writer.writePosition({readPosition.isOptional});
+                writer.writePosition({readPosition.maybe});
                 break;
             }
             case type::Descriptor::eOrientation:
             {
                 const auto readOrientation = reader.readOrientation();
-                writer.writeOrientation({readOrientation.isOptional});
+                writer.writeOrientation({readOrientation.maybe});
                 break;
             }
             case type::Descriptor::ePose:
             {
                 const auto readPose = reader.readPose();
-                writer.writePose({readPose.isOptional});
+                writer.writePose({readPose.maybe});
                 break;
             }
             case type::Descriptor::eInt:
             {
                 const auto readInt = reader.readInt();
-                writer.writeInt({readInt.isOptional});
+                writer.writeInt({readInt.maybe});
                 break;
             }
             case type::Descriptor::eLong:
             {
                 const auto readLong = reader.readLong();
-                writer.writeLong({readLong.isOptional});
+                writer.writeLong({readLong.maybe});
                 break;
             }
             case type::Descriptor::eFloat:
             {
                 const auto readFloat = reader.readFloat();
-                writer.writeFloat({readFloat.isOptional});
+                writer.writeFloat({readFloat.maybe});
                 break;
             }
             case type::Descriptor::eDouble:
             {
                 const auto readDouble = reader.readDouble();
-                writer.writeDouble({readDouble.isOptional});
+                writer.writeDouble({readDouble.maybe});
                 break;
             }
             case type::Descriptor::eString:
             {
                 const auto readString = reader.readString();
-                writer.writeString({readString.isOptional});
+                writer.writeString({readString.maybe});
                 break;
             }
             case type::Descriptor::eBool:
             {
                 const auto readBool = reader.readBool();
-                writer.writeBool({readBool.isOptional});
+                writer.writeBool({readBool.maybe});
                 break;
             }
             case type::Descriptor::eTime:
             {
                 const auto readTime = reader.readTime();
-                writer.writeTime({readTime.isOptional});
+                writer.writeTime({readTime.maybe});
                 break;
             }
             default:
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp
index 655bba4e0..0e87ee0e4 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp
@@ -49,7 +49,7 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eObject:
             {
                 auto casted = type::AronObjectPtr::dynamicCast(aron);
-                writer.writeStartObject({casted->objectName, casted->isOptional});
+                writer.writeStartObject({casted->objectName, casted->maybe});
                 for (const auto& [key, value] : casted->elementTypes)
                 {
                     writer.writeKey(key);
@@ -61,7 +61,7 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eDict:
             {
                 auto casted = type::AronDictPtr::dynamicCast(aron);
-                writer.writeStartDict({casted->isOptional});
+                writer.writeStartDict({casted->maybe});
                 Visitor::VisitAndSetup(writer, casted->acceptedType);
                 writer.writeEndDict();
                 break;
@@ -69,7 +69,7 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eTuple:
             {
                 auto casted = type::AronTuplePtr::dynamicCast(aron);
-                writer.writeStartTuple({casted->isOptional});
+                writer.writeStartTuple({casted->maybe});
                 for (const auto& value : casted->elementTypes)
                 {
                     Visitor::VisitAndSetup(writer, value);
@@ -80,7 +80,7 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eList:
             {
                 auto casted = type::AronListPtr::dynamicCast(aron);
-                writer.writeStartList({casted->isOptional});
+                writer.writeStartList({casted->maybe});
                 Visitor::VisitAndSetup(writer, casted->acceptedType);
                 writer.writeEndList();
                 break;
@@ -88,96 +88,96 @@ namespace armarx::aron::typeIO
             case type::Descriptor::eEigenMatrix:
             {
                 auto casted = type::AronEigenMatrixPtr::dynamicCast(aron);
-                writer.writeEigenMatrix({(unsigned int) casted->rows, (unsigned int) casted->cols, casted->typeName, casted->isOptional});
+                writer.writeEigenMatrix({(unsigned int) casted->rows, (unsigned int) casted->cols, casted->typeName, casted->maybe});
                 break;
             }
             case type::Descriptor::eEigenQuaternion:
             {
                 auto casted = type::AronEigenQuaternionPtr::dynamicCast(aron);
-                writer.writeEigenQuaternion({casted->typeName, casted->isOptional});
+                writer.writeEigenQuaternion({casted->typeName, casted->maybe});
                 break;
             }
             case type::Descriptor::eIVTCByteImage:
             {
                 auto casted = type::AronIVTCByteImagePtr::dynamicCast(aron);
-                writer.writeIVTCByteImage({casted->isOptional});
+                writer.writeIVTCByteImage({casted->maybe});
                 break;
             }
             case type::Descriptor::eOpenCVMat:
             {
                 auto casted = type::AronOpenCVMatPtr::dynamicCast(aron);
-                writer.writeOpenCVMat({casted->isOptional});
+                writer.writeOpenCVMat({casted->maybe});
                 break;
             }
             case type::Descriptor::ePCLPointCloud:
             {
                 auto casted = type::AronPCLPointCloudPtr::dynamicCast(aron);
-                writer.writePCLPointCloud({casted->typeName, casted->isOptional});
+                writer.writePCLPointCloud({casted->typeName, casted->maybe});
                 break;
             }
             case type::Descriptor::ePosition:
             {
                 auto casted = type::AronPositionPtr::dynamicCast(aron);
-                writer.writePosition({casted->isOptional});
+                writer.writePosition({casted->maybe});
                 break;
             }
             case type::Descriptor::eOrientation:
             {
                 auto casted = type::AronOrientationPtr::dynamicCast(aron);
-                writer.writeOrientation({casted->isOptional});
+                writer.writeOrientation({casted->maybe});
                 break;
             }
             case type::Descriptor::ePose:
             {
                 auto casted = type::AronPosePtr::dynamicCast(aron);
-                writer.writePose({casted->isOptional});
+                writer.writePose({casted->maybe});
                 break;
             }
             case type::Descriptor::eInt:
             {
                 auto casted = type::AronIntPtr::dynamicCast(aron);
-                writer.writeInt({casted->isOptional});
+                writer.writeInt({casted->maybe});
                 break;
             }
             case type::Descriptor::eLong:
             {
                 auto casted = type::AronLongPtr::dynamicCast(aron);
-                writer.writeLong({casted->isOptional});
+                writer.writeLong({casted->maybe});
                 break;
             }
             case type::Descriptor::eFloat:
             {
                 auto casted = type::AronFloatPtr::dynamicCast(aron);
-                writer.writeFloat({casted->isOptional});
+                writer.writeFloat({casted->maybe});
                 break;
             }
             case type::Descriptor::eDouble:
             {
                 auto casted = type::AronDoublePtr::dynamicCast(aron);
-                writer.writeDouble({casted->isOptional});
+                writer.writeDouble({casted->maybe});
                 break;
             }
             case type::Descriptor::eString:
             {
                 auto casted = type::AronStringPtr::dynamicCast(aron);
-                writer.writeString({casted->isOptional});
+                writer.writeString({casted->maybe});
                 break;
             }
             case type::Descriptor::eBool:
             {
                 auto casted = type::AronBoolPtr::dynamicCast(aron);
-                writer.writeBool({casted->isOptional});
+                writer.writeBool({casted->maybe});
                 break;
             }
             case type::Descriptor::eTime:
             {
                 auto casted = type::AronTimePtr::dynamicCast(aron);
-                writer.writeTime({casted->isOptional});
+                writer.writeTime({casted->maybe});
                 break;
             }
             default:
             {
-                throw error::DescriptorNotValidException("Visitor", "SetupWriterFromAronTypePtr", "Type-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc);
+                throw error::DescriptorNotValidException("Visitor", "VisitAndSetup", "Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc);
             }
         }
     }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/primitive/String.h b/source/RobotAPI/libraries/aron/core/navigator/data/primitive/String.h
index dbe79c3c9..cbf828629 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/primitive/String.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/primitive/String.h
@@ -57,9 +57,6 @@ namespace armarx::aron::datanavigator
         static data::AronStringPtr ToAronStringPtr(const StringNavigatorPtr& navigator);
 
         /* public member functions */
-        void setValue(const std::string& x);
-        std::string getValue() const;
-
         data::AronStringPtr toAronStringPtr() const;
 
         /* virtual implementations */
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml
index 5abc5d5a1..cd1dfccc4 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" />
+                <IVTCByteImage width="25" height="25" type="GrayScale" sharedptr="ja" />
             </ObjectChild>
 
             <ObjectChild key='the_rgb_image'>
-                <IVTCByteImage width="1920" height="1080" type="RGB24" />
+                <IVTCByteImage width="1920" height="1080" type="RGB24" sharedptr="ja" />
             </ObjectChild>
 
         </Object>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/OptionalTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/OptionalTest.xml
index 48cc19e61..7b402cb38 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/OptionalTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/OptionalTest.xml
@@ -43,7 +43,7 @@
                 </List>
             </ObjectChild>
 
-            <ObjectChild key='some_obj'>
+            <ObjectChild key='some_eigen_matrix'>
                 <EigenMatrix rows="25" cols="10" type="long" optional="ja"/>
             </ObjectChild>
 
-- 
GitLab