From c89d3e9033b4c8af367bcd64d0c57c250166cbff Mon Sep 17 00:00:00 2001
From: "fabian.peller-konrad@kit.edu" <fabian.peller-konrad@kit.edu>
Date: Fri, 15 Jan 2021 15:29:01 +0100
Subject: [PATCH] Aron returns specific navigators improved aron test suite

---
 data/RobotAPI/ArMemStorage/README             |   1 +
 source/RobotAPI/interface/aron/Aron.ice       |  32 +-
 .../libraries/armem/ltm/LongTermMemoryLUT.cpp |  98 +++-
 .../libraries/armem/ltm/LongTermMemoryLUT.h   |  18 +-
 .../armem/ltm/io/DiskWriter/DiskWriter.h      | 111 ++++-
 .../libraries/armem/memory/EntityInstance.h   |   2 +-
 .../RobotAPI/libraries/armem/memory/Memory.h  |   1 -
 .../libraries/armem/test/ArMemLTMTest.cpp     |   2 +
 .../libraries/aron/aroncore/AronConfig.h      |   8 +
 .../libraries/aron/aroncore/AronFactory.h     |  12 +-
 .../codeWriters/cppWriter/AronCppWriter.cpp   |  31 +-
 .../typeSerializers/AronTypeCppSerializer.cpp |  20 +-
 .../typeSerializers/AronTypeCppSerializer.h   |  10 +-
 .../classReaders/AronDataClassReaderToken.h   |  18 +-
 .../AronDataNavigatorReader.cpp               |  19 +-
 .../NavigatorReader/AronDataNavigatorReader.h |   6 +-
 .../AronDataNavigatorReaderToken.h            |   8 +-
 .../AronDataNlohmannJSONReaderToken.h         |   6 +-
 .../classWriters/AronDataClassWriterToken.h   |  16 +-
 .../AronDataNavigatorWriter.cpp               |   2 +-
 .../NavigatorWriter/AronDataNavigatorWriter.h |   2 +-
 .../AronDataNavigatorWriterToken.h            |   8 +-
 .../AronDataNlohmannJSONWriterToken.h         |   6 +-
 .../AronDataRapidXMLWriterToken.h             |   6 +-
 .../aron/aroncore/io/AronReaderToken.h        |  10 +-
 .../classWriters/AronTypeClassWriterToken.h   |  16 +-
 .../AronTypeNavigatorWriter.cpp               |   2 +-
 .../AronTypeNavigatorWriterToken.h            |   8 +-
 .../AronTypeNlohmannJSONWriter.cpp            |  80 ++--
 .../AronTypeNlohmannJSONWriter.h              |   2 +-
 .../AronTypeNlohmannJSONWriterToken.h         |  26 +-
 .../AronTypeRapidXMLWriterToken.h             |  14 +-
 .../aron/aroncore/io/AronWriterToken.h        |  10 +-
 .../datanavigator/AronDataNavigator.h         |  24 +-
 .../datanavigator/AronDictDataNavigator.cpp   |  42 +-
 .../datanavigator/AronDictDataNavigator.h     |   6 +
 .../datanavigator/AronListDataNavigator.cpp   |  42 +-
 .../datanavigator/AronListDataNavigator.h     |   6 +
 .../AronNDArrayDataNavigator.cpp              |  26 +-
 .../datanavigator/AronNDArrayDataNavigator.h  |   3 +
 .../AronPrimitiveDataNavigator.cpp            |  24 +-
 .../AronPrimitiveDataNavigator.h              |   3 +
 .../typenavigator/AronDictTypeNavigator.cpp   |   2 -
 .../typenavigator/AronDictTypeNavigator.h     |   2 +
 .../AronEigenMatrixTypeNavigator.cpp          |  39 +-
 .../AronEigenMatrixTypeNavigator.h            |   2 +
 .../AronIVTCByteImageTypeNavigator.cpp        |  39 +-
 .../AronIVTCByteImageTypeNavigator.h          |   2 +
 .../typenavigator/AronListTypeNavigator.cpp   |  49 +-
 .../typenavigator/AronListTypeNavigator.h     |   2 +
 .../typenavigator/AronObjectTypeNavigator.cpp |  13 +-
 .../typenavigator/AronObjectTypeNavigator.h   |   2 +
 .../AronOpenCVMatTypeNavigator.cpp            |  39 +-
 .../AronOpenCVMatTypeNavigator.h              |   2 +
 .../AronPCLPointCloudTypeNavigator.cpp        |  39 +-
 .../AronPCLPointCloudTypeNavigator.h          |   2 +
 .../AronPrimitiveTypeNavigator.cpp            |   7 +-
 .../AronPrimitiveTypeNavigator.h              |   4 +-
 .../typenavigator/AronTupleTypeNavigator.cpp  |  17 +-
 .../typenavigator/AronTupleTypeNavigator.h    |   2 +
 .../typenavigator/AronTypeNavigator.h         |  78 ++-
 .../test/aronDataWithoutCodeGeneration.h      |  30 +-
 .../libraries/aron/aroncore/test/aronTest.cpp | 450 ++++++++----------
 63 files changed, 963 insertions(+), 646 deletions(-)
 create mode 100644 data/RobotAPI/ArMemStorage/README

diff --git a/data/RobotAPI/ArMemStorage/README b/data/RobotAPI/ArMemStorage/README
new file mode 100644
index 000000000..342a90d8a
--- /dev/null
+++ b/data/RobotAPI/ArMemStorage/README
@@ -0,0 +1 @@
+This is the default folder where ArMem stores episodes
diff --git a/source/RobotAPI/interface/aron/Aron.ice b/source/RobotAPI/interface/aron/Aron.ice
index bf5e0bd97..3c0cd5a7b 100644
--- a/source/RobotAPI/interface/aron/Aron.ice
+++ b/source/RobotAPI/interface/aron/Aron.ice
@@ -73,9 +73,11 @@ module armarx
             dictionary<string, AronType> AronTypeDict;
 
             // Container Types (serialize to object/list)
+            class AronContainerType extends AronType {};
+
             // Please note that either elementTypes xor acceptedType is set!!!
-            class AronDictSerializerType extends AronType { AronTypeDict elementTypes; AronType acceptedType;};
-            class AronListSerializerType extends AronType { AronTypeList elementTypes; AronType acceptedType;};
+            class AronDictSerializerType extends AronContainerType { AronTypeDict elementTypes; AronType acceptedType;};
+            class AronListSerializerType extends AronContainerType { AronTypeList elementTypes; AronType acceptedType;};
 
             class AronListType extends AronListSerializerType { };
             class AronTupleType extends AronListSerializerType { };
@@ -84,7 +86,8 @@ module armarx
             class AronDictType extends AronDictSerializerType { };
 
             // Complex Types (serialize to ndarray)
-            class AronNDArraySerializerType extends AronType { AronIntSequence dimensions; string typeName; };
+            class AronComplexType extends AronType {};
+            class AronNDArraySerializerType extends AronComplexType { AronIntSequence dimensions; string typeName; };
             #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
                 class Aron##upperType##Type extends AronNDArraySerializerType { };
 
@@ -92,8 +95,9 @@ module armarx
             #undef RUN_ARON_MACRO
 
             // Primitive Types
+            class AronPrimitiveType extends AronType {};
             #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-                class Aron##upperType##Type extends AronType { };
+                class Aron##upperType##Type extends AronPrimitiveType { };
 
                     HANDLE_PRIMITIVE_TYPES
             #undef RUN_ARON_MACRO
@@ -110,15 +114,18 @@ module armarx
             dictionary<string, AronData> AronDataDict;
 
             // Container Data
-            class AronList extends AronData { AronDataList elements; };
-            class AronDict extends AronData { AronDataDict elements; };
+            class AronContainer extends AronData {};
+            class AronList extends AronContainer { AronDataList elements; };
+            class AronDict extends AronContainer { AronDataDict elements; };
 
             // Complex Data. The NDArray contains the same information as an AronType, but there is no other way to do it
-            class AronNDArray extends AronData { AronIntSequence dimensions; string type; AronByteSequence data; };
+            class AronComplex extends AronData {};
+            class AronNDArray extends AronComplex { AronIntSequence dimensions; string type; AronByteSequence data; };
 
             // Basic Data
+            class AronPrimitive extends AronData {};
             #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
-                class Aron##upperType extends AronData { lowerType value; };
+                class Aron##upperType extends AronPrimitive { lowerType value; };
 
                     HANDLE_PRIMITIVE_TYPES
             #undef RUN_ARON_MACRO
@@ -126,3 +133,12 @@ module armarx
 
     };
 };
+
+#undef HANDLE_ALL_ARON_TYPES
+#undef HANDLE_PRIMITIVE_TYPES
+#undef HANDLE_COMPLEX_TYPES
+#undef HANDLE_CONTAINER_TYPES
+
+#undef HANDLE_ALL_ARON_DATA
+#undef HANDLE_COMPLEX_DATA
+#undef HANDLE_CONTAINER_DATA
diff --git a/source/RobotAPI/libraries/armem/ltm/LongTermMemoryLUT.cpp b/source/RobotAPI/libraries/armem/ltm/LongTermMemoryLUT.cpp
index ed3ff0309..e3ade250a 100644
--- a/source/RobotAPI/libraries/armem/ltm/LongTermMemoryLUT.cpp
+++ b/source/RobotAPI/libraries/armem/ltm/LongTermMemoryLUT.cpp
@@ -13,12 +13,102 @@ namespace armarx::armem::ltm
 
     }
 
-    bool LongTermMemoryLUT::writeOnDisk(const MemoryPtr& m)
+    void LongTermMemoryLUT::writeOnDisk(const MemoryPtr& m)
     {
-        return writer->writeOnDisk(m);
+        io::DiskWriterReturnInformation info = writer->writeOnDisk(m);
+        updateLUT(info.storedElements);
     }
-    bool LongTermMemoryLUT::writeOnDisk(const std::map<std::string, CoreSegmentPtr>& m)
+    void LongTermMemoryLUT::writeOnDisk(const std::map<std::string, CoreSegmentPtr>& m)
     {
-        return writer->writeOnDisk(m);
+        io::DiskWriterReturnInformation info = writer->writeOnDisk(m);
+        updateLUT(info.storedElements);
+    }
+
+    void LongTermMemoryLUT::loadFromDisk()
+    {
+
+    }
+
+    std::string LongTermMemoryLUT::getLUTasString()
+    {
+        std::stringstream ss;
+        for (const auto& [coreKey, coreSegment] : lut)
+        {
+            ss << coreKey << ": " << std::endl;
+            for (const auto& [providerKey, providerSegment] : coreSegment)
+            {
+                ss << "\t" << providerKey << ": " << std::endl;
+                for (const auto& [entityKey, entity] : providerSegment)
+                {
+                    ss << "\t\t" << entityKey << ": " << std::endl;
+                    for (const auto& [entityHistoryTimestamp, entitySnapshot] : entity)
+                    {
+                        ss << "\t\t\t" << entityHistoryTimestamp.toMilliSeconds() << ":" << std::endl;
+                        ss << "\t\t\t\t" << "[";
+                        for (unsigned int i = 0; i < entitySnapshot.size(); ++i)
+                        {
+                            const std::string& newlyGenerate = entitySnapshot[i];
+                            if (i > 0)
+                            {
+                                ss << ", ";
+                            }
+                            ss << "(" << i << " => " << newlyGenerate << ")";
+                        }
+                        ss << "]" << std::endl;
+                    }
+                }
+            }
+        }
+        return ss.str();
+    }
+
+    void LongTermMemoryLUT::updateLUT(const EasyStringMemory& info)
+    {
+        for (const auto& [coreKey, coreSegment] : info)
+        {
+            if (lut.find(coreKey) == lut.end())
+            {
+                lut[coreKey] = coreSegment;
+                continue;
+            }
+
+            EasyStringCoreSegment& lutCoreSegment = lut[coreKey];
+            for (const auto& [providerKey, providerSegment] : coreSegment)
+            {
+                if (lutCoreSegment.find(providerKey) == lutCoreSegment.end())
+                {
+                    lutCoreSegment[providerKey] = providerSegment;
+                    continue;
+                }
+
+                EasyStringProviderSegment& lutProviderSegment = lutCoreSegment[providerKey];
+                for (const auto& [entityKey, entity] : providerSegment)
+                {
+                    if (lutProviderSegment.find(entityKey) == lutProviderSegment.end())
+                    {
+                        lutProviderSegment[entityKey] = entity;
+                        continue;
+                    }
+
+                    EasyStringEntity& lutEntity = lutProviderSegment[entityKey];
+                    for (const auto& [entityHistoryTimestamp, entitySnapshot] : entity)
+                    {
+                        if (lutEntity.find(entityHistoryTimestamp) == lutEntity.end())
+                        {
+                            lutEntity[entityHistoryTimestamp] = entitySnapshot;
+                            continue;
+                        }
+
+                        EasyStringEntityHistory& lutEntitySnapshot = lutEntity[entityHistoryTimestamp];
+                        //for (unsigned int i = 0; i < entitySnapshot.size(); ++i)
+                        //{
+                        //const std::string& newlyGenerate = entitySnapshot[i];
+                        //}
+                        // for now, simply overwrite all values since a history timestamp should not have to different snapshots
+                        lutEntitySnapshot = entitySnapshot;
+                    }
+                }
+            }
+        }
     }
 }
