diff --git a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
index 081a5f9ef65857843e110017d3e491bd5f235801..093fca38a8a4c97367669a86116e57c7503f3a2c 100644
--- a/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
+++ b/source/RobotAPI/libraries/armem/server/RemoteGuiAronDataVisitor.h
@@ -38,7 +38,7 @@ namespace armarx::armem::server
         void visitDictOnEnter(const aron::data::VariantPtr& n) override
         {
             ARMARX_CHECK_NOT_NULL(n);
-            const std::string key = n->getPath().getLastElement();
+            const std::string key = n->getPath().size() > 0 ? n->getPath().getLastElement() : ""; // check if root of object
             visitEnter(key, "dict", n->childrenSize());
         }
         void visitDictOnExit(const aron::data::VariantPtr&) override
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
index c5cfddb7c11c39f6953453a7f36e6ab7f5ad56f1..99f95201e220830607148af08c1a9cce6ded71d2 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
@@ -1,5 +1,6 @@
 #include "DataDisplayVisitor.h"
 
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
 
 namespace armarx::aron
 {
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
index f426bf08da16341b679ead1f5883db038a029aab..6a132629b65031c1b27225528872bcb4c20cd611 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
@@ -7,7 +7,7 @@
 
 #include <ArmarXCore/core/logging/Logging.h>
 
-#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
 #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
index 0bab97220aeecf9897ac0f4a8dde786c97315fed..eb8d4004ab2d4e5bb430995b5b9ba27f52da8e6e 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
@@ -6,6 +6,7 @@
 #include <QTreeWidget>
 #include <QLabel>
 
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
 #include <RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h>
 
 
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp
index ea8973efc4c48a510f66698ca3ca53dfaf4dd926..775e95d2bb867ab88f58767f8cda8a68d15b4633 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp
@@ -1,5 +1,6 @@
 #include "TreeDataVisitorBase.h"
 
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
 
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
index 558057cc067b5c4c5525ebe3ec3701350da68729..848a6e4bace8159a559558a0e7c12b28a749f9ef 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
@@ -6,6 +6,7 @@
 #include <QTreeWidget>
 #include <QLabel>
 
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
 #include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h>
 
 #include <RobotAPI/libraries/armem_gui/instance/sanitize_typename.h>
diff --git a/source/RobotAPI/libraries/aron/core/data/converter/Converter.h b/source/RobotAPI/libraries/aron/core/data/converter/Converter.h
index 611a91f6f05dc20f448ae8221bca0259196e5d96..c538c61f35eb639c6e915fb732190fc8ef8093fe 100644
--- a/source/RobotAPI/libraries/aron/core/data/converter/Converter.h
+++ b/source/RobotAPI/libraries/aron/core/data/converter/Converter.h
@@ -36,8 +36,7 @@ namespace armarx::aron::data
     /// Converter struct providing the needed methods.
     /// WriterImplementation is a writer class, TODO: add concepts
     template <class ReaderImplementation, class WriterImplementation, class DerivedT>
-    struct Converter :
-            virtual public Visitor<typename ReaderImplementation::InputType>
+    struct Converter : virtual public Visitor<typename ReaderImplementation::InputType>
     {
         using WriterReturnType = typename WriterImplementation::ReturnType;
         using ReaderInputType = typename ReaderImplementation::InputType;
@@ -49,7 +48,7 @@ namespace armarx::aron::data
 
         virtual ~Converter() = default;
 
-        virtual void visitDict(ReaderInputType& o) override
+        void visitDict(ReaderInputType& o) final
         {
             std::map<std::string, ReaderInputTypeNonConst> elementsOfInput;
             std::map<std::string, WriterReturnType> elementsReturn;
@@ -62,7 +61,8 @@ namespace armarx::aron::data
 
             last_returned = w.writeDict(elementsReturn);
         };
-        virtual void visitList(ReaderInputType& o) override
+
+        void visitList(ReaderInputType& o) final
         {
             std::vector<ReaderInputTypeNonConst> elementsOfInput;
             std::vector<WriterReturnType> elementsReturn;
@@ -74,7 +74,8 @@ namespace armarx::aron::data
             }
             last_returned = w.writeList(elementsReturn);
         };
-        virtual void visitNDArray(ReaderInputType& o) override
+
+        void visitNDArray(ReaderInputType& o) final
         {
             std::string type;
             std::vector<int> shape;
@@ -82,37 +83,43 @@ namespace armarx::aron::data
             r.readNDArray(o, shape, type, data);
             last_returned = w.writeNDArray(shape, type, data.data());
         };
-        virtual void visitInt(ReaderInputType& o) override
+
+        void visitInt(ReaderInputType& o) final
         {
             int i;
             r.readInt(o, i);
             last_returned = w.writeInt(i);
         };
-        virtual void visitLong(ReaderInputType& o) override
+
+        void visitLong(ReaderInputType& o) final
         {
             long i;
             r.readLong(o, i);
             last_returned = w.writeLong(i);
         };
-        virtual void visitFloat(ReaderInputType& o) override
+
+        void visitFloat(ReaderInputType& o) final
         {
             float i;
             r.readFloat(o, i);
             last_returned = w.writeFloat(i);
         };
-        virtual void visitDouble(ReaderInputType& o) override
+
+        void visitDouble(ReaderInputType& o) final
         {
             double i;
             r.readDouble(o, i);
             last_returned = w.writeDouble(i);
         };
-        virtual void visitBool(ReaderInputType& o) override
+
+        void visitBool(ReaderInputType& o) final
         {
             bool i;
             r.readBool(o, i);
             last_returned = w.writeBool(i);
         };
-        virtual void visitString(ReaderInputType& o) override
+
+        void visitString(ReaderInputType& o) final
         {
             std::string i;
             r.readString(o, i);
diff --git a/source/RobotAPI/libraries/aron/core/data/converter/nlohmannJSON/NlohmannJSONConverter.h b/source/RobotAPI/libraries/aron/core/data/converter/nlohmannJSON/NlohmannJSONConverter.h
index 25cd0dc57d26b5dd1bd18c7b39f73e5edcc05f91..0fab928032c1884385c6231aeb3ef11f87766364 100644
--- a/source/RobotAPI/libraries/aron/core/data/converter/nlohmannJSON/NlohmannJSONConverter.h
+++ b/source/RobotAPI/libraries/aron/core/data/converter/nlohmannJSON/NlohmannJSONConverter.h
@@ -33,12 +33,18 @@ namespace armarx::aron::data
     /// WriterImplementation is a writer class, TODO: add concept
     template <class WriterImplementation, class DerivedT>
     struct NlohmannJSONConverter :
-            virtual public ConstNlohmannJSONVisitor,
             virtual public Converter<aron::data::reader::NlohmannJSONReader, WriterImplementation, DerivedT>
     {
+        using Base = Converter<aron::data::reader::NlohmannJSONReader, WriterImplementation, DerivedT>;
+
         virtual ~NlohmannJSONConverter() = default;
 
-        virtual void visitUnknown(const nlohmann::json& o) override
+        data::Descriptor getDescriptor(typename Base::ReaderInputType& n) final
+        {
+            return ConstNlohmannJSONVisitor::GetDescriptor(n);
+        }
+
+        void visitUnknown(typename Base::ReaderInputType& o) final
         {
             if (!this->r.readNull(o))
             {
diff --git a/source/RobotAPI/libraries/aron/core/data/converter/variant/VariantConverter.h b/source/RobotAPI/libraries/aron/core/data/converter/variant/VariantConverter.h
index 4173e7143385e9d7fc1349366f1d38a5aeb3d8c0..eb122beb0e54819798eb0f64586e9dc7adc94282 100644
--- a/source/RobotAPI/libraries/aron/core/data/converter/variant/VariantConverter.h
+++ b/source/RobotAPI/libraries/aron/core/data/converter/variant/VariantConverter.h
@@ -34,12 +34,18 @@ namespace armarx::aron::data
     /// WriterImplementation is a writer class, TODO: add concept
     template <class WriterImplementation, class DerivedT>
     struct VariantConverter :
-            virtual public ConstVariantVisitor,
             virtual public Converter<aron::data::reader::VariantReader, WriterImplementation, DerivedT>
     {
+        using Base = Converter<aron::data::reader::VariantReader, WriterImplementation, DerivedT>;
+
         virtual ~VariantConverter() = default;
 
-        virtual void visitUnknown(const data::VariantPtr& o) override
+        data::Descriptor getDescriptor(typename Base::ReaderInputType& n) final
+        {
+            return ConstVariantVisitor::GetDescriptor(n);
+        }
+
+        virtual void visitUnknown(typename Base::ReaderInputType& o) final
         {
             if (!this->r.readNull(o))
             {
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/Variant.h b/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
index be3d93336c1f7a3d26c47f7a8d579e4add06d395..00f5aa6ffd74350b344e5293947353dd28d02d73 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
@@ -129,10 +129,10 @@ namespace armarx::aron::data
         /// checks, if the current data variant fullfills the given type
         virtual bool fullfillsType(const type::VariantPtr&) const = 0;
 
-        /// naviate absoluet (TODO)
+        /// naviate absolute
         virtual VariantPtr navigateAbsolute(const Path& path) const = 0;
 
-        /// navigate relative (TODO)
+        /// navigate relative
         virtual VariantPtr navigateRelative(const Path& path) const = 0;
 
         /// get a short str representation of this variant
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp
index befc9ea5c3eb07e2f17d380d252c6191e5726ff5..dda38b2d0cd94a3bf51e9e9d25964a1ba3371299 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp
@@ -168,35 +168,62 @@ namespace armarx::aron::data
 
     type::VariantPtr NDArray::recalculateType() const
     {
-        // We set all to openCVMat because it accepts n-dimensional types TODO
-        //type::OpenCVMatNavigatorPtr typenav = type::OpenCVMatNavigatorPtr(new type::OpenCVMatNavigator(getPath()));
-        //return typenav;
-        return nullptr;
+        throw error::NotImplementedYetException(__PRETTY_FUNCTION__);
     }
 
     bool NDArray::fullfillsType(const type::VariantPtr& type) const
     {
-        /*if (!Resolver::Correspond(type->getDescriptor(), getDescriptor()))
+        if (!type)
         {
             return false;
         }
 
-        switch (type->getDescriptor())
+        type::Descriptor typeDesc = type->getDescriptor();
+        switch (typeDesc)
         {
-            case type::Descriptor::eMatrix:
-            {
-                auto casted = type::MatrixNavigator::DynamicCast(type);
-                if ((unsigned int) aron->shape[0] != casted->getRows() || (unsigned int) aron->shape[1] != casted->getCols())
-                {
-                    return false;
-                }
-                break;
-            }
-            // TODO:
-            default:
-                throw error::AronException("NDArrayNavigator", "fullfillsType", "Could not cast a type to an NDArray-Type", getPath());
-        }*/
-        return true;
+        case type::Descriptor::eMatrix:
+        {
+            auto casted = type::Matrix::DynamicCastAndCheck(type);
+            return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == casted->getRows() && (unsigned int) aron->shape[1] == casted->getCols());
+        }
+        case type::Descriptor::eQuaternion:
+        {
+            auto casted = type::Quaternion::DynamicCastAndCheck(type);
+            return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == 1 && (unsigned int) aron->shape[1] == 4);
+        }
+        case type::Descriptor::ePosition:
+        {
+            auto casted = type::Position::DynamicCastAndCheck(type);
+            return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == 3 && (unsigned int) aron->shape[1] == 1 && (unsigned int) aron->shape[1] == 4);
+        }
+        case type::Descriptor::eOrientation:
+        {
+            auto casted = type::Orientation::DynamicCastAndCheck(type);
+            return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == 1 && (unsigned int) aron->shape[1] == 4 && (unsigned int) aron->shape[2] == 4);
+        }
+        case type::Descriptor::ePose:
+        {
+            auto casted = type::Pose::DynamicCastAndCheck(type);
+            return (aron->shape.size() == 3 && (unsigned int) aron->shape[0] == 4 && (unsigned int) aron->shape[1] == 4 && (unsigned int) aron->shape[2] == 4);
+        }
+        case type::Descriptor::ePointCloud:
+        {
+            auto casted = type::PointCloud::DynamicCastAndCheck(type);
+            return (aron->shape.size() == 3);
+        }
+        case type::Descriptor::eImage:
+        {
+            auto casted = type::Image::DynamicCastAndCheck(type);
+            return (aron->shape.size() == 3);
+        }
+        case type::Descriptor::eNDArray:
+        {
+            auto casted = type::NDArray::DynamicCastAndCheck(type);
+            return (aron->shape.size() == (unsigned int) casted->getNumberDimensions());
+        }
+        default:
+            return false;
+        }
     }
 
     std::string NDArray::DimensionsToString(const std::vector<int>& dimensions)
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
index 62fa05d245337296eabbc1bba0629c050876839c..5f1da4558ada6e3b065afa9ca8ca898ae5f0f1ce 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
@@ -187,48 +187,32 @@ namespace armarx::aron::data
         return "armarx::aron::data::Dict";
     }
 
-    // TODO
     type::VariantPtr Dict::recalculateType() const
     {
-        /*type::DictNavigatorPtr typenav = type::DictNavigatorPtr(new type::Dict(getPath()));
-        for (const auto& [key, nav] : childrenNavigators)
-        {
-            if (!nav)
-            {
-                continue;
-            }
-
-            if (typenav->getAcceptedType() == nullptr)
-            {
-                typenav->setAcceptedType(nav->recalculateType());
-                continue;
-            }
-
-            if (!nav->fullfillsType(typenav->getAcceptedType()))
-            {
-                throw error::AronException("DictNavigator", "recalculateType", "Cannot recalculate the aronType. Inconsistency found for key: " + key, getPath());
-            }
-        }
-        return typenav->getAcceptedType();*/
-        return nullptr;
+        throw error::NotImplementedYetException(__PRETTY_FUNCTION__);
     }
 
     bool Dict::fullfillsType(const type::VariantPtr& type) const
     {
-        /*if (!Resolver::Correspond(type->getDescriptor(), getDescriptor()))
+        if(!type)
         {
             return false;
         }
 
         type::Descriptor typeDesc = type->getDescriptor();
+
         switch (typeDesc)
         {
             case type::Descriptor::eObject:
             {
-                typenavigator::ObjectNavigatorPtr objectTypeNav = typenavigator::ObjectNavigator::DynamicCast(type);
+                auto objectTypeNav = type::Object::DynamicCastAndCheck(type);
                 for (const auto& [key, nav] : childrenNavigators)
                 {
-                    if (!nav && !objectTypeNav->getMemberType(key))
+                    if (!objectTypeNav->hasMemberType(key))
+                    {
+                        return false;
+                    }
+                    if (!nav || !objectTypeNav->getMemberType(key))
                     {
                         return false;
                     }
@@ -241,10 +225,11 @@ namespace armarx::aron::data
             }
             case type::Descriptor::eDict:
             {
-                typenavigator::DictNavigatorPtr dictTypeNav = typenavigator::DictNavigator::DynamicCast(type);
-                for (const auto& [_, nav] : childrenNavigators)
+                auto dictTypeNav = type::Dict::DynamicCastAndCheck(type);
+                for (const auto& [key, nav] : childrenNavigators)
                 {
-                    if (!nav && !dictTypeNav->getAcceptedType())
+                    (void) key;
+                    if (!nav || !dictTypeNav->getAcceptedType())
                     {
                         return false;
                     }
@@ -257,8 +242,7 @@ namespace armarx::aron::data
             }
             default:
                 return false;
-        }*/
-        return false;
+        }
     }
 
     std::vector<VariantPtr> Dict::getChildren() const
@@ -302,10 +286,4 @@ namespace armarx::aron::data
             return childrenNavigators.at(el)->navigateAbsolute(next);
         }
     }
