diff --git a/source/RobotAPI/interface/aron/Aron.ice b/source/RobotAPI/interface/aron/Aron.ice
index 74bb979874f6df5fd83b5e3fde4d337d64d436ba..9b5e967123ce716d4d836b0d01d32d7cb348b482 100644
--- a/source/RobotAPI/interface/aron/Aron.ice
+++ b/source/RobotAPI/interface/aron/Aron.ice
@@ -57,7 +57,7 @@ module armarx
             class AronDict extends AronType { AronType acceptedType; }
 
             // Complex Types (serialize to ndarray)
-            class AronNDArray extends AronType { AronIntSequence dimensions; int elementSize; string typeName; }
+            class AronNDArray extends AronType { AronIntSequence dimensions; string typeName; }
             class AronEigenMatrix extends AronType { AronIntSequence dimensions; string typeName; }
             class AronEigenQuaternion extends AronType { string typeName; }
             class AronIVTCByteImage extends AronType { int width; int height; string typeName; }
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 3a8e511cdd6db1cf7bb3d76bdec3e98d121f61db..c5d2bc6711486b9e51243d3e779752df8bc7a395 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
@@ -75,15 +75,6 @@ namespace armarx::aron::cppcodegenerator
         return ret;
     }
 
-    std::string Serializer::ResolveAccessor(const std::string& s, const typenavigator::NavigatorPtr& t)
-    {
-        if (t->isOptional())
-        {
-            return s + ".value()";
-        }
-        return s;
-    }
-
     std::string Serializer::EscapeAccessor(const std::string& accessor)
     {
         std::string escaped_accessor = accessor;
@@ -125,6 +116,35 @@ namespace armarx::aron::cppcodegenerator
         return FACTORY->create(n, n->getPath());
     }
 
+
+    std::string Serializer::ResolveOptionalAccessor(const std::string& s, const typenavigator::NavigatorPtr& t)
+    {
+        if (t->isOptional())
+        {
+            return s + ".value()";
+        }
+        return s;
+    }
+
+    CppBlockPtr Serializer::ResolveOptionalBlock(const std::string& accessor, const CppBlockPtr& block_if_data, const typenavigator::NavigatorPtr& typenavigator)
+    {
+        if (typenavigator->isOptional())
+        {
+            CppBlockPtr b = std::make_shared<CppBlock>();
+            b->addLine("if (" + accessor + ".has_value())");
+            b->addBlock(block_if_data);
+            b->addLine("else");
+            CppBlockPtr block_if_no_data = std::make_shared<CppBlock>();
+            block_if_no_data->addLine("w.writeNull();");
+            b->addBlock(block_if_no_data);
+            return b;
+        }
+        else
+        {
+            return block_if_data;
+        }
+    }
+
     // constructors
     Serializer::Serializer(const std::string& cppName, const std::string& aronDataTypename, const std::string& aronTypeTypename, SerializerAccessType accessType) :
         accessType(accessType),
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 9e05d78b18863ae48a84c741d41d583fb87d3f3d..8115d8de84c4dfeba78cf8c5b087c33156f9eb80 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
@@ -117,7 +117,6 @@ namespace armarx::aron::cppcodegenerator
         static std::string ResolveCppTypename(const std::string&);
         static std::vector<std::string> ResolveCppTypenames(const std::vector<std::string>&);
 
-        static std::string ResolveAccessor(const std::string&, const typenavigator::NavigatorPtr&);
         static std::string EscapeAccessor(const std::string&);
         static std::string UnescapeAccessor(const std::string&);
 
@@ -126,6 +125,9 @@ namespace armarx::aron::cppcodegenerator
 
         static SerializerPtr FromAronTypeNaviagtorPtr(const typenavigator::NavigatorPtr&);
 
+        static std::string ResolveOptionalAccessor(const std::string&, const typenavigator::NavigatorPtr&);
+        static CppBlockPtr ResolveOptionalBlock(const std::string&, const CppBlockPtr&, const typenavigator::NavigatorPtr&);
+
     protected:
         std::string nextEl() const
         {
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 a34a8c5e18ed7fdb3f67a409d79abc29eb9b8c14..a6978a13ea8bb2aaa3addba4db348d26e49d6b35 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
@@ -33,7 +33,7 @@ namespace armarx::aron::cppcodegenerator::serializer
                    simox::meta::get_type_name(typeid(data::AronDict)),
                    simox::meta::get_type_name(typeid(type::AronDict)),
                    (e->isOptional() ? SerializerAccessType::eOPTIONAL : SerializerAccessType::eDIRECT)),
-        navigator(e)
+        typenavigator(e)
     {
 
     }
@@ -73,12 +73,12 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr DictSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartDict({" + std::string(navigator->isOptional() ? "true" : "false") + "});");
+        b->addLine("w.writeStartDict({" + std::string(typenavigator->isOptional() ? "true" : "false") + "});");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR;
 
-        auto type_s = FromAronTypeNaviagtorPtr(navigator->getAcceptedType());
+        auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
         CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(type_s->getFullCppTypename());
         b->appendBlock(b2);
         b->addLine("w.writeEndDict();");
@@ -88,12 +88,12 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr DictSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartDict({" + std::string(navigator->isOptional() ? "true" : "false") + "});");
+        b->addLine("w.writeStartDict({" + std::string(typenavigator->isOptional() ? "true" : "false") + "});");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR;
 
-        auto type_s = FromAronTypeNaviagtorPtr(navigator->getAcceptedType());
+        auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
         CppBlockPtr b2 = type_s->getWriteCurrentTypeBlock(type_s->getFullCppTypename());
         b->appendBlock(b2);
         b->addLine("w.writeEndDict();");