diff --git a/source/RobotAPI/libraries/armem/ltm/LongTermMemoryLUT.h b/source/RobotAPI/libraries/armem/ltm/LongTermMemoryLUT.h
index 0d286eedb..9f6f937e3 100644
--- a/source/RobotAPI/libraries/armem/ltm/LongTermMemoryLUT.h
+++ b/source/RobotAPI/libraries/armem/ltm/LongTermMemoryLUT.h
@@ -34,13 +34,6 @@ namespace armarx::armem
 {
     namespace ltm
     {
-
-        typedef std::vector<std::string> EasyStringEntityHistory; // only store paths to stored files
-        typedef std::map<Time, EasyStringEntityHistory> EasyStringEntity;
-        typedef std::map<std::string, EasyStringEntity> EasyStringProviderSegment;
-        typedef std::map<std::string, EasyStringProviderSegment> EasyStringCoreSegment;
-        typedef std::map<std::string, EasyStringCoreSegment> EasyStringMemory;
-
         class LongTermMemoryLUT;
         typedef std::shared_ptr<LongTermMemoryLUT> LongTermMemoryLUTPtr;
 
@@ -51,8 +44,15 @@ namespace armarx::armem
             LongTermMemoryLUT(const std::string&);
             LongTermMemoryLUT(const io::DiskWriterPtr&);
 
-            bool writeOnDisk(const MemoryPtr&);
-            bool writeOnDisk(const std::map<std::string, CoreSegmentPtr>&);
+            void writeOnDisk(const MemoryPtr&);
+            void writeOnDisk(const std::map<std::string, CoreSegmentPtr>&);
+
+            void loadFromDisk();
+
+            std::string getLUTasString();
+
+        private:
+            void updateLUT(const EasyStringMemory& info);
 
         private:
             EasyStringMemory lut;
diff --git a/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/DiskWriter.h b/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/DiskWriter.h
index 4cbd3f01a..98367758d 100644
--- a/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/DiskWriter.h
+++ b/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/DiskWriter.h
@@ -47,8 +47,24 @@ namespace armarx::armem
 {
     namespace ltm
     {
+        typedef std::vector<std::string> EasyStringEntityHistory; // absolute paths to stored files
+        typedef std::map<Time, EasyStringEntityHistory> EasyStringEntity;
+        typedef std::map<std::string, EasyStringEntity> EasyStringProviderSegment;
+        typedef std::map<std::string, EasyStringProviderSegment> EasyStringCoreSegment;
+        typedef std::map<std::string, EasyStringCoreSegment> EasyStringMemory;
+
         namespace io
         {
+            struct DiskWriterReturnInformation
+            {
+                EasyStringMemory storedElements;
+                std::vector<std::string> coreSegmentsError;
+                std::vector<std::string> providerSegmentsError;
+                std::vector<std::string> entitiesError;
+                std::vector<std::string> historyTimestampsError;
+                std::vector<std::string> entityInstancesError;
+            };
+
             class DiskWriter;
             using DiskWriterPtr = std::shared_ptr<DiskWriter>;
 
@@ -56,7 +72,7 @@ namespace armarx::armem
             {
             public:
                 DiskWriter() :
-                    rootPath("/tmp/")
+                    rootPath("/tmp/MemoryExport/")
                 {}
 
                 DiskWriter(const std::string& r) :
@@ -73,57 +89,112 @@ namespace armarx::armem
                     }
                 }
 
-                bool writeOnDisk(const MemoryPtr& m)
+                DiskWriterReturnInformation writeOnDisk(const MemoryPtr& m)
                 {
                     return writeOnDisk(m->coreSegments);
                 }
 
-                bool writeOnDisk(const std::map<std::string, CoreSegmentPtr>& m)
+                DiskWriterReturnInformation writeOnDisk(const std::map<std::string, CoreSegmentPtr>& m)
                 {
+                    DiskWriterReturnInformation ret;
                     for (const auto& [coreKey, coreSegment] : m)
                     {
-                        ensureCoreSegmentPathExists(coreKey);
+                        std::string currentMemoryPath = coreKey;
+                        if (!ensureCoreSegmentPathExists(coreKey))
+                        {
+                            ret.coreSegmentsError.push_back(currentMemoryPath);
+                            continue;
+                        }
+                        ret.storedElements[coreKey] = {};
                         for (const auto& [providerKey, providerSegment] : coreSegment->providerSegments)
                         {
-                            ensureProviderSegmentPathExists(coreKey, providerKey);
-                            for (const auto& [entityKey, entityHistory] : providerSegment->entities)
+                            currentMemoryPath += "/" + providerKey;
+                            if (!ensureProviderSegmentPathExists(coreKey, providerKey))
+                            {
+                                ret.providerSegmentsError.push_back(currentMemoryPath);
+                                continue;
+                            }
+                            ret.storedElements[coreKey][providerKey] = {};
+                            for (const auto& [entityKey, entity] : providerSegment->entities)
                             {
-                                ensureEntityPathExists(coreKey, providerKey, entityKey);
-                                for (const auto& [entityHistoryTimestamp, entitySnapshot] : entityHistory->history)
+                                currentMemoryPath += "/" + entityKey;
+                                if (!ensureEntityPathExists(coreKey, providerKey, entityKey))
+                                {
+                                    ret.entitiesError.push_back(currentMemoryPath);
+                                    continue;
+                                }
+                                ret.storedElements[coreKey][providerKey][entityKey] = {};
+                                for (const auto& [entityHistoryTimestamp, entitySnapshot] : entity->history)
                                 {
-                                    ensureTimestampPathExists(coreKey, providerKey, entityKey, entityHistoryTimestamp);
+                                    currentMemoryPath += "/" + std::to_string(entityHistoryTimestamp.toMilliSeconds());
+                                    if (!ensureTimestampPathExists(coreKey, providerKey, entityKey, entityHistoryTimestamp))
+                                    {
+                                        ret.historyTimestampsError.push_back(currentMemoryPath);
+                                        continue;
+                                    }
+                                    ret.storedElements[coreKey][providerKey][entityKey][entityHistoryTimestamp] = {};
                                     for (unsigned int i = 0; i < entitySnapshot->instances.size(); ++i)
                                     {
+                                        currentMemoryPath += "/" + std::to_string(i);
                                         std::filesystem::path entityElementPath = createEntityElementPath(coreKey, providerKey, entityKey, entityHistoryTimestamp, i);
-                                        if (!entityElementPathExists(entityElementPath))
+                                        std::string val = getDataAsString(wrapData(entitySnapshot->instances[i]));
+                                        if (entityElementPathExists(entityElementPath))
                                         {
-                                            std::ofstream ofs;
-                                            ofs.open(entityElementPath);
-
-
-                                            ofs << getDataAsString(wrapData(entitySnapshot->instances[i]));
-                                            ofs.close();
+                                            if (std::filesystem::is_directory(entityElementPath))
+                                            {
+                                                ret.entityInstancesError.push_back(currentMemoryPath);
+                                                continue;
+                                            }
+                                            std::ifstream ifs(entityElementPath);
+                                            std::string file_content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
+                                            if (file_content == val)
+                                            {
+                                                // already written. skip
+                                                continue;
+                                            }
                                         }
-                                        // check content if file already existent?
+                                        // write
+                                        std::ofstream ofs;
+                                        ofs.open(entityElementPath);
+                                        ofs << val;
+                                        ofs.close();
+                                        ret.storedElements[coreKey][providerKey][entityKey][entityHistoryTimestamp].push_back(entityElementPath);
                                     }
                                 }
                             }
                         }
                     }
-                    return true;
+                    return ret;
                 }
 
             protected:
                 aron::datanavigator::AronDictDataNavigatorPtr wrapData(const EntityInstancePtr& e) const
                 {
                     aron::datanavigator::AronDictDataNavigatorPtr dataWrapped(new aron::datanavigator::AronDictDataNavigator());
-                    dataWrapped->addElement("instanceData", e->data());
+                    dataWrapped->addElement("data", e->data());
 
                     aron::datanavigator::AronLongDataNavigatorPtr timeWrapped(new aron::datanavigator::AronLongDataNavigator());
                     timeWrapped->setValue(Time::now().toMilliSeconds());
                     dataWrapped->addElement("timeWrapped", timeWrapped);
 
-                    // TODO add more metadata
+
+                    const EntityInstanceMetadata& metadata = e->metadata();
+                    aron::datanavigator::AronLongDataNavigatorPtr timeCreated(new aron::datanavigator::AronLongDataNavigator());
+                    timeCreated->setValue(metadata.timeCreated.toMilliSeconds());
+                    dataWrapped->addElement("timeCreated", timeCreated);
+
+                    aron::datanavigator::AronLongDataNavigatorPtr timeSent(new aron::datanavigator::AronLongDataNavigator());
+                    timeSent->setValue(metadata.timeSent.toMilliSeconds());
+                    dataWrapped->addElement("timeSent", timeSent);
+
+                    aron::datanavigator::AronLongDataNavigatorPtr timeArrived(new aron::datanavigator::AronLongDataNavigator());
+                    timeArrived->setValue(metadata.timeArrived.toMilliSeconds());
+                    dataWrapped->addElement("timeArrived", timeArrived);
+
+                    aron::datanavigator::AronFloatDataNavigatorPtr confidence(new aron::datanavigator::AronFloatDataNavigator());
+                    confidence->setValue(metadata.confidence);
+                    dataWrapped->addElement("confidence", confidence);
+
                     return dataWrapped;
                 }
 
diff --git a/source/RobotAPI/libraries/armem/memory/EntityInstance.h b/source/RobotAPI/libraries/armem/memory/EntityInstance.h
index d331bb946..d4c0a112a 100644
--- a/source/RobotAPI/libraries/armem/memory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/memory/EntityInstance.h
@@ -3,7 +3,7 @@
 #include <memory>
 
 #include <RobotAPI/interface/aron.h>
-#include <RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h>
+#include <RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h>
 
 #include "../core/Time.h"
 
diff --git a/source/RobotAPI/libraries/armem/memory/Memory.h b/source/RobotAPI/libraries/armem/memory/Memory.h
index ae0561389..37f34d3c0 100644
--- a/source/RobotAPI/libraries/armem/memory/Memory.h
+++ b/source/RobotAPI/libraries/armem/memory/Memory.h
@@ -45,7 +45,6 @@ namespace armarx::armem
         using Base::getEntity;
         const Entity& getEntity(const MemoryID& id) const override;
 
-
         /**
          * @brief Add an empty core segment with the given name.
          * @param name The core segment name.
diff --git a/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp
index 82b2e8fef..9afa46513 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp
@@ -150,4 +150,6 @@ BOOST_AUTO_TEST_CASE(test_memory_heavy_setup_and_export)
     // export memory
     armem::ltm::LongTermMemoryLUT ltm("/tmp/MemoryExport/");
     ltm.writeOnDisk(memory);
+
+    std::cout << ltm.getLUTasString() << std::endl;
 }
diff --git a/source/RobotAPI/libraries/aron/aroncore/AronConfig.h b/source/RobotAPI/libraries/aron/aroncore/AronConfig.h
index e1176aa38..a40e3cd54 100644
--- a/source/RobotAPI/libraries/aron/aroncore/AronConfig.h
+++ b/source/RobotAPI/libraries/aron/aroncore/AronConfig.h
@@ -84,6 +84,14 @@ namespace armarx
     RUN_ARON_MACRO(Dict, dict, DICT) \
     RUN_ARON_MACRO(Tuple, tuple, TUPLE) \
 
+#define HANDLE_DICT_SERIALIZER_TYPES \
+    RUN_ARON_MACRO(Object, object, OBJECT) \
+    RUN_ARON_MACRO(Dict, dict, DICT) \
+
+#define HANDLE_LIST_SERIALIZER_TYPES \
+    RUN_ARON_MACRO(List, list, LIST) \
+    RUN_ARON_MACRO(Tuple, tuple, TUPLE) \
+
 #define HANDLE_CONTAINER_TYPES_EXCEPT_OBJECT \
     RUN_ARON_MACRO(List, list, LIST) \
     RUN_ARON_MACRO(Dict, dict, DICT) \
diff --git a/source/RobotAPI/libraries/aron/aroncore/AronFactory.h b/source/RobotAPI/libraries/aron/aroncore/AronFactory.h
index 04ab18cf6..6ec2b1604 100644
--- a/source/RobotAPI/libraries/aron/aroncore/AronFactory.h
+++ b/source/RobotAPI/libraries/aron/aroncore/AronFactory.h
@@ -50,7 +50,7 @@ namespace armarx
 
         template <typename Input, typename Output>
         class AronPtrInputFactory :
-                virtual public AronFactory<Input, Output>
+            virtual public AronFactory<Input, Output>
         {
         public:
             AronPtrInputFactory() = default;
@@ -61,7 +61,7 @@ namespace armarx
         protected:
             static void CheckIfInputIsNull(const std::string& c, const std::string& m, const AronPath& p, const Input& i)
             {
-                if(i.get() == nullptr)
+                if (i.get() == nullptr)
                 {
                     throw exception::AronExceptionWithPathInfo(c, m, "The used input is NULL", p);
                 }
@@ -70,7 +70,7 @@ namespace armarx
 
         template <typename Input, typename Output>
         class AronPtrOutputFactory :
-                virtual public AronFactory<Input, Output>
+            virtual public AronFactory<Input, Output>
         {
         public:
             AronPtrOutputFactory() = default;
@@ -81,7 +81,7 @@ namespace armarx
         protected:
             static void CheckIfOutputIsNull(const std::string& c, const std::string& m, const AronPath& p, const Output& o)
             {
-                if(o.get() == nullptr)
+                if (o.get() == nullptr)
                 {
                     throw exception::AronExceptionWithPathInfo(c, m, "The used output is NULL", p);
                 }
@@ -90,8 +90,8 @@ namespace armarx
 
         template <typename Input, typename Output>
         class AronPtrInputPtrOutputFactory :
-                virtual public AronPtrInputFactory<Input, Output>,
-                virtual public AronPtrOutputFactory<Input, Output>
+            virtual public AronPtrInputFactory<Input, Output>,
+            virtual public AronPtrOutputFactory<Input, Output>
         {
         public:
             AronPtrInputPtrOutputFactory() = default;
diff --git a/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/AronCppWriter.cpp b/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/AronCppWriter.cpp
index a854d7566..c22a9cd65 100644
--- a/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/AronCppWriter.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/AronCppWriter.cpp
@@ -50,12 +50,14 @@ namespace armarx
                 void AronTypeClassCppWriter::addToAronMethod()
                 {
                     // The toAron Serializer is visible by default
-                    AronWriterInfoPtr toAron = AronWriterInfoPtr(new AronWriterInfo());
-                    toAron->methodName = "toAron";
-                    toAron->returnType = "armarx::aron::datanavigator::AronDataNavigatorPtr";
-                    toAron->writerClassType = "armarx::aron::io::AronDataNavigatorWriter";
-                    toAron->include = "<RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.h>";
-                    dataWriters.push_back(toAron);
+                    {
+                        AronWriterInfoPtr toAron = AronWriterInfoPtr(new AronWriterInfo());
+                        toAron->methodName = "toAron";
+                        toAron->returnType = "armarx::aron::datanavigator::AronDictDataNavigatorPtr";
+                        toAron->writerClassType = "armarx::aron::io::AronDataNavigatorWriter";
+                        toAron->include = "<RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.h>";
+                        dataWriters.push_back(toAron);
+                    }
                 }
 
                 void AronTypeClassCppWriter::addFromAronMethod()
@@ -64,7 +66,7 @@ namespace armarx
                     {
                         AronReaderInfoPtr fromAron = AronReaderInfoPtr(new AronReaderInfo());
                         fromAron->methodName = "fromAron";
-                        fromAron->argumentType = "armarx::aron::datanavigator::AronDataNavigatorPtr";
+                        fromAron->argumentType = "armarx::aron::datanavigator::AronDictDataNavigatorPtr";
                         fromAron->readerClassType = "armarx::aron::io::AronDataNavigatorReader";
                         fromAron->include = "<RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.h>";
                         dataReaders.push_back(fromAron);
@@ -72,9 +74,8 @@ namespace armarx
                     {
                         AronReaderInfoPtr fromAron = AronReaderInfoPtr(new AronReaderInfo());
                         fromAron->methodName = "fromAron";
-                        fromAron->argumentType = "armarx::aron::data::AronDataPtr";
+                        fromAron->argumentType = "armarx::aron::data::AronDictPtr";
                         fromAron->readerClassType = "armarx::aron::io::AronDataNavigatorReader";
-                        fromAron->include = "<RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.h>";
                         dataReaders.push_back(fromAron);
                     }
                 }
@@ -84,7 +85,7 @@ namespace armarx
                     // The toAron Serializer is visible by default
                     AronWriterInfoPtr toAronType = AronWriterInfoPtr(new AronWriterInfo());
                     toAronType->methodName = "toInitialAronType";
-                    toAronType->returnType = "armarx::aron::typenavigator::AronTypeNavigatorPtr";
+                    toAronType->returnType = "armarx::aron::typenavigator::AronObjectTypeNavigatorPtr";
                     toAronType->writerClassType = "armarx::aron::io::AronTypeNavigatorWriter";
                     toAronType->include = "<RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriter.h>";
                     initialTypeWriters.push_back(toAronType);
@@ -92,7 +93,7 @@ namespace armarx
                     // The toAron Serializer is visible by default
                     AronWriterInfoPtr toAronType2 = AronWriterInfoPtr(new AronWriterInfo());
                     toAronType2->methodName = "toCurrentAronType";
-                    toAronType2->returnType = "armarx::aron::typenavigator::AronTypeNavigatorPtr";
+                    toAronType2->returnType = "armarx::aron::typenavigator::AronObjectTypeNavigatorPtr";
                     toAronType2->writerClassType = "armarx::aron::io::AronTypeNavigatorWriter";
                     currentTypeWriters.push_back(toAronType2);
                 }
@@ -173,7 +174,7 @@ namespace armarx
                             {
                                 c->addInclude(info->include);
                             }
-                            CppMethodPtr convert = objectSerializer->toSpecializedDataWriterMethod(info->returnType, info->methodName, info->writerClassType);
+                            CppMethodPtr convert = objectSerializer->toSpecializedDataWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::datanavigator::AronDictDataNavigator::DynamicCast");
                             c->addMethod(convert);
                         }
 
@@ -195,7 +196,7 @@ namespace armarx
                             {
                                 c->addInclude(info->include);
                             }
-                            CppMethodPtr convert = objectSerializer->toSpecializedInitialTypeWriterMethod(info->returnType, info->methodName, info->writerClassType);
+                            CppMethodPtr convert = objectSerializer->toSpecializedInitialTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::AronObjectTypeNavigator::DynamicCast");
                             c->addMethod(convert);
                         }
 
@@ -206,7 +207,7 @@ namespace armarx
                             {
                                 c->addInclude(info->include);
                             }
-                            CppMethodPtr convert = objectSerializer->toSpecializedCurrentTypeWriterMethod(info->returnType, info->methodName, info->writerClassType);
+                            CppMethodPtr convert = objectSerializer->toSpecializedCurrentTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::AronObjectTypeNavigator::DynamicCast");
                             c->addMethod(convert);
                         }
 
@@ -217,7 +218,7 @@ namespace armarx
                             {
                                 c->addInclude(info->include);
                             }
-                            CppMethodPtr convert = objectSerializer->toSpecializedTypeReaderMethod(info->argumentType, info->methodName, info->readerClassType);
+                            CppMethodPtr convert = objectSerializer->toSpecializedCurrentTypeReaderMethod(info->argumentType, info->methodName, info->readerClassType);
                             c->addMethod(convert);
                         }
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/typeSerializers/AronTypeCppSerializer.cpp b/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/typeSerializers/AronTypeCppSerializer.cpp
index 9dc61382a..a64a9a0a9 100644
--- a/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/typeSerializers/AronTypeCppSerializer.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/typeSerializers/AronTypeCppSerializer.cpp
@@ -244,7 +244,7 @@ namespace armarx
                         return m;
                     }
 
-                    CppMethodPtr AronTypeCppSerializer::toSpecializedDataWriterMethod(const std::string& returnname, const std::string& methodname, const std::string& writerName) const
+                    CppMethodPtr AronTypeCppSerializer::toSpecializedDataWriterMethod(const std::string& returnname, const std::string& methodname, const std::string& writerName, const std::string& enforceConversion) const
                     {
                         std::stringstream doc;
                         doc << "@brief specializedDataWrite() - This method returns a new data from the member data types using a writer implementation. \n";
@@ -253,23 +253,23 @@ namespace armarx
                         CppMethodPtr m = CppMethodPtr(new CppMethod(returnname + " " + methodname + "() const", doc.str()));
                         m->addLine(writerName + " writer;");
                         m->addLine("this->write(writer);");
-                        m->addLine("return writer.getResult();");
+                        m->addLine("return " + enforceConversion + "(writer.getResult());");
                         return m;
                     }
 
-                    CppMethodPtr AronTypeCppSerializer::toSpecializedDataReaderMethod(const std::string& argumentname, const std::string& methodname, const std::string& readerName) const
+                    CppMethodPtr AronTypeCppSerializer::toSpecializedDataReaderMethod(const std::string& argumentname, const std::string& methodname, const std::string& readerName, const std::string& enforceConversion) const
                     {
                         std::stringstream doc;
                         doc << "@brief specializedDataRead() - This method sets the struct members to new values given in a reader implementation. \n";
                         doc << "@return - nothing";
 
                         CppMethodPtr m = CppMethodPtr(new CppMethod("void " + methodname + "(const " + argumentname + "& input)", doc.str()));
-                        m->addLine(readerName + " reader(input);");
+                        m->addLine(readerName + " reader(" + enforceConversion + "(input));");
                         m->addLine("this->read(reader);");
                         return m;
                     }
 
-                    CppMethodPtr AronTypeCppSerializer::toSpecializedInitialTypeWriterMethod(const std::string& returnname, const std::string& methodname, const std::string& writerName) const
+                    CppMethodPtr AronTypeCppSerializer::toSpecializedInitialTypeWriterMethod(const std::string& returnname, const std::string& methodname, const std::string& writerName, const std::string& enforceConversion) const
                     {
                         std::stringstream doc;
                         doc << "@brief specializedTypeWrite() - This method returns a new type from the member data types using a writer implementation. \n";
@@ -278,11 +278,11 @@ namespace armarx
                         CppMethodPtr m = CppMethodPtr(new CppMethod("static " + returnname + " " + methodname + "()", doc.str()));
                         m->addLine(writerName + " writer;");
                         m->addLine(getCppTypename() + "::writeInitialType(writer);");
-                        m->addLine("return writer.getResult();");
+                        m->addLine("return " + enforceConversion + "(writer.getResult());");
                         return m;
                     }
 
-                    CppMethodPtr AronTypeCppSerializer::toSpecializedCurrentTypeWriterMethod(const std::string& returnname, const std::string& methodname, const std::string& writerName) const
+                    CppMethodPtr AronTypeCppSerializer::toSpecializedCurrentTypeWriterMethod(const std::string& returnname, const std::string& methodname, const std::string& writerName, const std::string& enforceConversion) const
                     {
                         std::stringstream doc;
                         doc << "@brief specializedTypeWrite() - This method returns a new type from the current member data types using a writer implementation. \n";
@@ -291,18 +291,18 @@ namespace armarx
                         CppMethodPtr m = CppMethodPtr(new CppMethod(returnname + " " + methodname + "()", doc.str()));
                         m->addLine(writerName + " writer;");
                         m->addLine("this->writeCurrentType(writer);");
-                        m->addLine("return writer.getResult();");
+                        m->addLine("return " + enforceConversion + "(writer.getResult());");
                         return m;
                     }
 
-                    CppMethodPtr AronTypeCppSerializer::toSpecializedTypeReaderMethod(const std::string& argumentname, const std::string& methodname, const std::string& readerName) const
+                    CppMethodPtr AronTypeCppSerializer::toSpecializedCurrentTypeReaderMethod(const std::string& argumentname, const std::string& methodname, const std::string& readerName, const std::string& enforceConversion) const
                     {
                         std::stringstream doc;
                         doc << "@brief specializedTypeRead() - This method sets the structure of the members to new values given in a reader implementation. \n";
                         doc << "@return - nothing";
 
                         CppMethodPtr m = CppMethodPtr(new CppMethod("void " + methodname + "(const " + argumentname + "& input)", doc.str()));
-                        m->addLine(readerName + " reader(input);");
+                        m->addLine(readerName + " reader(" + enforceConversion + "(input));");
                         m->addLine("this->readType(reader);");
                         return m;
                     }
diff --git a/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/typeSerializers/AronTypeCppSerializer.h b/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/typeSerializers/AronTypeCppSerializer.h
index aaecbf40d..51bab528d 100644
--- a/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/typeSerializers/AronTypeCppSerializer.h
+++ b/source/RobotAPI/libraries/aron/aroncore/codegenerator/codeWriters/cppWriter/typeSerializers/AronTypeCppSerializer.h
@@ -78,12 +78,12 @@ namespace armarx
                         std::string getAronTypeTypename() const;
                         std::string getAronTypePtrTypename() const;
 
-                        CppMethodPtr toSpecializedDataWriterMethod(const std::string&, const std::string&, const std::string&) const;
-                        CppMethodPtr toSpecializedDataReaderMethod(const std::string&, const std::string&, const std::string&) const;
+                        CppMethodPtr toSpecializedDataWriterMethod(const std::string&, const std::string&, const std::string&, const std::string& enforceType = "") const;
+                        CppMethodPtr toSpecializedDataReaderMethod(const std::string&, const std::string&, const std::string&, const std::string& enforceType = "") const;
 
-                        CppMethodPtr toSpecializedInitialTypeWriterMethod(const std::string&, const std::string&, const std::string&) const;
-                        CppMethodPtr toSpecializedCurrentTypeWriterMethod(const std::string&, const std::string&, const std::string&) const;
-                        CppMethodPtr toSpecializedTypeReaderMethod(const std::string&, const std::string&, const std::string&) const;
+                        CppMethodPtr toSpecializedInitialTypeWriterMethod(const std::string&, const std::string&, const std::string&, const std::string& enforceType = "") const;
+                        CppMethodPtr toSpecializedCurrentTypeWriterMethod(const std::string&, const std::string&, const std::string&, const std::string& enforceType = "") const;
+                        CppMethodPtr toSpecializedCurrentTypeReaderMethod(const std::string&, const std::string&, const std::string&, const std::string& enforceType = "") const;
 
                         // virtual override definitions
                         virtual std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const = 0;
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/AronDataClassReaderToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/AronDataClassReaderToken.h
index 2e52bc5aa..11daabc82 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/AronDataClassReaderToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/AronDataClassReaderToken.h
@@ -39,24 +39,24 @@ namespace armarx
     {
         namespace io
         {
-            template<typename ElementPtrTypename>
+            template<typename ElementReturnPtrTypename, typename ElementAddTypename>
             class AronDataClassReaderToken;
 
-            template<typename ElementPtrTypename>
-            using AronDataClassReaderTokenPtr = std::shared_ptr<AronDataClassReaderToken<ElementPtrTypename>>;
+            template<typename ElementReturnPtrTypename, typename ElementAddTypename>
+            using AronDataClassReaderTokenPtr = std::shared_ptr<AronDataClassReaderToken<ElementReturnPtrTypename, ElementAddTypename>>;
 
-            template<typename ElementPtrTypename>
+            template<typename ElementReturnPtrTypename, typename ElementAddTypename>
             class AronDataClassReaderToken :
-                virtual public AronReaderToken<AronDataDescriptor, ElementPtrTypename>
+                virtual public AronReaderToken<AronDataDescriptor, ElementReturnPtrTypename, ElementAddTypename>
             {
             public:
-                using PointerType = AronDataClassReaderToken<ElementPtrTypename>;
+                using PointerType = AronDataClassReaderTokenPtr<ElementReturnPtrTypename, ElementAddTypename>;
 
             public:
                 // constructors
                 AronDataClassReaderToken() = delete;
-                AronDataClassReaderToken(const AronDataDescriptor desc, const ElementPtrTypename& data) :
-                    AronReaderToken<AronDataDescriptor, ElementPtrTypename>(desc, data)
+                AronDataClassReaderToken(const AronDataDescriptor desc, const ElementAddTypename& data) :
+                    AronReaderToken<AronDataDescriptor, ElementReturnPtrTypename, ElementAddTypename>(desc, data)
                 { }
 
                 virtual std::string resolveCurrentKey() const override
@@ -78,7 +78,7 @@ namespace armarx
                     return this->currentKey;
                 }
 
-                virtual ElementPtrTypename getElementAndIncreaseCnt() override = 0;
+                virtual ElementReturnPtrTypename getElementAndIncreaseCnt() override = 0;
 
             private:
             };
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.cpp b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.cpp
index 018bbf0ec..b37dde676 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.cpp
@@ -38,14 +38,14 @@ namespace armarx
     {
         namespace io
         {
-            AronDataNavigatorReader::AronDataNavigatorReader(const datanavigator::AronDataNavigatorPtr& n) :
-                AronDataClassReader<datanavigator::AronDataNavigatorPtr, AronDataNavigatorReaderTokenPtr>(n)
+            AronDataNavigatorReader::AronDataNavigatorReader(const datanavigator::AronContainerDataNavigatorPtr& n) :
+                AronDataClassReader<datanavigator::AronContainerDataNavigatorPtr, AronDataNavigatorReaderTokenPtr>(n)
             {
             }
 
-            AronDataNavigatorReader::AronDataNavigatorReader(const data::AronDataPtr& n) :
-                AronDataClassReader<datanavigator::AronDataNavigatorPtr, AronDataNavigatorReaderTokenPtr>(
-                    datanavigator::AronDataNavigator::FromAronData(n)
+            AronDataNavigatorReader::AronDataNavigatorReader(const data::AronContainerPtr& n) :
+                AronDataClassReader<datanavigator::AronContainerDataNavigatorPtr, AronDataNavigatorReaderTokenPtr>(
+                    datanavigator::AronContainerDataNavigator::DynamicCast(datanavigator::AronDataNavigator::FromAronData(n))
                 )
             {
             }
@@ -65,8 +65,15 @@ namespace armarx
     int AronDataNavigatorReader::readStart##upperType() \
     { \
         datanavigator::AronDataNavigatorPtr current_nav = getNextNavigator(); \
+        auto desc = current_nav->getDescriptor(); \
+        if (desc != AronDataDescriptor::eAron##upperType) \
+        { \
+            throw exception::AronDataDescriptorNotValidException("AronDataNavigatorReader", "readStart" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \
+            return false; \
+        } \
+        datanavigator::Aron##upperType##DataNavigatorPtr current_nav_casted = datanavigator::Aron##upperType##DataNavigator::DynamicCast(current_nav); \
         int c = current_nav->childrenSize(); \
-        AronDataNavigatorReaderTokenPtr newToken = AronDataNavigatorReaderTokenPtr(new AronDataNavigatorReaderToken(current_nav->getDescriptor(), current_nav)); \
+        AronDataNavigatorReaderTokenPtr newToken = AronDataNavigatorReaderTokenPtr(new AronDataNavigatorReaderToken(current_nav->getDescriptor(), current_nav_casted)); \
         stack.push(newToken); \
         return c; \
     } \
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.h
index 79fd1db67..e6edac332 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReader.h
@@ -41,7 +41,7 @@ namespace armarx
             typedef std::shared_ptr<AronDataNavigatorReader> AronDataNavigatorReaderPtr;
 
             class AronDataNavigatorReader :
-                virtual public AronDataClassReader<datanavigator::AronDataNavigatorPtr, AronDataNavigatorReaderTokenPtr>
+                virtual public AronDataClassReader<datanavigator::AronContainerDataNavigatorPtr, AronDataNavigatorReaderTokenPtr>
             {
             public:
                 using PointerType = AronDataNavigatorReaderPtr;
@@ -49,8 +49,8 @@ namespace armarx
             public:
                 // constructors
                 AronDataNavigatorReader() = delete;
-                AronDataNavigatorReader(const datanavigator::AronDataNavigatorPtr& n);
-                AronDataNavigatorReader(const data::AronDataPtr& n);
+                AronDataNavigatorReader(const datanavigator::AronContainerDataNavigatorPtr& n);
+                AronDataNavigatorReader(const data::AronContainerPtr& n);
 
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
     virtual int  readStart##upperType() override; \
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReaderToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReaderToken.h
index 28c4488b9..be68ba2a5 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReaderToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NavigatorReader/AronDataNavigatorReaderToken.h
@@ -42,7 +42,7 @@ namespace armarx
             typedef std::shared_ptr<AronDataNavigatorReaderToken> AronDataNavigatorReaderTokenPtr;
 
             class AronDataNavigatorReaderToken :
-                virtual public AronDataClassReaderToken<datanavigator::AronDataNavigatorPtr>
+                virtual public AronDataClassReaderToken<datanavigator::AronDataNavigatorPtr, datanavigator::AronContainerDataNavigatorPtr>
             {
             public:
                 using PointerType = AronDataNavigatorReaderTokenPtr;
@@ -50,9 +50,9 @@ namespace armarx
             public:
                 // constructors
                 AronDataNavigatorReaderToken() = delete;
-                AronDataNavigatorReaderToken(const AronDataDescriptor desc, const datanavigator::AronDataNavigatorPtr& data) :
-                    AronReaderToken<AronDataDescriptor, datanavigator::AronDataNavigatorPtr>(desc, data),
-                    AronDataClassReaderToken<datanavigator::AronDataNavigatorPtr>(desc, data)
+                AronDataNavigatorReaderToken(const AronDataDescriptor desc, const datanavigator::AronContainerDataNavigatorPtr& data) :
+                    AronReaderToken<AronDataDescriptor, datanavigator::AronDataNavigatorPtr, datanavigator::AronContainerDataNavigatorPtr>(desc, data),
+                    AronDataClassReaderToken<datanavigator::AronDataNavigatorPtr, datanavigator::AronContainerDataNavigatorPtr>(desc, data)
                 {
                     switch (descriptor)
                     {
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NlohmannJSONReader/AronDataNlohmannJSONReaderToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NlohmannJSONReader/AronDataNlohmannJSONReaderToken.h
index 42f81e4b8..3ee8d3c54 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NlohmannJSONReader/AronDataNlohmannJSONReaderToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classReaders/NlohmannJSONReader/AronDataNlohmannJSONReaderToken.h
@@ -44,7 +44,7 @@ namespace armarx
             typedef std::shared_ptr<AronDataNlohmannJSONReaderToken> AronDataNlohmannJSONReaderTokenPtr;
 
             class AronDataNlohmannJSONReaderToken :
-                virtual public AronDataClassReaderToken<nlohmann::json>
+                virtual public AronDataClassReaderToken<nlohmann::json, nlohmann::json>
             {
             public:
                 using PointerType = AronDataNlohmannJSONReaderTokenPtr;
@@ -53,8 +53,8 @@ namespace armarx
                 // constructors
                 AronDataNlohmannJSONReaderToken() = delete;
                 AronDataNlohmannJSONReaderToken(const AronDataDescriptor desc, const nlohmann::json& data) :
-                    AronReaderToken<AronDataDescriptor, nlohmann::json>(desc, data),
-                    AronDataClassReaderToken<nlohmann::json>(desc, data)
+                    AronReaderToken<AronDataDescriptor, nlohmann::json, nlohmann::json>(desc, data),
+                    AronDataClassReaderToken<nlohmann::json, nlohmann::json>(desc, data)
                 {
                     switch (descriptor)
                     {
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/AronDataClassWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/AronDataClassWriterToken.h
index e15fa0cdd..141e1de42 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/AronDataClassWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/AronDataClassWriterToken.h
@@ -37,28 +37,28 @@ namespace armarx
     {
         namespace io
         {
-            template<typename ElementTypename>
+            template<typename ElementTypename, typename ElementAddTypename>
             class AronDataClassWriterToken;
 
-            template<typename ElementTypename>
-            using AronDataClassWriterTokenPtr = std::shared_ptr<AronDataClassWriterToken<ElementTypename>>;
+            template<typename ElementTypename, typename ElementAddTypename>
+            using AronDataClassWriterTokenPtr = std::shared_ptr<AronDataClassWriterToken<ElementTypename, ElementAddTypename>>;
 
-            template<typename ElementTypename>
+            template<typename ElementTypename, typename ElementAddTypename>
             class AronDataClassWriterToken :
-                virtual public AronWriterToken<AronDataDescriptor, ElementTypename>
+                virtual public AronWriterToken<AronDataDescriptor, ElementTypename, ElementAddTypename>
             {
             public:
-                using PointerType = AronDataClassWriterToken<ElementTypename>;
+                using PointerType = AronDataClassWriterToken<ElementTypename, ElementAddTypename>;
 
             public:
                 // constructor
                 AronDataClassWriterToken() = delete;
                 AronDataClassWriterToken(const AronDataDescriptor desc, const ElementTypename& n) :
-                    AronWriterToken<AronDataDescriptor, ElementTypename>(desc, n)
+                    AronWriterToken<AronDataDescriptor, ElementTypename, ElementAddTypename>(desc, n)
                 {}
 
                 // public member functions
-                virtual void addElement(const ElementTypename&) override = 0;
+                virtual void addElement(const ElementAddTypename&) override = 0;
 
                 virtual std::string toElementAccessor() const override
                 {
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.cpp b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.cpp
index 474139dbf..a39b26b54 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.cpp
@@ -57,7 +57,7 @@ namespace armarx
     bool AronDataNavigatorWriter::writeStart##upperType() \
     { \
         AronPath path = generateAronPath(); \
-        datanavigator::AronDataNavigatorPtr data = datanavigator::AronDataNavigatorPtr(new datanavigator::Aron##upperType##DataNavigator(path)); \
+        datanavigator::Aron##upperType##DataNavigatorPtr data = datanavigator::Aron##upperType##DataNavigatorPtr(new datanavigator::Aron##upperType##DataNavigator(path)); \
         AronDataNavigatorWriterTokenPtr new_token = AronDataNavigatorWriterTokenPtr(new AronDataNavigatorWriterToken(data->getDescriptor(), data)); \
         stack.push(new_token); \
         return true; \
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.h
index 93126c07a..ab1022c8f 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriter.h
@@ -42,7 +42,7 @@ namespace armarx
             typedef std::shared_ptr<AronDataNavigatorWriter> AronDataNavigatorWriterPtr;
 
             class AronDataNavigatorWriter :
-                virtual public AronDataClassWriter<datanavigator::AronDataNavigatorPtr, AronDataNavigatorWriterTokenPtr>
+                virtual public AronDataClassWriter<datanavigator::AronContainerDataNavigatorPtr, AronDataNavigatorWriterTokenPtr>
             {
             public:
                 AronDataNavigatorWriter() = default;
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriterToken.h
index bc6fd30ba..5c1945599 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NavigatorWriter/AronDataNavigatorWriterToken.h
@@ -41,7 +41,7 @@ namespace armarx
             typedef std::shared_ptr<AronDataNavigatorWriterToken> AronDataNavigatorWriterTokenPtr;
 
             class AronDataNavigatorWriterToken :
-                virtual public AronDataClassWriterToken<datanavigator::AronDataNavigatorPtr>
+                virtual public AronDataClassWriterToken<datanavigator::AronContainerDataNavigatorPtr, datanavigator::AronDataNavigatorPtr>
             {
             public:
                 using PointerType = AronDataNavigatorWriterTokenPtr;
@@ -49,9 +49,9 @@ namespace armarx
             public:
                 // constructor
                 AronDataNavigatorWriterToken() = delete;
-                AronDataNavigatorWriterToken(const AronDataDescriptor desc, const datanavigator::AronDataNavigatorPtr& d) :
-                    AronWriterToken<AronDataDescriptor, datanavigator::AronDataNavigatorPtr>(desc, d),
-                    AronDataClassWriterToken<datanavigator::AronDataNavigatorPtr>(desc, d)
+                AronDataNavigatorWriterToken(const AronDataDescriptor desc, const datanavigator::AronContainerDataNavigatorPtr& d) :
+                    AronWriterToken<AronDataDescriptor, datanavigator::AronContainerDataNavigatorPtr, datanavigator::AronDataNavigatorPtr>(desc, d),
+                    AronDataClassWriterToken<datanavigator::AronContainerDataNavigatorPtr, datanavigator::AronDataNavigatorPtr>(desc, d)
                 {
 
                 }
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NlohmannJSONWriter/AronDataNlohmannJSONWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NlohmannJSONWriter/AronDataNlohmannJSONWriterToken.h
index 455b8b23e..4246f10e3 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NlohmannJSONWriter/AronDataNlohmannJSONWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/NlohmannJSONWriter/AronDataNlohmannJSONWriterToken.h
@@ -43,7 +43,7 @@ namespace armarx
             typedef std::shared_ptr<AronDataNlohmannJSONWriterToken> AronDataNlohmannJSONWriterTokenPtr;
 
             class AronDataNlohmannJSONWriterToken :
-                virtual public AronDataClassWriterToken<nlohmann::json>
+                virtual public AronDataClassWriterToken<nlohmann::json, nlohmann::json>
             {
             public:
                 using PointerType = AronDataNlohmannJSONWriterTokenPtr;
@@ -52,8 +52,8 @@ namespace armarx
                 // constructor
                 AronDataNlohmannJSONWriterToken() = delete;
                 AronDataNlohmannJSONWriterToken(const AronDataDescriptor desc, const nlohmann::json& d) :
-                    AronWriterToken<AronDataDescriptor, nlohmann::json>(desc, d),
-                    AronDataClassWriterToken<nlohmann::json>(desc, d)
+                    AronWriterToken<AronDataDescriptor, nlohmann::json, nlohmann::json>(desc, d),
+                    AronDataClassWriterToken<nlohmann::json, nlohmann::json>(desc, d)
                 {
 
                 }
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/RapidXMLWriter/AronDataRapidXMLWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/RapidXMLWriter/AronDataRapidXMLWriterToken.h
index 2e82c9326..9e2959e8d 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/RapidXMLWriter/AronDataRapidXMLWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronDataIO/classWriters/RapidXMLWriter/AronDataRapidXMLWriterToken.h
@@ -44,7 +44,7 @@ namespace armarx
             typedef std::shared_ptr<AronDataRapidXMLWriterToken> AronDataRapidXMLWriterTokenPtr;
 
             class AronDataRapidXMLWriterToken :
-                virtual public AronDataClassWriterToken<RapidXmlReaderNode>
+                virtual public AronDataClassWriterToken<RapidXmlReaderNode, RapidXmlReaderNode>
             {
             public:
                 using PointerType = AronDataRapidXMLWriterTokenPtr;
@@ -53,8 +53,8 @@ namespace armarx
                 // constructor
                 AronDataRapidXMLWriterToken() = delete;
                 AronDataRapidXMLWriterToken(const AronDataDescriptor desc, const RapidXmlReaderNode& d) :
-                    AronWriterToken<AronDataDescriptor, RapidXmlReaderNode>(desc, d),
-                    AronDataClassWriterToken<RapidXmlReaderNode>(desc, d)
+                    AronWriterToken<AronDataDescriptor, RapidXmlReaderNode, RapidXmlReaderNode>(desc, d),
+                    AronDataClassWriterToken<RapidXmlReaderNode, RapidXmlReaderNode>(desc, d)
                 {
 
                 }
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronReaderToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronReaderToken.h
index abac79059..39ebce21c 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronReaderToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronReaderToken.h
@@ -36,13 +36,13 @@ namespace armarx
     {
         namespace io
         {
-            template<typename AronDescriptorTypename, typename ElementTypename>
+            template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename>
             class AronReaderToken;
 
-            template<typename AronDescriptorTypename, typename ElementTypename>
-            using AronReaderTokenPtr = std::shared_ptr<AronReaderToken<AronDescriptorTypename, ElementTypename>> ;
+            template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename>
+            using AronReaderTokenPtr = std::shared_ptr<AronReaderToken<AronDescriptorTypename, ElementReturnPtrTypename, ElementTypename>> ;
 
-            template<typename AronDescriptorTypename, typename ElementTypename>
+            template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename>
             class AronReaderToken
             {
             public:
@@ -73,7 +73,7 @@ namespace armarx
 
                 virtual std::string resolveCurrentKey() const = 0;
 
-                virtual ElementTypename getElementAndIncreaseCnt() = 0;
+                virtual ElementReturnPtrTypename getElementAndIncreaseCnt() = 0;
 
             protected:
                 // members
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/AronTypeClassWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/AronTypeClassWriterToken.h
index 6ca01e548..5b016ca9f 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/AronTypeClassWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/AronTypeClassWriterToken.h
@@ -36,28 +36,28 @@ namespace armarx
     {
         namespace io
         {
-            template<typename ElementPtrTypename>
+            template<typename ElementPtrTypename, typename ElementAddTypename>
             class AronTypeClassWriterToken;
 
-            template<typename ElementPtrTypename>
-            using AronTypeClassWriterTokenPtr = std::shared_ptr<AronTypeClassWriterToken<ElementPtrTypename>>;
+            template<typename ElementPtrTypename, typename ElementAddTypename>
+            using AronTypeClassWriterTokenPtr = std::shared_ptr<AronTypeClassWriterToken<ElementPtrTypename, ElementAddTypename>>;
 
-            template<typename ElementPtrTypename>
+            template<typename ElementPtrTypename, typename ElementAddTypename>
             class AronTypeClassWriterToken :
-                virtual public AronWriterToken<AronTypeDescriptor, ElementPtrTypename>
+                virtual public AronWriterToken<AronTypeDescriptor, ElementPtrTypename, ElementAddTypename>
             {
             public:
-                using PointerType = AronTypeClassWriterToken<ElementPtrTypename>;
+                using PointerType = AronTypeClassWriterToken<ElementPtrTypename, ElementAddTypename>;
 
             public:
                 // constructor
                 AronTypeClassWriterToken() = delete;
                 AronTypeClassWriterToken(const AronTypeDescriptor desc, const ElementPtrTypename& n) :
-                    AronWriterToken<AronTypeDescriptor, ElementPtrTypename>(desc, n)
+                    AronWriterToken<AronTypeDescriptor, ElementPtrTypename, ElementAddTypename>(desc, n)
                 {}
 
                 // public member functions
-                virtual void addElement(const ElementPtrTypename&) = 0;
+                virtual void addElement(const ElementAddTypename&) = 0;
 
                 virtual std::string toElementAccessor() const override
                 {
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriter.cpp b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriter.cpp
index 4ed6df630..8e05757db 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriter.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriter.cpp
@@ -62,7 +62,7 @@ namespace armarx
     bool AronTypeNavigatorWriter::writeStart##upperType##Type() \
     { \
         AronPath path = generateAronPath(); \
-        typenavigator::AronTypeNavigatorPtr type = typenavigator::AronTypeNavigatorPtr(new typenavigator::Aron##upperType##TypeNavigator(path)); \
+        typenavigator::Aron##upperType##TypeNavigatorPtr type = typenavigator::Aron##upperType##TypeNavigatorPtr(new typenavigator::Aron##upperType##TypeNavigator(path)); \
         AronTypeNavigatorWriterTokenPtr new_token = AronTypeNavigatorWriterTokenPtr(new AronTypeNavigatorWriterToken(type->getDescriptor(), type)); \
         stack.push(new_token); \
         return true; \
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriterToken.h
index 95a6a0b90..393f297ab 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NavigatorWriter/AronTypeNavigatorWriterToken.h
@@ -41,7 +41,7 @@ namespace armarx
             typedef std::shared_ptr<AronTypeNavigatorWriterToken> AronTypeNavigatorWriterTokenPtr;
 
             class AronTypeNavigatorWriterToken :
-                virtual public AronTypeClassWriterToken<typenavigator::AronTypeNavigatorPtr>
+                virtual public AronTypeClassWriterToken<typenavigator::AronContainerTypeNavigatorPtr, typenavigator::AronTypeNavigatorPtr>
             {
             public:
                 using PointerType = AronTypeNavigatorWriterTokenPtr;
@@ -49,9 +49,9 @@ namespace armarx
             public:
                 // constructor
                 AronTypeNavigatorWriterToken() = delete;
-                AronTypeNavigatorWriterToken(const AronTypeDescriptor desc, const typenavigator::AronTypeNavigatorPtr& t) :
-                    AronWriterToken<AronTypeDescriptor, typenavigator::AronTypeNavigatorPtr>(desc, t),
-                    AronTypeClassWriterToken<typenavigator::AronTypeNavigatorPtr>(desc, t)
+                AronTypeNavigatorWriterToken(const AronTypeDescriptor desc, const typenavigator::AronContainerTypeNavigatorPtr& t) :
+                    AronWriterToken<AronTypeDescriptor, typenavigator::AronContainerTypeNavigatorPtr, typenavigator::AronTypeNavigatorPtr>(desc, t),
+                    AronTypeClassWriterToken<typenavigator::AronContainerTypeNavigatorPtr, typenavigator::AronTypeNavigatorPtr>(desc, t)
                 {
                 }
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriter.cpp b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriter.cpp
index f13315860..84c0016cd 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriter.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriter.cpp
@@ -25,61 +25,61 @@
 
 namespace armarx
 {
-namespace aron
-{
-namespace io
-{
+    namespace aron
+    {
+        namespace io
+        {
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
     bool AronTypeNlohmannJSONWriter::writeStart##upperType##Type() \
-{ \
-    nlohmann::jsonPtr data = nlohmann::jsonPtr(new nlohmann::json()); \
-    AronTypeNlohmannJSONWriterTokenPtr new_token = AronTypeNlohmannJSONWriterTokenPtr(new AronTypeNlohmannJSONWriterToken(AronTypeDescriptor::eAron##upperType##Type, data)); \
-    stack.push(new_token); \
-    return true; \
-} \
-    bool AronTypeNlohmannJSONWriter::writeEnd##upperType##Type() \
-{ \
-    lastRemovedToken = stack.top(); \
-    stack.pop(); \
-    \
-    if (stack.size() > 0) \
     { \
-        AronTypeNlohmannJSONWriterTokenPtr prevToken = stack.top(); \
-        prevToken->addElement(lastRemovedToken->getElement()); \
+        nlohmann::json data; \
+        AronTypeNlohmannJSONWriterTokenPtr new_token = AronTypeNlohmannJSONWriterTokenPtr(new AronTypeNlohmannJSONWriterToken(AronTypeDescriptor::eAron##upperType##Type, data)); \
+        stack.push(new_token); \
+        return true; \
     } \
-    return true; \
-}
+    bool AronTypeNlohmannJSONWriter::writeEnd##upperType##Type() \
+    { \
+        lastRemovedToken = stack.top(); \
+        stack.pop(); \
+        \
+        if (stack.size() > 0) \
+        { \
+            AronTypeNlohmannJSONWriterTokenPtr prevToken = stack.top(); \
+            prevToken->addElement(lastRemovedToken->getElement()); \
+        } \
+        return true; \
+    }
 
-HANDLE_CONTAINER_TYPES
+            HANDLE_CONTAINER_TYPES
 #undef RUN_ARON_MACRO
 
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
     bool AronTypeNlohmannJSONWriter::write##upperType##Type(const std::vector<int>& dims, const std::string& t) \
-{ \
-    AronTypeNlohmannJSONWriterTokenPtr token = stack.top(); \
-    nlohmann::jsonPtr j = nlohmann::jsonPtr(new nlohmann::json()); \
-    (*j)["ARON_NDARRAY_DIMENSIONS"] = dims; \
-    (*j)["ARON_NDARRAY_TYPE"] = t; \
-    token->addElement(j); \
-    return true; \
-}
+    { \
+        AronTypeNlohmannJSONWriterTokenPtr token = stack.top(); \
+        nlohmann::json j; \
+        j["ARON_NDARRAY_DIMENSIONS"] = dims; \
+        j["ARON_NDARRAY_TYPE"] = t; \
+        token->addElement(j); \
+        return true; \
+    }
 
-HANDLE_COMPLEX_TYPES
+            HANDLE_COMPLEX_TYPES
 #undef RUN_ARON_MACRO
 
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
     bool AronTypeNlohmannJSONWriter::write##upperType##Type() \
-{ \
-    AronTypeNlohmannJSONWriterTokenPtr token = stack.top(); \
-    lowerType x = {}; \
-    nlohmann::jsonPtr j = nlohmann::jsonPtr(new nlohmann::json(x)); \
-    token->addElement(j); \
-    return true; \
-}
+    { \
+        AronTypeNlohmannJSONWriterTokenPtr token = stack.top(); \
+        lowerType x = {}; \
+        nlohmann::json j(x); \
+        token->addElement(j); \
+        return true; \
+    }
 
-HANDLE_PRIMITIVE_TYPES
+            HANDLE_PRIMITIVE_TYPES
 #undef RUN_ARON_MACRO
 
-}
-}
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriter.h b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriter.h
index 237b6fecf..8241d0c31 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriter.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriter.h
@@ -39,7 +39,7 @@ namespace armarx
         namespace io
         {
             class AronTypeNlohmannJSONWriter :
-                virtual public AronTypeClassWriter<nlohmann::jsonPtr, AronTypeNlohmannJSONWriterTokenPtr>
+                virtual public AronTypeClassWriter<nlohmann::json, AronTypeNlohmannJSONWriterTokenPtr>
             {
             public:
                 AronTypeNlohmannJSONWriter() = default;
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriterToken.h
index 88379e5f2..71c8d03a8 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/NlohmannJSONWriter/AronTypeNlohmannJSONWriterToken.h
@@ -33,12 +33,6 @@
 // ArmarX
 #include <RobotAPI/libraries/aron/aroncore/AronConfig.h>
 
-
-namespace nlohmann
-{
-    typedef std::shared_ptr<nlohmann::json> jsonPtr;
-}
-
 namespace armarx
 {
     namespace aron
@@ -49,7 +43,7 @@ namespace armarx
             typedef std::shared_ptr<AronTypeNlohmannJSONWriterToken> AronTypeNlohmannJSONWriterTokenPtr;
 
             class AronTypeNlohmannJSONWriterToken :
-                virtual public AronTypeClassWriterToken<nlohmann::jsonPtr>
+                virtual public AronTypeClassWriterToken<nlohmann::json, nlohmann::json>
             {
             public:
                 using PointerType = AronTypeNlohmannJSONWriterTokenPtr;
@@ -57,36 +51,36 @@ namespace armarx
             public:
                 // constructor
                 AronTypeNlohmannJSONWriterToken() = delete;
-                AronTypeNlohmannJSONWriterToken(const AronTypeDescriptor desc, const nlohmann::jsonPtr& t) :
-                    AronWriterToken<AronTypeDescriptor, nlohmann::jsonPtr>(desc, t),
-                    AronTypeClassWriterToken<nlohmann::jsonPtr>(desc, t)
+                AronTypeNlohmannJSONWriterToken(const AronTypeDescriptor desc, const nlohmann::json& t) :
+                    AronWriterToken<AronTypeDescriptor, nlohmann::json, nlohmann::json>(desc, t),
+                    AronTypeClassWriterToken<nlohmann::json, nlohmann::json>(desc, t)
                 {
                 }
 
                 // virtual member functions
-                virtual void addElement(const nlohmann::jsonPtr& n) override
+                virtual void addElement(const nlohmann::json& n) override
                 {
                     auto desc = getDescriptor();
                     switch (desc)
                     {
                         case eAronDictType:
                         {
-                            (*getElement())["ARON_DICT_ACCEPTED_TYPE"] = (*n);
+                            element["ARON_DICT_ACCEPTED_TYPE"] = n;
                             break;
                         }
                         case eAronListType:
                         {
-                            (*getElement())["ARON_LIST_ACCEPTED_TYPE"] = (*n);
+                            element["ARON_LIST_ACCEPTED_TYPE"] = n;
                             break;
                         }
                         case eAronObjectType:
                         {
-                            (*getElement())[currentKey] = (*n);
+                            element[currentKey] = n;
                             break;
                         }
                         case eAronTupleType:
                         {
-                            (*getElement()).push_back(*n);
+                            element.push_back(n);
                             break;
                         }
                         default:
@@ -103,7 +97,7 @@ namespace armarx
                     {
                         throw exception::AronTypeDescriptorNotValidException("AronTypeNlohmannJSONWriterToken", "setName", "Cant set the name of a non-object token.", desc);
                     }
-                    (*getElement())["OBJECT_NAME"] = n;
+                    element["OBJECT_NAME"] = n;
                 }
             };
         }
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/RapidXMLWriter/AronTypeRapidXMLWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/RapidXMLWriter/AronTypeRapidXMLWriterToken.h
index fd2b4398f..c33498ad8 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/RapidXMLWriter/AronTypeRapidXMLWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronTypeIO/classWriters/RapidXMLWriter/AronTypeRapidXMLWriterToken.h
@@ -36,8 +36,6 @@
 
 namespace armarx
 {
-    typedef std::shared_ptr<RapidXmlReaderNode> RapidXmlReaderNodePtr;
-
     namespace aron
     {
         namespace io
@@ -46,7 +44,7 @@ namespace armarx
             typedef std::shared_ptr<AronTypeRapidXMLWriterToken> AronTypeRapidXMLWriterTokenPtr;
 
             class AronTypeRapidXMLWriterToken :
-                virtual public AronTypeClassWriterToken<RapidXmlReaderNodePtr>
+                virtual public AronTypeClassWriterToken<RapidXmlReaderNode, RapidXmlReaderNode>
             {
             public:
                 using PointerType = AronTypeRapidXMLWriterTokenPtr;
@@ -54,14 +52,14 @@ namespace armarx
             public:
                 // constructor
                 AronTypeRapidXMLWriterToken() = delete;
-                AronTypeRapidXMLWriterToken(const AronTypeDescriptor desc, const RapidXmlReaderNodePtr& t) :
-                    AronWriterToken<AronTypeDescriptor, RapidXmlReaderNodePtr>(desc, t),
-                    AronTypeClassWriterToken<RapidXmlReaderNodePtr>(desc, t)
+                AronTypeRapidXMLWriterToken(const AronTypeDescriptor desc, const RapidXmlReaderNode& t) :
+                    AronWriterToken<AronTypeDescriptor, RapidXmlReaderNode, RapidXmlReaderNode>(desc, t),
+                    AronTypeClassWriterToken<RapidXmlReaderNode, RapidXmlReaderNode>(desc, t)
                 {
                 }
 
                 // virtual member functions
-                virtual void addElement(const RapidXmlReaderNodePtr& n) override
+                virtual void addElement(const RapidXmlReaderNode& n) override
                 {
                     auto desc = getDescriptor();
                     switch (desc)
@@ -88,7 +86,7 @@ namespace armarx
                 }
 
                 // name functions
-                void setName(const std::string& n)
+                void setName(const std::string& n) override
                 {
                     auto desc = getDescriptor();
                     if (desc != AronTypeDescriptor::eAronObjectType)
diff --git a/source/RobotAPI/libraries/aron/aroncore/io/AronWriterToken.h b/source/RobotAPI/libraries/aron/aroncore/io/AronWriterToken.h
index 9bda546c9..f2621ee03 100644
--- a/source/RobotAPI/libraries/aron/aroncore/io/AronWriterToken.h
+++ b/source/RobotAPI/libraries/aron/aroncore/io/AronWriterToken.h
@@ -38,13 +38,13 @@ namespace armarx
     {
         namespace io
         {
-            template<typename AronDescriptorTypename, typename ElementTypename>
+            template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename>
             class AronWriterToken;
 
-            template<typename AronDescriptorTypename, typename ElementTypename>
-            using AronWriterTokenPtr = std::shared_ptr<AronWriterToken<AronDescriptorTypename, ElementTypename>> ;
+            template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename>
+            using AronWriterTokenPtr = std::shared_ptr<AronWriterToken<AronDescriptorTypename, ElementTypename, ElementAddTypename>> ;
 
-            template<typename AronDescriptorTypename, typename ElementTypename>
+            template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename>
             class AronWriterToken
             {
             public:
@@ -55,7 +55,7 @@ namespace armarx
                 };
 
                 // virtual definitions
-                virtual void addElement(const ElementTypename&) = 0;
+                virtual void addElement(const ElementAddTypename&) = 0;
                 virtual std::string toElementAccessor() const = 0;
 
                 void setCurrentKey(const std::string& s)
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h
index 08f001f7e..93347c1e8 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h
@@ -96,12 +96,10 @@ namespace armarx
             public:
                 using PointerType = AronContainerDataNavigatorPtr;
 
-                // constructors
-                AronContainerDataNavigator() =  delete;
-                AronContainerDataNavigator(const AronDataDescriptor& d, const AronPath& p = AronPath()) :
-                    AronDataNavigator(d, p)
+                static AronContainerDataNavigatorPtr DynamicCast(const AronDataNavigatorPtr& n)
                 {
-
+                    AronContainerDataNavigatorPtr casted = std::dynamic_pointer_cast<AronContainerDataNavigator>(n);
+                    return casted;
                 }
             };
 
@@ -114,12 +112,10 @@ namespace armarx
             public:
                 using PointerType = AronComplexDataNavigatorPtr;
 
-                // constructors
-                AronComplexDataNavigator() =  delete;
-                AronComplexDataNavigator(const AronDataDescriptor& d, const AronPath& p = AronPath()) :
-                    AronDataNavigator(d, p)
+                static AronComplexDataNavigatorPtr DynamicCast(const AronDataNavigatorPtr& n)
                 {
-
+                    AronComplexDataNavigatorPtr casted = std::dynamic_pointer_cast<AronComplexDataNavigator>(n);
+                    return casted;
                 }
             };
 
@@ -132,12 +128,10 @@ namespace armarx
             public:
                 using PointerType = AronPrimitiveDataNavigatorPtr;
 
-                // constructors
-                AronPrimitiveDataNavigator() =  delete;
-                AronPrimitiveDataNavigator(const AronDataDescriptor& d, const AronPath& p = AronPath()) :
-                    AronDataNavigator(d, p)
+                static AronPrimitiveDataNavigatorPtr DynamicCast(const AronDataNavigatorPtr& n)
                 {
-
+                    AronPrimitiveDataNavigatorPtr casted = std::dynamic_pointer_cast<AronPrimitiveDataNavigator>(n);
+                    return casted;
                 }
             };
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.cpp
index 43f756bba..5fb9ab6b2 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.cpp
@@ -37,10 +37,16 @@ namespace armarx
         {
 
             // constructors
+            AronDictDataNavigator::AronDictDataNavigator(const AronPath& path) :
+                AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronDict, path),
+                AronDataNavigator(AronDataDescriptor::eAronDict, path),
+                aron(new data::AronDict())
+            {
+            }
+
             AronDictDataNavigator::AronDictDataNavigator(const data::AronDictPtr& o, const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronDict, path),
                 AronDataNavigator(AronDataDescriptor::eAronDict, path),
-                AronContainerDataNavigator(AronDataDescriptor::eAronDict, path),
                 aron(o)
             {
                 CheckAronPtrForNull("AronDictDataNavigator", "AronDictDataNavigator", getPath(), aron);
@@ -51,14 +57,20 @@ namespace armarx
                 }
             }
 
-            AronDictDataNavigator::AronDictDataNavigator(const AronPath& path) :
-                AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronDict, path),
-                AronDataNavigator(AronDataDescriptor::eAronDict, path),
-                AronContainerDataNavigator(AronDataDescriptor::eAronDict, path),
-                aron(new data::AronDict())
+            AronDictDataNavigator::AronDictDataNavigator(const data::AronDataDict& d, const AronPath& path) :
+                AronDictDataNavigator(data::AronDictPtr(new data::AronDict(d)), path)
             {
             }
 
+            AronDictDataNavigator::AronDictDataNavigator(const std::map<std::string, AronDataNavigatorPtr>& m, const AronPath& path) :
+                AronDictDataNavigator(path)
+            {
+                for (const auto& [key, dataPtr] : m)
+                {
+                    addElement(key, dataPtr);
+                }
+            }
+
             // static methods
             AronDictDataNavigatorPtr AronDictDataNavigator::DynamicCast(const AronDataNavigatorPtr& n)
             {
@@ -98,10 +110,26 @@ namespace armarx
                 return it->second;
             }
 
+            std::map<std::string, AronDataNavigatorPtr> AronDictDataNavigator::getElements() const
+            {
+                return childrenNavigators;
+            }
+
+            void AronDictDataNavigator::clear()
+            {
+                childrenNavigators.clear();
+                aron->elements.clear();
+            }
+
+            data::AronDictPtr AronDictDataNavigator::getCastedResult() const
+            {
+                return aron;
+            }
+
             // virtual implementations
             data::AronDataPtr AronDictDataNavigator::getResult() const
             {
-                return aron;
+                return getCastedResult();
             }
 
             std::string AronDictDataNavigator::getName() const
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h
index 287718efe..5f23aa515 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h
@@ -51,6 +51,8 @@ namespace armarx
                 // constructors
                 AronDictDataNavigator(const AronPath& path = AronPath());
                 AronDictDataNavigator(const data::AronDictPtr&, const AronPath& path = AronPath());
+                AronDictDataNavigator(const data::AronDataDict&, const AronPath& path = AronPath());
+                AronDictDataNavigator(const std::map<std::string, AronDataNavigatorPtr>&, const AronPath& path = AronPath());
 
                 // static methods
                 static AronDictDataNavigatorPtr DynamicCast(const AronDataNavigatorPtr& n);
@@ -59,6 +61,10 @@ namespace armarx
                 std::vector<std::string> getAllKeys() const;
                 void addElement(const std::string& key, const AronDataNavigatorPtr&);
                 AronDataNavigatorPtr getElement(const std::string&) const;
+                std::map<std::string, AronDataNavigatorPtr> getElements() const;
+                void clear();
+
+                data::AronDictPtr getCastedResult() const;
 
                 // virtual implementations
                 virtual data::AronDataPtr getResult() const override;
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.cpp
index 63e084008..4db8327fe 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.cpp
@@ -36,10 +36,16 @@ namespace armarx
         namespace datanavigator
         {
             // constructors
+            AronListDataNavigator::AronListDataNavigator(const AronPath& path) :
+                AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronList, path),
+                AronDataNavigator(AronDataDescriptor::eAronList, path),
+                aron(new data::AronList())
+            {
+            }
+
             AronListDataNavigator::AronListDataNavigator(const data::AronListPtr& l, const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronList, path),
                 AronDataNavigator(AronDataDescriptor::eAronList, path),
-                AronContainerDataNavigator(AronDataDescriptor::eAronList, path),
                 aron(l)
             {
                 CheckAronPtrForNull("AronListDataNavigator", "AronListDataNavigator", getPath(), aron);
@@ -51,12 +57,18 @@ namespace armarx
                 }
             }
 
-            AronListDataNavigator::AronListDataNavigator(const AronPath& path) :
-                AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronList, path),
-                AronDataNavigator(AronDataDescriptor::eAronList, path),
-                AronContainerDataNavigator(AronDataDescriptor::eAronList, path),
-                aron(new data::AronList())
+            AronListDataNavigator::AronListDataNavigator(const data::AronDataList& d, const AronPath& path) :
+                AronListDataNavigator(data::AronListPtr(new data::AronList(d)), path)
+            {
+            }
+
+            AronListDataNavigator::AronListDataNavigator(const std::vector<AronDataNavigatorPtr>& n, const AronPath& path) :
+                AronListDataNavigator(path)
             {
+                for (const auto& dataPtr : n)
+                {
+                    addElement(dataPtr);
+                }
             }
 
             // static methods
@@ -82,10 +94,26 @@ namespace armarx
                 return childrenNavigators[i];
             }
 
+            std::vector<AronDataNavigatorPtr> AronListDataNavigator::getElements() const
+            {
+                return childrenNavigators;
+            }
+
+            void AronListDataNavigator::clear()
+            {
+                childrenNavigators.clear();
+                aron->elements.clear();
+            }
+
+            data::AronListPtr AronListDataNavigator::getCastedResult() const
+            {
+                return aron;
+            }
+
             // virtual implementations
             data::AronDataPtr AronListDataNavigator::getResult() const
             {
-                return aron;
+                return getCastedResult();
             }
 
             std::string AronListDataNavigator::getName() const
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.h
index 2a7ea718f..03151c2cf 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.h
@@ -50,6 +50,8 @@ namespace armarx
                 // constructors
                 AronListDataNavigator(const AronPath& path = AronPath());
                 AronListDataNavigator(const data::AronListPtr&, const AronPath& path = AronPath());
+                AronListDataNavigator(const data::AronDataList&, const AronPath& path = AronPath());
+                AronListDataNavigator(const std::vector<AronDataNavigatorPtr>&, const AronPath& path = AronPath());
 
                 // static methods
                 static AronListDataNavigatorPtr DynamicCast(const AronDataNavigatorPtr& n);
@@ -57,6 +59,10 @@ namespace armarx
                 // public member functions
                 void addElement(const AronDataNavigatorPtr&);
                 AronDataNavigatorPtr getElement(unsigned int) const;
+                std::vector<AronDataNavigatorPtr> getElements() const;
+                void clear();
+
+                data::AronListPtr getCastedResult() const;
 
                 // virtual implementations
                 virtual data::AronDataPtr getResult() const override;
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.cpp
index 5c748218f..13ef492d7 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.cpp
@@ -39,22 +39,27 @@ namespace armarx
         namespace datanavigator
         {
             // constructors
-            AronNDArrayDataNavigator::AronNDArrayDataNavigator(const data::AronNDArrayPtr& o, const AronPath& path) :
+            AronNDArrayDataNavigator::AronNDArrayDataNavigator(const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronNDArray, path),
                 AronDataNavigator(AronDataDescriptor::eAronNDArray, path),
-                AronComplexDataNavigator(AronDataDescriptor::eAronNDArray, path),
-                aron(o)
+                aron(new data::AronNDArray())
             {
-                CheckAronPtrForNull("AronNDArrayDataNavigator", "AronNDArrayDataNavigator", getPath(), aron);
+
             }
 
-            AronNDArrayDataNavigator::AronNDArrayDataNavigator(const AronPath& path) :
+            AronNDArrayDataNavigator::AronNDArrayDataNavigator(const data::AronNDArrayPtr& o, const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronNDArray, path),
                 AronDataNavigator(AronDataDescriptor::eAronNDArray, path),
-                AronComplexDataNavigator(AronDataDescriptor::eAronNDArray, path),
-                aron(new data::AronNDArray())
+                aron(o)
             {
+                CheckAronPtrForNull("AronNDArrayDataNavigator", "AronNDArrayDataNavigator", getPath(), aron);
+            }
+
 
+
+            AronNDArrayDataNavigator::AronNDArrayDataNavigator(const std::vector<int>& dim, const std::string& t, const std::vector<unsigned char>& data, const AronPath& path) :
+                AronNDArrayDataNavigator(data::AronNDArrayPtr(new data::AronNDArray(dim, t, data)), path)
+            {
             }
 
             // static methods
@@ -106,10 +111,15 @@ namespace armarx
                 aron->type = t;
             }
 
+            data::AronNDArrayPtr AronNDArrayDataNavigator::getCastedResult() const
+            {
+                return aron;
+            }
+
             // virtual implementations
             data::AronDataPtr AronNDArrayDataNavigator::getResult() const
             {
-                return aron;
+                return getCastedResult();
             }
 
             std::string AronNDArrayDataNavigator::getName() const
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.h
index 3a32dd987..b5182d9d3 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.h
@@ -50,6 +50,7 @@ namespace armarx
                 // constructors
                 AronNDArrayDataNavigator(const AronPath& path = AronPath());
                 AronNDArrayDataNavigator(const data::AronNDArrayPtr&, const AronPath& path = AronPath());
+                AronNDArrayDataNavigator(const std::vector<int>&, const std::string&, const std::vector<unsigned char>&, const AronPath& path = AronPath());
 
                 // static methods
                 static AronNDArrayDataNavigatorPtr DynamicCast(const AronDataNavigatorPtr& n);
@@ -65,6 +66,8 @@ namespace armarx
                 std::string getType() const;
                 void setType(const std::string&);
 
+                data::AronNDArrayPtr getCastedResult() const;
+
                 // virtual implementations
                 virtual data::AronDataPtr getResult() const override;
                 virtual std::string getName() const override;
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.cpp
index a1c14461a..7a2e1f755 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.cpp
@@ -35,22 +35,25 @@ namespace armarx
         {
 #define RUN_ARON_MACRO(upperType, lowerType, capsType) \
     /* constructors */ \
-    Aron##upperType##DataNavigator::Aron##upperType##DataNavigator(const AronPath& path) : \
+    Aron##upperType##DataNavigator::Aron##upperType##DataNavigator(const data::Aron##upperType##Ptr& o, const AronPath& path) : \
         AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAron##upperType, path), \
         AronDataNavigator(AronDataDescriptor::eAron##upperType, path), \
-        AronPrimitiveDataNavigator(AronDataDescriptor::eAron##upperType, path), \
-        aron(new data::Aron##upperType()) \
+        aron(o) \
     { \
-        aron->value = {}; \
     } \
-    Aron##upperType##DataNavigator::Aron##upperType##DataNavigator(const data::Aron##upperType##Ptr& o, const AronPath& path) : \
+    \
+    Aron##upperType##DataNavigator::Aron##upperType##DataNavigator(const AronPath& path) : \
         AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAron##upperType, path), \
         AronDataNavigator(AronDataDescriptor::eAron##upperType, path), \
-        AronPrimitiveDataNavigator(AronDataDescriptor::eAron##upperType, path), \
-        aron(o) \
+        aron(new data::Aron##upperType()) \
     { \
+        aron->value = {}; \
     } \
     \
+    Aron##upperType##DataNavigator::Aron##upperType##DataNavigator(const lowerType& d, const AronPath& path) : \
+        Aron##upperType##DataNavigator(data::Aron##upperType##Ptr(new data::Aron##upperType(d)), path) \
+    { \
+    } \
     /* static methods */ \
     Aron##upperType##DataNavigatorPtr Aron##upperType##DataNavigator::DynamicCast(const AronDataNavigatorPtr& n) \
     { \
@@ -69,10 +72,15 @@ namespace armarx
         return aron->value; \
     } \
     \
+    data::Aron##upperType##Ptr Aron##upperType##DataNavigator::getCastedResult() const \
+    { \
+        return aron; \
+    } \
+    \
     /* virtual implementations */ \
     data::AronDataPtr Aron##upperType##DataNavigator::getResult() const \
     { \
-        return aron; \
+        return getCastedResult(); \
     } \
     \
     std::string Aron##upperType##DataNavigator::getName() const \
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.h
index 2dc5f7a58..8a0ee59da 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.h
@@ -50,6 +50,7 @@ namespace armarx
         /* constructors */ \
         Aron##upperType##DataNavigator(const AronPath& = AronPath()); \
         Aron##upperType##DataNavigator(const data::Aron##upperType##Ptr&, const AronPath& = AronPath()); \
+        Aron##upperType##DataNavigator(const lowerType&, const AronPath& = AronPath()); \
         \
         /* static methods */ \
         static Aron##upperType##DataNavigatorPtr DynamicCast(const AronDataNavigatorPtr& n); \
@@ -58,6 +59,8 @@ namespace armarx
         void setValue(const lowerType& x); \
         lowerType getValue() const; \
         \
+        data::Aron##upperType##Ptr getCastedResult() const; \
+        \
         /* virtual implementations */ \
         virtual data::AronDataPtr getResult() const override; \
         virtual std::string getName() const override; \
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronDictTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronDictTypeNavigator.cpp
index 3b8fa8469..9d1ba674f 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronDictTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronDictTypeNavigator.cpp
@@ -35,7 +35,6 @@ namespace armarx
             AronDictTypeNavigator::AronDictTypeNavigator(const AronPath& path) :
                 AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronDictType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronDictType, path),
-                AronDictSerializerTypeNavigator(AronTypeDescriptor::eAronDictType, path),
                 type(new type::AronDictType())
             {
 
@@ -44,7 +43,6 @@ namespace armarx
             AronDictTypeNavigator::AronDictTypeNavigator(const type::AronDictTypePtr& o, const AronPath& path) :
                 AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronDictType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronDictType, path),
-                AronDictSerializerTypeNavigator(AronTypeDescriptor::eAronDictType, path),
                 type(o)
             {
                 CheckAronPtrForNull("AronDictTypeNavigator", "AronDictTypeNavigator", getPath(), o);
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronDictTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronDictTypeNavigator.h
index 1b73f1537..b633eab3b 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronDictTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronDictTypeNavigator.h
@@ -51,6 +51,8 @@ namespace armarx
                 AronDictTypeNavigator(const AronPath& path);
                 AronDictTypeNavigator(const type::AronDictTypePtr&, const AronPath& path);
 
+                type::AronDictTypePtr getCastedResult() const;
+
                 // static methods
                 static AronDictTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n);
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronEigenMatrixTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronEigenMatrixTypeNavigator.cpp
index 4aa1aa03a..d26786cd2 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronEigenMatrixTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronEigenMatrixTypeNavigator.cpp
@@ -45,7 +45,6 @@ namespace armarx
             AronEigenMatrixTypeNavigator::AronEigenMatrixTypeNavigator(const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
-                AronNDArraySerializerTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 type(new type::AronEigenMatrixType({1, 1}, ""))
             {
             }
@@ -53,7 +52,6 @@ namespace armarx
             AronEigenMatrixTypeNavigator::AronEigenMatrixTypeNavigator(const type::AronEigenMatrixTypePtr& o, const AronPath& path) :
                 AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronDictType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
-                AronNDArraySerializerTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 type(o)
             {
                 CheckAronPtrForNull("AronEigenMatrixTypeNavigator", "AronEigenMatrixTypeNavigator", getPath(), o);
@@ -91,6 +89,26 @@ namespace armarx
                 type->dimensions[1] = h;
             }
 
+            type::AronEigenMatrixTypePtr AronEigenMatrixTypeNavigator::getCastedResult() const
+            {
+                if (type->dimensions.empty())
+                {
+                    throw exception::AronExceptionWithPathInfo("AronEigenMatrixTypeNavigator", "getCastedResult", "The dimension eigen matrix is empty", getPath());
+                }
+                if (std::any_of(type->dimensions.begin(), type->dimensions.end(), [](int i)
+            {
+                return i < -1;
+            }))
+                {
+                    throw exception::AronExceptionWithPathInfo("AronEigenMatrixTypeNavigator", "getCastedResult", "The dimension size is wrong. At least one empty is <-1", getPath());
+                }
+                if (type->typeName.empty())
+                {
+                    throw exception::AronExceptionWithPathInfo("AronEigenMatrixTypeNavigator", "getCastedResult", "The useType of eigen matrix is empty.", getPath());
+                }
+                return type;
+            }
+
             std::string AronEigenMatrixTypeNavigator::getUsedType() const
             {
                 return type->typeName;
@@ -147,22 +165,7 @@ namespace armarx
             // virtual implementations
             type::AronTypePtr AronEigenMatrixTypeNavigator::getResult() const
             {
-                if (type->dimensions.empty())
-                {
-                    throw exception::AronExceptionWithPathInfo("AronEigenMatrixTypeNavigator", "getResult", "The dimension eigen matrix is empty", getPath());
-                }
-                if (std::any_of(type->dimensions.begin(), type->dimensions.end(), [](int i)
-            {
-                return i < -1;
-            }))
-                {
-                    throw exception::AronExceptionWithPathInfo("AronEigenMatrixTypeNavigator", "getResult", "The dimension size is wrong. At least one empty is <-1", getPath());
-                }
-                if (type->typeName.empty())
-                {
-                    throw exception::AronExceptionWithPathInfo("AronEigenMatrixTypeNavigator", "getResult", "The useType of eigen matrix is empty.", getPath());
-                }
-                return type;
+                return getCastedResult();
             }
 
             std::string AronEigenMatrixTypeNavigator::getName() const
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronEigenMatrixTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronEigenMatrixTypeNavigator.h
index f5d2761b1..14a24b998 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronEigenMatrixTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronEigenMatrixTypeNavigator.h
@@ -58,6 +58,8 @@ namespace armarx
                 void setRows(const unsigned int&);
                 void setCols(const unsigned int&);
 
+                type::AronEigenMatrixTypePtr getCastedResult() const;
+
                 // static methods
                 static AronEigenMatrixTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n);
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronIVTCByteImageTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronIVTCByteImageTypeNavigator.cpp
index b7b867ebe..49670a0c2 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronIVTCByteImageTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronIVTCByteImageTypeNavigator.cpp
@@ -41,7 +41,6 @@ namespace armarx
             AronIVTCByteImageTypeNavigator::AronIVTCByteImageTypeNavigator(const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronIVTCByteImageType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronIVTCByteImageType, path),
-                AronNDArraySerializerTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 type(new type::AronIVTCByteImageType({0, 0}, ""))
             {
             }
@@ -49,7 +48,6 @@ namespace armarx
             AronIVTCByteImageTypeNavigator::AronIVTCByteImageTypeNavigator(const type::AronIVTCByteImageTypePtr& o, const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronIVTCByteImageType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronIVTCByteImageType, path),
-                AronNDArraySerializerTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 type(o)
             {
                 CheckAronPtrForNull("AronIVTCByteImageTypeNavigator", "AronIVTCByteImageTypeNavigator", getPath(), o);
@@ -59,6 +57,26 @@ namespace armarx
                 }
             }
 
+            type::AronIVTCByteImageTypePtr AronIVTCByteImageTypeNavigator::getCastedResult() const
+            {
+                if (type->dimensions.size() != 2)
+                {
+                    throw exception::AronExceptionWithPathInfo("AronIVTCByteImageTypeNavigator", "getCastedResult", "The dimension size is wrong. Got size: " + std::to_string(type->dimensions.size()), getPath());
+                }
+                if (std::any_of(type->dimensions.begin(), type->dimensions.end(), [](int i)
+            {
+                return i <= 0;
+            }))
+                {
+                    throw exception::AronExceptionWithPathInfo("AronIVTCByteImageTypeNavigator", "getCastedResult", "The dimension size is wrong. At least one empty is <=0", getPath());
+                }
+                if (type->typeName.empty())
+                {
+                    throw exception::AronExceptionWithPathInfo("AronIVTCByteImageTypeNavigator", "getCastedResult", "The useType of image is empty.", getPath());
+                }
+                return type;
+            }
+
             std::vector<int> AronIVTCByteImageTypeNavigator::getDimensions() const
             {
                 return type->dimensions;
@@ -137,22 +155,7 @@ namespace armarx
             // virtual implementations
             type::AronTypePtr AronIVTCByteImageTypeNavigator::getResult() const
             {
-                if (type->dimensions.size() != 2)
-                {
-                    throw exception::AronExceptionWithPathInfo("AronIVTCByteImageTypeNavigator", "getResult", "The dimension size is wrong. Got size: " + std::to_string(type->dimensions.size()), getPath());
-                }
-                if (std::any_of(type->dimensions.begin(), type->dimensions.end(), [](int i)
-            {
-                return i <= 0;
-            }))
-                {
-                    throw exception::AronExceptionWithPathInfo("AronIVTCByteImageTypeNavigator", "getResult", "The dimension size is wrong. At least one empty is <=0", getPath());
-                }
-                if (type->typeName.empty())
-                {
-                    throw exception::AronExceptionWithPathInfo("AronIVTCByteImageTypeNavigator", "getResult", "The useType of image is empty.", getPath());
-                }
-                return type;
+                return getCastedResult();
             }
 
             std::string AronIVTCByteImageTypeNavigator::getName() const
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronIVTCByteImageTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronIVTCByteImageTypeNavigator.h
index 6a61e9f05..9d1ba206d 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronIVTCByteImageTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronIVTCByteImageTypeNavigator.h
@@ -58,6 +58,8 @@ namespace armarx
                 void setWidth(const unsigned int&);
                 void setHeight(const unsigned int&);
 
+                type::AronIVTCByteImageTypePtr getCastedResult() const;
+
                 // static methods
                 static AronIVTCByteImageTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n);
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronListTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronListTypeNavigator.cpp
index 2a1c787a4..34a31e435 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronListTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronListTypeNavigator.cpp
@@ -34,7 +34,6 @@ namespace armarx
             AronListTypeNavigator::AronListTypeNavigator(const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronListType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronListType, path),
-                AronListSerializerTypeNavigator(AronTypeDescriptor::eAronListType, path),
                 type(new type::AronListType())
             {
             }
@@ -42,12 +41,37 @@ namespace armarx
             AronListTypeNavigator::AronListTypeNavigator(const type::AronListTypePtr& o, const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronListType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronListType, path),
-                AronListSerializerTypeNavigator(AronTypeDescriptor::eAronListType, path),
                 type(o)
             {
                 CheckAronPtrForNull("AronListTypeNavigator", "AronListTypeNavigator", getPath(), o);
             }
 
+            // static methods
+            AronListTypeNavigatorPtr AronListTypeNavigator::DynamicCast(const AronTypeNavigatorPtr& n)
+            {
+                CheckTypeNavigatorPtrForNull("AronListTypeNavigator", "DynamicCast[Before]", n);
+                AronListTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronListTypeNavigator>(n);
+                CheckTypeNavigatorPtrForNull("AronListTypeNavigator", "DynamicCast[After]", casted);
+                return casted;
+            }
+
+            type::AronListTypePtr AronListTypeNavigator::getCastedResult() const
+            {
+                CheckAronPtrForNull("AronListTypeNavigator", "getCastedResult", getPath(), type->acceptedType);
+                return type;
+            }
+
+            // virtual implementations
+            type::AronTypePtr AronListTypeNavigator::getResult() const
+            {
+                return getCastedResult();
+            }
+
+            std::string AronListTypeNavigator::getName() const
+            {
+                return "AronListType<" + acceptedTypeNavigator->getName() + ">";
+            }
+
             void AronListTypeNavigator::addAcceptedType(const AronTypeNavigatorPtr&)
             {
                 throw exception::AronExceptionWithPathInfo("AronListTypeNavigator", "addAcceptedType", "Called invalid function!", getPath());
@@ -69,27 +93,6 @@ namespace armarx
                 type->acceptedType = a->getResult();
                 acceptedTypeNavigator = a;
             }
-
-            // static methods
-            AronListTypeNavigatorPtr AronListTypeNavigator::DynamicCast(const AronTypeNavigatorPtr& n)
-            {
-                CheckTypeNavigatorPtrForNull("AronListTypeNavigator", "DynamicCast[Before]", n);
-                AronListTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronListTypeNavigator>(n);
-                CheckTypeNavigatorPtrForNull("AronListTypeNavigator", "DynamicCast[After]", casted);
-                return casted;
-            }
-
-            // virtual implementations
-            type::AronTypePtr AronListTypeNavigator::getResult() const
-            {
-                CheckAronPtrForNull("AronListTypeNavigator", "getResult", getPath(), type->acceptedType);
-                return type;
-            }
-
-            std::string AronListTypeNavigator::getName() const
-            {
-                return "AronListType<" + acceptedTypeNavigator->getName() + ">";
-            }
         }
     }
 }
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronListTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronListTypeNavigator.h
index 405107ff1..3982291ff 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronListTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronListTypeNavigator.h
@@ -51,6 +51,8 @@ namespace armarx
                 AronListTypeNavigator(const AronPath& path);
                 AronListTypeNavigator(const type::AronListTypePtr&, const AronPath& path);
 
+                type::AronListTypePtr getCastedResult() const;
+
                 // static methods
                 static AronListTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n);
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.cpp
index 13903d9e2..01b87e9f7 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.cpp
@@ -36,7 +36,6 @@ namespace armarx
             AronObjectTypeNavigator::AronObjectTypeNavigator(const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronObjectType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronObjectType, path),
-                AronDictSerializerTypeNavigator(AronTypeDescriptor::eAronObjectType, path),
                 type((new type::AronObjectType()))
             {
             }
@@ -44,7 +43,6 @@ namespace armarx
             AronObjectTypeNavigator::AronObjectTypeNavigator(const type::AronObjectTypePtr& o, const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronObjectType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronObjectType, path),
-                AronDictSerializerTypeNavigator(AronTypeDescriptor::eAronObjectType, path),
                 type(o)
             {
                 CheckAronPtrForNull("AronObjectTypeNavigator", "AronObjectTypeNavigator", getPath(), o);
@@ -55,7 +53,7 @@ namespace armarx
             {
                 CheckTypeNavigatorPtrForNull("AronObjectTypeNavigator", "DynamicCast[Before]", n);
                 AronObjectTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronObjectTypeNavigator>(n);
-                CheckTypeNavigatorPtrForNull("AronObjectTypeNavigator", "DynamicCast[After]", casted);
+                CheckTypeNavigatorPtrForNull("AronObjectTypeNavigator", "DynamicCast[After]", n->getPath(), casted);
                 return casted;
             }
 
@@ -110,8 +108,7 @@ namespace armarx
                 return extends;
             }
 
-            // virtual implementations
-            type::AronTypePtr AronObjectTypeNavigator::getResult() const
+            type::AronObjectTypePtr AronObjectTypeNavigator::getCastedResult() const
             {
                 if (type->objectName.empty())
                 {
@@ -124,6 +121,12 @@ namespace armarx
                 return type;
             }
 
+            // virtual implementations
+            type::AronTypePtr AronObjectTypeNavigator::getResult() const
+            {
+                return getCastedResult();
+            }
+
             std::string AronObjectTypeNavigator::getName() const
             {
                 return "AronObjectType<" + type->objectName + ">";
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.h
index 01cedad2f..e1fdc5ed2 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.h
@@ -60,6 +60,8 @@ namespace armarx
                 void setObjectName(const std::string&);
                 void setExtends(const AronObjectTypeNavigatorPtr&);
 
+                type::AronObjectTypePtr getCastedResult() const;
+
                 // static methods
                 static AronObjectTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n);
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronOpenCVMatTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronOpenCVMatTypeNavigator.cpp
index 75a0e9670..c165e101a 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronOpenCVMatTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronOpenCVMatTypeNavigator.cpp
@@ -45,7 +45,6 @@ namespace armarx
             AronOpenCVMatTypeNavigator::AronOpenCVMatTypeNavigator(const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronOpenCVMatType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronOpenCVMatType, path),
-                AronNDArraySerializerTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 type(new type::AronOpenCVMatType({}, ""))
             {
             }
@@ -53,12 +52,31 @@ namespace armarx
             AronOpenCVMatTypeNavigator::AronOpenCVMatTypeNavigator(const type::AronOpenCVMatTypePtr& o, const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronOpenCVMatType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronOpenCVMatType, path),
-                AronNDArraySerializerTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 type(o)
             {
                 CheckAronPtrForNull("AronOpenCVMatTypeNavigator", "AronOpenCVMatTypeNavigator", getPath(), o);
             }
 
+            type::AronOpenCVMatTypePtr AronOpenCVMatTypeNavigator::getCastedResult() const
+            {
+                if (type->dimensions.empty())
+                {
+                    throw exception::AronExceptionWithPathInfo("AronOpenCVMatTypeNavigator", "getCastedResult", "The dimension size is empty", getPath());
+                }
+                if (std::any_of(type->dimensions.begin(), type->dimensions.end(), [](int i)
+            {
+                return i < -1;
+            }))
+                {
+                    throw exception::AronExceptionWithPathInfo("AronOpenCVMatTypeNavigator", "getCastedResult", "The dimension size is wrong. At least one empty is <-1", getPath());
+                }
+                if (type->typeName.empty())
+                {
+                    throw exception::AronExceptionWithPathInfo("AronOpenCVMatTypeNavigator", "getCastedResult", "The useType of image is empty.", getPath());
+                }
+                return type;
+            }
+
             std::string AronOpenCVMatTypeNavigator::getUsedType() const
             {
                 return type->typeName;
@@ -116,22 +134,7 @@ namespace armarx
             // virtual implementations
             type::AronTypePtr AronOpenCVMatTypeNavigator::getResult() const
             {
-                if (type->dimensions.empty())
-                {
-                    throw exception::AronExceptionWithPathInfo("AronOpenCVMatTypeNavigator", "getResult", "The dimension size is empty", getPath());
-                }
-                if (std::any_of(type->dimensions.begin(), type->dimensions.end(), [](int i)
-            {
-                return i < -1;
-            }))
-                {
-                    throw exception::AronExceptionWithPathInfo("AronOpenCVMatTypeNavigator", "getResult", "The dimension size is wrong. At least one empty is <-1", getPath());
-                }
-                if (type->typeName.empty())
-                {
-                    throw exception::AronExceptionWithPathInfo("AronOpenCVMatTypeNavigator", "getResult", "The useType of image is empty.", getPath());
-                }
-                return type;
+                return getCastedResult();
             }
 
             std::string AronOpenCVMatTypeNavigator::getName() const
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronOpenCVMatTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronOpenCVMatTypeNavigator.h
index e7972a202..2af188f76 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronOpenCVMatTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronOpenCVMatTypeNavigator.h
@@ -52,6 +52,8 @@ namespace armarx
                 AronOpenCVMatTypeNavigator(const AronPath& path);
                 AronOpenCVMatTypeNavigator(const type::AronOpenCVMatTypePtr&, const AronPath& path);
 
+                type::AronOpenCVMatTypePtr getCastedResult() const;
+
                 // static methods
                 static AronOpenCVMatTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n);
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPCLPointCloudTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPCLPointCloudTypeNavigator.cpp
index 21461a559..a1bf3e4e1 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPCLPointCloudTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPCLPointCloudTypeNavigator.cpp
@@ -45,7 +45,6 @@ namespace armarx
             AronPCLPointCloudTypeNavigator::AronPCLPointCloudTypeNavigator(const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronPCLPointCloudType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronPCLPointCloudType, path),
-                AronNDArraySerializerTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 type(new type::AronPCLPointCloudType({0, 0}, ""))
             {
             }
@@ -53,12 +52,31 @@ namespace armarx
             AronPCLPointCloudTypeNavigator::AronPCLPointCloudTypeNavigator(const type::AronPCLPointCloudTypePtr& o, const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronPCLPointCloudType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronPCLPointCloudType, path),
-                AronNDArraySerializerTypeNavigator(AronTypeDescriptor::eAronEigenMatrixType, path),
                 type(o)
             {
                 CheckAronPtrForNull("AronPCLPointCloudTypeNavigator", "AronPCLPointCloudTypeNavigator", getPath(), o);
             }
 
+            type::AronPCLPointCloudTypePtr AronPCLPointCloudTypeNavigator::getCastedResult() const
+            {
+                if (type->dimensions.size() != 2)
+                {
+                    throw exception::AronExceptionWithPathInfo("AronPCLPointCloudTypeNavigator", "getCastedResult", "The dimension size is wrong. Got size: " + std::to_string(type->dimensions.size()), getPath());
+                }
+                if (std::any_of(type->dimensions.begin(), type->dimensions.end(), [](int i)
+            {
+                return i <= 0;
+            }))
+                {
+                    throw exception::AronExceptionWithPathInfo("AronPCLPointCloudTypeNavigator", "getCastedResult", "The dimension size is wrong. At least one empty is <=0", getPath());
+                }
+                if (type->typeName.empty())
+                {
+                    throw exception::AronExceptionWithPathInfo("AronPCLPointCloudTypeNavigator", "getCastedResult", "The useType of image is empty.", getPath());
+                }
+                return type;
+            }
+
             std::vector<int> AronPCLPointCloudTypeNavigator::getDimensions() const
             {
                 return type->dimensions;
@@ -137,22 +155,7 @@ namespace armarx
             // virtual implementations
             type::AronTypePtr AronPCLPointCloudTypeNavigator::getResult() const
             {
-                if (type->dimensions.size() != 2)
-                {
-                    throw exception::AronExceptionWithPathInfo("AronPCLPointCloudTypeNavigator", "getResult", "The dimension size is wrong. Got size: " + std::to_string(type->dimensions.size()), getPath());
-                }
-                if (std::any_of(type->dimensions.begin(), type->dimensions.end(), [](int i)
-            {
-                return i <= 0;
-            }))
-                {
-                    throw exception::AronExceptionWithPathInfo("AronPCLPointCloudTypeNavigator", "getResult", "The dimension size is wrong. At least one empty is <=0", getPath());
-                }
-                if (type->typeName.empty())
-                {
-                    throw exception::AronExceptionWithPathInfo("AronPCLPointCloudTypeNavigator", "getResult", "The useType of image is empty.", getPath());
-                }
-                return type;
+                return getCastedResult();
             }
 
             std::string AronPCLPointCloudTypeNavigator::getName() const
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPCLPointCloudTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPCLPointCloudTypeNavigator.h
index 22643da1e..ae22bfcae 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPCLPointCloudTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPCLPointCloudTypeNavigator.h
@@ -58,6 +58,8 @@ namespace armarx
                 void setWidth(const unsigned int&);
                 void setHeight(const unsigned int&);
 
+                type::AronPCLPointCloudTypePtr getCastedResult() const;
+
                 // static methods
                 static AronPCLPointCloudTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n);
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPrimitiveTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPrimitiveTypeNavigator.cpp
index b88cd7cff..d3eb95da6 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPrimitiveTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPrimitiveTypeNavigator.cpp
@@ -55,6 +55,11 @@ namespace armarx
         CheckAronPtrForNull("Aron" + std::string(#upperType) + "TypeNavigator", "Aron" + std::string(#upperType) + "TypeNavigator", getPath(), o); \
     } \
     \
+    type::Aron##upperType##TypePtr Aron##upperType##TypeNavigator::getCastedResult() const \
+    { \
+        return type; \
+    } \
+    \
     /* static methods */ \
     Aron##upperType##TypeNavigatorPtr Aron##upperType##TypeNavigator::DynamicCast(const AronTypeNavigatorPtr& n) \
     {\
@@ -67,7 +72,7 @@ namespace armarx
     /* virtual implementations */\
     type::AronTypePtr Aron##upperType##TypeNavigator::getResult() const\
     {\
-        return type; \
+        return getCastedResult(); \
     }\
     \
     std::string Aron##upperType##TypeNavigator::getName() const \
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPrimitiveTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPrimitiveTypeNavigator.h
index df3751920..deaebb49c 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPrimitiveTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronPrimitiveTypeNavigator.h
@@ -44,7 +44,7 @@ namespace armarx
     typedef std::shared_ptr<Aron##upperType##TypeNavigator> Aron##upperType##TypeNavigatorPtr; \
     \
     class Aron##upperType##TypeNavigator : \
-        virtual public AronTypeNavigator \
+        virtual public AronPrimitiveTypeNavigator \
     { \
     public: \
         using PointerType = Aron##upperType##TypeNavigatorPtr; \
@@ -54,6 +54,8 @@ namespace armarx
         Aron##upperType##TypeNavigator(const AronPath&); \
         Aron##upperType##TypeNavigator(const type::Aron##upperType##TypePtr&, const AronPath&); \
         \
+        type::Aron##upperType##TypePtr getCastedResult() const; \
+        \
         /* static methods */ \
         static Aron##upperType##TypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr&); \
         \
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTupleTypeNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTupleTypeNavigator.cpp
index cf6e74db3..b0b463456 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTupleTypeNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTupleTypeNavigator.cpp
@@ -35,7 +35,6 @@ namespace armarx
             AronTupleTypeNavigator::AronTupleTypeNavigator(const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronTupleType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronTupleType, path),
-                AronListSerializerTypeNavigator(AronTypeDescriptor::eAronTupleType, path),
                 type(new type::AronTupleType())
             {
             }
@@ -43,12 +42,20 @@ namespace armarx
             AronTupleTypeNavigator::AronTupleTypeNavigator(const type::AronTupleTypePtr& o, const AronPath& path) :
                 navigator::AronNavigator<AronTypeDescriptor, type::AronType>::AronNavigator(AronTypeDescriptor::eAronTupleType, path),
                 AronTypeNavigator(AronTypeDescriptor::eAronTupleType, path),
-                AronListSerializerTypeNavigator(AronTypeDescriptor::eAronTupleType, path),
                 type(o)
             {
                 CheckAronPtrForNull("AronTupleTypeNavigator", "AronTupleTypeNavigator", getPath(), o);
             }
 
+            type::AronTupleTypePtr AronTupleTypeNavigator::getCastedResult() const
+            {
+                if (acceptedTypeNavigators.empty())
+                {
+                    throw exception::AronExceptionWithPathInfo("AronTupleTypeNavigator", "getCastedResult", "No accepted types set", getPath());
+                }
+                return type;
+            }
+
             // static methods
             AronTupleTypeNavigatorPtr AronTupleTypeNavigator::DynamicCast(const AronTypeNavigatorPtr& n)
             {
@@ -84,11 +91,7 @@ namespace armarx
             // virtual implementations
             type::AronTypePtr AronTupleTypeNavigator::getResult() const
             {
-                if (acceptedTypeNavigators.empty())
-                {
-                    throw exception::AronExceptionWithPathInfo("AronTupleTypeNavigator", "getResult", "No accepted types set", getPath());
-                }
-                return type;
+                return getCastedResult();
             }
 
             std::string AronTupleTypeNavigator::getName() const
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTupleTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTupleTypeNavigator.h
index eadb63178..0435f61c8 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTupleTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTupleTypeNavigator.h
@@ -52,6 +52,8 @@ namespace armarx
                 AronTupleTypeNavigator(const AronPath& path);
                 AronTupleTypeNavigator(const type::AronTupleTypePtr&, const AronPath& path);
 
+                type::AronTupleTypePtr getCastedResult() const;
+
                 // static methods
                 static AronTupleTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n);
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTypeNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTypeNavigator.h
index a584dfd5c..6de37ba39 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTypeNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTypeNavigator.h
@@ -85,23 +85,34 @@ namespace armarx
             };
 
 
+            class AronContainerTypeNavigator;
+            typedef std::shared_ptr<AronContainerTypeNavigator> AronContainerTypeNavigatorPtr;
+
+            class AronContainerTypeNavigator :
+                virtual public AronTypeNavigator
+            {
+            public:
+                using PointerType = AronContainerTypeNavigatorPtr;
+
+                // static methods
+                static AronContainerTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n)
+                {
+                    AronContainerTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronContainerTypeNavigator>(n);
+                    return casted;
+                }
+            };
 
 
             class AronDictSerializerTypeNavigator;
             typedef std::shared_ptr<AronDictSerializerTypeNavigator> AronDictSerializerTypeNavigatorPtr;
 
             class AronDictSerializerTypeNavigator :
-                virtual public AronTypeNavigator
+                virtual public AronContainerTypeNavigator
             {
             public:
                 using PointerType = AronDictSerializerTypeNavigatorPtr;
 
             public:
-                AronDictSerializerTypeNavigator() = delete;
-                AronDictSerializerTypeNavigator(const AronTypeDescriptor& n, const AronPath& path) :
-                    AronTypeNavigator(n, path)
-                {}
-
                 // virtual methods
                 virtual void setAcceptedType(const AronTypeNavigatorPtr&) = 0;
                 virtual void addAcceptedType(const std::string&, const AronTypeNavigatorPtr&) = 0;
@@ -112,9 +123,7 @@ namespace armarx
                 // static methods
                 static AronDictSerializerTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n)
                 {
-                    CheckTypeNavigatorPtrForNull("AronDictSerializerTypeNavigator", "DynamicCast[Before]", n);
                     AronDictSerializerTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronDictSerializerTypeNavigator>(n);
-                    CheckTypeNavigatorPtrForNull("AronDictSerializerTypeNavigator", "DynamicCast[After]", casted);
                     return casted;
                 }
             };
@@ -125,17 +134,12 @@ namespace armarx
             typedef std::shared_ptr<AronListSerializerTypeNavigator> AronListSerializerTypeNavigatorPtr;
 
             class AronListSerializerTypeNavigator :
-                virtual public AronTypeNavigator
+                virtual public AronContainerTypeNavigator
             {
             public:
                 using PointerType = AronListSerializerTypeNavigatorPtr;
 
             public:
-                AronListSerializerTypeNavigator() = delete;
-                AronListSerializerTypeNavigator(const AronTypeDescriptor& n, const AronPath& path) :
-                    AronTypeNavigator(n, path)
-                {}
-
                 // virtual methods
                 virtual void setAcceptedType(const AronTypeNavigatorPtr&) = 0;
                 virtual void addAcceptedType(const AronTypeNavigatorPtr&) = 0;
@@ -146,30 +150,40 @@ namespace armarx
                 // static methods
                 static AronListSerializerTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n)
                 {
-                    CheckTypeNavigatorPtrForNull("AronListSerializerTypeNavigator", "DynamicCast[Before]", n);
                     AronListSerializerTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronListSerializerTypeNavigator>(n);
-                    CheckTypeNavigatorPtrForNull("AronListSerializerTypeNavigator", "DynamicCast[After]", casted);
                     return casted;
                 }
             };
 
 
+            class AronComplexTypeNavigator;
+            typedef std::shared_ptr<AronComplexTypeNavigator> AronComplexTypeNavigatorPtr;
+
+            class AronComplexTypeNavigator :
+                virtual public AronTypeNavigator
+            {
+            public:
+                using PointerType = AronComplexTypeNavigatorPtr;
+
+                // static methods
+                static AronComplexTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n)
+                {
+                    AronComplexTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronComplexTypeNavigator>(n);
+                    return casted;
+                }
+            };
+
 
             class AronNDArraySerializerTypeNavigator;
             typedef std::shared_ptr<AronNDArraySerializerTypeNavigator> AronNDArraySerializerTypeNavigatorPtr;
 
             class AronNDArraySerializerTypeNavigator :
-                virtual public AronTypeNavigator
+                virtual public AronComplexTypeNavigator
             {
             public:
                 using PointerType = AronNDArraySerializerTypeNavigatorPtr;
 
             public:
-                AronNDArraySerializerTypeNavigator() = delete;
-                AronNDArraySerializerTypeNavigator(const AronTypeDescriptor& n, const AronPath& path) :
-                    AronTypeNavigator(n, path)
-                {}
-
                 // virtual methods
                 virtual void setDimensions(const std::vector<int>&) = 0;
                 virtual void setUsedType(const std::string&) = 0;
@@ -180,9 +194,25 @@ namespace armarx
                 // static methods
                 static AronNDArraySerializerTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n)
                 {
-                    CheckTypeNavigatorPtrForNull("AronNDArraySerializerTypeNavigator", "DynamicCast[Before]", n);
                     AronNDArraySerializerTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronNDArraySerializerTypeNavigator>(n);
-                    CheckTypeNavigatorPtrForNull("AronNDArraySerializerTypeNavigator", "DynamicCast[After]", casted);
+                    return casted;
+                }
+            };
+
+
+            class AronPrimitiveTypeNavigator;
+            typedef std::shared_ptr<AronPrimitiveTypeNavigator> AronPrimitiveTypeNavigatorPtr;
+
+            class AronPrimitiveTypeNavigator :
+                virtual public AronTypeNavigator
+            {
+            public:
+                using PointerType = AronPrimitiveTypeNavigatorPtr;
+
+                // static methods
+                static AronPrimitiveTypeNavigatorPtr DynamicCast(const AronTypeNavigatorPtr& n)
+                {
+                    AronPrimitiveTypeNavigatorPtr casted = std::dynamic_pointer_cast<AronPrimitiveTypeNavigator>(n);
                     return casted;
                 }
             };
diff --git a/source/RobotAPI/libraries/aron/aroncore/test/aronDataWithoutCodeGeneration.h b/source/RobotAPI/libraries/aron/aroncore/test/aronDataWithoutCodeGeneration.h
index ce409513f..67fd71120 100644
--- a/source/RobotAPI/libraries/aron/aroncore/test/aronDataWithoutCodeGeneration.h
+++ b/source/RobotAPI/libraries/aron/aroncore/test/aronDataWithoutCodeGeneration.h
@@ -59,24 +59,24 @@ namespace armarx
             w.readEndDict();
         }
 
-        armarx::aron::datanavigator::AronDataNavigatorPtr toAron() const
+        armarx::aron::datanavigator::AronDictDataNavigatorPtr toAron() const
         {
             armarx::aron::io::AronDataNavigatorWriter writer;
             this->write(writer);
-            return writer.getResult();
+            return armarx::aron::datanavigator::AronDictDataNavigator::DynamicCast(writer.getResult());
         }
 
-        void fromAron(const armarx::aron::datanavigator::AronDataNavigatorPtr& input)
+        void fromAron(const armarx::aron::datanavigator::AronDictDataNavigatorPtr& input)
         {
             armarx::aron::io::AronDataNavigatorReader reader(input);
             //this->read(reader);
         }
 
-        armarx::aron::typenavigator::AronTypeNavigatorPtr toInitialAronType() const
+        armarx::aron::typenavigator::AronObjectTypeNavigatorPtr toInitialAronType() const
         {
             armarx::aron::io::AronTypeNavigatorWriter writer;
             this->writeType(writer);
-            return writer.getResult();
+            return armarx::aron::typenavigator::AronObjectTypeNavigator::DynamicCast(writer.getResult());
         }
     };
 
@@ -144,24 +144,24 @@ namespace armarx
         }
 
 