-
-    VariantPtr Dict::navigateRelative(const Path& path) const
-    {
-        Path absoluteFromHere = path.getWithoutPrefix(getPath());
-        return navigateAbsolute(absoluteFromHere);
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
index 01842e78a5ae1c3cec8fc2fac85f2362541a486d..b5463de9cd711c0becca7d6ad4a9044df0af8511 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
@@ -70,7 +70,7 @@ namespace armarx::aron::data
         void clear();
 
         // virtual implementations        
-        virtual VariantPtr clone() const override
+        VariantPtr clone() const override
         {
             DictPtr ret(new Dict(getPath()));
             for (const auto& [key, val] : getElements())
@@ -80,16 +80,15 @@ namespace armarx::aron::data
             return ret;
         }
 
-        virtual std::string getShortName() const override;
-        virtual std::string getFullName() const override;
-        virtual std::vector<VariantPtr> getChildren() const override;
-        virtual size_t childrenSize() const override;
+        std::string getShortName() const override;
+        std::string getFullName() const override;
+        std::vector<VariantPtr> getChildren() const override;
+        size_t childrenSize() const override;
 
-        virtual type::VariantPtr recalculateType() const override;
-        virtual bool fullfillsType(const type::VariantPtr&) const override;
+        type::VariantPtr recalculateType() const override;
+        bool fullfillsType(const type::VariantPtr&) const override;
 
-        virtual VariantPtr navigateAbsolute(const Path& path) const override;
-        virtual VariantPtr navigateRelative(const Path& path) const override;
+        VariantPtr navigateAbsolute(const Path& path) const override;
 
     private:
         // members
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
index 23cc7b8d2cee6067879dd3c6975514445a47eeb3..6be5ed1d21f746ad5e69c486f878101439fe2315 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
@@ -202,29 +202,12 @@ namespace armarx::aron::data
     // TODO
     type::VariantPtr List::recalculateType() const
     {
-        /*type::ListNavigatorPtr typenav = type::ListNavigatorPtr(new type::ListNavigator(getPath()));
-        unsigned int i = 0;
-        for (const auto& nav : childrenNavigators)
-        {
-            if (typenav->getAcceptedType() == nullptr)
-            {
-                typenav->setAcceptedType(nav->recalculateType());
-                continue;
-            }
-
-            if (!nav->fullfillsType(typenav->getAcceptedType()))
-            {
-                throw error::AronException("ListNavigator", "recalculateType", "Cannot recalculate the aronType. Inconsistency found for index: " + std::to_string(i), getPath());
-            }
-            ++i;
-        }
-        return typenav->getAcceptedType();*/
-        return nullptr;
+        throw error::NotImplementedYetException(__PRETTY_FUNCTION__);
     }
 
     bool List::fullfillsType(const type::VariantPtr& type) const
     {
-        /*if (!Resolver::Correspond(type->getDescriptor(), getDescriptor()))
+        if (!type)
         {
             return false;
         }
@@ -234,7 +217,7 @@ namespace armarx::aron::data
         {
             case type::Descriptor::eList:
             {
-                typenavigator::ListNavigatorPtr listTypeNav = typenavigator::ListNavigator::DynamicCast(type);
+                auto listTypeNav = type::List::DynamicCastAndCheck(type);
                 for (const auto& nav : childrenNavigators)
                 {
                     if (!nav && !listTypeNav->getAcceptedType())
@@ -250,7 +233,7 @@ namespace armarx::aron::data
             }
             case type::Descriptor::eTuple:
             {
-                typenavigator::TupleNavigatorPtr tupleTypeNav = typenavigator::TupleNavigator::DynamicCast(type);
+                auto tupleTypeNav = type::Tuple::DynamicCastAndCheck(type);
                 unsigned int i = 0;
                 for (const auto& nav : childrenNavigators)
                 {
@@ -267,7 +250,7 @@ namespace armarx::aron::data
             }
             case type::Descriptor::ePair:
             {
-                typenavigator::PairNavigatorPtr pairTypeNav = typenavigator::PairNavigator::DynamicCast(type);
+                auto pairTypeNav = type::Pair::DynamicCastAndCheck(type);
                 if (childrenSize() != 2)
                 {
                     return false;
@@ -284,8 +267,7 @@ namespace armarx::aron::data
             }
             default:
                 return false;
-        }*/
-        return false;
+        }
     }
 
     std::vector<VariantPtr> List::getChildren() const
@@ -324,10 +306,4 @@ namespace armarx::aron::data
             return childrenNavigators.at(i)->navigateAbsolute(next);
         }
     }
-
-    VariantPtr List::navigateRelative(const Path& path) const
-    {
-        Path absoluteFromHere = path.getWithoutPrefix(getPath());
-        return navigateAbsolute(absoluteFromHere);
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/List.h b/source/RobotAPI/libraries/aron/core/data/variant/container/List.h
index d70929e1f75ab8f5fe70c96df35a36da6b077c8c..70a1f81d0317e5cae7333246cbfc3d5e425cc71e 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.h
@@ -73,7 +73,7 @@ namespace armarx::aron::data
         void clear();
 
         // virtual implementations
-        virtual VariantPtr clone() const override
+        VariantPtr clone() const override
         {
             ListPtr ret(new List(getPath()));
             for (const auto& val : getElements())
@@ -82,16 +82,15 @@ namespace armarx::aron::data
             }
             return ret;
         }
-        virtual std::string getShortName() const override;
-        virtual std::string getFullName() const override;
-        virtual std::vector<VariantPtr> getChildren() const override;
-        virtual size_t childrenSize() const override;
+        std::string getShortName() const override;
+        std::string getFullName() const override;
+        std::vector<VariantPtr> getChildren() const override;
+        size_t childrenSize() const override;
 
-        virtual type::VariantPtr recalculateType() const override;
-        virtual bool fullfillsType(const type::VariantPtr&) const override;
+        type::VariantPtr recalculateType() const override;
+        bool fullfillsType(const type::VariantPtr&) const override;
 
-        virtual VariantPtr navigateAbsolute(const Path& path) const override;
-        virtual VariantPtr navigateRelative(const Path& path) const override;
+        VariantPtr navigateAbsolute(const Path& path) const override;
 
     private:
         std::vector<VariantPtr> childrenNavigators;
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/ComplexVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/ComplexVariant.h
index f69e96b35b4a11732e48acceb6fd886573768516..868b7a8df691a47458d1f8a73b319034627cbfb7 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/detail/ComplexVariant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/ComplexVariant.h
@@ -43,22 +43,19 @@ namespace armarx::aron::data::detail
         virtual ~ComplexVariant() = default;
 
         // virtual implementations
-        virtual std::vector<VariantPtr> getChildren() const override
+        VariantPtr navigateAbsolute(const Path &path) const override
         {
-            return {};
-        }
-        virtual size_t childrenSize() const override
-        {
-            return 0;
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
         }
-        virtual VariantPtr navigateAbsolute(const Path &path) const override
+
+        std::vector<VariantPtr> getChildren() const override
         {
-            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
+            return {};
         }
 
-        virtual VariantPtr navigateRelative(const Path &path) const override
+        size_t childrenSize() const override
         {
-            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
+            return 0;
         }
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
index e2c479bbe3679c082b86c8d78391e65c348d9f4b..b7356be2074a27ba2ac4285ffafd2a400fcf1864 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
@@ -72,28 +72,25 @@ namespace armarx::aron::data::detail
         }*/
 
         // virtual implementations
-        virtual VariantPtr clone() const override
+        VariantPtr navigateAbsolute(const Path &path) const override
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
+        }
+
+        VariantPtr clone() const override
         {
             typename DerivedT::PointerType ret(new DerivedT(getValue(), this->getPath()));
             return ret;
         }
 
-        virtual std::vector<VariantPtr> getChildren() const override
+        std::vector<VariantPtr> getChildren() const override
         {
             return {};
         }
-        virtual size_t childrenSize() const override
-        {
-            return 0;
-        }
-        virtual VariantPtr navigateAbsolute(const Path &path) const override
-        {
-            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
-        }
 
-        virtual VariantPtr navigateRelative(const Path &path) const override
+        size_t childrenSize() const override
         {
-            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
+            return 0;
         }
 
         // static methods
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
index 2507f4d4b33cf0e9919a8ea58e796b32ee4f35a5..8d83766b801bed2474a7f5e9e59385a634b439a2 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
@@ -68,7 +68,7 @@ namespace armarx::aron::data::detail
             return aron;
         }
 