@@ -102,50 +102,43 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr DictSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = std::make_shared<CppBlock>();
-        b->addLine("w.writeStartDict();");
+        CppBlockPtr block_if_data = std::make_shared<CppBlock>();
+        block_if_data->addLine("w.writeStartDict();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator_key = escaped_accessor + DICT_KEY_ACCESSOR;
         std::string accessor_iterator_val = escaped_accessor + DICT_VALUE_ACCESSOR;
-        std::string resolved_accessor = ResolveAccessor(accessor, navigator);
 
-        b->addLine("for (const auto& [" + accessor_iterator_key + ", " + accessor_iterator_val + "] : " + resolved_accessor + ") ");
+        std::string resolved_accessor = ResolveOptionalAccessor(accessor, typenavigator);
 
-        auto type_s = FromAronTypeNaviagtorPtr(navigator->getAcceptedType());
+        block_if_data->addLine("for (const auto& [" + accessor_iterator_key + ", " + accessor_iterator_val + "] : " + resolved_accessor + ") ");
+
+        auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
         CppBlockPtr b2 = CppBlockPtr(new CppBlock());
         b2->addLine("w.writeKey(" + accessor_iterator_key + ");");
-        b2 = CppBlock::MergeBlocks(b2, type_s->getWriteBlock(accessor_iterator_val));
-        b->addBlock(b2);
-        b->addLine("w.writeEndDict();");
-        return b;
+        b2->appendBlock(type_s->getWriteBlock(accessor_iterator_val));
+        block_if_data->addBlock(b2);
+        block_if_data->addLine("w.writeEndDict();");
+
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr DictSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (navigator->isOptional())
-        {
-            b->addLine(accessor + ".emplace();");
-        }
-        else
-        {
-            b->addLine(accessor + " = {};");
-        }
-
         b->addLine("r.readStartDict();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR;
         std::string accessor_iterator_key = escaped_accessor + DICT_KEY_ACCESSOR;
 
-        auto type_s = FromAronTypeNaviagtorPtr(navigator->getAcceptedType());
+        auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
 
         b->addLine("while(!r.readEndDict())");
         CppBlockPtr b2 = CppBlockPtr(new CppBlock());
         b2->addLine("std::string " + accessor_iterator_key + " = r.readKey();");
         b2->addLine(type_s->getFullCppTypename() + " " + accessor_iterator + ";");
-        b2 = CppBlock::MergeBlocks(b2, type_s->getReadBlock(accessor_iterator));
+        b2->appendBlock(type_s->getReadBlock(accessor_iterator));
         b2->addLine(accessor + nextEl() + "insert({" + accessor_iterator_key + ", " + accessor_iterator + "});");
 
         b->addBlock(b2);
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 9e2e459761cb8589877893609a04da40b5579030..99fa2f7ae929fc64086e4da7569a3857ca7f51a0 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
@@ -68,6 +68,6 @@ namespace armarx::aron::cppcodegenerator::serializer
         static constexpr const char* DICT_KEY_ACCESSOR = "_key";
         static constexpr const char* DICT_VALUE_ACCESSOR = "_value";
 
-        typenavigator::DictNavigatorPtr navigator;
+        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 56dbe6ed86622d9672f9160fdd4086178cecdf95..5afe9e9b66b2434117d8b03f4b40b9f2673b89a3 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
@@ -96,32 +96,23 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr ListSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartList();");
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("w.writeStartList();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + LIST_ITERATOR_ACCESSOR;
 
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
-        b->addLine("for(unsigned int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "size(); ++" + accessor_iterator + ")");
-        CppBlockPtr b2 = type_s->getWriteBlock(accessor + nextEl() + "at(" + accessor_iterator + ")");
-        b->addBlock(b2);
-        b->addLine("w.writeEndList();");
-        return b;
+        block_if_data->addLine("for(unsigned int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "size(); ++" + accessor_iterator + ")");
+        block_if_data->addBlock(type_s->getWriteBlock(accessor + nextEl() + "at(" + accessor_iterator + ")"));
+        block_if_data->addLine("w.writeEndList();");
+
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr ListSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->isOptional())
-        {
-            b->addLine(accessor + ".emplace();");
-        }
-        else
-        {
-            b->addLine(accessor + " = {};");
-        }
-
         b->addLine("r.readStartList();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
@@ -132,7 +123,7 @@ namespace armarx::aron::cppcodegenerator::serializer
 
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
         b2->addLine(type_s->getFullCppTypename() + " " + accessor_iterator + ";");
-        b2 = CppBlock::MergeBlocks(b2, type_s->getReadBlock(accessor_iterator));
+        b2->appendBlock(type_s->getReadBlock(accessor_iterator));
         b2->addLine(accessor + nextEl() + "push_back(" + accessor_iterator + ");");
 
         b->addBlock(b2);
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 855fd6682a05d1b409c814f4a2781635b45a9ae7..7e1aacd7e1f01cfde240866b34789526907bbc92 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
@@ -33,7 +33,7 @@ namespace armarx::aron::cppcodegenerator::serializer
                    simox::meta::get_type_name(typeid(data::AronDict)),
                    simox::meta::get_type_name(typeid(type::AronObject)),
                    (e->isOptional() ? SerializerAccessType::eOPTIONAL : SerializerAccessType::eDIRECT)),
-        navigator(e)
+        typenavigator(e)
     {
     }
 
@@ -57,36 +57,51 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr ObjectSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + nextEl() + "reset();");
+        if (typenavigator->isOptional())
+        {
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            b->addLine(accessor + nextEl() + "reset();");
+        }
         return b;
     }
 
     CppBlockPtr ObjectSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + nextEl() + "initialize();");
+        if (typenavigator->isOptional())
+        {
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            b->addLine(accessor + nextEl() + "initialize();");
+        }
         return b;
     }
 
     CppBlockPtr ObjectSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + "::writeInitialType(w, " + std::string(navigator->isOptional() ? "true" : "false") + ");");
+        b->addLine(accessor + "::writeInitialType(w, " + std::string(typenavigator->isOptional() ? "true" : "false") + ");");
         return b;
     }
 
     CppBlockPtr ObjectSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + nextEl() + "writeCurrentType(w, " + std::string(navigator->isOptional() ? "true" : "false") + ");");
+        b->addLine(accessor + nextEl() + "writeCurrentType(w, " + std::string(typenavigator->isOptional() ? "true" : "false") + ");");
         return b;
     }
 
     CppBlockPtr ObjectSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + nextEl() + "write(w);");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + nextEl() + "write(w);");
+
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr ObjectSerializer::getReadBlock(const std::string& accessor) 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 b879a8794e7b1f25d8d409581bcfb477d21344dd..226d08f67d0be1bff71d60caace9281cca914b4a 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
@@ -66,6 +66,6 @@ namespace armarx::aron::cppcodegenerator::serializer
         // members
         static constexpr const char* EXTENDS_ITERATOR_ACCESSOR = "_extends";
 
-        typenavigator::ObjectNavigatorPtr navigator;
+        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 9981bb644a260f83adbdc3779ab9fc108253fb9f..56d0ff682a608410b62edc119a9765d808a16f87 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
@@ -57,15 +57,40 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PairSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (typenavigator->isOptional())
+        {
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
+            CppBlockPtr b21 = child_s1->getInitializeBlock(accessor + nextEl() + "first");
+            b->appendBlock(b21);
 
-        auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
-        CppBlockPtr b21 = child_s1->getInitializeBlock(accessor + nextEl() + "first");
-        b->appendBlock(b21);
+            auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
+            CppBlockPtr b22 = child_s2->getInitializeBlock(accessor + nextEl() + "second");
+            b->appendBlock(b22);
+        }
+        return b;
+    }
 