-        armarx::aron::datanavigator::AronDataNavigatorPtr toAron() const
+        armarx::aron::datanavigator::AronDictDataNavigatorPtr toAron() const
         {
             armarx::aron::io::AronDataNavigatorWriter writer;
             this->write(writer);
-            return writer.getResult();
+            return armarx::aron::datanavigator::AronDictDataNavigator::DynamicCast(writer.getResult());
         }
 
-        void fromAron(const armarx::aron::datanavigator::AronDataNavigatorPtr& input)
+        void fromAron(const armarx::aron::datanavigator::AronDictDataNavigatorPtr& input)
         {
             //armarx::aron::io::AronDataNavigatorReader reader(input);
             //this->read(reader);
         }
 
-        armarx::aron::typenavigator::AronTypeNavigatorPtr toInitialAronType() const
+        armarx::aron::typenavigator::AronObjectTypeNavigatorPtr toInitialAronType() const
         {
             armarx::aron::io::AronTypeNavigatorWriter writer;
             this->writeType(writer);
-            return writer.getResult();
+            return armarx::aron::typenavigator::AronObjectTypeNavigator::DynamicCast(writer.getResult());
         }
     };
 
@@ -267,24 +267,24 @@ namespace armarx
             w.readEndDict();
         }
 
-        armarx::aron::datanavigator::AronDataNavigatorPtr toAron() const
+        armarx::aron::datanavigator::AronDictDataNavigatorPtr toAron() const
         {
             armarx::aron::io::AronDataNavigatorWriter writer;
             this->write(writer);
-            return writer.getResult();
+            return armarx::aron::datanavigator::AronDictDataNavigator::DynamicCast(writer.getResult());
         }
 
