diff --git a/source/RobotAPI/applications/AronCodeGenerator/main.cpp b/source/RobotAPI/applications/AronCodeGenerator/main.cpp
index ce2acfef11109d06328aff9bb18a1cba7a5af7c5..3de3dc06515dcc47c36657e51edb56baddb76823 100644
--- a/source/RobotAPI/applications/AronCodeGenerator/main.cpp
+++ b/source/RobotAPI/applications/AronCodeGenerator/main.cpp
@@ -136,9 +136,9 @@ int main(int argc, char* argv[])
         if (verbose)
         {
             std::cout << "Parsing the XML file... done!" << std::endl;
-            std::cout << "--> Found " << reader.getGenerateTypes().size() << " types." << std::endl;
+            std::cout << "--> Found " << reader.getGenerateObjects().size() << " types." << std::endl;
             std::cout << "--> They are: " << std::endl;
-            for (const auto& generateType : reader.getGenerateTypes())
+            for (const auto& generateType : reader.getGenerateObjects())
             {
                 std::cout << "----> " << generateType->typeName << "( with " << generateType->nestedObjects.size() << " inner definitions)" << std::endl;
             }
@@ -151,12 +151,13 @@ int main(int argc, char* argv[])
             std::cout << "Running the type class generator..." << std::endl;
         }
 
-        writer.generateTypeClasses(reader.getGenerateTypes());
+        writer.generateTypeIntEnums(reader.getGenerateIntEnums());
+        writer.generateTypeObjects(reader.getGenerateObjects());
 
         if (verbose)
         {
             std::cout << "Running the type class generator... done!" << std::endl;
-            std::cout << "--> Found " << writer.getTypeClasses().size() << " type classes." << std::endl;
+            std::cout << "--> Found " << writer.getTypeClasses().size() << " type objects." << std::endl;
             std::cout << "--> They are: " << std::endl;
             for (const auto& c : writer.getTypeClasses())
             {
@@ -248,7 +249,7 @@ int main(int argc, char* argv[])
 
         if (verbose)
         {
-            std::cout << "Finished generating <" + output_file.string() + ">" << std::endl;
+            std::cout << "Finished generating <" + output_file.string() + ">. The new file ist called <" << output_file.string() << ">" << std::endl;
         }
     }
     catch (const cxxopts::OptionException& e)
diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index 5e85729b15a7afbf8855a6eca1059062635df405..844097e2b278b7b4dc2b92bb38daa2ea47aa8123 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -145,6 +145,7 @@ armarx_enable_aron_file_generation_for_target(
         ${LIB_NAME}
     ARON_FILES
         ${ARON_FILES}
+    #ENABLE_DEBUG_INFO
 )
 
 
diff --git a/source/RobotAPI/libraries/armem/core/aron/MemoryID.xml b/source/RobotAPI/libraries/armem/core/aron/MemoryID.xml
index d7ba24e0525a8f9087ac1d9200e910fa03bd1ee5..11d0fee395edca2c597dc1ea9de53dfbd7f9eae9 100644
--- a/source/RobotAPI/libraries/armem/core/aron/MemoryID.xml
+++ b/source/RobotAPI/libraries/armem/core/aron/MemoryID.xml
@@ -1,8 +1,7 @@
-<!--Some fancy comment -->
 <?xml version="1.0" encoding="UTF-8" ?>
 <AronTypeDefinition>
     <GenerateTypes>
-        <GenerateType name='armarx::armem::aron::MemoryID'>
+        <Object name='armarx::armem::aron::MemoryID'>
             <ObjectChild key='memoryName'>
                 <string />
             </ObjectChild>
@@ -21,6 +20,6 @@
             <ObjectChild key='instanceIndex'>
                 <int />
             </ObjectChild>
-        </GenerateType>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/armem/core/io/DiskReader/NlohmannJSONDiskReader/NlohmannJSONDiskReader.cpp b/source/RobotAPI/libraries/armem/core/io/DiskReader/NlohmannJSONDiskReader/NlohmannJSONDiskReader.cpp
index 641db4fa43b2b4f5f268efdec1847c96857c05f1..3742996cda7cf4f03a15615a5ba7a296dfeba591 100644
--- a/source/RobotAPI/libraries/armem/core/io/DiskReader/NlohmannJSONDiskReader/NlohmannJSONDiskReader.cpp
+++ b/source/RobotAPI/libraries/armem/core/io/DiskReader/NlohmannJSONDiskReader/NlohmannJSONDiskReader.cpp
@@ -5,6 +5,7 @@
 #include <RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h>
 #include <RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h>
 #include <RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h>
+#include <RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h>
 
 
 namespace armarx::armem::io
diff --git a/source/RobotAPI/libraries/armem/core/io/DiskWriter/DiskWriter.cpp b/source/RobotAPI/libraries/armem/core/io/DiskWriter/DiskWriter.cpp
index 2d67aae02af1bd058cd2d05720c7d8d69f4fdab2..9168f8adf64313f17a21700a50d93113db60954c 100644
--- a/source/RobotAPI/libraries/armem/core/io/DiskWriter/DiskWriter.cpp
+++ b/source/RobotAPI/libraries/armem/core/io/DiskWriter/DiskWriter.cpp
@@ -247,7 +247,7 @@ namespace armarx::armem::io
     aron::typenavigator::ObjectNavigatorPtr DiskWriter::wrapType(const aron::typenavigator::ObjectNavigatorPtr& t) const
     {
         aron::typenavigator::ObjectNavigatorPtr typeWrapped(new aron::typenavigator::ObjectNavigator());
-        typeWrapped->setObjectName(t->getObjectName() + "__ltm_export");
+        typeWrapped->setObjectName(t->getName() + "__ltm_export");
         typeWrapped->addMemberType(DISK_READER_WRITER_DATA_FIELD, t);
 
         typeWrapped->addMemberType(DISK_READER_WRITER_TIME_STORED_FIELD, aron::typenavigator::LongNavigatorPtr(new aron::typenavigator::LongNavigator()));
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp b/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp
index dbd016df71bb87a325088c6d7acff4393a650cde..06c23bcc897291e714be66f329d87c09b3cc046a 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp
+++ b/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp
@@ -291,7 +291,7 @@ namespace armarx::armem::gui
         std::string typeName;
         if (container.aronType())
         {
-            typeName = container.aronType()->getObjectName();
+            typeName = container.aronType()->getName();
 
             std::string del = "::";
             size_t find = typeName.rfind(del);
diff --git a/source/RobotAPI/libraries/aron/core/CMakeLists.txt b/source/RobotAPI/libraries/aron/core/CMakeLists.txt
index c515fb3054fe53bf325e6381919c32cb96a28b4f..abc8a843057a029c3453e7e56abeab962af02a15 100644
--- a/source/RobotAPI/libraries/aron/core/CMakeLists.txt
+++ b/source/RobotAPI/libraries/aron/core/CMakeLists.txt
@@ -76,6 +76,8 @@ set(LIB_FILES
 
     codegenerator/codeWriter/cpp/Writer.cpp
     codegenerator/codeWriter/cpp/serializer/Serializer.cpp
+    codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp
+    codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
     codegenerator/codeWriter/cpp/serializer/container/Dict.cpp
     codegenerator/codeWriter/cpp/serializer/container/List.cpp
     codegenerator/codeWriter/cpp/serializer/container/Object.cpp
@@ -188,6 +190,7 @@ set(LIB_HEADERS
     codegenerator/WriterInfo.h
     codegenerator/ReaderInfo.h
     codegenerator/GenerateTypeInfo.h
+    codegenerator/GenerateIntEnumInfo.h
 
     codegenerator/codeWriter/CodeWriter.h
     codegenerator/codeWriter/SerializerFactory.h
@@ -195,6 +198,8 @@ set(LIB_HEADERS
     codegenerator/codeWriter/cpp/AronCppClass.h
     codegenerator/codeWriter/cpp/Writer.h
     codegenerator/codeWriter/cpp/serializer/Serializer.h
+    codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h
+    codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
     codegenerator/codeWriter/cpp/serializer/container/Dict.h
     codegenerator/codeWriter/cpp/serializer/container/List.h
     codegenerator/codeWriter/cpp/serializer/container/Object.h
diff --git a/source/RobotAPI/libraries/aron/core/Config.h b/source/RobotAPI/libraries/aron/core/Config.h
index a33a4539c01c04941bec2683d0424211338a0958..fc05237a22dab5dc57cb4f44b6d4b9616cc379d2 100644
--- a/source/RobotAPI/libraries/aron/core/Config.h
+++ b/source/RobotAPI/libraries/aron/core/Config.h
@@ -84,11 +84,6 @@ namespace armarx
     RUN_ARON_MACRO(Tuple, tuple, TUPLE) \
     RUN_ARON_MACRO(Pair, pair, PAIR)
 
-/*#define HANDLE_CONTAINER_TYPES_EXCEPT_OBJECT \
-    RUN_ARON_MACRO(List, list, LIST) \
-    RUN_ARON_MACRO(Dict, dict, DICT) \
-    RUN_ARON_MACRO(Tuple, tuple, TUPLE)*/
-
 // All complex types go here
 #define HANDLE_NDARRAY_TYPES \
     RUN_ARON_MACRO(EigenMatrix, eigenmatrix, EIGEN_MATRIX) \
@@ -122,21 +117,6 @@ namespace armarx
     HANDLE_ENUM_TYPES \
     HANDLE_PRIMITIVE_TYPES
 
-/************************************
- * Intermediate types, just for hierarchy
- * TODO: Remove
- ***********************************/
-/*#define HANDLE_CONTAINER_ARON_ABSTRACT_TYPES \
-    RUN_ARON_MACRO(AronDictSerializerType, arondictserializertype, ARON_DICT_SERIALIZER_TYPE) \
-    RUN_ARON_MACRO(AronListSerializerType, aronlistserializertype, ARON_LIST_SERIALIZER_TYPE)
-
-#define HANDLE_COMPLEX_ARON_ABSTRACT_TYPES \
-    RUN_ARON_MACRO(AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE)
-
-#define HANDLE_ALL_ARON_ABSTRACT_TYPES \
-    HANDLE_CONTAINER_ARON_ABSTRACT_TYPES \
-    HANDLE_COMPLEX_ARON_ABSTRACT_TYPES*/
-
 /************************************
  * DATA *****************************
  ***********************************/
@@ -185,6 +165,7 @@ namespace armarx
 
 #define HANDLE_COMPLEX_CORRESPONDING \
     RUN_ARON_MACRO(EigenMatrix, eigenmatrix, EIGEN_MATRIX, NDArray, ndarray, NDARRAY) \
+    RUN_ARON_MACRO(EigenQuaternion, eigenmatrix, EIGEN_MATRIX, NDArray, ndarray, NDARRAY) \
     RUN_ARON_MACRO(IVTCByteImage, ivtcbyteimage, IVT_CBYTE_IMAGE, NDArray, ndarray, NDARRAY) \
     RUN_ARON_MACRO(OpenCVMat, opencvmat, OPENCV_MAT, NDArray, ndarray, NDARRAY) \
     RUN_ARON_MACRO(PCLPointCloud, pclpointcloud, PCL_POINTCLOUD, NDArray, ndarray, NDARRAY) \
@@ -210,34 +191,6 @@ namespace armarx
     HANDLE_ENUM_CORRESPONDING \
     HANDLE_PRIMITIVE_CORRESPONDING
 
-// TODO: Remove
-/*#define HANDLE_CONTAINER_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING \
-    RUN_ARON_MACRO(List, list, LIST, AronListSerializerType, aronlistserializertype, ARON_LIST_SERIALIZER_TYPE) \
-    RUN_ARON_MACRO(Tuple, tuple, TUPLE, AronListSerializerType, aronlistserializertype, ARON_LIST_SERIALIZER_TYPE) \
-    RUN_ARON_MACRO(Object, object, OBJECT, AronDictSerializerType, arondictserializertype, ARON_DICT_SERIALIZER_TYPE) \
-    RUN_ARON_MACRO(Dict, dict, DICT, AronDictSerializerType, arondictserializertype, ARON_DICT_SERIALIZER_TYPE)
-
-#define HANDLE_COMPLEX_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING \
-    RUN_ARON_MACRO(EigenMatrix, eigenmatrix, EIGEN_MATRIX, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) \
-    RUN_ARON_MACRO(IVTCByteImage, ivtcbyteimage, IVT_CBYTE_IMAGE, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) \
-    RUN_ARON_MACRO(OpenCVMat, opencvmat, OPENCV_MAT, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) \
-    RUN_ARON_MACRO(PCLPointCloud, pclpointcloud, PCL_POINTCLOUD, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE)
-
-#define HANDLE_ALL_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING \
-    HANDLE_CONTAINER_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING \
-    HANDLE_COMPLEX_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING
-
-#define HANDLE_CONTAINER_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING \
-    RUN_ARON_MACRO(List, list, LIST, AronListSerializerType, aronlistserializertype, ARON_LIST_SERIALIZER_TYPE) \
-    RUN_ARON_MACRO(Dict, dict, DICT, AronDictSerializerType, arondictserializertype, ARON_DICT_SERIALIZER_TYPE)
-
-#define HANDLE_COMPLEX_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING \
-    RUN_ARON_MACRO(NDArray, ndarray, NDARRAY, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE)
-
-#define HANDLE_ALL_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING \
-    HANDLE_CONTAINER_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING \
-    HANDLE_COMPLEX_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING*/
-
 /************************************
  * Related data types ***************
  * (which on can be converted into what)
diff --git a/source/RobotAPI/libraries/aron/core/Randomizer.h b/source/RobotAPI/libraries/aron/core/Randomizer.h
index 65602d86714f720345f8f95346a29bfae6f17fef..aeefb6913607dde05b926bfc237262a490fa93a4 100644
--- a/source/RobotAPI/libraries/aron/core/Randomizer.h
+++ b/source/RobotAPI/libraries/aron/core/Randomizer.h
@@ -77,7 +77,7 @@ namespace armarx::aron
                         usedKeys.insert(key);
 
                         typenavigator::NavigatorPtr m = generateRandomType(false);
-                        t->addAcceptedType(key, m);
+                        t->addMemberType(key, m);
                     }
                     return t;
                 }
@@ -109,24 +109,63 @@ namespace armarx::aron
                     t->setAcceptedType(a);
                     return t;
                 }
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-case type::e##upperType:
-
-                    HANDLE_NDARRAY_TYPES
-#undef RUN_ARON_MACRO
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-case type::e##upperType: \
-{ \
-    typenavigator::upperType##NavigatorPtr t = typenavigator::upperType##NavigatorPtr(new typenavigator::upperType##Navigator()); \
-    return t; \
-}
+                case type::ePair:
+                {
+                    typenavigator::PairNavigatorPtr t = typenavigator::PairNavigatorPtr(new typenavigator::PairNavigator());
+                    typenavigator::NavigatorPtr a = generateRandomType(false);
+                    typenavigator::NavigatorPtr b = generateRandomType(false);
 
-                HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+                    t->setFirstAcceptedType(a);
+                    t->setSecondAcceptedType(b);
+                    return t;
+                }
+                case type::eEigenMatrix:
+                case type::eEigenQuaternion:
+                case type::eIVTCByteImage:
+                case type::eOpenCVMat:
+                case type::ePCLPointCloud:
+                case type::ePosition:
+                case type::eOrientation:
+                case type::ePose:
+
+                case type::eInt:
+                {
+                    auto t = std::make_shared<typenavigator::IntNavigator>();
+                    return t;
+                }
+                case type::eLong:
+                {
+                    auto t = std::make_shared<typenavigator::LongNavigator>();
+                    return t;
+                }
+                case type::eFloat:
+                {
+                    auto t = std::make_shared<typenavigator::FloatNavigator>();
+                    return t;
+                }
+                case type::eDouble:
+                {
+                    auto t = std::make_shared<typenavigator::DoubleNavigator>();
+                    return t;
+                }
+                case type::eString:
+                {
+                    auto t = std::make_shared<typenavigator::StringNavigator>();
+                    return t;
+                }
+                case type::eBool:
+                {
+                    auto t = std::make_shared<typenavigator::BoolNavigator>();
+                    return t;
+                }
+                case type::eTime:
+                {
+                    auto t = std::make_shared<typenavigator::TimeNavigator>();
+                    return t;
+                }
                 default:
                 {
-                    throw error::DescriptorNotValidException("AronTest", "generateRandomType", "No valid type found!", nextType);
+                    throw error::DescriptorNotValidException("Randomizer", "generateRandomType", "No valid type found!", nextType);
                 }
             }
         }
@@ -169,7 +208,8 @@ case type::e##upperType: \
 case type::e##upperType: \
 { \
     typenavigator::upperType##NavigatorPtr t = typenavigator::upperType##Navigator::DynamicCastAndCheck(type); \
-    return datanavigator::NavigatorPtr(new datanavigator::NDArrayNavigator()); \
+    datanavigator::NDArrayNavigatorPtr ndarray = datanavigator::NDArrayNavigatorPtr(new datanavigator::NDArrayNavigator()); \
+    return ndarray; \
 }
 
                 HANDLE_NDARRAY_TYPES
@@ -186,12 +226,81 @@ case type::e##upperType: \
 #undef RUN_ARON_MACRO
                 default:
                 {
-                    throw error::DescriptorNotValidException("AronTest", "generateAronDataFromType", "No valid type found!", desc);
+                    throw error::DescriptorNotValidException("Randomizer", "generateAronDataFromType", "No valid type found!", desc);
+                }
+            }
+        }
+
+        void initializeRandomly(datanavigator::NavigatorPtr& data, const typenavigator::NavigatorPtr& type) const
+        {
+            // Containers
+            type::Descriptor desc = type->getDescriptor();
+            switch (desc)
+            {
+
+#define RUN_ARON_MACRO(upperType, lowerType, capsType, upperData, lowerData, capsData) \
+case type::e##upperType: \
+{ \
+    typenavigator::upperType##NavigatorPtr t = typenavigator::upperType##Navigator::DynamicCastAndCheck(type); \
+    datanavigator::upperData##NavigatorPtr d = datanavigator::upperData##Navigator::DynamicCastAndCheck(data); \
+    initializeRandomly(d, t); \
+    break; \
+}
+
+                HANDLE_ALL_CORRESPONDING
+#undef RUN_ARON_MACRO
+
+                default:
+                {
+                    throw error::DescriptorNotValidException("Randomizer", "initializeRandomly", "No valid type found!", desc);
                 }
             }
         }
 
+        int generateRandom(int max, int min) const
+        {
+            max += 1;
+            int random = (std::rand() % (max - min)) + min;
+            return random;
+        }
+
+        std::string generateRandomWord(const std::set<std::string>& usedKeys = {}) const
+        {
+            std::vector<string> words =
+            {
+                "Lorem", "ipsum", "dolor", "sit", "amet", "consetetur", "sadipscing", "elitr"
+                "sed", "diam", "nonumy", "eirmod", "tempor", "invidunt", "ut", "labore", "et"
+                "dolore", "magna", "aliquyam", "eratsed"
+            };
+
+            int i = generateRandom(words.size() - 1, 0);
+            std::string key = words[i];
+
+            while (usedKeys.count(key) > 0)
+            {
+                key = generateRandomWord(usedKeys);
+            }
+
+            return key;
+        }
+
+        std::vector<unsigned char> generateRandomBlob(unsigned int size) const
+        {
+            std::vector<unsigned char> new_blob(size, 0);
+            for (unsigned int i = 0; i < size; ++i)
+            {
+                new_blob[i] = (generateRandom(127, 0));
+            }
+            return new_blob;
+        }
+
+    private:
+        void initialize_random() const
+        {
+            std::srand(std::time(nullptr));
+        }
 
+    public:
         void initializeRandomly(datanavigator::DictNavigatorPtr& data, const typenavigator::ObjectNavigatorPtr& type) const
         {
             for (auto& [key, nextData] : data->getElements())
@@ -224,6 +333,14 @@ case type::e##upperType: \
             }
         }
 
+        void initializeRandomly(datanavigator::ListNavigatorPtr& data, const typenavigator::PairNavigatorPtr& type) const
+        {
+            datanavigator::NavigatorPtr first = data->getElement(0);
+            datanavigator::NavigatorPtr second = data->getElement(1);
+            initializeRandomly(first, type->getFirstAcceptedType());
+            initializeRandomly(second, type->getSecondAcceptedType());
+        }
+
         void initializeRandomly(datanavigator::ListNavigatorPtr& data, const typenavigator::ListNavigatorPtr& type) const
         {
             data->clear();
@@ -236,18 +353,13 @@ case type::e##upperType: \
             }
         }
 
-
-#define RUN_ARON_MACRO(upperData, lowerData, capsData) \
-    void initializeRandomly(datanavigator::upperData##NavigatorPtr& data, const typenavigator::NavigatorPtr& type) const \
-    { \
-        std::vector<int> dims = data->getDimensions(); \
-        int bytes = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()); \
-        std::vector<unsigned char> blob = generateRandomBlob(bytes); \
-        data->setData(bytes, blob.data()); \
-    }
-
-                HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
+        void initializeRandomly(datanavigator::NDArrayNavigatorPtr& data, const typenavigator::NavigatorPtr& type) const
+        {
+            std::vector<int> dims = data->getDimensions();
+            int bytes = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>());
+            std::vector<unsigned char> blob = generateRandomBlob(bytes);
+            data->setData(bytes, blob.data());
+        }
 
         void initializeRandomly(datanavigator::IntNavigatorPtr& data, const typenavigator::NavigatorPtr& type) const
         {
@@ -278,74 +390,5 @@ case type::e##upperType: \
         {
             data->setValue(generateRandomWord());
         }
-
-        void initializeRandomly(datanavigator::NavigatorPtr& data, const typenavigator::NavigatorPtr& type) const
-        {
-            // Containers
-            type::Descriptor desc = type->getDescriptor();
-            switch (desc)
-            {
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType, upperData, lowerData, capsData) \
-case type::e##upperType: \
-{ \
-    typenavigator::upperType##NavigatorPtr t = typenavigator::upperType##Navigator::DynamicCastAndCheck(type); \
-    datanavigator::upperData##NavigatorPtr d = datanavigator::upperData##Navigator::DynamicCastAndCheck(data); \
-    initializeRandomly(d, t); \
-    break; \
-}
-
-                HANDLE_ALL_CORRESPONDING
-#undef RUN_ARON_MACRO
-
-                default:
-                {
-                    throw error::DescriptorNotValidException("AronTest", "initializeRandomly", "No valid type found!", desc);
-                }
-            }
-        }
-
-        int generateRandom(int max, int min) const
-        {
-            max += 1;
-            int random = (std::rand() % (max - min)) + min;
-            return random;
-        }
-
-        std::string generateRandomWord(const std::set<std::string>& usedKeys = {}) const
-        {
-            std::vector<string> words =
-            {
-                "Lorem", "ipsum", "dolor", "sit", "amet", "consetetur", "sadipscing", "elitr"
-                "sed", "diam", "nonumy", "eirmod", "tempor", "invidunt", "ut", "labore", "et"
-                "dolore", "magna", "aliquyam", "eratsed"
-            };
-
-            int i = generateRandom(words.size() - 1, 0);
-            std::string key = words[i];
-
-            while (usedKeys.count(key) > 0)
-            {
-                key = generateRandomWord(usedKeys);
-            }
-
-            return key;
-        }
-
-        std::vector<unsigned char> generateRandomBlob(unsigned int size) const
-        {
-            std::vector<unsigned char> new_blob(size, 0);
-            for (unsigned int i = 0; i < size; ++i)
-            {
-                new_blob[i] = (generateRandom(127, 0));
-            }
-            return new_blob;
-        }
-
-    protected:
-        void initialize_random() const
-        {
-            std::srand(std::time(nullptr));
-        }
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/Resolver.cpp b/source/RobotAPI/libraries/aron/core/Resolver.cpp
index 2a6c5cc67e19e1176cbe783476efcfefa1f95dc3..5c3080eebbb6b053343adaf01a1f4a04f1a7c4e7 100644
--- a/source/RobotAPI/libraries/aron/core/Resolver.cpp
+++ b/source/RobotAPI/libraries/aron/core/Resolver.cpp
@@ -72,6 +72,15 @@ namespace armarx::aron
         return false;
     }
 
+    type::Descriptor Resolver::GetFirstIfCorrespond(const type::Descriptor& t, const data::Descriptor& d)
+    {
+        if (Correspond(t, d))
+        {
+            return t;
+        }
+        return GetCorresponding(d);
+    }
+
     data::Descriptor Resolver::GetCorresponding(const type::Descriptor& d)
     {
 #define RUN_ARON_MACRO(typeUpperType, typeLowerType, typeCapsType, dataUpperType, dataLowerType, dataCapsType) \
@@ -86,6 +95,20 @@ namespace armarx::aron
         return data::Descriptor::eUnknown;
     }
 
+    type::Descriptor Resolver::GetCorresponding(const data::Descriptor& d)
+    {
+#define RUN_ARON_MACRO(typeUpperType, typeLowerType, typeCapsType, dataUpperType, dataLowerType, dataCapsType) \
+    { \
+        if(d == data::Descriptor::e##dataUpperType) \
+        { \
+            return type::Descriptor::e##typeUpperType; \
+        } \
+    }
+        HANDLE_ALL_CORRESPONDING
+#undef RUN_ARON_MACRO
+        return type::Descriptor::eUnknown;
+    }
+
     bool Resolver::AreRelated(const data::Descriptor& d, const data::Descriptor& d2)
     {
         if (d == d2)
diff --git a/source/RobotAPI/libraries/aron/core/Resolver.h b/source/RobotAPI/libraries/aron/core/Resolver.h
index 1294be2f3d1a695b0893a8debee66ed51eaf8387..8c04597ef1fa5ab5866a1d56d0713ae53aa3e8fb 100644
--- a/source/RobotAPI/libraries/aron/core/Resolver.h
+++ b/source/RobotAPI/libraries/aron/core/Resolver.h
@@ -47,7 +47,10 @@ namespace armarx::aron
 
         static bool Correspond(const type::Descriptor&, const data::Descriptor&);
 
+        static type::Descriptor GetFirstIfCorrespond(const type::Descriptor&, const data::Descriptor&);
+
         static data::Descriptor GetCorresponding(const type::Descriptor&);
+        static type::Descriptor GetCorresponding(const data::Descriptor&);
 
         static bool AreRelated(const data::Descriptor&, const data::Descriptor&);
         static bool AreRelated(const type::Descriptor&, const type::Descriptor&);
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h b/source/RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..832c3e47d08766a565ddb4dc297239da472d1d9a
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h
@@ -0,0 +1,45 @@
+/*
+ * 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
+ */
+
+#pragma once
+
+// STD/STL
+#include <memory>
+#include <string>
+
+// ArmarX
+#include <RobotAPI/libraries/aron/core/navigator/type/enum/IntEnum.h>
+
+namespace armarx::aron::codegeneratorhelper
+{
+    class GenerateIntEnumInfo;
+    typedef std::shared_ptr<GenerateIntEnumInfo> GenerateIntEnumInfoPtr;
+
+    class GenerateIntEnumInfo
+    {
+    public:
+        std::string typeName;
+        std::string definedIn;
+        typenavigator::IntEnumNavigatorPtr correspondingType;
+    };
+}
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h b/source/RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h
index 5641e89c08c4663b7c884dcd4f2c779a33b94579..a029bca09d634f3565e89e7ef7d39eaee3af1201 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h
@@ -28,19 +28,21 @@
 #include <string>
 
 // ArmarX
+#include <RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h>
 #include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h>
 
 namespace armarx::aron::codegeneratorhelper
 {
-            class GenerateTypeInfo;
-            typedef std::shared_ptr<GenerateTypeInfo> GenerateTypeInfoPtr;
+    class GenerateObjectInfo;
+    typedef std::shared_ptr<GenerateObjectInfo> GenerateObjectInfoPtr;
 
-            class GenerateTypeInfo
-            {
-            public:
-                std::string typeName;
-                std::string definedIn;
-                typenavigator::ObjectNavigatorPtr correspondingObjectType;
-                std::map<std::string, GenerateTypeInfoPtr> nestedObjects;
-            };
+    class GenerateObjectInfo
+    {
+    public:
+        std::string typeName;
+        std::string definedIn;
+        typenavigator::ObjectNavigatorPtr correspondingType;
+        std::map<std::string, GenerateObjectInfoPtr> nestedObjects;
+        std::map<std::string, GenerateIntEnumInfoPtr> nestedIntEnums;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/CodeWriter.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/CodeWriter.h
index cca2b3bee5e5307c32f8793159277e4f413bd7af..f2f9b12c22c9a8bcf3ca88ddc4ba19f6f8168b14 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/CodeWriter.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/CodeWriter.h
@@ -52,7 +52,9 @@ namespace armarx::aron::codegenerator
             producerName(producerName),
             additionalIncludes(additionalIncludesFromXMLFile)
         {}
-        virtual void generateTypeClasses(const std::vector<codegeneratorhelper::GenerateTypeInfoPtr>&) = 0;
+
+        virtual void generateTypeObjects(const std::vector<codegeneratorhelper::GenerateObjectInfoPtr>&) = 0;
+        virtual void generateTypeIntEnums(const std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr>&) = 0;
 
         std::vector<MetaClassPtr> getTypeClasses() const
         {
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 b131739e41d822284fc40a51bd1a16f494428fe7..7098b08c6630be31bbb44c0fe098d09071e68b45 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h
@@ -30,7 +30,6 @@
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Exception.h>
 
-#include <RobotAPI/libraries/aron/core/Concepts.h>
 #include <RobotAPI/libraries/aron/core/io/dataIO/Reader.h>
 #include <RobotAPI/libraries/aron/core/io/dataIO/Writer.h>
 #include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h>
@@ -50,10 +49,10 @@ namespace armarx::aron::cppcodegenerator
         AronCppClass() = default;
         virtual void reset() = 0;
         virtual void initialize() = 0;
-        virtual void read(armarx::aron::dataIO::Reader& r) = 0;
-        virtual void write(armarx::aron::dataIO::Writer& w) const = 0;
-        virtual void writeCurrentType(armarx::aron::typeIO::Writer& w) const = 0;
-        static void writeType(armarx::aron::typeIO::Writer& w)
+        virtual void read(armarx::aron::dataIO::ReaderInterface& r) = 0;
+        virtual void write(armarx::aron::dataIO::WriterInterface& w) const = 0;
+        virtual void writeCurrentType(armarx::aron::typeIO::WriterInterface& w) const = 0;
+        static void writeType(armarx::aron::typeIO::WriterInterface& w)
         {
             throw error::AronException("AronCppClass", "writeType", "You are not allowed to call this method directly. Each class must inheriting from AronCppClass must implement this static method!");
         };
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 993ddef8346d4deaa262a1182ecef325077a3403..ca13c658ff5852538f08301b14f7eb50f9b6f10d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp
@@ -47,7 +47,7 @@ namespace armarx::aron::cppcodegenerator
             codegeneratorhelper::WriterInfoPtr toAron = codegeneratorhelper::WriterInfoPtr(new codegeneratorhelper::WriterInfo());
             toAron->methodName = "toAron";
             toAron->returnType = "armarx::aron::datanavigator::DictNavigatorPtr";
-            toAron->writerClassType = "armarx::aron::io::NavigatorWriter";
+            toAron->writerClassType = "armarx::aron::dataIO::writer::NavigatorWriter";
             toAron->include = "<RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h>";
             dataWriters.push_back(toAron);
         }
@@ -60,7 +60,7 @@ namespace armarx::aron::cppcodegenerator
             codegeneratorhelper::ReaderInfoPtr fromAron = codegeneratorhelper::ReaderInfoPtr(new codegeneratorhelper::ReaderInfo());
             fromAron->methodName = "fromAron";
             fromAron->argumentType = "armarx::aron::datanavigator::DictNavigatorPtr";
-            fromAron->readerClassType = "armarx::aron::io::NavigatorReader";
+            fromAron->readerClassType = "armarx::aron::dataIO::reader::NavigatorReader";
             fromAron->include = "<RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h>";
             dataReaders.push_back(fromAron);
         }
@@ -68,7 +68,7 @@ namespace armarx::aron::cppcodegenerator
             codegeneratorhelper::ReaderInfoPtr fromAron = codegeneratorhelper::ReaderInfoPtr(new codegeneratorhelper::ReaderInfo());
             fromAron->methodName = "fromAron";
             fromAron->argumentType = "armarx::aron::data::AronDictPtr";
-            fromAron->readerClassType = "armarx::aron::io::NavigatorReader";
+            fromAron->readerClassType = "armarx::aron::dataIO::reader::NavigatorReader";
             dataReaders.push_back(fromAron);
         }
     }
@@ -79,7 +79,7 @@ namespace armarx::aron::cppcodegenerator
         codegeneratorhelper::WriterInfoPtr toAronType = codegeneratorhelper::WriterInfoPtr(new codegeneratorhelper::WriterInfo());
         toAronType->methodName = "toInitialAronType";
         toAronType->returnType = "armarx::aron::typenavigator::ObjectNavigatorPtr";
-        toAronType->writerClassType = "armarx::aron::io::NavigatorWriter";
+        toAronType->writerClassType = "armarx::aron::typeIO::writer::NavigatorWriter";
         toAronType->include = "<RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h>";
         initialTypeWriters.push_back(toAronType);
 
@@ -87,32 +87,38 @@ namespace armarx::aron::cppcodegenerator
         codegeneratorhelper::WriterInfoPtr toAronType2 = codegeneratorhelper::WriterInfoPtr(new codegeneratorhelper::WriterInfo());
         toAronType2->methodName = "toCurrentAronType";
         toAronType2->returnType = "armarx::aron::typenavigator::ObjectNavigatorPtr";
-        toAronType2->writerClassType = "armarx::aron::io::NavigatorWriter";
+        toAronType2->writerClassType = "armarx::aron::typeIO::writer::NavigatorWriter";
         currentTypeWriters.push_back(toAronType2);
     }
 
-    void Writer::generateTypeClasses(const std::vector<codegeneratorhelper::GenerateTypeInfoPtr>& generateTypes)
+    void Writer::generateTypeObjects(const std::vector<codegeneratorhelper::GenerateObjectInfoPtr>& generateObjects)
     {
-        for (const auto& publicGenerateObjectType : generateTypes)
+        for (const auto& publicGenerateObjectType : generateObjects)
         {
+            const auto& nav = publicGenerateObjectType->correspondingType;
+
+            //std::cout << "Generating: " << publicGenerateObjectType->correspondingObjectType->getName() << std::endl;
+
             // Convert to Object type and create class object
-            if (publicGenerateObjectType->correspondingObjectType == nullptr)
+            if (nav == nullptr)
             {
                 throw error::AronException("ClassCppWriter", "generateTypeClasses", "An received public type is null. Abort due to error!");
             }
 
-            serializer::ObjectSerializerPtr objectSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(publicGenerateObjectType->correspondingObjectType));
+            auto serializer = std::make_shared<serializer::ObjectClassSerializer>(nav);
 
-            CppClassPtr c = setupCppClassFromObjectType(publicGenerateObjectType->correspondingObjectType);
-            if (publicGenerateObjectType->correspondingObjectType->getExtends() != nullptr)
+            CppClassPtr c = setupBasicCppClass(serializer->getCppTypename());
+            setupMemberFields(c, serializer);
+
+            if (nav->getExtends() != nullptr)
             {
-                serializer::ObjectSerializerPtr extendsSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(publicGenerateObjectType->correspondingObjectType->getExtends()));
+                auto extendsSerializer = std::make_shared<serializer::ObjectClassSerializer>(nav->getExtends());
                 c->addInherit(extendsSerializer->getCppTypename());
             }
             else
             {
-                c->addInherit("virtual public armarx::aron::codegeneration::AronCppClass");
-                c->addInclude("<RobotAPI/libraries/aron/core/codegenerator/AronCppClass.h>");
+                c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass");
+                c->addInclude("<RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h>");
             }
 
             // Add includes and guard
@@ -133,31 +139,39 @@ namespace armarx::aron::cppcodegenerator
                 }
             }
 
-            generateInnerTypeClasses(c, publicGenerateObjectType->nestedObjects);
+            //std::cout << "Generate Type classes" << std::endl;
+            generateInnerTypeObjects(c, publicGenerateObjectType->nestedObjects);
 
             // ctor
-            c->addCtor(objectSerializer->toCtor(c->getName()));
+            c->addCtor(serializer->toCtor(c->getName()));
 
             // Generic methods
-            CppMethodPtr equals = objectSerializer->toEqualsMethod();
+            //std::cout << "Generate equals method" << std::endl;
+            CppMethodPtr equals = serializer->toEqualsMethod();
             c->addMethod(equals);
 
-            CppMethodPtr reset = objectSerializer->toResetMethod();
+            //std::cout << "Generate reset method" << std::endl;
+            CppMethodPtr reset = serializer->toResetMethod();
             c->addMethod(reset);
 
-            CppMethodPtr setup = objectSerializer->toInitializeMethod();
+            //std::cout << "Generate init method" << std::endl;
+            CppMethodPtr setup = serializer->toInitializeMethod();
             c->addMethod(setup);
 
-            CppMethodPtr writeInitialType = objectSerializer->toWriteInitialTypeMethod();
+            //std::cout << "Generate writeInit method" << std::endl;
+            CppMethodPtr writeInitialType = serializer->toWriteInitialTypeMethod();
             c->addMethod(writeInitialType);
 
-            CppMethodPtr writeCurrentType = objectSerializer->toWriteCurrentTypeMethod();
+            //std::cout << "Generate writeCurrent method" << std::endl;
+            CppMethodPtr writeCurrentType = serializer->toWriteCurrentTypeMethod();
             c->addMethod(writeCurrentType);
 
-            CppMethodPtr write = objectSerializer->toWriteMethod();
+            //std::cout << "Generate write method" << std::endl;
+            CppMethodPtr write = serializer->toWriteMethod();
             c->addMethod(write);
 
-            CppMethodPtr read = objectSerializer->toReadMethod();
+            //std::cout << "Generate read method" << std::endl;
+            CppMethodPtr read = serializer->toReadMethod();
             c->addMethod(read);
 
             // Writermethods
@@ -167,7 +181,7 @@ namespace armarx::aron::cppcodegenerator
                 {
                     c->addInclude(info->include);
                 }
-                CppMethodPtr convert = objectSerializer->toSpecializedDataWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::datanavigator::DictNavigator::DynamicCast");
+                CppMethodPtr convert = serializer->toSpecializedDataWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::datanavigator::DictNavigator::DynamicCast");
                 c->addMethod(convert);
             }
 
@@ -178,7 +192,7 @@ namespace armarx::aron::cppcodegenerator
                 {
                     c->addInclude(info->include);
                 }
-                CppMethodPtr convert = objectSerializer->toSpecializedDataReaderMethod(info->argumentType, info->methodName, info->readerClassType);
+                CppMethodPtr convert = serializer->toSpecializedDataReaderMethod(info->argumentType, info->methodName, info->readerClassType);
                 c->addMethod(convert);
             }
 
@@ -189,7 +203,7 @@ namespace armarx::aron::cppcodegenerator
                 {
                     c->addInclude(info->include);
                 }
-                CppMethodPtr convert = objectSerializer->toSpecializedInitialTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::ObjectNavigator::DynamicCast");
+                CppMethodPtr convert = serializer->toSpecializedInitialTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::ObjectNavigator::DynamicCast");
                 c->addMethod(convert);
             }
 
@@ -200,7 +214,7 @@ namespace armarx::aron::cppcodegenerator
                 {
                     c->addInclude(info->include);
                 }
-                CppMethodPtr convert = objectSerializer->toSpecializedCurrentTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::ObjectNavigator::DynamicCast");
+                CppMethodPtr convert = serializer->toSpecializedCurrentTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::ObjectNavigator::DynamicCast");
                 c->addMethod(convert);
             }
 
@@ -211,7 +225,7 @@ namespace armarx::aron::cppcodegenerator
                 {
                     c->addInclude(info->include);
                 }
-                CppMethodPtr convert = objectSerializer->toSpecializedCurrentTypeReaderMethod(info->argumentType, info->methodName, info->readerClassType);
+                CppMethodPtr convert = serializer->toSpecializedCurrentTypeReaderMethod(info->argumentType, info->methodName, info->readerClassType);
                 c->addMethod(convert);
             }
 
@@ -219,55 +233,121 @@ namespace armarx::aron::cppcodegenerator
         }
     }
 
-    void Writer::generateInnerTypeClasses(CppClassPtr& classToAdd, const std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr>& localGenerateTypes)
+    void Writer::generateTypeIntEnums(const std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr>& generateIntEnums)
+    {
+        for (const auto& publicGenerateIntEnumType : generateIntEnums)
+        {
+            const auto& nav = publicGenerateIntEnumType->correspondingType;
+            if (nav == nullptr)
+            {
+                throw error::AronException("ClassCppWriter", "generateTypeIntEnums", "An received public type is null. Abort due to error!");
+            }
+
+            auto serializer = std::make_shared<serializer::IntEnumClassSerializer>(nav);
+
+            CppClassPtr c = setupBasicCppClass(serializer->getCppTypename());
+            setupMemberFields(c, serializer);
+
+            // Add includes and guard
+            c->addClassDoc("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+                           "!!!!!!AUTOGENERATED CLASS. Please do NOT edit. Instead, edit the corresponding .xml file!!!!!!\n"
+                           "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+            c->setPragmaOnceIncludeGuard(true);
+            c->addInclude("<memory>");
+            c->addInclude("<string>");
+            c->addInclude("<vector>");
+            c->addInclude("<map>");
+            c->addInclude("<RobotAPI/interface/aron.h>");
+
+            c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass");
+            c->addInclude("<RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h>");
+
+            // ctor
+            c->addCtor(serializer->toCtor(c->getName()));
+
+            // Generic methods
+            //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 init method" << std::endl;
+            CppMethodPtr setup = serializer->toInitializeMethod();
+            c->addMethod(setup);
+
+            //std::cout << "Generate writeInit method" << std::endl;
+            CppMethodPtr writeInitialType = serializer->toWriteInitialTypeMethod();
+            c->addMethod(writeInitialType);
+
+            //std::cout << "Generate writeCurrent method" << std::endl;
+            CppMethodPtr writeCurrentType = serializer->toWriteCurrentTypeMethod();
+            c->addMethod(writeCurrentType);
+
+            //std::cout << "Generate write method" << std::endl;
+            CppMethodPtr write = serializer->toWriteMethod();
+            c->addMethod(write);
+
+            //std::cout << "Generate read method" << std::endl;
+            CppMethodPtr read = serializer->toReadMethod();
+            c->addMethod(read);
+
+            typeClasses.push_back(c);
+        }
+    }
+
+    void Writer::generateInnerTypeObjects(CppClassPtr& classToAdd, const std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr>& localGenerateTypes)
     {
         // setup inner classes
         for (const auto& [_, localGenerateObjectType] : localGenerateTypes)
         {
-            serializer::ObjectSerializerPtr objectSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(localGenerateObjectType->correspondingObjectType));
+            const auto& nav = localGenerateObjectType->correspondingType;
+
+            auto serializer = std::make_shared<serializer::ObjectClassSerializer>(nav);
 
-            CppClassPtr c = setupCppClassFromObjectType(localGenerateObjectType->correspondingObjectType);
-            if (localGenerateObjectType->correspondingObjectType->getExtends() != nullptr)
+            CppClassPtr c = setupBasicCppClass(serializer->getCppTypename());
+            setupMemberFields(c, serializer);
+
+            if (nav->getExtends() != nullptr)
             {
-                serializer::ObjectSerializerPtr extendsSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(localGenerateObjectType->correspondingObjectType->getExtends()));
+                auto extendsSerializer = std::make_shared<serializer::ObjectClassSerializer>(nav->getExtends());
                 c->addInherit(extendsSerializer->getCppTypename());
             }
             else
             {
-                c->addInherit("virtual public armarx::aron::codegeneration::AronCppClass");
+                c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass");
             }
 
-            CppMethodPtr equals = objectSerializer->toEqualsMethod();
+            CppMethodPtr equals = serializer->toEqualsMethod();
             c->addMethod(equals);
 
-            CppMethodPtr reset = objectSerializer->toResetMethod();
+            CppMethodPtr reset = serializer->toResetMethod();
             c->addMethod(reset);
 
-            CppMethodPtr setup = objectSerializer->toInitializeMethod();
+            CppMethodPtr setup = serializer->toInitializeMethod();
             c->addMethod(setup);
 
-            CppMethodPtr writeInitialType = objectSerializer->toWriteInitialTypeMethod();
+            CppMethodPtr writeInitialType = serializer->toWriteInitialTypeMethod();
             c->addMethod(writeInitialType);
 
-            CppMethodPtr writeCurrentType = objectSerializer->toWriteCurrentTypeMethod();
+            CppMethodPtr writeCurrentType = serializer->toWriteCurrentTypeMethod();
             c->addMethod(writeCurrentType);
 
-            CppMethodPtr write = objectSerializer->toWriteMethod();
+            CppMethodPtr write = serializer->toWriteMethod();
             c->addMethod(write);
 
-            CppMethodPtr read = objectSerializer->toReadMethod();
+            CppMethodPtr read = serializer->toReadMethod();
             c->addMethod(read);
 
-            generateInnerTypeClasses(c, localGenerateObjectType->nestedObjects);
+            generateInnerTypeObjects(c, localGenerateObjectType->nestedObjects);
             classToAdd->addInnerClass(c);
         }
     }
 
-    CppClassPtr Writer::setupCppClassFromObjectType(const typenavigator::ObjectNavigatorPtr& o) const
+    CppClassPtr Writer::setupBasicCppClass(const std::string& cppTypename) const
     {
-        serializer::ObjectSerializerPtr objectSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(o));
-
-        std::string cppTypename = objectSerializer->getCppTypename();
         std::vector<std::string> split = simox::alg::split(cppTypename, "::");
         if (split.size() < 1)
         {
@@ -277,14 +357,26 @@ namespace armarx::aron::cppcodegenerator
         std::vector<std::string> namespaces(split);
         namespaces.pop_back();
 
-        CppClassPtr c = CppClassPtr(new CppClass(namespaces, split[split.size() - 1]));
+        CppClassPtr c = std::make_shared<CppClass>(namespaces, split[split.size() - 1]);
+        return c;
+    }
 
-        for (const auto& [key, child] : o->getMemberTypes())
+    void Writer::setupMemberFields(CppClassPtr& c, const serializer::ObjectClassSerializerPtr& o) const
+    {
+        auto publicFields = o->getPublicVariableDeclarations("");
+        for (const auto& f : publicFields)
         {
-            SerializerPtr child_s = Serializer::FromAronTypeNaviagtorPtr(child);
-            c->addPublicField(child_s->getCppTypename() + " " + key + ";");
+            c->addPublicField(f);
+        }
+    }
+
+    void Writer::setupMemberFields(CppClassPtr& c, const serializer::IntEnumClassSerializerPtr& o) const
+    {
+        auto publicFields = o->getPublicVariableDeclarations("");
+        for (const auto& f : publicFields)
+        {
+            c->addPublicField(f);
         }
-        return c;
     }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.h
index c7cf9ae5ae8722211cd148dd73477f81cf1e926c..91dd59689dfb678b45ac6b5190ea1b8a04f05cd4 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.h
@@ -37,7 +37,8 @@
 #include <ArmarXCore/libraries/cppgen/CppClass.h>
 
 #include <RobotAPI/libraries/aron/core/navigator/type/AllNavigators.h>
-#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/AllSerializers.h>
+#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h>
+#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h>
 
 namespace armarx::aron::cppcodegenerator
 {
@@ -51,7 +52,8 @@ namespace armarx::aron::cppcodegenerator
         Writer() = delete;
         Writer(const std::string&, const std::vector<std::string>&);
 
-        virtual void generateTypeClasses(const std::vector<codegeneratorhelper::GenerateTypeInfoPtr>&) override;
+        virtual void generateTypeObjects(const std::vector<codegeneratorhelper::GenerateObjectInfoPtr>&) override;
+        virtual void generateTypeIntEnums(const std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr>&) override;
 
     protected:
         virtual void addToAronMethod() override;
@@ -59,8 +61,11 @@ namespace armarx::aron::cppcodegenerator
         virtual void addToAronTypeMethod() override;
 
     private:
-        void generateInnerTypeClasses(CppClassPtr& classToAdd, const std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr>& localGenerateTypes);
-        CppClassPtr setupCppClassFromObjectType(const typenavigator::ObjectNavigatorPtr&) const;
+        void generateInnerTypeObjects(CppClassPtr& classToAdd, const std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr>& localGenerateTypes);
+
+        CppClassPtr setupBasicCppClass(const std::string&) const;
+        void setupMemberFields(CppClassPtr&, const serializer::ObjectClassSerializerPtr&) const;
+        void setupMemberFields(CppClassPtr&, const serializer::IntEnumClassSerializerPtr&) const;
 
     private:
     };
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 9bdd22e61b9dd6bd6e486d8b990db205e9e44db9..0e01b411419d76eb6b3556ef31d664d75356fc4e 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
@@ -193,7 +193,7 @@ namespace armarx::aron::cppcodegenerator
         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 writeInitialType(armarx::aron::io::AronTypeWriter& w)", doc.str()));
+        CppMethodPtr m = CppMethodPtr(new CppMethod("static void writeInitialType(armarx::aron::typeIO::WriterInterface& w)", doc.str()));
         CppBlockPtr b = this->getWriteInitialTypeBlock("");
         m->setBlock(b);
         return m;
@@ -205,8 +205,8 @@ namespace armarx::aron::cppcodegenerator
         doc << "@brief writeType() - This method returns a new type from the current class structure using a type writer implementation. \n";
         doc << "@return - the result of the writer implementation";
 
-        CppMethodPtr m = CppMethodPtr(new CppMethod("void writeCurrentType(armarx::aron::io::AronTypeWriter& w) const override", doc.str()));
-        CppBlockPtr b = this->getWriteInitialTypeBlock("");
+        CppMethodPtr m = CppMethodPtr(new CppMethod("void writeCurrentType(armarx::aron::typeIO::WriterInterface& w) const override", doc.str()));
+        CppBlockPtr b = this->getWriteCurrentTypeBlock("");
         m->setBlock(b);
         return m;
     }
@@ -218,7 +218,7 @@ namespace armarx::aron::cppcodegenerator
         doc << "@param w - The writer implementation\n";
         doc << "@return - the result of the writer implementation";
 
-        CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void write(armarx::aron::io::AronDataWriter& w) const override", doc.str()));
+        CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void write(armarx::aron::dataIO::WriterInterface& w) const override", doc.str()));
         CppBlockPtr b = this->getWriteBlock("");
         m->setBlock(b);
         return m;
@@ -231,7 +231,7 @@ namespace armarx::aron::cppcodegenerator
         doc << "@param r - The reader implementation\n";
         doc << "@return - nothing";
 
-        CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void read(armarx::aron::io::AronDataReader& r) override", doc.str()));
+        CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void read(armarx::aron::dataIO::ReaderInterface& r) override", doc.str()));
         CppBlockPtr b = this->getReadBlock("");
         m->setBlock(b);
         return m;
@@ -270,7 +270,7 @@ namespace armarx::aron::cppcodegenerator
 
         CppMethodPtr m = CppMethodPtr(new CppMethod("static " + returnname + " " + methodname + "()", doc.str()));
         m->addLine(writerName + " writer;");
-        m->addLine(getCppTypename() + "::writeInitialType(writer);");
+        m->addLine("writeInitialType(writer);");
         m->addLine("return " + enforceConversion + "(writer.getResult());");
         return m;
     }
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 0d893214185ad431326242e1cd7f383f18448ecd..7b777b8201d2ddfa302135a1b7795afd134a8c9d 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,15 +34,30 @@ namespace armarx::aron::cppcodegenerator
     // 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 =
         {
-            HANDLE_ALL_ARON_TYPES
+            {type::eObject, SerializerFactoryPtr(new ObjectSerializerFactory())},
+            {type::eDict, SerializerFactoryPtr(new DictSerializerFactory())},
+            {type::eList, SerializerFactoryPtr(new ListSerializerFactory())},
+            {type::eTuple, SerializerFactoryPtr(new TupleSerializerFactory())},
+            {type::ePair, SerializerFactoryPtr(new PairSerializerFactory())},
+            {type::eEigenMatrix, SerializerFactoryPtr(new EigenMatrixSerializerFactory())},
+            {type::eEigenQuaternion, SerializerFactoryPtr(new EigenQuaternionSerializerFactory())},
+            {type::eIVTCByteImage, SerializerFactoryPtr(new IVTCByteImageSerializerFactory())},
+            {type::eOpenCVMat, SerializerFactoryPtr(new OpenCVMatSerializerFactory())},
+            {type::ePCLPointCloud, SerializerFactoryPtr(new PCLPointCloudSerializerFactory())},
+            {type::ePosition, SerializerFactoryPtr(new PositionSerializerFactory())},
+            {type::eOrientation, SerializerFactoryPtr(new OrientationSerializerFactory())},
+            {type::ePose, SerializerFactoryPtr(new PoseSerializerFactory())},
+            {type::eIntEnum, SerializerFactoryPtr(new IntEnumSerializerFactory())},
+            {type::eInt, SerializerFactoryPtr(new IntSerializerFactory())},
+            {type::eLong, SerializerFactoryPtr(new LongSerializerFactory())},
+            {type::eFloat, SerializerFactoryPtr(new FloatSerializerFactory())},
+            {type::eDouble, SerializerFactoryPtr(new DoubleSerializerFactory())},
+            {type::eString, SerializerFactoryPtr(new StringSerializerFactory())},
+            {type::eBool, SerializerFactoryPtr(new BoolSerializerFactory())},
+            {type::eTime, SerializerFactoryPtr(new TimeSerializerFactory())}
         };
-#undef RUN_ARON_MACRO
 
         //CheckIfPtrIsNull("NavigatorFactory", "create", path, n);
         auto res = n->getResult();
@@ -59,7 +74,7 @@ namespace armarx::aron::cppcodegenerator
         throw error::AronException("NavigatorFactory", "createSpecific", "Called disallowed method. Use child class instead!");
     }
 
-                    // Container Factories
+    // Factories
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
     SerializerPtr upperType##SerializerFactory::createSpecific(const typenavigator::NavigatorPtr& n, const Path& path) const \
     { \
@@ -69,6 +84,6 @@ namespace armarx::aron::cppcodegenerator
         return SerializerPtr(new serializer::upperType##Serializer(casted)); \
     }
 
-                    HANDLE_ALL_ARON_TYPES
+    HANDLE_ALL_ARON_TYPES
 #undef RUN_ARON_MACRO
 }
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 91a45cd845d04e8bd26b96a1d9ced54b89ba7ed6..306553442f3ed1274c1de4b4a03d7fd601a22b91 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
@@ -70,7 +70,7 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr DictSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartDictType();");
+        b->addLine("w.writeStartDict();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR;
@@ -78,14 +78,14 @@ namespace armarx::aron::cppcodegenerator::serializer
         auto type_s = FromAronTypeNaviagtorPtr(navigator->getAcceptedType());
         CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(type_s->getCppTypename());
         b->appendBlock(b2);
-        b->addLine("w.writeEndDictType();");
+        b->addLine("w.writeEndDict();");
         return b;
     }
 
     CppBlockPtr DictSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartDictType();");
+        b->addLine("w.writeStartDict();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR;
@@ -93,7 +93,7 @@ namespace armarx::aron::cppcodegenerator::serializer
         auto type_s = FromAronTypeNaviagtorPtr(navigator->getAcceptedType());
         CppBlockPtr b2 = type_s->getWriteCurrentTypeBlock(type_s->getCppTypename());
         b->appendBlock(b2);
-        b->addLine("w.writeEndDictType();");
+        b->addLine("w.writeEndDict();");
         return b;
     }
 
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 779ffd6183c7ef1e6b78bd746b31d2397dd8bd29..1961536dc1d6a1316736891b4599c0e2ba6b74e9 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
@@ -68,26 +68,26 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr ListSerializer::getWriteInitialTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartListType();");
+        b->addLine("w.writeStartList();");
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
 
         CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(type_s->getCppTypename());
         b->appendBlock(b2);
 
-        b->addLine("w.writeEndListType();");
+        b->addLine("w.writeEndList();");
         return b;
     }
 
     CppBlockPtr ListSerializer::getWriteCurrentTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartListType();");
+        b->addLine("w.writeStartList();");
         auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType());
 
-        CppBlockPtr b2 = type_s->getWriteCurrentTypeBlock(type_s->getCppTypename());
+        CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(type_s->getCppTypename()); // TODO: think about having a better solution not ignoting the current type
         b->appendBlock(b2);
 
-        b->addLine("w.writeEndListType();");
+        b->addLine("w.writeEndList();");
         return b;
     }
 
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 29345b3391cec2d6695d7946ecb40eadc765bb37..c57be2c1f80dbe0ff2b8f323d14ba12c4026fb8d 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
@@ -26,239 +26,80 @@
 
 
 namespace armarx::aron::cppcodegenerator::serializer
-                {
-                    // constructors
-                    ObjectSerializer::ObjectSerializer(const typenavigator::ObjectNavigatorPtr& e) :
-                        Serializer(e->getObjectName(), simox::meta::get_type_name(typeid(data::AronDict)), simox::meta::get_type_name(typeid(type::AronObject))),
-                        navigator(e)
-                    {
-                        //AddObjectTypeToAllObjectTypesList(ObjectNavigatorPtr(this));
-                    }
-
-                    std::vector<CppFieldPtr> ObjectSerializer::getPublicVariableDeclarations(const std::string& name) const
-                    {
-                        if (name == "") // object defintiion
-                        {
-                            std::vector<CppFieldPtr> fields;
-                            for (const auto& [key, member] : navigator->getMemberTypes())
-                            {
-                                auto member_s = FromAronTypeNaviagtorPtr(member);
-                                std::vector<CppFieldPtr> member_fields = member_s->getPublicVariableDeclarations(key);
-                                fields.insert(fields.end(), member_fields.begin(), member_fields.end());
-                            }
-                            return fields;
-                        }
-                        else // object usage
-                        {
-                            CppFieldPtr field = CppFieldPtr(new CppField(getCppTypename(), name));
-                            return {field};
-                        };
-                    }
-
-                    std::vector<std::pair<std::string, std::string>> ObjectSerializer::getCtorInitializers(const std::string&) const
-                    {
-                        return {};
-                    }
-
-                    CppBlockPtr ObjectSerializer::getCtorBlock(const std::string&) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-                        return b;
-                    }
-
-                    CppBlockPtr ObjectSerializer::getResetBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-                        if (accessor == "")
-                        {
-                            if (navigator->getExtends() != nullptr)
-                            {
-                                const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
-                                b->addLine(extends_s->getCppTypename() + "::reset();");
-                            }
-
-                            for (const auto& [key, child] : navigator->getMemberTypes())
-                            {
-                                auto child_s = FromAronTypeNaviagtorPtr(child);
-                                CppBlockPtr b2 = child_s->getResetBlock((accessor != "" ? (accessor + "." + key) : key));
-                                b->appendBlock(b2);
-                            }
-                        }
-                        else
-                        {
-                            b->addLine(accessor + ".reset();");
-                        }
-                        return b;
-                    }
-
-                    CppBlockPtr ObjectSerializer::getInitializeBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-                        if (accessor == "")
-                        {
-                            if (navigator->getExtends() != nullptr)
-                            {
-                                const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
-                                b->addLine(extends_s->getCppTypename() + "::initialize();");
-                            }
-
-                            for (const auto& [key, child] : navigator->getMemberTypes())
-                            {
-                                const auto child_s = FromAronTypeNaviagtorPtr(child);
-                                CppBlockPtr b2 = child_s->getInitializeBlock((accessor != "" ? (accessor + "." + key) : key));
-                                b->appendBlock(b2);
-                            }
-                        }
-                        else
-                        {
-                            b->addLine(accessor + ".initialize();");
-                        }
-                        return b;
-                    }
-
-                    CppBlockPtr ObjectSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-                        if (accessor == "")
-                        {
-                            if (navigator->getExtends() != nullptr)
-                            {
-                                const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
-                                b->addLine(extends_s->getCppTypename() + "::writeInitialType(w);");
-                            }
-
-                            b->addLine("w.writeStartObjectType();");
-                            b->addLine("w.writeObjectName(\"" + navigator->getObjectName() + "\");");
-                            for (const auto& [key, child] : navigator->getMemberTypes())
-                            {
-                                const auto child_s = FromAronTypeNaviagtorPtr(child);
-                                b->addLine("w.writeKey(\"" + key + "\");");
-                                CppBlockPtr b2 = child_s->getWriteInitialTypeBlock(child_s->getCppTypename());
-                                b->appendBlock(b2);
-                            }
-                            b->addLine("w.writeEndObjectType();");
-                        }
-                        else
-                        {
-                            b->addLine(accessor + "::writeInitialType(w);");
-                        }
-                        return b;
-                    }
-
-                    CppBlockPtr ObjectSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-                        if (accessor == "")
-                        {
-                            if (navigator->getExtends() != nullptr)
-                            {
-                                const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
-                                //b->addLine(extends_s->getCppTypename() + ".writeCurrentType(w);"); TODO
-                            }
-
-                            b->addLine("w.writeStartObjectType();");
-                            b->addLine("w.writeObjectName(\"" + navigator->getObjectName() + "\");");
-                            for (const auto& [key, child] : navigator->getMemberTypes())
-                            {
-                                const auto child_s = FromAronTypeNaviagtorPtr(child);
-                                b->addLine("w.writeKey(\"" + key + "\");");
-                                CppBlockPtr b2 = child_s->getWriteCurrentTypeBlock(child_s->getCppTypename());
-                                b->appendBlock(b2);
-                            }
-                            b->addLine("w.writeEndObjectType();");
-                        }
-                        else
-                        {
-                            b->addLine(accessor + ".writeCurrentType(w);");
-                        }
-                        return b;
-                    }
-
-                    CppBlockPtr ObjectSerializer::getWriteBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-                        if (accessor == "")
-                        {
-                            if (navigator->getExtends() != nullptr)
-                            {
-                                const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
-                                b->addLine(extends_s->getCppTypename() + "::write(w, aron_type);");
-                            }
-
-                            b->addLine("w.writeStartDict();");
-                            for (const auto& [key, child] : navigator->getMemberTypes())
-                            {
-                                const auto child_s = FromAronTypeNaviagtorPtr(child);
-                                b->addLine("w.writeKey(\"" + key + "\");");
-                                CppBlockPtr b2 = child_s->getWriteBlock((accessor != "" ? (accessor + "." + key) : key));
-                                b->appendBlock(b2);
-                            }
-                            b->addLine("w.writeEndDict();");
-                        }
-                        else
-                        {
-                            b->addLine(accessor + ".write(w);");
-                        }
-                        return b;
-                    }
-
-                    CppBlockPtr ObjectSerializer::getReadBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-                        if (accessor == "")
-                        {
-                            if (navigator->getExtends() != nullptr)
-                            {
-                                const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
-                                b->addLine(extends_s->getCppTypename() + "::read(r);");
-                            }
-
-                            b->addLine("r.readStartDict();");
-                            for (const auto& [key, child] : navigator->getMemberTypes())
-                            {
-                                const auto child_s = FromAronTypeNaviagtorPtr(child);
-                                b->addLine("r.readKey(\"" + key + "\");");
-                                CppBlockPtr b2 = child_s->getReadBlock((accessor != "" ? (accessor + "." + key) : key));
-                                b->appendBlock(b2);
-                            }
-                            b->addLine("r.readEndDict();");
-                        }
-                        else
-                        {
-                            b->addLine(accessor + ".read(r);");
-                        }
-                        return b;
-                    }
-
-                    CppBlockPtr ObjectSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-                        if (accessor == "") // object definition, so we are no member of some other class
-                        {
-                            if (navigator->getExtends() != nullptr)
-                            {
-                                const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
-                                b->addLine("if (not (" + extends_s->getCppTypename() + "::operator== (" + otherInstanceAccessor + ")))");
-                                b->addLine("\t return false;");
-                            }
-                            for (const auto& [key, child] : navigator->getMemberTypes())
-                            {
-                                auto child_s = FromAronTypeNaviagtorPtr(child);
-                                CppBlockPtr b2 = child_s->getEqualsBlock(key, otherInstanceAccessor + "." + key);
-                                b->appendBlock(b2);
-                            }
-                        }
-                        else // object usage with existing operator==
-                        {
-                            b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
-                            b->addLine("\t return false;");
-                        }
-                        return b;
-                    }
+{
+    // constructors
+    ObjectSerializer::ObjectSerializer(const typenavigator::ObjectNavigatorPtr& e) :
+        Serializer(e->getObjectName(), simox::meta::get_type_name(typeid(data::AronDict)), simox::meta::get_type_name(typeid(type::AronObject))),
+        navigator(e)
+    {
+        //AddObjectTypeToAllObjectTypesList(ObjectNavigatorPtr(this));
+    }
+
+    std::vector<CppFieldPtr> ObjectSerializer::getPublicVariableDeclarations(const std::string& name) const
+    {
+        CppFieldPtr field = CppFieldPtr(new CppField(getCppTypename(), name));
+        return {field};
+    }
+
+    std::vector<std::pair<std::string, std::string>> ObjectSerializer::getCtorInitializers(const std::string&) const
+    {
+        return {};
+    }
+
+    CppBlockPtr ObjectSerializer::getCtorBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        return b;
+    }
+
+    CppBlockPtr ObjectSerializer::getResetBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine(accessor + ".reset();");
+        return b;
+    }
+
+    CppBlockPtr ObjectSerializer::getInitializeBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine(accessor + ".initialize();");
+        return b;
+    }
+
+    CppBlockPtr ObjectSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine(accessor + "::writeInitialType(w);");
+        return b;
+    }
+
+    CppBlockPtr ObjectSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine(accessor + ".writeCurrentType(w);");
+        return b;
+    }
+
+    CppBlockPtr ObjectSerializer::getWriteBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine(accessor + ".write(w);");
+        return b;
+    }
+
+    CppBlockPtr ObjectSerializer::getReadBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine(accessor + ".read(r);");
+        return b;
+    }
+
+    CppBlockPtr ObjectSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
+        b->addLine("\t return false;");
+        return b;
+    }
 }
 
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 a8bcb99db043034e1a324bf33872bdd9eebce834..401ee4a09bf41a33fe47f8ec8f972f9900f6b4d6 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
@@ -69,7 +69,7 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PairSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartPairType();");
+        b->addLine("w.writeStartPair();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
 
@@ -85,14 +85,14 @@ namespace armarx::aron::cppcodegenerator::serializer
         CppBlockPtr b22 = child_s2->getWriteInitialTypeBlock(accessor_iterator2);
         b->appendBlock(b22);
 
-        b->addLine("w.writeEndPairType();");
+        b->addLine("w.writeEndPair();");
         return b;
     }
 
     CppBlockPtr PairSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartPairType();");
+        b->addLine("w.writeStartPair();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
 
@@ -108,7 +108,7 @@ namespace armarx::aron::cppcodegenerator::serializer
         CppBlockPtr b22 = child_s2->getWriteCurrentTypeBlock(accessor_iterator2);
         b->appendBlock(b22);
 
-        b->addLine("w.writeEndPairType();");
+        b->addLine("w.writeEndPair();");
         return b;
     }
 
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 300a1474322db30f5417e2ed19a778ea1d815ed6..5e6f97e448280dccc0e13f91bc24d75020b26e3c 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
@@ -68,7 +68,7 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr TupleSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartTupleType();");
+        b->addLine("w.writeStartTuple();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         unsigned int i = 0;
@@ -80,14 +80,14 @@ namespace armarx::aron::cppcodegenerator::serializer
             CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(accessor_iterator);
             b->appendBlock(b2);
         }
-        b->addLine("w.writeEndTupleType();");
+        b->addLine("w.writeEndTuple();");
         return b;
     }
 
     CppBlockPtr TupleSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeStartTupleType();");
+        b->addLine("w.writeStartTuple();");
 
         std::string escaped_accessor = EscapeAccessor(accessor);
         unsigned int i = 0;
@@ -99,7 +99,7 @@ namespace armarx::aron::cppcodegenerator::serializer
             CppBlockPtr b2 = type_s->getWriteCurrentTypeBlock(accessor_iterator);
             b->appendBlock(b2);
         }
-        b->addLine("w.writeEndTupleType();");
+        b->addLine("w.writeEndTuple();");
         return b;
     }
 
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 30a7df9a7ee7a0644d2b33b0254ad23ceadf54e6..c2d7e59189c1caa4acf839cf1c67afc5f2f0d14b 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp
@@ -29,7 +29,7 @@ namespace armarx::aron::cppcodegenerator::serializer
     // constructors
     IntEnumSerializer::IntEnumSerializer(const typenavigator::IntEnumNavigatorPtr& n) :
         Serializer(n->getEnumName(), simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIntEnum))),
-        typenavigator(n)
+        navigator(n)
     {
     }
 
@@ -53,50 +53,49 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr IntEnumSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "enum());");
+        b->addLine(accessor + ".reset();");
         return b;
     }
 
-    CppBlockPtr IntEnumSerializer::getWriteInitialTypeBlock(const std::string&) const
+    CppBlockPtr IntEnumSerializer::getWriteInitialTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeIntEnumType();");
+        b->addLine(accessor + "::writeInitialType(w);");
         return b;
     }
 
     CppBlockPtr IntEnumSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeIntEnumType();");
+        b->addLine(accessor + ".writeCurrentType(w);");
         return b;
     }
 
     CppBlockPtr IntEnumSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "();");
+        b->addLine(accessor + ".initialize();");
         return b;
     }
 
     CppBlockPtr IntEnumSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeNDArray();");
+        b->addLine(accessor + ".write(w);");
         return b;
     }
 
     CppBlockPtr IntEnumSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("r.readStartNDArray(); // We do not need the dims and type since a EigenMat can not change (templated)");
-        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        b->addLine(accessor + ".read(r);");
         return b;
     }
 
     CppBlockPtr IntEnumSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + "->isApprox(*" + otherInstanceAccessor + ")))");
+        b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))");
         b->addLine("\t return false;");
         return b;
     }
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 ba53bb47e8b7a406eab9d2ad738c48df0b3c62ab..abb82b441cb59b139ec531110523a7844216273d 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 typenavigator;
+        typenavigator::IntEnumNavigatorPtr navigator;
     };
 }
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 2e6dfec9ebca6bb178f05f36a9b8000f35aad38d..31fc0342b768c72a5f0daed022ef167c0e3ee170 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,7 +40,7 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     // constructors
     EigenMatrixSerializer::EigenMatrixSerializer(const typenavigator::EigenMatrixNavigatorPtr& n) :
-        Serializer("std::shared_ptr<::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))),
+        Serializer("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))),
         typenavigator(n)
     {
     }
@@ -65,35 +65,35 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr EigenMatrixSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new ::Eigen::Matrix<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ", " + std::to_string(typenavigator->getRows()) + ", " + std::to_string(typenavigator->getCols()) + ">());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
     CppBlockPtr EigenMatrixSerializer::getWriteInitialTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeEigenMatrixType({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writeEigenMatrix({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");");
         return b;
     }
 
     CppBlockPtr EigenMatrixSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeEigenMatrixType({" + accessor + "->rows(), " + accessor + "->cols()}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writeEigenMatrix({" + accessor + ".rows(), " + accessor + ".cols()}, \"" + typenavigator->getTypename() + "\");");
         return b;
     }
 
     CppBlockPtr EigenMatrixSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new ::Eigen::Matrix<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ", " + std::to_string(typenavigator->getRows()) + ", " + std::to_string(typenavigator->getCols()) + ">());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
     CppBlockPtr EigenMatrixSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeNDArray({" + accessor + "->rows(), " + accessor + "->cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        b->addLine("w.writeNDArray({" + accessor + ".rows(), " + accessor + ".cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".data()));");
         return b;
     }
 
@@ -101,14 +101,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
         b->addLine("r.readStartNDArray(); // We do not need the dims and type since a EigenMat can not change (templated)");
-        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".data()));");
         return b;
     }
 
     CppBlockPtr EigenMatrixSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + "->isApprox(*" + otherInstanceAccessor + ")))");
+        b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))");
         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 28ef264c4f39185e8dfeb3d701312aa36631b6f4..2d0d53e17fc5ab195efce9c424c118e67e5935e0 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,7 +35,7 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     // constructors
     EigenQuaternionSerializer::EigenQuaternionSerializer(const typenavigator::EigenQuaternionNavigatorPtr& n) :
-        Serializer("std::shared_ptr<::Eigen::Quaternion<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronEigenQuaternion))),
+        Serializer("Eigen::Quaternion<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronEigenQuaternion))),
         typenavigator(n)
     {
     }
@@ -60,35 +60,35 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr EigenQuaternionSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new ::Eigen::Quaternion<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
     CppBlockPtr EigenQuaternionSerializer::getWriteInitialTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeEigenQuaternionType({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writeEigenQuaternion(\"" + typenavigator->getTypename() + "\");");
         return b;
     }
 
-    CppBlockPtr EigenQuaternionSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
+    CppBlockPtr EigenQuaternionSerializer::getWriteCurrentTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeEigenQuaternionType({" + accessor + "->rows(), " + accessor + "->cols()}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writeEigenQuaternion(\"" + typenavigator->getTypename() + "\");");
         return b;
     }
 
     CppBlockPtr EigenQuaternionSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new ::Eigen::Quaternion<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
     CppBlockPtr EigenQuaternionSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeNDArray({" + accessor + "->rows(), " + accessor + "->cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        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*>(" + accessor + ".coeffs().data()));");
         return b;
     }
 
@@ -96,14 +96,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
         b->addLine("r.readStartNDArray(); // We do not need the dims and type since a EigenMat can not change (templated)");
-        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".coeffs().data()));");
         return b;
     }
 
     CppBlockPtr EigenQuaternionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + "->isApprox(*" + otherInstanceAccessor + ")))");
+        b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))");
         b->addLine("\t return false;");
         return b;
     }
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 30de9f5f8a96d0297ad7757411cfa66790b1f87d..920cd941a2622fa92df5873e4823d35bc16ea2c7 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,7 +36,7 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     // constructors
     IVTCByteImageSerializer::IVTCByteImageSerializer(const typenavigator::IVTCByteImageNavigatorPtr& e) :
-        Serializer("std::shared_ptr<CByteImage>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIVTCByteImage))),
+        Serializer("CByteImage", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIVTCByteImage))),
         typenavigator(e)
     {
         // check if type exists
@@ -63,53 +63,57 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr IVTCByteImageSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new CByteImage(" + accessor + "->width, " + accessor + "->height, " + accessor + "->type));");
+        b->addLine(accessor + ".Set(" + accessor + ".width, " + accessor + ".height, " + accessor + ".type);");
         return b;
     }
 
     CppBlockPtr IVTCByteImageSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new CByteImage(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ", " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + "));");
+        b->addLine(accessor + ".Set(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ", " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ");");
         return b;
     }
 
     CppBlockPtr IVTCByteImageSerializer::getWriteInitialTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeIVTCByteImageType({" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + "}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writeIVTCByteImage(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ", \"" + typenavigator->getTypename() + "\");");
         return b;
     }
 
     CppBlockPtr IVTCByteImageSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeIVTCByteImageType({" + accessor + "->width, " + accessor + "->height} \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writeIVTCByteImage(" + accessor + ".width, " + accessor + ".height, \"" + typenavigator->getTypename() + "\");");
         return b;
     }
 
     CppBlockPtr IVTCByteImageSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeNDArray({" + accessor + "->width, " + accessor + "->height, " + accessor + "->bytesPerPixel}, std::to_string(" + accessor + "->type), reinterpret_cast<unsigned char*>(" + accessor + "->pixels));");
+        b->addLine("w.writeNDArray({" + accessor + ".width, " + accessor + ".height, " + accessor + ".bytesPerPixel}, std::to_string(" + accessor + ".type), reinterpret_cast<const unsigned char*>(" + accessor + ".pixels));");
         return b;
     }
 
     CppBlockPtr IVTCByteImageSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("const auto [dims, type] = r.readStartNDArray();");
-        b->addLine(accessor + " = " + getCppTypename() + "(new CByteImage(dims[0], dims[1], static_cast<CByteImage::ImageType>(std::stoi(type))));");
-        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->pixels));");
+        std::string escaped_accessor = EscapeAccessor(accessor);
+        std::string dims_accessor = escaped_accessor + DIMENSION_ACCESSOR;
+        std::string type_accessor = escaped_accessor + TYPE_ACCESSOR;
+
+        b->addLine("const auto [" + dims_accessor + ", " + type_accessor + "] = r.readStartNDArray();");
+        b->addLine(accessor + ".Set(" + dims_accessor + "[0], " + dims_accessor + "[1], static_cast<CByteImage::ImageType>(std::stoi(" + type_accessor + ")));");
+        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".pixels));");
         return b;
     }
 
     CppBlockPtr IVTCByteImageSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (not (" + accessor + "->IsCompatible(" + otherInstanceAccessor + ".get())))");
+        b->addLine("if (not (" + accessor + ".IsCompatible(&" + otherInstanceAccessor + ")))");
         b->addLine("\t return false;");
-        b->addLine("if (not (memcmp(" + accessor + "->pixels, " + otherInstanceAccessor + "->pixels, " + accessor + "->width * " + accessor + "->height * " + accessor + "->bytesPerPixel) == 0))");
+        b->addLine("if (not (memcmp(" + accessor + ".pixels, " + otherInstanceAccessor + ".pixels, " + accessor + ".width * " + accessor + ".height * " + accessor + ".bytesPerPixel) == 0))");
         b->addLine("\t return false;");
         return b;
     }
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 d7b0869afde055183cd512bb1aad794af922b973..ac91df514b87f3377f5f9738a613cd1dc6c29ca6 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
@@ -64,6 +64,8 @@ namespace armarx::aron::cppcodegenerator::serializer
     private:
         // members
         static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES;
+        static constexpr const char* DIMENSION_ACCESSOR = "_dimensions";
+        static constexpr const char* TYPE_ACCESSOR = "_type";
 
         typenavigator::IVTCByteImageNavigatorPtr typenavigator;
     };
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp
index 0bcebaec3f58acb3b4bd13c5f4cb735ce4bd2cb6..fed76275099b5969bf3993cbd10d57973065e103 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
@@ -25,130 +25,133 @@
 #include "OpenCVMat.h"
 
 namespace armarx::aron::cppcodegenerator::serializer
-                {
-
-                    const std::map<std::string, std::pair<std::string, int>> OpenCVMatSerializer::ACCEPTED_TYPES =
-                    {
-                        {"CV_8U", {"CV_8U", 1}},
-                        {"CV_8S", {"CV_8S", 1}},
-                        {"CV_16U", {"CV_16U", 2}},
-                        {"CV_16S", {"CV_16S", 2}},
-                        {"CV_32S", {"CV_32S", 4}},
-                        {"CV_32F", {"CV_32F", 4}},
-                        {"CV_64F", {"CV_64F", 8}},
-                    };
-
-                    const std::string OpenCVMatSerializer::OPENCVMAT_ITERATOR_ACCESSOR = "_iterator";
-                    const std::string OpenCVMatSerializer::OPENCVMAT_DIMENSIONS_ACCESSOR = "_dimensions";
-                    const std::string OpenCVMatSerializer::OPENCVMAT_DIFF_ACCESSOR = "_dimensions";
-
-                    // constructors
-                    OpenCVMatSerializer::OpenCVMatSerializer(const typenavigator::OpenCVMatNavigatorPtr& e) :
-                        Serializer("std::shared_ptr<cv::Mat>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronOpenCVMat))),
-                        typenavigator(e)
-                    {
-                        // check if type exists
-                        ACCEPTED_TYPES.at(e->getTypename());
-                    }
-
-                    std::vector<CppFieldPtr> OpenCVMatSerializer::getPublicVariableDeclarations(const std::string& name) const
-                    {
-                        CppFieldPtr field = CppFieldPtr(new CppField(getCppTypename(), name));
-                        return {field};
-                    }
-
-                    std::vector<std::pair<std::string, std::string>> OpenCVMatSerializer::getCtorInitializers(const std::string&) const
-                    {
-                        return {};
-                    }
-
-                    CppBlockPtr OpenCVMatSerializer::getCtorBlock(const std::string&) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-                        return b;
-                    }
-
-                    CppBlockPtr OpenCVMatSerializer::getResetBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-                        std::string escaped_accessor = EscapeAccessor(accessor);
-                        std::string accessor_dimensions = escaped_accessor + OPENCVMAT_DIMENSIONS_ACCESSOR;
-                        std::string accessor_iterator = escaped_accessor + OPENCVMAT_ITERATOR_ACCESSOR;
-
-                        b->addLine("std::vector<int> " + accessor_dimensions + ";");
-                        b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + "->dims; ++" + accessor_iterator + ")");
-                        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
-                        b2->addLine(accessor_dimensions + ".push_back(" + accessor + "->size[" + accessor_iterator + "]);");
-                        b->appendBlock(b2);
-                        b->addLine(accessor + " = " + getCppTypename() + "(new cv::Mat(" + accessor_dimensions + ", " + accessor + "->type()));");
-                        return b;
-                    }
-
-                    CppBlockPtr OpenCVMatSerializer::getInitializeBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-                        b->addLine(accessor + " = " + getCppTypename() + "(new cv::Mat(std::vector<int>({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}), " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + "));");
-                        return b;
-                    }
-
-                    CppBlockPtr OpenCVMatSerializer::getWriteInitialTypeBlock(const std::string&) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-                        b->addLine("w.writeOpenCVMatType({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");");
-                        return b;
-                    }
-
-                    CppBlockPtr OpenCVMatSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-                        std::string escaped_accessor = EscapeAccessor(accessor);
-                        std::string accessor_dimensions = escaped_accessor + OPENCVMAT_DIMENSIONS_ACCESSOR;
-                        std::string accessor_iterator = escaped_accessor + OPENCVMAT_ITERATOR_ACCESSOR;
-
-                        b->addLine("std::vector<int> " + accessor_dimensions + ";");
-                        b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + "->dims; ++" + accessor_iterator + ")");
-                        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
-                        b2->addLine(accessor_dimensions + ".push_back(" + accessor + "->size[" + accessor_iterator + "]);");
-                        b->appendBlock(b2);
-                        b->addLine("w.writeOpenCVMatType(" + accessor_dimensions + ", std::to_string(" + accessor + "->type()));");
-                        return b;
-                    }
-
-                    CppBlockPtr OpenCVMatSerializer::getWriteBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-
-                        std::string escaped_accessor = EscapeAccessor(accessor);
-                        std::string accessor_dimensions = escaped_accessor + OPENCVMAT_DIMENSIONS_ACCESSOR;
-                        std::string accessor_iterator = escaped_accessor + OPENCVMAT_ITERATOR_ACCESSOR;
-
-                        b->addLine("std::vector<int> " + accessor_dimensions + ";");
-                        b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + "->dims; ++" + accessor_iterator + ")");
-                        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
-                        b2->addLine(accessor_dimensions + ".push_back(" + accessor + "->size[" + accessor_iterator + "]);");
-                        b->appendBlock(b2);
-                        b->addLine(accessor_dimensions + ".push_back(" + accessor + "->elemSize());");
-                        b->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + "->type()), reinterpret_cast<unsigned char*>(" + accessor + "->data));");
-                        return b;
-                    }
-
-                    CppBlockPtr OpenCVMatSerializer::getReadBlock(const std::string& accessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-                        b->addLine("const auto [dims, type] = r.readStartNDArray();");
-                        b->addLine(accessor + " = " + getCppTypename() + "(new cv::Mat(std::vector<int>({dims.begin(), std::prev(dims.end())}), std::stoi(type)));");
-                        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data));");
-                        return b;
-                    }
-
-                    CppBlockPtr OpenCVMatSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
-                    {
-                        CppBlockPtr b = CppBlockPtr(new CppBlock());
-                        b->addLine("if (cv::countNonZero(*" + accessor + " != *" + otherInstanceAccessor + ") != 0)");
-                        b->addLine("\t return false;");
-                        return b;
-                    }
+{
+
+    const std::map<std::string, std::pair<std::string, int>> OpenCVMatSerializer::ACCEPTED_TYPES =
+    {
+        {"CV_8U", {"CV_8U", 1}},
+        {"CV_8S", {"CV_8S", 1}},
+        {"CV_16U", {"CV_16U", 2}},
+        {"CV_16S", {"CV_16S", 2}},
+        {"CV_32S", {"CV_32S", 4}},
+        {"CV_32F", {"CV_32F", 4}},
+        {"CV_64F", {"CV_64F", 8}},
+    };
+
+    // constructors
+    OpenCVMatSerializer::OpenCVMatSerializer(const typenavigator::OpenCVMatNavigatorPtr& e) :
+        Serializer("cv::Mat", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronOpenCVMat))),
+        typenavigator(e)
+    {
+        // check if type exists
+        if (ACCEPTED_TYPES.find(e->getTypename()) == ACCEPTED_TYPES.end())
+        {
+            throw error::StringNotValidException("OpenCVMatSerializer", "OpenCVMatSerializer", "Could not find a matching typename.", e->getTypename(), e->getPath());
+        }
+    }
+
+    std::vector<CppFieldPtr> OpenCVMatSerializer::getPublicVariableDeclarations(const std::string& name) const
+    {
+        CppFieldPtr field = CppFieldPtr(new CppField(getCppTypename(), name));
+        return {field};
+    }
+
+    std::vector<std::pair<std::string, std::string>> OpenCVMatSerializer::getCtorInitializers(const std::string&) const
+    {
+        return {};
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getCtorBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        return b;
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getResetBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = 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 + ".dims; ++" + accessor_iterator + ")");
+        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
+        b2->addLine(accessor_dimensions + ".push_back(" + accessor + ".size[" + accessor_iterator + "]);");
+        b->appendBlock(b2);
+        b->addLine(accessor + " = " + getCppTypename() + "(" + accessor_dimensions + ", " + accessor + ".type());");
+        return b;
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getInitializeBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine(accessor + " = " + getCppTypename() + "(std::vector<int>({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}), " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ");");
+        return b;
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getWriteInitialTypeBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine("w.writeOpenCVMat({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");");
+        return b;
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = 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 + ".dims; ++" + accessor_iterator + ")");
+        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
+        b2->addLine(accessor_dimensions + ".push_back(" + accessor + ".size[" + accessor_iterator + "]);");
+        b->appendBlock(b2);
+        b->addLine("w.writeOpenCVMat(" + accessor_dimensions + ", std::to_string(" + accessor + ".type()));");
+        return b;
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getWriteBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = 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 + ".dims; ++" + accessor_iterator + ")");
+        CppBlockPtr b2 = CppBlockPtr(new CppBlock());
+        b2->addLine(accessor_dimensions + ".push_back(" + accessor + ".size[" + accessor_iterator + "]);");
+        b->appendBlock(b2);
+        b->addLine(accessor_dimensions + ".push_back(" + accessor + ".elemSize());");
+        b->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + ".type()), reinterpret_cast<const unsigned char*>(" + accessor + ".data));");
+        return b;
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getReadBlock(const std::string& accessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        std::string escaped_accessor = EscapeAccessor(accessor);
+        std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR;
+        std::string accessor_type = escaped_accessor + TYPE_ACCESSOR;
+
+        b->addLine("const auto [" + accessor_dimensions + ", " + accessor_type + "] = r.readStartNDArray();");
+        b->addLine(accessor + " = " + getCppTypename() + "(std::vector<int>({" + accessor_dimensions + ".begin(), std::prev(" + accessor_dimensions + ".end())}), std::stoi(" + accessor_type + "));");
+        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".data));");
+        return b;
+    }
+
+    CppBlockPtr OpenCVMatSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine("if (cv::countNonZero(" + accessor + " != " + otherInstanceAccessor + ") != 0)");
+        b->addLine("\t return false;");
+        return b;
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h
index fcd719c9e218393c27845a527cdce8fcb2922a70..dff7118e2e4dad0cdc46267e4a927f7d53435eac 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h
@@ -64,9 +64,9 @@ namespace armarx::aron::cppcodegenerator::serializer
     private:
         // members
         static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES;
-        static const std::string OPENCVMAT_ITERATOR_ACCESSOR;
-        static const std::string OPENCVMAT_DIMENSIONS_ACCESSOR;
-        static const std::string OPENCVMAT_DIFF_ACCESSOR;
+        static constexpr const char* ITERATOR_ACCESSOR = "_iterator";
+        static constexpr const char* DIMENSION_ACCESSOR = "_dimensions";
+        static constexpr const char* TYPE_ACCESSOR = "_type";
 
         typenavigator::OpenCVMatNavigatorPtr typenavigator;
     };
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 0f52f2e3078981277aa20bd7f9f85039ff4faeda..b9f97778607242dffd0203160f7c28c343613846 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,7 +28,7 @@ namespace armarx::aron::cppcodegenerator::serializer
 {
     // constructors
     OrientationSerializer::OrientationSerializer(const typenavigator::OrientationNavigatorPtr& n) :
-        Serializer("std::shared_ptr<Eigen::Quaternionf>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronOrientation))),
+        Serializer("Eigen::Quaternion<" + n->getTypename() + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronOrientation))),
         typenavigator(n)
     {
     }
@@ -53,54 +53,56 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr OrientationSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Quaternionf(" + accessor + "->width, " + accessor + "->height));");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
     CppBlockPtr OrientationSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Quaternionf());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
     CppBlockPtr OrientationSerializer::getWriteInitialTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeOrientationType({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writeOrientation();");
         return b;
     }
 
-    CppBlockPtr OrientationSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
+    CppBlockPtr OrientationSerializer::getWriteCurrentTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeOrientationType({" + accessor + "->width, " + accessor + "->height}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writeOrientation();");
         return b;
     }
 
     CppBlockPtr OrientationSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".coeffs().data()));");
         return b;
     }
 
     CppBlockPtr OrientationSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("const auto [dims, _] = r.readStartNDArray();");
-        b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Quaternionf());");
-        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        std::string escaped_accessor = EscapeAccessor(accessor);
+        std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR;
+        std::string accessor_type = escaped_accessor + TYPE_ACCESSOR;
+
+        b->addLine("const auto [" + accessor_dimensions + ", " + accessor_type + "] = r.readStartNDArray();");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
+        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".coeffs().data()));");
         return b;
     }
 
     CppBlockPtr OrientationSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        //b->addLine("if (" + accessor + "->width != " + otherInstanceAccessor + "->width || " + accessor + "->height != " + otherInstanceAccessor + "->height)");
+        b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))");
         b->addLine("\t return false;");
-        //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)");
-        //b->addLine("\t return false;");
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h
index a2aebf0fc9340021b2c34a8263b46e74e3746328..248a1a6da3f4a93da04e362640bdb0fa5feedd8e 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h
@@ -61,6 +61,9 @@ namespace armarx::aron::cppcodegenerator::serializer
         virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
     private:
+        static constexpr const char* DIMENSION_ACCESSOR = "_dimensions";
+        static constexpr const char* TYPE_ACCESSOR = "_type";
+
         typenavigator::OrientationNavigatorPtr typenavigator;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp
index db9ac1e7e72d43f5fcf68f72e92a573c21380d14..cdf469274f87af9bff64544793dca566b76891f5 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,7 +41,7 @@ namespace armarx::aron::cppcodegenerator::serializer
 
     // constructors
     PCLPointCloudSerializer::PCLPointCloudSerializer(const typenavigator::PCLPointCloudNavigatorPtr& n) :
-        Serializer("std::shared_ptr<pcl::PointCloud<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPCLPointCloud))),
+        Serializer("pcl::PointCloud<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPCLPointCloud))),
         typenavigator(n)
     {
     }
@@ -66,51 +66,55 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PCLPointCloudSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new pcl::PointCloud<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">(" + accessor + "->width, " + accessor + "->height));");
+        b->addLine(accessor + " = " + getCppTypename() + "(" + accessor + ".width, " + accessor + ".height);");
         return b;
     }
 
     CppBlockPtr PCLPointCloudSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new pcl::PointCloud<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + "));");
+        b->addLine(accessor + " = " + getCppTypename() + "(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ");");
         return b;
     }
 
     CppBlockPtr PCLPointCloudSerializer::getWriteInitialTypeBlock(const std::string&) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writePCLPointCloudType({" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + "}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writePCLPointCloud(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ", \"" + typenavigator->getTypename() + "\");");
         return b;
     }
 
     CppBlockPtr PCLPointCloudSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writePCLPointCloudType({" + accessor + "->width, " + accessor + "->height}, \"" + typenavigator->getTypename() + "\");");
+        b->addLine("w.writePCLPointCloud(" + accessor + ".width, " + accessor + ".height, \"" + typenavigator->getTypename() + "\");");
         return b;
     }
 
     CppBlockPtr PCLPointCloudSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeNDArray({" + accessor + "->width, " + accessor + "->height, " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->points.data()));");
+        b->addLine("w.writeNDArray({" + accessor + ".width, " + accessor + ".height, " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".points.data()));");
         return b;
     }
 
     CppBlockPtr PCLPointCloudSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("const auto [dims, _] = r.readStartNDArray();");
-        b->addLine(accessor + " = " + getCppTypename() + "(new pcl::PointCloud<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">(dims[0], dims[1]));");
-        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->points.data()));");
+        std::string escaped_accessor = EscapeAccessor(accessor);
+        std::string dims_accessor = escaped_accessor + DIMENSION_ACCESSOR;
+        std::string type_accessor = escaped_accessor + TYPE_ACCESSOR;
+
+        b->addLine("const auto [" + dims_accessor + ", " + type_accessor + "] = r.readStartNDArray();");
+        b->addLine(accessor + " = " + getCppTypename() + "(" + dims_accessor + "[0], " + dims_accessor + "[1]);");
+        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".points.data()));");
         return b;
     }
 
     CppBlockPtr PCLPointCloudSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (" + accessor + "->width != " + otherInstanceAccessor + "->width || " + accessor + "->height != " + otherInstanceAccessor + "->height)");
+        b->addLine("if (" + accessor + ".width != " + otherInstanceAccessor + ".width || " + accessor + ".height != " + otherInstanceAccessor + ".height)");
         b->addLine("\t return false;");
         //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)");
         //b->addLine("\t return false;");
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 4405348096d5f6e3ab774e8c9bfc1204cd22fc3a..101ee2ee61047673fed94964f2d41da297d0c263 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
@@ -63,6 +63,8 @@ namespace armarx::aron::cppcodegenerator::serializer
     private:
         // members
         static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES;
+        static constexpr const char* DIMENSION_ACCESSOR = "_dimensions";
+        static constexpr const char* TYPE_ACCESSOR = "_type";
 
         typenavigator::PCLPointCloudNavigatorPtr typenavigator;
     };
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp
index e517806944548ecc0baa5ec798efabd068bc84d3..382e5853c0993997c663e80330a22fc4a085afa2 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,7 +28,7 @@ namespace armarx::aron::cppcodegenerator::serializer
 {
     // constructors
     PoseSerializer::PoseSerializer(const typenavigator::PoseNavigatorPtr& n) :
-        Serializer("std::shared_ptr<Eigen::Matrix4f>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPose))),
+        Serializer("Eigen::Matrix<" + n->getTypename() + ", " + simox::alg::to_string(n->getDimensions(), ", ") + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPose))),
         typenavigator(n)
     {
     }
@@ -53,14 +53,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PoseSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new std::shared_ptr<Eigen::Matrix4f>());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
     CppBlockPtr PoseSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new std::shared_ptr<Eigen::Matrix4f>());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
@@ -81,26 +81,28 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PoseSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".data()));");
         return b;
     }
 
     CppBlockPtr PoseSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("const auto [dims, _] = r.readStartNDArray();");
-        b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Matrix4f());");
-        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->points.data()));");
+        std::string escaped_accessor = EscapeAccessor(accessor);
+        std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR;
+        std::string accessor_type = escaped_accessor + TYPE_ACCESSOR;
+
+        b->addLine("const auto [" + accessor_dimensions + ", " + accessor_type + "] = r.readStartNDArray();");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
+        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".data()));");
         return b;
     }
 
     CppBlockPtr PoseSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("if (" + accessor + "->width != " + otherInstanceAccessor + "->width || " + accessor + "->height != " + otherInstanceAccessor + "->height)");
+        b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))");
         b->addLine("\t return false;");
-        //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)");
-        //b->addLine("\t return false;");
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h
index f58bdff1ae565e95cb4074a1cc8ef5c6a3e8c38f..567b4f1ef970f2084c7b032074808438d3d27e5d 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h
@@ -61,6 +61,9 @@ namespace armarx::aron::cppcodegenerator::serializer
         virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
     private:
+        static constexpr const char* DIMENSION_ACCESSOR = "_dimensions";
+        static constexpr const char* TYPE_ACCESSOR = "_type";
+
         typenavigator::PoseNavigatorPtr typenavigator;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp
index 9a72117ecc4eb01107ea1055f9f3b6c3a06ac4a7..e1aa51fcfe4d98a07dab2022910b366fa27f98f0 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,7 +28,7 @@ namespace armarx::aron::cppcodegenerator::serializer
 {
     // constructors
     PositionSerializer::PositionSerializer(const typenavigator::PositionNavigatorPtr& n) :
-        Serializer("std::shared_ptr<Eigen::Vector3f>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPosition))),
+        Serializer("Eigen::Matrix<" + n->getTypename() + ", " + simox::alg::to_string(n->getDimensions(), ", ") + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPosition))),
         typenavigator(n)
     {
     }
@@ -53,14 +53,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PositionSerializer::getResetBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Vector3f());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
     CppBlockPtr PositionSerializer::getInitializeBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Vector3f());");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
         return b;
     }
 
@@ -81,26 +81,28 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr PositionSerializer::getWriteBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".data()));");
         return b;
     }
 
     CppBlockPtr PositionSerializer::getReadBlock(const std::string& accessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        b->addLine("const auto [dims, _] = r.readStartNDArray();");
-        b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Vector3f());");
-        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));");
+        std::string escaped_accessor = EscapeAccessor(accessor);
+        std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR;
+        std::string accessor_type = escaped_accessor + TYPE_ACCESSOR;
+
+        b->addLine("const auto [" + accessor_dimensions + ", " + accessor_type + "] = r.readStartNDArray();");
+        b->addLine(accessor + " = " + getCppTypename() + "();");
+        b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".data()));");
         return b;
     }
 
     CppBlockPtr PositionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const
     {
         CppBlockPtr b = CppBlockPtr(new CppBlock());
-        //b->addLine("if (" + accessor + "->width != " + otherInstanceAccessor + "->width || " + accessor + "->height != " + otherInstanceAccessor + "->height)");
+        b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))");
         b->addLine("\t return false;");
-        //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)");
-        //b->addLine("\t return false;");
         return b;
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h
index 9de67dd0ca1a927bd35281485ab820d92018659f..94b9317e0921c8d1e9c1985eb0060d6427ddfeaa 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h
@@ -61,6 +61,9 @@ namespace armarx::aron::cppcodegenerator::serializer
         virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override;
 
     private:
+        static constexpr const char* DIMENSION_ACCESSOR = "_dimensions";
+        static constexpr const char* TYPE_ACCESSOR = "_type";
+
         typenavigator::PositionNavigatorPtr typenavigator;
     };
 }
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 7d2001905d466feaeca9d3134eb1850b7b0775ad..abf316efd231a753ceb49986bce6aa5c1531a38d 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
@@ -30,12 +30,23 @@
 #include "Primitive.h"
 
 namespace armarx::aron::cppcodegenerator::serializer
-                {
+{
 
+    namespace
+    {
+        std::string convertStdString(const std::string& s)
+        {
+            if(s == "string")
+            {
+                return "std::string";
+            }
+            return s;
+        }
+    }
 #define RUN_ARON_MACRO(upperType, lowerType, capsType, upperData, lowerData, capsData) \
     /* constructors */ \
     upperType##Serializer::upperType##Serializer(const typenavigator::upperType##NavigatorPtr& e) : \
-        Serializer(simox::meta::get_type_name(typeid(lowerData)), simox::meta::get_type_name(typeid(data::Aron##upperData)), simox::meta::get_type_name(typeid(type::Aron##upperType))), \
+        Serializer(convertStdString(#lowerData), simox::meta::get_type_name(typeid(data::Aron##upperData)), simox::meta::get_type_name(typeid(type::Aron##upperType))), \
         typenavigator(e) \
     { \
         \
@@ -76,14 +87,14 @@ namespace armarx::aron::cppcodegenerator::serializer
     CppBlockPtr upperType##Serializer::getWriteInitialTypeBlock(const std::string&) const \
     { \
         CppBlockPtr b = CppBlockPtr(new CppBlock()); \
-        b->addLine("w.write" + std::string(#upperType) + "Type();"); \
+        b->addLine("w.write" + std::string(#upperType) + "();"); \
         return b; \
     } \
     \
     CppBlockPtr upperType##Serializer::getWriteCurrentTypeBlock(const std::string&) const \
     { \
         CppBlockPtr b = CppBlockPtr(new CppBlock()); \
-        b->addLine("w.write" + std::string(#upperType) + "Type();"); \
+        b->addLine("w.write" + std::string(#upperType) + "();"); \
         return b; \
     } \
     \
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
new file mode 100644
index 0000000000000000000000000000000000000000..20d453e18ad146c2bb7c3c8f1a05f4961232978e
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
@@ -0,0 +1,120 @@
+/*
+ * 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
+ */
+
+// Header
+#include "IntEnumClass.h"
+
+namespace armarx::aron::cppcodegenerator::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))),
+        navigator(n)
+    {
+    }
+
+    std::vector<CppFieldPtr> IntEnumClassSerializer::getPublicVariableDeclarations(const std::string&) const
+    {
+        std::vector<CppFieldPtr> fields;
+        std::stringstream val_to_name;
+        std::stringstream name_to_val;
+        val_to_name << "{" << std::endl;
+        name_to_val << "{" << std::endl;
+        for (const auto& [key, value] : navigator->getAcceptedValues())
+        {
+            fields.push_back(std::make_shared<CppField>("static const int", key, std::to_string(value)));
+            val_to_name << "\t\t{" << key << ", \"" << key << "\"}," << std::endl;
+            name_to_val << "\t\t{\"" << key << "\", " << key << "}," << std::endl;
+        }
+        val_to_name << "\t}";
+        name_to_val << "\t}";
+
+        fields.push_back(std::make_shared<CppField>("const std::map<int, std::string>", "ToStringMap", val_to_name.str()));
+        fields.push_back(std::make_shared<CppField>("const std::map<std::string, int>", "FromStringMap", name_to_val.str()));
+
+        fields.push_back(std::make_shared<CppField>("int", "value", "-1"));
+
+        return fields;
+    }
+
+    std::vector<std::pair<std::string, std::string>> IntEnumClassSerializer::getCtorInitializers(const std::string&) const
+    {
+        return {};
+    }
+
+    CppBlockPtr IntEnumClassSerializer::getCtorBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        return b;
+    }
+
+    CppBlockPtr IntEnumClassSerializer::getResetBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+
+        return b;
+    }
+
+    CppBlockPtr IntEnumClassSerializer::getWriteInitialTypeBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+
+        return b;
+    }
+
+    CppBlockPtr IntEnumClassSerializer::getWriteCurrentTypeBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+
+        return b;
+    }
+
+    CppBlockPtr IntEnumClassSerializer::getInitializeBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine("value = -1;");
+        return b;
+    }
+
+    CppBlockPtr IntEnumClassSerializer::getWriteBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine("w.writePrimitive(value);");
+        return b;
+    }
+
+    CppBlockPtr IntEnumClassSerializer::getReadBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine("r.readPrimitive(value);");
+        return b;
+    }
+
+    CppBlockPtr IntEnumClassSerializer::getEqualsBlock(const std::string&, const std::string& otherInstanceAccessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        b->addLine("if (not (value == " + otherInstanceAccessor + ".value))");
+        b->addLine("\t return false;");
+        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
new file mode 100644
index 0000000000000000000000000000000000000000..a2d2ad463f73b98354cf4bc231511df26bc0a750
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
@@ -0,0 +1,70 @@
+/*
+ * 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
+ */
+
+#pragma once
+
+// STD/STL
+#include <string>
+#include <map>
+
+// Base Class
+#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h>
+
+// ArmarX
+#include <RobotAPI/libraries/aron/core/navigator/type/enum/IntEnum.h>
+
+namespace armarx::aron::cppcodegenerator::serializer
+{
+
+    class IntEnumClassSerializer;
+    typedef std::shared_ptr<IntEnumClassSerializer> IntEnumClassSerializerPtr;
+
+    class IntEnumClassSerializer :
+        virtual public Serializer
+    {
+    public:
+        using PointerType = IntEnumClassSerializerPtr;
+
+    public:
+        // constructors
+        IntEnumClassSerializer(const typenavigator::IntEnumNavigatorPtr&);
+
+        // 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 getCtorBlock(const std::string&) const override;
+        virtual CppBlockPtr getWriteInitialTypeBlock(const std::string&) const override;
+        virtual CppBlockPtr getWriteCurrentTypeBlock(const std::string&) const override;
+        virtual CppBlockPtr getInitializeBlock(const std::string&) const override;
+        virtual CppBlockPtr getResetBlock(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;
+
+    private:
+        // Members
+        static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES;
+
+        typenavigator::IntEnumNavigatorPtr navigator;
+    };
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..dc1c52a4e7b9963cb33013f36f65869e47c7199b
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp
@@ -0,0 +1,199 @@
+/*
+ * 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
+ */
+
+// Header
+#include "ObjectClass.h"
+
+
+namespace armarx::aron::cppcodegenerator::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))),
+        navigator(e)
+    {
+        //AddObjectTypeToAllObjectTypesList(ObjectNavigatorPtr(this));
+    }
+
+    std::vector<CppFieldPtr> ObjectClassSerializer::getPublicVariableDeclarations(const std::string&) const
+    {
+        std::vector<CppFieldPtr> fields;
+        for (const auto& [key, member] : navigator->getMemberTypes())
+        {
+            auto member_s = FromAronTypeNaviagtorPtr(member);
+            std::vector<CppFieldPtr> member_fields = member_s->getPublicVariableDeclarations(key);
+            fields.insert(fields.end(), member_fields.begin(), member_fields.end());
+        }
+        return fields;
+    }
+
+    std::vector<std::pair<std::string, std::string>> ObjectClassSerializer::getCtorInitializers(const std::string&) const
+    {
+        return {};
+    }
+
+    CppBlockPtr ObjectClassSerializer::getCtorBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        return b;
+    }
+
+    CppBlockPtr ObjectClassSerializer::getResetBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (navigator->getExtends() != nullptr)
+        {
+            const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
+            b->addLine(extends_s->getCppTypename() + "::reset();");
+        }
+
+        for (const auto& [key, child] : navigator->getMemberTypes())
+        {
+            auto child_s = FromAronTypeNaviagtorPtr(child);
+            CppBlockPtr b2 = child_s->getResetBlock(key);
+            b->appendBlock(b2);
+        }
+        return b;
+    }
+
+    CppBlockPtr ObjectClassSerializer::getInitializeBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (navigator->getExtends() != nullptr)
+        {
+            const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
+            b->addLine(extends_s->getCppTypename() + "::initialize();");
+        }
+
+        for (const auto& [key, child] : navigator->getMemberTypes())
+        {
+            const auto child_s = FromAronTypeNaviagtorPtr(child);
+            CppBlockPtr b2 = child_s->getInitializeBlock(key);
+            b->appendBlock(b2);
+        }
+        return b;
+    }
+
+    CppBlockPtr ObjectClassSerializer::getWriteInitialTypeBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (navigator->getExtends() != nullptr)
+        {
+            const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
+            b->addLine(extends_s->getCppTypename() + "::writeInitialType(w);");
+        }
+
+        b->addLine("w.writeStartObject(\"" + navigator->getObjectName() + "\");");
+        for (const auto& [key, child] : navigator->getMemberTypes())
+        {
+            const auto child_s = FromAronTypeNaviagtorPtr(child);
+            b->addLine("w.writeKey(\"" + key + "\");");
+            CppBlockPtr b2 = child_s->getWriteInitialTypeBlock(child_s->getCppTypename());
+            b->appendBlock(b2);
+        }
+        b->addLine("w.writeEndObject();");
+        return b;
+    }
+
+    CppBlockPtr ObjectClassSerializer::getWriteCurrentTypeBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (navigator->getExtends() != nullptr)
+        {
+            const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
+            b->addLine(extends_s->getCppTypename() + "::writeCurrentType(w);");
+        }
+
+        b->addLine("w.writeStartObject(\"" + navigator->getObjectName() + "\");");
+        for (const auto& [key, child] : navigator->getMemberTypes())
+        {
+            const auto child_s = FromAronTypeNaviagtorPtr(child);
+            b->addLine("w.writeKey(\"" + key + "\");");
+            CppBlockPtr b2 = child_s->getWriteCurrentTypeBlock(key);
+            b->appendBlock(b2);
+        }
+        b->addLine("w.writeEndObject();");
+        return b;
+    }
+
+    CppBlockPtr ObjectClassSerializer::getWriteBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (navigator->getExtends() != nullptr)
+        {
+            const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
+            b->addLine(extends_s->getCppTypename() + "::write(w, aron_type);");
+        }
+
+        b->addLine("w.writeStartDict();");
+        for (const auto& [key, child] : navigator->getMemberTypes())
+        {
+            const auto child_s = FromAronTypeNaviagtorPtr(child);
+            b->addLine("w.writeKey(\"" + key + "\");");
+            CppBlockPtr b2 = child_s->getWriteBlock(key);
+            b->appendBlock(b2);
+        }
+        b->addLine("w.writeEndDict();");
+        return b;
+    }
+
+    CppBlockPtr ObjectClassSerializer::getReadBlock(const std::string&) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (navigator->getExtends() != nullptr)
+        {
+            const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
+            b->addLine(extends_s->getCppTypename() + "::read(r);");
+        }
+
+        b->addLine("r.readStartDict();");
+        for (const auto& [key, child] : navigator->getMemberTypes())
+        {
+            const auto child_s = FromAronTypeNaviagtorPtr(child);
+            b->addLine("r.loadMember(\"" + key + "\");");
+            CppBlockPtr b2 = child_s->getReadBlock(key);
+            b->appendBlock(b2);
+        }
+        b->addLine("r.readEndDict();");
+        return b;
+    }
+
+    CppBlockPtr ObjectClassSerializer::getEqualsBlock(const std::string&, const std::string& otherInstanceAccessor) const
+    {
+        CppBlockPtr b = CppBlockPtr(new CppBlock());
+        if (navigator->getExtends() != nullptr)
+        {
+            const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends());
+            b->addLine("if (not (" + extends_s->getCppTypename() + "::operator== (" + otherInstanceAccessor + ")))");
+            b->addLine("\t return false;");
+        }
+        for (const auto& [key, child] : navigator->getMemberTypes())
+        {
+            auto child_s = FromAronTypeNaviagtorPtr(child);
+            CppBlockPtr b2 = child_s->getEqualsBlock(key, otherInstanceAccessor + "." + key);
+            b->appendBlock(b2);
+        }
+        return b;
+    }
+}
+
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h
new file mode 100644
index 0000000000000000000000000000000000000000..7b996cb7625ab2968d515cb0db05060a85e0ce60
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h
@@ -0,0 +1,71 @@
+/*
+ * 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
+ */
+
+#pragma once
+
+// STD/STL
+#include <string>
+#include <map>
+
+// Base Class
+#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h>
+
+// ArmarX
+#include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h>
+
+
+namespace armarx::aron::cppcodegenerator::serializer
+{
+
+    class ObjectClassSerializer;
+    typedef std::shared_ptr<ObjectClassSerializer> ObjectClassSerializerPtr;
+
+    class ObjectClassSerializer :
+        virtual public Serializer
+    {
+    public:
+        using PointerType = ObjectClassSerializerPtr;
+
+    public:
+        // constructors
+        ObjectClassSerializer(const typenavigator::ObjectNavigatorPtr&);
+
+        // 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 getCtorBlock(const std::string&) const override;
+        virtual CppBlockPtr getWriteInitialTypeBlock(const std::string&) const override;
+        virtual CppBlockPtr getWriteCurrentTypeBlock(const std::string&) const override;
+        virtual CppBlockPtr getInitializeBlock(const std::string&) const override;
+        virtual CppBlockPtr getResetBlock(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;
+
+    private:
+        // members
+        static constexpr const char* EXTENDS_ITERATOR_ACCESSOR = "_extends";
+
+        typenavigator::ObjectNavigatorPtr navigator;
+    };
+}
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/Reader.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/Reader.h
index 0cdc95710df5a6efaad982591d4a0ef70cdd2c60..c65d64893b4ecc86f2c5b97a7bc7be5cdbb18ff0 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/Reader.h
@@ -66,9 +66,13 @@ namespace armarx::aron::typereader
         {
             return readers;
         }
-        std::vector<codegeneratorhelper::GenerateTypeInfoPtr> getGenerateTypes() const
+        std::vector<codegeneratorhelper::GenerateObjectInfoPtr> getGenerateObjects() const
         {
-            return generateTypes;
+            return generateObjects;
+        }
+        std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr> getGenerateIntEnums() const
+        {
+            return generateIntEnums;
         }
 
     protected:
@@ -78,6 +82,7 @@ namespace armarx::aron::typereader
         std::vector<std::string> aronIncludes;
         std::vector<codegeneratorhelper::ReaderInfoPtr> readers;
         std::vector<codegeneratorhelper::WriterInfoPtr> writers;
-        std::vector<codegeneratorhelper::GenerateTypeInfoPtr> generateTypes;
+        std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr> generateIntEnums;
+        std::vector<codegeneratorhelper::GenerateObjectInfoPtr> generateObjects;
     };
 }
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 85658becf94b453963859b25a6e180838dd7b980..2f152c9e4d1d2925d8a0c5848f9529458b666604 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h
@@ -54,15 +54,16 @@ namespace armarx::aron::xmltypereader
         static constexpr const char* GENERATE_TYPES_TAG = "generatetypes";
 
         static constexpr const char* INCLUDE_TAG = "include";
-        static constexpr const char* GENERATE_TYPE_TAG = "generatetype";
+        static constexpr const char* GENERATE_OBJECT_TAG = "object";
+        static constexpr const char* GENERATE_INT_ENUM_TAG = "intenum";
 
         // Attribute names
-        static constexpr const char* METHOD_ATTRIBUTE_NAME = "include";
-        static constexpr const char* RETURN_ATTRIBUTE_NAME = "method";
-        static constexpr const char* ARGUMENT_TYPE_ATTRIBUTE_NAME = "return";
-        static constexpr const char* INCLUDE_ATTRIBUTE_NAME = "argumenttype";
-        static constexpr const char* READER_ATTRIBUTE_NAME = "writer";
-        static constexpr const char* WRITER_ATTRIBUTE_NAME = "reader";
+        static constexpr const char* METHOD_ATTRIBUTE_NAME = "method";
+        static constexpr const char* RETURN_ATTRIBUTE_NAME = "return";
+        static constexpr const char* ARGUMENT_TYPE_ATTRIBUTE_NAME = "argumenttype";
+        static constexpr const char* INCLUDE_ATTRIBUTE_NAME = "include";
+        static constexpr const char* READER_ATTRIBUTE_NAME = "reader";
+        static constexpr const char* WRITER_ATTRIBUTE_NAME = "writer";
         static constexpr const char* EXTENDS_ATTRIBUTE_NAME = "extends";
         static constexpr const char* NAME_ATTRIBUTE_NAME = "name";
         static constexpr const char* VALUE_ATTRIBUTE_NAME = "value";
@@ -79,11 +80,11 @@ namespace armarx::aron::xmltypereader
         static constexpr const char* ENUM_VALUE_TAG = "enumvalue";
 
         // Top Level type tags
-    #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    static constexpr const char* GENERATE_##capsType##_TAG = #lowerType;
+#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
+    static constexpr const char* GENERATE_##capsType##_MEMBER_TAG = #lowerType;
 
         HANDLE_ALL_ARON_TYPES
-    #undef RUN_ARON_MACRO
+#undef RUN_ARON_MACRO
 
         static void EnforceAttribute(const RapidXmlReaderNode& node, const std::string& att)
         {
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 812e261fa892eab843cf52eff7201205c56fee1a..6bf00c8db81a9bd61b579d760b6b250f47544537 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp
@@ -131,9 +131,22 @@ namespace armarx::aron::xmltypereader
                         for (const auto& generateType : children[generate_types_index].nodes())
                         {
                             // ugly workaround
-                            const typenavigator::ObjectNavigatorPtr aronObj = readGenerateType(generateType);
-                            const std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> generatedObjects = factory.GetAllKnownGeneratedPublicObjects();
-                            generateTypes.push_back(generatedObjects.at(aronObj->getObjectName()));
+                            if(Data::HasTagName(generateType, Data::GENERATE_OBJECT_TAG))
+                            {
+                                const auto nav = readGenerateObject(generateType);
+                                const auto infos = factory.AllPublicObjects;
+                                generateObjects.push_back(infos.at(simox::alg::to_lower(nav->getObjectName())));
+                                continue;
+                            }
+                            if(Data::HasTagName(generateType, Data::GENERATE_INT_ENUM_TAG))
+                            {
+                                const auto nav = readGenerateIntEnum(generateType);
+                                const auto infos = factory.AllPublicIntEnums;
+                                generateIntEnums.push_back(infos.at(simox::alg::to_lower(nav->getEnumName())));
+                                continue;
+                            }
+                            throw error::StringNotValidException("XMLReader", "parse", "Could not find a valid tag inside generatetypes", generateType.name());
+
                         }
                     }
                 }
@@ -159,10 +172,17 @@ namespace armarx::aron::xmltypereader
                     return xmlinclude;
                 }
 
-                typenavigator::ObjectNavigatorPtr Reader::readGenerateType(const RapidXmlReaderNode& node) const
+                typenavigator::ObjectNavigatorPtr Reader::readGenerateObject(const RapidXmlReaderNode& node) const
+                {
+                    Data::EnforceTagName(node, Data::GENERATE_OBJECT_TAG);
+                    return typenavigator::ObjectNavigator::DynamicCastAndCheck(factory.create(node, Path()));
+
+                }
+
+                typenavigator::IntEnumNavigatorPtr Reader::readGenerateIntEnum(const RapidXmlReaderNode& node) const
                 {
-                    Data::EnforceTagName(node, Data::GENERATE_TYPE_TAG);
-                    return typenavigator::ObjectNavigator::DynamicCast(factory.createSpecific(node, Path()));
+                    Data::EnforceTagName(node, Data::GENERATE_INT_ENUM_TAG);
+                    return typenavigator::IntEnumNavigator::DynamicCastAndCheck(factory.create(node, Path()));
 
                 }
 }
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 6decba395d2fdfc9e35c1d7fd6cd7d5638e0d4ba..0801465160e06ddbd0ebfc78b57d8b8bb97eafcd 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h
@@ -57,9 +57,10 @@ namespace armarx::aron::xmltypereader
         std::string readCppInclude(const RapidXmlReaderNode& node) const;
         std::string readAronInclude(const RapidXmlReaderNode& node) const;
 
-        typenavigator::ObjectNavigatorPtr readGenerateType(const RapidXmlReaderNode& node) const;
+        typenavigator::ObjectNavigatorPtr readGenerateObject(const RapidXmlReaderNode& node) const;
+        typenavigator::IntEnumNavigatorPtr readGenerateIntEnum(const RapidXmlReaderNode& node) const;
 
     private:
-        ObjectReaderFactory factory;
+        ReaderFactory factory;
     };
 }
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 dbb245ad18601a3b5a6729cc4b86ac611e154454..da9eff9f25c9ee9478d7c183ae4fde981e21a16f 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp
@@ -34,354 +34,381 @@
 #include <RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h>
 
 namespace armarx::aron::xmltypereader
-            {
-                std::stack<codegeneratorhelper::GenerateTypeInfoPtr> ReaderFactory::TheObjectWeAreGoingToGenerateNowStack = {};
-                std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> ReaderFactory::AllKnownGeneratedPublicObjects = {};
+{
+    std::stack<codegeneratorhelper::GenerateObjectInfoPtr> ReaderFactory::ObjectGenerationStack = {};
+    std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr> ReaderFactory::AllPublicObjects = {};
+    std::map<std::string, codegeneratorhelper::GenerateIntEnumInfoPtr> ReaderFactory::AllPublicIntEnums = {};
 
 
-                typenavigator::NavigatorPtr ReaderFactory::create(const RapidXmlReaderNode& node, const Path& path) const
-                {
+    typenavigator::NavigatorPtr ReaderFactory::create(const RapidXmlReaderNode& node, const Path& path) const
+    {
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    {Data::GENERATE_##capsType##_TAG, ReaderFactoryPtr(new upperType##ReaderFactory())},
-                    static const std::map<std::string, ReaderFactoryPtr> Factories =
-                    {
-                        HANDLE_ALL_ARON_TYPES
-                    };
+    {Data::GENERATE_##capsType##_MEMBER_TAG, ReaderFactoryPtr(new upperType##ReaderFactory())},
+        static const std::map<std::string, ReaderFactoryPtr> Factories =
+        {
+            {Data::GENERATE_OBJECT_TAG, ReaderFactoryPtr(new ObjectReaderFactory())},
+            {Data::GENERATE_INT_ENUM_TAG, ReaderFactoryPtr(new IntEnumReaderFactory())},
+            HANDLE_ALL_ARON_TYPES
+        };
 #undef RUN_ARON_MACRO
 
-                    const std::string tag = simox::alg::to_lower(node.name());
-                    if (tag == "")
-                    {
-                        throw error::AronException("XMLReaderFactory", "create", "An node is empty. Cannot find facory for empty nodes.");
-                    }
-                    auto factory_iterator = Factories.find(tag);
-                    if (factory_iterator != Factories.end())
-                    {
-                        return factory_iterator->second->createSpecific(node, path);
-                    }
-
-                    // Search for known objects
-                    return ResolveTypename(tag);
-                }
-
-                std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> ReaderFactory::GetAllKnownGeneratedPublicObjects()
-                {
-                    return AllKnownGeneratedPublicObjects;
-                }
-
-                typenavigator::NavigatorPtr ReaderFactory::ResolveTypename(const std::string& name)
-                {
-                    const auto public_it = AllKnownGeneratedPublicObjects.find(name);
-                    if (public_it != AllKnownGeneratedPublicObjects.end())
-                    {
-                        return public_it->second->correspondingObjectType;
-                    }
-
-                    throw error::StringNotValidException("XMLReaderFactory", "ResolveTypename", "Could not find a tag. Please note that you cant make use of nested objects yet", name);
-                }
-
-                // Object type
-                typenavigator::NavigatorPtr ObjectReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceAttribute(node, Data::NAME_ATTRIBUTE_NAME);
-                    const std::string extends = Data::GetAttributeWithDefault(node, Data::EXTENDS_ATTRIBUTE_NAME, "");
-                    const std::string name = Data::GetAttribute(node, Data::NAME_ATTRIBUTE_NAME);
-
-                    bool object_is_nested = TheObjectWeAreGoingToGenerateNowStack.size() > 0;
-
-                    // set the new object
-                    typenavigator::ObjectNavigatorPtr aronObjectType = typenavigator::ObjectNavigatorPtr(new typenavigator::ObjectNavigator(path));
-                    if (object_is_nested)
-                    {
-                        if (name.rfind("::") != std::string::npos)
-                        {
-                            throw error::StringNotValidException("AronObjectTypeXMLReaderFactory", "createSpecific", "Namespaces are not allowed in nested classes", name);
-                        }
-                    }
-                    aronObjectType->setObjectName(name);
-
-                    codegeneratorhelper::GenerateTypeInfoPtr theObjectWeAreGoingToProduceNow = codegeneratorhelper::GenerateTypeInfoPtr(new codegeneratorhelper::GenerateTypeInfo());
-                    theObjectWeAreGoingToProduceNow->typeName = name;
-                    theObjectWeAreGoingToProduceNow->correspondingObjectType = aronObjectType;
-
-                    if (extends != "")
-                    {
-                        auto it = AllKnownGeneratedPublicObjects.find(extends);
-                        if (it != AllKnownGeneratedPublicObjects.end())
-                        {
-                            codegeneratorhelper::GenerateTypeInfoPtr prodObj = it->second;
-                            aronObjectType->setExtends(prodObj->correspondingObjectType);
-                        }
-                        else
-                        {
-                            throw error::StringNotValidException("AronObjectTypeXMLReaderFactory", "createSpecific", "An extends name could not be found. Perhaps you need to change the order of your types or you have to add another UseType", extends);
-                        }
-                    }
-
-                    TheObjectWeAreGoingToGenerateNowStack.push(theObjectWeAreGoingToProduceNow);
-                    for (const RapidXmlReaderNode& objectChild : node.nodes())
-                    {
-                        Data::EnforceTagName(objectChild, Data::OBJECT_CHILD_TAG);
-                        Data::EnforceChildSize(objectChild, 1);
-
-                        Data::EnforceAttribute(objectChild, Data::KEY_ATTRIBUTE_NAME);
-                        const std::string key = objectChild.attribute_value(Data::KEY_ATTRIBUTE_NAME);
-
-                        std::vector<RapidXmlReaderNode> children = objectChild.nodes();
-                        typenavigator::NavigatorPtr childNavigator = create(children[0], Path(path, key));
-                        aronObjectType->addMemberType(key, childNavigator);
-                    }
-
-                    // remove current item from stack
-                    TheObjectWeAreGoingToGenerateNowStack.pop();
-
-                    if (object_is_nested)
-                    {
-                        // We are in a local nested class since there is a parent class in stack
-                        codegeneratorhelper::GenerateTypeInfoPtr parent = TheObjectWeAreGoingToGenerateNowStack.top();
-                        parent->nestedObjects.insert(std::make_pair(theObjectWeAreGoingToProduceNow->typeName, theObjectWeAreGoingToProduceNow));
-                    }
-                    else
-                    {
-                        // We are a public top level class. Add to AllProducedPublicObjects
-                        AllKnownGeneratedPublicObjects.insert(std::make_pair(theObjectWeAreGoingToProduceNow->typeName, theObjectWeAreGoingToProduceNow));
-                    }
-
-                    return aronObjectType;
-                }
-
-                // List type (List)
-                typenavigator::NavigatorPtr ListReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_LIST_TAG);
-
-                    typenavigator::ListNavigatorPtr list(new typenavigator::ListNavigator(path));
-                    Data::EnforceChildSize(node, 1);
-                    std::vector<RapidXmlReaderNode> listTypeNodeChildren = node.nodes();
-                    const RapidXmlReaderNode typeNode = listTypeNodeChildren[0];
-                    typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type"));
-
-                    list->setAcceptedType(type);
-                    return list;
-                }
-
-                // List type (Dict)
-                typenavigator::NavigatorPtr DictReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_DICT_TAG);
-
-                    typenavigator::DictNavigatorPtr dict(new typenavigator::DictNavigator(path));
-                    Data::EnforceChildSize(node, 1);
-                    std::vector<RapidXmlReaderNode> dictTypeNodeChildren = node.nodes();
-                    const RapidXmlReaderNode typeNode = dictTypeNodeChildren[0];
-                    typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type"));
-                    dict->setAcceptedType(type);
-
-                    return dict;
-                }
-
-                // List type (Tuple)
-                typenavigator::NavigatorPtr TupleReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_TUPLE_TAG);
-                    std::vector<RapidXmlReaderNode> nodeChildren = node.nodes();
-
-                    if (nodeChildren.size() < 1)
-                    {
-                        throw error::AronException("AronTupleTypeXMLReaderFactory", "createSpecific", "A tuple must have at least one type. Found child nodes size: " + std::to_string(nodeChildren.size()));
-                    }
-
-                    typenavigator::TupleNavigatorPtr tuple(new typenavigator::TupleNavigator(path));
-                    unsigned int i = 0;
-                    for (const RapidXmlReaderNode& tupleTypeDeclarationNode : nodeChildren)
-                    {
-                        Data::EnforceChildSize(tupleTypeDeclarationNode, 1);
-
-                        std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes();
-                        const RapidXmlReaderNode typeNode = typeNodeChildren[0];
-
-                        typenavigator::NavigatorPtr type = create(typeNode, Path(path, "<" + std::to_string(i++) + ">"));
-                        tuple->addAcceptedType(type);
-                    }
-                    return tuple;
-                }
-
-                // List type (Pair)
-                typenavigator::NavigatorPtr PairReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_PAIR_TAG);
-                    std::vector<RapidXmlReaderNode> nodeChildren = node.nodes();
-
-                    if (nodeChildren.size() != 2)
-                    {
-                        throw error::AronException("AronPairTypeXMLReaderFactory", "createSpecific", "A pair must have two types. Found child nodes size: " + std::to_string(nodeChildren.size()));
-                    }
-
-                    typenavigator::PairNavigatorPtr pair(new typenavigator::PairNavigator(path));
-
-                    Data::EnforceChildSize(nodeChildren[0], 1);
-                    std::vector<RapidXmlReaderNode> type1NodeChildren = nodeChildren[0].nodes();
-                    const RapidXmlReaderNode type1Node = type1NodeChildren[0];
-
-                    typenavigator::NavigatorPtr type1 = create(type1Node, Path(path, std::to_string(0)));
-                    pair->setFirstAcceptedType(type1);
-
-                    Data::EnforceChildSize(nodeChildren[1], 1);
-                    std::vector<RapidXmlReaderNode> type2NodeChildren = nodeChildren[1].nodes();
-                    const RapidXmlReaderNode type2Node = type2NodeChildren[0];
-
-                    typenavigator::NavigatorPtr type2 = create(type2Node, Path(path, std::to_string(1)));
-                    pair->setSecondAcceptedType(type2);
-
-                    return pair;
-                }
-
-                // Complex type (IVTCByteImage)
-                typenavigator::NavigatorPtr IVTCByteImageReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_IVT_CBYTE_IMAGE_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));
-                    complex->setWidth(width);
-                    complex->setHeight(height);
-                    complex->setTypename(type);
-                    return complex;
-                }
-
-                // Complex type (EigenMatrix)
-                typenavigator::NavigatorPtr EigenMatrixReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_EIGEN_MATRIX_TAG);
-                    Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME);
-
-                    int rows = std::stoi(Data::GetAttributeWithDefault(node, Data::ROWS_ATTRIBUTE_NAME, "1"));
-                    int cols = std::stoi(Data::GetAttributeWithDefault(node, Data::COLS_ATTRIBUTE_NAME, "1"));
-                    std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);
-
-                    typenavigator::EigenMatrixNavigatorPtr complex(new typenavigator::EigenMatrixNavigator(path));
-                    complex->setRows(rows);
-                    complex->setCols(cols);
-                    complex->setTypename(type);
-                    return complex;
-                }
-
-                // Complex type (EigenQuaternion)
-                typenavigator::NavigatorPtr EigenQuaternionReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_EIGEN_QUATERNION_TAG);
-                    Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME);
-
-                    std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);
-
-                    typenavigator::EigenQuaternionNavigatorPtr complex(new typenavigator::EigenQuaternionNavigator(path));
-                    complex->setTypename(type);
-                    return complex;
-                }
-
-                // Complex type (OpenCVMat)
-                typenavigator::NavigatorPtr OpenCVMatReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_OPENCV_MAT_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;
-                }
-
-                // Complex type (PCLPointCloud)
-                typenavigator::NavigatorPtr PCLPointCloudReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_PCL_POINTCLOUD_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;
-                }
-
-                // Complex type (Position)
-                typenavigator::NavigatorPtr PositionReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_POSITION_TAG);
-
-                    typenavigator::PositionNavigatorPtr complex(new typenavigator::PositionNavigator(path));
-                    return complex;
-                }
-
-                // Complex type (Orientation)
-                typenavigator::NavigatorPtr OrientationReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_ORIENTATION_TAG);
-
-                    typenavigator::OrientationNavigatorPtr complex(new typenavigator::OrientationNavigator(path));
-                    return complex;
-                }
-
-                // Complex type (Pose)
-                typenavigator::NavigatorPtr PoseReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_POSE_TAG);
-
-                    typenavigator::PoseNavigatorPtr complex(new typenavigator::PoseNavigator(path));
-                    return complex;
-                }
-
-
-
-                // Enum (IntEnum)
-                typenavigator::NavigatorPtr IntEnumReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
-                {
-                    Data::EnforceTagName(node, Data::GENERATE_INT_ENUM_TAG);
-                    Data::EnforceAttribute(node, Data::NAME_ATTRIBUTE_NAME);
-
-                    std::vector<RapidXmlReaderNode> nodeChildren = node.nodes();
-
-                    std::string name = node.attribute_value(Data::NAME_ATTRIBUTE_NAME);
-
-                    typenavigator::IntEnumNavigatorPtr complex(new typenavigator::IntEnumNavigator(path));
-                    complex->setEnumName(name);
+        const std::string tag = simox::alg::to_lower(node.name());
+        if (tag == "")
+        {
+            throw error::AronException("XMLReaderFactory", "create", "An node is empty. Cannot find facory for empty nodes.");
+        }
+        auto factory_iterator = Factories.find(tag);
+        if (factory_iterator != Factories.end())
+        {
+            return factory_iterator->second->createSpecific(node, path);
+        }
+
+        // Search for known objects
+        return ResolveTypename(tag);
+    }
+
+    typenavigator::NavigatorPtr ReaderFactory::createSpecific(const RapidXmlReaderNode&, const Path& p) const
+    {
+        throw error::AronException("ReaderFactory", "createSpecific", "Called disallowed method of an NavigatorFactory. Use child class instead!", p);
+    }
+
+    typenavigator::NavigatorPtr ReaderFactory::ResolveTypename(const std::string& name)
+    {
+        const auto public_intenum_it = AllPublicIntEnums.find(name);
+        if (public_intenum_it != AllPublicIntEnums.end())
+        {
+            return public_intenum_it->second->correspondingType;
+        }
+
+        const auto public_obj_it = AllPublicObjects.find(name);
+        if (public_obj_it != AllPublicObjects.end())
+        {
+            return public_obj_it->second->correspondingType;
+        }
+
+        throw error::StringNotValidException("XMLReaderFactory", "ResolveTypename", "Could not find a tag. You can only access already finished public objects.", name);
+    }
+
+    // Object type
+    typenavigator::NavigatorPtr ObjectReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceAttribute(node, Data::NAME_ATTRIBUTE_NAME);
+        const std::string extends = Data::GetAttributeWithDefault(node, Data::EXTENDS_ATTRIBUTE_NAME, "");
+        const std::string name = Data::GetAttribute(node, Data::NAME_ATTRIBUTE_NAME);
+
+        bool object_is_nested = ObjectGenerationStack.size() > 0;
+        if (object_is_nested)
+        {
+            if (name.rfind("::") != std::string::npos)
+            {
+                throw error::StringNotValidException("AronObjectTypeXMLReaderFactory", "createSpecific", "Namespaces are not allowed in nested classes", name, path);
+            }
+        }
+
+        // set the new object
+        auto aronObjectType = std::make_shared<typenavigator::ObjectNavigator>(path);
+        aronObjectType->setObjectName(name);
+
+        auto newObject = std::make_shared<codegeneratorhelper::GenerateObjectInfo>();
+        newObject->typeName = name;
+        newObject->correspondingType = aronObjectType;
+
+        if (extends != "")
+        {
+            auto it = AllPublicObjects.find(extends);
+            if (it == AllPublicObjects.end())
+            {
+                throw error::StringNotValidException("AronObjectTypeXMLReaderFactory", "createSpecific", "An extends name could not be found. Perhaps you need to change the order of your types or you have to add another UseType", extends, path);
+            }
+            codegeneratorhelper::GenerateObjectInfoPtr parentObj = it->second;
+            aronObjectType->setExtends(parentObj->correspondingType);
+        }
+
+        ObjectGenerationStack.push(newObject);
+        for (const RapidXmlReaderNode& objectChild : node.nodes())
+        {
+            Data::EnforceTagName(objectChild, Data::OBJECT_CHILD_TAG);
+            Data::EnforceChildSize(objectChild, 1);
+
+            Data::EnforceAttribute(objectChild, Data::KEY_ATTRIBUTE_NAME);
+            const std::string key = objectChild.attribute_value(Data::KEY_ATTRIBUTE_NAME);
+
+            std::vector<RapidXmlReaderNode> children = objectChild.nodes();
+            typenavigator::NavigatorPtr childNavigator = create(children[0], Path(path, key));
+            aronObjectType->addMemberType(key, childNavigator);
+        }
+        ObjectGenerationStack.pop();
+
+        if (object_is_nested)
+        {
+            // We are in a local nested class since there is a parent class in stack
+            codegeneratorhelper::GenerateObjectInfoPtr parent = ObjectGenerationStack.top();
+            parent->nestedObjects.insert(std::make_pair(simox::alg::to_lower(newObject->typeName), newObject));
+        }
+        else
+        {
+            // We are a public top level class. Add to AllPublicObjects
+            AllPublicObjects.insert(std::make_pair(simox::alg::to_lower(newObject->typeName), newObject));
+        }
+
+        return aronObjectType;
+    }
+
+    // List type (List)
+    typenavigator::NavigatorPtr ListReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_LIST_MEMBER_TAG);
+
+        typenavigator::ListNavigatorPtr list(new typenavigator::ListNavigator(path));
+        Data::EnforceChildSize(node, 1);
+        std::vector<RapidXmlReaderNode> listTypeNodeChildren = node.nodes();
+        const RapidXmlReaderNode typeNode = listTypeNodeChildren[0];
+        typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type"));
+
+        list->setAcceptedType(type);
+        return list;
+    }
+
+    // List type (Dict)
+    typenavigator::NavigatorPtr DictReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_DICT_MEMBER_TAG);
+
+        typenavigator::DictNavigatorPtr dict(new typenavigator::DictNavigator(path));
+        Data::EnforceChildSize(node, 1);
+        std::vector<RapidXmlReaderNode> dictTypeNodeChildren = node.nodes();
+        const RapidXmlReaderNode typeNode = dictTypeNodeChildren[0];
+        typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type"));
+        dict->setAcceptedType(type);
+
+        return dict;
+    }
+
+    // List type (Tuple)
+    typenavigator::NavigatorPtr TupleReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_TUPLE_MEMBER_TAG);
+        std::vector<RapidXmlReaderNode> nodeChildren = node.nodes();
+
+        if (nodeChildren.size() < 1)
+        {
+            throw error::AronException("AronTupleTypeXMLReaderFactory", "createSpecific", "A tuple must have at least one type. Found child nodes size: " + std::to_string(nodeChildren.size()));
+        }
+
+        typenavigator::TupleNavigatorPtr tuple(new typenavigator::TupleNavigator(path));
+        unsigned int i = 0;
+        for (const RapidXmlReaderNode& tupleTypeDeclarationNode : nodeChildren)
+        {
+            Data::EnforceChildSize(tupleTypeDeclarationNode, 1);
+
+            std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes();
+            const RapidXmlReaderNode typeNode = typeNodeChildren[0];
+
+            typenavigator::NavigatorPtr type = create(typeNode, Path(path, "<" + std::to_string(i++) + ">"));
+            tuple->addAcceptedType(type);
+        }
+        return tuple;
+    }
+
+    // List type (Pair)
+    typenavigator::NavigatorPtr PairReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_PAIR_MEMBER_TAG);
+        std::vector<RapidXmlReaderNode> nodeChildren = node.nodes();
+
+        if (nodeChildren.size() != 2)
+        {
+            throw error::AronException("AronPairTypeXMLReaderFactory", "createSpecific", "A pair must have two types. Found child nodes size: " + std::to_string(nodeChildren.size()));
+        }
+
+        typenavigator::PairNavigatorPtr pair(new typenavigator::PairNavigator(path));
+
+        Data::EnforceChildSize(nodeChildren[0], 1);
+        std::vector<RapidXmlReaderNode> type1NodeChildren = nodeChildren[0].nodes();
+        const RapidXmlReaderNode type1Node = type1NodeChildren[0];
+
+        typenavigator::NavigatorPtr type1 = create(type1Node, Path(path, std::to_string(0)));
+        pair->setFirstAcceptedType(type1);
+
+        Data::EnforceChildSize(nodeChildren[1], 1);
+        std::vector<RapidXmlReaderNode> type2NodeChildren = nodeChildren[1].nodes();
+        const RapidXmlReaderNode type2Node = type2NodeChildren[0];
+
+        typenavigator::NavigatorPtr type2 = create(type2Node, Path(path, std::to_string(1)));
+        pair->setSecondAcceptedType(type2);
 
-                    for (const RapidXmlReaderNode& acceptedValueDeclarationNode : nodeChildren)
-                    {
-                        Data::EnforceTagName(acceptedValueDeclarationNode, Data::ENUM_VALUE_TAG);
-                        Data::EnforceAttribute(acceptedValueDeclarationNode, Data::NAME_ATTRIBUTE_NAME);
-                        Data::EnforceAttribute(acceptedValueDeclarationNode, Data::VALUE_ATTRIBUTE_NAME);
-
-                        Data::EnforceChildSize(acceptedValueDeclarationNode, 0);
+        return pair;
+    }
+
+    // Complex type (IVTCByteImage)
+    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));
+        complex->setWidth(width);
+        complex->setHeight(height);
+        complex->setTypename(type);
+        return complex;
+    }
+
+    // Complex type (EigenMatrix)
+    typenavigator::NavigatorPtr EigenMatrixReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_EIGEN_MATRIX_MEMBER_TAG);
+        Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME);
+
+        int rows = std::stoi(Data::GetAttributeWithDefault(node, Data::ROWS_ATTRIBUTE_NAME, "1"));
+        int cols = std::stoi(Data::GetAttributeWithDefault(node, Data::COLS_ATTRIBUTE_NAME, "1"));
+        std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);
+
+        typenavigator::EigenMatrixNavigatorPtr complex(new typenavigator::EigenMatrixNavigator(path));
+        complex->setRows(rows);
+        complex->setCols(cols);
+        complex->setTypename(type);
+        return complex;
+    }
+
+    // Complex type (EigenQuaternion)
+    typenavigator::NavigatorPtr EigenQuaternionReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_EIGEN_QUATERNION_MEMBER_TAG);
+        Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME);
+
+        std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);
 
-                        std::string name = acceptedValueDeclarationNode.attribute_value(Data::NAME_ATTRIBUTE_NAME);
-                        int value = std::stoi(acceptedValueDeclarationNode.attribute_value(Data::VALUE_ATTRIBUTE_NAME));
+        typenavigator::EigenQuaternionNavigatorPtr complex(new typenavigator::EigenQuaternionNavigator(path));
+        complex->setTypename(type);
+        return complex;
+    }
+
+    // Complex type (OpenCVMat)
+    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;
+    }
+
+    // Complex type (PCLPointCloud)
+    typenavigator::NavigatorPtr PCLPointCloudReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        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;
+    }
 
-                        complex->addAcceptedValue(name, value);
-                    }
+    // Complex type (Position)
+    typenavigator::NavigatorPtr PositionReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_POSITION_MEMBER_TAG);
 
-                    return complex;
-                }
+        typenavigator::PositionNavigatorPtr complex(new typenavigator::PositionNavigator(path));
+        return complex;
+    }
+
+    // Complex type (Orientation)
+    typenavigator::NavigatorPtr OrientationReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_ORIENTATION_MEMBER_TAG);
+
+        typenavigator::OrientationNavigatorPtr complex(new typenavigator::OrientationNavigator(path));
+        return complex;
+    }
+
+    // Complex type (Pose)
+    typenavigator::NavigatorPtr PoseReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceTagName(node, Data::GENERATE_POSE_MEMBER_TAG);
+
+        typenavigator::PoseNavigatorPtr complex(new typenavigator::PoseNavigator(path));
+        return complex;
+    }
+
+
+
+    // Enum (IntEnum)
+    typenavigator::NavigatorPtr IntEnumReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const
+    {
+        Data::EnforceAttribute(node, Data::NAME_ATTRIBUTE_NAME);
+        const std::string name = Data::GetAttribute(node, Data::NAME_ATTRIBUTE_NAME);
+
+        bool enum_is_nested = ObjectGenerationStack.size() > 0;
+        if (enum_is_nested)
+        {
+            if (name.rfind("::") != std::string::npos)
+            {
+                throw error::StringNotValidException("IntEnumReaderFactory", "createSpecific", "Namespaces are not allowed in nested enums", name, path);
+            }
+        }
+
+        // set the new object
+        auto aronIntEnumType = std::make_shared<typenavigator::IntEnumNavigator>(path);
+        aronIntEnumType->setEnumName(name);
+
+        auto newEnumInfo = std::make_shared<codegeneratorhelper::GenerateIntEnumInfo>();
+        newEnumInfo->typeName = name;
+        newEnumInfo->correspondingType = aronIntEnumType;
+
+        for (const RapidXmlReaderNode& objectChild : node.nodes())
+        {
+            Data::EnforceTagName(objectChild, Data::ENUM_VALUE_TAG);
+            Data::EnforceChildSize(objectChild, 0);
+
+            Data::EnforceAttribute(objectChild, Data::KEY_ATTRIBUTE_NAME);
+            const std::string key = objectChild.attribute_value(Data::KEY_ATTRIBUTE_NAME);
+
+            Data::EnforceAttribute(objectChild, Data::VALUE_ATTRIBUTE_NAME);
+            const std::string value = objectChild.attribute_value(Data::VALUE_ATTRIBUTE_NAME);
+
+            aronIntEnumType->addAcceptedValue(key, std::stoi(value));
+        }
+
+        if (enum_is_nested)
+        {
+            // We are in a local nested class since there is a parent class in stack
+            codegeneratorhelper::GenerateObjectInfoPtr parent = ObjectGenerationStack.top();
+            parent->nestedIntEnums.insert(std::make_pair(simox::alg::to_lower(newEnumInfo->typeName), newEnumInfo));
+        }
+        else
+        {
+            // We are a public top level class. Add to AllPublicObjects
+            AllPublicIntEnums.insert(std::make_pair(simox::alg::to_lower(newEnumInfo->typeName), newEnumInfo));
+        }
+
+        return aronIntEnumType;
+    }
 
-                // Primitve Types
+    // Primitve Types
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    typenavigator::NavigatorPtr upperType##ReaderFactory::createSpecific(const RapidXmlReaderNode&, const Path& path) const \
+    typenavigator::NavigatorPtr upperType##ReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const \
     { \
+        Data::EnforceTagName(node, Data::GENERATE_##capsType##_MEMBER_TAG); \
         return typenavigator::NavigatorPtr(new typenavigator::upperType##Navigator(path)); \
     }
 
-                HANDLE_PRIMITIVE_TYPES
+    HANDLE_PRIMITIVE_TYPES
 #undef RUN_ARON_MACRO
 }
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 f180d04b16f59f0fbf3af3df240847510174612f..dbed99c551c990aedc4ab7546894ad8049387485 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h
@@ -35,6 +35,7 @@
 // ArmarX
 #include <ArmarXCore/core/rapidxml/wrapper/RapidXmlReader.h>
 #include <RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h>
+#include <RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h>
 #include <RobotAPI/libraries/aron/core/navigator/type/AllNavigators.h>
 
 
@@ -50,16 +51,18 @@ namespace armarx::aron::xmltypereader
         ReaderFactory() = default;
 
         virtual typenavigator::NavigatorPtr create(const RapidXmlReaderNode&, const Path&) const override;
-        virtual typenavigator::NavigatorPtr createSpecific(const RapidXmlReaderNode&, const Path&) const override = 0;
-
-        static std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> GetAllKnownGeneratedPublicObjects();
+        virtual typenavigator::NavigatorPtr createSpecific(const RapidXmlReaderNode&, const Path&) const override;
 
     protected:
         static typenavigator::NavigatorPtr ResolveTypename(const std::string&);
 
+    public:
+        static std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr> AllPublicObjects;
+        static std::map<std::string, codegeneratorhelper::GenerateIntEnumInfoPtr> AllPublicIntEnums;
+
     protected:
-        static std::stack<codegeneratorhelper::GenerateTypeInfoPtr> TheObjectWeAreGoingToGenerateNowStack;
-        static std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> AllKnownGeneratedPublicObjects;
+        static std::stack<codegeneratorhelper::GenerateObjectInfoPtr> ObjectGenerationStack;
+
     };
 
     #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
diff --git a/source/RobotAPI/libraries/aron/core/io/Data.h b/source/RobotAPI/libraries/aron/core/io/Data.h
index 87a606af2bb4885019994f03c1d227f3a8ca57f3..6d29388942067854205998b2c0aaef4e4b74a402 100644
--- a/source/RobotAPI/libraries/aron/core/io/Data.h
+++ b/source/RobotAPI/libraries/aron/core/io/Data.h
@@ -40,7 +40,7 @@ namespace armarx::aron::io
 
     public:
         // TODO: Remove copy from ReaderWriter
-        static constexpr const char* READER_WRITER_OBJECT_NAME_SLUG = "ARON_OBJECT_NAME";
+        static constexpr const char* READER_WRITER_NAME_SLUG = "ARON_NAME";
         static constexpr const char* READER_WRITER_DICT_ACCEPTED_TYPE_SLUG = "ARON_DICT_ACCEPTED_TYPE";
         static constexpr const char* READER_WRITER_LIST_ACCEPTED_TYPE_SLUG = "ARON_LIST_ACCEPTED_TYPE";
 
@@ -49,6 +49,10 @@ namespace armarx::aron::io
         static constexpr const char* READER_WRITER_NDARRAY_TYPE_SLUG = "ARON_NDARRAY_TYPE";
         static constexpr const char* READER_WRITER_NDARRAY_DATA_SLUG = "ARON_NDARRAY_DATA";
 
+        static constexpr const char* READER_WRITER_INT_ENUM_NAME_SLUG = "ARON_INT_ENUM_NAME";
+        static constexpr const char* READER_WRITER_INT_ENUM_VALUE_SLUG = "ARON_INT_ENUM_VALUE";
+        static constexpr const char* READER_WRITER_ENUM_KEY_SLUG = "ARON_ENUM_KEY";
+
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
     static constexpr const char* READER_WRITER_##capsType##_TYPENAME_SLUG = #capsType;
 
diff --git a/source/RobotAPI/libraries/aron/core/io/ReaderToken.h b/source/RobotAPI/libraries/aron/core/io/ReaderToken.h
index 2551589a98fa27d12ed5e410cc6401c14545ad6d..a6a42098d8a198c7aa1ace6751cce3e7130c4cfa 100644
--- a/source/RobotAPI/libraries/aron/core/io/ReaderToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/ReaderToken.h
@@ -20,104 +20,3 @@
 
 #pragma once
 
-// STD/STL
-#include <memory>
-#include <string>
-
-// ArmarX
-#include <RobotAPI/libraries/aron/core/Config.h>
-#include <RobotAPI/libraries/aron/core/Exception.h>
-#include <RobotAPI/libraries/aron/core/Resolver.h>
-#include <RobotAPI/libraries/aron/core/io/Data.h>
-
-
-namespace armarx::aron::io
-{
-    template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename>
-    class ReaderToken;
-
-    template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename>
-    using ReaderTokenPtr = std::shared_ptr<ReaderToken<AronDescriptorTypename, ElementReturnPtrTypename, ElementTypename>> ;
-
-    template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename>
-    class ReaderToken
-    {
-    public:
-        ReaderToken() = delete;
-        ReaderToken(const AronDescriptorTypename& desc, const ElementTypename& e) :
-            descriptor(desc), element(e), currentIndex(0), maxIndex(0), currentKey("")
-        {
-        };
-
-        bool checkedAllChildren() const
-        {
-            return currentIndex >= allKeys.size() && currentIndex >= maxIndex;
-        }
-
-        AronDescriptorTypename getDescriptor() const
-        {
-            return descriptor;
-        }
-
-        unsigned int getChildrenSize() const
-        {
-            return maxIndex;
-        }
-
-        void setCurrentKey(const std::string& s)
-        {
-            if (s.empty())
-            {
-                throw error::AronException("AronReaderToken", "setCurrentKey", "The passed key is empty.");
-            }
-            currentKey = s;
-        }
-
-        virtual bool currentIsEligableForResolvingKey() const = 0;
-        std::string resolveCurrentKey() const
-        {
-            if (!this->currentIsEligableForResolvingKey())
-            {
-                throw error::AronException("AronReaderToken", "resolveCurrentKey", "Cant get key of token.");
-            }
-
-            // check outOfBounds
-            if (this->currentIndex >= this->maxIndex)
-            {
-                throw error::SizeNotValidException("AronReaderToken", "resolveCurrentKey", "Index out of bounds.", this->currentIndex, this->maxIndex);
-            }
-
-            // ugly workaround
-            if (this->currentKey == "") // probably in a dict where the caller does not know which keys are there
-            {
-                if (this->allKeys.size() == 0)
-                {
-                    throw error::AronException("AronReaderToken", "resolveCurrentKey", "The currentKey is not set and the list of all keys is empty!");
-                }
-                return this->allKeys[this->currentIndex];
-            }
-            return this->currentKey;
-        }
-
-
-        virtual ElementReturnPtrTypename getCurrentElement() const = 0;
-        ElementReturnPtrTypename getCurrentElementAndIncreaseCnt()
-        {
-            ElementReturnPtrTypename next = getCurrentElement();
-            this->currentIndex++;
-            return next;
-        }
-
-    protected:
-        // members
-        AronDescriptorTypename descriptor;
-        ElementTypename element;
-
-        unsigned int currentIndex;
-        unsigned int maxIndex;
-
-        // dict and object members
-        std::string currentKey;
-        std::vector<std::string> allKeys;
-    };
-}
diff --git a/source/RobotAPI/libraries/aron/core/io/WriterToken.h b/source/RobotAPI/libraries/aron/core/io/WriterToken.h
index a7f6d5ff8e17420bf0c7af49799719db88fb79d5..dbc013c6efd7bace247c1c2a4a656d3bdd87748c 100644
--- a/source/RobotAPI/libraries/aron/core/io/WriterToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/WriterToken.h
@@ -19,67 +19,3 @@
 */
 
 #pragma once
-
-// STD/STL
-#include <memory>
-#include <string>
-
-// ArmarX
-#include <RobotAPI/libraries/aron/core/Config.h>
-#include <RobotAPI/libraries/aron/core/Exception.h>
-#include <RobotAPI/libraries/aron/core/io/Data.h>
-
-
-namespace armarx::aron::io
-{
-    template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename>
-    class WriterToken;
-
-    template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename>
-    using WriterTokenPtr = std::shared_ptr<WriterToken<AronDescriptorTypename, ElementTypename, ElementAddTypename>> ;
-
-    template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename>
-    class WriterToken
-    {
-    public:
-        WriterToken() = delete;
-        WriterToken(const AronDescriptorTypename& desc, const ElementTypename& e) :
-            descriptor(desc), element(e), currentIndex(0), currentKey("")
-        {
-        };
-
-        // virtual definitions
-        virtual void addElement(const ElementAddTypename&) = 0;
-        virtual std::string toElementAccessor() const = 0;
-
-        void setCurrentKey(const std::string& s)
-        {
-            if (s.empty())
-            {
-                throw error::AronException("AronWriterToken", "setCurrentKey", "The passed key is empty.");
-            }
-            currentKey = s;
-        }
-
-        virtual ElementTypename getElement() const
-        {
-            return element;
-        }
-
-        virtual AronDescriptorTypename getDescriptor() const
-        {
-            return descriptor;
-        }
-
-    protected:
-        // members
-        AronDescriptorTypename descriptor;
-        ElementTypename element;
-
-        // current index
-        unsigned int currentIndex;
-
-        // current key
-        std::string currentKey;
-    };
-}
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h
index d74d23b4cc8cf0f9a5c51d2dcbb07b01d3d18d10..7df44a015c8f93f531e1e54c8dd2524ae98308d6 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h
@@ -31,46 +31,39 @@
 
 namespace armarx::aron::dataIO
 {
-            class Reader;
-            typedef std::shared_ptr<Reader> AronDataReaderPtr;
+    class ReaderInterface;
+    typedef std::shared_ptr<ReaderInterface> ReaderInterfacePtr;
 
-            class Reader
-            {
-            public:
-                Reader() = default;
+    class ReaderInterface
+    {
+    public:
+        virtual int readStartDict() = 0;
+        virtual bool readEndDict() = 0;
+        virtual int readStartList() = 0;
+        virtual bool readEndList() = 0;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual int  readStart##upperType() = 0; \
-    virtual bool readEnd##upperType() = 0; \
+        virtual std::tuple<std::vector<int>, std::string> readStartNDArray() = 0;
+        virtual bool readEndNDArray(unsigned char*) = 0;
 
-                HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
+        virtual void readPrimitive(int&) = 0;
+        virtual void readPrimitive(long&) = 0;
+        virtual void readPrimitive(float&) = 0;
+        virtual void readPrimitive(double&) = 0;
+        virtual void readPrimitive(std::string&) = 0;
+        virtual void readPrimitive(bool&) = 0;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual std::pair<std::vector<int>, std::string> readStart##upperType() = 0; \
-    virtual void readEnd##upperType(unsigned char*) = 0; \
+        template<class T>
+        T readPrimitive()
+        {
+            T p;
+            readPrimitive(p);
+            return p;
+        }
 
-                HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
+        virtual std::string readKey() = 0;
+        virtual void loadMember(const std::string&) = 0;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual void readPrimitive(lowerType&) = 0; \
-
-                HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
-
-                template<class T>
-                T readPrimitive()
-                {
-                    T p;
-                    readPrimitive(p);
-                    return p;
-                }
-
-                virtual std::string readKey() = 0;
-                virtual bool readKey(const std::string&) = 0;
-
-                // Helper functions
-                virtual data::Descriptor getTypeOfNextAron(const type::Descriptor) const = 0;
-            };
+        // Helper functions
+        virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const = 0;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h b/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h
index 449909b2c2a5e820ebf7386f187003d4d6746734..89aca64073cc652b2a72d3da62b7ce0a7c3e76d9 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h
@@ -32,33 +32,26 @@
 
 namespace armarx::aron::dataIO
 {
-            class Writer;
-            typedef std::shared_ptr<Writer> WriterPtr;
-
-            class Writer
-            {
-            public:
-                Writer() = default;
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writeStart##upperType() = 0; \
-    virtual bool writeEnd##upperType() = 0;
-
-                HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool write##upperType(const std::vector<int>&, const std::string&, const unsigned char*) = 0;
-
-                HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writePrimitive(const lowerType&) = 0;
-
-                HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
-
-                virtual bool writeKey(const std::string&) = 0;
-            };
+    class WriterInterface;
+    typedef std::shared_ptr<WriterInterface> WriterInterfacePtr;
+
+    class WriterInterface
+    {
+    public:
+        virtual void writeStartDict() = 0;
+        virtual void writeEndDict() = 0;
+        virtual void writeStartList() = 0;
+        virtual void writeEndList() = 0;
+
+        virtual void writeNDArray(const std::vector<int>&, const std::string&, const unsigned char*) = 0;
+
+        virtual void writePrimitive(int) = 0;
+        virtual void writePrimitive(long) = 0;
+        virtual void writePrimitive(float) = 0;
+        virtual void writePrimitive(double) = 0;
+        virtual void writePrimitive(const std::string&) = 0;
+        virtual void writePrimitive(bool) = 0;
+
+        virtual void writeKey(const std::string&) = 0;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.cpp
index bfd7804b3618e13cfe3543dc76c30e581673d62b..13b6703cd69bffe9e6c8f89cf4164ada98649bc0 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.cpp
@@ -30,71 +30,71 @@
 
 
 namespace armarx::aron::dataIO
+{
+    void Converter::ConvertFromReader(ReaderInterface& reader, WriterInterface& writer, const aron::typenavigator::NavigatorPtr& expectedStructure)
+    {
+        type::Descriptor t_desc = expectedStructure != nullptr ? expectedStructure->getDescriptor() : type::eUnknown;
+        data::Descriptor desc = reader.getTypeOfNext(t_desc);
+        switch (desc)
         {
-            void Converter::ConvertFromReader(Reader& reader, dataIO::Writer& writer, const aron::typenavigator::NavigatorPtr& expectedStructure)
+            case data::eDict:
             {
-                type::Descriptor t_desc = expectedStructure != nullptr ? expectedStructure->getDescriptor() : type::eUnknown;
-                data::Descriptor desc = reader.getTypeOfNextAron(t_desc);
-                switch (desc)
+                int elements = reader.readStartDict();
+                writer.writeStartDict();
+
+                typenavigator::NavigatorPtr childType = nullptr;
+                if (t_desc == type::eDict)
                 {
-                case data::eDict:
+                    auto t = typenavigator::DictNavigator::DynamicCast(expectedStructure);
+                    childType = t->getAcceptedType();
+                }
+
+                for (int i = 0; i < elements; ++i)
                 {
-                    int elements = reader.readStartDict();
-                    writer.writeStartDict();
+                    std::string key = reader.readKey();
+                    writer.writeKey(key);
 
-                    typenavigator::NavigatorPtr childType = nullptr;
-                    if (t_desc == type::eDict)
+                    if (t_desc == type::eObject)
                     {
-                        auto t = typenavigator::DictNavigator::DynamicCast(expectedStructure);
-                        childType = t->getAcceptedType();
+                        auto t = typenavigator::ObjectNavigator::DynamicCast(expectedStructure);
+                        childType = t->getMemberType(key);
                     }
 
-                    for (int i = 0; i < elements; ++i)
-                    {
-                        std::string key = reader.readKey();
-                        writer.writeKey(key);
+                    Converter::ConvertFromReader(reader, writer, childType);
+                }
 
-                        if (t_desc == type::eObject)
-                        {
-                            auto t = typenavigator::ObjectNavigator::DynamicCast(expectedStructure);
-                            childType = t->getMemberType(key);
-                        }
+                writer.writeEndDict();
+                reader.readEndDict();
 
-                        Converter::ConvertFromReader(reader, writer, childType);
-                    }
-
-                    writer.writeEndDict();
-                    reader.readEndDict();
+                break;
+            }
+            case data::eList:
+            {
+                int elements = reader.readStartList();
+                writer.writeStartList();
 
-                    break;
-                }
-                case data::eList:
+                typenavigator::NavigatorPtr childType = nullptr;
+                if (t_desc == type::eList)
                 {
-                    int elements = reader.readStartList();
-                    writer.writeStartList();
-
-                    typenavigator::NavigatorPtr childType = nullptr;
-                    if (t_desc == type::eList)
-                    {
-                        auto t = typenavigator::ListNavigator::DynamicCast(expectedStructure);
-                        childType = t->getAcceptedType();
-                    }
+                    auto t = typenavigator::ListNavigator::DynamicCast(expectedStructure);
+                    childType = t->getAcceptedType();
+                }
 
-                    for (int i = 0; i < elements; ++i)
+                for (int i = 0; i < elements; ++i)
+                {
+                    if (t_desc == type::eObject)
                     {
-                        if (t_desc == type::eObject)
-                        {
-                            auto t = typenavigator::TupleNavigator::DynamicCast(expectedStructure);
-                            childType = t->getAcceptedType(i);
-                        }
-
-                        Converter::ConvertFromReader(reader, writer, childType);
+                        auto t = typenavigator::TupleNavigator::DynamicCast(expectedStructure);
+                        childType = t->getAcceptedType(i);
                     }
 
-                    writer.writeEndList();
-                    reader.readEndList();
-                    break;
+                    Converter::ConvertFromReader(reader, writer, childType);
                 }
+
+                writer.writeEndList();
+                reader.readEndList();
+                break;
+            }
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
 case data::e##upperType: \
 { \
@@ -107,7 +107,7 @@ case data::e##upperType: \
     break; \
 }
 
-                    HANDLE_COMPLEX_DATA
+            HANDLE_COMPLEX_DATA
 #undef RUN_ARON_MACRO
 
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
@@ -118,13 +118,13 @@ case data::e##upperType: \
     break; \
 }
 
-                    HANDLE_PRIMITIVE_DATA
+            HANDLE_PRIMITIVE_DATA
 #undef RUN_ARON_MACRO
 
-                    default:
-                    {
-                        throw error::DescriptorNotValidException("LegacyAronDataReader", "SetupReaderAndGetResult", "Data-Type could not be resolved", desc);
-                    }
-                }
+            default:
+            {
+                throw error::DescriptorNotValidException("LegacyAronDataReader", "SetupReaderAndGetResult", "Data-Type could not be resolved", desc);
             }
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h b/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h
index 74d1363b1aeaed620b01a351c7924f0aea003b79..d51d81761b764d5616bb70e5cefd67dd105987bd 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h
@@ -43,7 +43,6 @@ namespace armarx::aron::dataIO
         Converter() = delete;
 
     public:
-        static void ConvertFromReader(dataIO::Reader&, dataIO::Writer&, const aron::typenavigator::NavigatorPtr& expectedStructure = nullptr);
-    public:
+        static void ConvertFromReader(ReaderInterface&, WriterInterface&, const aron::typenavigator::NavigatorPtr& expectedStructure = nullptr);
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h
index 2cd749a1f5109d4a059d6b2f0076fe5f8c1ce3a5..dbc013c6efd7bace247c1c2a4a656d3bdd87748c 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h
@@ -19,67 +19,3 @@
 */
 
 #pragma once
-
-// STD/STL
-#include <memory>
-#include <string>
-#include <stack>
-
-// Base Class
-#include <RobotAPI/libraries/aron/core/io/dataIO/Reader.h>
-
-
-
-namespace armarx::aron::dataIO
-{
-    template <typename InputTypename, typename TokenPtrTypename>
-    class TokenizedReader;
-
-    template <typename InputTypename, typename TokenPtrTypename>
-    using TokenizedReaderPtr = std::shared_ptr<TokenizedReader<InputTypename, TokenPtrTypename>>;
-
-    template <typename InputTypename, typename TokenPtrTypename>
-    class TokenizedReader :
-        virtual public Reader
-    {
-    public:
-        TokenizedReader() = delete;
-        TokenizedReader(const InputTypename& input) :
-            data(input)
-        {
-        }
-
-        // ReadKey
-        std::string readKey() override
-        {
-            TokenPtrTypename token = stack.top();
-            std::string k = token->resolveCurrentKey();
-            return k;
-        }
-
-        bool readKey(const std::string& k) override
-        {
-            TokenPtrTypename token = stack.top();
-            token->setCurrentKey(k);
-            return true;
-        }
-
-        data::Descriptor getTypeOfNextAron(const type::Descriptor hint) const override
-        {
-            if (stack.empty())
-            {
-                // completely unknown. We assume a dict on the top level
-                return data::Descriptor::eDict;
-            }
-
-            TokenPtrTypename lastToken = stack.top();
-            return lastToken->getTypeOfNextElement(hint);
-        }
-
-
-    protected:
-        InputTypename data;
-        bool readInitialStart = false;
-        std::stack<TokenPtrTypename> stack;
-    };
-}
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 a3c2be81ebdcfe3cbcc08fa54d0336d1ef518ff8..07cd3ef344f4226ea250733706f164d63c7481ee 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h
@@ -29,42 +29,102 @@
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Config.h>
-#include <RobotAPI/libraries/aron/core/Descriptor.h>
-
-
+#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/aron/core/io/Data.h>
 
 namespace armarx::aron::dataIO
 {
-    template<typename ElementReturnPtrTypename, typename ElementAddTypename>
-    class ReaderToken;
+    template<typename ElementTypename>
+    class ReaderTokenInterface;
 
-    template<typename ElementReturnPtrTypename, typename ElementAddTypename>
-    using ReaderTokenPtr = std::shared_ptr<ReaderToken<ElementReturnPtrTypename, ElementAddTypename>>;
+    template<typename ElementTypename>
+    using ReaderTokenInterfacePtr = std::shared_ptr<ReaderTokenInterface<ElementTypename>>;
 
-    template<typename ElementReturnPtrTypename, typename ElementAddTypename>
-    class ReaderToken :
-        virtual public io::ReaderToken<data::Descriptor, ElementReturnPtrTypename, ElementAddTypename>
+    template<typename ElementTypename>
+    class ReaderTokenInterface
     {
     public:
-        using PointerType = ReaderTokenPtr<ElementReturnPtrTypename, ElementAddTypename>;
+        using PointerType = ReaderTokenInterfacePtr<ElementTypename>;
 
-    public:
-        // constructors
-        ReaderToken() = delete;
-        ReaderToken(const data::Descriptor desc, const ElementAddTypename& data) :
-            io::ReaderToken<data::Descriptor, ElementReturnPtrTypename, ElementAddTypename>(desc, data)
-        { }
 
-        bool currentIsEligableForResolvingKey() const override
+        // Interface
+        virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const = 0;
+        virtual ElementTypename getNextElement() const = 0;
+
+        // General implementation
+        ElementTypename getElement() const
+        {
+            return element;
+        }
+
+        data::Descriptor getDescriptor() const
+        {
+            return descriptor;
+        }
+
+        unsigned int getElementChildrenSize() const
         {
-            if (this->descriptor == data::Descriptor::eDict)
+            return childrenSize;
+        }
+
+        bool finishedElement() const
+        {
+            return currentIndex >= getElementChildrenSize();
+        }
+
+        std::string getCurrentKey() const
+        {
+            assertIndexInBounds();
+
+            // ugly workaround
+            if (this->currentKey == "") // probably in a dict where the caller does not know which keys are there
             {
-                return true;
+                if (this->allMemberNames.size() == 0)
+                {
+                    throw error::AronException("dataIO::ReaderTokenInterface", "getCurrentKey", "The currentKey is not set and the list of all keys is empty!");
+                }
+                return this->allMemberNames[this->currentIndex];
             }
-            return false;
+            return this->currentKey;
         }
 
-        virtual data::Descriptor getTypeOfNextElement(const type::Descriptor) const = 0;
-    private:
+        void setCurrentKey(const std::string& s)
+        {
+            currentKey = s;
+        }
+
+        void assertType(data::Descriptor t) const
+        {
+            if (getDescriptor() != t)
+            {
+                throw error::DescriptorNotValidException("dataIO::ReaderTokenInterface", "assertType", "The type was not equal.", t);
+            }
+        }
+
+        void assertIndexInBounds() const
+        {
+            if (this->currentIndex >= getElementChildrenSize())
+            {
+                throw error::SizeNotValidException("dataIO::ReaderTokenInterface", "assertIndexInBounds", "Index out of bounds.", this->currentIndex, getElementChildrenSize());
+            }
+        }
+
+        ElementTypename getNextElementAndIncreaseCnt()
+        {
+            ElementTypename next = getNextElement();
+            this->currentIndex++;
+            return next;
+        }
+
+    protected:
+        // members
+        data::Descriptor descriptor = data::eUnknown;
+        ElementTypename element;
+
+        unsigned int childrenSize = 0;
+        unsigned int currentIndex = 0;
+
+        std::string currentKey = "";
+        std::vector<std::string> allMemberNames = {};
     };
 }
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 56506642ae73fcc5a3518dc86f85d7cae2248e50..aa5d3d14864aff4fd5d86b8cfc47b06a81cc0200 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
@@ -33,110 +33,166 @@
 
 
 namespace armarx::aron::dataIO::reader
+{
+    NavigatorReader::NavigatorReader(const datanavigator::NavigatorPtr& n) :
+        input(n)
+    {
+    }
+
+    NavigatorReader::NavigatorReader(const data::AronDataPtr& n) :
+        input(datanavigator::Navigator::FromAronData(n))
+    {
+    }
+
+    datanavigator::NavigatorPtr NavigatorReader::getNextAndIncrease()
+    {
+        if (!readInitialStart)
+        {
+            readInitialStart = true;
+            return input;
+        }
+        auto lastToken = stack.top();
+        return lastToken->getNextElementAndIncreaseCnt();
+    }
+
+    datanavigator::NavigatorPtr NavigatorReader::getNext()
+    {
+        if (!readInitialStart)
+        {
+            readInitialStart = true;
+            return input;
+        }
+        auto lastToken = stack.top();
+        return lastToken->getNextElement();
+    }
+
+    // Containers
+    int NavigatorReader::readStartDict()
+    {
+        auto current_nav = getNextAndIncrease();
+        auto current_nav_casted = datanavigator::DictNavigator::DynamicCastAndCheck(current_nav);
+        int c = current_nav->childrenSize();
+        auto newToken = std::make_shared<NavigatorReaderToken>(data::eDict, current_nav_casted);
+        stack.push(newToken);
+        return c;
+    }
+
+    bool NavigatorReader::readEndDict()
+    {
+        auto token = stack.top();
+        datanavigator::DictNavigator::DynamicCastAndCheck(token->getElement());
+
+        if (token->finishedElement())
         {
-            NavigatorReader::NavigatorReader(const datanavigator::NavigatorPtr& n) :
-                TokenizedReader<datanavigator::NavigatorPtr, NavigatorReaderTokenPtr>(n)
-            {
-            }
-
-            NavigatorReader::NavigatorReader(const data::AronDataPtr& n) :
-                TokenizedReader<datanavigator::NavigatorPtr, NavigatorReaderTokenPtr>(datanavigator::Navigator::FromAronData(n))
-            {
-            }
-
-            datanavigator::NavigatorPtr NavigatorReader::getCurrentAndGoToNext()
-            {
-                if (!readInitialStart)
-                {
-                    readInitialStart = true;
-                    return data;
-                }
-                auto lastToken = stack.top();
-                return lastToken->getCurrentElementAndIncreaseCnt();
-            }
-
-            datanavigator::NavigatorPtr NavigatorReader::getCurrent()
-            {
-                if (!readInitialStart)
-                {
-                    readInitialStart = true;
-                    return data;
-                }
-                auto lastToken = stack.top();
-                return lastToken->getCurrentElement();
-            }
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    int NavigatorReader::readStart##upperType() \
-    { \
-        datanavigator::NavigatorPtr current_nav = getCurrentAndGoToNext(); \
-        auto desc = current_nav->getDescriptor(); \
-        if (desc != data::Descriptor::e##upperType) \
-        { \
-            throw error::DescriptorNotValidException("NavigatorReader", "readStart" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \
-            return false; \
-        } \
-        datanavigator::upperType##NavigatorPtr current_nav_casted = datanavigator::upperType##Navigator::DynamicCast(current_nav); \
-        int c = current_nav->childrenSize(); \
-        NavigatorReaderTokenPtr newToken = NavigatorReaderTokenPtr(new NavigatorReaderToken(current_nav->getDescriptor(), current_nav_casted)); \
-        stack.push(newToken); \
-        return c; \
-    } \
-    \
-    bool NavigatorReader::readEnd##upperType() \
-    { \
-        NavigatorReaderTokenPtr token = stack.top(); \
-        auto desc = token->getDescriptor(); \
-        if (desc != data::Descriptor::e##upperType) \
-        { \
-            throw error::DescriptorNotValidException("NavigatorReader", "readEnd" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \
-            return false; \
-        } \
-        \
-        if (token->checkedAllChildren()) \
-        { \
-            stack.pop(); \
-            return true; \
-        } \
-        return false; \
-    }
-
-            HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
-
-            // Complex Data
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    std::pair<std::vector<int>, std::string> NavigatorReader::readStart##upperType() \
-    { \
-        datanavigator::NavigatorPtr nav = getCurrent(); \
-        datanavigator::NDArrayNavigatorPtr casted = datanavigator::NDArrayNavigator::DynamicCast(nav); \
-        return std::make_pair(casted->getDimensions(), casted->getType()); \
-    } \
-    \
-    void NavigatorReader::readEnd##upperType(unsigned char* data) \
-    { \
-        if(data == NULL) \
-        { \
-            throw error::AronException("NavigatorReader", "readEnd" + std::string(#upperType), "The corresponding data pointer of an complex aron ptr is NULL."); \
-        } \
-        datanavigator::NavigatorPtr nav = getCurrentAndGoToNext(); \
-        datanavigator::NDArrayNavigatorPtr casted = datanavigator::NDArrayNavigator::DynamicCast(nav); \
-        std::vector<int> dims = casted->getDimensions(); \
-        memcpy(data, casted->getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>())); \
-    }
-
-            HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
-
-            // Read primitives
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    void NavigatorReader::readPrimitive(lowerType& t) \
-    { \
-        datanavigator::NavigatorPtr nav = getCurrentAndGoToNext(); \
-        datanavigator::upperType##NavigatorPtr casted = datanavigator::upperType##Navigator::DynamicCast(nav); \
-        t = casted->getValue(); \
-    }
-
-            HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
+
+    int NavigatorReader::readStartList()
+    {
+        auto current_nav = getNextAndIncrease();
+        auto current_nav_casted = datanavigator::ListNavigator::DynamicCastAndCheck(current_nav);
+        int c = current_nav->childrenSize();
+        auto newToken = std::make_shared<NavigatorReaderToken>(data::eList, current_nav_casted);
+        stack.push(newToken);
+        return c;
+    }
+
+    bool NavigatorReader::readEndList()
+    {
+        auto token = stack.top();
+        datanavigator::ListNavigator::DynamicCastAndCheck(token->getElement());
+
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
+
+    // Complex Data
+    std::tuple<std::vector<int>, std::string> NavigatorReader::readStartNDArray()
+    {
+        datanavigator::NavigatorPtr nav = getNext();
+        datanavigator::NDArrayNavigatorPtr casted = datanavigator::NDArrayNavigator::DynamicCastAndCheck(nav);
+        return {casted->getDimensions(), casted->getType()};
+    }
+
+    bool NavigatorReader::readEndNDArray(unsigned char* data)
+    {
+        if (data == NULL)
+        {
+            throw error::AronException("NavigatorReader", "readEndNDArray", "The corresponding data pointer of an complex aron ptr is NULL.");
+        }
+        auto nav = getNextAndIncrease();
+        auto casted = datanavigator::NDArrayNavigator::DynamicCastAndCheck(nav);
+        std::vector<int> dims = casted->getDimensions();
+        memcpy(data, casted->getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()));
+        return true;
+    }
+
+    // Read primitives
+    void NavigatorReader::readPrimitive(int& t)
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = datanavigator::IntNavigator::DynamicCastAndCheck(nav);
+        t = casted->getValue();
+    }
+
+    void NavigatorReader::readPrimitive(long& t)
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = datanavigator::LongNavigator::DynamicCastAndCheck(nav);
+        t = casted->getValue();
+    }
+
+    void NavigatorReader::readPrimitive(float& t)
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = datanavigator::FloatNavigator::DynamicCastAndCheck(nav);
+        t = casted->getValue();
+    }
+
+    void NavigatorReader::readPrimitive(double& t)
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = datanavigator::DoubleNavigator::DynamicCastAndCheck(nav);
+        t = casted->getValue();
+    }
+
+    void NavigatorReader::readPrimitive(std::string& t)
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = datanavigator::StringNavigator::DynamicCastAndCheck(nav);
+        t = casted->getValue();
+    }
+
+    void NavigatorReader::readPrimitive(bool& t)
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = datanavigator::BoolNavigator::DynamicCastAndCheck(nav);
+        t = casted->getValue();
+    }
+
+    std::string NavigatorReader::readKey()
+    {
+        auto token = stack.top();
+        return token->getCurrentKey();
+    }
+
+    void NavigatorReader::loadMember(const std::string& k)
+    {
+        auto token = stack.top();
+        token->setCurrentKey(k);
+    }
+
+    // Helper functions
+    data::Descriptor NavigatorReader::getTypeOfNext(const type::Descriptor hint) const
+    {
+        auto token = stack.top();
+        return token->getTypeOfNext(hint);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h
index 3aa6b49d5c34ed30854a0664230685342b07d1a4..0bcc56b7bdc6e22775fc2d4345e1f9715e942d1f 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h
@@ -25,7 +25,7 @@
 #include <stack>
 
 // BaseClass
-#include <RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h>
+#include <RobotAPI/libraries/aron/core/io/dataIO/Reader.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/navigator/data/Navigator.h>
@@ -38,41 +38,43 @@ namespace armarx::aron::dataIO::reader
     typedef std::shared_ptr<NavigatorReader> NavigatorReaderPtr;
 
     class NavigatorReader :
-        virtual public TokenizedReader<datanavigator::NavigatorPtr, NavigatorReaderTokenPtr>
+        virtual public ReaderInterface
     {
     public:
         using PointerType = NavigatorReaderPtr;
 
-    public:
         // constructors
         NavigatorReader() = delete;
         NavigatorReader(const datanavigator::NavigatorPtr& n);
         NavigatorReader(const data::AronDataPtr& n);
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-virtual int  readStart##upperType() override; \
-virtual bool readEnd##upperType() override; \
-
-        HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
+        virtual int readStartDict() override;
+        virtual bool readEndDict() override;
+        virtual int readStartList() override;
+        virtual bool readEndList() override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-virtual std::pair<std::vector<int>, std::string> readStart##upperType() override; \
-virtual void readEnd##upperType(unsigned char*) override; \
+        virtual std::tuple<std::vector<int>, std::string> readStartNDArray() override;
+        virtual bool readEndNDArray(unsigned char*) override;
 
-        HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
+        virtual void readPrimitive(int&) override;
+        virtual void readPrimitive(long&) override;
+        virtual void readPrimitive(float&) override;
+        virtual void readPrimitive(double&) override;
+        virtual void readPrimitive(std::string&) override;
+        virtual void readPrimitive(bool&) override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-virtual void readPrimitive(lowerType&) override; \
+        virtual std::string readKey() override;
+        virtual void loadMember(const std::string&) override;
 
-        HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
+        virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const override;
 
     private:
-        datanavigator::NavigatorPtr getCurrent();
-        datanavigator::NavigatorPtr getCurrentAndGoToNext();
+        datanavigator::NavigatorPtr getNext();
+        datanavigator::NavigatorPtr getNextAndIncrease();
 
     private:
+        datanavigator::NavigatorPtr input;
+        bool readInitialStart = false;
+        std::stack<NavigatorReaderTokenPtr> stack;
     };
 }
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 4157ecba745dda7709f4efbf7f6181d2603a4f63..2efb3352f203d93fa0b647ea318affea7d41b4fd 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
@@ -38,7 +38,7 @@ namespace armarx::aron::dataIO::reader
     typedef std::shared_ptr<NavigatorReaderToken> NavigatorReaderTokenPtr;
 
     class NavigatorReaderToken :
-        virtual public ReaderToken<datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>
+        virtual public ReaderTokenInterface<datanavigator::NavigatorPtr>
     {
     public:
         using PointerType = NavigatorReaderTokenPtr;
@@ -46,21 +46,22 @@ namespace armarx::aron::dataIO::reader
     public:
         // constructors
         NavigatorReaderToken() = delete;
-        NavigatorReaderToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& data) :
-            io::ReaderToken<data::Descriptor, datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>(desc, data),
-            ReaderToken<datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>(desc, data)
+        NavigatorReaderToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& data)
         {
+            descriptor = desc;
+            element = data;
+
             switch (descriptor)
             {
                 case data::Descriptor::eDict:
                 {
-                    allKeys = datanavigator::DictNavigator::DynamicCastAndCheck(data)->getAllKeys();
-                    maxIndex = allKeys.size();
+                    allMemberNames = datanavigator::DictNavigator::DynamicCastAndCheck(data)->getAllKeys();
+                    childrenSize = data->childrenSize();
                     break;
                 }
                 case data::Descriptor::eList:
                 {
-                    maxIndex = datanavigator::ListNavigator::DynamicCastAndCheck(data)->childrenSize();
+                    childrenSize = data->childrenSize();
                     break;
                 }
                 default:
@@ -68,20 +69,20 @@ namespace armarx::aron::dataIO::reader
             }
         }
 
-        data::Descriptor getTypeOfNextElement(const type::Descriptor) const override
+        data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const override
         {
-            const datanavigator::NavigatorPtr next = getCurrentElement();
+            const datanavigator::NavigatorPtr next = getNextElement();
             return next->getDescriptor();
         }
 
-        datanavigator::NavigatorPtr getCurrentElement() const override
+        datanavigator::NavigatorPtr getNextElement() const override
         {
             switch (descriptor)
             {
                 case data::Descriptor::eDict:
                 {
                     datanavigator::DictNavigatorPtr casted = datanavigator::DictNavigator::DynamicCast(element);
-                    datanavigator::NavigatorPtr ret = casted->getElement(resolveCurrentKey());
+                    datanavigator::NavigatorPtr ret = casted->getElement(getCurrentKey());
                     return ret;
                 }
                 case data::Descriptor::eList:
@@ -96,5 +97,6 @@ namespace armarx::aron::dataIO::reader
         }
 
     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 2ac1b5462137df5bf1e8f29f4c8683dfed20b6e0..9b15c88280210b4e9b2e583ba7439d87e68909d9 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
@@ -33,103 +33,158 @@
 
 
 namespace armarx::aron::dataIO::reader
+{
+    NlohmannJSONReader::NlohmannJSONReader(const nlohmann::json& n) :
+        input(n)
+    {
+    }
+
+    NlohmannJSONReader::NlohmannJSONReader(const std::string& n) :
+        input(nlohmann::json::parse(n))
+    {
+    }
+
+    nlohmann::json NlohmannJSONReader::getNextAndIncrease()
+    {
+        if (!readInitialStart)
+        {
+            readInitialStart = true;
+            return input;
+        }
+        NlohmannJSONReaderTokenPtr lastToken = stack.top();
+        return lastToken->getNextElementAndIncreaseCnt();
+    }
+
+    nlohmann::json NlohmannJSONReader::getNext()
+    {
+        if (!readInitialStart)
+        {
+            readInitialStart = true;
+            return input;
+        }
+        NlohmannJSONReaderTokenPtr lastToken = stack.top();
+        return lastToken->getNextElement();
+    }
+
+    int NlohmannJSONReader::readStartDict()
+    {
+        nlohmann::json current_json = getNextAndIncrease();
+        int c = current_json.size();
+        auto newToken = std::make_shared<NlohmannJSONReaderToken>(data::eDict, current_json);
+        stack.push(newToken);
+        return c;
+    }
+
+    bool NlohmannJSONReader::readEndDict()
+    {
+        auto token = stack.top();
+        token->assertType(data::eDict);
+
+        if (token->finishedElement())
         {
-            NlohmannJSONReader::NlohmannJSONReader(const nlohmann::json& n) :
-                TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>(n)
-            {
-            }
-
-            NlohmannJSONReader::NlohmannJSONReader(const std::string& n) :
-                TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>(nlohmann::json::parse(n))
-            {
-            }
-
-            nlohmann::json NlohmannJSONReader::getCurrentAndGoToNext()
-            {
-                if (!readInitialStart)
-                {
-                    readInitialStart = true;
-                    return data;
-                }
-                NlohmannJSONReaderTokenPtr lastToken = stack.top();
-                return lastToken->getCurrentElementAndIncreaseCnt();
-            }
-
-            nlohmann::json NlohmannJSONReader::getCurrent()
-            {
-                if (!readInitialStart)
-                {
-                    readInitialStart = true;
-                    return data;
-                }
-                NlohmannJSONReaderTokenPtr lastToken = stack.top();
-                return lastToken->getCurrentElement();
-            }
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    int NlohmannJSONReader::readStart##upperType() \
-    { \
-        nlohmann::json current_json = getCurrentAndGoToNext(); \
-        int c = current_json.size(); \
-        NlohmannJSONReaderTokenPtr newToken = NlohmannJSONReaderTokenPtr(new NlohmannJSONReaderToken(data::e##upperType, current_json)); \
-        stack.push(newToken); \
-        return c; \
-    } \
-    \
-    bool NlohmannJSONReader::readEnd##upperType() \
-    { \
-        NlohmannJSONReaderTokenPtr token = stack.top(); \
-        auto desc = token->getDescriptor(); \
-        if (desc != data::Descriptor::e##upperType) \
-        { \
-            throw error::DescriptorNotValidException("NlohmannJSONReader", "readEnd" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \
-            return false; \
-        } \
-        \
-        if (token->checkedAllChildren()) \
-        { \
-            stack.pop(); \
-            return true; \
-        } \
-        return false; \
-    }
-
-            HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
-
-            // Complex Data
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    std::pair<std::vector<int>, std::string> NlohmannJSONReader::readStart##upperType() \
-    { \
-        nlohmann::json j = getCurrent(); \
-        std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; \
-        std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; \
-        return std::make_pair(dims, type); \
-    } \
-    \
-    void NlohmannJSONReader::readEnd##upperType(unsigned char* data) \
-    { \
-        if(data == NULL) \
-        { \
-            throw error::AronException("NlohmannJSONReader", "readEnd" + std::string(#upperType), "The corresponding data pointer of an complex aron ptr is NULL."); \
-        } \
-        nlohmann::json j = getCurrentAndGoToNext(); \
-        std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; \
-        std::vector<unsigned char> d = j[io::Data::READER_WRITER_NDARRAY_DATA_SLUG]; \
-        memcpy(data, d.data(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>())); \
-    }
-
-            HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
-
-            // Read primitives
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    void NlohmannJSONReader::readPrimitive(lowerType& t) \
-    { \
-        nlohmann::json j = getCurrentAndGoToNext(); \
-        t = j; \
-    }
-
-            HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
+
+    int NlohmannJSONReader::readStartList()
+    {
+        nlohmann::json current_json = getNextAndIncrease();
+        int c = current_json.size();
+        auto newToken = std::make_shared<NlohmannJSONReaderToken>(data::eList, current_json);
+        stack.push(newToken);
+        return c;
+    }
+
+    bool NlohmannJSONReader::readEndList()
+    {
+        auto token = stack.top();
+        token->assertType(data::eList);
+
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
+
+    // Complex Data
+    std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readStartNDArray()
+    {
+        nlohmann::json j = getNext();
+        std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
+        std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
+        return {dims, type};
+    }
+
+    bool NlohmannJSONReader::readEndNDArray(unsigned char* data)
+    {
+        if (data == NULL)
+        {
+            throw error::AronException("NlohmannJSONReader", "readEndNDArray", "The corresponding data pointer of an complex aron ptr is NULL.");
+        }
+        nlohmann::json j = getNextAndIncrease();
+        std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
+        std::vector<unsigned char> d = j[io::Data::READER_WRITER_NDARRAY_DATA_SLUG];
+        memcpy(data, d.data(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()));
+        return true;
+    }
+
+    // Read primitives
+    void NlohmannJSONReader::readPrimitive(int& t)
+    {
+        nlohmann::json j = getNextAndIncrease();
+        t = j;
+    }
+
+    void NlohmannJSONReader::readPrimitive(long& t)
+    {
+        nlohmann::json j = getNextAndIncrease();
+        t = j;
+    }
+
+    void NlohmannJSONReader::readPrimitive(float& t)
+    {
+        nlohmann::json j = getNextAndIncrease();
+        t = j;
+    }
+
+    void NlohmannJSONReader::readPrimitive(double& t)
+    {
+        nlohmann::json j = getNextAndIncrease();
+        t = j;
+    }
+
+    void NlohmannJSONReader::readPrimitive(std::string& t)
+    {
+        nlohmann::json j = getNextAndIncrease();
+        t = j;
+    }
+
+    void NlohmannJSONReader::readPrimitive(bool& t)
+    {
+        nlohmann::json j = getNextAndIncrease();
+        t = j;
+    }
+
+    std::string NlohmannJSONReader::readKey()
+    {
+        auto token = stack.top();
+        return token->getCurrentKey();
+    }
+
+    void NlohmannJSONReader::loadMember(const std::string& k)
+    {
+        auto token = stack.top();
+        token->setCurrentKey(k);
+    }
+
+    // Helper functions
+    data::Descriptor NlohmannJSONReader::getTypeOfNext(const type::Descriptor hint) const
+    {
+        auto token = stack.top();
+        return token->getTypeOfNext(hint);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h
index 0b48fe229b1dca5034c618d211153e3b09ccacd5..1ca1810a0c3085e4d53b7a79c934dc1eaa7e1e25 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h
@@ -25,7 +25,7 @@
 #include <stack>
 
 // BaseClass
-#include <RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h>
+#include <RobotAPI/libraries/aron/core/io/dataIO/Reader.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h>
@@ -36,41 +36,43 @@ namespace armarx::aron::dataIO::reader
     typedef std::shared_ptr<NlohmannJSONReader> NlohmannJSONReaderPtr;
 
     class NlohmannJSONReader :
-        virtual public TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>
+        virtual public ReaderInterface
     {
     public:
         using PointerType = NlohmannJSONReaderPtr;
 
-    public:
         // constructors
         NlohmannJSONReader() = delete;
         NlohmannJSONReader(const nlohmann::json& n);
         NlohmannJSONReader(const std::string& n);
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-virtual int  readStart##upperType() override; \
-virtual bool readEnd##upperType() override; \
-
-        HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
+        virtual int readStartDict() override;
+        virtual bool readEndDict() override;
+        virtual int readStartList() override;
+        virtual bool readEndList() override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-virtual std::pair<std::vector<int>, std::string> readStart##upperType() override; \
-virtual void readEnd##upperType(unsigned char*) override; \
+        virtual std::tuple<std::vector<int>, std::string> readStartNDArray() override;
+        virtual bool readEndNDArray(unsigned char*) override;
 
-        HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
+        virtual void readPrimitive(int&) override;
+        virtual void readPrimitive(long&) override;
+        virtual void readPrimitive(float&) override;
+        virtual void readPrimitive(double&) override;
+        virtual void readPrimitive(std::string&) override;
+        virtual void readPrimitive(bool&) override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-virtual void readPrimitive(lowerType&) override; \
+        virtual std::string readKey() override;
+        virtual void loadMember(const std::string&) override;
 
-        HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
+        virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const override;
 
     private:
-        nlohmann::json getCurrent();
-        nlohmann::json getCurrentAndGoToNext();
+        nlohmann::json getNext();
+        nlohmann::json getNextAndIncrease();
 
     private:
+        nlohmann::json input;
+        bool readInitialStart = false;
+        std::stack<NlohmannJSONReaderTokenPtr> stack;
     };
 }
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 5148357520ed5cec05869ed76d9afaf9ec214fcb..d155a2d155027ad03f16a359a903da88dae6776c 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
@@ -34,39 +34,41 @@
 #include <RobotAPI/libraries/aron/core/Config.h>
 #include <RobotAPI/libraries/aron/core/Resolver.h>
 
+
+
 namespace armarx::aron::dataIO::reader
-    {
+{
     // BaseClass
     class NlohmannJSONReaderToken;
     typedef std::shared_ptr<NlohmannJSONReaderToken> NlohmannJSONReaderTokenPtr;
 
     class NlohmannJSONReaderToken :
-        virtual public ReaderToken<nlohmann::json, nlohmann::json>
+        virtual public ReaderTokenInterface<nlohmann::json>
     {
     public:
         using PointerType = NlohmannJSONReaderTokenPtr;
 
-    public:
         // constructors
         NlohmannJSONReaderToken() = delete;
-        NlohmannJSONReaderToken(const data::Descriptor desc, const nlohmann::json& data) :
-            io::ReaderToken<data::Descriptor, nlohmann::json, nlohmann::json>(desc, data),
-            ReaderToken<nlohmann::json, nlohmann::json>(desc, data)
+        NlohmannJSONReaderToken(const data::Descriptor desc, const nlohmann::json& data)
         {
+            descriptor = desc;
+            element = data;
+
             switch (descriptor)
             {
                 case data::eDict:
                 {
                     for (auto it = data.begin(); it != data.end(); ++it)
                     {
-                        allKeys.push_back(it.key());
+                        allMemberNames.push_back(it.key());
                     }
-                    maxIndex = allKeys.size();
+                    childrenSize = data.size();
                     break;
                 }
                 case data::eList:
                 {
-                    maxIndex = data.size();
+                    childrenSize = data.size();
                     break;
                 }
                 default:
@@ -74,9 +76,9 @@ namespace armarx::aron::dataIO::reader
             }
         }
 
-        data::Descriptor getTypeOfNextElement(const type::Descriptor hint) const override
+        data::Descriptor getTypeOfNext(const type::Descriptor hint) const override
         {
-            const nlohmann::json next = getCurrentElement();
+            const nlohmann::json next = getNextElement();
             if (next.is_object())
             {
                 // Check if specific NDArray key exists
@@ -94,15 +96,15 @@ namespace armarx::aron::dataIO::reader
             {
 
                 data::Descriptor d = Resolver::GetFirstIfRelated(
-                                           Resolver::GetCorresponding(hint),
-                                           data::eLong);
+                                         Resolver::GetCorresponding(hint),
+                                         data::eLong);
                 return d;
             }
             if (next.is_number_float())
             {
                 data::Descriptor d = Resolver::GetFirstIfRelated(
-                                           Resolver::GetCorresponding(hint),
-                                           data::eDouble);
+                                         Resolver::GetCorresponding(hint),
+                                         data::eDouble);
                 return d;
             }
             if (next.is_boolean())
@@ -116,13 +118,13 @@ namespace armarx::aron::dataIO::reader
             throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Could not convert to data::Descriptor enum.");
         }
 
-        nlohmann::json getCurrentElement() const override
+        nlohmann::json getNextElement() const override
         {
             switch (descriptor)
             {
                 case data::eDict:
                 {
-                    nlohmann::json ret = element[resolveCurrentKey()];
+                    nlohmann::json ret = element[getCurrentKey()];
                     return ret;
                 }
                 case data::eList:
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp
index 7b756f8d24238b4655348607346c1f1d6e650f71..9f2dd3cd6e470c72698aae1c5c0bdcd948194e53 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp
@@ -31,67 +31,87 @@
 
 
 namespace armarx::aron::dataIO
-        {
+{
+
+    void Visitor::SetupWriterFromAronDataPtr(WriterInterface& writer, const datanavigator::NavigatorPtr& aron)
+    {
+        SetupWriterFromAronDataPtr(writer, aron->getResult());
+    }
 
-            void Visitor::SetupWriterFromAronDataPtr(dataIO::Writer& writer, const datanavigator::NavigatorPtr& aron)
+    void Visitor::SetupWriterFromAronDataPtr(WriterInterface& writer, const data::AronDataPtr& aron)
+    {
+        data::Descriptor desc = Resolver::GetDescriptor(aron);
+        switch (desc)
+        {
+            case data::eDict:
             {
-                SetupWriterFromAronDataPtr(writer, aron->getResult());
+                data::AronDictPtr casted = data::AronDictPtr::dynamicCast(aron);
+                writer.writeStartDict();
+                for (const auto& [key, value] : casted->elements)
+                {
+                    writer.writeKey(key);
+                    Visitor::SetupWriterFromAronDataPtr(writer, value);
+                }
+                writer.writeEndDict();
+                break;
             }
-
-            void Visitor::SetupWriterFromAronDataPtr(dataIO::Writer& writer, const data::AronDataPtr& aron)
+            case data::eList:
             {
-                data::Descriptor desc = Resolver::GetDescriptor(aron);
-                switch (desc)
+                data::AronListPtr casted = data::AronListPtr::dynamicCast(aron);
+                writer.writeStartList();
+                for (const auto& value : casted->elements)
                 {
-                    case data::eDict:
-                    {
-                        data::AronDictPtr casted = data::AronDictPtr::dynamicCast(aron);
-                        writer.writeStartDict();
-                        for (const auto& [key, value] : casted->elements)
-                        {
-                            writer.writeKey(key);
-                            Visitor::SetupWriterFromAronDataPtr(writer, value);
-                        }
-                        writer.writeEndDict();
-                        break;
-                    }
-                    case data::eList:
-                    {
-                        data::AronListPtr casted = data::AronListPtr::dynamicCast(aron);
-                        writer.writeStartList();
-                        for (const auto& value : casted->elements)
-                        {
-                            Visitor::SetupWriterFromAronDataPtr(writer, value);
-                        }
-                        writer.writeEndList();
-                        break;
-                    }
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-case data::e##upperType: \
-{ \
-    data::Aron##upperType##Ptr casted = data::Aron##upperType##Ptr::dynamicCast(aron); \
-    writer.write##upperType(casted->dimensions, casted->type, casted->data.data()); \
-    break; \
-}
-
-                    HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-case data::e##upperType: \
-{ \
-    data::Aron##upperType##Ptr casted = data::Aron##upperType##Ptr::dynamicCast(aron); \
-    writer.writePrimitive(casted->value); \
-    break; \
-}
-
-                    HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
-
-                    default:
-                    {
-                        throw error::DescriptorNotValidException("LegacyAronDataWriter", "SetupWriterFromAronDataPtr", "Data-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc);
-                    }
+                    Visitor::SetupWriterFromAronDataPtr(writer, value);
                 }
+                writer.writeEndList();
+                break;
+            }
+            case data::eNDArray:
+            {
+                data::AronNDArrayPtr casted = data::AronNDArrayPtr::dynamicCast(aron);
+                writer.writeNDArray(casted->dimensions, casted->type, casted->data.data());
+                break;
+            }
+            case data::eInt:
+            {
+                data::AronIntPtr casted = data::AronIntPtr::dynamicCast(aron);
+                writer.writePrimitive(casted->value);
+                break;
+            }
+            case data::eLong:
+            {
+                data::AronLongPtr casted = data::AronLongPtr::dynamicCast(aron);
+                writer.writePrimitive(casted->value);
+                break;
+            }
+            case data::eFloat:
+            {
+                data::AronFloatPtr casted = data::AronFloatPtr::dynamicCast(aron);
+                writer.writePrimitive(casted->value);
+                break;
+            }
+            case data::eDouble:
+            {
+                data::AronDoublePtr casted = data::AronDoublePtr::dynamicCast(aron);
+                writer.writePrimitive(casted->value);
+                break;
+            }
+            case data::eString:
+            {
+                data::AronStringPtr casted = data::AronStringPtr::dynamicCast(aron);
+                writer.writePrimitive(casted->value);
+                break;
+            }
+            case data::eBool:
+            {
+                data::AronBoolPtr casted = data::AronBoolPtr::dynamicCast(aron);
+                writer.writePrimitive(casted->value);
+                break;
+            }
+            default:
+            {
+                throw error::DescriptorNotValidException("LegacyAronDataWriter", "SetupWriterFromAronDataPtr", "Data-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc);
             }
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.h b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.h
index 6aacda826b32b1c5fa7aa4359a04f49cc5d6f984..b45ef50c60207e97e6e29e170df39cf0be237a90 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.h
@@ -41,8 +41,8 @@ namespace armarx::aron::dataIO
         Visitor() = delete;
 
     public:
-        static void SetupWriterFromAronDataPtr(Writer&, const datanavigator::NavigatorPtr&);
-        static void SetupWriterFromAronDataPtr(Writer&, const data::AronDataPtr&);
+        static void SetupWriterFromAronDataPtr(WriterInterface&, const datanavigator::NavigatorPtr&);
+        static void SetupWriterFromAronDataPtr(WriterInterface&, const data::AronDataPtr&);
 
     public:
     };
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h
index f72099f145fd0d178d928c7efb94f23609e1173a..a6a42098d8a198c7aa1ace6751cce3e7130c4cfa 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h
@@ -20,71 +20,3 @@
 
 #pragma once
 
-// STD/STL
-#include <memory>
-#include <string>
-#include <stack>
-
-// BaseClass
-#include <RobotAPI/libraries/aron/core/io/dataIO/Writer.h>
-
-// ArmarX
-#include <RobotAPI/libraries/aron/core/Exception.h>
-
-
-
-namespace armarx::aron::dataIO
-{
-    template <typename GeneratePtr, typename TokenPtr>
-    class TokenizedWriter;
-
-    template <typename GeneratePtr, typename TokenPtr>
-    using TokenizedWriterPtr = std::shared_ptr<TokenizedWriter<GeneratePtr, TokenPtr>>;
-
-    template <typename GeneratePtr, typename TokenPtr>
-    class TokenizedWriter :
-        virtual public Writer
-    {
-    public:
-        TokenizedWriter() = default;
-
-        virtual bool writeKey(const std::string& k) override
-        {
-            TokenPtr token = stack.top();
-            token->setCurrentKey(k);
-            return true;
-        }
-
-        GeneratePtr getResult() const
-        {
-            assertLastRemovedTokenIsSet();
-            assertStackIsEmpty();
-            return lastRemovedToken->getElement();
-        }
-
-    protected:
-        void assertLastRemovedTokenIsSet() const
-        {
-            if (lastRemovedToken == nullptr)
-            {
-                throw error::AronException("ClassWriter", "assertLastRemovedTokenIsSet", "lastRemovedToken is NULL. Perhaps you never called a writeEnd* method?");
-            }
-            if (lastRemovedToken->getElement() == nullptr)
-            {
-                throw error::AronException("ClassWriter", "assertLastRemovedTokenIsSet", "lastRemovedToken->getElement() is NULL.");
-            }
-        }
-        void assertStackIsEmpty() const
-        {
-            if (stack.size() != 0)
-            {
-                throw error::AronException("ClassWriter", "assertStackIsEmpty", "The Size of the stack is not 0. Perhaps you never called a writeEnd* method?");
-            }
-        }
-
-    protected:
-        bool wroteInitialStartContainer = false;
-        TokenPtr lastRemovedToken = nullptr;
-        std::stack<TokenPtr> stack;
-    };
-}
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/WriterToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/WriterToken.h
index e5b84742bb6ddc365bd40ce3dcee6743ab93d7e2..f68311c85584db53e2401923e7eccbf6949dbbde 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/WriterToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/WriterToken.h
@@ -29,46 +29,69 @@
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Config.h>
-#include <RobotAPI/libraries/aron/core/Descriptor.h>
+#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/aron/core/io/Data.h>
 
 namespace armarx::aron::dataIO
 {
-    template<typename ElementTypename, typename ElementAddTypename>
-    class WriterToken;
+    template<typename ElementTypename>
+    class WriterTokenInterface;
 
-    template<typename ElementTypename, typename ElementAddTypename>
-    using WriterTokenPtr = std::shared_ptr<WriterToken<ElementTypename, ElementAddTypename>>;
+    template<typename ElementTypename>
+    using WriterTokenPtr = std::shared_ptr<WriterTokenInterface<ElementTypename>>;
 
-    template<typename ElementTypename, typename ElementAddTypename>
-    class WriterToken :
-        virtual public io::WriterToken<data::Descriptor, ElementTypename, ElementAddTypename>
+    template<typename ElementTypename>
+    class WriterTokenInterface
     {
     public:
-        using PointerType = WriterToken<ElementTypename, ElementAddTypename>;
+        using PointerType = WriterTokenInterface<ElementTypename>;
 
-    public:
-        // constructor
-        WriterToken() = delete;
-        WriterToken(const data::Descriptor desc, const ElementTypename& n) :
-            io::WriterToken<data::Descriptor, ElementTypename, ElementAddTypename>(desc, n)
-        {}
+        // Interface
+        virtual void addElement(const ElementTypename&) = 0;
 
-        // public member functions
-        virtual void addElement(const ElementAddTypename&) override = 0;
+        // General implementation
+        void setCurrentKey(const std::string& s)
+        {
+            if (s.empty())
+            {
+                throw error::AronException("AronWriterToken", "setCurrentKey", "The passed key is empty.");
+            }
+            currentKey = s;
+        }
 
-        virtual std::string toElementAccessor() const override
+        ElementTypename getElement() const
         {
-            switch (this->descriptor)
+            return element;
+        }
+
+        data::Descriptor getDescriptor() const
+        {
+            return descriptor;
+        }
+
+        std::string toAccessor() const
+        {
+            data::Descriptor desc = this->getDescriptor();
+            switch (desc)
             {
-                case data::Descriptor::eDict:
-                    return this->currentKey;
-                case data::Descriptor::eList:
-                    return std::to_string(this->currentIndex);
+                case data::eDict:
+                    return currentKey;
+                case data::eList:
+                    return std::to_string(currentIndex);
                 default:
-                    throw error::DescriptorNotValidException("ClassWriterToken", "toElementAccessor", "Could not resove a type of a navigator. Allowed are only container and complex types due to performance.", this->descriptor);
+                    throw error::DescriptorNotValidException("NavigatorWriterToken", "toElementAccessor", "Could not resove a type of a navigator. Allowed are only containers.", desc);
             }
         }
 
-    private:
+    protected:
+        // members
+        data::Descriptor descriptor = data::eUnknown;
+        ElementTypename element;
+
+        // current index
+        unsigned int currentIndex = 0;
+
+        // current key
+        std::string currentKey = "";
     };
 }
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 25cb9335f9843315ba00631bfdc13182c0173361..adebb69a3a86875ac18e9854c96256c01458a9a3 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
@@ -31,79 +31,135 @@
 
 
 namespace armarx::aron::dataIO::writer
+{
+
+    Path NavigatorWriter::generatePath()
+    {
+        Path path;
+        if (!wroteInitialStartContainer)
+        {
+            wroteInitialStartContainer = true;
+        }
+        else
+        {
+            auto parent_token = stack.top();
+            path = Path(parent_token->getElement()->getPath(), parent_token->toAccessor());
+        }
+        return path;
+    }
+
+    // Containers
+    void NavigatorWriter::writeStartDict()
+    {
+        Path path = generatePath();
+        auto data = std::make_shared<datanavigator::DictNavigator>(path);
+        auto new_token = std::make_shared<NavigatorWriterToken>(data::eDict, data);
+        stack.push(new_token);
+    }
+
+    void NavigatorWriter::writeEndDict()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
         {
+            NavigatorWriterTokenPtr prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
 
-            Path NavigatorWriter::generatePath()
-            {
-                Path path;
-                if (!wroteInitialStartContainer)
-                {
-                    wroteInitialStartContainer = true;
-                }
-                else
-                {
-                    NavigatorWriterTokenPtr parent_token = stack.top();
-                    path = Path(parent_token->getElement()->getPath(), parent_token->toElementAccessor());
-                }
-                return path;
-            }
-
-            // Containers
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NavigatorWriter::writeStart##upperType() \
-    { \
-        Path path = generatePath(); \
-        datanavigator::upperType##NavigatorPtr data = datanavigator::upperType##NavigatorPtr(new datanavigator::upperType##Navigator(path)); \
-        NavigatorWriterTokenPtr new_token = NavigatorWriterTokenPtr(new NavigatorWriterToken(data->getDescriptor(), data)); \
-        stack.push(new_token); \
-        return true; \
-    } \
-    \
-    bool NavigatorWriter::writeEnd##upperType() \
-    { \
-        lastRemovedToken = stack.top(); \
-        stack.pop(); \
-        \
-        if (stack.size() > 0) \
-        { \
-            NavigatorWriterTokenPtr prevToken = stack.top(); \
-            prevToken->addElement(lastRemovedToken->getElement()); \
-        } \
-        return true; \
+    void NavigatorWriter::writeStartList()
+    {
+        Path path = generatePath();
+        auto data = std::make_shared<datanavigator::ListNavigator>(path);
+        auto new_token = std::make_shared<NavigatorWriterToken>(data::eList, data);
+        stack.push(new_token);
     }
 
-            HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
-
-            // Complex Types
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NavigatorWriter::write##upperType(const std::vector<int>& dims, const std::string& t, const unsigned char* data) \
-    { \
-        Path path = generatePath(); \
-        NavigatorWriterTokenPtr token = stack.top(); \
-        datanavigator::upperType##NavigatorPtr aron(new datanavigator::upperType##Navigator(path)); \
-        aron->setDimensions(dims); \
-        aron->setType(t); \
-        aron->setData(std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()), data); \
-        token->addElement(aron); \
-        return true; \
+    void NavigatorWriter::writeEndList()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
+        {
+            NavigatorWriterTokenPtr prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
     }
 
-            HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
+    // Complex Types
+    void NavigatorWriter::writeNDArray(const std::vector<int>& dims, const std::string& t, const unsigned char* data)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        datanavigator::NDArrayNavigatorPtr aron(new datanavigator::NDArrayNavigator(path));
+        aron->setDimensions(dims);
+        aron->setType(t);
+        aron->setData(std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()), data);
+        token->addElement(aron);
+    }
 
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NavigatorWriter::writePrimitive(const lowerType& x) \
-    { \
-        Path path = generatePath(); \
-        NavigatorWriterTokenPtr token = stack.top(); \
-        datanavigator::upperType##NavigatorPtr aron(new datanavigator::upperType##Navigator(path)); \
-        aron->setValue(x); \
-        token->addElement(aron); \
-        return true; \
+    // Primitive Types
+    void NavigatorWriter::writePrimitive(const int x)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        auto aron = std::make_shared<datanavigator::IntNavigator>(path);
+        aron->setValue(x);
+        token->addElement(aron);
     }
 
-            HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
+    void NavigatorWriter::writePrimitive(const long x)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        auto aron = std::make_shared<datanavigator::LongNavigator>(path);
+        aron->setValue(x);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writePrimitive(const float x)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        auto aron = std::make_shared<datanavigator::FloatNavigator>(path);
+        aron->setValue(x);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writePrimitive(const double x)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        auto aron = std::make_shared<datanavigator::DoubleNavigator>(path);
+        aron->setValue(x);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writePrimitive(const std::string& x)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        auto aron = std::make_shared<datanavigator::StringNavigator>(path);
+        aron->setValue(x);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writePrimitive(const bool x)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        auto aron = std::make_shared<datanavigator::BoolNavigator>(path);
+        aron->setValue(x);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeKey(const std::string& k)
+    {
+        auto token = stack.top();
+        token->setCurrentKey(k);
+    }
 }
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 4c4d58cc921de0a2be862ba0c7b9e3ff90907a8e..3467d630a3301e4ed962f4529057d4be4089a4b5 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
@@ -25,7 +25,7 @@
 #include <stack>
 
 // BaseClass
-#include <RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h>
+#include <RobotAPI/libraries/aron/core/io/dataIO/Writer.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Concepts.h>
@@ -38,31 +38,38 @@ namespace armarx::aron::dataIO::writer
     typedef std::shared_ptr<NavigatorWriter> NavigatorWriterPtr;
 
     class NavigatorWriter :
-        virtual public TokenizedWriter<datanavigator::NavigatorPtr, NavigatorWriterTokenPtr>
+        virtual public WriterInterface
     {
     public:
         NavigatorWriter() = default;
 
-    #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writeStart##upperType() override; \
-    virtual bool writeEnd##upperType() override;
+        virtual void writeStartDict() override;
+        virtual void writeEndDict() override;
+        virtual void writeStartList() override;
+        virtual void writeEndList() override;
 
-        HANDLE_CONTAINER_DATA
-    #undef RUN_ARON_MACRO
+        virtual void writeNDArray(const std::vector<int>&, const std::string&, const unsigned char*) override;
 
-    #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool write##upperType(const std::vector<int>&, const std::string&, const unsigned char*) override; \
+        virtual void writePrimitive(const int) override;
+        virtual void writePrimitive(const long) override;
+        virtual void writePrimitive(const float) override;
+        virtual void writePrimitive(const double) override;
+        virtual void writePrimitive(const std::string&) override;
+        virtual void writePrimitive(const bool) override;
 
-        HANDLE_COMPLEX_DATA
-    #undef RUN_ARON_MACRO
+        virtual void writeKey(const std::string&) override;
 
-    #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writePrimitive(const lowerType&) override;
-
-        HANDLE_PRIMITIVE_DATA
-    #undef RUN_ARON_MACRO
+        datanavigator::NavigatorPtr getResult() const
+        {
+            return lastRemovedToken->getElement();
+        }
 
     private:
         Path generatePath();
+
+    private:
+        bool wroteInitialStartContainer = false;
+        NavigatorWriterTokenPtr lastRemovedToken = nullptr;
+        std::stack<NavigatorWriterTokenPtr> stack;
     };
 }
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 89778188cfac0130de989463e11e3d2bf66401aa..8f10dd89e20a4ad0d606a6b2054d152679a76bee 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
@@ -33,49 +33,46 @@
 
 namespace armarx::aron::dataIO::writer
 {
-class NavigatorWriterToken;
-typedef std::shared_ptr<NavigatorWriterToken> NavigatorWriterTokenPtr;
+    class NavigatorWriterToken;
+    typedef std::shared_ptr<NavigatorWriterToken> NavigatorWriterTokenPtr;
 
-class NavigatorWriterToken :
-    virtual public WriterToken<datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>
-{
-public:
-    using PointerType = NavigatorWriterTokenPtr;
-
-public:
-    // constructor
-    NavigatorWriterToken() = delete;
-    NavigatorWriterToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& d) :
-        io::WriterToken<data::Descriptor, datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>(desc, d),
-        WriterToken<datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>(desc, d)
+    class NavigatorWriterToken :
+        virtual public WriterTokenInterface<datanavigator::NavigatorPtr>
     {
+    public:
+        using PointerType = NavigatorWriterTokenPtr;
 
-    }
+    public:
+        // constructor
+        NavigatorWriterToken() = delete;
+        NavigatorWriterToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& d)
+        {
+            descriptor = desc;
+            element = d;
+        }
 
-    // public member functions
-    virtual void addElement(const datanavigator::NavigatorPtr& n) override
-    {
-        auto desc = this->getDescriptor();
-        switch (desc)
+        // public member functions
+        virtual void addElement(const datanavigator::NavigatorPtr& n) override
         {
-            case data::Descriptor::eDict:
-            {
-                datanavigator::DictNavigatorPtr casted = datanavigator::DictNavigator::DynamicCastAndCheck(element);
-                casted->addElement(currentKey, n);
-                break;
-            }
-            case data::Descriptor::eList:
+            auto desc = this->getDescriptor();
+            switch (desc)
             {
-                datanavigator::ListNavigatorPtr casted = datanavigator::ListNavigator::DynamicCastAndCheck(element);
-                casted->addElement(n);
-                currentIndex++;
-                break;
+                case data::Descriptor::eDict:
+                {
+                    datanavigator::DictNavigatorPtr casted = datanavigator::DictNavigator::DynamicCastAndCheck(element);
+                    casted->addElement(currentKey, n);
+                    break;
+                }
+                case data::Descriptor::eList:
+                {
+                    datanavigator::ListNavigatorPtr casted = datanavigator::ListNavigator::DynamicCastAndCheck(element);
+                    casted->addElement(n);
+                    currentIndex++;
+                    break;
+                }
+                default:
+                    throw error::DescriptorNotValidException("NavigatorWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers. The path was: " + element->pathToString(), desc);
             }
-            default:
-                throw error::DescriptorNotValidException("NavigatorWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers. The path was: " + element->pathToString(), desc);
         }
-    }
-
-private:
-};
+    };
 }
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 1ec5b749a8c2d0f8cdbd8e1d8c4839614090b59c..e57ee04fd96febf4aeeb128385ac14dce87d9217 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
@@ -26,63 +26,108 @@
 #include "NlohmannJSONWriter.h"
 
 namespace armarx::aron::dataIO::writer
+{
+
+    // Containers
+    void NlohmannJSONWriter::writeStartDict()
+    {
+        nlohmann::json data;
+        auto new_token = std::make_shared<NlohmannJSONWriterToken>(data::eDict, data);
+        stack.push(new_token);
+    }
+
+    void NlohmannJSONWriter::writeEndDict()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
         {
+            auto prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
 
-            // Containers
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NlohmannJSONWriter::writeStart##upperType() \
-    { \
-        nlohmann::json data; \
-        NlohmannJSONWriterTokenPtr new_token = NlohmannJSONWriterTokenPtr(new NlohmannJSONWriterToken(data::Descriptor::e##upperType, data)); \
-        stack.push(new_token); \
-        return true; \
-    } \
-    \
-    bool NlohmannJSONWriter::writeEnd##upperType() \
-    { \
-        lastRemovedToken = stack.top(); \
-        stack.pop(); \
-        \
-        if (stack.size() > 0) \
-        { \
-            NlohmannJSONWriterTokenPtr prevToken = stack.top(); \
-            prevToken->addElement(lastRemovedToken->getElement()); \
-        } \
-        return true; \
+    void NlohmannJSONWriter::writeStartList()
+    {
+        nlohmann::json data;
+        auto new_token = std::make_shared<NlohmannJSONWriterToken>(data::eList, data);
+        stack.push(new_token);
     }
 
-            HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
-
-            // Complex Types
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NlohmannJSONWriter::write##upperType(const std::vector<int>& dims, const std::string& t, const unsigned char* data) \
-    { \
-        NlohmannJSONWriterTokenPtr token = stack.top(); \
-        nlohmann::json j; \
-        j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims; \
-        j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; \
-        int elements = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()); \
-        std::vector<unsigned char> d = std::vector<unsigned char>(elements); \
-        memcpy(d.data(), data, elements); \
-        j[io::Data::READER_WRITER_NDARRAY_DATA_SLUG] = d; \
-        token->addElement(j); \
-        return true; \
+    void NlohmannJSONWriter::writeEndList()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
+        {
+            auto prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
     }
 
-            HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
+    // Complex Types
+    void NlohmannJSONWriter::writeNDArray(const std::vector<int>& dims, const std::string& t, const unsigned char* data) \
+    {
+        NlohmannJSONWriterTokenPtr token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims;
+        j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
+        int elements = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>());
+        std::vector<unsigned char> d = std::vector<unsigned char>(elements);
+        memcpy(d.data(), data, elements);
+        j[io::Data::READER_WRITER_NDARRAY_DATA_SLUG] = d;
+        token->addElement(j);
+    }
+
+    // Primitive
+    void NlohmannJSONWriter::writePrimitive(const int x)
+    {
+        auto token = stack.top();
+        nlohmann::json j(x);
+        token->addElement(j);
+    }
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NlohmannJSONWriter::writePrimitive(const lowerType& x) \
-    { \
-        NlohmannJSONWriterTokenPtr token = stack.top(); \
-        nlohmann::json j(x); \
-        token->addElement(j); \
-        return true; \
+    void NlohmannJSONWriter::writePrimitive(const long x)
+    {
+        auto token = stack.top();
+        nlohmann::json j(x);
+        token->addElement(j);
     }
 
-            HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
+    void NlohmannJSONWriter::writePrimitive(const float x)
+    {
+        auto token = stack.top();
+        nlohmann::json j(x);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writePrimitive(const double x)
+    {
+        auto token = stack.top();
+        nlohmann::json j(x);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writePrimitive(const std::string& x)
+    {
+        auto token = stack.top();
+        nlohmann::json j(x);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writePrimitive(const bool x)
+    {
+        auto token = stack.top();
+        nlohmann::json j(x);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeKey(const std::string& k)
+    {
+        auto token = stack.top();
+        token->setCurrentKey(k);
+    }
 
 }
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 0407c6386261776f2bffa5ad89e41f18decc2cab..f36fa55d53127a2c79a6d0b9629718a24cb2070c 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
@@ -26,7 +26,7 @@
 #include <sstream>
 
 // Base Class
-#include <RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h>
+#include <RobotAPI/libraries/aron/core/io/dataIO/Writer.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Concepts.h>
@@ -34,34 +34,39 @@
 
 namespace armarx::aron::dataIO::writer
 {
-            class NlohmannJSONWriter;
-            typedef std::shared_ptr<NlohmannJSONWriter> NlohmannJSONWriterPtr;
+    class NlohmannJSONWriter;
+    typedef std::shared_ptr<NlohmannJSONWriter> NlohmannJSONWriterPtr;
 
-            class NlohmannJSONWriter :
-                virtual public TokenizedWriter<nlohmann::json, NlohmannJSONWriterTokenPtr>
-            {
-            public:
-                NlohmannJSONWriter() = default;
+    class NlohmannJSONWriter :
+        virtual public WriterInterface
+    {
+    public:
+        NlohmannJSONWriter() = default;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writeStart##upperType() override; \
-    virtual bool writeEnd##upperType() override;
+        virtual void writeStartDict() override;
+        virtual void writeEndDict() override;
+        virtual void writeStartList() override;
+        virtual void writeEndList() override;
 
-                HANDLE_CONTAINER_DATA
-#undef RUN_ARON_MACRO
+        virtual void writeNDArray(const std::vector<int>&, const std::string&, const unsigned char*) override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool write##upperType(const std::vector<int>&, const std::string&, const unsigned char*) override; \
+        virtual void writePrimitive(const int) override;
+        virtual void writePrimitive(const long) override;
+        virtual void writePrimitive(const float) override;
+        virtual void writePrimitive(const double) override;
+        virtual void writePrimitive(const std::string&) override;
+        virtual void writePrimitive(const bool) override;
 
-                HANDLE_COMPLEX_DATA
-#undef RUN_ARON_MACRO
+        virtual void writeKey(const std::string&) override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writePrimitive(const lowerType&) override;
+        nlohmann::json getResult() const
+        {
+            return lastRemovedToken->getElement();
+        }
 
-                HANDLE_PRIMITIVE_DATA
-#undef RUN_ARON_MACRO
-
-            private:
-            };
+    private:
+        bool wroteInitialStartContainer = false;
+        NlohmannJSONWriterTokenPtr lastRemovedToken = nullptr;
+        std::stack<NlohmannJSONWriterTokenPtr> stack;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h
index 4cbb9c1623c8499e906a856af98a4956da6c365a..9f37b4993a86c7006cfe8ad98b40ea006c09ff53 100644
--- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h
@@ -39,7 +39,7 @@ namespace armarx::aron::dataIO::writer
     typedef std::shared_ptr<NlohmannJSONWriterToken> NlohmannJSONWriterTokenPtr;
 
     class NlohmannJSONWriterToken :
-        virtual public WriterToken<nlohmann::json, nlohmann::json>
+        virtual public WriterTokenInterface<nlohmann::json>
     {
     public:
         using PointerType = NlohmannJSONWriterTokenPtr;
@@ -47,11 +47,10 @@ namespace armarx::aron::dataIO::writer
     public:
         // constructor
         NlohmannJSONWriterToken() = delete;
-        NlohmannJSONWriterToken(const data::Descriptor desc, const nlohmann::json& d) :
-            io::WriterToken<data::Descriptor, nlohmann::json, nlohmann::json>(desc, d),
-            WriterToken<nlohmann::json, nlohmann::json>(desc, d)
+        NlohmannJSONWriterToken(const data::Descriptor desc, const nlohmann::json& d)
         {
-
+            descriptor = desc;
+            element = d;
         }
 
         // public member functions
@@ -75,7 +74,5 @@ namespace armarx::aron::dataIO::writer
                     throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "addElement", "Could not resove a type of a token. Allowed are only containers.", desc);
             }
         }
-
-    private:
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/Reader.h b/source/RobotAPI/libraries/aron/core/io/typeIO/Reader.h
index e66ea6053f5857c8b7ec0a8f92639ce13232f785..738b4c351b068bbfc54b363cf68901dbb6035837 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/Reader.h
@@ -1,4 +1,4 @@
-/*
+/*
 * This file is part of ArmarX.
 *
 * ArmarX is free software; you can redistribute it and/or modify
@@ -25,48 +25,51 @@
 #include <string>
 
 // ArmarX
-#include <ArmarXCore/core/exceptions/Exception.h>
+#include <RobotAPI/interface/aron.h>
+#include <RobotAPI/libraries/aron/core/Exception.h>
 #include <RobotAPI/libraries/aron/core/Config.h>
-#include <RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h>
 
 
 namespace armarx::aron::typeIO
 {
-            class Reader;
-            typedef std::shared_ptr<Reader> ReaderPtr;
+    class ReaderInterface;
+    typedef std::shared_ptr<ReaderInterface> ReaderInterfacePtr;
 
-            class Reader
-            {
-            public:
-                Reader() = default;
+    class ReaderInterface
+    {
+    public:
+        virtual std::tuple<std::string, int> readStartObject() = 0;
+        virtual bool readEndObject() = 0;
+        virtual int readStartList() = 0;
+        virtual bool readEndList() = 0;
+        virtual int readStartDict() = 0;
+        virtual bool readEndDict() = 0;
+        virtual int readStartTuple() = 0;
+        virtual bool readEndTuple() = 0;
+        virtual int readStartPair() = 0;
+        virtual bool readEndPair() = 0;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual int readStart##upperType() = 0; \
-    virtual bool readEnd##upperType() = 0;
+        virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() = 0;
+        virtual std::string readEigenQuaternion() = 0;
+        virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() = 0;
+        virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() = 0;
+        virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() = 0;
+        virtual void readPosition() = 0;
+        virtual void readOrientation() = 0;
+        virtual void readPose() = 0;
 
-                HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
+        virtual void readInt() = 0;
+        virtual void readLong() = 0;
+        virtual void readFloat() = 0;
+        virtual void readDouble() = 0;
+        virtual void readString() = 0;
+        virtual void readBool() = 0;
+        virtual void readTime() = 0;
 
-    virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() = 0;
-    virtual std::string readEigenQuaternion() = 0;
-    virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() = 0;
-    virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() = 0;
-    virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() = 0;
-    virtual void readPosition() = 0;
-    virtual void readOrientation() = 0;
-    virtual void readPose() = 0;
+        virtual std::string readKey() = 0;
+        virtual void loadMember(const std::string&) = 0;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual void read##upperType() = 0;
-
-                HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
-
-                virtual std::string readKey() = 0;
-                virtual bool readKey(const std::string&) = 0;
-                virtual std::string readObjectName() = 0;
-
-                // Helper functions
-                virtual type::Descriptor getTypeOfNextAron() const = 0;
-            };
+        // Helper functions
+        virtual type::Descriptor getTypeOfNext() const = 0;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/Writer.h b/source/RobotAPI/libraries/aron/core/io/typeIO/Writer.h
index 7de05543ad3650590e74625fc57bb78194fd4f3c..552b5fc1a9427357ee9b971115fc49dda89d3745 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/Writer.h
@@ -33,38 +33,40 @@
 
 namespace armarx::aron::typeIO
 {
-            class Writer;
-            typedef std::shared_ptr<Writer> TypeWriterPtr;
+    class WriterInterface;
+    typedef std::shared_ptr<WriterInterface> WriterInterfacePtr;
 
-            class Writer
-            {
-            public:
-                Writer() = default;
+    class WriterInterface
+    {
+    public:
+        virtual void writeStartObject(const std::string&) = 0;
+        virtual void writeEndObject() = 0;
+        virtual void writeStartList() = 0;
+        virtual void writeEndList() = 0;
+        virtual void writeStartDict() = 0;
+        virtual void writeEndDict() = 0;
+        virtual void writeStartTuple() = 0;
+        virtual void writeEndTuple() = 0;
+        virtual void writeStartPair() = 0;
+        virtual void writeEndPair() = 0;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writeStart##upperType() = 0; \
-    virtual bool writeEnd##upperType() = 0;
+        virtual void writeEigenMatrix(const std::vector<int>&, const std::string&) = 0;
+        virtual void writeEigenQuaternion(const std::string&) = 0;
+        virtual void writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) = 0;
+        virtual void writeOpenCVMat(const std::vector<int>&, const std::string&) = 0;
+        virtual void writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) = 0;
+        virtual void writePosition() = 0;
+        virtual void writeOrientation() = 0;
+        virtual void writePose() = 0;
 
-                HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
+        virtual void writeInt() = 0;
+        virtual void writeLong() = 0;
+        virtual void writeFloat() = 0;
+        virtual void writeDouble() = 0;
+        virtual void writeString() = 0;
+        virtual void writeBool() = 0;
+        virtual void writeTime() = 0;
 
-    virtual bool writeEigenMatrix(const std::vector<int>&, const std::string&) = 0;
-    virtual bool writeEigenQuaternion(const std::string&) = 0;
-    virtual bool writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) = 0;
-    virtual bool writeOpenCVMat(const std::vector<int>&, const std::string&) = 0;
-    virtual bool writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) = 0;
-    virtual bool writePosition() = 0;
-    virtual bool writeOrientation() = 0;
-    virtual bool writePose() = 0;
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool write##upperType() = 0;
-
-                HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
-
-                //virtual std::string readKey() = 0;
-                virtual bool writeKey(const std::string&) = 0;
-                virtual bool writeObjectName(const std::string&) = 0;
-            };
+        virtual void writeKey(const std::string&) = 0;
+    };
 }
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 8bcde495e4b9af364cc21e297b423ceb2796cef9..b9aca9ffceea3bbae3fbd76794112bdca58379d8 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp
@@ -26,131 +26,158 @@
 #include "Converter.h"
 
 namespace armarx::aron::typeIO
+{
+    void Converter::ConvertFromReader(ReaderInterface& reader, WriterInterface& writer)
+    {
+        type::Descriptor desc = reader.getTypeOfNext();
+        switch (desc)
         {
-            void Converter::ConvertFromReader(Reader& reader, Writer& writer)
+            case type::eObject:
             {
-                type::Descriptor desc = reader.getTypeOfNextAron();
-                switch (desc)
-                {
-                case type::eObject:
-                {
-                    const int elements = reader.readStartObject();
-                    const std::string name = reader.readObjectName();
-
-                    writer.writeStartObject();
-                    writer.writeObjectName(name);
+                const auto [name, elements] = reader.readStartObject();
+                writer.writeStartObject(name);
 
-                    for (int i = 0; i < elements; ++i)
-                    {
-                        std::string key = reader.readKey();
-                        writer.writeKey(key);
-                        Converter::ConvertFromReader(reader, writer);
-                    }
-
-                    writer.writeEndObject();
-                    reader.readEndObject();
-                    break;
-                }
-                case type::eDict:
+                for (int i = 0; i < elements; ++i)
                 {
-                    reader.readStartDict();
-                    writer.writeStartDict();
-
+                    std::string key = reader.readKey();
+                    writer.writeKey(key);
                     Converter::ConvertFromReader(reader, writer);
-
-                    writer.writeEndDict();
-                    reader.readEndDict();
-                    break;
                 }
-                case type::eTuple:
-                {
-                    int elements = reader.readStartTuple();
-                    writer.writeStartTuple();
 
-                    for (int i = 0; i < elements; ++i)
-                    {
-                        Converter::ConvertFromReader(reader, writer);
-                    }
+                writer.writeEndObject();
+                reader.readEndObject();
+                break;
+            }
+            case type::eDict:
+            {
+                reader.readStartDict();
+                writer.writeStartDict();
 
-                    writer.writeEndTuple();
-                    reader.readEndTuple();
-                    break;
-                }
-                case type::eList:
-                {
-                    reader.readStartList();
-                    writer.writeStartList();
+                Converter::ConvertFromReader(reader, writer);
 
-                    Converter::ConvertFromReader(reader, writer);
+                writer.writeEndDict();
+                reader.readEndDict();
+                break;
+            }
+            case type::eTuple:
+            {
+                int elements = reader.readStartTuple();
+                writer.writeStartTuple();
 
-                    writer.writeEndList();
-                    reader.readEndList();
-                    break;
-                }
-                case type::eEigenMatrix:
-                {
-                    auto x = reader.readEigenMatrix();
-                    writer.writeEigenMatrix(std::get<0>(x), std::get<1>(x));
-                    break;
-                }
-                case type::eEigenQuaternion:
-                {
-                    auto x = reader.readEigenQuaternion();
-                    writer.writeEigenQuaternion(x);
-                    break;
-                }
-                case type::eIVTCByteImage:
-                {
-                    auto x = reader.readIVTCByteImage();
-                    writer.writeIVTCByteImage(std::get<0>(x), std::get<1>(x), std::get<2>(x));
-                    break;
-                }
-                case type::eOpenCVMat:
-                {
-                    auto x = reader.readOpenCVMat();
-                    writer.writeOpenCVMat(std::get<0>(x), std::get<1>(x));
-                    break;
-                }
-                case type::ePCLPointCloud:
-                {
-                    auto x = reader.readPCLPointCloud();
-                    writer.writePCLPointCloud(std::get<0>(x), std::get<1>(x), std::get<2>(x));
-                    break;
-                }
-                case type::ePosition:
+                for (int i = 0; i < elements; ++i)
                 {
-                    reader.readPosition();
-                    writer.writePosition();
-                    break;
-                }
-                case type::eOrientation:
-                {
-                    reader.readOrientation();
-                    writer.writeOrientation();
-                    break;
-                }
-                case type::ePose:
-                {
-                    reader.readPose();
-                    writer.writePose();
-                    break;
+                    Converter::ConvertFromReader(reader, writer);
                 }
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-case type::e##upperType: \
-{ \
-    reader.read##upperType(); \
-    writer.write##upperType(); \
-    break; \
-}
+                writer.writeEndTuple();
+                reader.readEndTuple();
+                break;
+            }
+            case type::eList:
+            {
+                reader.readStartList();
+                writer.writeStartList();
 
-                    HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+                Converter::ConvertFromReader(reader, writer);
 
-                    default:
-                    {
-                        throw error::DescriptorNotValidException("LegacyAronTypeReader", "SetupReaderAndGetResult", "Type-Type could not be resolved", desc);
-                    }
-                }
+                writer.writeEndList();
+                reader.readEndList();
+                break;
+            }
+            case type::eEigenMatrix:
+            {
+                auto x = reader.readEigenMatrix();
+                writer.writeEigenMatrix(std::get<0>(x), std::get<1>(x));
+                break;
+            }
+            case type::eEigenQuaternion:
+            {
+                auto x = reader.readEigenQuaternion();
+                writer.writeEigenQuaternion(x);
+                break;
+            }
+            case type::eIVTCByteImage:
+            {
+                auto x = reader.readIVTCByteImage();
+                writer.writeIVTCByteImage(std::get<0>(x), std::get<1>(x), std::get<2>(x));
+                break;
+            }
+            case type::eOpenCVMat:
+            {
+                auto x = reader.readOpenCVMat();
+                writer.writeOpenCVMat(std::get<0>(x), std::get<1>(x));
+                break;
+            }
+            case type::ePCLPointCloud:
+            {
+                auto x = reader.readPCLPointCloud();
+                writer.writePCLPointCloud(std::get<0>(x), std::get<1>(x), std::get<2>(x));
+                break;
+            }
+            case type::ePosition:
+            {
+                reader.readPosition();
+                writer.writePosition();
+                break;
+            }
+            case type::eOrientation:
+            {
+                reader.readOrientation();
+                writer.writeOrientation();
+                break;
+            }
+            case type::ePose:
+            {
+                reader.readPose();
+                writer.writePose();
+                break;
+            }
+            case type::eInt:
+            {
+                reader.readInt();
+                writer.writeInt();
+                break;
+            }
+            case type::eLong:
+            {
+                reader.readLong();
+                writer.writeLong();
+                break;
+            }
+            case type::eFloat:
+            {
+                reader.readFloat();
+                writer.writeFloat();
+                break;
+            }
+            case type::eDouble:
+            {
+                reader.readDouble();
+                writer.writeDouble();
+                break;
+            }
+            case type::eString:
+            {
+                reader.readString();
+                writer.writeString();
+                break;
+            }
+            case type::eBool:
+            {
+                reader.readBool();
+                writer.writeBool();
+                break;
+            }
+            case type::eTime:
+            {
+                reader.readTime();
+                writer.writeTime();
+                break;
+            }
+            default:
+            {
+                throw error::DescriptorNotValidException("LegacyAronTypeReader", "ConvertFromReader", "Type could not be resolved", desc);
             }
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h
index 0cf154c351fb908fee17fbb1b6522310fe7d6c77..f1c59c61894ff07dfdea24d1f5682620392ebf35 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h
@@ -25,12 +25,13 @@
 #include <string>
 
 // BaseClass
-#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h>
+
 
 // ArmarX
 #include <RobotAPI/interface/aron.h>
 #include <RobotAPI/libraries/aron/core/navigator/type/Navigator.h>
-#include <RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h>
+#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h>
+#include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h>
 
 
 namespace armarx::aron::typeIO
@@ -44,7 +45,7 @@ namespace armarx::aron::typeIO
         Converter() = delete;
 
     public:
-        static void ConvertFromReader(Reader&, Writer&);
+        static void ConvertFromReader(ReaderInterface&, WriterInterface&);
 
     public:
     };
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h
index 34864822acf7ca03853d3615fed96913de13c7ec..a6a42098d8a198c7aa1ace6751cce3e7130c4cfa 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h
@@ -20,72 +20,3 @@
 
 #pragma once
 
-// STD/STL
-#include <memory>
-#include <string>
-
-// BaseClass
-#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h>
-
-// ArmarX
-#include <RobotAPI/libraries/aron/core/Config.h>
-#include <RobotAPI/libraries/aron/core/Descriptor.h>
-
-namespace armarx::aron::typeIO
-        {
-            template <typename InputTypename, typename TokenPtrTypename>
-            class TokenizedReader;
-
-            template <typename InputTypename, typename TokenPtrTypename>
-            using TokenizedReaderPtr = std::shared_ptr<TokenizedReader<InputTypename, TokenPtrTypename>> ;
-
-            template <typename InputTypename, typename TokenPtrTypename>
-            class TokenizedReader :
-                public Reader
-            {
-            public:
-                TokenizedReader() = delete;
-                TokenizedReader(const InputTypename& input) :
-                    input(input)
-                {
-                }
-
-                // ReadKey
-                std::string readKey() override
-                {
-                    TokenPtrTypename token = stack.top();
-                    std::string k = token->resolveCurrentKey();
-                    return k;
-                }
-
-                bool readKey(const std::string& k) override
-                {
-                    TokenPtrTypename token = stack.top();
-                    token->setCurrentKey(k);
-                    return true;
-                }
-
-                std::string readObjectName() override
-                {
-                    TokenPtrTypename token = stack.top();
-                    return token->getObjectName();
-                }
-
-                virtual type::Descriptor getTypeOfNextAron() const override
-                {
-                    if (stack.empty())
-                    {
-                        // completely unknown. We assume a object on the top level
-                        return type::Descriptor::eObject;
-                    }
-
-                    TokenPtrTypename lastToken = stack.top();
-                    return lastToken->getTypeOfNextElement();
-                }
-
-            protected:
-                InputTypename input;
-                bool readInitialStart = false;
-                std::stack<TokenPtrTypename> stack;
-            };
-}
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/ReaderToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/ReaderToken.h
index aec9e3f5b5607986024525cfb1af8931b0acf557..d0bd996f75fb869bc1a2b2fc879a5e505b1931bd 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/ReaderToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/ReaderToken.h
@@ -23,50 +23,119 @@
 // STD/STL
 #include <memory>
 #include <string>
+#include <vector>
 
 // Base Class
 #include <RobotAPI/libraries/aron/core/io/ReaderToken.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Config.h>
-#include <RobotAPI/libraries/aron/core/Descriptor.h>
+#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/aron/core/io/Data.h>
 
+namespace armarx::aron::typeIO
+{
+    template<typename ElementTypename>
+    class ReaderTokenInterface;
 
+    template<typename ElementTypename>
+    using ReaderTokenInterfacePtr = std::shared_ptr<ReaderTokenInterface<ElementTypename>>;
 
-namespace armarx::aron::typeIO
-        {
-            template<typename ElementReturnPtrTypename, typename ElementAddTypename>
-            class ReaderToken;
+    template<typename ElementTypename>
+    class ReaderTokenInterface
+    {
+    public:
+        using PointerType = ReaderTokenInterfacePtr<ElementTypename>;
 
-            template<typename ElementReturnPtrTypename, typename ElementAddTypename>
-            using ReaderTokenPtr = std::shared_ptr<ReaderToken<ElementReturnPtrTypename, ElementAddTypename>>;
+    public:
+        // Interface
+        virtual type::Descriptor getTypeOfNext() const = 0;
+        virtual ElementTypename getNextElement() const = 0;
 
-            template<typename ElementReturnPtrTypename, typename ElementAddTypename>
-            class ReaderToken :
-                virtual public io::ReaderToken<type::Descriptor, ElementReturnPtrTypename, ElementAddTypename>
+        // General implementation
+        std::string getElementName() const
+        {
+            switch (descriptor)
             {
-            public:
-                using PointerType = ReaderTokenPtr<ElementReturnPtrTypename, ElementAddTypename>;
+                case type::eObject:
+                case type::eIntEnum:
+                {
+                    return elementName;
+                }
+                default:
+                    throw error::DescriptorNotValidException("ReaderTokenInterface", "getElementName", "Could not get object nme of a non-object or non-enum token", descriptor);
+            }
+        }
 
-            public:
-                // constructors
-                ReaderToken() = delete;
-                ReaderToken(const type::Descriptor desc, const ElementAddTypename& type) :
-                    io::ReaderToken<type::Descriptor, ElementReturnPtrTypename, ElementAddTypename>(desc, type)
-                { }
+        type::Descriptor getDescriptor() const
+        {
+            return descriptor;
+        }
+
+        unsigned int getElementChildrenSize() const
+        {
+            return childrenSize;
+        }
+
+        bool finishedElement() const
+        {
+            return currentIndex >= getElementChildrenSize();
+        }
+
+        std::string getCurrentKey() const
+        {
+            assertIndexInBounds();
 
-                bool currentIsEligableForResolvingKey() const override
+            // ugly workaround
+            if (this->currentKey == "") // probably in a dict where the caller does not know which keys are there
+            {
+                if (this->allMemberNames.size() == 0)
                 {
-                    if (this->descriptor == type::Descriptor::eObject)
-                    {
-                        return true;
-                    }
-                    return false;
+                    throw error::AronException("typeIO::ReaderTokenInterface", "getCurrentKey", "The currentKey is not set and the list of all keys is empty!");
                 }
+                return this->allMemberNames[this->currentIndex];
+            }
+            return this->currentKey;
+        }
+
+        void setCurrentKey(const std::string& s)
+        {
+            currentKey = s;
+        }
+
+        void assertType(type::Descriptor t) const
+        {
+            if (getDescriptor() != t)
+            {
+                throw error::DescriptorNotValidException("typeIO::ReaderTokenInterface", "assertType", "The type was not equal.", t);
+            }
+        }
+
+        void assertIndexInBounds() const
+        {
+            if (this->currentIndex >= getElementChildrenSize())
+            {
+                throw error::SizeNotValidException("typeIO::ReaderTokenInterface", "assertIndexInBounds", "Index out of bounds.", this->currentIndex, getElementChildrenSize());
+            }
+        }
+
+        ElementTypename getNextElementAndIncreaseCnt()
+        {
+            ElementTypename next = getNextElement();
+            this->currentIndex++;
+            return next;
+        }
+
+    protected:
+        // members
+        type::Descriptor descriptor = type::eUnknown;
+        ElementTypename element;
+        std::string elementName = "";
 
-                virtual std::string getObjectName() const = 0;
-                virtual type::Descriptor getTypeOfNextElement() const = 0;
+        unsigned int childrenSize = 0;
+        unsigned int currentIndex = 0;
 
-            private:
-            };
+        std::string currentKey = "";
+        std::vector<std::string> allMemberNames = {};
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.cpp
index a2cdd6d27465e4e00c75b72d9f022af52147c249..19a19936f8cc8e01f494c00105735a6556c1ef14 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.cpp
@@ -33,137 +33,250 @@
 
 
 namespace armarx::aron::typeIO::reader
-        {
-            NavigatorReader::NavigatorReader(const typenavigator::NavigatorPtr& n) :
-                TokenizedReader<typenavigator::NavigatorPtr, NavigatorReaderTokenPtr>(n)
-            {
-            }
-
-            NavigatorReader::NavigatorReader(const type::AronTypePtr& n) :
-                TokenizedReader<typenavigator::NavigatorPtr, NavigatorReaderTokenPtr>(typenavigator::Navigator::FromAronType(n))
-            {
-            }
-
-            typenavigator::NavigatorPtr NavigatorReader::getCurrentAndGoToNext()
-            {
-                if (!readInitialStart)
-                {
-                    readInitialStart = true;
-                    return input;
-                }
-                NavigatorReaderTokenPtr lastToken = stack.top();
-                return lastToken->getCurrentElementAndIncreaseCnt();
-            }
-
-            typenavigator::NavigatorPtr NavigatorReader::getCurrent()
-            {
-                if (!readInitialStart)
-                {
-                    readInitialStart = true;
-                    return input;
-                }
-                NavigatorReaderTokenPtr lastToken = stack.top();
-                return lastToken->getCurrentElement();
-            }
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    int NavigatorReader::readStart##upperType() \
-    { \
-        typenavigator::NavigatorPtr current_nav = getCurrentAndGoToNext(); \
-        auto desc = current_nav->getDescriptor(); \
-        if (desc != type::Descriptor::e##upperType) \
-        { \
-            throw error::DescriptorNotValidException("NavigatorReader", "readStart" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \
-            return false; \
-        } \
-        typenavigator::upperType##NavigatorPtr current_nav_casted = typenavigator::upperType##Navigator::DynamicCast(current_nav); \
-        NavigatorReaderTokenPtr newToken = NavigatorReaderTokenPtr(new NavigatorReaderToken(current_nav->getDescriptor(), current_nav_casted)); \
-        stack.push(newToken); \
-        return newToken->getChildrenSize(); \
-    } \
-    \
-    bool NavigatorReader::readEnd##upperType() \
-    { \
-        NavigatorReaderTokenPtr token = stack.top(); \
-        auto desc = token->getDescriptor(); \
-        if (desc != type::Descriptor::e##upperType) \
-        { \
-            throw error::DescriptorNotValidException("NavigatorReader", "readEnd" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \
-            return false; \
-        } \
-        \
-        if (token->checkedAllChildren()) \
-        { \
-            stack.pop(); \
-            return true; \
-        } \
-        return false; \
-    }
-
-            HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
-
-std::tuple<std::vector<int>, std::string> NavigatorReader::readEigenMatrix()
 {
-    typenavigator::NavigatorPtr nav = getCurrentAndGoToNext();
-    typenavigator::EigenMatrixNavigatorPtr casted = typenavigator::EigenMatrixNavigator::DynamicCastAndCheck(nav);
-    return std::make_tuple(casted->getDimensions(), casted->getTypename());
-}
+    NavigatorReader::NavigatorReader(const typenavigator::NavigatorPtr& n) :
+        input(n)
+    {
+    }
 
-std::string NavigatorReader::readEigenQuaternion()
-{
-    typenavigator::NavigatorPtr nav = getCurrentAndGoToNext();
-    typenavigator::EigenMatrixNavigatorPtr casted = typenavigator::EigenMatrixNavigator::DynamicCastAndCheck(nav);
-    return casted->getTypename();
-}
+    NavigatorReader::NavigatorReader(const type::AronTypePtr& n) :
+        input(typenavigator::Navigator::FromAronType(n))
+    {
+    }
 
-std::tuple<unsigned int, unsigned int, std::string> NavigatorReader::readIVTCByteImage()
-{
-    typenavigator::NavigatorPtr nav = getCurrentAndGoToNext();
-    typenavigator::IVTCByteImageNavigatorPtr casted = typenavigator::IVTCByteImageNavigator::DynamicCastAndCheck(nav);
-    return make_tuple(casted->getWidth(), casted->getHeight(), casted->getTypename());
-}
+    typenavigator::NavigatorPtr NavigatorReader::getNextAndIncrease()
+    {
+        if (!readInitialStart)
+        {
+            readInitialStart = true;
+            return input;
+        }
+        NavigatorReaderTokenPtr lastToken = stack.top();
+        return lastToken->getNextElementAndIncreaseCnt();
+    }
 
-std::tuple<std::vector<int>, std::string> NavigatorReader::readOpenCVMat()
-{
-    typenavigator::NavigatorPtr nav = getCurrentAndGoToNext();
-    typenavigator::OpenCVMatNavigatorPtr casted = typenavigator::OpenCVMatNavigator::DynamicCastAndCheck(nav);
-    return make_tuple(casted->getDimensions(), casted->getTypename());
-}
+    std::tuple<std::string, int> NavigatorReader::readStartObject()
+    {
+        auto current_nav = getNextAndIncrease();
+        auto current_nav_casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(current_nav);
+        auto newToken = std::make_shared<NavigatorReaderToken>(type::eObject, current_nav_casted);
+        stack.push(newToken);
+        return {newToken->getElementName(), newToken->getElementChildrenSize()};
+    }
 
-std::tuple<unsigned int, unsigned int, std::string> NavigatorReader::readPCLPointCloud()
-{
-    typenavigator::NavigatorPtr nav = getCurrentAndGoToNext();
-    typenavigator::PCLPointCloudNavigatorPtr casted = typenavigator::PCLPointCloudNavigator::DynamicCastAndCheck(nav);
-    return make_tuple(casted->getWidth(), casted->getHeight(), casted->getTypename());
-}
+    bool NavigatorReader::readEndObject()
+    {
+        auto token = stack.top();
+        token->assertType(type::eObject);
 
-void NavigatorReader::readPosition()
-{
-    getCurrentAndGoToNext();
-    return;
-}
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
 
-void NavigatorReader::readOrientation()
-{
-    getCurrentAndGoToNext();
-    return;
-}
+    int NavigatorReader::readStartDict()
+    {
+        auto current_nav = getNextAndIncrease();
+        auto current_nav_casted = typenavigator::DictNavigator::DynamicCastAndCheck(current_nav);
+        auto newToken = std::make_shared<NavigatorReaderToken>(type::eDict, current_nav_casted);
+        stack.push(newToken);
+        return newToken->getElementChildrenSize();
+    }
 
-void NavigatorReader::readPose()
-{
-    getCurrentAndGoToNext();
-    return;
-}
+    bool NavigatorReader::readEndDict()
+    {
+        auto token = stack.top();
+        token->assertType(type::eDict);
+
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
+
+    int NavigatorReader::readStartList()
+    {
+        auto current_nav = getNextAndIncrease();
+        auto current_nav_casted = typenavigator::ListNavigator::DynamicCastAndCheck(current_nav);
+        auto newToken = std::make_shared<NavigatorReaderToken>(type::eList, current_nav_casted);
+        stack.push(newToken);
+        return newToken->getElementChildrenSize();
+    }
+
+    bool NavigatorReader::readEndList()
+    {
+        auto token = stack.top();
+        token->assertType(type::eList);
+
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
+
+    int NavigatorReader::readStartTuple()
+    {
+        auto current_nav = getNextAndIncrease();
+        auto current_nav_casted = typenavigator::TupleNavigator::DynamicCastAndCheck(current_nav);
+        auto newToken = std::make_shared<NavigatorReaderToken>(type::eTuple, current_nav_casted);
+        stack.push(newToken);
+        return newToken->getElementChildrenSize();
+    }
+
+    bool NavigatorReader::readEndTuple()
+    {
+        auto token = stack.top();
+        token->assertType(type::eTuple);
+
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
 
-            // Read primitives
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    void NavigatorReader::read##upperType() \
-    { \
-        typenavigator::NavigatorPtr nav = getCurrentAndGoToNext(); \
-        typenavigator::upperType##NavigatorPtr casted = typenavigator::upperType##Navigator::DynamicCastAndCheck(nav); \
+    int NavigatorReader::readStartPair()
+    {
+        auto current_nav = getNextAndIncrease();
+        auto current_nav_casted = typenavigator::PairNavigator::DynamicCastAndCheck(current_nav);
+        auto newToken = std::make_shared<NavigatorReaderToken>(type::ePair, current_nav_casted);
+        stack.push(newToken);
+        return newToken->getElementChildrenSize();
     }
 
-            HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+    bool NavigatorReader::readEndPair()
+    {
+        auto token = stack.top();
+        token->assertType(type::ePair);
+
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
+
+    std::tuple<std::vector<int>, std::string> NavigatorReader::readEigenMatrix()
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = typenavigator::EigenMatrixNavigator::DynamicCastAndCheck(nav);
+        return std::make_tuple(casted->getDimensions(), casted->getTypename());
+    }
+
+    std::string NavigatorReader::readEigenQuaternion()
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = typenavigator::EigenMatrixNavigator::DynamicCastAndCheck(nav);
+        return casted->getTypename();
+    }
+
+    std::tuple<unsigned int, unsigned int, std::string> NavigatorReader::readIVTCByteImage()
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = typenavigator::IVTCByteImageNavigator::DynamicCastAndCheck(nav);
+        return make_tuple(casted->getWidth(), casted->getHeight(), casted->getTypename());
+    }
+
+    std::tuple<std::vector<int>, std::string> NavigatorReader::readOpenCVMat()
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = typenavigator::OpenCVMatNavigator::DynamicCastAndCheck(nav);
+        return make_tuple(casted->getDimensions(), casted->getTypename());
+    }
+
+    std::tuple<unsigned int, unsigned int, std::string> NavigatorReader::readPCLPointCloud()
+    {
+        auto nav = getNextAndIncrease();
+        auto casted = typenavigator::PCLPointCloudNavigator::DynamicCastAndCheck(nav);
+        return make_tuple(casted->getWidth(), casted->getHeight(), casted->getTypename());
+    }
+
+    void NavigatorReader::readPosition()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::PositionNavigator::DynamicCastAndCheck(nav);
+    }
+
+    void NavigatorReader::readOrientation()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::OrientationNavigator::DynamicCastAndCheck(nav);
+    }
+
+    void NavigatorReader::readPose()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::PoseNavigator::DynamicCastAndCheck(nav);
+    }
+
+    // Read primitives
+    void NavigatorReader::readInt()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::IntNavigator::DynamicCastAndCheck(nav);
+    }
+
+    void NavigatorReader::readFloat()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::FloatNavigator::DynamicCastAndCheck(nav);
+    }
+
+    void NavigatorReader::readLong()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::LongNavigator::DynamicCastAndCheck(nav);
+    }
+
+    void NavigatorReader::readDouble()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::DoubleNavigator::DynamicCastAndCheck(nav);
+    }
+
+    void NavigatorReader::readString()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::StringNavigator::DynamicCastAndCheck(nav);
+    }
+
+    void NavigatorReader::readBool()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::BoolNavigator::DynamicCastAndCheck(nav);
+    }
+
+    void NavigatorReader::readTime()
+    {
+        auto nav = getNextAndIncrease();
+        typenavigator::TimeNavigator::DynamicCastAndCheck(nav);
+    }
+
+    std::string NavigatorReader::readKey()
+    {
+        auto token = stack.top();
+        return token->getCurrentKey();
+    }
+
+    void NavigatorReader::loadMember(const std::string& k)
+    {
+        auto token = stack.top();
+        token->setCurrentKey(k);
+    }
+
+    // Helper functions
+    type::Descriptor NavigatorReader::getTypeOfNext() const
+    {
+        auto token = stack.top();
+        return token->getTypeOfNext();
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.h
index 43cb65c8738f2c53ff40c97e5a07df107c0b5ec2..0b733ce7cb7bafc9965a6a08c649271c35079028 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.h
@@ -25,7 +25,7 @@
 #include <stack>
 
 // BaseClass
-#include <RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h>
+#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/navigator/type/Navigator.h>
@@ -33,48 +33,63 @@
 
 
 namespace armarx::aron::typeIO::reader
-        {
-            class NavigatorReader;
-            typedef std::shared_ptr<NavigatorReader> NavigatorReaderPtr;
-
-            class NavigatorReader :
-                virtual public TokenizedReader<typenavigator::NavigatorPtr, NavigatorReaderTokenPtr>
-            {
-            public:
-                using PointerType = NavigatorReaderPtr;
-
-            public:
-                // constructors
-                NavigatorReader() = delete;
-                NavigatorReader(const typenavigator::NavigatorPtr& n);
-                NavigatorReader(const type::AronTypePtr& n);
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual int readStart##upperType() override; \
-    virtual bool readEnd##upperType() override;
-
-                HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
-
-    virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() = 0;
-    virtual std::string readEigenQuaternion() = 0;
-    virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() = 0;
-    virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() = 0;
-    virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() = 0;
-    virtual void readPosition() = 0;
-    virtual void readOrientation() = 0;
-    virtual void readPose() = 0;
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual void read##upperType() override;
-
-                HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
-
-            private:
-                typenavigator::NavigatorPtr getCurrentAndGoToNext();
-                typenavigator::NavigatorPtr getCurrent();
-
-            private:
-            };
+{
+    class NavigatorReader;
+    typedef std::shared_ptr<NavigatorReader> NavigatorReaderPtr;
+
+    class NavigatorReader :
+        virtual public ReaderInterface
+    {
+    public:
+        using PointerType = NavigatorReaderPtr;
+
+    public:
+        // constructors
+        NavigatorReader() = delete;
+        NavigatorReader(const typenavigator::NavigatorPtr& n);
+        NavigatorReader(const type::AronTypePtr& n);
+
+
+        virtual std::tuple<std::string, int> readStartObject() override;
+        virtual bool readEndObject() override;
+        virtual int readStartList() override;
+        virtual bool readEndList() override;
+        virtual int readStartDict() override;
+        virtual bool readEndDict() override;
+        virtual int readStartTuple() override;
+        virtual bool readEndTuple() override;
+        virtual int readStartPair() override;
+        virtual bool readEndPair() override;
+
+        virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() override;
+        virtual std::string readEigenQuaternion() override;
+        virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() override;
+        virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() override;
+        virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() override;
+        virtual void readPosition() override;
+        virtual void readOrientation() override;
+        virtual void readPose() override;
+
+        virtual void readInt() override;
+        virtual void readLong() override;
+        virtual void readFloat() override;
+        virtual void readDouble() override;
+        virtual void readString() override;
+        virtual void readBool() override;
+        virtual void readTime() override;
+
+        virtual std::string readKey() override;
+        virtual void loadMember(const std::string&) override;
+
+        // Helper functions
+        virtual type::Descriptor getTypeOfNext() const override;
+
+    private:
+        typenavigator::NavigatorPtr getNextAndIncrease();
+
+    private:
+        typenavigator::NavigatorPtr input;
+        bool readInitialStart = false;
+        std::stack<NavigatorReaderTokenPtr> stack;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReaderToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReaderToken.h
index a22818709fcb5fb6bb513952bad66b8e0e08006f..9c8425ce589d6585bb6a460ea4774b76960707e7 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReaderToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReaderToken.h
@@ -32,105 +32,108 @@
 #include <RobotAPI/libraries/aron/core/navigator/type/AllNavigators.h>
 
 namespace armarx::aron::typeIO::reader
+{
+    class NavigatorReaderToken;
+    typedef std::shared_ptr<NavigatorReaderToken> NavigatorReaderTokenPtr;
+
+    class NavigatorReaderToken :
+        virtual public ReaderTokenInterface<typenavigator::NavigatorPtr>
+    {
+    public:
+        using PointerType = NavigatorReaderTokenPtr;
+
+    public:
+        // constructors
+        NavigatorReaderToken() = delete;
+        NavigatorReaderToken(const type::Descriptor desc, const typenavigator::NavigatorPtr& type)
         {
-            // BaseClass
-            class NavigatorReaderToken;
-            typedef std::shared_ptr<NavigatorReaderToken> NavigatorReaderTokenPtr;
+            descriptor = desc;
+            element = type;
 
-            class NavigatorReaderToken :
-                virtual public ReaderToken<typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>
+            switch (descriptor)
             {
-            public:
-                using PointerType = NavigatorReaderTokenPtr;
-
-            public:
-                // constructors
-                NavigatorReaderToken() = delete;
-                NavigatorReaderToken(const type::Descriptor desc, const typenavigator::NavigatorPtr& type) :
-                    io::ReaderToken<type::Descriptor, typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>(desc, type),
-                    ReaderToken<typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>(desc, type)
+                case type::Descriptor::eObject:
                 {
-                    switch (descriptor)
+                    for (const auto& [key, _] : typenavigator::ObjectNavigator::DynamicCastAndCheck(element)->getMemberTypes())
                     {
-                        case type::Descriptor::eObject:
-                        {
-                            for (const auto& [key, _] : typenavigator::ObjectNavigator::DynamicCast(element)->getMemberTypes())
-                            {
-                                allKeys.push_back(key);
-                            }
-
-                            maxIndex = allKeys.size();
-                            break;
-                        }
-                        case type::Descriptor::eDict:
-                        {
-                            maxIndex = 1;
-                            break;
-                        }
-                        case type::Descriptor::eTuple:
-                        {
-                            maxIndex = typenavigator::TupleNavigator::DynamicCast(element)->getAcceptedTypes().size();
-                            break;
-                        }
-                        case type::Descriptor::eList:
-                        {
-                            maxIndex = 1;
-                            break;
-                        }
-                        default:
-                            throw error::DescriptorNotValidException("NavigatorReaderToken", "NavigatorReaderToken", "Received an invalid instance for a reader token.", desc);
+                        allMemberNames.push_back(key);
                     }
+                    childrenSize = type->childrenSize();
+                    break;
                 }
-
-                std::string getObjectName() const override
+                case type::Descriptor::eDict:
                 {
-                    if(descriptor == type::Descriptor::eObject)
-                    {
-                        const typenavigator::ObjectNavigatorPtr next = typenavigator::ObjectNavigator::DynamicCastAndCheck(getCurrentElement());
-                        return next->getObjectName();
-                    }
-                    throw error::DescriptorNotValidException("NavigatorReaderToken", "NavigatorReaderToken", "Could not get object nme of a non-object token", descriptor);
+                    typenavigator::DictNavigator::DynamicCastAndCheck(element);
+                    childrenSize = 1;
+                    break;
                 }
-
-                type::Descriptor getTypeOfNextElement() const override
+                case type::Descriptor::eTuple:
+                {
+                    typenavigator::TupleNavigator::DynamicCastAndCheck(element);
+                    childrenSize = type->childrenSize();
+                    break;
+                }
+                case type::Descriptor::eList:
                 {
-                    const typenavigator::NavigatorPtr next = getCurrentElement();
-                    return next->getDescriptor();
+                    typenavigator::ListNavigator::DynamicCastAndCheck(element);
+                    childrenSize = 1;
+                    break;
                 }
+                case type::Descriptor::ePair:
+                {
+                    typenavigator::PairNavigator::DynamicCastAndCheck(element);
+                    childrenSize = 2;
+                    break;
+                }
+                default:
+                    throw error::DescriptorNotValidException("NavigatorReaderToken", "NavigatorReaderToken", "Received an invalid instance for a reader token.", desc);
+            }
+        }
+
+        type::Descriptor getTypeOfNext() const override
+        {
+            const typenavigator::NavigatorPtr next = getNextElement();
+            return next->getDescriptor();
+        }
+
+        typenavigator::NavigatorPtr getNextElement() const override
+        {
+            assertIndexInBounds();
 
-                typenavigator::NavigatorPtr getCurrentElement() const override
+            switch (descriptor)
+            {
+                case type::Descriptor::eObject:
                 {
-                    switch (descriptor)
+                    typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(element);
+                    return casted->getMemberType(getCurrentKey());
+                }
+                case type::Descriptor::eDict:
+                {
+                    typenavigator::DictNavigatorPtr casted = typenavigator::DictNavigator::DynamicCastAndCheck(element);
+                    return casted->getAcceptedType();
+                }
+                case type::Descriptor::eTuple:
+                {
+                    typenavigator::TupleNavigatorPtr casted = typenavigator::TupleNavigator::DynamicCastAndCheck(element);
+                    return casted->getAcceptedType(currentIndex);
+                }
+                case type::Descriptor::eList:
+                {
+                    typenavigator::ListNavigatorPtr casted = typenavigator::ListNavigator::DynamicCastAndCheck(element);
+                    return casted->getAcceptedType();
+                }
+                case type::Descriptor::ePair:
+                {
+                    typenavigator::PairNavigatorPtr casted = typenavigator::PairNavigator::DynamicCastAndCheck(element);
+                    if (currentIndex == 0)
                     {
-                        case type::Descriptor::eObject:
-                        {
-                            typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(element);
-                            typenavigator::NavigatorPtr ret = casted->getMemberType(resolveCurrentKey());
-                            return ret;
-                        }
-                        case type::Descriptor::eDict:
-                        {
-                            typenavigator::DictNavigatorPtr casted = typenavigator::DictNavigator::DynamicCastAndCheck(element);
-                            typenavigator::NavigatorPtr ret = casted->getAcceptedType();
-                            return ret;
-                        }
-                        case type::Descriptor::eTuple:
-                        {
-                            typenavigator::TupleNavigatorPtr casted = typenavigator::TupleNavigator::DynamicCastAndCheck(element);
-                            typenavigator::NavigatorPtr ret = casted->getAcceptedType(currentIndex);
-                            return ret;
-                        }
-                        case type::Descriptor::eList:
-                        {
-                            typenavigator::ListNavigatorPtr casted = typenavigator::ListNavigator::DynamicCastAndCheck(element);
-                            typenavigator::NavigatorPtr ret = casted->getAcceptedType();
-                            return ret;
-                        }
-                        default:
-                            throw error::DescriptorNotValidException("NavigatorReaderToken", "getNextElement", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor);
+                        return casted->getFirstAcceptedType();
                     }
+                    return casted->getSecondAcceptedType();
                 }
-
-            private:
-            };
+                default:
+                    throw error::DescriptorNotValidException("NavigatorReaderToken", "getNextElement", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor);
+            }
+        }
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.cpp
index 6090f2176eb1d677df379d5327bae604f3963694..eea8c5dc279d527d9aa6024b1c3bfed2f2e9da8a 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.cpp
@@ -35,16 +35,16 @@
 namespace armarx::aron::typeIO::reader
 {
     NlohmannJSONReader::NlohmannJSONReader(const nlohmann::json& n) :
-        TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>(n)
+        input(n)
     {
     }
 
     NlohmannJSONReader::NlohmannJSONReader(const std::string& n) :
-        TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>(nlohmann::json::parse(n))
+        input(n)
     {
     }
 
-    nlohmann::json NlohmannJSONReader::getCurrentAndGoToNext()
+    nlohmann::json NlohmannJSONReader::getNextAndIncrease()
     {
         if (!readInitialStart)
         {
@@ -52,114 +52,223 @@ namespace armarx::aron::typeIO::reader
             return input;
         }
         NlohmannJSONReaderTokenPtr lastToken = stack.top();
-        return lastToken->getCurrentElementAndIncreaseCnt();
+        return lastToken->getNextElementAndIncreaseCnt();
     }
 
-    nlohmann::json NlohmannJSONReader::getCurrent()
+    std::tuple<std::string, int> NlohmannJSONReader::readStartObject()
     {
-        if (!readInitialStart)
+        nlohmann::json current_json = getNextAndIncrease();
+        auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::eObject, current_json);
+        stack.push(newToken);
+        return {newToken->getElementName(), newToken->getElementChildrenSize()};
+    }
+
+    bool NlohmannJSONReader::readEndObject()
+    {
+        NlohmannJSONReaderTokenPtr token = stack.top();
+        token->assertType(type::eObject);
+
+        if (token->finishedElement())
         {
-            readInitialStart = true;
-            return input;
+            stack.pop();
+            return true;
         }
-        NlohmannJSONReaderTokenPtr lastToken = stack.top();
-        return lastToken->getCurrentElement();
-    }
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    int NlohmannJSONReader::readStart##upperType() \
-    { \
-        nlohmann::json current_json = getCurrentAndGoToNext(); \
-        NlohmannJSONReaderTokenPtr newToken = NlohmannJSONReaderTokenPtr(new NlohmannJSONReaderToken(type::e##upperType, current_json)); \
-        stack.push(newToken); \
-        return newToken->getChildrenSize(); \
-    } \
-    \
-    bool NlohmannJSONReader::readEnd##upperType() \
-    { \
-        NlohmannJSONReaderTokenPtr token = stack.top(); \
-        auto desc = token->getDescriptor(); \
-        if (desc != type::Descriptor::e##upperType) \
-        { \
-            throw error::DescriptorNotValidException("NlohmannJSONReader", "readEnd" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType) + "Type", desc); \
-            return false; \
-        } \
-        \
-        if (token->checkedAllChildren()) \
-        { \
-            stack.pop(); \
-            return true; \
-        } \
-        return false; \
-    }
-
-            HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
-
-std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readEigenMatrix()
-{
-    nlohmann::json j = getCurrentAndGoToNext();
-    std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
-    std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
-    return std::make_tuple(dims, type);
-}
+        return false;
+    }
 
-std::string NlohmannJSONReader::readEigenQuaternion()
-{
-    nlohmann::json j = getCurrentAndGoToNext();
-    std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
-    return type;
-}
+    int NlohmannJSONReader::readStartDict()
+    {
+        nlohmann::json current_json = getNextAndIncrease();
+        auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::eDict, current_json);
+        stack.push(newToken);
+        return newToken->getElementChildrenSize();
+    }
 
-std::tuple<unsigned int, unsigned int, std::string> NlohmannJSONReader::readIVTCByteImage()
-{
-    nlohmann::json j = getCurrentAndGoToNext();
-    std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
-    std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
-    return std::make_tuple(dims[0], dims[1], type);
-}
+    bool NlohmannJSONReader::readEndDict()
+    {
+        NlohmannJSONReaderTokenPtr token = stack.top();
+        token->assertType(type::eDict);
 
-std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readOpenCVMat()
-{
-    nlohmann::json j = getCurrentAndGoToNext();
-    std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
-    std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
-    return std::make_tuple(dims, type);
-}
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
 
-std::tuple<unsigned int, unsigned int, std::string> NlohmannJSONReader::readPCLPointCloud()
-{
-    nlohmann::json j = getCurrentAndGoToNext();
-    std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
-    std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
-    return std::make_tuple(dims[0], dims[1], type);
-}
+    int NlohmannJSONReader::readStartList()
+    {
+        nlohmann::json current_json = getNextAndIncrease();
+        auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::eList, current_json);
+        stack.push(newToken);
+        return newToken->getElementChildrenSize();
+    }
 
-void NlohmannJSONReader::readPosition()
-{
-    getCurrentAndGoToNext();
-    return;
-}
+    bool NlohmannJSONReader::readEndList()
+    {
+        NlohmannJSONReaderTokenPtr token = stack.top();
+        token->assertType(type::eList);
 
-void NlohmannJSONReader::readOrientation()
-{
-    getCurrentAndGoToNext();
-    return;
-}
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
 
-void NlohmannJSONReader::readPose()
-{
-    getCurrentAndGoToNext();
-    return;
-}
+    int NlohmannJSONReader::readStartTuple()
+    {
+        nlohmann::json current_json = getNextAndIncrease();
+        auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::eTuple, current_json);
+        stack.push(newToken);
+        return newToken->getElementChildrenSize();
+    }
+
+    bool NlohmannJSONReader::readEndTuple()
+    {
+        NlohmannJSONReaderTokenPtr token = stack.top();
+        token->assertType(type::eTuple);
 
-            // Read primitives
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    void NlohmannJSONReader::read##upperType() \
-    { \
-        nlohmann::json j = getCurrentAndGoToNext(); \
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
     }
 
-            HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+    int NlohmannJSONReader::readStartPair()
+    {
+        nlohmann::json current_json = getNextAndIncrease();
+        auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::ePair, current_json);
+        stack.push(newToken);
+        return newToken->getElementChildrenSize();
+    }
+
+    bool NlohmannJSONReader::readEndPair()
+    {
+        NlohmannJSONReaderTokenPtr token = stack.top();
+        token->assertType(type::ePair);
+
+        if (token->finishedElement())
+        {
+            stack.pop();
+            return true;
+        }
+        return false;
+    }
+
+    std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readEigenMatrix()
+    {
+        nlohmann::json j = getNextAndIncrease();
+        std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
+        std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
+        return std::make_tuple(dims, type);
+    }
+
+    std::string NlohmannJSONReader::readEigenQuaternion()
+    {
+        nlohmann::json j = getNextAndIncrease();
+        std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
+        return type;
+    }
+
+    std::tuple<unsigned int, unsigned int, std::string> NlohmannJSONReader::readIVTCByteImage()
+    {
+        nlohmann::json j = getNextAndIncrease();
+        std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
+        std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
+        return std::make_tuple(dims[0], dims[1], type);
+    }
+
+    std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readOpenCVMat()
+    {
+        nlohmann::json j = getNextAndIncrease();
+        std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
+        std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
+        return std::make_tuple(dims, type);
+    }
+
+    std::tuple<unsigned int, unsigned int, std::string> NlohmannJSONReader::readPCLPointCloud()
+    {
+        nlohmann::json j = getNextAndIncrease();
+        std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG];
+        std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG];
+        return std::make_tuple(dims[0], dims[1], type);
+    }
+
+    void NlohmannJSONReader::readPosition()
+    {
+        getNextAndIncrease();
+        return;
+    }
+
+    void NlohmannJSONReader::readOrientation()
+    {
+        getNextAndIncrease();
+        return;
+    }
+
+    void NlohmannJSONReader::readPose()
+    {
+        getNextAndIncrease();
+        return;
+    }
+
+    // Read primitives
+    void NlohmannJSONReader::readInt()
+    {
+        nlohmann::json j = getNextAndIncrease();
+    }
+
+    void NlohmannJSONReader::readLong()
+    {
+        nlohmann::json j = getNextAndIncrease();
+    }
+
+    void NlohmannJSONReader::readFloat()
+    {
+        nlohmann::json j = getNextAndIncrease();
+    }
+
+    void NlohmannJSONReader::readDouble()
+    {
+        nlohmann::json j = getNextAndIncrease();
+    }
+
+    void NlohmannJSONReader::readString()
+    {
+        nlohmann::json j = getNextAndIncrease();
+    }
+
+    void NlohmannJSONReader::readBool()
+    {
+        nlohmann::json j = getNextAndIncrease();
+    }
+
+    void NlohmannJSONReader::readTime()
+    {
+        nlohmann::json j = getNextAndIncrease();
+    }
+
+    std::string NlohmannJSONReader::readKey()
+    {
+        auto token = stack.top();
+        return token->getCurrentKey();
+    }
+
+    void NlohmannJSONReader::loadMember(const std::string& k)
+    {
+        auto token = stack.top();
+        token->setCurrentKey(k);
+    }
+
+    // Helper functions
+    type::Descriptor NlohmannJSONReader::getTypeOfNext() const
+    {
+        auto token = stack.top();
+        return token->getTypeOfNext();
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h
index 322bf0cf7e02174e6caca07d829a2767262ab167..70efcc50ec54620533272f9493aa77c17701fa41 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h
@@ -25,54 +25,68 @@
 #include <stack>
 
 // BaseClass
-#include <RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h>
+#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h>
 
 namespace armarx::aron::typeIO::reader
-        {
-            class NlohmannJSONReader;
-            typedef std::shared_ptr<NlohmannJSONReader> NlohmannJSONReaderPtr;
+{
+    class NlohmannJSONReader;
+    typedef std::shared_ptr<NlohmannJSONReader> NlohmannJSONReaderPtr;
 
-            class NlohmannJSONReader :
-                virtual public TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>
-            {
-            public:
-                using PointerType = NlohmannJSONReaderPtr;
+    class NlohmannJSONReader :
+        virtual public ReaderInterface
+    {
+    public:
+        using PointerType = NlohmannJSONReaderPtr;
 
-            public:
-                // constructors
-                NlohmannJSONReader() = delete;
-                NlohmannJSONReader(const nlohmann::json& n);
-                NlohmannJSONReader(const std::string& n);
+    public:
+        // constructors
+        NlohmannJSONReader() = delete;
+        NlohmannJSONReader(const nlohmann::json& n);
+        NlohmannJSONReader(const std::string& n);
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual int readStart##upperType() override; \
-    virtual bool readEnd##upperType() override;
+        virtual std::tuple<std::string, int> readStartObject() override;
+        virtual bool readEndObject() override;
+        virtual int readStartList() override;
+        virtual bool readEndList() override;
+        virtual int readStartDict() override;
+        virtual bool readEndDict() override;
+        virtual int readStartTuple() override;
+        virtual bool readEndTuple() override;
+        virtual int readStartPair() override;
+        virtual bool readEndPair() override;
 
-                HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
+        virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() override;
+        virtual std::string readEigenQuaternion() override;
+        virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() override;
+        virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() override;
+        virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() override;
+        virtual void readPosition() override;
+        virtual void readOrientation() override;
+        virtual void readPose() override;
 
-    virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() override;
-    virtual std::string readEigenQuaternion() override;
-    virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() override;
-    virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() override;
-    virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() override;
-    virtual void readPosition() override;
-    virtual void readOrientation() override;
-    virtual void readPose() override;
+        virtual void readInt() override;
+        virtual void readLong() override;
+        virtual void readFloat() override;
+        virtual void readDouble() override;
+        virtual void readString() override;
+        virtual void readBool() override;
+        virtual void readTime() override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual void read##upperType() override;
+        virtual std::string readKey() override;
+        virtual void loadMember(const std::string&) override;
 
-                HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+        // Helper functions
+        virtual type::Descriptor getTypeOfNext() const override;
 
-            private:
-                nlohmann::json getCurrent();
-                nlohmann::json getCurrentAndGoToNext();
+    private:
+        nlohmann::json getNextAndIncrease();
 
-            private:
-            };
+    private:
+        nlohmann::json input;
+        bool readInitialStart = false;
+        std::stack<NlohmannJSONReaderTokenPtr> stack;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h
index ba2bf1f97b20dd83a9e5e9096f07b19f0dd2461c..78b3c04ab5fe09cef34cee4c96c5749a9eff908c 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h
@@ -35,156 +35,185 @@
 #include <RobotAPI/libraries/aron/core/Resolver.h>
 
 namespace armarx::aron::typeIO::reader
+{
+    class NlohmannJSONReaderToken;
+    typedef std::shared_ptr<NlohmannJSONReaderToken> NlohmannJSONReaderTokenPtr;
+
+    class NlohmannJSONReaderToken :
+        virtual public ReaderTokenInterface<nlohmann::json>
+    {
+    public:
+        using PointerType = NlohmannJSONReaderTokenPtr;
+
+    public:
+        // constructors
+        NlohmannJSONReaderToken() = delete;
+        NlohmannJSONReaderToken(const type::Descriptor desc, const nlohmann::json& type)
         {
-            // BaseClass
-            class NlohmannJSONReaderToken;
-            typedef std::shared_ptr<NlohmannJSONReaderToken> NlohmannJSONReaderTokenPtr;
+            descriptor = desc;
+            element = type;
 
-            class NlohmannJSONReaderToken :
-                virtual public ReaderToken<nlohmann::json, nlohmann::json>
+            switch (descriptor)
             {
-            public:
-                using PointerType = NlohmannJSONReaderTokenPtr;
-
-            public:
-                // constructors
-                NlohmannJSONReaderToken() = delete;
-                NlohmannJSONReaderToken(const type::Descriptor desc, const nlohmann::json& type) :
-                    io::ReaderToken<type::Descriptor, nlohmann::json, nlohmann::json>(desc, type),
-                    ReaderToken<nlohmann::json, nlohmann::json>(desc, type)
-                {
-                    switch (descriptor)
+                case type::Descriptor::eObject:
+                {
+                    for (auto it = type.begin(); it != type.end(); ++it)
                     {
-                        case type::Descriptor::eObject:
-                        {
-                            for (auto it = type.begin(); it != type.end(); ++it)
-                            {
-                                if (
-                                    it.key() == io::Data::READER_WRITER_OBJECT_NAME_SLUG ||
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    it.key() == io::Data::READER_WRITER_##capsType##_TYPENAME_SLUG ||
-
-            HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
-                                    it.key() == io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG ||
-                                    it.key() == io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG ||
-                                    it.key() == io::Data::READER_WRITER_NDARRAY_NAME_SLUG ||
-                                    it.key() == io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG ||
-                                    it.key() == io::Data::READER_WRITER_NDARRAY_TYPE_SLUG
-                                )
-                                {
-                                    continue;
-                                }
-
-                                allKeys.push_back(it.key());
-                            }
-                            maxIndex = allKeys.size();
-                            break;
-                        }
-                        case type::Descriptor::eDict:
+                        if (it.key() == io::Data::READER_WRITER_NAME_SLUG)
                         {
-                            maxIndex = 1;
-                            break;
+                            continue;
                         }
-                        case type::Descriptor::eTuple:
-                        {
-                            maxIndex = type.size();
-                            break;
-                        }
-                        case type::Descriptor::eList:
-                        {
-                            maxIndex = 1;
-                            break;
-                        }
-                        default:
-                            throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "NlohmannJSONReaderToken", "Received an invalid instance for a reader token.", desc);
+
+                        allMemberNames.push_back(it.key());
                     }
+                    childrenSize = allMemberNames.size();
+                    elementName = element[io::Data::READER_WRITER_NAME_SLUG];
+                    break;
                 }
-
-                std::string getObjectName() const override
+                case type::Descriptor::eDict:
                 {
-                    if (descriptor == type::Descriptor::eObject)
-                    {
-                        return element[io::Data::READER_WRITER_OBJECT_NAME_SLUG];
-                    }
-                    throw error::DescriptorNotValidException("NavigatorReaderToken", "NavigatorReaderToken", "Could not get object nme of a non-object token", descriptor);
+                    childrenSize = 1;
+                    break;
                 }
-
-                type::Descriptor getTypeOfNextElement() const override
+                case type::Descriptor::eTuple:
+                {
+                    childrenSize = element.size();
+                    break;
+                }
+                case type::Descriptor::eList:
+                {
+                    childrenSize = 1;
+                    break;
+                }
+                case type::ePair:
                 {
-                    const nlohmann::json next = getCurrentElement();
+                    childrenSize = 2;
+                    break;
+                }
+                default:
+                    throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "NlohmannJSONReaderToken", "Received an invalid instance for a reader token.", desc);
+            }
+        }
 
-                    if (next.is_object())
-                    {
-                        if (next.find(io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG) != next.end())
-                        {
-                            return type::Descriptor::eDict;
-                        }
-                        if (next.find(io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG) != next.end())
-                        {
-                            return type::Descriptor::eList;
-                        }
-                        if (next.find(io::Data::READER_WRITER_NDARRAY_NAME_SLUG) != next.end())
-                        {
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == std::string(#upperType)) \
-    { \
-        return type::Descriptor::e##upperType; \
-    }
+        type::Descriptor getTypeOfNext() const override
+        {
+            const nlohmann::json next = getNextElement();
 
-                            HANDLE_NDARRAY_TYPES
-#undef RUN_ARON_MACRO
-                            throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Found indicator of NDArray but could not resolve real type. Found JSON: " + next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG].dump(2));
-                        }
-                        return type::Descriptor::eObject;
+            if (next.is_object())
+            {
+                if (next.find(io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG) != next.end())
+                {
+                    return type::eDict;
+                }
+                if (next.find(io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG) != next.end())
+                {
+                    return type::eList;
+                }
+                if (next.find(io::Data::READER_WRITER_INT_ENUM_NAME_SLUG) != next.end())
+                {
+                    return type::eIntEnum;
+                }
+                if (next.find(io::Data::READER_WRITER_NDARRAY_NAME_SLUG) != next.end())
+                {
+                    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "EigenMatrix")
+                    {
+                        return type::eEigenMatrix;
                     }
-                    if (next.is_array())
+                    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "EigenQuaternion")
                     {
-                        return type::Descriptor::eTuple;
+                        return type::eEigenQuaternion;
                     }
-                    if (next.is_string())
+                    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "IVTCByteImage")
                     {
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    if (next == io::Data::READER_WRITER_##capsType##_TYPENAME_SLUG) \
-    { \
-        return type::Descriptor::e##upperType; \
-    }
-
-                        HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+                        return type::eIVTCByteImage;
                     }
-                    throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Could not convert to type::Descriptor enum. Found JSON: " + next.dump(2));
-                }
-
-                nlohmann::json getCurrentElement() const override
-                {
-                    switch (descriptor)
+                    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "OpenCVMat")
                     {
-                        case type::Descriptor::eObject:
-                        {
-                            nlohmann::json ret = element[resolveCurrentKey()];
-                            return ret;
-                        }
-                        case type::Descriptor::eDict:
-                        {
-                            nlohmann::json ret = element[io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG];
-                            return ret;
-                        }
-                        case type::Descriptor::eTuple:
-                        {
-                            nlohmann::json ret = element[currentIndex];
-                            return ret;
-                        }
-                        case type::Descriptor::eList:
-                        {
-                            nlohmann::json ret = element[io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG];
-                            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);
+                        return type::eOpenCVMat;
+                    }
+                    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "PCLPointCloud")
+                    {
+                        return type::ePCLPointCloud;
+                    }
+                    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "Position")
+                    {
+                        return type::ePosition;
                     }
+                    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "Orientation")
+                    {
+                        return type::eOrientation;
+                    }
+                    if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "Pose")
+                    {
+                        return type::ePose;
+                    }
+                    throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Found indicator of NDArray but could not resolve real type. Found JSON: " + next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG].dump(2));
+                }
+                return type::eObject;
+            }
+            if (next.is_array())
+            {
+                return type::eTuple;
+            }
+            if (next.is_string())
+            {
+                if (next == io::Data::READER_WRITER_INT_TYPENAME_SLUG)
+                {
+                    return type::eInt;
+                }
+                if (next == io::Data::READER_WRITER_LONG_TYPENAME_SLUG)
+                {
+                    return type::eLong;
                 }
+                if (next == io::Data::READER_WRITER_FLOAT_TYPENAME_SLUG)
+                {
+                    return type::eFloat;
+                }
+                if (next == io::Data::READER_WRITER_DOUBLE_TYPENAME_SLUG)
+                {
+                    return type::eDouble;
+                }
+                if (next == io::Data::READER_WRITER_STRING_TYPENAME_SLUG)
+                {
+                    return type::eString;
+                }
+                if (next == io::Data::READER_WRITER_BOOL_TYPENAME_SLUG)
+                {
+                    return type::eBool;
+                }
+                if (next == io::Data::READER_WRITER_TIME_TYPENAME_SLUG)
+                {
+                    return type::eTime;
+                }
+            }
+            throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Could not convert to type::Descriptor enum. Found JSON: " + next.dump(2));
+        }
 
-            private:
-            };
+        nlohmann::json getNextElement() const override
+        {
+            assertIndexInBounds();
+
+            switch (descriptor)
+            {
+                case type::Descriptor::eObject:
+                {
+                    return element[getCurrentKey()];
+                }
+                case type::Descriptor::eDict:
+                {
+                    return element[io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG];
+                }
+                case type::Descriptor::eTuple:
+                {
+                    return element[currentIndex];
+                }
+                case type::Descriptor::eList:
+                {
+                    return element[io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG];
+                }
+                default:
+                    throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "getNextElement", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor);
+            }
+        }
+    };
 }
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 52b3050fb7e333689bc34ccc8d021e0030ed3f8e..99005c64e9a148fad4cbf4b54932d10f68332a5a 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp
@@ -31,119 +31,148 @@
 
 
 namespace armarx::aron::typeIO
-        {
+{
+
+    void Visitor::SetupWriterFromAronTypePtr(WriterInterface& writer, const typenavigator::NavigatorPtr& aron)
+    {
+        SetupWriterFromAronTypePtr(writer, aron->getResult());
+    }
 
-            void Visitor::SetupWriterFromAronTypePtr(Writer& writer, const typenavigator::NavigatorPtr& aron)
+    void Visitor::SetupWriterFromAronTypePtr(WriterInterface& writer, const type::AronTypePtr& aron)
+    {
+        type::Descriptor desc = Resolver::GetDescriptor(aron);
+        switch (desc)
+        {
+            case type::eObject:
             {
-                SetupWriterFromAronTypePtr(writer, aron->getResult());
+                type::AronObjectPtr casted = type::AronObjectPtr::dynamicCast(aron);
+                writer.writeStartObject(casted->objectName);
+                for (const auto& [key, value] : casted->elementTypes)
+                {
+                    writer.writeKey(key);
+                    Visitor::SetupWriterFromAronTypePtr(writer, value);
+                }
+                writer.writeEndObject();
+                break;
             }
-
-            void Visitor::SetupWriterFromAronTypePtr(Writer& writer, const type::AronTypePtr& aron)
+            case type::eDict:
             {
-                type::Descriptor desc = Resolver::GetDescriptor(aron);
-                switch (desc)
+                type::AronDictPtr casted = type::AronDictPtr::dynamicCast(aron);
+                writer.writeStartDict();
+                Visitor::SetupWriterFromAronTypePtr(writer, casted->acceptedType);
+                writer.writeEndDict();
+                break;
+            }
+            case type::eTuple:
+            {
+                type::AronTuplePtr casted = type::AronTuplePtr::dynamicCast(aron);
+                writer.writeStartTuple();
+                for (const auto& value : casted->elementTypes)
                 {
-                    case type::eObject:
-                    {
-                        type::AronObjectPtr casted = type::AronObjectPtr::dynamicCast(aron);
-                        writer.writeStartObject();
-                        writer.writeObjectName(casted->objectName);
-                        for (const auto& [key, value] : casted->elementTypes)
-                        {
-                            writer.writeKey(key);
-                            Visitor::SetupWriterFromAronTypePtr(writer, value);
-                        }
-                        writer.writeEndObject();
-                        break;
-                    }
-                    case type::eDict:
-                    {
-                        type::AronDictPtr casted = type::AronDictPtr::dynamicCast(aron);
-                        writer.writeStartDict();
-                        Visitor::SetupWriterFromAronTypePtr(writer, casted->acceptedType);
-                        writer.writeEndDict();
-                        break;
-                    }
-                    case type::eTuple:
-                    {
-                        type::AronTuplePtr casted = type::AronTuplePtr::dynamicCast(aron);
-                        writer.writeStartTuple();
-                        for (const auto& value : casted->elementTypes)
-                        {
-                            Visitor::SetupWriterFromAronTypePtr(writer, value);
-                        }
-                        writer.writeEndTuple();
-                        break;
-                    }
-                    case type::eList:
-                    {
-                        type::AronListPtr casted = type::AronListPtr::dynamicCast(aron);
-                        writer.writeStartList();
-                        Visitor::SetupWriterFromAronTypePtr(writer, casted->acceptedType);
-                        writer.writeEndList();
-                        break;
-                    }
-                    case type::eEigenMatrix:
-                    {
-                        type::AronEigenMatrixPtr casted = type::AronEigenMatrixPtr::dynamicCast(aron);
-                        writer.writeEigenMatrix(casted->dimensions, casted->typeName);
-                        break;
-                    }
-                    case type::eEigenQuaternion:
-                    {
-                        type::AronEigenQuaternionPtr casted = type::AronEigenQuaternionPtr::dynamicCast(aron);
-                        writer.writeEigenQuaternion(casted->typeName);
-                        break;
-                    }
-                    case type::eIVTCByteImage:
-                    {
-                        type::AronIVTCByteImagePtr casted = type::AronIVTCByteImagePtr::dynamicCast(aron);
-                        writer.writeIVTCByteImage(casted->width, casted->height, casted->typeName);
-                        break;
-                    }
-                    case type::eOpenCVMat:
-                    {
-                        type::AronOpenCVMatPtr casted = type::AronOpenCVMatPtr::dynamicCast(aron);
-                        writer.writeOpenCVMat(casted->dimensions, casted->typeName);
-                        break;
-                    }
-                    case type::ePCLPointCloud:
-                    {
-                        type::AronPCLPointCloudPtr casted = type::AronPCLPointCloudPtr::dynamicCast(aron);
-                        writer.writePCLPointCloud(casted->width, casted->height, casted->typeName);
-                        break;
-                    }
-                    case type::ePosition:
-                    {
-                        writer.writePosition();
-                        break;
-                    }
-                    case type::eOrientation:
-                    {
-                        writer.writeOrientation();
-                        break;
-                    }
-                    case type::ePose:
-                    {
-                        writer.writePose();
-                        break;
-                    }
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-case type::e##upperType: \
-{ \
-    type::Aron##upperType##Ptr casted = type::Aron##upperType##Ptr::dynamicCast(aron); \
-    writer.write##upperType(); \
-    break; \
-}
-
-                    HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
-
-                    default:
-                    {
-                        throw error::DescriptorNotValidException("LegacyAronTypeWriter", "SetupWriterFromAronTypePtr", "Type-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc);
-                    }
+                    Visitor::SetupWriterFromAronTypePtr(writer, value);
                 }
+                writer.writeEndTuple();
+                break;
+            }
+            case type::eList:
+            {
+                type::AronListPtr casted = type::AronListPtr::dynamicCast(aron);
+                writer.writeStartList();
+                Visitor::SetupWriterFromAronTypePtr(writer, casted->acceptedType);
+                writer.writeEndList();
+                break;
+            }
+            case type::eEigenMatrix:
+            {
+                type::AronEigenMatrixPtr casted = type::AronEigenMatrixPtr::dynamicCast(aron);
+                writer.writeEigenMatrix(casted->dimensions, casted->typeName);
+                break;
+            }
+            case type::eEigenQuaternion:
+            {
+                type::AronEigenQuaternionPtr casted = type::AronEigenQuaternionPtr::dynamicCast(aron);
+                writer.writeEigenQuaternion(casted->typeName);
+                break;
+            }
+            case type::eIVTCByteImage:
+            {
+                type::AronIVTCByteImagePtr casted = type::AronIVTCByteImagePtr::dynamicCast(aron);
+                writer.writeIVTCByteImage(casted->width, casted->height, casted->typeName);
+                break;
+            }
+            case type::eOpenCVMat:
+            {
+                type::AronOpenCVMatPtr casted = type::AronOpenCVMatPtr::dynamicCast(aron);
+                writer.writeOpenCVMat(casted->dimensions, casted->typeName);
+                break;
+            }
+            case type::ePCLPointCloud:
+            {
+                type::AronPCLPointCloudPtr casted = type::AronPCLPointCloudPtr::dynamicCast(aron);
+                writer.writePCLPointCloud(casted->width, casted->height, casted->typeName);
+                break;
+            }
+            case type::ePosition:
+            {
+                writer.writePosition();
+                break;
+            }
+            case type::eOrientation:
+            {
+                writer.writeOrientation();
+                break;
+            }
+            case type::ePose:
+            {
+                writer.writePose();
+                break;
+            }
+            case type::eInt:
+            {
+                type::AronIntPtr casted = type::AronIntPtr::dynamicCast(aron);
+                writer.writeInt();
+                break;
+            }
+            case type::eLong:
+            {
+                type::AronLongPtr casted = type::AronLongPtr::dynamicCast(aron);
+                writer.writeLong();
+                break;
+            }
+            case type::eFloat:
+            {
+                type::AronFloatPtr casted = type::AronFloatPtr::dynamicCast(aron);
+                writer.writeFloat();
+                break;
+            }
+            case type::eDouble:
+            {
+                type::AronDoublePtr casted = type::AronDoublePtr::dynamicCast(aron);
+                writer.writeDouble();
+                break;
+            }
+            case type::eString:
+            {
+                type::AronStringPtr casted = type::AronStringPtr::dynamicCast(aron);
+                writer.writeString();
+                break;
+            }
+            case type::eBool:
+            {
+                type::AronBoolPtr casted = type::AronBoolPtr::dynamicCast(aron);
+                writer.writeBool();
+                break;
+            }
+            case type::eTime:
+            {
+                type::AronTimePtr casted = type::AronTimePtr::dynamicCast(aron);
+                writer.writeTime();
+                break;
+            }
+            default:
+            {
+                throw error::DescriptorNotValidException("LegacyAronTypeWriter", "SetupWriterFromAronTypePtr", "Type-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc);
             }
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.h b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.h
index a5f86273b8283f2292d9333b93cfa8df2714d777..6f781b3dae61236e202ffffd0fd243f89732f5d7 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.h
@@ -41,8 +41,8 @@ namespace armarx::aron::typeIO
         Visitor() = delete;
 
     public:
-        static void SetupWriterFromAronTypePtr(Writer&, const typenavigator::NavigatorPtr&);
-        static void SetupWriterFromAronTypePtr(Writer&, const type::AronTypePtr&);
+        static void SetupWriterFromAronTypePtr(WriterInterface&, const typenavigator::NavigatorPtr&);
+        static void SetupWriterFromAronTypePtr(WriterInterface&, const type::AronTypePtr&);
 
     public:
     };
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h
index 80f32a7c6d243ab93b0989ab201296f95f6350c8..6ba53b81acec39ec84792402e3066e901aef27b8 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h
@@ -20,76 +20,5 @@
 
 #pragma once
 
-// STD/STL
-#include <memory>
-#include <string>
-#include <stack>
-
-// ArmarX
-#include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h>
-
-
-
-namespace armarx::aron::typeIO
-        {
-            template <typename GeneratePtr, typename TokenPtr>
-            class TokenizedWriter;
-
-            template <typename GeneratePtr, typename TokenPtr>
-            using TokenizedWriterPtr = std::shared_ptr<TokenizedWriter<GeneratePtr, TokenPtr>>;
-
-            template <typename GeneratePtr, typename TokenPtr>
-            class TokenizedWriter :
-                virtual public Writer
-            {
-            public:
-                TokenizedWriter() = default;
-
-                virtual bool writeKey(const std::string& k) override
-                {
-                    TokenPtr token = stack.top();
-                    token->setCurrentKey(k);
-                    return true;
-                }
-
-                bool writeObjectName(const std::string& n)
-                {
-                    TokenPtr token = stack.top();
-                    token->setObjectName(n);
-                    return true;
-                }
-
-                GeneratePtr getResult() const
-                {
-                    assertLastRemovedTokenIsSet();
-                    assertStackIsEmpty();
-                    return lastRemovedToken->getElement();
-                }
-
-            protected:
-                void assertLastRemovedTokenIsSet() const
-                {
-                    if (lastRemovedToken == nullptr)
-                    {
-                        throw error::AronException("ClassWriter", "assertLastRemovedTokenIsSet", "lastRemovedToken is NULL. Perhaps you never called a writeEnd* method?");
-                    }
-                    if (lastRemovedToken->getElement() == nullptr)
-                    {
-                        throw error::AronException("ClassWriter", "assertLastRemovedTokenIsSet", "lastRemovedToken->getElement() is NULL.");
-                    }
-                }
-                void assertStackIsEmpty() const
-                {
-                    if (stack.size() != 0)
-                    {
-                        throw error::AronException("ClassWriter", "assertStackIsEmpty", "The Size of the stack is not 0. Perhaps you never called a writeEnd* method?");
-                    }
-                }
-
-            protected:
-                bool wroteInitialStartContainer = false;
-                TokenPtr lastRemovedToken;
-                std::stack<TokenPtr> stack;
-            };
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/WriterToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/WriterToken.h
index c3742cb4cddd99c3b39348806c0897a82a7bfa96..315be70a3e9096d0b264c8f9e27ecb0e1e80bc1e 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/WriterToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/WriterToken.h
@@ -29,51 +29,73 @@
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Config.h>
+#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/aron/core/io/Data.h>
 
 namespace armarx::aron::typeIO
 {
-            template<typename ElementPtrTypename, typename ElementAddTypename>
-            class WriterToken;
+    template<typename ElementTypename>
+    class WriterTokenInterface;
 
-            template<typename ElementPtrTypename, typename ElementAddTypename>
-            using WriterTokenPtr = std::shared_ptr<WriterToken<ElementPtrTypename, ElementAddTypename>>;
+    template<typename ElementTypename>
+    using WriterTokenInterfacePtr = std::shared_ptr<WriterTokenInterface<ElementTypename>>;
 
-            template<typename ElementPtrTypename, typename ElementAddTypename>
-            class WriterToken :
-                virtual public io::WriterToken<type::Descriptor, ElementPtrTypename, ElementAddTypename>
+    template<typename ElementTypename>
+    class WriterTokenInterface
+    {
+    public:
+        using PointerType = WriterTokenInterfacePtr<ElementTypename>;
+
+        // Interface
+        virtual void addElement(const ElementTypename&) = 0;
+        virtual void setName(const std::string&) = 0;
+
+        // General implementation
+        std::string toAccessor() const
+        {
+            type::Descriptor desc = this->getDescriptor();
+            switch (desc)
+            {
+                case type::Descriptor::eDict:
+                case type::Descriptor::eList:
+                    return "[ACCEPTED_TYPE]";
+                case type::Descriptor::eObject:
+                    return this->currentKey;
+                case type::Descriptor::eTuple:
+                    return std::to_string(this->currentIndex);
+                default:
+                    throw error::DescriptorNotValidException("NavigatorWriterToken", "toElementAccessor", "Could not resove a type of a navigator. Allowed are only containers.", desc);
+            }
+        }
+
+        void setCurrentKey(const std::string& s)
+        {
+            if (s.empty())
             {
-            public:
-                using PointerType = WriterToken<ElementPtrTypename, ElementAddTypename>;
+                throw error::AronException("AronWriterToken", "setCurrentKey", "The passed key is empty.");
+            }
+            currentKey = s;
+        }
 
-            public:
-                // constructor
-                WriterToken() = delete;
-                WriterToken(const type::Descriptor desc, const ElementPtrTypename& n) :
-                    io::WriterToken<type::Descriptor, ElementPtrTypename, ElementAddTypename>(desc, n)
-                {}
+        ElementTypename getElement() const
+        {
+            return element;
+        }
 
-                // public member functions
-                virtual void addElement(const ElementAddTypename&) = 0;
+        type::Descriptor getDescriptor() const
+        {
+            return descriptor;
+        }
 
-                virtual std::string toElementAccessor() const override
-                {
-                    type::Descriptor desc = this->getDescriptor();
-                    switch (desc)
-                    {
-                        case type::Descriptor::eDict:
-                        case type::Descriptor::eList:
-                            return "[ACCEPTED_TYPE]";
-                        case type::Descriptor::eObject:
-                            return "\"" + this->currentKey + "\"";
-                        case type::Descriptor::eTuple:
-                            return "<" + std::to_string(this->currentIndex) + ">";
-                        default:
-                            throw error::DescriptorNotValidException("NavigatorWriterToken", "toElementAccessor", "Could not resove a type of a navigator. Allowed are only containers.", desc);
-                    }
-                }
+    protected:
+        // members
+        type::Descriptor descriptor = type::eUnknown;
+        ElementTypename element;
 
-                virtual void setObjectName(const std::string& n) = 0;
+        // current index
+        unsigned int currentIndex = 0;
 
-            private:
-            };
+        // current key
+        std::string currentKey = "";
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.cpp
index 19f58a42a90b7e0d3d58bb647731fd48353d57ab..06e8c00764ed0c3c446c7fdb2b1448a780d085cb 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.cpp
@@ -34,144 +34,260 @@
 #include <RobotAPI/libraries/aron/core/navigator/type/container/Tuple.h>
 #include <RobotAPI/libraries/aron/core/navigator/type/primitive/Primitive.h>
 
+namespace armarx::aron::typeIO::writer
+{
+    // generate Path info
+    Path NavigatorWriter::generatePath()
+    {
+        Path path;
+        if (!wroteInitialStartObject)
+        {
+            wroteInitialStartObject = true;
+        }
+        else
+        {
+            auto current = stack.top();
+            path = Path(current->getElement()->getPath(), current->toAccessor());
+        }
+        return path;
+    }
 
+    // interface
+    void NavigatorWriter::writeStartObject(const std::string& n)
+    {
+        Path path = generatePath();
+        auto type = std::make_shared<typenavigator::ObjectNavigator>(path);
+        type->setObjectName(n);
+        auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type);
+        stack.push(new_token);
+    }
 
-namespace armarx::aron::typeIO::writer
+    void NavigatorWriter::writeEndObject()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
         {
+            auto prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
 
-            Path NavigatorWriter::generatePath()
-            {
-                Path path;
-                if (!wroteInitialStartContainer)
-                {
-                    wroteInitialStartContainer = true;
-                }
-                else
-                {
-                    NavigatorWriterTokenPtr parent_token = stack.top();
-                    path = Path(parent_token->getElement()->getPath(), parent_token->toElementAccessor());
-                }
-                return path;
-            }
-
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NavigatorWriter::writeStart##upperType() \
-    { \
-        Path path = generatePath(); \
-        typenavigator::upperType##NavigatorPtr type = typenavigator::upperType##NavigatorPtr(new typenavigator::upperType##Navigator(path)); \
-        NavigatorWriterTokenPtr new_token = NavigatorWriterTokenPtr(new NavigatorWriterToken(type->getDescriptor(), type)); \
-        stack.push(new_token); \
-        return true; \
-    } \
-    bool NavigatorWriter::writeEnd##upperType() \
-    { \
-        lastRemovedToken = stack.top(); \
-        stack.pop(); \
-        \
-        if (stack.size() > 0) \
-        { \
-            NavigatorWriterTokenPtr prevToken = stack.top(); \
-            prevToken->addElement(lastRemovedToken->getElement()); \
-        } \
-        return true; \
-    }
-
-            HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
-
-bool NavigatorWriter::writeEigenMatrix(const std::vector<int>& dims, const std::string& t)
-{
-    Path path = generatePath();
-    NavigatorWriterTokenPtr token = stack.top();
-    typenavigator::EigenMatrixNavigatorPtr aron(new typenavigator::EigenMatrixNavigator(path));
-    aron->setTypename(t);
-    aron->setDimensions(dims);
-    token->addElement(aron);
-    return true;
-}
+    void NavigatorWriter::writeStartDict()
+    {
+        Path path = generatePath();
+        auto type = std::make_shared<typenavigator::DictNavigator>(path);
+        auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type);
+        stack.push(new_token);
+    }
 
-bool NavigatorWriter::writeEigenQuaternion(const std::string& t)
-{
-    Path path = generatePath();
-    NavigatorWriterTokenPtr token = stack.top();
-    typenavigator::EigenQuaternionNavigatorPtr aron(new typenavigator::EigenQuaternionNavigator(path));
-    aron->setTypename(t);
-    token->addElement(aron);
-    return true;
-}
+    void NavigatorWriter::writeEndDict()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
 
-bool NavigatorWriter::writeIVTCByteImage(unsigned int w, unsigned int h, const std::string& t)
-{
-    Path path = generatePath();
-    NavigatorWriterTokenPtr token = stack.top();
-    typenavigator::IVTCByteImageNavigatorPtr aron(new typenavigator::IVTCByteImageNavigator(path));
-    aron->setTypename(t);
-    aron->setWidth(w);
-    aron->setHeight(h);
-    token->addElement(aron);
-    return true;
-}
+        if (stack.size() > 0)
+        {
+            auto prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
 
-bool NavigatorWriter::writeOpenCVMat(const std::vector<int>& dims, const std::string& t)
-{
-    Path path = generatePath();
-    NavigatorWriterTokenPtr token = stack.top();
-    typenavigator::OpenCVMatNavigatorPtr aron(new typenavigator::OpenCVMatNavigator(path));
-    aron->setTypename(t);
-    aron->setDimensions(dims);
-    token->addElement(aron);
-    return true;
-}
+    void NavigatorWriter::writeStartList()
+    {
+        Path path = generatePath();
+        auto type = std::make_shared<typenavigator::ListNavigator>(path);
+        auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type);
+        stack.push(new_token);
+    }
 
-bool NavigatorWriter::writePCLPointCloud(unsigned int w, unsigned int h, const std::string& t)
-{
-    Path path = generatePath();
-    NavigatorWriterTokenPtr token = stack.top();
-    typenavigator::PCLPointCloudNavigatorPtr aron(new typenavigator::PCLPointCloudNavigator(path));
-    aron->setTypename(t);
-    aron->setWidth(w);
-    aron->setHeight(h);
-    token->addElement(aron);
-    return true;
-}
+    void NavigatorWriter::writeEndList()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
 
-bool NavigatorWriter::writePosition()
-{
-    Path path = generatePath();
-    NavigatorWriterTokenPtr token = stack.top();
-    typenavigator::PositionNavigatorPtr aron(new typenavigator::PositionNavigator(path));
-    token->addElement(aron);
-    return true;
-}
+        if (stack.size() > 0)
+        {
+            auto prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
 
-bool NavigatorWriter::writeOrientation()
-{
-    Path path = generatePath();
-    NavigatorWriterTokenPtr token = stack.top();
-    typenavigator::OrientationNavigatorPtr aron(new typenavigator::OrientationNavigator(path));
-    token->addElement(aron);
-    return true;
-}
+    void NavigatorWriter::writeStartTuple()
+    {
+        Path path = generatePath();
+        auto type = std::make_shared<typenavigator::TupleNavigator>(path);
+        auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type);
+        stack.push(new_token);
+    }
 
-bool NavigatorWriter::writePose()
-{
-    Path path = generatePath();
-    NavigatorWriterTokenPtr token = stack.top();
-    typenavigator::PoseNavigatorPtr aron(new typenavigator::PoseNavigator(path));
-    token->addElement(aron);
-    return true;
-}
+    void NavigatorWriter::writeEndTuple()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
+        {
+            auto prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NavigatorWriter::write##upperType() \
-    { \
-        Path path = generatePath(); \
-        NavigatorWriterTokenPtr token = stack.top(); \
-        typenavigator::upperType##NavigatorPtr aron(new typenavigator::upperType##Navigator(path)); \
-        token->addElement(aron); \
-        return true; \
+    void NavigatorWriter::writeStartPair()
+    {
+        Path path = generatePath();
+        auto type = std::make_shared<typenavigator::PairNavigator>(path);
+        auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type);
+        stack.push(new_token);
     }
 
-            HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+    void NavigatorWriter::writeEndPair()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
+        {
+            auto prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
+
+    void NavigatorWriter::writeEigenMatrix(const std::vector<int>& dims, const std::string& t)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::EigenMatrixNavigatorPtr aron(new typenavigator::EigenMatrixNavigator(path));
+        aron->setTypename(t);
+        aron->setDimensions(dims);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeEigenQuaternion(const std::string& t)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::EigenQuaternionNavigatorPtr aron(new typenavigator::EigenQuaternionNavigator(path));
+        aron->setTypename(t);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeIVTCByteImage(unsigned int w, unsigned int h, const std::string& t)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::IVTCByteImageNavigatorPtr aron(new typenavigator::IVTCByteImageNavigator(path));
+        aron->setTypename(t);
+        aron->setWidth(w);
+        aron->setHeight(h);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeOpenCVMat(const std::vector<int>& dims, const std::string& t)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::OpenCVMatNavigatorPtr aron(new typenavigator::OpenCVMatNavigator(path));
+        aron->setTypename(t);
+        aron->setDimensions(dims);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writePCLPointCloud(unsigned int w, unsigned int h, const std::string& t)
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::PCLPointCloudNavigatorPtr aron(new typenavigator::PCLPointCloudNavigator(path));
+        aron->setTypename(t);
+        aron->setWidth(w);
+        aron->setHeight(h);
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writePosition()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::PositionNavigatorPtr aron(new typenavigator::PositionNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeOrientation()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::OrientationNavigatorPtr aron(new typenavigator::OrientationNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writePose()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::PoseNavigatorPtr aron(new typenavigator::PoseNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeInt()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::IntNavigatorPtr aron(new typenavigator::IntNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeLong()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::LongNavigatorPtr aron(new typenavigator::LongNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeFloat()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::FloatNavigatorPtr aron(new typenavigator::FloatNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeDouble()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::DoubleNavigatorPtr aron(new typenavigator::DoubleNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeString()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::StringNavigatorPtr aron(new typenavigator::StringNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeBool()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::BoolNavigatorPtr aron(new typenavigator::BoolNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeTime()
+    {
+        Path path = generatePath();
+        NavigatorWriterTokenPtr token = stack.top();
+        typenavigator::TimeNavigatorPtr aron(new typenavigator::TimeNavigator(path));
+        token->addElement(aron);
+    }
+
+    void NavigatorWriter::writeKey(const std::string& k)
+    {
+        auto token = stack.top();
+        token->setCurrentKey(k);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h
index 83697bd3ab2484fdd3fbaa284143348855eb721d..00b7ed96e3789deb7f72a6f370b2a8fbb9371576 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h
@@ -25,7 +25,7 @@
 #include <stack>
 
 // BaseClass
-#include <RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h>
+#include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Concepts.h>
@@ -34,40 +34,55 @@
 
 namespace armarx::aron::typeIO::writer
 {
-            class NavigatorWriter;
-            typedef std::shared_ptr<NavigatorWriter> NavigatorWriterPtr;
+    class NavigatorWriter;
+    typedef std::shared_ptr<NavigatorWriter> NavigatorWriterPtr;
 
-            class NavigatorWriter :
-                virtual public TokenizedWriter<typenavigator::NavigatorPtr, NavigatorWriterTokenPtr>
-            {
-            public:
-                NavigatorWriter() = default;
+    class NavigatorWriter :
+        virtual public typeIO::WriterInterface
+    {
+    public:
+        NavigatorWriter() = default;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writeStart##upperType() override; \
-    virtual bool writeEnd##upperType() override;
+        virtual void writeStartObject(const std::string&) override;
+        virtual void writeEndObject() override;
+        virtual void writeStartList() override;
+        virtual void writeEndList() override;
+        virtual void writeStartDict() override;
+        virtual void writeEndDict() override;
+        virtual void writeStartTuple() override;
+        virtual void writeEndTuple() override;
+        virtual void writeStartPair() override;
+        virtual void writeEndPair() override;
 
-                HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
+        virtual void writeEigenMatrix(const std::vector<int>&, const std::string&) override;
+        virtual void writeEigenQuaternion(const std::string&) override;
+        virtual void writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) override;
+        virtual void writeOpenCVMat(const std::vector<int>&, const std::string&) override;
+        virtual void writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) override;
+        virtual void writePosition() override;
+        virtual void writeOrientation() override;
+        virtual void writePose() override;
 
-    virtual bool writeEigenMatrix(const std::vector<int>&, const std::string&) override;
-    virtual bool writeEigenQuaternion(const std::string&) override;
-    virtual bool writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) override;
-    virtual bool writeOpenCVMat(const std::vector<int>&, const std::string&) override;
-    virtual bool writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) override;
-    virtual bool writePosition() override;
-    virtual bool writeOrientation() override;
-    virtual bool writePose() override;
+        virtual void writeInt() override;
+        virtual void writeLong() override;
+        virtual void writeFloat() override;
+        virtual void writeDouble() override;
+        virtual void writeString() override;
+        virtual void writeBool() override;
+        virtual void writeTime() override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool write##upperType() override;
+        virtual void writeKey(const std::string&) override;
 
-                HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+        typenavigator::NavigatorPtr getResult() const
+        {
+            return lastRemovedToken->getElement();
+        }
 
-            private:
-                Path generatePath();
+    private:
+        bool wroteInitialStartObject = false;
+        NavigatorWriterTokenPtr lastRemovedToken = nullptr;
+        std::stack<NavigatorWriterTokenPtr> stack = {};
 
-            private:
-            };
+        Path generatePath();
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriterToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriterToken.h
index bfc6905a6e45a21092ab6f7778aab5b0a0d94eea..20b337298c61c58e0665fb1bcf21bb54eb1d845d 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriterToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriterToken.h
@@ -33,67 +33,89 @@
 
 namespace armarx::aron::typeIO::writer
 {
-            class NavigatorWriterToken;
-            typedef std::shared_ptr<NavigatorWriterToken> NavigatorWriterTokenPtr;
+    class NavigatorWriterToken;
+    typedef std::shared_ptr<NavigatorWriterToken> NavigatorWriterTokenPtr;
 
-            class NavigatorWriterToken :
-                virtual public WriterToken<typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>
-            {
-            public:
-                using PointerType = NavigatorWriterTokenPtr;
+    class NavigatorWriterToken :
+        virtual public WriterTokenInterface<typenavigator::NavigatorPtr>
+    {
+    public:
+        using PointerType = NavigatorWriterTokenPtr;
+
+    public:
+        // constructor
+        NavigatorWriterToken() = delete;
+        NavigatorWriterToken(const type::Descriptor desc, const typenavigator::NavigatorPtr& t)
+        {
+            descriptor = desc;
+            element = t;
+        }
 
-            public:
-                // constructor
-                NavigatorWriterToken() = delete;
-                NavigatorWriterToken(const type::Descriptor desc, const typenavigator::NavigatorPtr& t) :
-                    io::WriterToken<type::Descriptor, typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>(desc, t),
-                    WriterToken<typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>(desc, t)
+        // virtual member functions
+        virtual void addElement(const typenavigator::NavigatorPtr& n) override
+        {
+            switch (descriptor)
+            {
+                case type::eDict:
                 {
+                    typenavigator::DictNavigatorPtr casted = typenavigator::DictNavigator::DynamicCastAndCheck(element);
+                    casted->setAcceptedType(n);
+                    break;
                 }
-
-                // virtual member functions
-                virtual void addElement(const typenavigator::NavigatorPtr& n) override
+                case type::eList:
+                {
+                    typenavigator::ListNavigatorPtr casted = typenavigator::ListNavigator::DynamicCastAndCheck(element);
+                    casted->setAcceptedType(n);
+                    break;
+                }
+                case type::eObject:
+                {
+                    typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(element);
+                    casted->addMemberType(currentKey, n);
+                    break;
+                }
+                case type::eTuple:
                 {
-                    switch (descriptor)
-                    {
-                        case type::Descriptor::eDict:
-                        {
-                            typenavigator::DictNavigatorPtr casted = typenavigator::DictNavigator::DynamicCastAndCheck(element);
-                            casted->setAcceptedType(n);
-                            break;
-                        }
-                        case type::Descriptor::eList:
-                        {
-                            typenavigator::ListNavigatorPtr casted = typenavigator::ListNavigator::DynamicCastAndCheck(element);
-                            casted->setAcceptedType(n);
-                            break;
-                        }
-                        case type::Descriptor::eObject:
-                        {
-                            typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(element);
-                            casted->addMemberType(currentKey, n);
-                            break;
-                        }
-                        case type::Descriptor::eTuple:
-                        {
-                            typenavigator::TupleNavigatorPtr casted = typenavigator::TupleNavigator::DynamicCastAndCheck(element);
-                            casted->addAcceptedType(n);
-                            currentIndex++;
-                            break;
-                        }
-                        default:
-                            throw error::DescriptorNotValidException("NavigatorWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers. The path was: " + getElement()->pathToString(), descriptor);
-                    }
+                    typenavigator::TupleNavigatorPtr casted = typenavigator::TupleNavigator::DynamicCastAndCheck(element);
+                    casted->addAcceptedType(n);
+                    currentIndex++;
+                    break;
                 }
+                case type::ePair:
+                {
+                    typenavigator::PairNavigatorPtr casted = typenavigator::PairNavigator::DynamicCastAndCheck(element);
+                    casted->addAcceptedType(n);
+                    currentIndex++;
+                    break;
+                }
+                default:
+                    throw error::DescriptorNotValidException("NavigatorWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers. The path was: " + getElement()->pathToString(), descriptor);
+            }
+        }
 
-                virtual void setObjectName(const std::string& n) override
+
+        virtual void setName(const std::string& n) override
+        {
+            switch (descriptor)
+            {
+                case type::eObject:
                 {
-                    if (descriptor != type::Descriptor::eObject)
-                    {
-                        throw error::DescriptorNotValidException("NavigatorWriterToken", "setName", "Cant set the name of a non-object token. The path was: " + getElement()->pathToString(), descriptor);
-                    }
                     typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCast(element);
                     casted->setObjectName(n);
+                    break;
                 }
-            };
+                case type::eIntEnum:
+                {
+                    typenavigator::IntEnumNavigatorPtr casted = typenavigator::IntEnumNavigator::DynamicCast(element);
+                    casted->setEnumName(n);
+                    break;
+                }
+                default:
+                    throw error::DescriptorNotValidException("NavigatorWriterToken", "setName", "Cant set the name of a non-object or non-enum token. The path was: " + getElement()->pathToString(), descriptor);
+
+            }
+        }
+
+    private:
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp
index a3a18a83122d9d0ba3df79eabccd4d244bad9f04..187c648096a0fa0e3c9e3b406b1dbc4a7f0b1dcf 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp
@@ -24,121 +24,229 @@
 #include "NlohmannJSONWriter.h"
 
 namespace armarx::aron::typeIO::writer
-        {
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NlohmannJSONWriter::writeStart##upperType() \
-    { \
-        nlohmann::json data; \
-        NlohmannJSONWriterTokenPtr new_token = NlohmannJSONWriterTokenPtr(new NlohmannJSONWriterToken(type::Descriptor::e##upperType, data)); \
-        stack.push(new_token); \
-        return true; \
-    } \
-    bool NlohmannJSONWriter::writeEnd##upperType() \
-    { \
-        lastRemovedToken = stack.top(); \
-        stack.pop(); \
-        \
-        if (stack.size() > 0) \
-        { \
-            NlohmannJSONWriterTokenPtr prevToken = stack.top(); \
-            prevToken->addElement(lastRemovedToken->getElement()); \
-        } \
-        return true; \
-    }
-
-            HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
-
-bool NlohmannJSONWriter::writeEigenMatrix(const std::vector<int>& dims, const std::string& t)
 {
-    NlohmannJSONWriterTokenPtr token = stack.top();
-    nlohmann::json j;
-    j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "EigenMatrix";
-    j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims;
-    j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
-    token->addElement(j);
-    return true;
-}
 
-bool NlohmannJSONWriter::writeEigenQuaternion(const std::string& t)
-{
-    NlohmannJSONWriterTokenPtr token = stack.top();
-    nlohmann::json j;
-    j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "EigenQuaternion";
-    j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
-    token->addElement(j);
-    return true;
-}
+    void NlohmannJSONWriter::writeStartObject(const std::string& n)
+    {
+        nlohmann::json data;
+        data[io::Data::READER_WRITER_NAME_SLUG] = n;
+        auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data);
+        stack.push(new_token);
+    }
 
-bool NlohmannJSONWriter::writeIVTCByteImage(unsigned int w, unsigned int h, const std::string& t)
-{
-    NlohmannJSONWriterTokenPtr token = stack.top();
-    nlohmann::json j;
-    j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "IVTCByteImage";
-    j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = {w, h};
-    j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
-    token->addElement(j);
-    return true;
-}
+    void NlohmannJSONWriter::writeEndObject()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
 
-bool NlohmannJSONWriter::writeOpenCVMat(const std::vector<int>& dims, const std::string& t)
-{
-    NlohmannJSONWriterTokenPtr token = stack.top();
-    nlohmann::json j;
-    j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "OpenCVMat";
-    j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims;
-    j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
-    token->addElement(j);
-    return true;
-}
+        if (stack.size() > 0)
+        {
+            NlohmannJSONWriterTokenPtr prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
 
-bool NlohmannJSONWriter::writePCLPointCloud(unsigned int w, unsigned int h, const std::string& t)
-{
-    NlohmannJSONWriterTokenPtr token = stack.top();
-    nlohmann::json j;
-    j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "PCLPointCloud";
-    j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = {w, h};
-    j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
-    token->addElement(j);
-    return true;
-}
+    void NlohmannJSONWriter::writeStartList()
+    {
+        nlohmann::json data;
+        auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data);
+        stack.push(new_token);
+    }
 
-bool NlohmannJSONWriter::writePosition()
-{
-    NlohmannJSONWriterTokenPtr token = stack.top();
-    nlohmann::json j;
-    j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Position";
-    token->addElement(j);
-    return true;
-}
+    void NlohmannJSONWriter::writeEndList()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
 
-bool NlohmannJSONWriter::writeOrientation()
-{
-    NlohmannJSONWriterTokenPtr token = stack.top();
-    nlohmann::json j;
-    j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Orientation";
-    token->addElement(j);
-    return true;
-}
+        if (stack.size() > 0)
+        {
+            NlohmannJSONWriterTokenPtr prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
 
-bool NlohmannJSONWriter::writePose()
-{
-    NlohmannJSONWriterTokenPtr token = stack.top();
-    nlohmann::json j;
-    j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Pose";
-    token->addElement(j);
-    return true;
-}
+    void NlohmannJSONWriter::writeStartDict()
+    {
+        nlohmann::json data;
+        auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data);
+        stack.push(new_token);
+    }
+
+    void NlohmannJSONWriter::writeEndDict()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
+        {
+            NlohmannJSONWriterTokenPtr prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
+
+    void NlohmannJSONWriter::writeStartTuple()
+    {
+        nlohmann::json data;
+        auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data);
+        stack.push(new_token);
+    }
+
+    void NlohmannJSONWriter::writeEndTuple()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
+        {
+            NlohmannJSONWriterTokenPtr prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
+
+    void NlohmannJSONWriter::writeStartPair()
+    {
+        nlohmann::json data;
+        auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data);
+        stack.push(new_token);
+    }
+
+    void NlohmannJSONWriter::writeEndPair()
+    {
+        lastRemovedToken = stack.top();
+        stack.pop();
+
+        if (stack.size() > 0)
+        {
+            NlohmannJSONWriterTokenPtr prevToken = stack.top();
+            prevToken->addElement(lastRemovedToken->getElement());
+        }
+    }
+
+    void NlohmannJSONWriter::writeEigenMatrix(const std::vector<int>& dims, const std::string& t)
+    {
+        auto token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "EigenMatrix";
+        j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims;
+        j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeEigenQuaternion(const std::string& t)
+    {
+        auto token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "EigenQuaternion";
+        j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeIVTCByteImage(unsigned int w, unsigned int h, const std::string& t)
+    {
+        auto token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "IVTCByteImage";
+        j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = {w, h};
+        j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeOpenCVMat(const std::vector<int>& dims, const std::string& t)
+    {
+        auto token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "OpenCVMat";
+        j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims;
+        j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writePCLPointCloud(unsigned int w, unsigned int h, const std::string& t)
+    {
+        auto token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "PCLPointCloud";
+        j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = {w, h};
+        j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t;
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writePosition()
+    {
+        auto token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Position";
+        token->addElement(j);
+    }
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    bool NlohmannJSONWriter::write##upperType() \
-    { \
-        NlohmannJSONWriterTokenPtr token = stack.top(); \
-        nlohmann::json j(io::Data::READER_WRITER_##capsType##_TYPENAME_SLUG); \
-        token->addElement(j); \
-        return true; \
+    void NlohmannJSONWriter::writeOrientation()
+    {
+        auto token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Orientation";
+        token->addElement(j);
     }
 
-            HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+    void NlohmannJSONWriter::writePose()
+    {
+        auto token = stack.top();
+        nlohmann::json j;
+        j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Pose";
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeInt()
+    {
+        auto token = stack.top();
+        nlohmann::json j(io::Data::READER_WRITER_INT_TYPENAME_SLUG);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeLong()
+    {
+        auto token = stack.top();
+        nlohmann::json j(io::Data::READER_WRITER_LONG_TYPENAME_SLUG);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeFloat()
+    {
+        auto token = stack.top();
+        nlohmann::json j(io::Data::READER_WRITER_FLOAT_TYPENAME_SLUG);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeDouble()
+    {
+        auto token = stack.top();
+        nlohmann::json j(io::Data::READER_WRITER_DOUBLE_TYPENAME_SLUG);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeString()
+    {
+        auto token = stack.top();
+        nlohmann::json j(io::Data::READER_WRITER_STRING_TYPENAME_SLUG);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeBool()
+    {
+        auto token = stack.top();
+        nlohmann::json j(io::Data::READER_WRITER_BOOL_TYPENAME_SLUG);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeTime()
+    {
+        auto token = stack.top();
+        nlohmann::json j(io::Data::READER_WRITER_TIME_TYPENAME_SLUG);
+        token->addElement(j);
+    }
+
+    void NlohmannJSONWriter::writeKey(const std::string& k)
+    {
+        auto token = stack.top();
+        token->setCurrentKey(k);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.h
index b200765cdf3b7d8aadaf0bba9d871abe36a103b6..7826f895e8e9fec9f3a98a12413ed1f39d12a9e9 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.h
@@ -26,43 +26,60 @@
 #include <sstream>
 
 // Base Class
-#include <RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h>
+#include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h>
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Concepts.h>
 #include <RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h>
 
 namespace armarx::aron::typeIO::writer
-        {
-            class NlohmannJSONWriter :
-                virtual public TokenizedWriter<nlohmann::json, NlohmannJSONWriterTokenPtr>
-            {
-            public:
-                NlohmannJSONWriter() = default;
+{
+    class NlohmannJSONWriter :
+        virtual public WriterInterface
+    {
+    public:
+        NlohmannJSONWriter() = default;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool writeStart##upperType() override; \
-    virtual bool writeEnd##upperType() override;
+        virtual void writeStartObject(const std::string&) override;
+        virtual void writeEndObject() override;
+        virtual void writeStartList() override;
+        virtual void writeEndList() override;
+        virtual void writeStartDict() override;
+        virtual void writeEndDict() override;
+        virtual void writeStartTuple() override;
+        virtual void writeEndTuple() override;
+        virtual void writeStartPair() override;
+        virtual void writeEndPair() override;
 
-                HANDLE_CONTAINER_TYPES
-#undef RUN_ARON_MACRO
+        virtual void writeEigenMatrix(const std::vector<int>&, const std::string&) override;
+        virtual void writeEigenQuaternion(const std::string&) override;
+        virtual void writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) override;
+        virtual void writeOpenCVMat(const std::vector<int>&, const std::string&) override;
+        virtual void writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) override;
+        virtual void writePosition() override;
+        virtual void writeOrientation() override;
+        virtual void writePose() override;
 
-    virtual bool writeEigenMatrix(const std::vector<int>&, const std::string&) override;
-    virtual bool writeEigenQuaternion(const std::string&) override;
-    virtual bool writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) override;
-    virtual bool writeOpenCVMat(const std::vector<int>&, const std::string&) override;
-    virtual bool writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) override;
-    virtual bool writePosition() override;
-    virtual bool writeOrientation() override;
-    virtual bool writePose() override;
+        virtual void writeInt() override;
+        virtual void writeLong() override;
+        virtual void writeFloat() override;
+        virtual void writeDouble() override;
+        virtual void writeString() override;
+        virtual void writeBool() override;
+        virtual void writeTime() override;
 
-#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-    virtual bool write##upperType() override;
+        virtual void writeKey(const std::string&) override;
 
-                HANDLE_PRIMITIVE_TYPES
-#undef RUN_ARON_MACRO
+        nlohmann::json getResult() const
+        {
+            return lastRemovedToken->getElement();
+        }
 
-            private:
+    private:
+        bool wroteInitialStartObject = false;
+        NlohmannJSONWriterTokenPtr lastRemovedToken = nullptr;
+        std::stack<NlohmannJSONWriterTokenPtr> stack = {};
 
-            };
+        Path generatePath();
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h
index e6c5a10753697202e46076059ad3dc2e7e8495e2..826524dddcd7c6a7d2e8bf7919240bb7d1b109b0 100644
--- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h
+++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h
@@ -32,68 +32,78 @@
 
 // ArmarX
 #include <RobotAPI/libraries/aron/core/Config.h>
+#include <RobotAPI/libraries/aron/core/Descriptor.h>
 
 namespace armarx::aron::typeIO::writer
+{
+    class NlohmannJSONWriterToken;
+    typedef std::shared_ptr<NlohmannJSONWriterToken> NlohmannJSONWriterTokenPtr;
+
+    class NlohmannJSONWriterToken :
+        virtual public WriterTokenInterface<nlohmann::json>
+    {
+    public:
+        using PointerType = NlohmannJSONWriterTokenPtr;
+
+    public:
+        // constructor
+        NlohmannJSONWriterToken() = delete;
+        NlohmannJSONWriterToken(const type::Descriptor desc, const nlohmann::json& t)
         {
-            class NlohmannJSONWriterToken;
-            typedef std::shared_ptr<NlohmannJSONWriterToken> NlohmannJSONWriterTokenPtr;
+            descriptor = desc;
+            element = t;
+        }
 
-            class NlohmannJSONWriterToken :
-                virtual public WriterToken<nlohmann::json, nlohmann::json>
+        // virtual member functions
+        virtual void addElement(const nlohmann::json& n) override
+        {
+            auto desc = getDescriptor();
+            switch (desc)
             {
-            public:
-                using PointerType = NlohmannJSONWriterTokenPtr;
-
-            public:
-                // constructor
-                NlohmannJSONWriterToken() = delete;
-                NlohmannJSONWriterToken(const type::Descriptor desc, const nlohmann::json& t) :
-                    io::WriterToken<type::Descriptor, nlohmann::json, nlohmann::json>(desc, t),
-                    WriterToken<nlohmann::json, nlohmann::json>(desc, t)
+                case type::Descriptor::eDict:
                 {
+                    element[io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG] = n;
+                    break;
                 }
-
-                // virtual member functions
-                virtual void addElement(const nlohmann::json& n) override
+                case type::Descriptor::eList:
                 {
-                    auto desc = getDescriptor();
-                    switch (desc)
-                    {
-                        case type::Descriptor::eDict:
-                        {
-                            element[io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG] = n;
-                            break;
-                        }
-                        case type::Descriptor::eList:
-                        {
-                            element[io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG] = n;
-                            break;
-                        }
-                        case type::Descriptor::eObject:
-                        {
-                            element[currentKey] = n;
-                            break;
-                        }
-                        case type::Descriptor::eTuple:
-                        {
-                            element.push_back(n);
-                            break;
-                        }
-                        default:
-                            throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers.", desc);
-                    }
+                    element[io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG] = n;
+                    break;
                 }
-
-
-                // name functions
-                void setObjectName(const std::string& n) override
+                case type::Descriptor::eObject:
                 {
-                    auto desc = getDescriptor();
-                    if (desc != type::Descriptor::eObject)
-                    {
-                        throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "setName", "Cant set the name of a non-object token.", desc);
-                    }
-                    element[io::Data::READER_WRITER_OBJECT_NAME_SLUG] = n;
+                    element[currentKey] = n;
+                    break;
                 }
-            };
+                case type::Descriptor::eTuple:
+                {
+                    element.push_back(n);
+                    break;
+                }
+                default:
+                    throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers.", desc);
+            }
+        }
+
+        void setName(const std::string& n) override
+        {
+            auto desc = getDescriptor();
+            if (desc != type::Descriptor::eObject)
+            {
+                throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "setName", "Cant set the name of a non-object token.", desc);
+            }
+            element[io::Data::READER_WRITER_NAME_SLUG] = n;
+        }
+
+    private:
+        // members
+        type::Descriptor descriptor;
+        nlohmann::json element;
+
+        // current index
+        unsigned int currentIndex;
+
+        // current key
+        std::string currentKey;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/container/Dict.cpp
index f1d5285a7e39b09cf8a3cdcd05aa681bed007a84..fd14e22ead4f1610d4f4faf4d065396f850496bc 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/container/Dict.cpp
@@ -26,70 +26,76 @@
 
 
 namespace armarx::aron::typenavigator
-        {
-            // constructors
-            DictNavigator::DictNavigator(const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eDict, path),
-                Navigator(type::Descriptor::eDict, path),
-                type(new type::AronDict())
-            {
+{
+    // constructors
+    DictNavigator::DictNavigator(const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eDict, path),
+        Navigator(type::Descriptor::eDict, path),
+        type(new type::AronDict())
+    {
 
-            }
+    }
 
-            DictNavigator::DictNavigator(const type::AronDictPtr& o, const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eDict, path),
-                Navigator(type::Descriptor::eDict, path),
-                type(o)
-            {
-                CheckAronPtrForNull("DictNavigator", "DictNavigator", getPath(), o);
-                acceptedType = FromAronType(o->acceptedType);
-            }
+    DictNavigator::DictNavigator(const type::AronDictPtr& o, const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eDict, path),
+        Navigator(type::Descriptor::eDict, path),
+        type(o)
+    {
+        CheckAronPtrForNull("DictNavigator", "DictNavigator", getPath(), o);
+        acceptedType = FromAronType(o->acceptedType);
+    }
 
-            NavigatorPtr DictNavigator::getAcceptedType() const
-            {
-                return acceptedType;
-            }
+    NavigatorPtr DictNavigator::getAcceptedType() const
+    {
+        return acceptedType;
+    }
 
-            void DictNavigator::setAcceptedType(const NavigatorPtr& a)
-            {
-                type->acceptedType = a->getResult();
-                acceptedType = a;
-            }
+    void DictNavigator::setAcceptedType(const NavigatorPtr& a)
+    {
+        type->acceptedType = a->getResult();
+        acceptedType = a;
+    }
 
-            // static methods
-            DictNavigatorPtr DictNavigator::DynamicCast(const NavigatorPtr& n)
-            {
-                return std::dynamic_pointer_cast<DictNavigator>(n);
-            }
+    type::AronDictPtr DictNavigator::toAronDictPtr() const
+    {
+        CheckAronPtrForNull("DictNavigator", "getResult", getPath(), type->acceptedType);
+        return type;
+    }
 
-            DictNavigatorPtr DictNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
-            {
-                CheckTypeNavigatorPtrForNull("DictNavigator", "DynamicCastAndCheck[Before]", n);
-                DictNavigatorPtr casted = DictNavigator::DynamicCast(n);
-                CheckTypeNavigatorPtrForNull("DictNavigator", "DynamicCastAndCheck[After]", n->getPath(), casted);
-                return casted;
-            }
+    // static methods
+    DictNavigatorPtr DictNavigator::DynamicCast(const NavigatorPtr& n)
+    {
+        return std::dynamic_pointer_cast<DictNavigator>(n);
+    }
 
-            // virtual implementations
-            std::vector<NavigatorPtr> DictNavigator::getChildren() const
-            {
-                return {acceptedType};
-            }
+    DictNavigatorPtr DictNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
+    {
+        CheckTypeNavigatorPtrForNull("DictNavigator", "DynamicCastAndCheck[Before]", n);
+        DictNavigatorPtr casted = DictNavigator::DynamicCast(n);
+        CheckTypeNavigatorPtrForNull("DictNavigator", "DynamicCastAndCheck[After]", n->getPath(), casted);
+        return casted;
+    }
 
-            size_t DictNavigator::childrenSize() const
-            {
-                return 1;
-            }
+    // virtual implementations
+    std::vector<NavigatorPtr> DictNavigator::getChildren() const
+    {
+        return {acceptedType};
+    }
 
-            type::AronTypePtr DictNavigator::getResult() const
-            {
-                CheckAronPtrForNull("DictNavigator", "getResult", getPath(), type->acceptedType);
-                return type;
-            }
+    size_t DictNavigator::childrenSize() const
+    {
+        return 1;
+    }
 
-            std::string DictNavigator::getName() const
-            {
-                return "AronDictType<" + acceptedType->getName() + ">";
-            }
+    type::AronTypePtr DictNavigator::getResult() const
+    {
+        CheckAronPtrForNull("DictNavigator", "getResult", getPath(), type->acceptedType);
+        return type;
+    }
+
+    std::string DictNavigator::getName() const
+    {
+        return "AronDictType<" + acceptedType->getName() + ">";
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/container/List.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/container/List.cpp
index 0e51b074c31b94734cdcf84b5d58ede8c66def4e..3e87c4d5fbbc7879299e9da5f20d7a2086d87465 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/container/List.cpp
@@ -25,77 +25,75 @@
 #include "List.h"
 
 namespace armarx::aron::typenavigator
-        {
-            // constructors
-            ListNavigator::ListNavigator(const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eList, path),
-                Navigator(type::Descriptor::eList, path),
-                type(new type::AronList())
-            {
-            }
+{
+    // constructors
+    ListNavigator::ListNavigator(const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eList, path),
+        Navigator(type::Descriptor::eList, path),
+        type(new type::AronList())
+    {
+    }
 
-            ListNavigator::ListNavigator(const type::AronListPtr& o, const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eList, path),
-                Navigator(type::Descriptor::eList, path),
-                type(o)
-            {
-                CheckAronPtrForNull("ListNavigator", "ListNavigator", getPath(), o);
-                acceptedType = FromAronType(o->acceptedType);
-            }
+    ListNavigator::ListNavigator(const type::AronListPtr& o, const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eList, path),
+        Navigator(type::Descriptor::eList, path),
+        type(o)
+    {
+        CheckAronPtrForNull("ListNavigator", "ListNavigator", getPath(), o);
+        acceptedType = FromAronType(o->acceptedType);
+    }
 
-            // Member functions
-            NavigatorPtr ListNavigator::getAcceptedType() const
-            {
-                return acceptedType;
-            }
+    // Member functions
+    NavigatorPtr ListNavigator::getAcceptedType() const
+    {
+        return acceptedType;
+    }
 
-            void ListNavigator::setAcceptedType(const NavigatorPtr& a)
-            {
-                CheckTypeNavigatorPtrForNull("ListNavigator", "setAcceptedType", a);
-                type->acceptedType = a->getResult();
-                acceptedType = a;
-            }
+    void ListNavigator::setAcceptedType(const NavigatorPtr& a)
+    {
+        CheckTypeNavigatorPtrForNull("ListNavigator", "setAcceptedType", a);
+        type->acceptedType = a->getResult();
+        acceptedType = a;
+    }
 
-            // static methods
-            ListNavigatorPtr ListNavigator::DynamicCast(const NavigatorPtr& n)
-            {
-                return std::dynamic_pointer_cast<ListNavigator>(n);
-            }
+    // static methods
+    ListNavigatorPtr ListNavigator::DynamicCast(const NavigatorPtr& n)
+    {
+        return std::dynamic_pointer_cast<ListNavigator>(n);
+    }
 
-            ListNavigatorPtr ListNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
-            {
-                CheckTypeNavigatorPtrForNull("ListNavigator", "DynamicCast[Before]", n);
-                ListNavigatorPtr casted = ListNavigator::DynamicCast(n);
-                CheckTypeNavigatorPtrForNull("ListNavigator", "DynamicCast[After]", n->getPath(), casted);
-                return casted;
-            }
+    ListNavigatorPtr ListNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
+    {
+        CheckTypeNavigatorPtrForNull("ListNavigator", "DynamicCast[Before]", n);
+        ListNavigatorPtr casted = ListNavigator::DynamicCast(n);
+        CheckTypeNavigatorPtrForNull("ListNavigator", "DynamicCast[After]", n->getPath(), casted);
+        return casted;
+    }
 
-            type::AronListPtr ListNavigator::toAronListPtr() const
-            {
-                CheckAronPtrForNull("ListNavigator", "getCastedResult", getPath(), type->acceptedType);
-                return type;
-            }
+    type::AronListPtr ListNavigator::toAronListPtr() const
+    {
+        CheckAronPtrForNull("ListNavigator", "getCastedResult", getPath(), type->acceptedType);
+        return type;
+    }
 
-            // virtual implementations
-            std::vector<NavigatorPtr> ListNavigator::getChildren() const
-            {
-                return {acceptedType};
-            }
+    // virtual implementations
+    std::vector<NavigatorPtr> ListNavigator::getChildren() const
+    {
+        return {acceptedType};
+    }
 
-            size_t ListNavigator::childrenSize() const
-            {
-                return 1;
-            }
-
-            type::AronTypePtr ListNavigator::getResult() const
-            {
-                return toAronListPtr();
-            }
-
-            std::string ListNavigator::getName() const
-            {
-                return "AronListType<" + acceptedType->getName() + ">";
-            }
+    size_t ListNavigator::childrenSize() const
+    {
+        return 1;
+    }
 
+    type::AronTypePtr ListNavigator::getResult() const
+    {
+        return toAronListPtr();
+    }
 
+    std::string ListNavigator::getName() const
+    {
+        return "AronListType<" + acceptedType->getName() + ">";
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.cpp
index 0e8a8347c56c18093fac3481bf83baa55e5ee7ef..60e8947d4f9876b61c42add47979921e33395567 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.cpp
@@ -26,91 +26,110 @@
 
 
 namespace armarx::aron::typenavigator
+{
+    // constructors
+    PairNavigator::PairNavigator(const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePair, path),
+        Navigator(type::Descriptor::ePair, path),
+        type(new type::AronPair())
+    {
+
+    }
+
+    PairNavigator::PairNavigator(const type::AronPairPtr& o, const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePair, path),
+        Navigator(type::Descriptor::ePair, path),
+        type(o)
+    {
+        CheckAronPtrForNull("AronPairTypeNavigator", "AronPairTypeNavigator", getPath(), o);
+
+        acceptedType1 = FromAronType(o->acceptedType1);
+        acceptedType2 = FromAronType(o->acceptedType2);
+    }
+
+    // Member functions
+    std::pair<NavigatorPtr, NavigatorPtr> PairNavigator::getAcceptedTypes() const
+    {
+        return {acceptedType1, acceptedType2};
+    }
+
+    NavigatorPtr PairNavigator::getFirstAcceptedType() const
+    {
+        return acceptedType1;
+    }
+
+    NavigatorPtr PairNavigator::getSecondAcceptedType() const
+    {
+        return acceptedType2;
+    }
+
+    void PairNavigator::addAcceptedType(const NavigatorPtr& n)
+    {
+        if (acceptedType1 == nullptr)
         {
-            // constructors
-            PairNavigator::PairNavigator(const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePair, path),
-                Navigator(type::Descriptor::ePair, path),
-                type(new type::AronPair())
-            {
-
-            }
-
-            PairNavigator::PairNavigator(const type::AronPairPtr& o, const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePair, path),
-                Navigator(type::Descriptor::ePair, path),
-                type(o)
-            {
-                CheckAronPtrForNull("AronPairTypeNavigator", "AronPairTypeNavigator", getPath(), o);
-
-                acceptedType1 = FromAronType(o->acceptedType1);
-                acceptedType2 = FromAronType(o->acceptedType2);
-            }
-
-            // Member functions
-            std::pair<NavigatorPtr, NavigatorPtr> PairNavigator::getAcceptedTypes() const
-            {
-                return {acceptedType1, acceptedType2};
-            }
-
-            NavigatorPtr PairNavigator::getFirstAcceptedType() const
-            {
-                return acceptedType1;
-            }
-
-            NavigatorPtr PairNavigator::getSecondAcceptedType() const
-            {
-                return acceptedType2;
-            }
-
-            void PairNavigator::setFirstAcceptedType(const NavigatorPtr& n)
-            {
-                acceptedType1 = n;
-            }
-
-            void PairNavigator::setSecondAcceptedType(const NavigatorPtr& n)
-            {
-                acceptedType2 = n;
-            }
-
-            type::AronPairPtr PairNavigator::toAronPairPtr() const
-            {
-                return type;
-            }
-
-            // static methods
-            PairNavigatorPtr PairNavigator::DynamicCast(const NavigatorPtr& n)
-            {
-                return std::dynamic_pointer_cast<PairNavigator>(n);
-            }
-
-            PairNavigatorPtr PairNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
-            {
-                CheckTypeNavigatorPtrForNull("AronPairTypeNavigator", "DynamicCastAndCheck[Before]", n);
-                PairNavigatorPtr casted = PairNavigator::DynamicCast(n);
-                CheckTypeNavigatorPtrForNull("AronPairTypeNavigator", "DynamicCastAndCheck[After]", n->getPath(), casted);
-                return casted;
-            }
-
-            // virtual implementations
-            std::vector<NavigatorPtr> PairNavigator::getChildren() const
-            {
-                return {acceptedType1, acceptedType2};
-            }
-
-            size_t PairNavigator::childrenSize() const
-            {
-                return 2;
-            }
-
-            type::AronTypePtr PairNavigator::getResult() const
-            {
-                return type;
-            }
-
-            std::string PairNavigator::getName() const
-            {
-                return "AronPairType<" + acceptedType1->getName() + ", " + acceptedType2->getName() + ">";
-            }
+            acceptedType1 = n;
+            return;
+        }
+        if (acceptedType2 == nullptr)
+        {
+            acceptedType2 = n;
+            return;
+        }
+        throw error::AronException("PairNavigator", "addAcceptedType", "Both types are already set", getPath());
+    }
+
+    void PairNavigator::setFirstAcceptedType(const NavigatorPtr& n)
+    {
+        acceptedType1 = n;
+    }
+
+    void PairNavigator::setSecondAcceptedType(const NavigatorPtr& n)
+    {
+        acceptedType2 = n;
+    }
+
+    type::AronPairPtr PairNavigator::toAronPairPtr() const
+    {
+        CheckAronPtrForNull("PairNavigator", "getResult", getPath(), type->acceptedType1);
+        CheckAronPtrForNull("PairNavigator", "getResult", getPath(), type->acceptedType2);
+        return type;
+    }
+
+    // static methods
+    PairNavigatorPtr PairNavigator::DynamicCast(const NavigatorPtr& n)
+    {
+        return std::dynamic_pointer_cast<PairNavigator>(n);
+    }
+
+    PairNavigatorPtr PairNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
+    {
+        CheckTypeNavigatorPtrForNull("AronPairTypeNavigator", "DynamicCastAndCheck[Before]", n);
+        PairNavigatorPtr casted = PairNavigator::DynamicCast(n);
+        CheckTypeNavigatorPtrForNull("AronPairTypeNavigator", "DynamicCastAndCheck[After]", n->getPath(), casted);
+        return casted;
+    }
+
+    // virtual implementations
+    std::vector<NavigatorPtr> PairNavigator::getChildren() const
+    {
+        return {acceptedType1, acceptedType2};
+    }
+
+    size_t PairNavigator::childrenSize() const
+    {
+        return 2;
+    }
+
+    type::AronTypePtr PairNavigator::getResult() const
+    {
+        CheckAronPtrForNull("PairNavigator", "getResult", getPath(), type->acceptedType1);
+        CheckAronPtrForNull("PairNavigator", "getResult", getPath(), type->acceptedType2);
+        return type;
+    }
+
+    std::string PairNavigator::getName() const
+    {
+        return "AronPairType<" + acceptedType1->getName() + ", " + acceptedType2->getName() + ">";
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.h b/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.h
index 759c95282ffb9f574029e87034b8d5eefff74d03..999a6c85656aa3ee4b5adc353e3cdbc26d770ce5 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.h
@@ -32,43 +32,44 @@
 
 namespace armarx::aron::typenavigator
 {
-            class PairNavigator;
-            typedef std::shared_ptr<PairNavigator> PairNavigatorPtr;
+    class PairNavigator;
+    typedef std::shared_ptr<PairNavigator> PairNavigatorPtr;
 
-            class PairNavigator :
-                virtual public Navigator
-            {
-            public:
-                using PointerType = PairNavigatorPtr;
+    class PairNavigator :
+        virtual public Navigator
+    {
+    public:
+        using PointerType = PairNavigatorPtr;
 
-            public:
-                // constructors
-                PairNavigator(const Path& path = Path());
-                PairNavigator(const type::AronPairPtr&, const Path& path = Path());
+    public:
+        // constructors
+        PairNavigator(const Path& path = Path());
+        PairNavigator(const type::AronPairPtr&, const Path& path = Path());
 
-                std::pair<NavigatorPtr, NavigatorPtr> getAcceptedTypes() const;
-                NavigatorPtr getFirstAcceptedType() const;
-                NavigatorPtr getSecondAcceptedType() const;
-                void setFirstAcceptedType(const NavigatorPtr&);
-                void setSecondAcceptedType(const NavigatorPtr&);
+        std::pair<NavigatorPtr, NavigatorPtr> getAcceptedTypes() const;
+        NavigatorPtr getFirstAcceptedType() const;
+        NavigatorPtr getSecondAcceptedType() const;
+        void addAcceptedType(const NavigatorPtr&);
+        void setFirstAcceptedType(const NavigatorPtr&);
+        void setSecondAcceptedType(const NavigatorPtr&);
 
-                type::AronPairPtr toAronPairPtr() const;
+        type::AronPairPtr toAronPairPtr() const;
 
-                // static methods
-                static PairNavigatorPtr DynamicCast(const NavigatorPtr& n);
-                static PairNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n);
+        // static methods
+        static PairNavigatorPtr DynamicCast(const NavigatorPtr& n);
+        static PairNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n);
 
-                // virtual implementations
-                virtual std::vector<NavigatorPtr> getChildren() const override;
-                virtual size_t childrenSize() const override;
-                virtual type::AronTypePtr getResult() const override;
-                virtual std::string getName() const override;
+        // virtual implementations
+        virtual std::vector<NavigatorPtr> getChildren() const override;
+        virtual size_t childrenSize() const override;
+        virtual type::AronTypePtr getResult() const override;
+        virtual std::string getName() const override;
 
-            private:
-                // members
-                NavigatorPtr acceptedType1;
-                NavigatorPtr acceptedType2;
-                type::AronPairPtr type;
+    private:
+        // members
+        NavigatorPtr acceptedType1;
+        NavigatorPtr acceptedType2;
+        type::AronPairPtr type;
 
-            };
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.cpp
index a68340d9a894d49561a4f4db0f18469e0be1ae51..8d76320d402b315e5b06db15c6bbd85986da5da3 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.cpp
@@ -25,123 +25,125 @@
 #include "IVTCByteImage.h"
 
 namespace armarx::aron::typenavigator
+{
+    // constructors
+    IVTCByteImageNavigator::IVTCByteImageNavigator(const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eIVTCByteImage, path),
+        Navigator(type::Descriptor::eIVTCByteImage, path),
+        type(new type::AronIVTCByteImage(0, 0, ""))
+    {
+    }
+
+    IVTCByteImageNavigator::IVTCByteImageNavigator(const type::AronIVTCByteImagePtr& o, const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eIVTCByteImage, path),
+        Navigator(type::Descriptor::eIVTCByteImage, path),
+        type(o)
+    {
+        CheckAronPtrForNull("AronIVTCByteImageTypeNavigator", "AronIVTCByteImageTypeNavigator", getPath(), o);
+    }
+
+    std::string IVTCByteImageNavigator::checkTypename(const std::string& s) const
+    {
+        for (const auto& [key, list] : ACCEPTED_TYPES)
         {
-            // constructors
-            IVTCByteImageNavigator::IVTCByteImageNavigator(const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eIVTCByteImage, path),
-                Navigator(type::Descriptor::eIVTCByteImage, path),
-                type(new type::AronIVTCByteImage(0, 0, ""))
+            if (s == key)
             {
+                return key;
             }
 
-            IVTCByteImageNavigator::IVTCByteImageNavigator(const type::AronIVTCByteImagePtr& o, const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eIVTCByteImage, path),
-                Navigator(type::Descriptor::eIVTCByteImage, path),
-                type(o)
+            for (const auto& el : list)
             {
-                CheckAronPtrForNull("AronIVTCByteImageTypeNavigator", "AronIVTCByteImageTypeNavigator", getPath(), o);
-            }
-
-            bool IVTCByteImageNavigator::checkTypename(const std::string& s) const
-            {
-                if (s.empty())
-                {
-                    throw error::AronException("AronIVTCByteImageTypeNavigator", "checkTypename", "The typename is empty.", getPath());
-                }
-
-                if (!std::any_of(ACCEPTED_TYPES.begin(), ACCEPTED_TYPES.end(), [s](const auto & el)
-            {
-                return s == el.first || std::find(el.second.begin(), el.second.end(), s) != el.second.end();
-                }))
-                {
-                    throw error::AronException("AronIVTCByteImageTypeNavigator", "checkTypename", "The typename is wrong. Got " + s, getPath());
-                }
-                return true;
-            }
-
-            type::AronIVTCByteImagePtr IVTCByteImageNavigator::toAronIVTCByteImagePtr() const
-            {
-                checkTypename(type->typeName);
-                return type;
-            }
-
-            std::vector<int> IVTCByteImageNavigator::getDimensions() const
-            {
-                return {type->width, type->height};
-            }
-
-            unsigned int IVTCByteImageNavigator::getWidth() const
-            {
-                return type->width;
-            }
-
-            unsigned int IVTCByteImageNavigator::getHeight() const
-            {
-                return type->height;
-            }
-
-            std::string IVTCByteImageNavigator::getTypename() const
-            {
-                return type->typeName;
-            }
-
-            void IVTCByteImageNavigator::setWidth(const unsigned int& w)
-            {
-                if (w == 0)
+                if (s == el)
                 {
-                    throw error::AronException("AronIVTCByteImageTypeNavigator", "setWidth", "The width of an image cannot be 0", getPath());
+                    return key;
                 }
-                type->width = w;
-            }
-
-            void IVTCByteImageNavigator::setHeight(const unsigned int& h)
-            {
-                if (h == 0)
-                {
-                    throw error::AronException("AronIVTCByteImageTypeNavigator", "setHeight", "The height of an image cannot be 0", getPath());
-                }
-                type->height = h;
-            }
-
-            void IVTCByteImageNavigator::setTypename(const std::string& u)
-            {
-                checkTypename(u);
-                type->typeName = u;
-            }
-
-            // static methods
-            IVTCByteImageNavigatorPtr IVTCByteImageNavigator::DynamicCast(const NavigatorPtr& n)
-            {
-                return std::dynamic_pointer_cast<IVTCByteImageNavigator>(n);
-            }
-
-            IVTCByteImageNavigatorPtr IVTCByteImageNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
-            {
-                CheckTypeNavigatorPtrForNull("AronIVTCByteImageTypeNavigator", "DynamicCast[Before]", n);
-                IVTCByteImageNavigatorPtr casted = IVTCByteImageNavigator::DynamicCast(n);
-                CheckTypeNavigatorPtrForNull("AronIVTCByteImageTypeNavigator", "DynamicCast[After]", n->getPath(), casted);
-                return casted;
-            }
-
-            // virtual implementations
-            std::vector<NavigatorPtr> IVTCByteImageNavigator::getChildren() const
-            {
-                return {};
-            }
-
-            size_t IVTCByteImageNavigator::childrenSize() const
-            {
-                return 0;
-            }
-
-            type::AronTypePtr IVTCByteImageNavigator::getResult() const
-            {
-                return toAronIVTCByteImagePtr();
-            }
-
-            std::string IVTCByteImageNavigator::getName() const
-            {
-                return "AronIVTCByteImageType<" + simox::alg::to_string(getDimensions(), ", ") + ", " + type->typeName + ">";
             }
+        }
+        throw error::AronException("AronIVTCByteImageTypeNavigator", "checkTypename", "The typename is empty.", getPath());
+    }
+
+    type::AronIVTCByteImagePtr IVTCByteImageNavigator::toAronIVTCByteImagePtr() const
+    {
+        checkTypename(type->typeName);
+        return type;
+    }
+
+    std::vector<int> IVTCByteImageNavigator::getDimensions() const
+    {
+        return {type->width, type->height};
+    }
+
+    unsigned int IVTCByteImageNavigator::getWidth() const
+    {
+        return type->width;
+    }
+
+    unsigned int IVTCByteImageNavigator::getHeight() const
+    {
+        return type->height;
+    }
+
+    std::string IVTCByteImageNavigator::getTypename() const
+    {
+        return type->typeName;
+    }
+
+    void IVTCByteImageNavigator::setWidth(const unsigned int& w)
+    {
+        if (w == 0)
+        {
+            throw error::AronException("AronIVTCByteImageTypeNavigator", "setWidth", "The width of an image cannot be 0", getPath());
+        }
+        type->width = w;
+    }
+
+    void IVTCByteImageNavigator::setHeight(const unsigned int& h)
+    {
+        if (h == 0)
+        {
+            throw error::AronException("AronIVTCByteImageTypeNavigator", "setHeight", "The height of an image cannot be 0", getPath());
+        }
+        type->height = h;
+    }
+
+    void IVTCByteImageNavigator::setTypename(const std::string& u)
+    {
+        type->typeName = checkTypename(u);
+    }
+
+    // static methods
+    IVTCByteImageNavigatorPtr IVTCByteImageNavigator::DynamicCast(const NavigatorPtr& n)
+    {
+        return std::dynamic_pointer_cast<IVTCByteImageNavigator>(n);
+    }
+
+    IVTCByteImageNavigatorPtr IVTCByteImageNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
+    {
+        CheckTypeNavigatorPtrForNull("AronIVTCByteImageTypeNavigator", "DynamicCast[Before]", n);
+        IVTCByteImageNavigatorPtr casted = IVTCByteImageNavigator::DynamicCast(n);
+        CheckTypeNavigatorPtrForNull("AronIVTCByteImageTypeNavigator", "DynamicCast[After]", n->getPath(), casted);
+        return casted;
+    }
+
+    // virtual implementations
+    std::vector<NavigatorPtr> IVTCByteImageNavigator::getChildren() const
+    {
+        return {};
+    }
+
+    size_t IVTCByteImageNavigator::childrenSize() const
+    {
+        return 0;
+    }
+
+    type::AronTypePtr IVTCByteImageNavigator::getResult() const
+    {
+        return toAronIVTCByteImagePtr();
+    }
+
+    std::string IVTCByteImageNavigator::getName() const
+    {
+        return "AronIVTCByteImageType<" + simox::alg::to_string(getDimensions(), ", ") + ", " + type->typeName + ">";
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.h b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.h
index 9628e6c8ec00ccff6da984ace665e198d3b39fdd..aeaf5a3c7f8057cda95706a91637f11ea25fec3e 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.h
@@ -32,54 +32,54 @@
 
 namespace armarx::aron::typenavigator
 {
-            class IVTCByteImageNavigator;
-            typedef std::shared_ptr<IVTCByteImageNavigator> IVTCByteImageNavigatorPtr;
+    class IVTCByteImageNavigator;
+    typedef std::shared_ptr<IVTCByteImageNavigator> IVTCByteImageNavigatorPtr;
 
-            class IVTCByteImageNavigator :
-                virtual public Navigator
-            {
-            public:
-                using PointerType = IVTCByteImageNavigatorPtr;
+    class IVTCByteImageNavigator :
+        virtual public Navigator
+    {
+    public:
+        using PointerType = IVTCByteImageNavigatorPtr;
 
-            public:
-                // constructors
-                IVTCByteImageNavigator() = delete;
-                IVTCByteImageNavigator(const Path& path);
-                IVTCByteImageNavigator(const type::AronIVTCByteImagePtr&, const Path& path);
+    public:
+        // constructors
+        IVTCByteImageNavigator() = delete;
+        IVTCByteImageNavigator(const Path& path);
+        IVTCByteImageNavigator(const type::AronIVTCByteImagePtr&, const Path& path);
 
-                bool checkTypename(const std::string&) const;
+        std::string checkTypename(const std::string&) const;
 
-                unsigned int getWidth() const;
-                unsigned int getHeight() const;
-                std::string getTypename() const;
-                std::vector<int> getDimensions() const;
+        unsigned int getWidth() const;
+        unsigned int getHeight() const;
+        std::string getTypename() const;
+        std::vector<int> getDimensions() const;
 
-                void setWidth(const unsigned int&);
-                void setHeight(const unsigned int&);
-                void setTypename(const std::string&);
+        void setWidth(const unsigned int&);
+        void setHeight(const unsigned int&);
+        void setTypename(const std::string&);
 
-                type::AronIVTCByteImagePtr toAronIVTCByteImagePtr() const;
+        type::AronIVTCByteImagePtr toAronIVTCByteImagePtr() const;
 
-                // static methods
-                static IVTCByteImageNavigatorPtr DynamicCast(const NavigatorPtr& n);
-                static IVTCByteImageNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n);
+        // static methods
+        static IVTCByteImageNavigatorPtr DynamicCast(const NavigatorPtr& n);
+        static IVTCByteImageNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n);
 
-                // virtual implementations
-                virtual std::vector<NavigatorPtr> getChildren() const override;
-                virtual size_t childrenSize() const override;
-                virtual type::AronTypePtr getResult() const override;
-                virtual std::string getName() const override;
+        // virtual implementations
+        virtual std::vector<NavigatorPtr> getChildren() const override;
+        virtual size_t childrenSize() const override;
+        virtual type::AronTypePtr getResult() const override;
+        virtual std::string getName() const override;
 
-            public:
-                const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES =
-                {
-                    {"GrayScale", {"CByteImage::ImageType::eGrayScale"}},
-                    {"RGB24", {"CByteImage::ImageType::eRGB24"}},
-                    {"RGB24Split", {"CByteImage::ImageType::eRGB24Split"}}
-                };
+    public:
+        const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES =
+        {
+            {"GrayScale", {"CByteImage::ImageType::eGrayScale", "ImageType::eGrayScale"}},
+            {"RGB24", {"CByteImage::ImageType::eRGB24", "ImageType::eRGB24"}},
+            {"RGB24Split", {"CByteImage::ImageType::eRGB24Split", "ImageType::eRGB24Split"}}
+        };
 
-            private:
-                // members
-                type::AronIVTCByteImagePtr type;
-            };
+    private:
+        // members
+        type::AronIVTCByteImagePtr type;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.cpp
index 9e9a69fbeefe844ef90815d6eb5730211369edbd..e0d159cc3fc108c2bfb14d15fa6846e6c97d654f 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.cpp
@@ -25,122 +25,124 @@
 #include "OpenCVMat.h"
 
 namespace armarx::aron::typenavigator
+{
+    // constructors
+    OpenCVMatNavigator::OpenCVMatNavigator(const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eOpenCVMat, path),
+        Navigator(type::Descriptor::eOpenCVMat, path),
+        type(new type::AronOpenCVMat({}, ""))
+    {
+    }
+
+    OpenCVMatNavigator::OpenCVMatNavigator(const type::AronOpenCVMatPtr& o, const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eOpenCVMat, path),
+        Navigator(type::Descriptor::eOpenCVMat, path),
+        type(o)
+    {
+        CheckAronPtrForNull("AronOpenCVMatTypeNavigator", "AronOpenCVMatTypeNavigator", getPath(), o);
+        checkDimensions(type->dimensions);
+        checkTypename(type->typeName);
+    }
+
+    bool OpenCVMatNavigator::checkDimensions(const std::vector<int>& d) const
+    {
+        if (d.size() < ACCEPTED_DIMENSION_MIN_SIZE)
         {
-            // constructors
-            OpenCVMatNavigator::OpenCVMatNavigator(const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eOpenCVMat, path),
-                Navigator(type::Descriptor::eOpenCVMat, path),
-                type(new type::AronOpenCVMat({}, ""))
-            {
-            }
+            throw error::AronException("AronOpenCVMatTypeNavigator", "checkDimensions", "The dimension size is wrong. Got size: " + std::to_string(d.size()), getPath());
+        }
 
-            OpenCVMatNavigator::OpenCVMatNavigator(const type::AronOpenCVMatPtr& o, const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eOpenCVMat, path),
-                Navigator(type::Descriptor::eOpenCVMat, path),
-                type(o)
-            {
-                CheckAronPtrForNull("AronOpenCVMatTypeNavigator", "AronOpenCVMatTypeNavigator", getPath(), o);
-                checkDimensions(type->dimensions);
-                checkTypename(type->typeName);
-            }
-
-            bool OpenCVMatNavigator::checkDimensions(const std::vector<int>& d) const
-            {
-                if (d.size() < ACCEPTED_DIMENSION_MIN_SIZE)
-                {
-                    throw error::AronException("AronOpenCVMatTypeNavigator", "checkDimensions", "The dimension size is wrong. Got size: " + std::to_string(d.size()), getPath());
-                }
-
-                if (std::any_of(d.begin(), d.end(), [](int i)
+        if (std::any_of(d.begin(), d.end(), [](int i)
+    {
+        return i < -1 || i == 0;
+    }))
+        {
+            throw error::AronException("AronOpenCVMatTypeNavigator", "checkDimensions", "The dimension size is wrong. At least one empty is < -1 or 0. Got as dimension: " + simox::alg::to_string(d, ", "), getPath());
+        }
+        return true;
+    }
+
+    std::string OpenCVMatNavigator::checkTypename(const std::string& s) const
+    {
+        for (const auto& [key, list] : ACCEPTED_TYPES)
+        {
+            if (s == key)
             {
-                return i < -1 || i == 0;
-            }))
-                {
-                    throw error::AronException("AronOpenCVMatTypeNavigator", "checkDimensions", "The dimension size is wrong. At least one empty is < -1 or 0. Got as dimension: " + simox::alg::to_string(d, ", "), getPath());
-                }
-                return true;
+                return key;
             }
 
-            bool OpenCVMatNavigator::checkTypename(const std::string& s) const
+            for (const auto& el : list)
             {
-                if (s.empty())
+                if (s == el)
                 {
-                    throw error::AronException("AronOpenCVMatTypeNavigator", "checkTypename", "The typename is empty.", getPath());
+                    return key;
                 }
-
-                if (!std::any_of(ACCEPTED_TYPES.begin(), ACCEPTED_TYPES.end(), [s](const auto & el)
-            {
-                return s == el.first || std::find(el.second.begin(), el.second.end(), s) != el.second.end();
-                }))
-                {
-                    throw error::AronException("AronOpenCVMatTypeNavigator", "checkTypename", "The typename is wrong. Got " + s, getPath());
-                }
-                return true;
-            }
-
-            type::AronOpenCVMatPtr OpenCVMatNavigator::toAronOpenCVMatPtr() const
-            {
-                checkDimensions(type->dimensions);
-                checkTypename(type->typeName);
-                return type;
-            }
-
-            std::string OpenCVMatNavigator::getTypename() const
-            {
-                return type->typeName;
-            }
-
-            std::vector<int> OpenCVMatNavigator::getDimensions() const
-            {
-                return type->dimensions;
-            }
-
-            void OpenCVMatNavigator::setTypename(const std::string& u)
-            {
-                checkTypename(u);
-                type->typeName = u;
-            }
-
-            void OpenCVMatNavigator::setDimensions(const std::vector<int>& d)
-            {
-                checkDimensions(d);
-                type->dimensions = d;
-            }
-
-
-            // static methods
-            OpenCVMatNavigatorPtr OpenCVMatNavigator::DynamicCast(const NavigatorPtr& n)
-            {
-                return std::dynamic_pointer_cast<OpenCVMatNavigator>(n);
-            }
-
-            OpenCVMatNavigatorPtr OpenCVMatNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
-            {
-                CheckTypeNavigatorPtrForNull("AronOpenCVMatTypeNavigator", "DynamicCast[Before]", n);
-                OpenCVMatNavigatorPtr casted = OpenCVMatNavigator::DynamicCast(n);
-                CheckTypeNavigatorPtrForNull("AronOpenCVMatTypeNavigator", "DynamicCast[After]", n->getPath(), casted);
-                return casted;
-            }
-
-            // virtual implementations
-            std::vector<NavigatorPtr> OpenCVMatNavigator::getChildren() const
-            {
-                return {};
-            }
-
-            size_t OpenCVMatNavigator::childrenSize() const
-            {
-                return 0;
-            }
-
-            type::AronTypePtr OpenCVMatNavigator::getResult() const
-            {
-                return toAronOpenCVMatPtr();
-            }
-
-            std::string OpenCVMatNavigator::getName() const
-            {
-                return "AronOpenCVMatType<" + simox::alg::to_string(type->dimensions, ", ") + ", " + type->typeName + ">";
             }
+        }
+        throw error::AronException("OpenCVMatNavigator", "checkTypename", "The typename is empty.", getPath());
+    }
+
+    type::AronOpenCVMatPtr OpenCVMatNavigator::toAronOpenCVMatPtr() const
+    {
+        checkDimensions(type->dimensions);
+        checkTypename(type->typeName);
+        return type;
+    }
+
+    std::string OpenCVMatNavigator::getTypename() const
+    {
+        return type->typeName;
+    }
+
+    std::vector<int> OpenCVMatNavigator::getDimensions() const
+    {
+        return type->dimensions;
+    }
+
+    void OpenCVMatNavigator::setTypename(const std::string& u)
+    {
+        type->typeName = checkTypename(u);
+    }
+
+    void OpenCVMatNavigator::setDimensions(const std::vector<int>& d)
+    {
+        checkDimensions(d);
+        type->dimensions = d;
+    }
+
+
+    // static methods
+    OpenCVMatNavigatorPtr OpenCVMatNavigator::DynamicCast(const NavigatorPtr& n)
+    {
+        return std::dynamic_pointer_cast<OpenCVMatNavigator>(n);
+    }
+
+    OpenCVMatNavigatorPtr OpenCVMatNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
+    {
+        CheckTypeNavigatorPtrForNull("AronOpenCVMatTypeNavigator", "DynamicCast[Before]", n);
+        OpenCVMatNavigatorPtr casted = OpenCVMatNavigator::DynamicCast(n);
+        CheckTypeNavigatorPtrForNull("AronOpenCVMatTypeNavigator", "DynamicCast[After]", n->getPath(), casted);
+        return casted;
+    }
+
+    // virtual implementations
+    std::vector<NavigatorPtr> OpenCVMatNavigator::getChildren() const
+    {
+        return {};
+    }
+
+    size_t OpenCVMatNavigator::childrenSize() const
+    {
+        return 0;
+    }
+
+    type::AronTypePtr OpenCVMatNavigator::getResult() const
+    {
+        return toAronOpenCVMatPtr();
+    }
+
+    std::string OpenCVMatNavigator::getName() const
+    {
+        return "AronOpenCVMatType<" + simox::alg::to_string(type->dimensions, ", ") + ", " + type->typeName + ">";
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.h b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.h
index 305db77e2d6edbf1c2c5b4564ed08ab2d21113a0..4a1c0a88fb65404a0d0eab15ca54d0129af180d7 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.h
@@ -32,57 +32,57 @@
 
 namespace armarx::aron::typenavigator
 {
-            class OpenCVMatNavigator;
-            typedef std::shared_ptr<OpenCVMatNavigator> OpenCVMatNavigatorPtr;
+    class OpenCVMatNavigator;
+    typedef std::shared_ptr<OpenCVMatNavigator> OpenCVMatNavigatorPtr;
 
-            class OpenCVMatNavigator :
-                virtual public Navigator
-            {
-            public:
-                using PointerType = OpenCVMatNavigatorPtr;
+    class OpenCVMatNavigator :
+        virtual public Navigator
+    {
+    public:
+        using PointerType = OpenCVMatNavigatorPtr;
 
-            public:
-                // constructors
-                OpenCVMatNavigator() = delete;
-                OpenCVMatNavigator(const Path& path);
-                OpenCVMatNavigator(const type::AronOpenCVMatPtr&, const Path& path);
+    public:
+        // constructors
+        OpenCVMatNavigator() = delete;
+        OpenCVMatNavigator(const Path& path);
+        OpenCVMatNavigator(const type::AronOpenCVMatPtr&, const Path& path);
 
-                bool checkDimensions(const std::vector<int>&) const;
-                bool checkTypename(const std::string&) const;
+        bool checkDimensions(const std::vector<int>&) const;
+        std::string checkTypename(const std::string&) const;
 
-                std::string getTypename() const;
-                std::vector<int> getDimensions() const;
+        std::string getTypename() const;
+        std::vector<int> getDimensions() const;
 
-                void setDimensions(const std::vector<int>&);
-                void setTypename(const std::string&);
+        void setDimensions(const std::vector<int>&);
+        void setTypename(const std::string&);
 
-                type::AronOpenCVMatPtr toAronOpenCVMatPtr() const;
+        type::AronOpenCVMatPtr toAronOpenCVMatPtr() const;
 
-                // static methods
-                static OpenCVMatNavigatorPtr DynamicCast(const NavigatorPtr& n);
-                static OpenCVMatNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n);
+        // static methods
+        static OpenCVMatNavigatorPtr DynamicCast(const NavigatorPtr& n);
+        static OpenCVMatNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n);
 
-                // virtual implementations
-                virtual std::vector<NavigatorPtr> getChildren() const override;
-                virtual size_t childrenSize() const override;
-                virtual type::AronTypePtr getResult() const override;
-                virtual std::string getName() const override;
+        // virtual implementations
+        virtual std::vector<NavigatorPtr> getChildren() const override;
+        virtual size_t childrenSize() const override;
+        virtual type::AronTypePtr getResult() const override;
+        virtual std::string getName() const override;
 
-            public:
-                const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES =
-                {
-                    {"CV_8U", {"8U"}},
-                    {"CV_8S", {"8S"}},
-                    {"CV_16U", {"16U"}},
-                    {"CV_16S", {"16S"}},
-                    {"CV_32S", {"32S"}},
-                    {"CV_32F", {"32F"}},
-                    {"CV_64F", {"64F"}}
-                };
-                const unsigned int ACCEPTED_DIMENSION_MIN_SIZE = 2;
+    public:
+        const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES =
+        {
+            {"CV_8U", {"8U"}},
+            {"CV_8S", {"8S"}},
+            {"CV_16U", {"16U"}},
+            {"CV_16S", {"16S"}},
+            {"CV_32S", {"32S"}},
+            {"CV_32F", {"32F"}},
+            {"CV_64F", {"64F"}}
+        };
+        const unsigned int ACCEPTED_DIMENSION_MIN_SIZE = 2;
 
-            private:
-                // members
-                type::AronOpenCVMatPtr type;
-            };
+    private:
+        // members
+        type::AronOpenCVMatPtr type;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.cpp
index 6ba41bf67870184489c2e27f5adb9d263820f385..2de0158a82ac9243202becc23a12272ebed0cd43 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.cpp
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.cpp
@@ -25,125 +25,127 @@
 #include "PCLPointCloud.h"
 
 namespace armarx::aron::typenavigator
+{
+    // constructors
+    PCLPointCloudNavigator::PCLPointCloudNavigator(const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePCLPointCloud, path),
+        Navigator(type::Descriptor::ePCLPointCloud, path),
+        type(new type::AronPCLPointCloud(0, 0, ""))
+    {
+    }
+
+    PCLPointCloudNavigator::PCLPointCloudNavigator(const type::AronPCLPointCloudPtr& o, const Path& path) :
+        aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePCLPointCloud, path),
+        Navigator(type::Descriptor::ePCLPointCloud, path),
+        type(o)
+    {
+        CheckAronPtrForNull("AronPCLPointCloudTypeNavigator", "AronPCLPointCloudTypeNavigator", getPath(), o);
+        checkTypename(type->typeName);
+    }
+
+    std::string PCLPointCloudNavigator::checkTypename(const std::string& s) const
+    {
+        for (const auto& [key, list] : ACCEPTED_TYPES)
         {
-            // constructors
-            PCLPointCloudNavigator::PCLPointCloudNavigator(const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePCLPointCloud, path),
-                Navigator(type::Descriptor::ePCLPointCloud, path),
-                type(new type::AronPCLPointCloud(0, 0, ""))
+            if (s == key)
             {
+                return key;
             }
 
-            PCLPointCloudNavigator::PCLPointCloudNavigator(const type::AronPCLPointCloudPtr& o, const Path& path) :
-                aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePCLPointCloud, path),
-                Navigator(type::Descriptor::ePCLPointCloud, path),
-                type(o)
+            for (const auto& el : list)
             {
-                CheckAronPtrForNull("AronPCLPointCloudTypeNavigator", "AronPCLPointCloudTypeNavigator", getPath(), o);
-                checkTypename(type->typeName);
-            }
-
-            bool PCLPointCloudNavigator::checkTypename(const std::string& s) const
-            {
-                if (s.empty())
-                {
-                    throw error::AronException("AronPCLPointCloudTypeNavigator", "checkTypename", "The typename is empty.", getPath());
-                }
-
-                if (!std::any_of(ACCEPTED_TYPES.begin(), ACCEPTED_TYPES.end(), [s](const auto & el)
-            {
-                return s == el.first || std::find(el.second.begin(), el.second.end(), s) != el.second.end();
-                }))
-                {
-                    throw error::AronException("AronPCLPointCloudTypeNavigator", "checkTypename", "The typename is wrong. Got " + s, getPath());
-                }
-                return true;
-            }
-
-            type::AronPCLPointCloudPtr PCLPointCloudNavigator::toAronPCLPointCloudPtr() const
-            {
-                checkTypename(type->typeName);
-                return type;
-            }
-
-            std::vector<int> PCLPointCloudNavigator::getDimensions() const
-            {
-                return {type->width, type->height};
-            }
-
-            unsigned int PCLPointCloudNavigator::getWidth() const
-            {
-                return type->width;
-            }
-
-            unsigned int PCLPointCloudNavigator::getHeight() const
-            {
-                return type->height;
-            }
-
-            std::string PCLPointCloudNavigator::getTypename() const
-            {
-                return type->typeName;
-            }
-
-            void PCLPointCloudNavigator::setWidth(const unsigned int& w)
-            {
-                if (w == 0)
-                {
-                    throw error::AronException("AronPCLPointCloudTypeNavigator", "setWidth", "The width of aa pointcloud cannot be 0", getPath());
-                }
-                type->width = w;
-            }
-
-            void PCLPointCloudNavigator::setHeight(const unsigned int& h)
-            {
-                if (h == 0)
+                if (s == el)
                 {
-                    throw error::AronException("AronPCLPointCloudTypeNavigator", "setHeight", "The height of aa pointcloud cannot be 0", getPath());
+                    return key;
                 }
-                type->height = h;
-            }
-
-            void PCLPointCloudNavigator::setTypename(const std::string& u)
-            {
-                checkTypename(u);
-                type->typeName = u;
-            }
-
-
-            // static methods
-            PCLPointCloudNavigatorPtr PCLPointCloudNavigator::DynamicCast(const NavigatorPtr& n)
-            {
-                return std::dynamic_pointer_cast<PCLPointCloudNavigator>(n);
-            }
-
-            PCLPointCloudNavigatorPtr PCLPointCloudNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
-            {
-                CheckTypeNavigatorPtrForNull("AronPCLPointCloudTypeNavigator", "DynamicCast[Before]", n);
-                PCLPointCloudNavigatorPtr casted = PCLPointCloudNavigator::DynamicCast(n);
-                CheckTypeNavigatorPtrForNull("AronPCLPointCloudTypeNavigator", "DynamicCast[After]", n->getPath(), casted);
-                return casted;
-            }
-
-            // virtual implementations
-            std::vector<NavigatorPtr> PCLPointCloudNavigator::getChildren() const
-            {
-                return {};
-            }
-
-            size_t PCLPointCloudNavigator::childrenSize() const
-            {
-                return 0;
-            }
-
-            type::AronTypePtr PCLPointCloudNavigator::getResult() const
-            {
-                return toAronPCLPointCloudPtr();
-            }
-
-            std::string PCLPointCloudNavigator::getName() const
-            {
-                return "AronPCLPointCloudType<" + simox::alg::to_string(getDimensions(), ", ") + ", " + type->typeName + ">";
             }
+        }
+        throw error::AronException("PCLPointCloudNavigator", "checkTypename", "The typename is empty.", getPath());
+    }
+
+    type::AronPCLPointCloudPtr PCLPointCloudNavigator::toAronPCLPointCloudPtr() const
+    {
+        checkTypename(type->typeName);
+        return type;
+    }
+
+    std::vector<int> PCLPointCloudNavigator::getDimensions() const
+    {
+        return {type->width, type->height};
+    }
+
+    unsigned int PCLPointCloudNavigator::getWidth() const
+    {
+        return type->width;
+    }
+
+    unsigned int PCLPointCloudNavigator::getHeight() const
+    {
+        return type->height;
+    }
+
+    std::string PCLPointCloudNavigator::getTypename() const
+    {
+        return type->typeName;
+    }
+
+    void PCLPointCloudNavigator::setWidth(const unsigned int& w)
+    {
+        if (w == 0)
+        {
+            throw error::AronException("AronPCLPointCloudTypeNavigator", "setWidth", "The width of aa pointcloud cannot be 0", getPath());
+        }
+        type->width = w;
+    }
+
+    void PCLPointCloudNavigator::setHeight(const unsigned int& h)
+    {
+        if (h == 0)
+        {
+            throw error::AronException("AronPCLPointCloudTypeNavigator", "setHeight", "The height of aa pointcloud cannot be 0", getPath());
+        }
+        type->height = h;
+    }
+
+    void PCLPointCloudNavigator::setTypename(const std::string& u)
+    {
+        type->typeName = checkTypename(u);
+    }
+
+
+    // static methods
+    PCLPointCloudNavigatorPtr PCLPointCloudNavigator::DynamicCast(const NavigatorPtr& n)
+    {
+        return std::dynamic_pointer_cast<PCLPointCloudNavigator>(n);
+    }
+
+    PCLPointCloudNavigatorPtr PCLPointCloudNavigator::DynamicCastAndCheck(const NavigatorPtr& n)
+    {
+        CheckTypeNavigatorPtrForNull("AronPCLPointCloudTypeNavigator", "DynamicCast[Before]", n);
+        PCLPointCloudNavigatorPtr casted = PCLPointCloudNavigator::DynamicCast(n);
+        CheckTypeNavigatorPtrForNull("AronPCLPointCloudTypeNavigator", "DynamicCast[After]", n->getPath(), casted);
+        return casted;
+    }
+
+    // virtual implementations
+    std::vector<NavigatorPtr> PCLPointCloudNavigator::getChildren() const
+    {
+        return {};
+    }
+
+    size_t PCLPointCloudNavigator::childrenSize() const
+    {
+        return 0;
+    }
+
+    type::AronTypePtr PCLPointCloudNavigator::getResult() const
+    {
+        return toAronPCLPointCloudPtr();
+    }
+
+    std::string PCLPointCloudNavigator::getName() const
+    {
+        return "AronPCLPointCloudType<" + simox::alg::to_string(getDimensions(), ", ") + ", " + type->typeName + ">";
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.h b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.h
index 1c40aaaeb593c7b5d360429f0a155fd7234c416b..2f62f1b579b5e84b3acc93aa7a72d70329492736 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.h
@@ -32,60 +32,60 @@
 
 namespace armarx::aron::typenavigator
 {
-            class PCLPointCloudNavigator;
-            typedef std::shared_ptr<PCLPointCloudNavigator> PCLPointCloudNavigatorPtr;
+    class PCLPointCloudNavigator;
+    typedef std::shared_ptr<PCLPointCloudNavigator> PCLPointCloudNavigatorPtr;
 
-            class PCLPointCloudNavigator :
-                virtual public Navigator
-            {
-            public:
-                using PointerType = PCLPointCloudNavigatorPtr;
+    class PCLPointCloudNavigator :
+        virtual public Navigator
+    {
+    public:
+        using PointerType = PCLPointCloudNavigatorPtr;
 
-            public:
-                // constructors
-                PCLPointCloudNavigator() = delete;
-                PCLPointCloudNavigator(const Path& path);
-                PCLPointCloudNavigator(const type::AronPCLPointCloudPtr&, const Path& path);
+    public:
+        // constructors
+        PCLPointCloudNavigator() = delete;
+        PCLPointCloudNavigator(const Path& path);
+        PCLPointCloudNavigator(const type::AronPCLPointCloudPtr&, const Path& path);
 
-                bool checkTypename(const std::string&) const;
+        std::string checkTypename(const std::string&) const;
 
-                unsigned int getWidth() const;
-                unsigned int getHeight() const;
-                std::string getTypename() const;
-                std::vector<int> getDimensions() const;
+        unsigned int getWidth() const;
+        unsigned int getHeight() const;
+        std::string getTypename() const;
+        std::vector<int> getDimensions() const;
 
-                void setWidth(const unsigned int&);
-                void setHeight(const unsigned int&);
-                void setTypename(const std::string&);
+        void setWidth(const unsigned int&);
+        void setHeight(const unsigned int&);
+        void setTypename(const std::string&);
 
-                type::AronPCLPointCloudPtr toAronPCLPointCloudPtr() const;
+        type::AronPCLPointCloudPtr toAronPCLPointCloudPtr() const;
 
-                // static methods
-                static PCLPointCloudNavigatorPtr DynamicCast(const NavigatorPtr& n);
-                static PCLPointCloudNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n);
+        // static methods
+        static PCLPointCloudNavigatorPtr DynamicCast(const NavigatorPtr& n);
+        static PCLPointCloudNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n);
 
-                // virtual implementations
-                virtual std::vector<NavigatorPtr> getChildren() const override;
-                virtual size_t childrenSize() const override;
-                virtual type::AronTypePtr getResult() const override;
-                virtual std::string getName() const override;
+        // virtual implementations
+        virtual std::vector<NavigatorPtr> getChildren() const override;
+        virtual size_t childrenSize() const override;
+        virtual type::AronTypePtr getResult() const override;
+        virtual std::string getName() const override;
 
-            public:
-                const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES =
-                {
-                    {"PointXYZ", {"pcl::PointXYZ"}},
-                    {"PointXYZI", {"pcl::PointXYZI"}},
-                    {"PointXYZL", {"pcl::PointXYZL"}},
-                    {"PointXYZRGB", {"pcl::PointXYZRGB"}},
-                    {"PointXYZRGBL", {"pcl::PointXYZRGBL"}},
-                    {"PointXYZRGBA", {"pcl::PointXYZRGBA"}},
-                    {"PointXYZHSV", {"pcl::PointXYZHSV"}}
-                };
-                const unsigned int ACCEPTED_DIMENSION_MIN_SIZE = 2;
-                const unsigned int ACCEPTED_DIMENSION_MAX_SIZE = 2;
+    public:
+        const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES =
+        {
+            {"PointXYZ", {"pcl::PointXYZ"}},
+            {"PointXYZI", {"pcl::PointXYZI"}},
+            {"PointXYZL", {"pcl::PointXYZL"}},
+            {"PointXYZRGB", {"pcl::PointXYZRGB"}},
+            {"PointXYZRGBL", {"pcl::PointXYZRGBL"}},
+            {"PointXYZRGBA", {"pcl::PointXYZRGBA"}},
+            {"PointXYZHSV", {"pcl::PointXYZHSV"}}
+        };
+        const unsigned int ACCEPTED_DIMENSION_MIN_SIZE = 2;
+        const unsigned int ACCEPTED_DIMENSION_MAX_SIZE = 2;
 
-            private:
-                // members
-                type::AronPCLPointCloudPtr type;
-            };
+    private:
+        // members
+        type::AronPCLPointCloudPtr type;
+    };
 }
diff --git a/source/RobotAPI/libraries/aron/core/test/CMakeLists.txt b/source/RobotAPI/libraries/aron/core/test/CMakeLists.txt
index 33657aed38683de124c5fd12174f15c1a72a9825..7eeffdbb49db4b321b77ed47fa1e58361d538094 100644
--- a/source/RobotAPI/libraries/aron/core/test/CMakeLists.txt
+++ b/source/RobotAPI/libraries/aron/core/test/CMakeLists.txt
@@ -41,14 +41,19 @@ armarx_enable_aron_file_generation_for_target(
         ${TEST_NAME}
     ARON_FILES
         xmls/HumanPoseTest.xml
-        xmls/SimpleDictTest.xml
+        xmls/DictTest.xml
         xmls/ListTest.xml
-        xmls/NaturalIK.xml
-        xmls/SimpleObjectTest.xml
+        xmls/NaturalIKTest.xml
+        xmls/ObjectTest.xml
         xmls/PrimitiveTest.xml
-        xmls/ImageTest.xml
+        xmls/IVTCByteImageTest.xml
         xmls/EigenMatrixTest.xml
+        xmls/EigenQuaternionTest.xml
         xmls/OpenCVMatTest.xml
         xmls/PCLPointCloudTest.xml
+        xmls/PositionTest.xml
+        xmls/OrientationTest.xml
+        xmls/PoseTest.xml
+        xmls/EnumTest.xml
     #ENABLE_DEBUG_INFO
 )
diff --git a/source/RobotAPI/libraries/aron/core/test/aronTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronTest.cpp
index 838c5922e905af4c68c5a5048e6ad37a84bda16d..1c25b3d5894dd2db032f88110f3641955e54b2fe 100644
--- a/source/RobotAPI/libraries/aron/core/test/aronTest.cpp
+++ b/source/RobotAPI/libraries/aron/core/test/aronTest.cpp
@@ -56,28 +56,31 @@
 
 // Aron
 #include <RobotAPI/libraries/aron/core/Debug.h>
-#include <RobotAPI/libraries/aron/core/AronRandomizer.h>
+#include <RobotAPI/libraries/aron/core/Randomizer.h>
+
 #include <RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h>
+#include <RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h>
 
 #include <RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h>
 #include <RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h>
-#include <RobotAPI/libraries/aron/core/io/dataIO/writer/rapidXML/AronDataRapidXMLWriter.h>
-#include <RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/AronDataNlohmannJSONReader.h>
 
 // Files without code generation
-#include "aronDataWithoutCodeGeneration.h"
+//#include "aronDataWithoutCodeGeneration.h"
 
 // Generated File
-#include <RobotAPI/libraries/aron/core/test/aron/NaturalIK.aron.generated.h>
+#include <RobotAPI/libraries/aron/core/test/aron/NaturalIKTest.aron.generated.h>
 #include <RobotAPI/libraries/aron/core/test/aron/ListTest.aron.generated.h>
-#include <RobotAPI/libraries/aron/core/test/aron/SimpleDictTest.aron.generated.h>
+#include <RobotAPI/libraries/aron/core/test/aron/DictTest.aron.generated.h>
 #include <RobotAPI/libraries/aron/core/test/aron/PrimitiveTest.aron.generated.h>
-#include <RobotAPI/libraries/aron/core/test/aron/SimpleObjectTest.aron.generated.h>
-#include <RobotAPI/libraries/aron/core/test/aron/ImageTest.aron.generated.h>
+#include <RobotAPI/libraries/aron/core/test/aron/ObjectTest.aron.generated.h>
+#include <RobotAPI/libraries/aron/core/test/aron/IVTCByteImageTest.aron.generated.h>
 #include <RobotAPI/libraries/aron/core/test/aron/EigenMatrixTest.aron.generated.h>
+#include <RobotAPI/libraries/aron/core/test/aron/EigenQuaternionTest.aron.generated.h>
 #include <RobotAPI/libraries/aron/core/test/aron/OpenCVMatTest.aron.generated.h>
 #include <RobotAPI/libraries/aron/core/test/aron/PCLPointCloudTest.aron.generated.h>
-
+#include <RobotAPI/libraries/aron/core/test/aron/PositionTest.aron.generated.h>
+#include <RobotAPI/libraries/aron/core/test/aron/OrientationTest.aron.generated.h>
+#include <RobotAPI/libraries/aron/core/test/aron/PoseTest.aron.generated.h>
 
 using namespace armarx;
 using namespace aron;
@@ -85,16 +88,16 @@ using namespace aron;
 template <typename T>
 void runTestWithInstances(T& k1, T& k2)
 {
-    AronRandomizer r;
+    Randomizer r;
 
     std::cout << "\t getting type 1" << std::endl;
     typenavigator::ObjectNavigatorPtr k1_type_nav = k1.toInitialAronType();
-    type::AronObjectTypePtr k1_type = k1_type_nav->toAronObjectTypePtr();
+    type::AronObjectPtr k1_type = k1_type_nav->toAronObjectPtr();
     BOOST_CHECK_NE(k1_type.get(), nullptr);
 
     std::cout << "\t getting type 2" << std::endl;
     typenavigator::ObjectNavigatorPtr k2_type_nav = k2.toInitialAronType();
-    type::AronObjectTypePtr k2_type = k2_type_nav->toAronObjectTypePtr();
+    type::AronObjectPtr k2_type = k2_type_nav->toAronObjectPtr();
     BOOST_CHECK_NE(k2_type.get(), nullptr);
 
     std::cout << "\t getting aron 1" << std::endl;
@@ -120,10 +123,12 @@ void runTestWithInstances(T& k1, T& k2)
     //std::cout << AronDebug::AronDataPtrToString(k2_aron) << std::endl;
 
     std::cout << "\t setting aron 1 from aron 2 and check for equality" << std::endl;
+
     k1.fromAron(k2_aron_nav);
 
     BOOST_CHECK_EQUAL((k1 == k2), true);
 
+
     //std::cout << "\t getting current type 1" << std::endl;
     //typenavigator::NavigatorPtr k1_current_type_nav = k1.toCurrentAronType();
     //type::AronTypePtr k1_current_type = k1_current_type_nav->getResult();
@@ -135,23 +140,25 @@ void runTestWithInstances(T& k1, T& k2)
     //BOOST_CHECK_NE(k2_current_type.get(), nullptr);
 
     r.initializeRandomly(k1_aron_nav, k1_type_nav);
+
     k1.fromAron(k1_aron);
 
+
     std::cout << "\t check JSON export of k and k2 for equality" << std::endl;
-    armarx::aron::io::NlohmannJSONWriter json_writer_for_k1;
-    armarx::aron::io::NlohmannJSONWriter json_writer_for_k2;
+    armarx::aron::dataIO::writer::NlohmannJSONWriter json_writer_for_k1;
+    armarx::aron::dataIO::writer::NlohmannJSONWriter json_writer_for_k2;
 
     k1.write(json_writer_for_k1);
     nlohmann::json k1_aron_json = json_writer_for_k1.getResult();
     std::string k1_aron_json_str = k1_aron_json.dump(4);
 
-    armarx::aron::io::NlohmannJSONWriter direct_json_writer_for_k1;
-    armarx::aron::io::Visitor::SetupWriterFromAronDataPtr(direct_json_writer_for_k1, k1_aron);
+    armarx::aron::dataIO::writer::NlohmannJSONWriter direct_json_writer_for_k1;
+    armarx::aron::dataIO::Visitor::SetupWriterFromAronDataPtr(direct_json_writer_for_k1, k1_aron);
     nlohmann::json direct_k1_aron_json = direct_json_writer_for_k1.getResult();
     std::string direct_k1_aron_json_str = direct_k1_aron_json.dump(4);
     BOOST_CHECK_EQUAL((k1_aron_json_str == direct_k1_aron_json_str), true);
 
-    armarx::aron::io::AronDataNlohmannJSONReader json_reader_for_k2(k1_aron_json);
+    armarx::aron::dataIO::reader::NlohmannJSONReader json_reader_for_k2(k1_aron_json);
     k2.read(json_reader_for_k2);
 
     k2.write(json_writer_for_k2);
@@ -161,20 +168,6 @@ void runTestWithInstances(T& k1, T& k2)
     //std::cout << "\t K1 as json: " << std::endl << k1_aron_json_str << std::endl;
     //std::cout << "\t K2 as json: " << std::endl << k2_aron_json_str << std::endl;
     BOOST_CHECK_EQUAL((k1_aron_json_str == k2_aron_json_str), true);
-
-    //std::cout << "\t check XML export of k and k2 for equality" << std::endl;
-    //armarx::aron::io::AronDataRapidXMLWriter xml_writer1;
-    //armarx::aron::io::AronDataRapidXMLWriter xml_writer2;
-
-    //k.write(xml_writer1);
-    //k_aron_rapid_xml = xml_writer1.getResult();
-
-    //k2.write(xml_writer2);
-    //k2_aron_xml = xml_writer2.getResult();
-
-    //std::cout << "\t K as XML: " << std::endl << k_aron_xml << std::endl;
-    //std::cout << "\t K2: " << std::endl << k2_aron_json << std::endl;
-    //BOOST_CHECK_EQUAL((k_aron_xml == k2_aron_xml), true);*/
 }
 
 
@@ -191,7 +184,7 @@ BOOST_AUTO_TEST_CASE(AronNaturalIKTest)
     Path memberReached(path, "reached");
     Path memberJointValues(path, "jointValues");
     Path indexJointValues0(memberJointValues, "0");
-    Path indexJointValues1(memberJointValues, "1000");
+    Path indexJointValues1(memberJointValues, "1");
 
     BOOST_CHECK_EQUAL(path.toString(), "\\");
     BOOST_CHECK_EQUAL(path.size(), 0);
@@ -250,39 +243,35 @@ BOOST_AUTO_TEST_CASE(AronPrimitiveTest)
     runTestWithInstances<PrimitiveTest>(p, p2);
 }
 
-BOOST_AUTO_TEST_CASE(AronSimpleClassTest)
-{
-    std::cout << "Running SimpleClass test" << std::endl;
-    SimpleClass o1;
-    SimpleClass o12;
-    runTestWithInstances<SimpleClass>(o1, o12);
-}
-
 BOOST_AUTO_TEST_CASE(AronObjectTest)
 {
     std::cout << "Running Object test" << std::endl;
-    ObjectTest o2;
-    ObjectTest o22;
-    runTestWithInstances<ObjectTest>(o2, o22);
+    ObjectTest1 o1;
+    ObjectTest1 o12;
+    runTestWithInstances<ObjectTest1>(o1, o12);
+
+    ObjectTest2 o2;
+    ObjectTest2 o22;
+    runTestWithInstances<ObjectTest2>(o2, o22);
 }
 
 BOOST_AUTO_TEST_CASE(AronImageTest)
 {
     std::cout << "Running Image test" << std::endl;
-    ImageTest i;
-    ImageTest i2;
-    runTestWithInstances<ImageTest>(i, i2);
+    IVTCByteImageTest i;
+    IVTCByteImageTest i2;
+    runTestWithInstances<IVTCByteImageTest>(i, i2);
 }
 
-BOOST_AUTO_TEST_CASE(AronImageChangeSizeTest)
+/*BOOST_AUTO_TEST_CASE(AronImageChangeSizeTest)
 {
     std::cout << "Running Image test with changed sizes" << std::endl;
-    ImageTest ii;
-    ImageTest ii2;
-    ii.the_ivt_image->Set(100, 100, ii.the_ivt_image->type);
-    ii2.the_ivt_image->Set(10, 10, ii.the_ivt_image->type);
-    runTestWithInstances<ImageTest>(ii, ii2);
-}
+    IVTCByteImageTest ii;
+    IVTCByteImageTest ii2;
+    ii.the_ivt_image.Set(100, 100, ii.the_ivt_image.type);
+    ii2.the_ivt_image.Set(10, 10, ii.the_ivt_image.type);
+    runTestWithInstances<IVTCByteImageTest>(ii, ii2);
+}*/
 
 BOOST_AUTO_TEST_CASE(AronEigenMatrixTest)
 {
@@ -328,3 +317,35 @@ BOOST_AUTO_TEST_CASE(AronTests)
     AronNestedDataWithoutCodeGeneration rn2;
     runTestWithInstances<AronNestedDataWithoutCodeGeneration>(rn1, rn2);
 }*/
+
+BOOST_AUTO_TEST_CASE(AronEigenQuaternionTest)
+{
+    std::cout << "Running EigenQuaternion test" << std::endl;
+    EigenQuaternionTest eq;
+    EigenQuaternionTest eq2;
+    runTestWithInstances<EigenQuaternionTest>(eq, eq2);
+}
+
+BOOST_AUTO_TEST_CASE(AronPositionTest)
+{
+    std::cout << "Running Position test" << std::endl;
+    PositionTest pc;
+    PositionTest pc2;
+    runTestWithInstances<PositionTest>(pc, pc2);
+}
+
+BOOST_AUTO_TEST_CASE(AronOrientationTest)
+{
+    std::cout << "Running Orientation test" << std::endl;
+    OrientationTest pc;
+    OrientationTest pc2;
+    runTestWithInstances<OrientationTest>(pc, pc2);
+}
+
+BOOST_AUTO_TEST_CASE(AronPoseTest)
+{
+    std::cout << "Running Pose test" << std::endl;
+    PoseTest pc;
+    PoseTest pc2;
+    runTestWithInstances<PoseTest>(pc, pc2);
+}
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/BaseClass.xml b/source/RobotAPI/libraries/aron/core/test/xmls/BaseClass.xml
index 8cab5e6fd4eb572192e7db5df327883760288327..57d4e6951e98ccb690b8e2c61e6730c067cf01e0 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/BaseClass.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/BaseClass.xml
@@ -2,7 +2,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <AronTypeDefinition>
     <GenerateTypes>
-        <GenerateType name='armarx::BaseClassTest'>
+        <GenerateObject name='armarx::BaseClassTest'>
 
             <ObjectChild key='base_class_member1'>
                 <Bool />
@@ -24,6 +24,6 @@
                 </List>
             </ObjectChild>
 
-        </GenerateType>
+        </GenerateObject>
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/DerivedClassTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/DerivedClassTest.xml
index 4d06665c2ac40ebfcfcb4514e75bff8dc637ce68..de4be250d23c90f27d8198d890e7ef0576d672cb 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/DerivedClassTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/DerivedClassTest.xml
@@ -8,12 +8,12 @@
         <Include include="/home/fabian/Software/ArmarX/RobotAPI/source/RobotAPI/libraries/aron/test/xmls/BaseClass.xml" />
     </AronIncludes>
     <GenerateTypes>
-        <GenerateType name='armarx::DerivedClass' extends="armarx::BaseClassTest">
+        <GenerateObject name='armarx::DerivedClass' extends="armarx::BaseClassTest">
 
             <ObjectChild key='derived_class_member1'>
                 <Bool />
             </ObjectChild>
 
-        </GenerateType>
+        </GenerateObject>
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/SimpleDictTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/DictTest.xml
similarity index 80%
rename from source/RobotAPI/libraries/aron/core/test/xmls/SimpleDictTest.xml
rename to source/RobotAPI/libraries/aron/core/test/xmls/DictTest.xml
index 003b22dbaad241b3f3d93685f96a3d173183c9b8..fadec8226455e878c6a98ed7a76131c66a3944e6 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/SimpleDictTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/DictTest.xml
@@ -2,12 +2,12 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <AronTypeDefinition>
     <GenerateTypes>
-        <GenerateType name='armarx::DictTest'>
+        <Object name='armarx::DictTest'>
             <objectchild key='dict'>
                 <Dict>
                     <Float />
                 </Dict>
             </ObjectChild>
-        </GenerateType>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/EigenMatrixTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/EigenMatrixTest.xml
index 0656e2f56972af2f0fc0e0adc49d2e40a11df986..b3f5f6447c6fc6f3d3a8851e00578156ad4560b3 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/EigenMatrixTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/EigenMatrixTest.xml
@@ -7,10 +7,22 @@
     <AronIncludes>
     </AronIncludes>
     <GenerateTypes>
-        <GenerateType name='armarx::EigenMatrixTest'>
-            <ObjectChild key='the_eigen_matrix'>
+        <Object name='armarx::EigenMatrixTest'>
+            <ObjectChild key='the_short_eigen_matrix'>
+                <EigenMatrix rows="10" cols="25" type="short" />
+            </ObjectChild>
+            <ObjectChild key='the_int_eigen_matrix'>
                 <EigenMatrix rows="25" cols="25" type="int" />
             </ObjectChild>
-        </GenerateType>
+            <ObjectChild key='the_long_eigen_matrix'>
+                <EigenMatrix rows="25" cols="10" type="long" />
+            </ObjectChild>
+            <ObjectChild key='the_float_eigen_matrix'>
+                <EigenMatrix rows="1" cols="200" type="float" />
+            </ObjectChild>
+            <ObjectChild key='the_double_eigen_matrix'>
+                <EigenMatrix rows="200" cols="1" type="double" />
+            </ObjectChild>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition> 
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/EigenQuaternionTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/EigenQuaternionTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..74eec8bbfaa61ed9f20b2a0e7f7cf08344884ea4
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/EigenQuaternionTest.xml
@@ -0,0 +1,19 @@
+<!--Some fancy comment -->
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <CodeIncludes>
+        <Include include="<Eigen/Core>" />
+    </CodeIncludes>
+    <AronIncludes>
+    </AronIncludes>
+    <GenerateTypes>
+        <Object name='armarx::EigenQuaternionTest'>
+            <ObjectChild key='the_float_eigen_matrix'>
+                <EigenQuaternion type="float" />
+            </ObjectChild>
+            <ObjectChild key='the_double_eigen_matrix'>
+                <EigenQuaternion type="double" />
+            </ObjectChild>
+        </Object>
+    </GenerateTypes>
+</AronTypeDefinition> 
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/EnumTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/EnumTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..789959fc609e8c15b62733199439bd1506aae8dc
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/EnumTest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <GenerateTypes>
+        <IntEnum name="TheIntEnum">
+            <EnumValue key="INT_ENUM_VALUE_0" value="0" />
+            <EnumValue key="INT_ENUM_VALUE_1" value="1" />
+            <EnumValue key="INT_ENUM_VALUE_2" value="2" />
+            <EnumValue key="INT_ENUM_VALUE_3" value="3" />
+            <EnumValue key="INT_ENUM_VALUE_4" value="4" />
+            <EnumValue key="INT_ENUM_VALUE_5" value="5" />
+            <EnumValue key="INT_ENUM_VALUE_6" value="6" />
+            <EnumValue key="INT_ENUM_VALUE_7" value="7" />
+            <EnumValue key="INT_ENUM_VALUE_8" value="8" />
+        </IntEnum>
+        <Object name="TheObjectThatUsesTheIntEnum">
+            <objectchild key="some_string">
+                <string />
+            </objectchild>
+            <objectchild key="the_int_enum">
+                <TheIntEnum />
+            </objectchild>
+        </Object>
+    </GenerateTypes>
+</AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/HumanPoseTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/HumanPoseTest.xml
index 4a0948ed12871ce2010603ffaacb701ee2dfd9c9..78f4fd166c505e6e8b2d0cd4f4ac5c73f391d371 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/HumanPoseTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/HumanPoseTest.xml
@@ -1,8 +1,7 @@
-<!--This class contains the data structure for OpenPoseEstimationResults -->
 <?xml version="1.0" encoding="UTF-8" ?>
 <AronTypeDefinition>
     <GenerateTypes>
-        <GenerateType name='armarx::OpenPoseEstimationResult'>
+        <Object name='armarx::HumanPoseTest'>
 
             <ObjectChild key='reached'>
                 <Bool />
@@ -14,6 +13,6 @@
                 </List>
             </ObjectChild>
 
-        </GenerateType>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..286f6709eb711af46aeedde4e9ee0bec7641551f
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <GenerateTypes>
+        <Object name='armarx::IVTCByteImageTest'>
+
+            <ObjectChild key='the_grayscale_image'>
+                <IVTCByteImage width="25" height="25" type="GrayScale" />
+            </ObjectChild>
+
+            <ObjectChild key='the_rgb_image'>
+                <IVTCByteImage width="1920" height="1080" type="RGB24" />
+            </ObjectChild>
+
+        </Object>
+    </GenerateTypes>
+</AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/ImageTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/ImageTest.xml
deleted file mode 100644
index 074128ebef8a32e4b7b5d631ec2336f41d1c06ef..0000000000000000000000000000000000000000
--- a/source/RobotAPI/libraries/aron/core/test/xmls/ImageTest.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--Some fancy comment -->
-<?xml version="1.0" encoding="UTF-8" ?>
-<AronTypeDefinition>
-    <CodeIncludes>
-        <Include include="<Image/ByteImage.h>" />
-    </CodeIncludes>
-    <AronIncludes>
-    </AronIncludes>
-    <GenerateTypes>
-        <GenerateType name='armarx::ImageTest'>
-            <ObjectChild key='the_ivt_image'>
-                <IVTCByteImage width="25" height="25" type="GrayScale" />
-            </ObjectChild>
-        </GenerateType>
-    </GenerateTypes>
-</AronTypeDefinition> 
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/ListTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/ListTest.xml
index 0917c8ea0f34e98b1b250f11b7b94cef35f3f43c..1c8ed164015d99ad0b5eddc8881dc4d43d626c28 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/ListTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/ListTest.xml
@@ -2,7 +2,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <AronTypeDefinition>
     <GenerateTypes>
-        <GenerateType name='armarx::ListTest'>
+        <Object name='armarx::ListTest'>
             <ObjectChild key='floatList'>
                 <List>
                     <Float />
@@ -45,14 +45,14 @@
                             <Bool />
                         </ObjectChild>
                         <ObjectChild key='element1'>
-                            <Bool />
+                            <Int />
                         </ObjectChild>
                         <ObjectChild key='element2'>
-                            <Bool />
+                            <Double />
                         </ObjectChild>
                     </Object>
                 </List>
             </ObjectChild>
-        </GenerateType>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/NaturalIK.xml b/source/RobotAPI/libraries/aron/core/test/xmls/NaturalIKTest.xml
similarity index 84%
rename from source/RobotAPI/libraries/aron/core/test/xmls/NaturalIK.xml
rename to source/RobotAPI/libraries/aron/core/test/xmls/NaturalIKTest.xml
index 87f43c9e43eb4f0e938b123c0e45693ba7824c4e..06dc659d12d955b30b2113ffe7125e2320d96127 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/NaturalIK.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/NaturalIKTest.xml
@@ -2,7 +2,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <AronTypeDefinition>
     <GenerateTypes>
-        <GenerateType name='armarx::NaturalIKResult'>
+        <Object name='armarx::NaturalIKResult'>
 
             <ObjectChild key='reached'>
                 <Bool />
@@ -14,6 +14,6 @@
                 </List>
             </ObjectChild>
 
-        </GenerateType>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/SimpleObjectTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/ObjectTest.xml
similarity index 62%
rename from source/RobotAPI/libraries/aron/core/test/xmls/SimpleObjectTest.xml
rename to source/RobotAPI/libraries/aron/core/test/xmls/ObjectTest.xml
index ee51a55a389a4fbd6833b7f13bf555795c4371bd..43903d1ce67236c564145ef79ed2732ff4fb522c 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/SimpleObjectTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/ObjectTest.xml
@@ -3,34 +3,34 @@
 <AronTypeDefinition>
     <GenerateTypes>
     
-        <GenerateType name='armarx::SimpleClass'>
+        <Object name='armarx::ObjectTest1'>
             <objectchild key='the_bool'>
                 <bool />
             </objectchild>
-        </GenerateType>
+        </Object>
         
-        <GenerateType name='armarx::ObjectTest'>
+        <Object name='armarx::ObjectTest2'>
             <objectchild key='local_object'>
-                <object name='OtherFancyObject'>
-                    <objectchild key='blarg'>
+                <object name='LocalObjectTest1'>
+                    <objectchild key='the_bool'>
                         <bool />
                     </objectchild>
-                    <objectchild key='other_blarg'>
+                    <objectchild key='the_int'>
                         <int />
                     </objectchild>
                 </object>
             </ObjectChild>
             <objectchild key='another_local_object'>
-                <object name='VisionClass'>
-                    <objectchild key='blarg'>
+                <object name='LocalObjectTest2'>
+                    <objectchild key='the_bool'>
                         <bool />
                     </objectchild>
-                    <objectchild key='other_object'>
+                    <objectchild key='the_int'>
                         <int />
                     </objectchild>
                 </object>
             </ObjectChild>
-        </GenerateType>
+        </Object>
         
     </GenerateTypes>
 </AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/OpenCVMatTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/OpenCVMatTest.xml
index f47a174059ccf876b1e1a9cae0b220c3212906a8..c5cfb1e95c41d72790a7a6a65b5d028adbeb0576 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/OpenCVMatTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/OpenCVMatTest.xml
@@ -7,10 +7,19 @@
     <AronIncludes>
     </AronIncludes>
     <GenerateTypes>
-        <GenerateType name='armarx::OpenCVMatTest'>
-            <ObjectChild key='the_opencv_matrix'>
-                <OpenCVMat dimensions="25, 25" type="CV_32S" />
+        <Object name='armarx::OpenCVMatTest'>
+            <ObjectChild key='the_2d_opencv_matrix'>
+                <OpenCVMat dimensions="25, 25" type="64F" />
             </ObjectChild>
-        </GenerateType>
+            <ObjectChild key='the_3d_opencv_matrix'>
+                <OpenCVMat dimensions="25, 25, 25" type="CV_32F" />
+            </ObjectChild>
+            <ObjectChild key='the_4d_opencv_matrix'>
+                <OpenCVMat dimensions="25, 25, 25, 25" type="CV_32S" />
+            </ObjectChild>
+            <ObjectChild key='the_5d_opencv_matrix'>
+                <OpenCVMat dimensions="25, 25, 25, 25, 25" type="16U" />
+            </ObjectChild>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition> 
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/OrientationTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/OrientationTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c5c531e48855014722aa5ad91b29799c995eb098
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/OrientationTest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <CodeIncludes>
+        <Include include="<Eigen/Core>" />
+    </CodeIncludes>
+    
+    <GenerateTypes>
+        <Object name='armarx::OrientationTest'>
+
+            <ObjectChild key='orientation'>
+                <Orientation />
+            </ObjectChild>
+
+        </Object>
+    </GenerateTypes>
+</AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/PCLPointCloudTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/PCLPointCloudTest.xml
index b09c7f2ab2397454224f9db56c764919e781cc4c..dff170ce43a968424e05839de91ada689e49ecf1 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/PCLPointCloudTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/PCLPointCloudTest.xml
@@ -8,10 +8,13 @@
     <AronIncludes>
     </AronIncludes>
     <GenerateTypes>
-        <GenerateType name='armarx::PointCloudTest'>
-            <ObjectChild key='the_pcl_pointcloud'>
+        <Object name='armarx::PointCloudTest'>
+            <ObjectChild key='the_xyzrgb_pcl_pointcloud'>
                 <PCLPointCloud width="25" height="25" type="PointXYZRGB" />
             </ObjectChild>
-        </GenerateType>
+            <ObjectChild key='the_xyzrgba_pcl_pointcloud'>
+                <PCLPointCloud width="128" height="128" type="pcl::PointXYZRGBA" />
+            </ObjectChild>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition> 
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/PoseTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/PoseTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4af320525509ee7ce05b0b5c60e22d14fd555f6b
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/PoseTest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <CodeIncludes>
+        <Include include="<Eigen/Core>" />
+    </CodeIncludes>
+    <GenerateTypes>
+        <Object name='armarx::PoseTest'>
+
+            <ObjectChild key='pose'>
+                <Pose />
+            </ObjectChild>
+
+        </Object>
+    </GenerateTypes>
+</AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/PositionTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/PositionTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..64d9392fe8415b75ee59f896d3be7aa4b42bd9ae
--- /dev/null
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/PositionTest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <CodeIncludes>
+        <Include include="<Eigen/Core>" />
+    </CodeIncludes>
+    <GenerateTypes>
+        <Object name='armarx::PositionTest'>
+
+            <ObjectChild key='position'>
+                <Position />
+            </ObjectChild>
+
+        </Object>
+    </GenerateTypes>
+</AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/PrimitiveTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/PrimitiveTest.xml
index d2dc7bb640b4e089a5508a055ada41352fd6539d..ea38c815ffb08531d29d1ae9401aba7ff72ba479 100644
--- a/source/RobotAPI/libraries/aron/core/test/xmls/PrimitiveTest.xml
+++ b/source/RobotAPI/libraries/aron/core/test/xmls/PrimitiveTest.xml
@@ -2,7 +2,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <AronTypeDefinition>
     <GenerateTypes>
-        <GenerateType name='armarx::PrimitiveTest'>
+        <Object name='armarx::PrimitiveTest'>
             <objectchild key='the_int'>
                 <int />
             </ObjectChild>
@@ -21,6 +21,9 @@
             <objectchild key='the_bool'>
                 <bool />
             </ObjectChild>
-        </GenerateType>
+            <objectchild key='the_time'>
+                <time />
+            </ObjectChild>
+        </Object>
     </GenerateTypes>
 </AronTypeDefinition>