-        auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
-        CppBlockPtr b22 = child_s2->getInitializeBlock(accessor + nextEl() + "second");
-        b->appendBlock(b22);
+    CppBlockPtr PairSerializer::getResetBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (typenavigator->isOptional())
+        {
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
+            CppBlockPtr b21 = child_s1->getResetBlock(accessor + nextEl() + "first");
+            b->appendBlock(b21);
 
+            auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
+            CppBlockPtr b22 = child_s2->getResetBlock(accessor + nextEl() + "second");
+            b->appendBlock(b22);
+        }
         return b;
     }
 
@@ -115,62 +140,35 @@ namespace armarx::aron::cppcodegenerator::serializer
         return b;
     }
 
-    CppBlockPtr PairSerializer::getResetBlock(const std::string& accessor) const
-    {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-        auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
-        CppBlockPtr b21 = child_s1->getResetBlock(accessor + nextEl() + "first");
-        b->appendBlock(b21);
-
-        auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
-        CppBlockPtr b22 = child_s2->getResetBlock(accessor + nextEl() + "second");
-        b->appendBlock(b22);
-
-        return b;
-    }
-
     CppBlockPtr PairSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartList();");
-
-        std::string resolved_accessor = ResolveAccessor(accessor, typenavigator);
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("w.writeStartList();");
 
         auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
-        CppBlockPtr b21 = child_s1->getWriteBlock(resolved_accessor + nextEl() + "first");
-        b->appendBlock(b21);
+        CppBlockPtr b21 = child_s1->getWriteBlock(accessor + nextEl() + "first");
+        block_if_data->appendBlock(b21);
 
         auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
-        CppBlockPtr b22 = child_s2->getWriteBlock(resolved_accessor + nextEl() + "second");
-        b->appendBlock(b22);
+        CppBlockPtr b22 = child_s2->getWriteBlock(accessor + nextEl() + "second");
+        block_if_data->appendBlock(b22);
 
-        b->addLine("w.writeEndList();");
-        return b;
+        block_if_data->addLine("w.writeEndList();");
+
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PairSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->isOptional())
-        {
-            b->addLine(accessor + ".emplace();");
-        }
-        else
-        {
-            b->addLine(accessor + " = {};");
-        }
-
         b->addLine("r.readStartList();");
 
-        std::string resolved_accessor = ResolveAccessor(accessor, typenavigator);
-
         auto child_s1 = FromAronTypeNaviagtorPtr(typenavigator->getFirstAcceptedType());
-        CppBlockPtr b21 = child_s1->getReadBlock(resolved_accessor + nextEl() + "first");
+        CppBlockPtr b21 = child_s1->getReadBlock(accessor + nextEl() + "first");
         b->appendBlock(b21);
 
         auto child_s2 = FromAronTypeNaviagtorPtr(typenavigator->getSecondAcceptedType());
-        CppBlockPtr b22 = child_s2->getReadBlock(resolved_accessor + nextEl() + "second");
+        CppBlockPtr b22 = child_s2->getReadBlock(accessor + nextEl() + "second");
         b->appendBlock(b22);
 
         b->addLine("r.readEndList();");
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 7643ef634fec65abe47251236db9af1844a5f8c8..9a8e86fbb3bea08ac5b132e2e4f3c30206e5a7a0 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
@@ -57,13 +57,39 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr TupleSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (typenavigator->isOptional())
+        {
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            unsigned int i = 0;
+            for (const auto& child : typenavigator->getAcceptedTypes())
+            {
+                auto child_s = FromAronTypeNaviagtorPtr(child);
+                CppBlockPtr b2 = child_s->getInitializeBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
+                b->appendBlock(b2);
+            }
+        }
+        return b;
+    }
 
-        unsigned int i = 0;
-        for (const auto& child : typenavigator->getAcceptedTypes())
+    CppBlockPtr TupleSerializer::getResetBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (typenavigator->isOptional())
         {
-            auto child_s = FromAronTypeNaviagtorPtr(child);
-            CppBlockPtr b2 = child_s->getInitializeBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
-            b->appendBlock(b2);
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            unsigned int i = 0;
+            for (const auto& type : typenavigator->getAcceptedTypes())
+            {
+                auto type_s = FromAronTypeNaviagtorPtr(type);
+                CppBlockPtr b2 = type_s->getResetBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
+                b->appendBlock(b2);
+            }
         }
         return b;
     }
@@ -106,53 +132,31 @@ namespace armarx::aron::cppcodegenerator::serializer
         return b;
     }
 
-    CppBlockPtr TupleSerializer::getResetBlock(const std::string& accessor) const
-    {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-        unsigned int i = 0;
-        for (const auto& type : typenavigator->getAcceptedTypes())
-        {
-            auto type_s = FromAronTypeNaviagtorPtr(type);
-            CppBlockPtr b2 = type_s->getResetBlock("std::get<" + std::to_string(i++) + ">(" + accessor + ")");
-            b->appendBlock(b2);
-        }
-        return b;
-    }
-
     CppBlockPtr TupleSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartList();");
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("w.writeStartList();");
 
-        std::string resolved_accessor = ResolveAccessor(accessor, typenavigator);
+        std::string resolved_accessor = ResolveOptionalAccessor(accessor, typenavigator);
 
         unsigned int i = 0;
         for (const auto& type : typenavigator->getAcceptedTypes())
         {
             auto type_s = FromAronTypeNaviagtorPtr(type);
             CppBlockPtr b2 = type_s->getWriteBlock("std::get<" + std::to_string(i++) + ">(" + resolved_accessor + ")");
-            b->appendBlock(b2);
+            block_if_data->appendBlock(b2);
         }
-        b->addLine("w.writeEndList();");
-        return b;
+        block_if_data->addLine("w.writeEndList();");
+
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr TupleSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        if (typenavigator->isOptional())
-        {
-            b->addLine(accessor + ".emplace();");
-        }
-        else
-        {
-            b->addLine(accessor + " = {};");
-        }
-
         b->addLine("r.readStartList();");
 