-        void fromAron(const armarx::aron::datanavigator::AronDataNavigatorPtr& input)
+        void fromAron(const armarx::aron::datanavigator::AronDictDataNavigatorPtr& input)
         {
             armarx::aron::io::AronDataNavigatorReader reader(input);
             //this->read(reader);
         }
 
-        armarx::aron::typenavigator::AronTypeNavigatorPtr toInitialAronType() const
+        armarx::aron::typenavigator::AronObjectTypeNavigatorPtr toInitialAronType() const
         {
             armarx::aron::io::AronTypeNavigatorWriter writer;
             this->writeType(writer);
-            return writer.getResult();
+            return armarx::aron::typenavigator::AronObjectTypeNavigator::DynamicCast(writer.getResult());
         }
 
     };
diff --git a/source/RobotAPI/libraries/aron/aroncore/test/aronTest.cpp b/source/RobotAPI/libraries/aron/aroncore/test/aronTest.cpp
index d3f1fd199..14bd92ceb 100644
--- a/source/RobotAPI/libraries/aron/aroncore/test/aronTest.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/test/aronTest.cpp
@@ -28,6 +28,7 @@
 #include <iostream>
 #include <cstdlib>
 #include <ctime>
+#include <numeric>
 
 // IVT
 #include <Image/ByteImage.h>