-        virtual bool operator==(const Variant& other) const override
+        bool operator==(const Variant& other) const override
         {
             const auto& n = DerivedT::DynamicCast(other);
             return *this == n;
@@ -78,11 +78,18 @@ namespace armarx::aron::data::detail
         virtual bool operator==(const PointerType& other) const = 0;
 
         // virtual implementations
-        virtual data::dto::GenericDataPtr toAronDTO() const override
+        data::dto::GenericDataPtr toAronDTO() const override
         {
             return aron;
         }
 
+        VariantPtr navigateRelative(const Path& path) const override
+        {
+            Path absoluteFromHere = path.getWithoutPrefix(getPath());
+            return navigateAbsolute(absoluteFromHere);
+        }
+
+
         // static methods
         static PointerType DynamicCast(const VariantPtr& n)
         {
@@ -101,7 +108,11 @@ namespace armarx::aron::data::detail
 
         static PointerType DynamicCastAndCheck(const VariantPtr& n)
         {
-            ARMARX_CHECK_NOT_NULL(n);
+            if (!n)
+            {
+                return nullptr;
+            }
+
             auto casted = DerivedT::DynamicCast(n);
             ARMARX_CHECK_NOT_NULL(casted);
             return casted;
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h
index 17a2e016fcdbc8bb61e890f85ae5a29d029c7ecc..b598517a1f0e72f62548d1d2cc8e4fdbdef9026f 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h
@@ -59,10 +59,10 @@ namespace armarx::aron::data
         data::dto::AronBoolPtr toAronBoolPtr() const;
 
         /* virtual implementations */
-        virtual std::string getShortName() const override;
-        virtual std::string getFullName() const override;
+        std::string getShortName() const override;
+        std::string getFullName() const override;
 
-        virtual type::VariantPtr recalculateType() const override;
-        virtual bool fullfillsType(const type::VariantPtr&) const override;
+        type::VariantPtr recalculateType() const override;
+        bool fullfillsType(const type::VariantPtr&) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp
index 5fbaaca0a252da5999af4027ad43b9b2301108fc..829a5b7a37c85fad1afeb34bcf75ecf06fad6624 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp
@@ -94,14 +94,11 @@ namespace armarx::aron::data
 
     bool Double::fullfillsType(const type::VariantPtr& type) const
     {
-        /*const auto f = FloatNavigator();
-        return type->getDescriptor() == type::Descriptor::eDouble || f.fullfillsType(type);*/
-        return false;
+        return type->getDescriptor() == type::Descriptor::eDouble;
     }
 
     type::VariantPtr Double::recalculateType() const
     {
-        //return std::make_shared<typenavigator::DoubleNavigator>(getPath());
-        return nullptr;
+        return std::make_shared<type::Double>(getPath());
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h
index cf02c8e4ef5e50d8e78697e553c271d09cc51a6a..3149e996133279215e7d8d76d0ac5ab8c5113707 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h
@@ -59,10 +59,10 @@ namespace armarx::aron::data
         data::dto::AronDoublePtr toAronDoublePtr() const;
 
         /* virtual implementations */
-        virtual std::string getShortName() const override;
-        virtual std::string getFullName() const override;
+        std::string getShortName() const override;
+        std::string getFullName() const override;
 
-        virtual type::VariantPtr recalculateType() const override;
-        virtual bool fullfillsType(const type::VariantPtr&) const override;
+        type::VariantPtr recalculateType() const override;
+        bool fullfillsType(const type::VariantPtr&) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp
index b00a40215bba8f865ff36d5651452bbf963b4954..712e5bf686a6403831a9212861fda202b04d0843 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp
@@ -91,13 +91,11 @@ namespace armarx::aron::data
 
     bool Float::fullfillsType(const type::VariantPtr& type) const
     {
-        //return type->getDescriptor() == type::Descriptor::eFloat;
-        return false;
+        return type->getDescriptor() == type::Descriptor::eFloat;
     }
 
     type::VariantPtr Float::recalculateType() const
     {
-        //return std::make_shared<typenavigator::FloatNavigator>(getPath());
-        return nullptr;
+        return std::make_shared<type::Float>(getPath());
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h
index 925fdcae00351b5b916d72ca91db7fc1ebca22eb..71187edf435a052d875ad8ae6c8ed3f6c6d6dd02 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h
@@ -59,10 +59,10 @@ namespace armarx::aron::data
         data::dto::AronFloatPtr toAronFloatPtr() const;
 
         /* virtual implementations */
-        virtual std::string getShortName() const override;
-        virtual std::string getFullName() const override;
+        std::string getShortName() const override;
+        std::string getFullName() const override;
 
-        virtual type::VariantPtr recalculateType() const override;
-        virtual bool fullfillsType(const type::VariantPtr&) const override;
+        type::VariantPtr recalculateType() const override;
+        bool fullfillsType(const type::VariantPtr&) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp
index da8ce3f4da647e29379848ba7bd3eb8975689c74..f2670889c9c2310a788fdab0ceeac9bdd768b8cc 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp
@@ -94,13 +94,11 @@ namespace armarx::aron::data
 
     bool Int::fullfillsType(const type::VariantPtr& type) const
     {
-        //return type->getDescriptor() == type::Descriptor::eInt || type->getDescriptor() == type::Descriptor::eIntEnum;
-        return false;
+        return type->getDescriptor() == type::Descriptor::eInt || type->getDescriptor() == type::Descriptor::eIntEnum;
     }
 
     type::VariantPtr Int::recalculateType() const
     {
-        //return std::make_shared<typenavigator::IntNavigator>(getPath());
-        return nullptr;
+        return std::make_shared<type::Int>(getPath());
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h
index 2ccb032e64eb518442468625b7013adddfdbe9d2..f2324a7e040828a5917dfcad8cbe69e1277b4fef 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h
@@ -31,6 +31,7 @@
 
 // ArmarX
 #include "../../../type/variant/primitive/Int.h"
+#include "../../../type/variant/enum/IntEnum.h"
 
 namespace armarx::aron::data
 {
@@ -59,10 +60,10 @@ namespace armarx::aron::data
         data::dto::AronIntPtr toAronIntPtr() const;
 
         /* virtual implementations */
-        virtual std::string getShortName() const override;
-        virtual std::string getFullName() const override;
+        std::string getShortName() const override;
+        std::string getFullName() const override;
 
-        virtual type::VariantPtr recalculateType() const override;
-        virtual bool fullfillsType(const type::VariantPtr&) const override;
+        type::VariantPtr recalculateType() const override;
+        bool fullfillsType(const type::VariantPtr&) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp
index 38503db1b5bf414abdcc6dff2c9c252a52c7eaa0..8393743c71497be7470f81e5444210fc6dc226f0 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp
@@ -95,14 +95,11 @@ namespace armarx::aron::data
 
     bool Long::fullfillsType(const type::VariantPtr& type) const
     {
-        /*const auto i = IntNavigator();
-        return type->getDescriptor() == type::Descriptor::eLong || type->getDescriptor() == type::Descriptor::eTime || i.fullfillsType(type); */
-        return false;
+        return type->getDescriptor() == type::Descriptor::eLong || type->getDescriptor() == type::Descriptor::eTime;
     }
 
     type::VariantPtr Long::recalculateType() const
     {
-        //return std::make_shared<typenavigator::LongNavigator>(getPath());
-        return nullptr;
+        return std::make_shared<type::Long>(getPath());
     }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h
index d14335b6267f4ee07d39be65dfa03d5645369f2f..813a63228051b9e29b87ee69fb2d029a5c1d0198 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h
@@ -60,10 +60,10 @@ namespace armarx::aron::data
         data::dto::AronLongPtr toAronLongPtr() const;
 
         /* virtual implementations */
-        virtual std::string getShortName() const override;
-        virtual std::string getFullName() const override;
+        std::string getShortName() const override;
+        std::string getFullName() const override;
 
-        virtual type::VariantPtr recalculateType() const override;
-        virtual bool fullfillsType(const type::VariantPtr&) const override;
+        type::VariantPtr recalculateType() const override;
+        bool fullfillsType(const type::VariantPtr&) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h b/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h
index 88f67acbc8444e6956da7f7a234541a4b854167c..b049fd36e067e83766436e868fba1044d939b281 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h
@@ -59,10 +59,10 @@ namespace armarx::aron::data
         data::dto::AronStringPtr toAronStringPtr() const;
 
         /* virtual implementations */
-        virtual std::string getShortName() const override;
-        virtual std::string getFullName() const override;
+        std::string getShortName() const override;
+        std::string getFullName() const override;
 
-        virtual type::VariantPtr recalculateType() const override;
-        virtual bool fullfillsType(const type::VariantPtr&) const override;
+        type::VariantPtr recalculateType() const override;
+        bool fullfillsType(const type::VariantPtr&) const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h b/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h
index 2cb8658dba91ffb333f91d62ef318af7e5387955..c5c729c3c61394663a1790e290d24a9b99dbb402 100644
--- a/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h
@@ -191,8 +191,11 @@ namespace armarx::aron::data
         using Input = typename VisitorBase<T>::Input;
         using InputNonConst = typename std::remove_const<Input>::type;
 
-        virtual std::map<std::string, InputNonConst> getDictElements(Input&) = 0;
-        virtual std::vector<InputNonConst> getListElements(Input&) = 0;
+        using MapElements = std::map<std::string, InputNonConst>;
+        using ListElements = std::vector<InputNonConst>;
+
+        virtual MapElements getDictElements(Input&) = 0;
+        virtual ListElements getListElements(Input&) = 0;
 
         virtual void visitDictOnEnter(Input& element) {};
         virtual void visitDictOnExit(Input& element) {};
@@ -222,11 +225,16 @@ namespace armarx::aron::data
         using TypeInputNonConst = typename std::remove_const<TypeInput>::type;
         using DataInputNonConst = typename std::remove_const<DataInput>::type;
 
-        virtual std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>> getObjectElements(DataInput&, TypeInput&) = 0;
-        virtual std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>> getDictElements(DataInput&, TypeInput&) = 0;
-        virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getListElements(DataInput&, TypeInput&) = 0;
-        virtual std::pair<std::pair<DataInputNonConst, TypeInputNonConst>, std::pair<DataInputNonConst, TypeInputNonConst>> getPairElements(DataInput&, TypeInput&) = 0;
-        virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getTupleElements(DataInput&, TypeInput&) = 0;
+        using MapElements = std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>>;
+        using ListElements = std::vector<std::pair<DataInputNonConst, TypeInputNonConst>>;
+        using PairElements = std::pair<std::pair<DataInputNonConst, TypeInputNonConst>, std::pair<DataInputNonConst, TypeInputNonConst>>;
+        using TupleElements = std::vector<std::pair<DataInputNonConst, TypeInputNonConst>>;
+
+        virtual MapElements getObjectElements(DataInput&, TypeInput&) = 0;
+        virtual MapElements getDictElements(DataInput&, TypeInput&) = 0;
+        virtual ListElements getListElements(DataInput&, TypeInput&) = 0;
+        virtual PairElements getPairElements(DataInput&, TypeInput&) = 0;
+        virtual TupleElements getTupleElements(DataInput&, TypeInput&) = 0;
 
         virtual void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) {};
         virtual void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) {};
diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
index 6b2175d223a59338b77521a0f07c289ce598eca9..623356c73972c6bd086d4f23e80a8fa5a6901524 100644
--- a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
@@ -26,5 +26,18 @@
 
 namespace armarx::aron::data
 {
+    data::Descriptor ConstNlohmannJSONVisitor::GetDescriptor(Input& n)
+    {
+        if (n == nlohmann::json())
+        {
+            return data::Descriptor::eUnknown;
+        }
+        std::string t = n[armarx::aron::data::rw::json::constantes::TYPE_SLUG];
+        return armarx::aron::data::rw::json::conversion::String2Descriptor.at(t);
+    }
 
+    data::Descriptor ConstNlohmannJSONVisitor::getDescriptor(Input& n)
+    {
+        return GetDescriptor(n);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.h b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.h
index 7ff87236d2aa6221543bb488e7ec616599931bf2..1b83bc3ca472d490c894d1dd9f94e50beec723e7 100644
--- a/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/data/visitor/nlohmannJSON/NlohmannJSONVisitor.h
@@ -31,7 +31,6 @@
 #include <SimoxUtility/json.h>
 
 #include "../Visitor.h"
-#include "../../../Descriptor.h"
 #include "../../rw/json/Data.h"
 
 namespace armarx::aron::data
@@ -41,16 +40,8 @@ namespace armarx::aron::data
      */
     struct ConstNlohmannJSONVisitor : virtual public Visitor<const nlohmann::json>
     {
-        virtual data::Descriptor getDescriptor(Input& n) override
-        {
-            if (n == nlohmann::json())
-            {
-                return data::Descriptor::eUnknown;
-            }
-            std::string t = n[armarx::aron::data::rw::json::constantes::TYPE_SLUG];
-            return armarx::aron::data::rw::json::conversion::String2Descriptor.at(t);
-        }
-
+        static data::Descriptor GetDescriptor(Input& n);
+        data::Descriptor getDescriptor(Input& n) override;
         virtual ~ConstNlohmannJSONVisitor() = default;
     };
 
diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.cpp b/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.cpp
index 005f9110566e3e90b6cd28d88d688ad00b51a09c..778cc64395e305578249cf115e86da6c2ce1d227 100644
--- a/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.cpp
@@ -24,7 +24,798 @@
 // Header
 #include "VariantVisitor.h"
 
+#include "../../variant/All.h"
+#include "../../../type/visitor/variant/VariantVisitor.h"
+
 namespace armarx::aron::data
 {
+    /****************************************************************************
+     * ConstVariantVisitor
+     ***************************************************************************/
+    data::Descriptor ConstVariantVisitor::GetDescriptor(Input& n)
+    {
+        if (!n)
+        {
+            return data::Descriptor::eUnknown;
+        }
+        return n->getDescriptor();
+    }
+
+    data::Descriptor ConstVariantVisitor::getDescriptor(Input& n)
+    {
+        return GetDescriptor(n);
+    }
+
+    void ConstVariantVisitor::visitDict(Input& i)
+    {
+        auto aron = data::Dict::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitList(Input& i)
+    {
+        auto aron = data::List::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitNDArray(Input& i)
+    {
+        auto aron = data::NDArray::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitInt(Input& i)
+    {
+        auto aron = data::Int::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitLong(Input& i)
+    {
+        auto aron = data::Long::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitFloat(Input& i)
+    {
+        auto aron = data::Float::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitDouble(Input& i)
+    {
+        auto aron = data::Double::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitBool(Input& i)
+    {
+        auto aron = data::Bool::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitString(Input& i)
+    {
+        auto aron = data::String::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void ConstVariantVisitor::visitAronVariant(const data::DictPtr&) {}
+    void ConstVariantVisitor::visitAronVariant(const data::ListPtr&) {}
+    void ConstVariantVisitor::visitAronVariant(const data::NDArrayPtr&) {}
+    void ConstVariantVisitor::visitAronVariant(const data::IntPtr&) {}
+    void ConstVariantVisitor::visitAronVariant(const data::LongPtr&) {}
+    void ConstVariantVisitor::visitAronVariant(const data::FloatPtr&) {}
+    void ConstVariantVisitor::visitAronVariant(const data::DoublePtr&) {}
+    void ConstVariantVisitor::visitAronVariant(const data::BoolPtr&) {}
+    void ConstVariantVisitor::visitAronVariant(const data::StringPtr&) {}
+
+
+    /****************************************************************************
+     * ConstTypedVariantVisitor
+     ***************************************************************************/
+    type::Descriptor ConstTypedVariantVisitor::getDescriptor(TypeInput& n)
+    {
+        return type::ConstVariantVisitor::GetDescriptor(n);
+    }
+
+    void ConstTypedVariantVisitor::visitObject(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Dict::DynamicCastAndCheck(i);
+        auto t = type::Object::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitDict(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Dict::DynamicCastAndCheck(i);
+        auto t = type::Dict::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitPair(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::Pair::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitTuple(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::Tuple::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitList(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::List::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitMatrix(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Matrix::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitNDArray(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::NDArray::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitQuaternion(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Quaternion::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitOrientation(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Orientation::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitPosition(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Position::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitPose(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Pose::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitImage(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Image::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitPointCloud(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::PointCloud::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitIntEnum(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Int::DynamicCastAndCheck(i);
+        auto t = type::IntEnum::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitInt(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Int::DynamicCastAndCheck(i);
+        auto t = type::Int::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitLong(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Long::DynamicCastAndCheck(i);
+        auto t = type::Long::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitFloat(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Float::DynamicCastAndCheck(i);
+        auto t = type::Float::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitDouble(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Double::DynamicCastAndCheck(i);
+        auto t = type::Double::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitBool(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Bool::DynamicCastAndCheck(i);
+        auto t = type::Bool::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitString(DataInput& i, TypeInput& j)
+    {
+        auto d = data::String::DynamicCastAndCheck(i);
+        auto t = type::String::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitTime(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Long::DynamicCastAndCheck(i);
+        auto t = type::Time::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void ConstTypedVariantVisitor::visitAronVariant(const data::DictPtr&, const type::Object&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::DictPtr&, const type::Dict&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::ListPtr&, const type::List&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::ListPtr&, const type::Pair&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::ListPtr&, const type::Tuple&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Matrix&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::NDArray&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Quaternion&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Orientation&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Position&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Pose&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::PointCloud&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Image&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::IntPtr&, const type::IntEnum&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::IntPtr&, const type::Int&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::LongPtr&, const type::Long&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::LongPtr&, const type::Time&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::FloatPtr&, const type::Float&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::DoublePtr&, const type::Double&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::BoolPtr&, const type::Bool&) {}
+    void ConstTypedVariantVisitor::visitAronVariant(const data::StringPtr&, const type::String&) {}
+
+
+
+    /****************************************************************************
+     * RecursiveConstVariantVisitor
+     ***************************************************************************/
+    data::Descriptor RecursiveConstVariantVisitor::getDescriptor(Input& n)
+    {
+        return ConstVariantVisitor::GetDescriptor(n);
+    }
+
+    RecursiveConstVariantVisitor::MapElements RecursiveConstVariantVisitor::GetDictElements(Input& n)
+    {
+        auto x = data::Dict::DynamicCastAndCheck(n);
+        return x->getElements();
+    }
+
+    RecursiveConstVariantVisitor::MapElements RecursiveConstVariantVisitor::getDictElements(Input& n)
+    {
+        return GetDictElements(n);
+    }
+
+    RecursiveConstVariantVisitor::ListElements RecursiveConstVariantVisitor::GetListElements(Input& n)
+    {
+        auto x = data::List::DynamicCastAndCheck(n);
+        return x->getElements();
+    }
+
+    RecursiveConstVariantVisitor::ListElements RecursiveConstVariantVisitor::getListElements(Input& n)
+    {
+        return GetListElements(n);
+    }
+
+    void RecursiveConstVariantVisitor::visitDictOnEnter(Input& i)
+    {
+        auto aron = data::Dict::DynamicCastAndCheck(i);
+        visitAronVariantOnEnter(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitDictOnExit(Input& i)
+    {
+        auto aron = data::Dict::DynamicCastAndCheck(i);
+        visitAronVariantOnExit(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitListOnEnter(Input& i)
+    {
+        auto aron = data::List::DynamicCastAndCheck(i);
+        visitAronVariantOnEnter(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitListOnExit(Input& i)
+    {
+        auto aron = data::List::DynamicCastAndCheck(i);
+        visitAronVariantOnExit(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitNDArray(Input& i)
+    {
+        auto aron = data::NDArray::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitInt(Input& i)
+    {
+        auto aron = data::Int::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitLong(Input& i)
+    {
+        auto aron = data::Long::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitFloat(Input& i)
+    {
+        auto aron = data::Float::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitDouble(Input& i)
+    {
+        auto aron = data::Double::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitBool(Input& i)
+    {
+        auto aron = data::Bool::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitString(Input& i)
+    {
+        auto aron = data::String::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveConstVariantVisitor::visitAronVariantOnEnter(const data::DictPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariantOnEnter(const data::ListPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariantOnExit(const data::DictPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariantOnExit(const data::ListPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariant(const data::NDArrayPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariant(const data::IntPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariant(const data::LongPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariant(const data::FloatPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariant(const data::DoublePtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariant(const data::BoolPtr&) {}
+    void RecursiveConstVariantVisitor::visitAronVariant(const data::StringPtr&) {}
+
+
+
+    /****************************************************************************
+     * RecursiveVariantVisitor
+     ***************************************************************************/
+    data::Descriptor RecursiveVariantVisitor::getDescriptor(Input& n)
+    {
+        return ConstVariantVisitor::GetDescriptor(n);
+    }
+
+    std::map<std::string, RecursiveVariantVisitor::InputNonConst> RecursiveVariantVisitor::getDictElements(Input& n)
+    {
+        return RecursiveConstVariantVisitor::GetDictElements(n);
+    }
+
+    std::vector<RecursiveVariantVisitor::InputNonConst> RecursiveVariantVisitor::getListElements(Input& n)
+    {
+        return RecursiveConstVariantVisitor::GetListElements(n);
+    }
+
+    void RecursiveVariantVisitor::visitDictOnEnter(Input& i)
+    {
+        auto aron = data::Dict::DynamicCastAndCheck(i);
+        visitAronVariantOnEnter(aron);
+    }
+
+    void RecursiveVariantVisitor::visitDictOnExit(Input& i)
+    {
+        auto aron = data::Dict::DynamicCastAndCheck(i);
+        visitAronVariantOnExit(aron);
+    }
+
+    void RecursiveVariantVisitor::visitListOnEnter(Input& i)
+    {
+        auto aron = data::List::DynamicCastAndCheck(i);
+        visitAronVariantOnEnter(aron);
+    }
+
+    void RecursiveVariantVisitor::visitListOnExit(Input& i)
+    {
+        auto aron = data::List::DynamicCastAndCheck(i);
+        visitAronVariantOnExit(aron);
+    }
+
+    void RecursiveVariantVisitor::visitNDArray(Input& i)
+    {
+        auto aron = data::NDArray::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveVariantVisitor::visitInt(Input& i)
+    {
+        auto aron = data::Int::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveVariantVisitor::visitLong(Input& i)
+    {
+        auto aron = data::Long::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveVariantVisitor::visitFloat(Input& i)
+    {
+        auto aron = data::Float::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveVariantVisitor::visitDouble(Input& i)
+    {
+        auto aron = data::Double::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveVariantVisitor::visitBool(Input& i)
+    {
+        auto aron = data::Bool::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveVariantVisitor::visitString(Input& i)
+    {
+        auto aron = data::String::DynamicCastAndCheck(i);
+        visitAronVariant(aron);
+    }
+
+    void RecursiveVariantVisitor::visitAronVariantOnEnter(data::DictPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariantOnEnter(data::ListPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariantOnExit(data::DictPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariantOnExit(data::ListPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariant(data::NDArrayPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariant(data::IntPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariant(data::LongPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariant(data::FloatPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariant(data::DoublePtr&) {}
+    void RecursiveVariantVisitor::visitAronVariant(data::BoolPtr&) {}
+    void RecursiveVariantVisitor::visitAronVariant(data::StringPtr&) {}
+
+
+    /****************************************************************************
+     * RecursiveConstTypedVariantVisitor
+     ***************************************************************************/
+    type::Descriptor RecursiveConstTypedVariantVisitor::getDescriptor(TypeInput& n)
+    {
+        return type::ConstVariantVisitor::GetDescriptor(n);
+    }
+
+    RecursiveConstTypedVariantVisitor::MapElements
+    RecursiveConstTypedVariantVisitor::GetObjectElements(DataInput& o, TypeInput& t)
+    {
+        std::map<std::string, std::pair<data::VariantPtr, type::VariantPtr>> ret;
+        auto x = data::Dict::DynamicCastAndCheck(o);
+        auto y = type::Object::DynamicCastAndCheck(t);
+        for (const auto& [key, e] : x->getElements())
+        {
+            auto ct = y->getMemberType(key);
+            ret.insert({key, {e, ct}});
+        }
+        return ret;
+    }
+
+    RecursiveConstTypedVariantVisitor::MapElements
+    RecursiveConstTypedVariantVisitor::GetDictElements(DataInput& o, TypeInput& t)
+    {
+        std::map<std::string, std::pair<data::VariantPtr, type::VariantPtr>> ret;
+        auto x = data::Dict::DynamicCastAndCheck(o);
+        auto y = type::Dict::DynamicCastAndCheck(t);
+        auto ac = y->getAcceptedType();
+
+        for (const auto& [key, e] : x->getElements())
+        {
+            ret.insert({key, {e, ac}});
+        }
+        return ret;
+    }
+
+    RecursiveConstTypedVariantVisitor::ListElements
+    RecursiveConstTypedVariantVisitor::GetListElements(DataInput& o, TypeInput& t)
+    {
+        std::vector<std::pair<data::VariantPtr, type::VariantPtr>> ret;
+        auto x = data::List::DynamicCastAndCheck(o);
+        auto y = type::List::DynamicCastAndCheck(t);
+        auto ac = y->getAcceptedType();
+
+        for (const auto& e : x->getElements())
+        {
+            ret.push_back({e, ac});
+        }
+        return ret;
+    }
+
+    RecursiveConstTypedVariantVisitor::PairElements
+    RecursiveConstTypedVariantVisitor::GetPairElements(DataInput& o, TypeInput& t)
+    {
+        auto x = data::List::DynamicCastAndCheck(o);
+        auto y = type::Pair::DynamicCastAndCheck(t);
+
+        auto e0 = x->getElement(0);
+        auto ac0 = y->getFirstAcceptedType();
+        auto e1 = x->getElement(1);
+        auto ac1 = y->getSecondAcceptedType();
+        return {{e0, ac0}, {e1, ac1}};
+    }
+
+    RecursiveConstTypedVariantVisitor::TupleElements
+    RecursiveConstTypedVariantVisitor::GetTupleElements(DataInput& o, TypeInput& t)
+    {
+        std::vector<std::pair<data::VariantPtr, type::VariantPtr>> ret;
+        auto x = data::List::DynamicCastAndCheck(o);
+        auto y = type::Tuple::DynamicCastAndCheck(t);
+
+        unsigned int i = 0;
+        for (const auto& e : x->getElements())
+        {
+            auto ac = y->getAcceptedType(i++);
+            ret.push_back({e, ac});
+        }
+        return ret;
+    }
+
+    RecursiveConstTypedVariantVisitor::MapElements
+    RecursiveConstTypedVariantVisitor::getObjectElements(DataInput& o, TypeInput& t)
+    {
+        return GetObjectElements(o, t);
+    }
+
+    RecursiveConstTypedVariantVisitor::MapElements
+    RecursiveConstTypedVariantVisitor::getDictElements(DataInput& o, TypeInput& t)
+    {
+        return GetDictElements(o, t);
+    }
+
+    RecursiveConstTypedVariantVisitor::ListElements
+    RecursiveConstTypedVariantVisitor::getListElements(DataInput& o, TypeInput& t)
+    {
+        return GetListElements(o, t);
+    }
+
+    RecursiveConstTypedVariantVisitor::PairElements
+    RecursiveConstTypedVariantVisitor::getPairElements(DataInput& o, TypeInput& t)
+    {
+        return GetPairElements(o, t);
+    }
+
+    RecursiveConstTypedVariantVisitor::TupleElements
+    RecursiveConstTypedVariantVisitor::getTupleElements(DataInput& o, TypeInput& t)
+    {
+        return GetTupleElements(o, t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitObjectOnEnter(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Dict::DynamicCastAndCheck(i);
+        auto t = type::Object::DynamicCastAndCheck(j);
+        visitAronVariantOnEnter(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitDictOnEnter(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Dict::DynamicCastAndCheck(i);
+        auto t = type::Dict::DynamicCastAndCheck(j);
+        visitAronVariantOnEnter(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitPairOnEnter(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::Pair::DynamicCastAndCheck(j);
+        visitAronVariantOnEnter(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitTupleOnEnter(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::Tuple::DynamicCastAndCheck(j);
+        visitAronVariantOnEnter(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitListOnEnter(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::List::DynamicCastAndCheck(j);
+        visitAronVariantOnEnter(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitObjectOnExit(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Dict::DynamicCastAndCheck(i);
+        auto t = type::Object::DynamicCastAndCheck(j);
+        visitAronVariantOnExit(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitDictOnExit(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Dict::DynamicCastAndCheck(i);
+        auto t = type::Dict::DynamicCastAndCheck(j);
+        visitAronVariantOnExit(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitPairOnExit(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::Pair::DynamicCastAndCheck(j);
+        visitAronVariantOnExit(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitTupleOnExit(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::Tuple::DynamicCastAndCheck(j);
+        visitAronVariantOnExit(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitListOnExit(DataInput& i, TypeInput& j)
+    {
+        auto d = data::List::DynamicCastAndCheck(i);
+        auto t = type::List::DynamicCastAndCheck(j);
+        visitAronVariantOnExit(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitMatrix(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Matrix::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitNDArray(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::NDArray::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitQuaternion(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Quaternion::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitOrientation(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Orientation::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitPosition(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Position::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitPose(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Pose::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitImage(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::Image::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitPointCloud(DataInput& i, TypeInput& j)
+    {
+        auto d = data::NDArray::DynamicCastAndCheck(i);
+        auto t = type::PointCloud::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitIntEnum(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Int::DynamicCastAndCheck(i);
+        auto t = type::IntEnum::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitInt(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Int::DynamicCastAndCheck(i);
+        auto t = type::Int::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitLong(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Long::DynamicCastAndCheck(i);
+        auto t = type::Long::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitFloat(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Float::DynamicCastAndCheck(i);
+        auto t = type::Float::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitDouble(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Double::DynamicCastAndCheck(i);
+        auto t = type::Double::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitBool(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Bool::DynamicCastAndCheck(i);
+        auto t = type::Bool::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitString(DataInput& i, TypeInput& j)
+    {
+        auto d = data::String::DynamicCastAndCheck(i);
+        auto t = type::String::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
+    void RecursiveConstTypedVariantVisitor::visitTime(DataInput& i, TypeInput& j)
+    {
+        auto d = data::Long::DynamicCastAndCheck(i);
+        auto t = type::Time::DynamicCastAndCheck(j);
+        visitAronVariant(d, *t);
+    }
+
 
+    // see above
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::DictPtr&, const type::Object&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::DictPtr&, const type::Dict&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::ListPtr&, const type::List&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::ListPtr&, const type::Pair&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnEnter(const data::ListPtr&, const type::Tuple&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::DictPtr&, const type::Object&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::DictPtr&, const type::Dict&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::ListPtr&, const type::List&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::ListPtr&, const type::Pair&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariantOnExit(const data::ListPtr&, const type::Tuple&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Matrix&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::NDArray&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Quaternion&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Orientation&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Position&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Pose&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::PointCloud&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::NDArrayPtr&, const type::Image&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::IntPtr&, const type::IntEnum&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::IntPtr&, const type::Int&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::LongPtr&, const type::Long&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::LongPtr&, const type::Time&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::FloatPtr&, const type::Float&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::DoublePtr&, const type::Double&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::BoolPtr&, const type::Bool&) {}
+    void RecursiveConstTypedVariantVisitor::visitAronVariant(const data::StringPtr&, const type::String&) {}
 }
diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h b/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h
index c0e3f66e6bd0d85e1100ea241d6cc415ec0496b4..e1ffd36fa4f4e4a72f8c5fc9d2b6d9f70ff80e77 100644
--- a/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h
@@ -28,7 +28,8 @@
 #include <vector>
 
 #include "../RecursiveVisitor.h"
-#include "../../variant/All.h"
+#include "../../variant/forward_declarations.h"
+#include "../../../type/variant/forward_declarations.h"
 
 namespace armarx::aron::data
 {
@@ -37,16 +38,32 @@ namespace armarx::aron::data
      */
     struct ConstVariantVisitor : virtual public Visitor<const data::VariantPtr>
     {
-        virtual data::Descriptor getDescriptor(Input& n) override
-        {
-            if (!n)
-            {
-                return data::Descriptor::eUnknown;
-            }
-            return n->getDescriptor();
-        }
-
+        static data::Descriptor GetDescriptor(Input& n);
+        data::Descriptor getDescriptor(Input& n) override;
         virtual ~ConstVariantVisitor() = default;
+
+        // Already implemented so that they cast the input and call specilized method below
+        // Override if you do not want to use the specialized methods
+        void visitDict(Input& i) override;
+        void visitList(Input& i) override;
+        void visitNDArray(Input& i) override;
+        void visitInt(Input& i) override;
+        void visitLong(Input& i) override;
+        void visitFloat(Input& i) override;
+        void visitDouble(Input& i) override;
+        void visitBool(Input& i) override;
+        void visitString(Input& i) override;
+
+        // Use these if you do not want to cast manually
+        virtual void visitAronVariant(const data::DictPtr&);
+        virtual void visitAronVariant(const data::ListPtr&);
+        virtual void visitAronVariant(const data::NDArrayPtr&);
+        virtual void visitAronVariant(const data::IntPtr&);
+        virtual void visitAronVariant(const data::LongPtr&);
+        virtual void visitAronVariant(const data::FloatPtr&);
+        virtual void visitAronVariant(const data::DoublePtr&);
+        virtual void visitAronVariant(const data::BoolPtr&);
+        virtual void visitAronVariant(const data::StringPtr&);
     };
 
     /**
@@ -54,16 +71,54 @@ namespace armarx::aron::data
      */
     struct ConstTypedVariantVisitor : virtual public TypedVisitor<const data::VariantPtr, const type::VariantPtr>
     {
-        virtual type::Descriptor getDescriptor(TypeInput& n) override
-        {
-            if (!n)
-            {
-                return type::Descriptor::eUnknown;
-            }
-            return n->getDescriptor();
-        }
-
+        type::Descriptor getDescriptor(TypeInput& n) override;
         virtual ~ConstTypedVariantVisitor() = default;
+
+        // see above
+        void visitObject(DataInput& i, TypeInput& j) override;
+        void visitDict(DataInput&, TypeInput&) override;
+        void visitPair(DataInput&, TypeInput&) override;
+        void visitTuple(DataInput&, TypeInput&) override;
+        void visitList(DataInput&, TypeInput&) override;
+        void visitMatrix(DataInput&, TypeInput&) override;
+        void visitNDArray(DataInput&, TypeInput&) override;
+        void visitQuaternion(DataInput&, TypeInput&) override;
+        void visitOrientation(DataInput&, TypeInput&) override;
+        void visitPosition(DataInput&, TypeInput&) override;
+        void visitPose(DataInput&, TypeInput&) override;
+        void visitImage(DataInput&, TypeInput&) override;
+        void visitPointCloud(DataInput&, TypeInput&) override;
+        void visitIntEnum(DataInput&, TypeInput&) override;
+        void visitInt(DataInput&, TypeInput&) override;
+        void visitLong(DataInput&, TypeInput&) override;
+        void visitFloat(DataInput&, TypeInput&) override;
+        void visitDouble(DataInput&, TypeInput&) override;
+        void visitBool(DataInput&, TypeInput&) override;
+        void visitString(DataInput&, TypeInput&) override;
+        void visitTime(DataInput&, TypeInput&) override;
+
+        // see above
+        virtual void visitAronVariant(const data::DictPtr&, const type::Object&);
+        virtual void visitAronVariant(const data::DictPtr&, const type::Dict&);
+        virtual void visitAronVariant(const data::ListPtr&, const type::List&);
+        virtual void visitAronVariant(const data::ListPtr&, const type::Pair&);
+        virtual void visitAronVariant(const data::ListPtr&, const type::Tuple&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Matrix&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::NDArray&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Quaternion&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Orientation&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Position&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Pose&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::PointCloud&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Image&);
+        virtual void visitAronVariant(const data::IntPtr&, const type::IntEnum&);
+        virtual void visitAronVariant(const data::IntPtr&, const type::Int&);
+        virtual void visitAronVariant(const data::LongPtr&, const type::Long&);
+        virtual void visitAronVariant(const data::LongPtr&, const type::Time&);
+        virtual void visitAronVariant(const data::FloatPtr&, const type::Float&);
+        virtual void visitAronVariant(const data::DoublePtr&, const type::Double&);
+        virtual void visitAronVariant(const data::BoolPtr&, const type::Bool&);
+        virtual void visitAronVariant(const data::StringPtr&, const type::String&);
     };
 
     /**
@@ -71,28 +126,36 @@ namespace armarx::aron::data
      */
     struct RecursiveConstVariantVisitor : virtual public RecursiveVisitor<const data::VariantPtr>
     {
-        virtual data::Descriptor getDescriptor(Input& n) override
-        {
-            if (!n)
-            {
-                return data::Descriptor::eUnknown;
-            }
-            return n->getDescriptor();
-        }
-
-        virtual std::map<std::string, InputNonConst> getDictElements(Input& n) override
-        {
-            auto x = data::Dict::DynamicCastAndCheck(n);
-            return x->getElements();
-        }
-
-        virtual std::vector<InputNonConst> getListElements(Input& n) override
-        {
-            auto x = data::List::DynamicCastAndCheck(n);
-            return x->getElements();
-        }
-
+        data::Descriptor getDescriptor(Input& n) override;
+        static MapElements GetDictElements(Input& n);
+        MapElements getDictElements(Input& n) override;
+        static ListElements GetListElements(Input& n);
+        ListElements getListElements(Input& n) override;
         virtual ~RecursiveConstVariantVisitor() = default;
+
+        void visitDictOnEnter(Input& i) override;
+        void visitDictOnExit(Input& i) override;
+        void visitListOnEnter(Input& i) override;
+        void visitListOnExit(Input& i) override;
+        void visitNDArray(Input& i) override;
+        void visitInt(Input& i) override;
+        void visitLong(Input& i) override;
+        void visitFloat(Input& i) override;
+        void visitDouble(Input& i) override;
+        void visitBool(Input& i) override;
+        void visitString(Input& i) override;
+
+        virtual void visitAronVariantOnEnter(const data::DictPtr&);
+        virtual void visitAronVariantOnExit(const data::DictPtr&);
+        virtual void visitAronVariantOnEnter(const data::ListPtr&);
+        virtual void visitAronVariantOnExit(const data::ListPtr&);
+        virtual void visitAronVariant(const data::NDArrayPtr&);
+        virtual void visitAronVariant(const data::IntPtr&);
+        virtual void visitAronVariant(const data::LongPtr&);
+        virtual void visitAronVariant(const data::FloatPtr&);
+        virtual void visitAronVariant(const data::DoublePtr&);
+        virtual void visitAronVariant(const data::BoolPtr&);
+        virtual void visitAronVariant(const data::StringPtr&);
     };
 
     /**
@@ -100,28 +163,34 @@ namespace armarx::aron::data
      */
     struct RecursiveVariantVisitor : virtual public RecursiveVisitor<data::VariantPtr>
     {
-        virtual data::Descriptor getDescriptor(Input& n) override
-        {
-            if (!n)
-            {
-                return data::Descriptor::eUnknown;
-            }
-            return n->getDescriptor();
-        }
-
-        virtual std::map<std::string, InputNonConst> getDictElements(Input& n) override
-        {
-            auto x = data::Dict::DynamicCastAndCheck(n);
-            return x->getElements();
-        }
-
-        virtual std::vector<InputNonConst> getListElements(Input& n) override
-        {
-            auto x = data::List::DynamicCastAndCheck(n);
-            return x->getElements();
-        }
-
+        data::Descriptor getDescriptor(Input& n) override;
+        std::map<std::string, InputNonConst> getDictElements(Input& n) override;
+        std::vector<InputNonConst> getListElements(Input& n) override;
         virtual ~RecursiveVariantVisitor() = default;
+
+        void visitDictOnEnter(Input& i) override;
+        void visitDictOnExit(Input& i) override;
+        void visitListOnEnter(Input& i) override;
+        void visitListOnExit(Input& i) override;
+        void visitNDArray(Input& i) override;
+        void visitInt(Input& i) override;
+        void visitLong(Input& i) override;
+        void visitFloat(Input& i) override;
+        void visitDouble(Input& i) override;
+        void visitBool(Input& i) override;
+        void visitString(Input& i) override;
+
+        virtual void visitAronVariantOnEnter(data::DictPtr&);
+        virtual void visitAronVariantOnExit(data::DictPtr&);
+        virtual void visitAronVariantOnEnter(data::ListPtr&);
+        virtual void visitAronVariantOnExit(data::ListPtr&);
+        virtual void visitAronVariant(data::NDArrayPtr&);
+        virtual void visitAronVariant(data::IntPtr&);
+        virtual void visitAronVariant(data::LongPtr&);
+        virtual void visitAronVariant(data::FloatPtr&);
+        virtual void visitAronVariant(data::DoublePtr&);
+        virtual void visitAronVariant(data::BoolPtr&);
+        virtual void visitAronVariant(data::StringPtr&);
     };
 
     /**
@@ -129,80 +198,74 @@ namespace armarx::aron::data
      */
     struct RecursiveConstTypedVariantVisitor : virtual public RecursiveTypedVisitor<const data::VariantPtr, const type::VariantPtr>
     {
-        virtual type::Descriptor getDescriptor(TypeInput& n) override
-        {
-            if (!n)
-            {
-                return type::Descriptor::eUnknown;
-            }
-            return n->getDescriptor();
-        }
-
-        virtual std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>> getObjectElements(DataInput& o, TypeInput& t) override
-        {
-            std::map<std::string, std::pair<data::VariantPtr, type::VariantPtr>> ret;
-            auto x = data::Dict::DynamicCastAndCheck(o);
-            auto y = type::Object::DynamicCastAndCheck(t);
-            for (const auto& [key, e] : x->getElements())
-            {
-                auto ct = y->getMemberType(key);
-                ret.insert({key, {e, ct}});
-            }
-            return ret;
-        }
-        virtual std::map<std::string, std::pair<DataInputNonConst, TypeInputNonConst>> getDictElements(DataInput& o, TypeInput& t) override
-        {
-            std::map<std::string, std::pair<data::VariantPtr, type::VariantPtr>> ret;
-            auto x = data::Dict::DynamicCastAndCheck(o);
-            auto y = type::Dict::DynamicCastAndCheck(t);
-            auto ac = y->getAcceptedType();
-
-            for (const auto& [key, e] : x->getElements())
-            {
-                ret.insert({key, {e, ac}});
-            }
-            return ret;
-        }
-        virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getListElements(DataInput& o, TypeInput& t) override
-        {
-            std::vector<std::pair<data::VariantPtr, type::VariantPtr>> ret;
-            auto x = data::List::DynamicCastAndCheck(o);
-            auto y = type::List::DynamicCastAndCheck(t);
-            auto ac = y->getAcceptedType();
-
-            for (const auto& e : x->getElements())
-            {
-                ret.push_back({e, ac});
-            }
-            return ret;
-        }
-        virtual std::pair<std::pair<DataInputNonConst, TypeInputNonConst>, std::pair<DataInputNonConst, TypeInputNonConst>>
-        getPairElements(DataInput& o, TypeInput& t) override
-        {
-            auto x = data::List::DynamicCastAndCheck(o);
-            auto y = type::Pair::DynamicCastAndCheck(t);
-
-            auto e0 = x->getElement(0);
-            auto ac0 = y->getFirstAcceptedType();
-            auto e1 = x->getElement(1);
-            auto ac1 = y->getSecondAcceptedType();
-            return {{e0, ac0}, {e1, ac1}};
-        }
-        virtual std::vector<std::pair<DataInputNonConst, TypeInputNonConst>> getTupleElements(DataInput& o, TypeInput& t) override
-        {
-            std::vector<std::pair<data::VariantPtr, type::VariantPtr>> ret;
-            auto x = data::List::DynamicCastAndCheck(o);
-            auto y = type::Tuple::DynamicCastAndCheck(t);
-
-            unsigned int i = 0;
-            for (const auto& e : x->getElements())
-            {
-                auto ac = y->getAcceptedType(i++);
-                ret.push_back({e, ac});
-            }
-            return ret;
-        }
+        type::Descriptor getDescriptor(TypeInput& n) override;
+        static MapElements GetObjectElements(DataInput& o, TypeInput& t);
+        static MapElements GetDictElements(DataInput& o, TypeInput& t);
+        static ListElements GetListElements(DataInput& o, TypeInput& t);
+        static PairElements GetPairElements(DataInput& o, TypeInput& t);
+        static TupleElements GetTupleElements(DataInput& o, TypeInput& t);
 
+        MapElements getObjectElements(DataInput& o, TypeInput& t) override;
+        MapElements getDictElements(DataInput& o, TypeInput& t) override;
+        ListElements getListElements(DataInput& o, TypeInput& t) override;
+        PairElements getPairElements(DataInput& o, TypeInput& t) override;
+        TupleElements getTupleElements(DataInput& o, TypeInput& t) override;
         virtual ~RecursiveConstTypedVariantVisitor() = default;
+
+        // see above
+        void visitObjectOnEnter(DataInput&, TypeInput&) override;
+        void visitDictOnEnter(DataInput&, TypeInput&) override;
+        void visitPairOnEnter(DataInput&, TypeInput&) override;
+        void visitTupleOnEnter(DataInput&, TypeInput&) override;
+        void visitListOnEnter(DataInput&, TypeInput&) override;
+        void visitObjectOnExit(DataInput& i, TypeInput& j) override;
+        void visitDictOnExit(DataInput&, TypeInput&) override;
+        void visitPairOnExit(DataInput&, TypeInput&) override;
+        void visitTupleOnExit(DataInput&, TypeInput&) override;
+        void visitListOnExit(DataInput&, TypeInput&) override;
+        void visitMatrix(DataInput&, TypeInput&) override;
+        void visitNDArray(DataInput&, TypeInput&) override;
+        void visitQuaternion(DataInput&, TypeInput&) override;
+        void visitOrientation(DataInput&, TypeInput&) override;
+        void visitPosition(DataInput&, TypeInput&) override;
+        void visitPose(DataInput&, TypeInput&) override;
+        void visitImage(DataInput&, TypeInput&) override;
+        void visitPointCloud(DataInput&, TypeInput&) override;
+        void visitIntEnum(DataInput&, TypeInput&) override;
+        void visitInt(DataInput&, TypeInput&) override;
+        void visitLong(DataInput&, TypeInput&) override;
+        void visitFloat(DataInput&, TypeInput&) override;
+        void visitDouble(DataInput&, TypeInput&) override;
+        void visitBool(DataInput&, TypeInput&) override;
+        void visitString(DataInput&, TypeInput&) override;
+        void visitTime(DataInput&, TypeInput&) override;
+
+        // see above
+        virtual void visitAronVariantOnEnter(const data::DictPtr&, const type::Object&);
+        virtual void visitAronVariantOnEnter(const data::DictPtr&, const type::Dict&);
+        virtual void visitAronVariantOnEnter(const data::ListPtr&, const type::List&);
+        virtual void visitAronVariantOnEnter(const data::ListPtr&, const type::Pair&);
+        virtual void visitAronVariantOnEnter(const data::ListPtr&, const type::Tuple&);
+        virtual void visitAronVariantOnExit(const data::DictPtr&, const type::Object&);
+        virtual void visitAronVariantOnExit(const data::DictPtr&, const type::Dict&);
+        virtual void visitAronVariantOnExit(const data::ListPtr&, const type::List&);
+        virtual void visitAronVariantOnExit(const data::ListPtr&, const type::Pair&);
+        virtual void visitAronVariantOnExit(const data::ListPtr&, const type::Tuple&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Matrix&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::NDArray&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Quaternion&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Orientation&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Position&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Pose&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::PointCloud&);
+        virtual void visitAronVariant(const data::NDArrayPtr&, const type::Image&);
+        virtual void visitAronVariant(const data::IntPtr&, const type::IntEnum&);
+        virtual void visitAronVariant(const data::IntPtr&, const type::Int&);
+        virtual void visitAronVariant(const data::LongPtr&, const type::Long&);
+        virtual void visitAronVariant(const data::LongPtr&, const type::Time&);
+        virtual void visitAronVariant(const data::FloatPtr&, const type::Float&);
+        virtual void visitAronVariant(const data::DoublePtr&, const type::Double&);
+        virtual void visitAronVariant(const data::BoolPtr&, const type::Bool&);
+        virtual void visitAronVariant(const data::StringPtr&, const type::String&);
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/Variant.h b/source/RobotAPI/libraries/aron/core/type/variant/Variant.h
index c287a8bf4c54f50d01f49b8a6ebe295df4372271..3b189122e1dc29d26f7680a4e3fc69f1ce4f86a8 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/Variant.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/Variant.h
@@ -102,6 +102,12 @@ namespace armarx::aron::type
         }
 
         // virtual methods
+        /// naviate absolute
+        virtual VariantPtr navigateAbsolute(const Path& path) const = 0;
+
+        /// navigate relative
+        virtual VariantPtr navigateRelative(const Path& path) const = 0;
+
         /// get a short name of this specific type
         virtual std::string getShortName() const = 0;
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp
index d8b627b8863ed5a8c018653aef3bec957a063977..1ba76b6260864ff6659d8fb46363b95dbc7d99e5 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp
@@ -79,5 +79,27 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Dict<" + acceptedType->getFullName() + ">";
     }
+
+    VariantPtr Dict::navigateAbsolute(const Path& path) const
+    {
+        if (!path.hasElement())
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path);
+        }
+
+        if (path.size() != 1)
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not get more than 1 value from a dict.", path);
+        }
+
+        std::string el = path.getFirstElement();
+        if (el != "::accepted_type")
+        {
+            throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path);
+        }
+
+
+        return acceptedType;
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h
index d458ad4bf6d3a11983dcf88b8f928a603362786d..4dfdd35e238b39b729d67c583ec9378fc19f5c0e 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h
@@ -52,6 +52,8 @@ namespace armarx::aron::type
         type::dto::DictPtr toDictDTO() const;
 
         // virtual implementations
+        VariantPtr navigateAbsolute(const Path& path) const override;
+
         std::string getShortName() const override;
         std::string getFullName() const override;
         std::vector<VariantPtr> getChildren() const override;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp
index 47c129681572c9b1153b7ee4d30a9ab7da48a321..2f65cb75b0724e814fb569f5d2c9fc175bc8d5cc 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp
@@ -79,4 +79,26 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::List<" + acceptedType->getFullName() + ">";
     }
+
+    VariantPtr List::navigateAbsolute(const Path& path) const
+    {
+        if (!path.hasElement())
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path);
+        }
+
+        if (path.size() != 1)
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not get more than 1 value from a dict.", path);
+        }
+
+        std::string el = path.getFirstElement();
+        if (el != "::accepted_type")
+        {
+            throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path);
+        }
+
+
+        return acceptedType;
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/List.h b/source/RobotAPI/libraries/aron/core/type/variant/container/List.h
index 277591cf7974685b7db2908641ca0ed4c3cf13c5..532146e010bf8217c4669649ee2da9771c0623ec 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/List.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/List.h
@@ -51,6 +51,8 @@ namespace armarx::aron::type
         type::dto::ListPtr toListDTO() const;
 
         // virtual implementations
+        VariantPtr navigateAbsolute(const Path& path) const override;
+
         std::string getShortName() const override;
         std::string getFullName() const override;
         std::vector<VariantPtr> getChildren() const override;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp
index a6e61b8866e15a194126a9fbf0161f2ba32a9f71..d252ae8fc5461f659ce8dd5b160009de4003b792 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp
@@ -195,5 +195,33 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Object<" + this->aron->objectName + (extends ? (" : " + extends->getFullName()) : "") + ">";
     }
+
+    VariantPtr Object::navigateAbsolute(const Path& path) const
+    {
+        if (!path.hasElement())
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path);
+        }
+
+        std::string el = path.getFirstElement();
+        if (!hasMemberType(el))
+        {
+            throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path);
+        }
+
+        if (path.size() == 1)
+        {
+            return memberTypes.at(el);
+        }
+        else
+        {
+            Path next = path.withDetachedFirstElement();
+            if (!memberTypes.at(el))
+            {
+                throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate into a NULL member.", next);
+            }
+            return memberTypes.at(el)->navigateAbsolute(next);
+        }
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h
index fcd20e561e25b6d356302400584142ba97713c41..50ce062d4dcd0e86548fbc0b625588947c22e568 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h
@@ -68,6 +68,8 @@ namespace armarx::aron::type
         type::dto::AronObjectPtr toObjectDTO() const;
 
         // virtual implementations
+        VariantPtr navigateAbsolute(const Path& path) const override;
+
         std::string getShortName() const override;
         std::string getFullName() const override;
         std::vector<VariantPtr> getChildren() const override;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp
index c8bdeaf653ceaf6d67f87637de6d65bc4652fb37..d1cebcd3dda7a750c897a0d6b81bedb754eecd92 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp
@@ -114,5 +114,43 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Pair<" + acceptedType1->getFullName() + ", " + acceptedType2->getFullName() + ">";
     }
+
+    VariantPtr Pair::navigateAbsolute(const Path& path) const
+    {
+        if (!path.hasElement())
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path);
+        }
+
+        std::string el = path.getFirstElement();
+        if (el == "::accepted_type_0")
+        {
+            if (path.size() == 1)
+            {
+                return acceptedType1;
+            }
+            else
+            {
+                Path next = path.withDetachedFirstElement();
+                return acceptedType1->navigateAbsolute(next);
+            }
+        }
+        else if (el == "::accepted_type_1")
+        {
+            if (path.size() == 1)
+            {
+                return acceptedType2;
+            }
+            else
+            {
+                Path next = path.withDetachedFirstElement();
+                return acceptedType2->navigateAbsolute(next);
+            }
+        }
+        else
+        {
+            throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path);
+        }
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h
index 7a987e304b145316cab6b4d55dbe03322ad4a264..a63f6819406ce2b328e97a4026aeae21127d7b09 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h
@@ -55,6 +55,8 @@ namespace armarx::aron::type
         type::dto::PairPtr toPairDTO() const;
 
         // virtual implementations
+        VariantPtr navigateAbsolute(const Path& path) const override;
+
         std::string getShortName() const override;
         std::string getFullName() const override;
         std::vector<VariantPtr> getChildren() const override;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp
index 781291eccb8f9e93173ed5bc3108b9bd5fd70572..e189a85c76619b13984a90d2c0eb6332fb728bfa 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp
@@ -105,5 +105,31 @@ namespace armarx::aron::type
         }
         return "armarx::aron::type::Tuple<" + simox::alg::to_string(names, ", ") + ">";
     }
+
+    VariantPtr Tuple::navigateAbsolute(const Path& path) const
+    {
+        if (!path.hasElement())
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate without a valid path", path);
+        }
+
+        std::string el = path.getFirstElement();
+        for (unsigned int i = 0; i < acceptedTypes.size(); ++i)
+        {
+            if (el == "::accepted_type_" + std::to_string(i))
+            {
+                if (path.size() == 1)
+                {
+                    return acceptedTypes[i];
+                }
+                else
+                {
+                    Path next = path.withDetachedFirstElement();
+                    return acceptedTypes[i]->navigateAbsolute(next);
+                }
+            }
+        }
+        throw error::ValueNotValidException(__PRETTY_FUNCTION__, "Could not find an element of a path.", el, path);
+    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h
index a0096397073110d8bdbaa7eff9531c1c2f000145..d464f83269d5074e1ec6e759119b433c76de0f7d 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h
@@ -52,6 +52,8 @@ namespace armarx::aron::type
         type::dto::TuplePtr toTupleDTO() const;
 
         // virtual implementations
+        VariantPtr navigateAbsolute(const Path& path) const override;
+
         std::string getShortName() const override;
         std::string getFullName() const override;
         std::vector<VariantPtr> getChildren() const override;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/detail/EnumVariant.h b/source/RobotAPI/libraries/aron/core/type/variant/detail/EnumVariant.h
index eaa1924c1e5204e224f2a485afbcb174acc52d1f..a9b390b8db6383d63fbc594f23841351861def4f 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/detail/EnumVariant.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/detail/EnumVariant.h
@@ -44,6 +44,12 @@ namespace armarx::aron::type::detail
 
         virtual ~EnumVariant() = default;
 
+        /* virtual implementations */
+        VariantPtr navigateAbsolute(const Path &path) const override
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
+        }
+
         std::vector<VariantPtr> getChildren() const override
         {
             return {};
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/detail/NDArrayVariant.h b/source/RobotAPI/libraries/aron/core/type/variant/detail/NDArrayVariant.h
index cef80f77c690ea823fdb3ee9d1c3f28c9097cbbd..283b11a6383593e389e905c6b27e5fec4716a72a 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/detail/NDArrayVariant.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/detail/NDArrayVariant.h
@@ -45,10 +45,16 @@ namespace armarx::aron::type::detail
         virtual ~NDArrayVariant() = default;
 
         /* virtual implementations */
+        VariantPtr navigateAbsolute(const Path &path) const override
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
+        }
+
         std::vector<VariantPtr> getChildren() const override
         {
             return {};
         }
+
         size_t childrenSize() const override
         {
             return 0;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/detail/PrimitiveVariant.h b/source/RobotAPI/libraries/aron/core/type/variant/detail/PrimitiveVariant.h
index 4c729aed09aa8e01caeda41b68e79568b18f95bb..c7c6eb0b9c00e9ab1cd40800d5917929b8e9e5c3 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/detail/PrimitiveVariant.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/detail/PrimitiveVariant.h
@@ -45,10 +45,16 @@ namespace armarx::aron::type::detail
         virtual ~PrimitiveVariant() = default;
 
         /* virtual implementations */
+        VariantPtr navigateAbsolute(const Path &path) const override
+        {
+            throw error::AronException(__PRETTY_FUNCTION__, "Could not navigate through a non container navigator. The input path was: " + path.toString(), Variant::getPath());
+        }
+
         std::vector<VariantPtr> getChildren() const override
         {
             return {};
         }
+
         size_t childrenSize() const override
         {
             return 0;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/detail/SpecializedVariant.h b/source/RobotAPI/libraries/aron/core/type/variant/detail/SpecializedVariant.h
index 06bae251e9f9e2f032ce513eab2a5d236599c0b6..a34a215308e265d844b10d2e6d1359e1b31fd111 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/detail/SpecializedVariant.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/detail/SpecializedVariant.h
@@ -88,6 +88,13 @@ namespace armarx::aron::type::detail
             return aron->maybe;
         }
 
+        VariantPtr navigateRelative(const Path& path) const override
+        {
+            Path absoluteFromHere = path.getWithoutPrefix(getPath());
+            return navigateAbsolute(absoluteFromHere);
+        }
+
+
         // static methods
         static DerivedT& DynamicCast(Variant& n)
         {
@@ -106,7 +113,11 @@ namespace armarx::aron::type::detail
 
         static std::shared_ptr<DerivedT> DynamicCastAndCheck(const VariantPtr& n)
         {
-            ARMARX_CHECK_NOT_NULL(n);
+            if (!n)
+            {
+                return nullptr;
+            }
+
             auto casted = std::dynamic_pointer_cast<DerivedT>(n);
             ARMARX_CHECK_NOT_NULL(casted);
             return casted;
diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h b/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h
index a49b0751edcc7d689fe8e57a1eca7d2d3fe4bcaf..b11894e7b039d52a15feadf46b7ef5872f24e80a 100644
--- a/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/type/visitor/RecursiveVisitor.h
@@ -133,11 +133,15 @@ namespace armarx::aron::type
         using Input = typename VisitorBase<T>::Input;
         using InputNonConst = typename std::remove_const<Input>::type;
 
-        virtual std::map<std::string, InputNonConst> getObjectAcceptedTypes(Input&) = 0;
+        using ObjectElements = std::map<std::string, InputNonConst>;
+        using PairElements = std::pair<InputNonConst, InputNonConst>;
+        using TupleElements = std::vector<InputNonConst>;
+
+        virtual ObjectElements getObjectAcceptedTypes(Input&) = 0;
         virtual InputNonConst getDictAcceptedType(Input&) = 0;
         virtual InputNonConst getListAcceptedType(Input&) = 0;
-        virtual std::pair<InputNonConst, InputNonConst> getPairAcceptedTypes(Input&) = 0;
-        virtual std::vector<InputNonConst> getTupleAcceptedTypes(Input&) = 0;
+        virtual PairElements getPairAcceptedTypes(Input&) = 0;
+        virtual TupleElements getTupleAcceptedTypes(Input&) = 0;
 
         virtual void visitObjectOnEnter(Input&) {};
         virtual void visitObjectOnExit(Input&) {};
diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp b/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
index 6b2175d223a59338b77521a0f07c289ce598eca9..b99a9228c61f320978026943b758a01953354e6a 100644
--- a/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.cpp
@@ -24,7 +24,16 @@
 // Header
 #include "NlohmannJSONVisitor.h"
 
-namespace armarx::aron::data
+namespace armarx::aron::type
 {
+    type::Descriptor NlohmannJSONVisitor::GetDescriptor(Input& n)
+    {
+        std::string t = n[armarx::aron::type::rw::json::constantes::TYPE_SLUG];
+        return armarx::aron::type::rw::json::conversion::String2Descriptor.at(t);
+    }
 
+    type::Descriptor NlohmannJSONVisitor::getDescriptor(Input& n)
+    {
+        return GetDescriptor(n);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.h b/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.h
index 08a7060d02132fd3c1fb0c3686e7c96a0780ba07..9618654d052599c79b8cd02d7ae702a5163951b7 100644
--- a/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/type/visitor/nlohmannJSON/NlohmannJSONVisitor.h
@@ -27,11 +27,10 @@
 #include <string>
 #include <vector>
 
-// SImox
+// Simox
 #include <SimoxUtility/json.h>
 
 #include "../Visitor.h"
-#include "../../../Descriptor.h"
 #include "../../rw/json/Data.h"
 
 namespace armarx::aron::type
@@ -41,12 +40,8 @@ namespace armarx::aron::type
      */
     struct NlohmannJSONVisitor : virtual public Visitor<const nlohmann::json>
     {
-        virtual type::Descriptor getDescriptor(Input& n) override
-        {
-            std::string t = n[armarx::aron::type::rw::json::constantes::TYPE_SLUG];
-            return armarx::aron::type::rw::json::conversion::String2Descriptor.at(t);
-        }
-
+        static type::Descriptor GetDescriptor(Input& n);
+        type::Descriptor getDescriptor(Input& n) override;
         virtual ~NlohmannJSONVisitor() = default;
     };
 
diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.cpp b/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.cpp
index 005f9110566e3e90b6cd28d88d688ad00b51a09c..a6fa9e7dc4ac83794c4c9226ff7d38a643bcde1d 100644
--- a/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.cpp
@@ -24,7 +24,84 @@
 // Header
 #include "VariantVisitor.h"
 
-namespace armarx::aron::data
+#include "../../variant/All.h"
+
+namespace armarx::aron::type
 {
+    /****************************************************************************
+     * VariantVisitor
+     ***************************************************************************/
+    type::Descriptor ConstVariantVisitor::GetDescriptor(Input& n)
+    {
+        return n->getDescriptor();
+    }
+
+    type::Descriptor ConstVariantVisitor::getDescriptor(Input& n)
+    {
+        return GetDescriptor(n);
+    }
+
+
+    /****************************************************************************
+     * RecursiveVariantVisitor
+     ***************************************************************************/
+    type::Descriptor RecursiveConstVariantVisitor::getDescriptor(Input& n)
+    {
+        return ConstVariantVisitor::GetDescriptor(n);
+    }
+
+    RecursiveConstVariantVisitor::ObjectElements RecursiveConstVariantVisitor::GetObjectAcceptedTypes(Input& t)
+    {
+        auto o = type::Object::DynamicCastAndCheck(t);
+        return o->getMemberTypes();
+    }
+
+    RecursiveConstVariantVisitor::ObjectElements RecursiveConstVariantVisitor::getObjectAcceptedTypes(Input& t)
+    {
+        return GetObjectAcceptedTypes(t);
+    }
+
+    RecursiveConstVariantVisitor::InputNonConst RecursiveConstVariantVisitor::GetDictAcceptedType(Input& t)
+    {
+        auto o = type::Dict::DynamicCastAndCheck(t);
+        return o->getAcceptedType();
+    }
+
+    RecursiveConstVariantVisitor::InputNonConst RecursiveConstVariantVisitor::getDictAcceptedType(Input& t)
+    {
+        return GetDictAcceptedType(t);
+    }
+
+    RecursiveConstVariantVisitor::InputNonConst RecursiveConstVariantVisitor::GetListAcceptedType(Input& t)
+    {
+        auto o = type::List::DynamicCastAndCheck(t);
+        return o->getAcceptedType();
+    }
+
+    RecursiveConstVariantVisitor::InputNonConst RecursiveConstVariantVisitor::getListAcceptedType(Input& t)
+    {
+        return GetListAcceptedType(t);
+    }
+
+    RecursiveConstVariantVisitor::PairElements RecursiveConstVariantVisitor::GetPairAcceptedTypes(Input& t)
+    {
+        auto o = type::Pair::DynamicCastAndCheck(t);
+        return o->getAcceptedTypes();
+    }
+
+    RecursiveConstVariantVisitor::PairElements RecursiveConstVariantVisitor::getPairAcceptedTypes(Input& t)
+    {
+        return GetPairAcceptedTypes(t);
+    }
+
+    RecursiveConstVariantVisitor::TupleElements RecursiveConstVariantVisitor::GetTupleAcceptedTypes(Input& t)
+    {
+        auto o = type::Tuple::DynamicCastAndCheck(t);
+        return o->getAcceptedTypes();
+    }
 
+    RecursiveConstVariantVisitor::TupleElements RecursiveConstVariantVisitor::getTupleAcceptedTypes(Input& t)
+    {
+        return GetTupleAcceptedTypes(t);
+    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h b/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h
index 8b8bd1aeaf4959a5d13b34d37e44c7aaad7d8dff..4f08dca8f6465d5f6a752807b87674671237915e 100644
--- a/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h
@@ -28,58 +28,37 @@
 #include <vector>
 
 #include "../RecursiveVisitor.h"
-#include "../../variant/All.h"
+#include "../../variant/forward_declarations.h"
 
 namespace armarx::aron::type
 {
     /**
      * @brief The VariantVisitor struct. Already implements the method to get the descriptor of an aron variant.
      */
-    struct VariantVisitor : virtual public Visitor<const type::VariantPtr>
+    struct ConstVariantVisitor : virtual public Visitor<const type::VariantPtr>
     {
-        virtual type::Descriptor getDescriptor(Input& n) override
-        {
-            return n->getDescriptor();
-        }
-        virtual ~VariantVisitor() = default;
+        static type::Descriptor GetDescriptor(Input& n);
+        type::Descriptor getDescriptor(Input& n) override;
+        virtual ~ConstVariantVisitor() = default;
     };
 
     /**
      * @brief The RecursiveVariantVisitor struct. Already implements the methods to get the descriptor and children of an aron variant
      */
-    struct RecursiveVariantVisitor : virtual public RecursiveVisitor<const type::VariantPtr>
+    struct RecursiveConstVariantVisitor : virtual public RecursiveVisitor<const type::VariantPtr>
     {
-        virtual type::Descriptor getDescriptor(Input& n) override
-        {
-            return n->getDescriptor();
-        }
+        type::Descriptor getDescriptor(Input& n) override;
+        static ObjectElements GetObjectAcceptedTypes(Input& t);
+        ObjectElements getObjectAcceptedTypes(Input& t) override;
+        static InputNonConst GetDictAcceptedType(Input& t);
+        InputNonConst getDictAcceptedType(Input& t) override;
+        static InputNonConst GetListAcceptedType(Input& t);
+        InputNonConst getListAcceptedType(Input& t) override;
+        static PairElements GetPairAcceptedTypes(Input& t);
+        PairElements getPairAcceptedTypes(Input& t) override;
+        static TupleElements GetTupleAcceptedTypes(Input& t);
+        TupleElements getTupleAcceptedTypes(Input& t) override;
 
-        virtual std::map<std::string, type::VariantPtr> getObjectAcceptedTypes(Input& t) override
-        {
-            auto o = type::Object::DynamicCastAndCheck(t);
-            return o->getMemberTypes();
-        }
-        virtual type::VariantPtr getDictAcceptedType(Input& t) override
-        {
-            auto o = type::Dict::DynamicCastAndCheck(t);
-            return o->getAcceptedType();
-        }
-        virtual type::VariantPtr getListAcceptedType(Input& t) override
-        {
-            auto o = type::List::DynamicCastAndCheck(t);
-            return o->getAcceptedType();
-        }
-        virtual std::pair<type::VariantPtr, type::VariantPtr> getPairAcceptedTypes(Input& t) override
-        {
-            auto o = type::Pair::DynamicCastAndCheck(t);
-            return o->getAcceptedTypes();
-        }
-        virtual std::vector<type::VariantPtr> getTupleAcceptedTypes(Input& t) override
-        {
-            auto o = type::Tuple::DynamicCastAndCheck(t);
-            return o->getAcceptedTypes();
-        }
-
-        virtual ~RecursiveVariantVisitor() = default;
+        virtual ~RecursiveConstVariantVisitor() = default;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp b/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp
index bffc30376046d6eae82a9e8aedc412d93645b6db..f9e023a84bf5623bd0785fde391544e303f665d1 100644
--- a/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp
+++ b/source/RobotAPI/libraries/aron/core/typereader/xml/Factory.cpp
@@ -213,7 +213,7 @@ namespace armarx::aron::typereader::xml
 
         std::vector<RapidXmlReaderNode> c = node.nodes();
         const RapidXmlReaderNode typeNode = c[0];
-        type::VariantPtr type = create(typeNode, Path(path, "[accepted-type]"));
+        type::VariantPtr type = create(typeNode, Path(path, "::accepted-type"));
         type->setMaybe(getMaybe(typeNode));
 
         auto o = std::make_shared<type::List>(type, path);
@@ -226,7 +226,7 @@ namespace armarx::aron::typereader::xml
 
         std::vector<RapidXmlReaderNode> c = node.nodes();
         const RapidXmlReaderNode typeNode = c[0];
-        type::VariantPtr type = create(typeNode, Path(path, "type"));
+        type::VariantPtr type = create(typeNode, Path(path, "::accepted-type"));
         type->setMaybe(getMaybe(typeNode));
 
         auto o = std::make_shared<type::Dict>(type, path);
@@ -247,7 +247,7 @@ namespace armarx::aron::typereader::xml
             std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes();
             const RapidXmlReaderNode typeNode = typeNodeChildren[0];
 
-            type::VariantPtr type = create(typeNode, Path(path, "<" + std::to_string(i++) + ">"));
+            type::VariantPtr type = create(typeNode, Path(path, "::accepted_type_" + std::to_string(i++)));
             type->setMaybe(getMaybe(typeNode));
 
             elementTypes.push_back(type);
@@ -264,11 +264,11 @@ namespace armarx::aron::typereader::xml
         std::vector<RapidXmlReaderNode> c = node.nodes();
         const RapidXmlReaderNode type1Node = c[0];
 
-        type::VariantPtr type1 = create(type1Node, Path(path, std::to_string(0)));
+        type::VariantPtr type1 = create(type1Node, Path(path, "::accepted_type_" + std::to_string(0)));
         type1->setMaybe(getMaybe(type1Node));
 
         const RapidXmlReaderNode type2Node = c[1];
-        type::VariantPtr type2 = create(type2Node, Path(path, std::to_string(1)));
+        type::VariantPtr type2 = create(type2Node, Path(path, "::accepted_type_" + std::to_string(1)));
         type2->setMaybe(getMaybe(type2Node));
 
         auto o = std::make_shared<type::Pair>(type1, type2, path);