-        std::string resolved_accessor = ResolveAccessor(accessor, typenavigator);
+        std::string resolved_accessor = ResolveOptionalAccessor(accessor, typenavigator);
 
         unsigned int i = 0;
         for (const auto& type : typenavigator->getAcceptedTypes())
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 f0c1a3ff09316adc0a66c43b47ec29e09edee5fb..899f4fe1fe9e16c77884e7cb31de5cc5498cd9a7 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
@@ -32,7 +32,7 @@ namespace armarx::aron::cppcodegenerator::serializer
                    simox::meta::get_type_name(typeid(data::AronNDArray)),
                    simox::meta::get_type_name(typeid(type::AronIntEnum)),
                    (e->isOptional() ? SerializerAccessType::eOPTIONAL : SerializerAccessType::eDIRECT)),
-        navigator(e)
+        typenavigator(e)
     {
     }
 
@@ -56,21 +56,28 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr IntEnumSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + nextEl() + "reset();");
+        if (typenavigator->isOptional())
+        {
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            b->addLine(accessor + nextEl() + "reset();");
+        }
         return b;
     }
 
     CppBlockPtr IntEnumSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + "::writeInitialType(w, " + std::string(navigator->isOptional() ? "true" : "false") + ");");
+        b->addLine(accessor + "::writeInitialType(w, " + std::string(typenavigator->isOptional() ? "true" : "false") + ");");
         return b;
     }
 
     CppBlockPtr IntEnumSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + nextEl() + "writeCurrentType(w, " + std::string(navigator->isOptional() ? "true" : "false") + ");");
+        b->addLine(accessor + nextEl() + "writeCurrentType(w, " + std::string(typenavigator->isOptional() ? "true" : "false") + ");");
         return b;
     }
 
@@ -83,9 +90,10 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr IntEnumSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + nextEl() + "write(w);");
-        return b;
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine(accessor + nextEl() + "write(w);");
+
+        return ResolveOptionalBlock(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/enum/IntEnum.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.h
index abb82b441cb59b139ec531110523a7844216273d..ba53bb47e8b7a406eab9d2ad738c48df0b3c62ab 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.h
@@ -65,6 +65,6 @@ namespace armarx::aron::cppcodegenerator::serializer
         // Members
         static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES;
 
-        typenavigator::IntEnumNavigatorPtr navigator;
+        typenavigator::IntEnumNavigatorPtr typenavigator;
     };
 }
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 9c5dafcafa821eb06a542a3e1b591e03168b2f87..b2bd6844f62a1cfbc495637412ad29ae3401c970 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
@@ -68,7 +68,7 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr EigenMatrixSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
@@ -95,10 +95,10 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr EigenMatrixSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        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()));");
 
-        b->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 b;
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr EigenMatrixSerializer::getReadBlock(const std::string& accessor) const
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 2a899daa0c70cdc12a0e2b091cb365559b90a01f..b9e1d3ced88d63d72776582c59d875b2b15998e3 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
@@ -63,7 +63,7 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr EigenQuaternionSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
@@ -90,12 +90,10 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr EigenQuaternionSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + ", " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data()));");
 
-        std::string resolved_accessor = ResolveAccessor(accessor, typenavigator);
-
-        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + ", " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + resolved_accessor + nextEl() + "coeffs().data()));");
-        return b;
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr EigenQuaternionSerializer::getReadBlock(const std::string& accessor) 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 478f1a789ee68f555f4e9e0bca5b1328a65f0453..5a57d93733ba445caa8767f64b3d10f5340f2b7c 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
@@ -92,10 +92,10 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr IVTCByteImageSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        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));");
 
-        b->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 b;
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr IVTCByteImageSerializer::getReadBlock(const std::string& accessor) const
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 50609e51f789cb353c716623d0bf54863a93cdcc..c5a586b86153251f0064c95b79c0b17e2182f1fc 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
@@ -55,14 +55,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr NDArraySerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
     CppBlockPtr NDArraySerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
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 f926b370cadaf3555fdabdb80a31fc19ed0205af..b782c80d215fb1a0e4110ec257152845b4720b50 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
@@ -90,7 +90,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr OpenCVMatSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "(std::vector<int>({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}), " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ");");
+        if (typenavigator->isOptional())
+        {
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            b->addLine(accessor + " = " + getFullCppTypename() + "(std::vector<int>({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}), " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ");");
+        }
         return b;
     }
 
@@ -120,20 +127,21 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr OpenCVMatSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR;
         std::string accessor_iterator = escaped_accessor + ITERATOR_ACCESSOR;
 
-        b->addLine("std::vector<int> " + accessor_dimensions + ";");
-        b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "dims; ++" + accessor_iterator + ")");
+        block_if_data->addLine("std::vector<int> " + accessor_dimensions + ";");
+        block_if_data->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + nextEl() + "dims; ++" + accessor_iterator + ")");
         CppBlockPtr b2 = CppBlockPtr(new CppBlock());
         b2->addLine(accessor_dimensions + ".push_back(" + accessor + nextEl() + "size[" + accessor_iterator + "]);");
-        b->appendBlock(b2);
-        b->addLine(accessor_dimensions + ".push_back(" + accessor + nextEl() + "elemSize());");
-        b->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + nextEl() + "type()), reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data));");
-        return b;
+        block_if_data->appendBlock(b2);
+        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 ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr OpenCVMatSerializer::getReadBlock(const std::string& accessor) 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 ba47bde1d4cda9f0081513cb149a423e34a6692b..9aaddd38818a2ddc6a3825b1aebe0aa11acb6ebe 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
@@ -56,7 +56,7 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr OrientationSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
@@ -83,10 +83,10 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr OrientationSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data()));");
 
-        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "coeffs().data()));");
-        return b;
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr OrientationSerializer::getReadBlock(const std::string& accessor) 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 4fe173666fc0d63da3e2f25721d178d0b5ecf9a7..314779853e220f018614beef1b0ca2e43bba7424 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
@@ -69,7 +69,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PCLPointCloudSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height);");
+        if (typenavigator->isOptional())
+        {
+            b->addLine(accessor + " = {};");
+        }
+        else
+        {
+            b->addLine(accessor + " = " + getFullCppTypename() + "(" + accessor + nextEl() + "width, " + accessor + nextEl() + "height);");
+        }
         return b;
     }
 
@@ -96,10 +103,10 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr PCLPointCloudSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        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()));");
 
-        b->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 b;
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PCLPointCloudSerializer::getReadBlock(const std::string& accessor) const
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 9ee7758b12e559e57952d181aa0b8c223f5e6a8f..135379e92efec0ada4c52553587db0105ea845b9 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
@@ -56,14 +56,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PoseSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
     CppBlockPtr PoseSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
@@ -83,12 +83,10 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr PoseSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data()));");
 