@@ -115,310 +116,281 @@ std::vector<unsigned char> generateRandomBlob(unsigned int size)
     return new_blob;
 }
 
-data::AronDataPtr generateAronDataFromType(const type::AronTypePtr& type)
+datanavigator::AronDataNavigatorPtr generateAronDataFromType(const typenavigator::AronTypeNavigatorPtr& type)
 {
+    BOOST_CHECK_NE(type, nullptr);
     BOOST_CHECK_NE(type.get(), nullptr);
 
+    const AronTypeDescriptor desc = type->getDescriptor();
+    switch (desc)
     {
-        type::AronObjectTypePtr t = type::AronObjectTypePtr::dynamicCast(type);
-        if (t)
-        {
-            data::AronDictPtr d = data::AronDictPtr(new data::AronDict());
-            for (const auto& [k, tt] : t->elementTypes)
-            {
-                d->elements[k] = generateAronDataFromType(tt);
-            }
-            return d;
-        }
-    }
+    case eAronObjectType:
     {
-        type::AronDictTypePtr t = type::AronDictTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronDict();
-        }
-    }
-    {
-        type::AronListTypePtr t = type::AronListTypePtr::dynamicCast(type);
-        if (t)
+        typenavigator::AronObjectTypeNavigatorPtr t = typenavigator::AronObjectTypeNavigator::DynamicCast(type);
+        BOOST_CHECK_NE(t, nullptr);
+        BOOST_CHECK_NE(t.get(), nullptr);
+
+        datanavigator::AronDictDataNavigatorPtr d = datanavigator::AronDictDataNavigatorPtr(new datanavigator::AronDictDataNavigator());
+        for (const auto& [k, tt] : t->getAcceptedTypes())
         {
-            return new data::AronList();
+            d->addElement(k, generateAronDataFromType(tt));
         }
+        return d;
     }
+    case eAronDictType:
     {
-        type::AronTupleTypePtr t = type::AronTupleTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronList();
-        }
+        typenavigator::AronDictTypeNavigatorPtr t = typenavigator::AronDictTypeNavigator::DynamicCast(type);
+        BOOST_CHECK_NE(t, nullptr);
+        BOOST_CHECK_NE(t.get(), nullptr);
+
+        return datanavigator::AronDataNavigatorPtr(new datanavigator::AronDictDataNavigator());
     }
-    {
-        type::AronEigenMatrixTypePtr t = type::AronEigenMatrixTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronNDArray();
-        }
+#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
+    case eAron##upperType##Type: \
+    { \
+        typenavigator::Aron##upperType##TypeNavigatorPtr t = typenavigator::Aron##upperType##TypeNavigator::DynamicCast(type); \
+        BOOST_CHECK_NE(t, nullptr); \
+        BOOST_CHECK_NE(t.get(), nullptr); \
+        \
+        return datanavigator::AronDataNavigatorPtr(new datanavigator::AronListDataNavigator()); \
     }
-    {
-        type::AronIntTypePtr t = type::AronIntTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronInt();
-        }
-    }
-    {
-        type::AronLongTypePtr t = type::AronLongTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronLong();
-        }
+
+            HANDLE_LIST_SERIALIZER_TYPES
+#undef RUN_ARON_MACRO
+
+#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
+    case eAron##upperType##Type: \
+    { \
+        typenavigator::Aron##upperType##TypeNavigatorPtr t = typenavigator::Aron##upperType##TypeNavigator::DynamicCast(type); \
+        BOOST_CHECK_NE(t, nullptr); \
+        BOOST_CHECK_NE(t.get(), nullptr); \
+        \
+        return datanavigator::AronDataNavigatorPtr(new datanavigator::AronNDArrayDataNavigator()); \
     }