-        std::string resolved_accessor = ResolveAccessor(accessor, typenavigator);
-
-        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + resolved_accessor + nextEl() + "data()));");
-        return b;
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PoseSerializer::getReadBlock(const std::string& accessor) 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 672d01502f52fec8c1737f15a3366acbe3ee17b2..c87defd2cbb82dbe04c2944be69b8b91029ed8fc 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
@@ -56,14 +56,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PositionSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
     CppBlockPtr PositionSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getFullCppTypename() + "();");
+        b->addLine(accessor + " = {};");
         return b;
     }
 
@@ -83,12 +83,10 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     CppBlockPtr PositionSerializer::getWriteBlock(const std::string& accessor) const
     {
-        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock());
+        block_if_data->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + nextEl() + "data()));");
 
-        std::string resolved_accessor = ResolveAccessor(accessor, typenavigator);
-
-        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + resolved_accessor + nextEl() + "data()));");
-        return b;
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator);
     }
 
     CppBlockPtr PositionSerializer::getReadBlock(const std::string& accessor) const
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Primitive.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Primitive.cpp
index fd1abae709f062a8137963f0b47a7f4a0d478606..323414fbb13311d7061a9c02f50db0173d66e232 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Primitive.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Primitive.cpp
@@ -103,18 +103,17 @@ namespace armarx::aron::cppcodegenerator::serializer
     \
     CppBlockPtr upperType##Serializer::getWriteBlock(const std::string& accessor) const \
     { \
-        CppBlockPtr b = CppBlockPtr(new CppBlock()); \
+        CppBlockPtr block_if_data = CppBlockPtr(new CppBlock()); \
+        block_if_data->addLine("w.writePrimitive(" + accessor + ");"); \
         \
-        std::string resolved_accessor = ResolveAccessor(accessor, typenavigator); \
-        b->addLine("w.writePrimitive(" + resolved_accessor + ");"); \
-        return b; \
+        return ResolveOptionalBlock(accessor, block_if_data, typenavigator); \
     } \
     \
     CppBlockPtr upperType##Serializer::getReadBlock(const std::string& accessor) const \
     { \
         CppBlockPtr b = CppBlockPtr(new CppBlock()); \
         \
-        b->addLine("r.readPrimitive("+accessor+");"); \
+        b->addLine("r.readPrimitive(" + accessor + ");"); \
         return b; \
     } \
     \
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 370c58e31207d3aabb72e62801e8322b5895198f..75f466fbe5356e8cab4ad557e476dbd42dc50255 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
@@ -152,21 +152,11 @@ namespace armarx::aron::cppcodegenerator::serializer
         for (const auto& [key, child] : navigator->getMemberTypes())
         {
             const auto child_s = FromAronTypeNaviagtorPtr(child);
-            CppBlockPtr q = CppBlockPtr(new CppBlock());
-
-            q->addLine("w.writeKey(\"" + key + "\");");
-            CppBlockPtr child_b = child_s->getWriteBlock(key);
-            q->appendBlock(child_b);
+            CppBlockPtr child_b = CppBlockPtr(new CppBlock());
 
-            if (child->isOptional())
-            {
-                b->addLine("if (" + key + ".has_value())");
-                b->addBlock(q);
-            }
-            else
-            {
-                b->appendBlock(q);
-            }
+            child_b->addLine("w.writeKey(\"" + key + "\");");
+            child_b->appendBlock(child_s->getWriteBlock(key));
+            b->appendBlock(child_b);
         }
         b->addLine("w.writeEndDict();");
         return b;
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.cpp
index 6ebf4a1ffedb68147602ff9b718afaa155b8dbb8..2d6a9ff042aeb6e04e75aa8e8fa0de65ab68da38 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.cpp
@@ -22,46 +22,6 @@
 
 namespace armarx::aron::dataIO
 {
-    void ReaderInterface::readPrimitive(std::optional<int>& o)
-    {
-        int i;
-        readPrimitive(i);
-        o = i;
-    }
 
-    void ReaderInterface::readPrimitive(std::optional<long>& o)
-    {
-        long i;
-        readPrimitive(i);
-        o = i;
-    }
-
-    void ReaderInterface::readPrimitive(std::optional<float>& o)
-    {
-        float i;
-        readPrimitive(i);
-        o = i;
-    }
-
-    void ReaderInterface::readPrimitive(std::optional<double>& o)
-    {
-        double i;
-        readPrimitive(i);
-        o = i;
-    }
-
-    void ReaderInterface::readPrimitive(std::optional<std::string>& o)
-    {
-        std::string i;
-        readPrimitive(i);
-        o = i;
-    }
-
-    void ReaderInterface::readPrimitive(std::optional<bool>& o)
-    {
-        bool i;
-        readPrimitive(i);
-        o = i;
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h
index 6c7019ae5fd842babfb929640f5e0ccd895ee9a2..affc2342ebf2b6097d6a95432d10a221659052ba 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h
@@ -53,13 +53,6 @@ namespace armarx::aron::dataIO
         virtual void readPrimitive(std::string&) = 0;
         virtual void readPrimitive(bool&) = 0;
 
-        void readPrimitive(std::optional<int>&);
-        void readPrimitive(std::optional<long>&);
-        void readPrimitive(std::optional<float>&);
-        void readPrimitive(std::optional<double>&);
-        void readPrimitive(std::optional<std::string>&);
-        void readPrimitive(std::optional<bool>&);
-
         template<class T>
         T readPrimitive()
         {
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.cpp
index e78a27bd58bbba3fa6f64c28b7fa8d721b94c0fd..2a5ff93011457741da3f3dfb89902fb8fa794d26 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.cpp
@@ -19,3 +19,9 @@
 */
 
 #include "Writer.h"
+
+
+namespace armarx::aron::dataIO
+{
+
+}
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h b/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h
index 89aca64073cc652b2a72d3da62b7ce0a7c3e76d9..0cd1caec4d0b515a104eeb935f23df946e1b6db3 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h
@@ -27,8 +27,7 @@
 // ArmarX
 #include <RobotAPI/interface/aron.h>
 #include <RobotAPI/libraries/aron/core/Config.h>
-
-
+#include <RobotAPI/libraries/aron/core/Descriptor.h>
 
 namespace armarx::aron::dataIO
 {
@@ -52,6 +51,8 @@ namespace armarx::aron::dataIO
         virtual void writePrimitive(const std::string&) = 0;
         virtual void writePrimitive(bool) = 0;
 
+        virtual void writeNull() = 0;
+
         virtual void writeKey(const std::string&) = 0;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h
index 2b9379be17ea9b3da8637547f1974fe1a57b4136..5fff9e81c3ac441f1e4dbd85942c2eeff3d9f8ba 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h
@@ -47,6 +47,7 @@ namespace armarx::aron::dataIO
         // Interface
         virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::Descriptor::eUnknown) const = 0;
         virtual ElementTypename getNextElement() const = 0;
+        virtual bool hasNextElement() const = 0;
 
         // General implementation
         ElementTypename getElement() const
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp
index d3cefab09eb9c25ff51be877bf4759abc647938c..22eabe145bed2daab27a4ce7867c84adf4967928 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp
@@ -188,8 +188,11 @@ namespace armarx::aron::dataIO::reader
         auto token = stack.top();
         if (token->hasKey(k))
         {
-            token->setCurrentKey(k);
-            return true;
+            if (token->hasNextElement())
+            {
+                token->setCurrentKey(k);
+                return true;
+            }
         }
         return false;
     }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReaderToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReaderToken.h
index 4b85fe7725b3840c2e9c2b87a5d6cc9c48f9e63f..7f4bf59d7ee622aebcb03bea218c91816cc11d04 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReaderToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReaderToken.h
@@ -96,6 +96,27 @@ namespace armarx::aron::dataIO::reader
             }
         }
 
+        virtual bool hasNextElement() const override
+        {
+            switch (descriptor)
+            {
+                case data::Descriptor::eDict:
+                {
+                    datanavigator::DictNavigatorPtr casted = datanavigator::DictNavigator::DynamicCast(element);
+                    datanavigator::NavigatorPtr ret = casted->getElement(getCurrentKey());
+                    return (bool) ret;
+                }
+                case data::Descriptor::eList:
+                {
+                    datanavigator::ListNavigatorPtr casted = datanavigator::ListNavigator::DynamicCast(element);
+                    datanavigator::NavigatorPtr ret = casted->getElement(currentIndex);
+                    return (bool) ret;
+                }
+                default:
+                    throw error::DescriptorNotValidException("NavigatorReaderToken", "hasData", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor);
+            }
+        }
+
     private:
 
     };
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.cpp
index 59a2351ac168da60e03145a3dd9e6d0723859f0e..43a3082980cb3817c8a4fe152d69edc05bd7659b 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.cpp
@@ -180,8 +180,11 @@ namespace armarx::aron::dataIO::reader
         auto token = stack.top();
         if (token->hasKey(k))
         {
-            token->setCurrentKey(k);
-            return true;
+            if (token->hasNextElement())
+            {
+                token->setCurrentKey(k);
+                return true;
+            }
         }
         return false;
     }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h
index 04acd920b51789d2ce925f8aab48c268baf3fed7..29dccb820fd951c5baa1eab625241960c1b345ed 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h
@@ -133,7 +133,26 @@ namespace armarx::aron::dataIO::reader
                     return ret;
                 }
                 default:
-                    throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "getNextElement", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor);
+                    throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "getNextElement", "Could not resove a type of a json. Allowed are only container types due to performance", descriptor);
+            }
+        }
+
+        virtual bool hasNextElement() const override
+        {
+            switch (descriptor)
+            {
+                case data::Descriptor::eDict:
+                {
+                    nlohmann::json ret = element[getCurrentKey()];
+                    return !ret.is_null();
+                }
+                case data::Descriptor::eList:
+                {
+                    nlohmann::json ret = element[currentIndex];
+                    return !ret.is_null();
+                }
+                default:
+                    throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "hasData", "Could not resove a type of a json. Allowed are only container types due to performance", descriptor);
             }
         }
 
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.cpp
index 15f57ecf56e00bf09720c4250e8972b9f79f546d..633d62ea3861db6bbefeb160ae0df3fe98d5bc15 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.cpp
@@ -29,7 +29,6 @@
 #include <RobotAPI/libraries/aron/core/navigator/data/AllNavigators.h>
 
 
-
 namespace armarx::aron::dataIO::writer
 {
 
@@ -157,6 +156,13 @@ namespace armarx::aron::dataIO::writer
         token->addElement(aron);
     }
 
+    void NavigatorWriter::writeNull()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        token->addElement(nullptr);
+    }
+
     void NavigatorWriter::writeKey(const std::string& k)
     {
         auto token = stack.top();
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h
index 3467d630a3301e4ed962f4529057d4be4089a4b5..483883b85b9205adac25ac69fd738f0298895e87 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h
@@ -30,6 +30,7 @@
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Concepts.h>
 #include <RobotAPI/libraries/aron/core/navigator/data/Navigator.h>
+#include <RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.h>
 #include <RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h>
 
 namespace armarx::aron::dataIO::writer
@@ -57,6 +58,8 @@ namespace armarx::aron::dataIO::writer
         virtual void writePrimitive(const std::string&) override;
         virtual void writePrimitive(const bool) override;
 
+        virtual void writeNull() override;
+
         virtual void writeKey(const std::string&) override;
 
         datanavigator::NavigatorPtr getResult() const
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h
index 8f10dd89e20a4ad0d606a6b2054d152679a76bee..7e8a53a773f728196ba28c4ebcd963279265102d 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h
@@ -47,6 +47,8 @@ namespace armarx::aron::dataIO::writer
         NavigatorWriterToken() = delete;
         NavigatorWriterToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& d)
         {
+            ARMARX_CHECK_NOT_NULL(d);
+
             descriptor = desc;
             element = d;
         }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp
index b768c5da072915d37406b2c0d7f3fb9bb5839dd9..9e5517b65b29066827cd1e133b3aa2618afd92be 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp
@@ -124,6 +124,12 @@ namespace armarx::aron::dataIO::writer
         token->addElement(j);
     }
 