-    {
-        type::AronFloatTypePtr t = type::AronFloatTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronFloat();
-        }
+
+            HANDLE_COMPLEX_TYPES
+#undef RUN_ARON_MACRO
+
+#define RUN_ARON_MACRO(upperType, lowerType, capsType) \
+    case eAron##upperType##Type: \
+    { \
+        typenavigator::Aron##upperType##TypeNavigatorPtr t = typenavigator::Aron##upperType##TypeNavigator::DynamicCast(type); \
+        BOOST_CHECK_NE(t, nullptr); \
+        BOOST_CHECK_NE(t.get(), nullptr); \
+        \
+        return datanavigator::AronDataNavigatorPtr(new datanavigator::Aron##upperType##DataNavigator()); \
     }
+
+            HANDLE_PRIMITIVE_TYPES
+#undef RUN_ARON_MACRO
+    default:
     {
-        type::AronDoubleTypePtr t = type::AronDoubleTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronDouble();
-        }
+        throw armarx::aron::exception::AronTypeDescriptorNotValidException("AronTest", "generateAronDataFromType", "No valid type found!", desc);
     }
-    {
-        type::AronStringTypePtr t = type::AronStringTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronString();
-        }
     }
-    {
-        type::AronBoolTypePtr t = type::AronBoolTypePtr::dynamicCast(type);
-        if (t)
-        {
-            return new data::AronBool();
-        }
-    }
-    throw armarx::aron::exception::AronTypeNotValidException("AronTest", "generateAronDataFromType", "No valid type found!", type);
 }
 
-void initializeRandomly(data::AronDataPtr& data, const type::AronTypePtr& type)
+// Prototype recursion
+void initializeRandomly(datanavigator::AronDataNavigatorPtr& data, const typenavigator::AronTypeNavigatorPtr& type);
+
+void initializeRandomly(datanavigator::AronDictDataNavigatorPtr& data, const typenavigator::AronObjectTypeNavigatorPtr& type)
 {
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
     BOOST_CHECK_NE(data.get(), nullptr);
     BOOST_CHECK_NE(type.get(), nullptr);
 
-    // Containers
+    for (auto& [key, nextData] : data->getElements())
     {
-        type::AronObjectTypePtr objectType = type::AronObjectTypePtr::dynamicCast(type);
-        if (objectType)
-        {
-            data::AronDictPtr dict = data::AronDictPtr::dynamicCast(data);
-            BOOST_CHECK_NE(dict.get(), nullptr);
-            for (auto& [key, nextData] : dict->elements)
-            {
-                initializeRandomly(nextData, objectType->elementTypes[key]);
-            }
-            return;
-        }
+        initializeRandomly(nextData, type->getAcceptedTypes()[key]);
     }
+}
 
+void initializeRandomly(datanavigator::AronDictDataNavigatorPtr& data, const typenavigator::AronDictTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
+
+    data->clear();
+    int numElements = generateRandom(5, 1);
+    std::set<std::string> usedKeys;
+    for (int i = 0; i < numElements; ++i)
     {
-        type::AronListTypePtr listType = type::AronListTypePtr::dynamicCast(type);
-        if (listType)
+        std::string key = generateRandomWord();
+        while (usedKeys.count(key) > 0)
         {
-            data::AronListPtr list = data::AronListPtr::dynamicCast(data);
-            BOOST_CHECK_NE(list.get(), nullptr);
-
-            list->elements.clear();
-            int numElements = generateRandom(5, 1);
-            for (int i = 0; i < numElements; ++i)
-            {
-                data::AronDataPtr newData = generateAronDataFromType(listType->acceptedType);
-                initializeRandomly(newData, listType->acceptedType);
-                list->elements.push_back(newData);
-            }
-            return;
+            key = generateRandomWord();
         }
+        usedKeys.insert(key);
+        datanavigator::AronDataNavigatorPtr newData = generateAronDataFromType(type->getAcceptedType());
+        initializeRandomly(newData, type->getAcceptedType());
+        data->addElement(key, newData);
     }
+}
+
+void initializeRandomly(datanavigator::AronListDataNavigatorPtr& data, const typenavigator::AronTupleTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
 
+    unsigned int i = 0;
+    for (auto& nextData : data->getElements())
     {
-        type::AronDictTypePtr dictType = type::AronDictTypePtr::dynamicCast(type);
-        if (dictType)
-        {
-            data::AronDictPtr dict = data::AronDictPtr::dynamicCast(data);
-            BOOST_CHECK_NE(dict.get(), nullptr);
-
-            dict->elements.clear();
-            int numElements = generateRandom(5, 1);
-            std::cout << "Generating " << numElements << " elements" << std::endl;
-            std::set<std::string> usedKeys;
-            for (int i = 0; i < numElements; ++i)
-            {
-                std::string key = generateRandomWord();
-                while (usedKeys.count(key) > 0)
-                {
-                    key = generateRandomWord();
-                }
-                usedKeys.insert(key);
-                data::AronDataPtr newData = generateAronDataFromType(dictType->acceptedType);
-                initializeRandomly(newData, dictType->acceptedType);
-                dict->elements[key] = newData;
-            }
-            return;
-        }
+        initializeRandomly(nextData, type->getAcceptedTypes()[i++]);
     }
+}
+
+void initializeRandomly(datanavigator::AronListDataNavigatorPtr& data, const typenavigator::AronListTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
 
+    data->clear();
+    int numElements = generateRandom(5, 1);
+    for (int i = 0; i < numElements; ++i)
     {
-        type::AronTupleTypePtr tupleType = type::AronTupleTypePtr::dynamicCast(type);
-        if (tupleType)
-        {
-            data::AronListPtr list = data::AronListPtr::dynamicCast(data);
-            BOOST_CHECK_NE(list.get(), nullptr);
-            BOOST_CHECK_EQUAL(list->elements.size(), tupleType->elementTypes.size());
-
-            int i = 0;
-            for (auto& nextData : list->elements)
-            {
-                initializeRandomly(nextData, tupleType->elementTypes[i++]);
-            }
-            return;
-        }
+        datanavigator::AronDataNavigatorPtr newData = generateAronDataFromType(type->getAcceptedType());
+        initializeRandomly(newData, type->getAcceptedType());
+        data->addElement(newData);
     }
+}
 
-    // Complex
-    {
-        type::AronEigenMatrixTypePtr eigenMatrixType = type::AronEigenMatrixTypePtr::dynamicCast(type);
-        if (eigenMatrixType)
-        {
-            data::AronNDArrayPtr blob = data::AronNDArrayPtr::dynamicCast(data);
-            BOOST_CHECK_NE(blob.get(), nullptr);
-            return;
-        }
+void initializeRandomly(datanavigator::AronNDArrayDataNavigatorPtr& data, const typenavigator::AronNDArraySerializerTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
 
-        type::AronIVTCByteImageTypePtr ivtCByteImageType = type::AronIVTCByteImageTypePtr::dynamicCast(type);
-        if (ivtCByteImageType)
-        {
-            data::AronNDArrayPtr blob = data::AronNDArrayPtr::dynamicCast(data);
-            BOOST_CHECK_NE(blob.get(), nullptr);
+    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());
+}
 
-            blob->data = generateRandomBlob(blob->data.size());
-            return;
-        }
+void initializeRandomly(datanavigator::AronIntDataNavigatorPtr& data, const typenavigator::AronPrimitiveTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
 
-        type::AronOpenCVMatTypePtr openCVMatType = type::AronOpenCVMatTypePtr::dynamicCast(type);
-        if (openCVMatType)
-        {
-            data::AronNDArrayPtr blob = data::AronNDArrayPtr::dynamicCast(data);
-            BOOST_CHECK_NE(blob.get(), nullptr);
+    data->setValue(generateRandom(32, -32));
+}
 
-            blob->data = generateRandomBlob(blob->data.size());
-            return;
-        }
+void initializeRandomly(datanavigator::AronLongDataNavigatorPtr& data, const typenavigator::AronPrimitiveTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
 
-        type::AronPCLPointCloudTypePtr pclPointCloudType = type::AronPCLPointCloudTypePtr::dynamicCast(type);
-        if (pclPointCloudType)
-        {
-            data::AronNDArrayPtr blob = data::AronNDArrayPtr::dynamicCast(data);
-            BOOST_CHECK_NE(blob.get(), nullptr);
+    data->setValue(generateRandom(32, -32));
+}
 
-            blob->data = generateRandomBlob(blob->data.size());
-            return;
-        }
-    }
+void initializeRandomly(datanavigator::AronFloatDataNavigatorPtr& data, const typenavigator::AronPrimitiveTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
 
+    data->setValue(generateRandom(32, -32));
+}
 
-    // Primitives
-    {
-        type::AronIntTypePtr primitiveType = type::AronIntTypePtr::dynamicCast(type);
-        if (primitiveType)
-        {
-            data::AronIntPtr primitiveData = data::AronIntPtr::dynamicCast(data);
-            BOOST_CHECK_NE(primitiveData.get(), nullptr);
+void initializeRandomly(datanavigator::AronDoubleDataNavigatorPtr& data, const typenavigator::AronPrimitiveTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
 
-            primitiveData->value = generateRandom(32, -32);
-            return;
-        }
-    }
-    {
-        type::AronLongTypePtr primitiveType = type::AronLongTypePtr::dynamicCast(type);
-        if (primitiveType)
-        {
-            data::AronLongPtr primitiveData = data::AronLongPtr::dynamicCast(data);
-            BOOST_CHECK_NE(primitiveData.get(), nullptr);
+    data->setValue(generateRandom(32, -32));
+}
 
-            primitiveData->value = generateRandom(32, -32);
-            return;
-        }
-    }
-    {
-        type::AronFloatTypePtr primitiveType = type::AronFloatTypePtr::dynamicCast(type);
-        if (primitiveType)
-        {
-            data::AronFloatPtr primitiveData = data::AronFloatPtr::dynamicCast(data);
-            BOOST_CHECK_NE(primitiveData.get(), nullptr);
+void initializeRandomly(datanavigator::AronBoolDataNavigatorPtr& data, const typenavigator::AronPrimitiveTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
 
-            primitiveData->value = generateRandom(32, -32);
-            return;
-        }
-    }
-    {
-        type::AronDoubleTypePtr primitiveType = type::AronDoubleTypePtr::dynamicCast(type);
-        if (primitiveType)
-        {
-            data::AronDoublePtr primitiveData = data::AronDoublePtr::dynamicCast(data);
-            BOOST_CHECK_NE(primitiveData.get(), nullptr);
+    data->setValue(generateRandom(1, 0));
+}
 
-            primitiveData->value = generateRandom(32, -32);
-            return;
-        }
-    }
+void initializeRandomly(datanavigator::AronStringDataNavigatorPtr& data, const typenavigator::AronPrimitiveTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
+
+    data->setValue(generateRandomWord());
+}
+
+void initializeRandomly(datanavigator::AronDataNavigatorPtr& data, const typenavigator::AronTypeNavigatorPtr& type)
+{
+    BOOST_CHECK_NE(data, nullptr);
+    BOOST_CHECK_NE(type, nullptr);
+    BOOST_CHECK_NE(data.get(), nullptr);
+    BOOST_CHECK_NE(type.get(), nullptr);
+
+    // Containers
+    AronTypeDescriptor desc = type->getDescriptor();
+    switch (desc)
     {
-        type::AronStringTypePtr primitiveType = type::AronStringTypePtr::dynamicCast(type);
-        if (primitiveType)
-        {
-            data::AronStringPtr primitiveData = data::AronStringPtr::dynamicCast(data);
-            BOOST_CHECK_NE(primitiveData.get(), nullptr);
 
-            primitiveData->value = generateRandomWord();
-            return;
-        }
+#define RUN_ARON_MACRO(upperType, lowerType, capsType, upperData, lowerData, capsData) \
+    case eAron##upperType##Type: \
+    { \
+        typenavigator::Aron##upperType##TypeNavigatorPtr t = typenavigator::Aron##upperType##TypeNavigator::DynamicCast(type); \
+        BOOST_CHECK_NE(t, nullptr); \
+        BOOST_CHECK_NE(t.get(), nullptr); \
+        \
+        datanavigator::Aron##upperData##DataNavigatorPtr d = datanavigator::Aron##upperData##DataNavigator::DynamicCast(data); \
+        BOOST_CHECK_NE(d, nullptr); \
+        BOOST_CHECK_NE(d.get(), nullptr); \
+        \
+        initializeRandomly(d, t); \
+        break; \
     }
-    {
-        type::AronBoolTypePtr primitiveType = type::AronBoolTypePtr::dynamicCast(type);
-        if (primitiveType)
-        {
-            data::AronBoolPtr primitiveData = data::AronBoolPtr::dynamicCast(data);
-            BOOST_CHECK_NE(primitiveData.get(), nullptr);
 
-            primitiveData->value = generateRandom(1, 0);
-            return;
-        }
+            HANDLE_ALL_CORRESPONDING
+#undef RUN_ARON_MACRO
+
+    default:
+    {
+        throw armarx::aron::exception::AronTypeDescriptorNotValidException("AronTest", "initializeRandomly", "No valid type found!", desc);
+    }
     }
-    throw armarx::aron::exception::AronTypeNotValidException("AronTest", "initializeRandomly", "No valid type found!", type);
 }
 
 template <typename T>
 void runTestWithInstances(T& k1, T& k2)
 {
     std::cout << "\t getting type 1" << std::endl;
-    typenavigator::AronTypeNavigatorPtr k1_type_nav = k1.toInitialAronType();
-    type::AronTypePtr k1_type = k1_type_nav->getResult();
+    typenavigator::AronObjectTypeNavigatorPtr k1_type_nav = k1.toInitialAronType();
+    type::AronObjectTypePtr k1_type = k1_type_nav->getCastedResult();
     BOOST_CHECK_NE(k1_type.get(), nullptr);
 
     std::cout << "\t getting type 2" << std::endl;
-    typenavigator::AronTypeNavigatorPtr k2_type_nav = k2.toInitialAronType();
-    type::AronTypePtr k2_type = k2_type_nav->getResult();
+    typenavigator::AronObjectTypeNavigatorPtr k2_type_nav = k2.toInitialAronType();
+    type::AronObjectTypePtr k2_type = k2_type_nav->getCastedResult();
     BOOST_CHECK_NE(k2_type.get(), nullptr);
 
     std::cout << "\t getting aron 1" << std::endl;
-    datanavigator::AronDataNavigatorPtr k1_aron_nav = k1.toAron();
-    data::AronDataPtr k1_aron = k1_aron_nav->getResult();
+    datanavigator::AronDictDataNavigatorPtr k1_aron_nav = k1.toAron();
+    data::AronDictPtr k1_aron = k1_aron_nav->getCastedResult();
     BOOST_CHECK_NE(k1_aron.get(), nullptr);
 
     std::cout << "\t initialize aron 1 randomly" << std::endl;
-    initializeRandomly(k1_aron, k1_type);
+    initializeRandomly(k1_aron_nav, k1_type_nav);
 
     //std::cout << "K Aron:" << std::endl;
     //std::cout << AronDebug::AronDataPtrToString(k_aron) << std::endl;
@@ -427,8 +399,8 @@ void runTestWithInstances(T& k1, T& k2)
     k2.fromAron(k1_aron);
 
     std::cout << "\t getting aron 2" << std::endl;
-    datanavigator::AronDataNavigatorPtr k2_aron_nav = k2.toAron();
-    data::AronDataPtr k2_aron = k2_aron_nav->getResult();
+    datanavigator::AronDictDataNavigatorPtr k2_aron_nav = k2.toAron();
+    data::AronDictPtr k2_aron = k2_aron_nav->getCastedResult();
     BOOST_CHECK_NE(k2_aron.get(), nullptr);
 
     //std::cout << "K2 Aron:" << std::endl;
@@ -449,7 +421,7 @@ void runTestWithInstances(T& k1, T& k2)
     //type::AronTypePtr k2_current_type = k2_current_type_nav->getResult();
     //BOOST_CHECK_NE(k2_current_type.get(), nullptr);
 
-    initializeRandomly(k1_aron, k1_type);
+    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;
-- 
GitLab