+    void NlohmannJSONWriter::writeNull()
+    {
+        auto token = stack.top();
+        token->addElement(nullptr);
+    }
+
     void NlohmannJSONWriter::writeKey(const std::string& k)
     {
         auto token = stack.top();
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h
index f36fa55d53127a2c79a6d0b9629718a24cb2070c..44bf3c002101982f4e1f8af86e34838798bcd320 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h
@@ -57,6 +57,8 @@ namespace armarx::aron::dataIO::writer
         virtual void writePrimitive(const std::string&) override;
         virtual void writePrimitive(const bool) override;
 
+        virtual void writeNull() override;
+
         virtual void writeKey(const std::string&) override;
 
         nlohmann::json getResult() const
diff --git a/source/RobotAPI/libraries/aron/core/navigator/NavigatorFactory.h b/source/RobotAPI/libraries/aron/core/navigator/NavigatorFactory.h
index c8d8ea651ab62129bf1268b9aa15ec0a22cba669..4463de455e522b4fadb810fa444683598ee7cf17 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/NavigatorFactory.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/NavigatorFactory.h
@@ -38,7 +38,7 @@
 
 namespace armarx::aron
 {
-    template <typename Input, typename Output> // requires ...
+    template <typename Input, typename Output, typename EnumT> // requires ...
     class NavigatorFactory :
         virtual public Factory<Input, Output>
     {
@@ -47,5 +47,6 @@ namespace armarx::aron
 
         virtual Output create(const Input&, const Path&) const = 0;
         virtual Output createSpecific(const Input&, const Path&) const = 0;
+        virtual Output createNull(const EnumT) const = 0;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.cpp
index 1adcdfff3dd6786b6042bec2b20591ad56ff3281..9215638ff42d6a8cb0761e78f005e5eb99e355c6 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.cpp
@@ -52,6 +52,60 @@ namespace armarx::aron::datanavigator
         return factory_iterator->second->createSpecific(aron, path);
     }
 
+    NavigatorPtr NavigatorFactory::createNull(const data::Descriptor desc) const
+    {
+        switch (desc)
+        {
+            case data::Descriptor::eDict:
+            {
+                datanavigator::DictNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            case data::Descriptor::eList:
+            {
+                datanavigator::ListNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            case data::Descriptor::eNDArray:
+            {
+                datanavigator::NDArrayNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            case data::Descriptor::eInt:
+            {
+                datanavigator::IntNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            case data::Descriptor::eLong:
+            {
+                datanavigator::LongNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            case data::Descriptor::eFloat:
+            {
+                datanavigator::FloatNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            case data::Descriptor::eDouble:
+            {
+                datanavigator::DoubleNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            case data::Descriptor::eString:
+            {
+                datanavigator::StringNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            case data::Descriptor::eBool:
+            {
+                datanavigator::BoolNavigatorPtr aron = nullptr;
+                return aron;
+            }
+            default:
+                throw error::DescriptorNotValidException("NavigatorFactory", "createNull", "Received invalid descriptor to create NULL.", desc);
+        }
+    }
+
     NavigatorPtr NavigatorFactory::createSpecific(const data::AronDataPtr&, const Path& p) const
     {
         throw error::AronException("NavigatorFactory", "createSpecific", "Called disallowed method of an NavigatorFactory. Use child class instead!", p);
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.h b/source/RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.h
index 63d08c14524f7861e58d7294758e7582eaa2b434..924db36527c490a3c7c7d6f583fe931200171908 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/NavigatorFactory.h
@@ -40,12 +40,13 @@ namespace armarx::aron::datanavigator
     typedef std::shared_ptr<NavigatorFactory> NavigatorFactoryPtr;
 
     class NavigatorFactory :
-        virtual public Factory<data::AronDataPtr, datanavigator::NavigatorPtr>
+        virtual public armarx::aron::NavigatorFactory<data::AronDataPtr, datanavigator::NavigatorPtr, data::Descriptor>
     {
     public:
         NavigatorFactory() = default;
         virtual NavigatorPtr create(const data::AronDataPtr&, const Path&) const override;
         virtual NavigatorPtr createSpecific(const data::AronDataPtr&, const Path&) const override;
+        virtual NavigatorPtr createNull(const data::Descriptor) const override;
     };
 
     // Factories
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/container/Dict.cpp
index 67a2a6d816823611376158d2862c0b5918d6d693..e6bbba883f4ef7c0d7172955c1497ea7ad3e6f77 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/container/Dict.cpp
@@ -72,6 +72,10 @@ namespace armarx::aron::datanavigator
     {
         for (const auto& [key, nav] : childrenNavigators)
         {
+            if (!nav)
+            {
+                return (bool) other.getElement(key);
+            }
             if (not(other.hasElement(key)))
             {
                 return false;
@@ -150,8 +154,16 @@ namespace armarx::aron::datanavigator
 
     void DictNavigator::addElement(const std::string& key, const NavigatorPtr& data)
     {
-        this->childrenNavigators[key] = data;
-        this->aron->elements[key] = data->getResult();
+        if (data)
+        {
+            this->childrenNavigators[key] = data;
+            this->aron->elements[key] = data->getResult();
+        }
+        else
+        {
+            this->childrenNavigators[key] = nullptr;
+            this->aron->elements[key] = nullptr;
+        }
     }
 
     bool DictNavigator::hasElement(const std::string& key) const
@@ -196,11 +208,17 @@ namespace armarx::aron::datanavigator
         return "AronDict";
     }
 
+    // TODO
     typenavigator::NavigatorPtr DictNavigator::recalculateType() const
     {
         typenavigator::DictNavigatorPtr typenav = typenavigator::DictNavigatorPtr(new typenavigator::DictNavigator(getPath()));
         for (const auto& [key, nav] : childrenNavigators)
         {
+            if (!nav)
+            {
+                continue;
+            }
+
             if (typenav->getAcceptedType() == nullptr)
             {
                 typenav->setAcceptedType(nav->recalculateType());
@@ -230,6 +248,10 @@ namespace armarx::aron::datanavigator
                 typenavigator::ObjectNavigatorPtr objectTypeNav = typenavigator::ObjectNavigator::DynamicCast(type);
                 for (const auto& [key, nav] : childrenNavigators)
                 {
+                    if (!nav && !objectTypeNav->getMemberType(key)->isOptional())
+                    {
+                        return false;
+                    }
                     if (!nav->fullfillsType(objectTypeNav->getMemberType(key)))
                     {
                         return false;
@@ -242,6 +264,10 @@ namespace armarx::aron::datanavigator
                 typenavigator::DictNavigatorPtr dictTypeNav = typenavigator::DictNavigator::DynamicCast(type);
                 for (const auto& [_, nav] : childrenNavigators)
                 {
+                    if (!nav && !dictTypeNav->getAcceptedType()->isOptional())
+                    {
+                        return false;
+                    }
                     if (!nav->fullfillsType(dictTypeNav->getAcceptedType()))
                     {
                         return false;
@@ -288,6 +314,10 @@ namespace armarx::aron::datanavigator
         else
         {
             Path next = path.withDetachedFirstElement();
+            if (!childrenNavigators.at(el))
+            {
+                throw error::AronException("DictNavigator", "navigateAbsolute", "Could not navigate into a NULL member. Seems like the member is optional and not set.", next);
+            }
             return childrenNavigators.at(el)->navigateAbsolute(next);
         }
     }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp
index d2d5bee4af83060dad86c93498be761f42a84f80..c48e75a43490b202318b9611237f6710332fb5f9 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/data/container/List.cpp
@@ -75,6 +75,10 @@ namespace armarx::aron::datanavigator
         unsigned int i = 0;
         for (const auto& nav : childrenNavigators)
         {
+            if (!nav)
+            {
+                return (bool) other.getElement(i);
+            }
             if (not(other.hasElement(i)))
             {
                 return false;
@@ -140,8 +144,16 @@ namespace armarx::aron::datanavigator
     // public member functions
     void ListNavigator::addElement(const NavigatorPtr& n)
     {
-        childrenNavigators.push_back(n);
-        aron->elements.push_back(n->getResult());
+        if (n)
+        {
+            childrenNavigators.push_back(n);
+            aron->elements.push_back(n->getResult());
+        }
+        else
+        {
+            childrenNavigators.push_back(nullptr);
+            aron->elements.push_back(nullptr);
+        }
     }
 
     bool ListNavigator::hasElement(unsigned int i) const
@@ -185,6 +197,7 @@ namespace armarx::aron::datanavigator
         return "AronList";
     }
 
+    // TODO
     typenavigator::NavigatorPtr ListNavigator::recalculateType() const
     {
         typenavigator::ListNavigatorPtr typenav = typenavigator::ListNavigatorPtr(new typenavigator::ListNavigator(getPath()));
@@ -221,6 +234,10 @@ namespace armarx::aron::datanavigator
                 typenavigator::ListNavigatorPtr listTypeNav = typenavigator::ListNavigator::DynamicCast(type);
                 for (const auto& nav : childrenNavigators)
                 {
+                    if (!nav && !listTypeNav->getAcceptedType()->isOptional())
+                    {
+                        return false;
+                    }
                     if (!nav->fullfillsType(listTypeNav->getAcceptedType()))
                     {
                         return false;
@@ -234,6 +251,10 @@ namespace armarx::aron::datanavigator
                 unsigned int i = 0;
                 for (const auto& nav : childrenNavigators)
                 {
+                    if (!nav && !tupleTypeNav->getAcceptedType(i)->isOptional())
+                    {
+                        return false;
+                    }
                     if (!nav->fullfillsType(tupleTypeNav->getAcceptedType(i)))
                     {
                         return false;
@@ -248,6 +269,14 @@ namespace armarx::aron::datanavigator
                 {
                     return false;
                 }
+                if (!childrenNavigators[0] && !pairTypeNav->getFirstAcceptedType()->isOptional())
+                {
+                    return false;
+                }
+                if (!childrenNavigators[1] && !pairTypeNav->getSecondAcceptedType()->isOptional())
+                {
+                    return false;
+                }
                 return childrenNavigators[0]->fullfillsType(pairTypeNav->getFirstAcceptedType()) && childrenNavigators[1]->fullfillsType(pairTypeNav->getSecondAcceptedType());
             }
             default:
@@ -284,6 +313,10 @@ namespace armarx::aron::datanavigator
         else
         {
             Path next = path.withDetachedFirstElement();
+            if (!childrenNavigators.at(i))
+            {
+                throw error::AronException("ListNavigator", "navigateAbsolute", "Could not navigate into a NULL member. Seems like the member is optional and not set.", next);
+            }
             return childrenNavigators.at(i)->navigateAbsolute(next);
         }
     }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.cpp
index f0375363b95993f9e216d1e140fa459ea99a6913..b1dd72b21541aa02e1315a5587a4780003d5aff2 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.cpp
@@ -51,6 +51,11 @@ namespace armarx::aron::typenavigator
         return factory_iterator->second->createSpecific(aron, path);
     }
 
+    typenavigator::NavigatorPtr NavigatorFactory::createNull(const type::Descriptor) const
+    {
+        return nullptr;
+    }
+
     NavigatorPtr NavigatorFactory::createSpecific(const type::AronTypePtr&, const Path& p) const
     {
         throw error::AronException("NavigatorFactory", "createSpecific", "Called disallowed method of an NavigatorFactory. Use child class instead!", p);
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.h b/source/RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.h
index 7e443cc3c02e19c7237bf8dd4a0bfa59ae7a82b8..88783e884c050c7e14cbac54e1954fe7b23c45d1 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.h
@@ -40,12 +40,13 @@ namespace armarx::aron::typenavigator
     typedef std::shared_ptr<NavigatorFactory> NavigatorFactoryPtr;
 
     class NavigatorFactory :
-        virtual public armarx::aron::NavigatorFactory<type::AronTypePtr, typenavigator::NavigatorPtr>
+        virtual public armarx::aron::NavigatorFactory<type::AronTypePtr, typenavigator::NavigatorPtr, type::Descriptor>
     {
     public:
         NavigatorFactory() = default;
         virtual typenavigator::NavigatorPtr create(const type::AronTypePtr&, const Path&) const override;
         virtual typenavigator::NavigatorPtr createSpecific(const type::AronTypePtr&, const Path&) const override;
+        virtual typenavigator::NavigatorPtr createNull(const type::Descriptor) const override;
     };
 
     // Factories
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/NDArray.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/NDArray.cpp
index e2b8c715846f67725ac41921fc1b4ea707b6169b..f4c471c4cef735e109a049f38749da82bc5874ab 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/NDArray.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/NDArray.cpp
@@ -30,7 +30,7 @@ namespace armarx::aron::typenavigator
     NDArrayNavigator::NDArrayNavigator(const Path& path) :
         aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eNDArray, path),
         Navigator(type::Descriptor::eNDArray, path),
-        type(new type::AronNDArray(false, {}, 0, ""))
+        type(new type::AronNDArray(false, {}, ""))
     {
     }
 
@@ -58,7 +58,7 @@ namespace armarx::aron::typenavigator
 
     unsigned int NDArrayNavigator::getElementSize() const
     {
-        return type->elementSize;
+        return 0; //type->elementSize;
     }
 
     void NDArrayNavigator::setTypename(const std::string& s)
@@ -78,7 +78,7 @@ namespace armarx::aron::typenavigator
 
     void NDArrayNavigator::setElementSize(unsigned int i)
     {
-        type->elementSize = i;
+        //type->elementSize = i;
     }
 
     // static methods
@@ -113,7 +113,7 @@ namespace armarx::aron::typenavigator
 
     std::string NDArrayNavigator::getName() const
     {
-        return "AronPoseType";
+        return "AronNDArrayType";
     }
 
     void NDArrayNavigator::setOptional(bool v)