From aed770d0c3975535bc2269bd9d4b1c7fe847060a Mon Sep 17 00:00:00 2001
From: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu>
Date: Tue, 1 Feb 2022 10:17:25 +0100
Subject: [PATCH] Skill Provider Framework updates

---
 .../LegacyRobotStateMemoryAdapter.cpp         |  51 ++-
 .../LegacyRobotStateMemoryAdapter.h           |   2 +
 .../armem/server/GraspMemory/CMakeLists.txt   |   2 +-
 .../armem/server/GraspMemory/GraspMemory.cpp  |  17 +-
 .../armem/server/GraspMemory/GraspMemory.h    |   8 +-
 .../RobotStateMemory/RobotStateMemory.cpp     |   8 +-
 .../SkillProviderExample/CMakeLists.txt       |   7 +
 .../SkillProviderExample.cpp                  |  79 ++--
 .../SkillProviderExample.h                    |   9 +-
 .../aron/HelloWorldAcceptedType.xml           |  17 +
 .../AronTreeWidgetEditor.cpp                  | 349 ------------------
 .../AronTreeWidgetInputModalController.cpp    |  38 --
 .../AronTreeWidgetInputModalController.h      |  34 --
 .../SkillManagerPlugin/CMakeLists.txt         |  28 +-
 .../SkillManagerMonitorWidget.ui              |  35 +-
 .../SkillManagerMonitorWidgetController.cpp   | 205 +++++++---
 .../SkillManagerMonitorWidgetController.h     |  15 +
 .../AronTreeWidgetController.cpp              |  38 ++
 .../aronTreeWidget/AronTreeWidgetController.h |  34 ++
 .../aronTreeWidget/AronTreeWidgetItem.cpp     |  28 ++
 .../aronTreeWidget/AronTreeWidgetItem.h       |  39 ++
 .../aronTreeWidget/Data.cpp                   |   6 +
 .../SkillManagerPlugin/aronTreeWidget/Data.h  |  13 +
 .../modal/AronTreeWidgetModal.cpp             |  20 +
 .../modal/AronTreeWidgetModal.h               |  57 +++
 .../dict/AronTreeWidgetDictInputModal.ui      |  88 +++++
 ...AronTreeWidgetDictInputModalController.cpp |  73 ++++
 .../AronTreeWidgetDictInputModalController.h  |  36 ++
 .../aronTreeWidget/modal/others_are_TODO      |   0
 .../text/AronTreeWidgetTextInputModal.ui}     |   4 +-
 ...AronTreeWidgetTextInputModalController.cpp |  35 ++
 .../AronTreeWidgetTextInputModalController.h  |  34 ++
 .../visitors/AronTreeWidgetConverter.cpp      | 252 +++++++++++++
 .../visitors/AronTreeWidgetConverter.h}       |  46 +--
 .../visitors/AronTreeWidgetCreator.cpp        | 144 ++++++++
 .../visitors/AronTreeWidgetCreator.h          |  79 ++++
 .../visitors/AronTreeWidgetModalCreator.cpp   | 146 ++++++++
 .../visitors/AronTreeWidgetModalCreator.h     |  87 +++++
 .../libraries/ArmarXObjects/ObjectInfo.h      |   3 +-
 .../libraries/PriorKnowledge/CMakeLists.txt   |   1 +
 .../PriorKnowledge/objects/CMakeLists.txt     |  19 +
 .../PriorKnowledge/objects/ObjectFinder.cpp   |  71 ++++
 .../PriorKnowledge/objects/ObjectFinder.h     |  41 ++
 .../armem/core/base/ice_conversions.cpp       |   4 +-
 .../libraries/armem/core/ice_conversions.cpp  |   4 +-
 .../armem/core/wm/aron_conversions.cpp        |   8 +-
 .../libraries/armem_grasping/CMakeLists.txt   |  41 +-
 .../aron/KnownGraspCandidate.xml              |  62 ++++
 .../client/KnownGraspCandidateReader.cpp      | 101 +++++
 .../client/KnownGraspCandidateReader.h        |  65 ++++
 .../server/KnownGraspProviderSegment.cpp      | 144 ++++++++
 .../server/KnownGraspProviderSegment.h        |  27 ++
 .../libraries/armem_objects/CMakeLists.txt    |   4 +
 .../client/instance/ObjectReader.cpp          | 138 +++++++
 .../client/instance/ObjectReader.h            |  70 ++++
 .../client/common/RobotReader.cpp             |   2 +-
 .../segment/SkillExecutionRequestSegment.cpp  |   6 +-
 .../aron/core/data/variant/Variant.h          |   3 -
 .../core/data/variant/complex/NDArray.cpp     |   9 +-
 .../aron/core/data/variant/complex/NDArray.h  |   2 -
 .../aron/core/data/variant/container/Dict.cpp |  17 +-
 .../aron/core/data/variant/container/Dict.h   |   8 +-
 .../aron/core/data/variant/container/List.cpp |  17 +-
 .../aron/core/data/variant/container/List.h   |   8 +-
 .../data/variant/detail/PrimitiveVariant.h    |   3 +
 .../aron/core/data/variant/primitive/Bool.cpp |  14 +-
 .../aron/core/data/variant/primitive/Bool.h   |   6 +-
 .../core/data/variant/primitive/Double.cpp    |  14 +-
 .../aron/core/data/variant/primitive/Double.h |   6 +-
 .../core/data/variant/primitive/Float.cpp     |  14 +-
 .../aron/core/data/variant/primitive/Float.h  |   6 +-
 .../aron/core/data/variant/primitive/Int.cpp  |  14 +-
 .../aron/core/data/variant/primitive/Int.h    |   6 +-
 .../aron/core/data/variant/primitive/Long.cpp |  14 +-
 .../aron/core/data/variant/primitive/Long.h   |   6 +-
 .../core/data/variant/primitive/String.cpp    |  14 +-
 .../aron/core/data/variant/primitive/String.h |   6 +-
 .../aron/core/test/aronRandomizedTest.cpp     |   8 +-
 .../aron/core/type/variant/Variant.h          |   3 -
 .../aron/core/type/variant/container/Dict.cpp |   9 -
 .../aron/core/type/variant/container/Dict.h   |   1 -
 .../aron/core/type/variant/container/List.cpp |   9 -
 .../aron/core/type/variant/container/List.h   |   1 -
 .../core/type/variant/container/Object.cpp    |  29 +-
 .../aron/core/type/variant/container/Object.h |   6 +-
 .../aron/core/type/variant/container/Pair.cpp |   7 -
 .../aron/core/type/variant/container/Pair.h   |   1 -
 .../core/type/variant/container/Tuple.cpp     |   7 -
 .../aron/core/type/variant/container/Tuple.h  |   1 -
 .../aron/core/type/variant/enum/IntEnum.cpp   |   5 -
 .../aron/core/type/variant/enum/IntEnum.h     |   1 -
 .../aron/core/type/variant/ndarray/Image.cpp  |   5 -
 .../aron/core/type/variant/ndarray/Image.h    |   1 -
 .../aron/core/type/variant/ndarray/Matrix.cpp |   5 -
 .../aron/core/type/variant/ndarray/Matrix.h   |   1 -
 .../core/type/variant/ndarray/NDArray.cpp     |   5 -
 .../aron/core/type/variant/ndarray/NDArray.h  |   1 -
 .../core/type/variant/ndarray/Orientation.cpp |   5 -
 .../core/type/variant/ndarray/Orientation.h   |   1 -
 .../core/type/variant/ndarray/PointCloud.cpp  |   5 -
 .../core/type/variant/ndarray/PointCloud.h    |   1 -
 .../aron/core/type/variant/ndarray/Pose.cpp   |  10 -
 .../aron/core/type/variant/ndarray/Pose.h     |   1 -
 .../core/type/variant/ndarray/Position.cpp    |   5 -
 .../aron/core/type/variant/ndarray/Position.h |   1 -
 .../core/type/variant/ndarray/Quaternion.cpp  |   5 -
 .../core/type/variant/ndarray/Quaternion.h    |   1 -
 .../aron/core/type/variant/primitive/Bool.cpp |   5 -
 .../aron/core/type/variant/primitive/Bool.h   |   1 -
 .../core/type/variant/primitive/Double.cpp    |   5 -
 .../aron/core/type/variant/primitive/Double.h |   1 -
 .../core/type/variant/primitive/Float.cpp     |   5 -
 .../aron/core/type/variant/primitive/Float.h  |   1 -
 .../aron/core/type/variant/primitive/Int.cpp  |   5 -
 .../aron/core/type/variant/primitive/Int.h    |   1 -
 .../aron/core/type/variant/primitive/Long.cpp |   5 -
 .../aron/core/type/variant/primitive/Long.h   |   1 -
 .../core/type/variant/primitive/String.cpp    |   5 -
 .../aron/core/type/variant/primitive/String.h |   1 -
 .../aron/core/type/variant/primitive/Time.cpp |   5 -
 .../aron/core/type/variant/primitive/Time.h   |   1 -
 .../libraries/skills/provider/Skill.cpp       |  71 +++-
 .../libraries/skills/provider/Skill.h         |  37 +-
 .../skills/provider/SkillDescription.cpp      |   5 +-
 .../provider/SkillProviderComponentPlugin.cpp |  97 ++---
 .../provider/SkillProviderComponentPlugin.h   |   2 +-
 .../skills/provider/SkillStatusUpdate.cpp     |   7 +-
 .../skills/provider/SpecializedSkill.h        |  18 +-
 .../detail/SkillImplementationWrapper.cpp     | 138 +++----
 .../detail/SkillImplementationWrapper.h       |  29 +-
 .../helper/LambdaSkillImplementation.cpp      |   2 +-
 .../helper/LambdaSkillImplementation.h        |   8 +-
 132 files changed, 2686 insertions(+), 1072 deletions(-)
 create mode 100644 source/RobotAPI/components/skills/SkillProviderExample/aron/HelloWorldAcceptedType.xml
 delete mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetEditor.cpp
 delete mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModalController.cpp
 delete mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModalController.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/Data.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/Data.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/others_are_TODO
 rename source/RobotAPI/gui-plugins/SkillManagerPlugin/{AronTreeWidgetInputModal.ui => aronTreeWidget/modal/text/AronTreeWidgetTextInputModal.ui} (91%)
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp
 rename source/RobotAPI/gui-plugins/SkillManagerPlugin/{AronTreeWidgetEditor.h => aronTreeWidget/visitors/AronTreeWidgetConverter.h} (60%)
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.h
 create mode 100644 source/RobotAPI/libraries/PriorKnowledge/objects/CMakeLists.txt
 create mode 100644 source/RobotAPI/libraries/PriorKnowledge/objects/ObjectFinder.cpp
 create mode 100644 source/RobotAPI/libraries/PriorKnowledge/objects/ObjectFinder.h
 create mode 100644 source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml
 create mode 100644 source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.cpp
 create mode 100644 source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h
 create mode 100644 source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
 create mode 100644 source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h
 create mode 100644 source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.cpp
 create mode 100644 source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h

diff --git a/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/LegacyRobotStateMemoryAdapter.cpp b/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/LegacyRobotStateMemoryAdapter.cpp
index b63913fdc..cdc049a27 100644
--- a/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/LegacyRobotStateMemoryAdapter.cpp
+++ b/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/LegacyRobotStateMemoryAdapter.cpp
@@ -26,6 +26,7 @@
 // ArmarX
 #include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h>
 #include <RobotAPI/libraries/armem_robot_state/aron/Transform.aron.generated.h>
+#include <RobotAPI/libraries/armem_robot/aron/RobotDescription.aron.generated.h>
 
 namespace armarx::armem
 {
@@ -86,7 +87,7 @@ namespace armarx::armem
 
         // is this corect??
         prop.platform.acceleration = Eigen::Vector3f();
-        prop.platform.relativePosition = Eigen::Vector3f(update.platformPose.x,
+        prop.platform.relativePosition = Eigen::Vector3f(update.platformPose.x, // this should be globasl AFAIK
                                                          update.platformPose.y,
                                                          update.platformPose.rotationAroundZ);
         prop.platform.velocity = Eigen::Vector3f(std::get<0>(update.platformVelocity),
@@ -104,7 +105,7 @@ namespace armarx::armem
 
         ARMARX_DEBUG << "Committing " << entityUpdate;
         armem::EntityUpdateResult updateResult = memoryWriter.commit(entityUpdate);
-        ARMARX_INFO << updateResult;
+        ARMARX_DEBUG << updateResult;
         if (!updateResult.success)
         {
             ARMARX_ERROR << updateResult.errorMessage;
@@ -119,9 +120,9 @@ namespace armarx::armem
             transform.header.timestamp = IceUtil::Time::microSeconds(_timestampUpdateFirstModifiedInUs);
 
             Eigen::Isometry3f tf = Eigen::Isometry3f::Identity();
-            tf.translation().x() = std::get<0>(update.platformOdometryPose);
-            tf.translation().y() = std::get<1>(update.platformOdometryPose);
-            tf.linear() = Eigen::AngleAxisf(std::get<2>(update.platformOdometryPose), Eigen::Vector3f::UnitZ()).toRotationMatrix();
+            tf.translation().x() = (update.platformPose.x);
+            tf.translation().y() = (update.platformPose.y);
+            tf.linear() = Eigen::AngleAxisf((update.platformPose.rotationAroundZ), Eigen::Vector3f::UnitZ()).toRotationMatrix();
 
             transform.transform = tf.matrix();
 
@@ -135,7 +136,7 @@ namespace armarx::armem
 
             ARMARX_DEBUG << "Committing " << entityUpdate;
             armem::EntityUpdateResult updateResult = memoryWriter.commit(locUpdate);
-            ARMARX_INFO << updateResult;
+            ARMARX_DEBUG << updateResult;
             if (!updateResult.success)
             {
                 ARMARX_ERROR << updateResult.errorMessage;
@@ -173,7 +174,7 @@ namespace armarx::armem
     {
         ARMARX_DEBUG << "Got an update for joint vels";
         std::lock_guard l(updateMutex);
-        update.jointAngles = m;
+        update.jointVelocities = m;
         updateTimestamps(ts);
     }
 
@@ -181,7 +182,7 @@ namespace armarx::armem
     {
         ARMARX_DEBUG << "Got an update for joint torques";
         std::lock_guard l(updateMutex);
-        update.jointAngles = m;
+        update.jointTorques = m;
         updateTimestamps(ts);
     }
 
@@ -189,7 +190,7 @@ namespace armarx::armem
     {
         ARMARX_DEBUG << "Got an update for joint accels";
         std::lock_guard l(updateMutex);
-        update.jointAngles = m;
+        update.jointAccelerations = m;
         updateTimestamps(ts);
     }
 
@@ -197,7 +198,7 @@ namespace armarx::armem
     {
         ARMARX_DEBUG << "Got an update for joint currents";
         std::lock_guard l(updateMutex);
-        update.jointAngles = m;
+        update.jointCurrents = m;
         updateTimestamps(ts);
     }
 
@@ -241,6 +242,33 @@ namespace armarx::armem
         updateTimestamps(now);
     }
 
+    void LegacyRobotStateMemoryAdapter::commitArmar3RobotDescription()
+    {
+        ARMARX_IMPORTANT << "Commiting Armar3 to descriptions";
+        armem::arondto::RobotDescription desc;
+        desc.name = "Armar3";
+        desc.timestamp = armem::Time::now();
+        desc.xml.package = "RobotAPI";
+        desc.xml.path = "RobotAPI/robots/Armar3/ArmarIII.xml";
+
+        armem::Commit c;
+        auto& entityUpdate = c.add();
+
+        entityUpdate.confidence = 1.0;
+        entityUpdate.entityID.memoryName = "RobotState";
+        entityUpdate.entityID.coreSegmentName = "Description";
+        entityUpdate.entityID.providerSegmentName = "Armar3";
+        entityUpdate.entityID.entityName = "Armar3";
+
+        entityUpdate.instancesData = { desc.toAron() };
+        entityUpdate.timeCreated = armem::Time::now();
+        auto res = memoryWriter.commit(c);
+        if (!res.allSuccess())
+        {
+            ARMARX_WARNING << "Could not send data to memory." << res.allErrorMessages();
+        }
+    }
+
 
     void LegacyRobotStateMemoryAdapter::onInitComponent()
     {
@@ -273,6 +301,9 @@ namespace armarx::armem
             return;
         }
 
+        // update RobotDescription (since there will be no robot unit, we have to submit the description by ourselves)
+        commitArmar3RobotDescription();
+
         runningTask->start();
     }
 
diff --git a/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/LegacyRobotStateMemoryAdapter.h b/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/LegacyRobotStateMemoryAdapter.h
index 10f6c20ee..50f2c1973 100644
--- a/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/LegacyRobotStateMemoryAdapter.h
+++ b/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/LegacyRobotStateMemoryAdapter.h
@@ -80,6 +80,8 @@ namespace armarx::armem
         void onExitComponent() override;
 
     private:
+        void commitArmar3RobotDescription();
+
         void updateTimestamps(long dataGeneratedUs);
         void checkUpdateAndSendToMemory();
 
diff --git a/source/RobotAPI/components/armem/server/GraspMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/GraspMemory/CMakeLists.txt
index 6f09f46f7..711482a70 100644
--- a/source/RobotAPI/components/armem/server/GraspMemory/CMakeLists.txt
+++ b/source/RobotAPI/components/armem/server/GraspMemory/CMakeLists.txt
@@ -6,7 +6,7 @@ set(COMPONENT_LIBS
     ArmarXGuiComponentPlugins
     RobotAPICore RobotAPIInterfaces armem_server
     RobotAPIComponentPlugins  # for ArViz and other plugins
-
+    armem_grasping
     ${IVT_LIBRARIES}
 )
 
diff --git a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp
index b50b21450..2c6d48126 100644
--- a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp
+++ b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp
@@ -1,4 +1,3 @@
-
 #include "GraspMemory.h"
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
@@ -9,6 +8,7 @@
 #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h>
 
 #include <RobotAPI/libraries/GraspingUtility/aron/GraspCandidate.aron.generated.h>
+#include <RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.aron.generated.h>
 
 namespace armarx::armem::server::grasp
 {
@@ -29,22 +29,28 @@ namespace armarx::armem::server::grasp
         return "GraspMemory";
     }
 
+    GraspMemory::GraspMemory() :
+        knownGraspProviderSegment(iceAdapter())
+    {
+    }
+
     void GraspMemory::onInitComponent()
     {
         workingMemory().name() = memoryName;
-
         workingMemory().addCoreSegment("GraspCandidate",
                                      armarx::grasping::arondto::GraspCandidate::toAronType());
         workingMemory().addCoreSegment("BimanualGraspCandidate",
                                      armarx::grasping::arondto::BimanualGraspCandidate::toAronType());
+        workingMemory().addCoreSegment("KnownGraspCandidate",
+                                     armarx::armem::grasping::arondto::KnownGraspInfo::toAronType());
+
+        knownGraspProviderSegment.init();
     }
 
     void GraspMemory::onConnectComponent()
     {
-
         createRemoteGuiTab();
         RemoteGui_startRunningTask();
-
     }
 
     void GraspMemory::onDisconnectComponent()
@@ -75,13 +81,10 @@ namespace armarx::armem::server::grasp
 
 
     // REMOTE GUI
-
     void GraspMemory::createRemoteGuiTab()
     {
         using namespace armarx::RemoteGui::Client;
-
         {
-
             tab.memoryGroup = armem::server::MemoryRemoteGui().makeGroupBox(workingMemory());
         }
 
diff --git a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.h b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.h
index 7e8313223..ea7dceadd 100644
--- a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.h
+++ b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.h
@@ -9,6 +9,8 @@
 #include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
 #include <RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h>
 
+#include <RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h>
+
 namespace armarx::armem::server::grasp
 {
     /**
@@ -30,6 +32,8 @@ namespace armarx::armem::server::grasp
     {
     public:
 
+        GraspMemory();
+
         /// @see armarx::ManagedIceObject::getDefaultName()
         std::string getDefaultName() const override;
 
@@ -57,10 +61,10 @@ namespace armarx::armem::server::grasp
 
         DebugObserverInterfacePrx debugObserver;
 
-
         std::string memoryName = "Grasp";
 
-
+        // segments
+        armem::grasping::segment::KnownGraspProviderSegment knownGraspProviderSegment;
 
         struct RemoteGuiTab : RemoteGui::Client::Tab
         {
diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
index 6cc5b6a88..0aef2635f 100644
--- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
+++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
@@ -119,10 +119,10 @@ namespace armarx::armem::server::robot_state
             includePaths.insert(includePaths.end(), projectIncludePaths.begin(), projectIncludePaths.end());
         }
 
-	if (robotUnit.waitForRobotUnit)
-	{
-		usingProxy(robotUnit.plugin->getRobotUnitName());
-	}
+        if (robotUnit.waitForRobotUnit)
+        {
+            usingProxy(robotUnit.plugin->getRobotUnitName());
+        }
     }
 
 
diff --git a/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt b/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt
index f3215ba1d..ee1ea4e51 100644
--- a/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt
+++ b/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt
@@ -21,5 +21,12 @@ set(HEADERS
 
 armarx_add_component("${SOURCES}" "${HEADERS}")
 
+armarx_enable_aron_file_generation_for_target(
+    TARGET_NAME
+        ${ARMARX_COMPONENT_NAME}
+    ARON_FILES
+        aron/HelloWorldAcceptedType.xml
+)
+
 #generate the application
 armarx_generate_and_add_component_executable(COMPONENT_NAMESPACE "armarx::skills::provider")
diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
index 804b8d680..485a5e07d 100644
--- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
+++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
@@ -6,9 +6,20 @@
 #include <RobotAPI/libraries/aron/core/type/variant/primitive/String.h>
 #include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
 
+#include <RobotAPI/components/skills/SkillProviderExample/aron/HelloWorldAcceptedType.aron.generated.h>
+
 namespace armarx::skills::provider
 {
-    Skill::Status HelloWorldSkill::execute(const aron::data::DictPtr& d, const CallbackT&)
+    HelloWorldSkill::HelloWorldSkill() :
+        Skill(SkillDescription{
+            "HelloWorld",
+            "This skill logs a message on ARMARX_IMPORTANT",
+            {},
+            1000,
+            armarx::skills::Example::HelloWorldAcceptedType::toAronType()
+        })
+    {}
+    Skill::Status HelloWorldSkill::_execute(const aron::data::DictPtr& d, const CallbackT&)
     {
         ARMARX_IMPORTANT << "Hi, from the Hello World Skill.\n" <<
                             "I received the following data: \n" <<
@@ -17,7 +28,16 @@ namespace armarx::skills::provider
         return Skill::Status::Succeeded;
     }
 
-    Skill::Status TimeoutSkill::execute(const aron::data::DictPtr& d, const CallbackT&)
+    TimeoutSkill::TimeoutSkill() :
+        Skill(SkillDescription{
+            "Timeout",
+            "This fails with timeout reached",
+            {},
+            1000,
+            nullptr
+        })
+    {}
+    Skill::Status TimeoutSkill::_execute(const aron::data::DictPtr& d, const CallbackT&)
     {
         int i = 0;
         while (!timeoutReached)
@@ -26,12 +46,25 @@ namespace armarx::skills::provider
             std::this_thread::sleep_for(std::chrono::milliseconds(200));
 
             // check if work is done
-            if(i++ > 15) return Skill::Status::Succeeded;
+            if(i++ > 15)
+            {
+                ARMARX_IMPORTANT << "Somehow the timeout check succeceded....";
+                return Skill::Status::Succeeded;
+            }
         }
         return Skill::Status::TimeoutReached;
     }
 
-    Skill::Status CallbackSkill::execute(const aron::data::DictPtr& d, const CallbackT& callback)
+    CallbackSkill::CallbackSkill() :
+        Skill(SkillDescription{
+            "ShowMeCallbacks",
+            "This skill does shows callbacks",
+            {},
+            1000,
+            nullptr
+        })
+    {}
+    Skill::Status CallbackSkill::_execute(const aron::data::DictPtr& d, const CallbackT& callback)
     {
         ARMARX_IMPORTANT << "Logging three updates via the callback";
         auto up1 = std::make_shared<aron::data::Dict>();
@@ -68,21 +101,7 @@ namespace armarx::skills::provider
     void SkillProviderExample::onInitComponent()
     {
         // Add example skill
-        {
-            auto helloWorldAcceptedType = std::make_shared<aron::type::Object>("helloWorldAcceptedType");
-            auto helloWorldAcceptedTypeText = std::make_shared<aron::type::String>(aron::Path({"text"}));
-            helloWorldAcceptedType->addMemberType("text", helloWorldAcceptedTypeText);
-
-            auto helloWorldAcceptedTypeInt = std::make_shared<aron::type::Int>(aron::Path({"int"}));
-            helloWorldAcceptedType->addMemberType("int", helloWorldAcceptedTypeInt);
-
-            skills::SkillDescription helloWorldDesc;
-            helloWorldDesc.description = "This skill logs a message on ARMARX_IMPORTANT";
-            helloWorldDesc.skillName = "HelloWorld";
-            helloWorldDesc.acceptedType = helloWorldAcceptedType;
-            helloWorldDesc.timeoutMs = 1000;
-            addSkill(std::make_shared<HelloWorldSkill>(), helloWorldDesc);
-        }
+        addSkill(std::make_shared<HelloWorldSkill>());
 
         // Add another lambda example skill
         {
@@ -95,24 +114,10 @@ namespace armarx::skills::provider
         }
 
         // Add another example skill
-        {
-            skills::SkillDescription cbDesc;
-            cbDesc.acceptedType = nullptr; // accept everything
-            cbDesc.description = "This skill does shows callbacks.";
-            cbDesc.skillName = "ShowMeCallbacks";
-            cbDesc.timeoutMs = 1000;
-            addSkill(std::make_shared<CallbackSkill>(), cbDesc);
-        }
+        addSkill(std::make_shared<CallbackSkill>());
 
         // Add timeout skill
-        {
-            skills::SkillDescription tDesc;
-            tDesc.acceptedType = nullptr; // accept everything
-            tDesc.description = "This fails with timeout reached.";
-            tDesc.skillName = "Timeout";
-            tDesc.timeoutMs = 1000;
-            addSkill(std::make_shared<TimeoutSkill>(), tDesc);
-        }
+        addSkill(std::make_shared<TimeoutSkill>());
     }
 
     void SkillProviderExample::onConnectComponent()
@@ -126,5 +131,7 @@ namespace armarx::skills::provider
     }
 
     void SkillProviderExample::onExitComponent()
-    {}
+    {
+
+    }
 }
diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h
index 42ad812f1..2cd96b5eb 100644
--- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h
+++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h
@@ -35,21 +35,24 @@ namespace armarx::skills::provider
     class HelloWorldSkill : public Skill
     {
     public:
-        Status execute(const aron::data::DictPtr&, const CallbackT&) final;
+        HelloWorldSkill();
+        Status _execute(const aron::data::DictPtr&, const CallbackT&) final;
     };
 
 
     class TimeoutSkill : public Skill
     {
     public:
-        Status execute(const aron::data::DictPtr&, const CallbackT&) final;
+        TimeoutSkill();
+        Status _execute(const aron::data::DictPtr&, const CallbackT&) final;
     };
 
 
     class CallbackSkill : public Skill
     {
     public:
-        Status execute(const aron::data::DictPtr&, const CallbackT&) final;
+        CallbackSkill();
+        Status _execute(const aron::data::DictPtr&, const CallbackT&) final;
     };
 
     /**
diff --git a/source/RobotAPI/components/skills/SkillProviderExample/aron/HelloWorldAcceptedType.xml b/source/RobotAPI/components/skills/SkillProviderExample/aron/HelloWorldAcceptedType.xml
new file mode 100644
index 000000000..553a93ad0
--- /dev/null
+++ b/source/RobotAPI/components/skills/SkillProviderExample/aron/HelloWorldAcceptedType.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <GenerateTypes>
+        <Object name='armarx::skills::Example::HelloWorldAcceptedType'>
+            <ObjectChild key='some_int'>
+                <Int />
+            </ObjectChild>
+            <ObjectChild key='some_float'>
+                <Float />
+            </ObjectChild>
+            <ObjectChild key='some_text'>
+                <String />
+            </ObjectChild>
+        </Object>
+    </GenerateTypes>
+
+</AronTypeDefinition>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetEditor.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetEditor.cpp
deleted file mode 100644
index 0df59db31..000000000
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetEditor.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * This file is part of ArmarX.
- *
- * ArmarX is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * ArmarX is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * \package    RobotAPI::gui-plugins::SkillManagerMonitorWidgetController
- * \author     Raphael Grimm ( raphael dot grimm at kit dot edu )
- * \date       2020
- * \copyright  http://www.gnu.org/licenses/gpl-2.0.txt
- *             GNU General Public License
- */
-
-#include <string>
-
-#include <ArmarXCore/util/CPPUtility/Iterator.h>
-
-#include "AronTreeWidgetEditor.h"
-
-// debug
-#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
-
-//visitors
-namespace armarx
-{
-
-    void
-    AronTreeViewWidgetCreatorVisitor::createSimpleTreeViewWidget(Input& i)
-    {
-        ARMARX_CHECK_NOT_NULL(i);
-        ARMARX_CHECK_NOT_NULL(parentItem);
-
-        auto key = i->getPath().getLastElement();
-        createdQWidgetItem = new QTreeWidgetItem(parentItem);
-        createdQWidgetItem->setText(0, QString::fromStdString(key));
-        createdQWidgetItem->setText(2, QString::fromStdString(i->getShortName()));
-        createdQWidgetItem->setText(3, QString::fromStdString(i->getDefaultFromString()));
-        createdQWidgetItem->setFlags(createdQWidgetItem->flags() | Qt::ItemIsEditable);
-    }
-
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::ObjectPtr& i)
-    {
-        ARMARX_CHECK_NOT_NULL(i);
-        ARMARX_CHECK_NOT_NULL(parentItem);
-
-        auto key = i->getObjectName();
-        if (i->getPath().hasElement())
-        {
-            key = i->getPath().getLastElement();
-        }
-
-        createdQWidgetItem = new QTreeWidgetItem(parentItem);
-        createdQWidgetItem->setText(0, QString::fromStdString(key));
-
-        for (const auto& [key, value] : i->getMemberTypes())
-        {
-            AronTreeViewWidgetCreatorVisitor v(createdQWidgetItem);
-            aron::type::visit(v, value);
-
-            if (v.createdQWidgetItem)
-            {
-                createdQWidgetItem->addChild(v.createdQWidgetItem);
-            }
-        }
-    }
-
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::DictPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::PairPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::TuplePtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::ListPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::NDArrayPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::MatrixPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::QuaternionPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::PositionPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::OrientationPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::PosePtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::ImagePtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::PointCloudPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::IntEnumPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::IntPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::LongPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::FloatPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::DoublePtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::BoolPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::StringPtr& i)
-    { createSimpleTreeViewWidget(i); }
-    void
-    AronTreeViewWidgetCreatorVisitor::visitAronVariant(const aron::type::TimePtr& i)
-    { createSimpleTreeViewWidget(i); }
-
-    void AronTreeViewWidgetCreatorVisitor::visitUnknown(Input&)
-    {
-        ARMARX_WARNING_S << "Received an unknown type when trying to create a tree view widget for a skill argument type.";
-    }
-
-
-
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::ObjectPtr& i)
-    {
-        auto createdAronDict = std::make_shared<aron::data::Dict>();
-        createdAron = createdAronDict;
-        QTreeWidgetItem* el = parentItem->child(index);
-
-        unsigned int x = 0;
-        for (const auto& [key, value] : i->getMemberTypes())
-        {
-            AronTreeViewWidgetConverterVisitor v(el, x++);
-            aron::type::visit(v, value);
-
-            if (v.createdAron)
-            {
-                createdAronDict->addElement(key, v.createdAron);
-            }
-        }
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::DictPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::PairPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::TuplePtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::ListPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::NDArrayPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::MatrixPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::QuaternionPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::PositionPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::OrientationPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::PosePtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::ImagePtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::PointCloudPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::IntEnumPtr& i)
-    {
-        // TODO
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::IntPtr& i)
-    {
-        auto createdAronInt = std::make_shared<aron::data::Int>();
-        createdAron = createdAronInt;
-        QTreeWidgetItem* el = parentItem->child(index);
-
-        std::string str = el->text(1).toStdString();
-        if (str.empty())
-        {
-            createdAronInt->setValue(0);
-            return;
-        }
-
-        int val = std::stoi(str);
-        createdAronInt->setValue(val);
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::LongPtr& i)
-    {
-        auto createdAronLong = std::make_shared<aron::data::Long>();
-        createdAron = createdAronLong;
-        QTreeWidgetItem* el = parentItem->child(index);
-
-        std::string str = el->text(1).toStdString();
-        if (str.empty())
-        {
-            str = el->text(3).toStdString();
-        }
-
-        createdAronLong->fromString(str);
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::FloatPtr& i)
-    {
-        auto createdAronFloat = std::make_shared<aron::data::Float>();
-        createdAron = createdAronFloat;
-        QTreeWidgetItem* el = parentItem->child(index);
-
-        std::string str = el->text(1).toStdString();
-        if (str.empty())
-        {
-            str = el->text(3).toStdString();
-        }
-
-        createdAronFloat->fromString(str);
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::DoublePtr& i)
-    {
-        auto createdAronDouble = std::make_shared<aron::data::Double>();
-        createdAron = createdAronDouble;
-        QTreeWidgetItem* el = parentItem->child(index);
-
-        std::string str = el->text(1).toStdString();
-        if (str.empty())
-        {
-            str = el->text(3).toStdString();
-        }
-
-        createdAronDouble->fromString(str);
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::BoolPtr& i)
-    {
-        auto createdAronBool = std::make_shared<aron::data::Bool>();
-        createdAron = createdAronBool;
-        QTreeWidgetItem* el = parentItem->child(index);
-
-        std::string str = el->text(1).toStdString();
-        if (str.empty())
-        {
-            str = el->text(3).toStdString();
-        }
-
-        createdAronBool->fromString(str);
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::StringPtr& i)
-    {
-        auto createdAronString = std::make_shared<aron::data::String>();
-        createdAron = createdAronString;
-        QTreeWidgetItem* el = parentItem->child(index);
-
-        std::string str = el->text(1).toStdString();
-        createdAronString->fromString(str);
-    }
-
-    void
-    AronTreeViewWidgetConverterVisitor::visitAronVariant(const aron::type::TimePtr& i)
-    {
-        auto l = std::make_shared<aron::type::Long>();
-        visitLong(l);
-    }
-
-    void AronTreeViewWidgetConverterVisitor::visitUnknown(Input&)
-    {
-        ARMARX_WARNING_S << "Received an unknown type when trying to convert a skill argument type to an aron data object.";
-    }
-}
-
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModalController.cpp
deleted file mode 100644
index 25ec39a70..000000000
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModalController.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "AronTreeWidgetInputModalController.h"
-
-namespace armarx
-{
-    AronTreeWidgetInputModalController::AronTreeWidgetInputModalController(const std::string& name, const std::string& placeholder, QWidget * parent) :
-        QDialog(parent),
-        placeholder(placeholder)
-    {
-        widget.setupUi(this);
-
-        // set header
-        widget.groupBoxInput->setTitle(QString::fromStdString(name));
-        widget.textEditInput->setPlainText(QString::fromStdString(placeholder));
-
-        // connect signals
-        connect(widget.pushButtonReset, &QPushButton::clicked,
-                  this, &AronTreeWidgetInputModalController::reset);
-        connect(widget.pushButtonSubmit, &QPushButton::clicked,
-                  this, &AronTreeWidgetInputModalController::submit);
-    }
-
-    QString AronTreeWidgetInputModalController::getInput() const
-    {
-        return widget.textEditInput->toPlainText();
-    }
-
-
-    void AronTreeWidgetInputModalController::reset()
-    {
-        // reset to initial value
-        widget.textEditInput->setPlainText(QString::fromStdString(placeholder));
-    }
-
-    void AronTreeWidgetInputModalController::submit()
-    {
-        accept();
-    }
-}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModalController.h
deleted file mode 100644
index 1f4a0d0f9..000000000
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModalController.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#pragma once
-
-#include <stack>
-#include <ArmarXCore/core/system/ImportExportComponent.h>
-
-#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h>
-#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h>
-#include <ArmarXGui/libraries/SimpleConfigDialog/SimpleConfigDialog.h>
-
-#include <RobotAPI/gui-plugins/SkillManagerPlugin/ui_AronTreeWidgetInputModal.h>
-
-#include <QDialog>
-
-namespace armarx
-{
-    class ARMARXCOMPONENT_IMPORT_EXPORT
-        AronTreeWidgetInputModalController :
-        public QDialog
-    {
-        Q_OBJECT
-    public:
-        AronTreeWidgetInputModalController(const std::string& label, const std::string& placeholder = "", QWidget * parent = 0);
-
-        QString getInput() const;
-
-    private slots:
-        void reset();
-        void submit();
-
-    private:
-        std::string placeholder;
-        Ui::AronTreeWidgetInputModalWidget widget;
-    };
-}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt b/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt
index b23252198..749a9e263 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt
@@ -5,18 +5,36 @@ armarx_build_if(ArmarXGui_FOUND "ArmarXGui not available")
 
 # do not rename this variable, it is used in armarx_gui_library()...
 set(SOURCES
-    AronTreeWidgetEditor.cpp
-    AronTreeWidgetInputModalController.cpp
+    aronTreeWidget/visitors/AronTreeWidgetCreator.cpp
+    aronTreeWidget/visitors/AronTreeWidgetConverter.cpp
+    aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp
+    aronTreeWidget/Data.cpp
+    aronTreeWidget/AronTreeWidgetItem.cpp
+    aronTreeWidget/AronTreeWidgetController.cpp
+    aronTreeWidget/modal/AronTreeWidgetModal.cpp
+    aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.cpp
+    aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp
     SkillManagerMonitorWidgetController.cpp
 )
 
 set(HEADERS
-    AronTreeWidgetEditor.h
-    AronTreeWidgetInputModalController.h
+    aronTreeWidget/visitors/AronTreeWidgetCreator.h
+    aronTreeWidget/visitors/AronTreeWidgetConverter.h
+    aronTreeWidget/visitors/AronTreeWidgetModalCreator.h
+    aronTreeWidget/Data.h
+    aronTreeWidget/AronTreeWidgetItem.h
+    aronTreeWidget/AronTreeWidgetController.h
+    aronTreeWidget/modal/AronTreeWidgetModal.h
+    aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h
+    aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h
     SkillManagerMonitorWidgetController.h
 )
 
-set(GUI_UIS SkillManagerMonitorWidget.ui AronTreeWidgetInputModal.ui)
+set(GUI_UIS
+    SkillManagerMonitorWidget.ui
+    aronTreeWidget/modal/text/AronTreeWidgetTextInputModal.ui
+    aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui
+)
 
 # Add more libraries you depend on here, e.g. ${QT_LIBRARIES}.
 set(COMPONENT_LIBS RobotAPIInterfaces aron skills aronjsonconverter SimpleConfigDialog)
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
index 927d6daf0..15678facb 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
@@ -24,14 +24,14 @@
        <string>Manager</string>
       </property>
       <layout class="QGridLayout" name="gridLayout">
-       <item row="0" column="0">
-        <widget class="QPushButton" name="pushButtonRefreshProvidedSkills">
+       <item row="2" column="0">
+        <widget class="QLabel" name="label">
          <property name="text">
-          <string>Refresh</string>
+          <string>Update Frequency:</string>
          </property>
         </widget>
        </item>
-       <item row="1" column="0">
+       <item row="3" column="0" colspan="3">
         <widget class="QTreeWidget" name="treeWidgetSkills">
          <column>
           <property name="text">
@@ -50,6 +50,9 @@
          </column>
         </widget>
        </item>
+       <item row="2" column="1">
+        <widget class="QDoubleSpinBox" name="doubleSpinBoxUpdateFreq"/>
+       </item>
       </layout>
      </widget>
      <widget class="QGroupBox" name="groupBoxSkillDetails">
@@ -57,21 +60,28 @@
        <string>Skill Details</string>
       </property>
       <layout class="QGridLayout" name="gridLayout_2">
-       <item row="5" column="0">
+       <item row="0" column="0">
+        <widget class="QPushButton" name="pushButtonPaste">
+         <property name="text">
+          <string>Set from clipboard</string>
+         </property>
+        </widget>
+       </item>
+       <item row="6" column="0">
         <widget class="QPushButton" name="pushButtonStopSkill">
          <property name="text">
           <string>Stop</string>
          </property>
         </widget>
        </item>
-       <item row="1" column="0">
-        <widget class="QPushButton" name="pushButtonExecuteSkill">
+       <item row="0" column="1">
+        <widget class="QPushButton" name="pushButtonCopy">
          <property name="text">
-          <string>Execute</string>
+          <string>Copy args to clipboard</string>
          </property>
         </widget>
        </item>
-       <item row="0" column="0">
+       <item row="1" column="0" colspan="2">
         <widget class="QTreeWidget" name="treeWidgetSkillDetails">
          <column>
           <property name="text">
@@ -95,6 +105,13 @@
          </column>
         </widget>
        </item>
+       <item row="6" column="1">
+        <widget class="QPushButton" name="pushButtonExecuteSkill">
+         <property name="text">
+          <string>Execute</string>
+         </property>
+        </widget>
+       </item>
       </layout>
      </widget>
     </widget>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
index 720304e62..4a458d690 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
@@ -26,12 +26,21 @@
 
 #include "SkillManagerMonitorWidgetController.h"
 
-#include "AronTreeWidgetEditor.h"
-#include "AronTreeWidgetInputModalController.h"
+#include "aronTreeWidget/visitors/AronTreeWidgetCreator.h"
+#include "aronTreeWidget/visitors/AronTreeWidgetConverter.h"
+#include "aronTreeWidget/visitors/AronTreeWidgetModalCreator.h"
+
+// modals
+#include "aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h"
 
 // debug
 #include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
 
+#include <QDoubleSpinBox>
+#include <QClipboard>
+
+#include "aronTreeWidget/Data.h"
+
 //config
 namespace armarx
 {
@@ -64,9 +73,27 @@ namespace armarx
     SkillManagerMonitorWidgetController::SkillManagerMonitorWidgetController()
     {
         widget.setupUi(getWidget());
-        connect(widget.pushButtonRefreshProvidedSkills, &QPushButton::clicked,
+
+        widget.doubleSpinBoxUpdateFreq->setValue(5.0);
+        widget.doubleSpinBoxUpdateFreq->setMinimum(0);
+        widget.doubleSpinBoxUpdateFreq->setMaximum(100);
+        widget.doubleSpinBoxUpdateFreq->setSingleStep(0.5);
+        widget.doubleSpinBoxUpdateFreq->setSuffix(" Hz");
+
+        refreshSkillsResultTimer = new QTimer(this);
+        refreshSkillsResultTimer->setInterval(1000 / 5);  // Keep this stable.
+        refreshSkillsResultTimer->start();
+
+        connect(widget.doubleSpinBoxUpdateFreq, &QDoubleSpinBox::editingFinished,
+                this, &SkillManagerMonitorWidgetController::updateTimerFrequency);
+        connect(refreshSkillsResultTimer, &QTimer::timeout,
                 this, &SkillManagerMonitorWidgetController::refreshSkills);
 
+        connect(widget.pushButtonCopy, &QPushButton::clicked,
+                this, &SkillManagerMonitorWidgetController::copyCurrentConfig);
+        connect(widget.pushButtonPaste, &QPushButton::clicked,
+                this, &SkillManagerMonitorWidgetController::pasteCurrentConfig);
+
         connect(widget.pushButtonExecuteSkill, &QPushButton::clicked,
                 this, &SkillManagerMonitorWidgetController::executeSkill);
         connect(widget.pushButtonStopSkill, &QPushButton::clicked,
@@ -91,14 +118,19 @@ namespace armarx
 
 
     void SkillManagerMonitorWidgetController::onConnectComponent()
-    { getProxy(manager, observerName);
+    {
+        getProxy(manager, observerName);
         widget.groupBoxSkills->setTitle(QString::fromStdString(observerName));
         widget.treeWidgetSkillDetails->setEditTriggers(QAbstractItemView::EditTrigger::NoEditTriggers);
         widget.treeWidgetSkillDetails->setColumnHidden(3, true);
+
+        connected = true;
     }
 
     void SkillManagerMonitorWidgetController::onDisconnectComponent()
     {
+        connected = false;
+
         // reset all
         skills.clear();
         widget.treeWidgetSkills->clear();
@@ -108,29 +140,73 @@ namespace armarx
         selectedSkill.skillName = "";
     }
 
+    void SkillManagerMonitorWidgetController::updateTimerFrequency()
+    {
+        int f = static_cast<int>(std::round(1000 / widget.doubleSpinBoxUpdateFreq->value()));
+        refreshSkillsResultTimer->setInterval(f);
+    }
+
     void SkillManagerMonitorWidgetController::refreshSkills()
     {
-        // get all skills
-        skills.clear();
-        for (const auto& [providerName, provider] : manager->getSkillProviders())
+        if (!connected)
+            return;
+
+        // remove non-existing ones
+        auto managerSkills = manager->getSkillProviders();
+        std::vector<std::string> removedProviders;
+        for (auto it = skills.begin(); it != skills.end();)
         {
-            SkillProviderData providerData;
-            providerData.providerName = providerName;
-            providerData.skillDescriptions = provider->getSkills();
-            skills.insert(std::make_pair(providerName, providerData));
+            // TODO: iterate over skills, not just over providers!
+            std::string providerName = it->first;
+            if (managerSkills.find(providerName) == managerSkills.end())
+            {
+                removedProviders.push_back(providerName);
+                it = skills.erase(it);
+            }
+            else
+            {
+                it++;
+            }
         }
 
-        // put skills into tree view
-        widget.treeWidgetSkills->clear();
+        // add new ones
+        std::vector<std::string> newProviders;
+        for (const auto& [providerName, provider] : managerSkills)
+        {
+            if (skills.find(providerName) == skills.end())
+            {
+                SkillProviderData providerData;
+                providerData.providerName = providerName;
+                providerData.skillDescriptions = provider->getSkills();
+                skills.insert(std::make_pair(providerName, providerData));
+
+                newProviders.push_back(providerName);
+            }
+        }
+
+        // remove providers from tree
+        for (int i = 0; i < widget.treeWidgetSkills->topLevelItemCount(); ++i)
+        {
+            QTreeWidgetItem* item = widget.treeWidgetSkills->topLevelItem(i);
+            if (std::find(removedProviders.begin(), removedProviders.end(), item->text(0).toStdString()) != removedProviders.end())
+            {
+                delete widget.treeWidgetSkills->takeTopLevelItem(i);
+            }
+        }
+
+        // add new providers
         for (const auto& [providerName, provider] : skills)
         {
-            auto it = new QTreeWidgetItem(widget.treeWidgetSkills);
-            it->setText(0, QString::fromStdString(providerName));
-            for (const auto& [name, sk] : provider.skillDescriptions)
+            if (std::find(newProviders.begin(), newProviders.end(), providerName) != newProviders.end())
             {
-                auto itsk = new QTreeWidgetItem(it);
-                it->addChild(itsk);
-                itsk->setText(0, QString::fromStdString(name));
+                auto it = new QTreeWidgetItem(widget.treeWidgetSkills);
+                it->setText(0, QString::fromStdString(providerName));
+                for (const auto& [name, sk] : provider.skillDescriptions)
+                {
+                    auto itsk = new QTreeWidgetItem(it);
+                    it->addChild(itsk);
+                    itsk->setText(0, QString::fromStdString(name));
+                }
             }
         }
     }
@@ -148,22 +224,12 @@ namespace armarx
             return;
         }
 
-        const auto& skillDescription = prv.skillDescriptions.at(selectedSkill.skillName);
+        auto data = getConfigAsAron();
+
         skills::manager::dto::SkillExecutionInfo exInfo;
         exInfo.providerName = selectedSkill.providerName;
         exInfo.skillName = selectedSkill.skillName;
-
-        // create argument aron (if there is an accepted type set)
-        if (skillsArgumentsTreeWidgetItem)
-        {
-            auto aron_accepted_type = std::make_shared<aron::type::Object>(*skillDescription.acceptedType);
-
-            AronTreeViewWidgetConverterVisitor v(skillsArgumentsTreeWidgetItem, 0);
-            aron::type::visit(v, aron_accepted_type);
-
-            auto aron_args = aron::data::Dict::DynamicCastAndCheck(v.createdAron);
-            exInfo.params = aron_args->toAronDictPtr();
-        }
+        exInfo.params = aron::data::Dict::ToAronDictDTO(data);
 
         ARMARX_INFO << "Executing skill from GUI: " << selectedSkill.providerName << "/" << selectedSkill.skillName;
         manager->executeSkill(exInfo);
@@ -221,6 +287,7 @@ namespace armarx
 
         // setup table view
         widget.treeWidgetSkillDetails->clear();
+        aronTreeWidgetController = nullptr;
         skillsArgumentsTreeWidgetItem = nullptr;
 
         auto skillDesc = skills.at(selectedSkill.providerName).skillDescriptions.at(selectedSkill.skillName);
@@ -256,13 +323,7 @@ namespace armarx
             skillsArgumentsTreeWidgetItem = new QTreeWidgetItem(widget.treeWidgetSkillDetails,
                                           {QString::fromStdString("Arguments")});
 
-            AronTreeViewWidgetCreatorVisitor v(skillsArgumentsTreeWidgetItem);
-            aron::type::visit(v, aron_args);
-
-            if (v.createdQWidgetItem)
-            {
-                skillsArgumentsTreeWidgetItem->addChild(v.createdQWidgetItem);
-            }
+            aronTreeWidgetController = std::make_shared<AronTreeWidgetController>(widget.treeWidgetSkillDetails, skillsArgumentsTreeWidgetItem, aron_args);
         }
         else
         {
@@ -271,24 +332,64 @@ namespace armarx
         }
     }
 
-    void SkillManagerMonitorWidgetController::onTreeWidgetItemDoubleClicked(QTreeWidgetItem * item, int column)
+    aron::data::DictPtr SkillManagerMonitorWidgetController::getConfigAsAron() const
+    {
+        // create argument aron (if there is an accepted type set)
+        if (aronTreeWidgetController)
+        {
+            return aronTreeWidgetController->convertToAron();
+        }
+        return nullptr;
+    }
+
+    void SkillManagerMonitorWidgetController::copyCurrentConfig()
+    {
+        auto data = getConfigAsAron();
+        if (!data)
+        {
+            return;
+        }
+
+        auto json = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(data);
+        QClipboard* clipboard = QApplication::clipboard();
+        clipboard->setText(QString::fromStdString(json.dump(2)));
+    }
+
+    void SkillManagerMonitorWidgetController::pasteCurrentConfig()
+    {
+        QClipboard* clipboard = QApplication::clipboard();
+        std::string s = clipboard->text().toStdString();
+        nlohmann::json json = nlohmann::json::parse(s);
+        auto data = aron::converter::AronNlohmannJSONConverter::ConvertFromNlohmannJSONObject(json);
+
+        if (!aronTreeWidgetController)
+        {
+            return;
+        }
+
+        aronTreeWidgetController->setFromAron(data);
+    }
+
+    void SkillManagerMonitorWidgetController::onTreeWidgetItemDoubleClicked(QTreeWidgetItem* item, int column)
     {
+        if (!item)
+        {
+            return;
+        }
+
         if (column == 1)
         {
             if (item->flags() & Qt::ItemIsEditable) // we use the flag to indicate whether the item is editable or not
             {
-                std::string name = item->text(0).toStdString();
-                std::string placeholder = item->text(1).toStdString();
-                if (placeholder.empty())
-                {
-                    placeholder = item->text(3).toStdString();
-                    ARMARX_IMPORTANT << "Setting placeholder to " << placeholder;
-                }
-
-                auto modal = AronTreeWidgetInputModalController(name, placeholder, getWidget());
-                modal.exec();
-
-                item->setText(1, modal.getInput());
+                // we assume its aron item
+                AronTreeWidgetItem* aItem = AronTreeWidgetItem::DynamicCastAndCheck(item);
+                std::string name = aItem->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME).toStdString();
+                std::string type = aItem->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE).toStdString();
+
+                AronTreeWidgetModalCreatorVisitor v(name, aItem, widget.treeWidgetSkillDetails);
+                aron::type::visit(v, aItem->aronType);
+                auto modal = v.createdModal;
+                modal->exec();
             }
         }
     }
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
index ae65fcbcb..9ba0d8a37 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
@@ -32,11 +32,14 @@
 
 #include <RobotAPI/gui-plugins/SkillManagerPlugin/ui_SkillManagerMonitorWidget.h>
 
+#include "aronTreeWidget/AronTreeWidgetController.h"
 
 #include <RobotAPI/libraries/aron/core/type/variant/All.h>
 #include <RobotAPI/libraries/aron/core/data/variant/All.h>
 #include <RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h>
 
+#include <QTimer>
+
 namespace armarx
 {
     class ARMARXCOMPONENT_IMPORT_EXPORT
@@ -76,10 +79,17 @@ namespace armarx
         void stopSkill();
         void executeSkill();
 
+        void updateTimerFrequency();
         void refreshSkills();
 
+        void copyCurrentConfig();
+        void pasteCurrentConfig();
+
         void onTreeWidgetItemDoubleClicked(QTreeWidgetItem * item, int column);
 
+    private:
+        aron::data::DictPtr getConfigAsAron() const;
+
     private:
         /**
          * Widget Form
@@ -110,6 +120,11 @@ namespace armarx
 
         // Helper to get the treeWidgetItem easily
         QTreeWidgetItem* skillsArgumentsTreeWidgetItem = nullptr;
+        AronTreeWidgetControllerPtr aronTreeWidgetController = nullptr;
+
+        // others
+        std::atomic_bool connected = false;
+        QTimer* refreshSkillsResultTimer;
     };
 }
 
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp
new file mode 100644
index 000000000..1eeaf00ff
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp
@@ -0,0 +1,38 @@
+#include "AronTreeWidgetController.h"
+
+#include "visitors/AronTreeWidgetConverter.h"
+
+namespace armarx
+{
+    AronTreeWidgetController::AronTreeWidgetController(QTreeWidget* tree, QTreeWidgetItem* parent, const aron::type::ObjectPtr& type):
+        parent(parent),
+        tree(tree),
+        type(type)
+    {
+        AronTreeWidgetCreatorVisitor v;
+        aron::type::visit(v, type);
+
+        if (v.createdQWidgetItem)
+        {
+            parent->addChild(v.createdQWidgetItem);
+        }
+    }
+
+    aron::data::DictPtr AronTreeWidgetController::convertToAron() const
+    {
+        if (parent)
+        {
+            AronTreeWidgetConverterVisitor v(parent, 0);
+            aron::type::visit(v, type);
+
+            auto aron_args = aron::data::Dict::DynamicCastAndCheck(v.createdAron);
+            return aron_args;
+        }
+        return nullptr;
+    }
+
+    void AronTreeWidgetController::setFromAron(const aron::data::DictPtr&)
+    {
+
+    }
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.h
new file mode 100644
index 000000000..4e73deb05
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include <stack>
+#include <ArmarXCore/core/system/ImportExportComponent.h>
+
+#include "Data.h"
+
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h>
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h>
+
+#include <QTreeWidget>
+#include "visitors/AronTreeWidgetCreator.h"
+#include "AronTreeWidgetItem.h"
+
+namespace armarx
+{
+    class AronTreeWidgetController
+    {
+
+    public:
+        AronTreeWidgetController(QTreeWidget* tree, QTreeWidgetItem* parent, const aron::type::ObjectPtr& type);
+
+        aron::data::DictPtr convertToAron() const;
+        void setFromAron(const aron::data::DictPtr&);
+
+    private:
+        QTreeWidgetItem* parent;
+        QTreeWidget* tree;
+
+        aron::type::ObjectPtr type;
+    };
+
+    using AronTreeWidgetControllerPtr = std::shared_ptr<AronTreeWidgetController>;
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.cpp
new file mode 100644
index 000000000..e53161bb8
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.cpp
@@ -0,0 +1,28 @@
+#include "AronTreeWidgetItem.h"
+
+#include <RobotAPI/libraries/aron/core/type/variant/All.h>
+
+namespace armarx
+{
+    AronTreeWidgetItem* AronTreeWidgetItem::DynamicCast(QTreeWidgetItem* i)
+    {
+        return dynamic_cast<AronTreeWidgetItem*>(i);
+    }
+
+    AronTreeWidgetItem* AronTreeWidgetItem::copy()
+    {
+        AronTreeWidgetItem* ret = new AronTreeWidgetItem(*this);
+        return ret;
+    }
+
+    AronTreeWidgetItem* AronTreeWidgetItem::DynamicCastAndCheck(QTreeWidgetItem* i)
+    {
+        if (!i)
+        {
+            return nullptr;
+        }
+        auto c = DynamicCast(i);
+        ARMARX_CHECK_NOT_NULL(c);
+        return c;
+    }
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.h
new file mode 100644
index 000000000..3d6d0c2a3
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include <stack>
+#include <ArmarXCore/core/system/ImportExportComponent.h>
+
+#include "Data.h"
+
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h>
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h>
+
+#include <RobotAPI/libraries/aron/core/type/variant/Variant.h>
+
+#include <QTreeWidget>
+
+namespace armarx
+{
+    class AronTreeWidgetItem : public QObject, public QTreeWidgetItem
+    {
+        Q_OBJECT
+    public:
+        AronTreeWidgetItem(const AronTreeWidgetItem& other) :
+            QObject(),
+            QTreeWidgetItem(other)
+        {
+            aronType = other.aronType;
+        }
+
+        using QTreeWidgetItem::QTreeWidgetItem;
+
+        AronTreeWidgetItem* copy(); // differs from clone!!!!
+
+        static AronTreeWidgetItem* DynamicCast(QTreeWidgetItem*);
+
+        static AronTreeWidgetItem* DynamicCastAndCheck(QTreeWidgetItem*);
+
+        aron::type::VariantPtr aronType;
+
+    };
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/Data.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/Data.cpp
new file mode 100644
index 000000000..48b5816e7
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/Data.cpp
@@ -0,0 +1,6 @@
+#include "Data.h"
+
+namespace armarx
+{
+
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/Data.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/Data.h
new file mode 100644
index 000000000..3fea187d3
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/Data.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <string>
+
+namespace armarx::aron_tree_widget::constantes
+{
+    const int TREE_WIDGET_ITEM_NAME = 0;
+    const int TREE_WIDGET_ITEM_VALUE = 1;
+    const int TREE_WIDGET_ITEM_TYPE = 2;
+
+    const std::string ITEM_EMPTY_MESSAGE = "(double click to edit)";
+    const std::string NEW_ITEM_DEFAULT_MESSAGE = "(Please set via main GUI (not in modal))";
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.cpp
new file mode 100644
index 000000000..8fbd9c5ba
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.cpp
@@ -0,0 +1,20 @@
+#include "AronTreeWidgetModal.h"
+
+namespace armarx
+{
+    AronTreeWidgetModal::AronTreeWidgetModal(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) :
+        QDialog(parent),
+        item(item),
+        label(label),
+        parent(parent)
+    {
+        init.aronType = item->aronType;
+        init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME, item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME));
+        init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE));
+        init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE, item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE));
+        for (int i = 0; i < item->childCount(); ++i)
+        {
+            init.addChild(item->child(i)->clone());
+        }
+    }
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.h
new file mode 100644
index 000000000..cda9f7e72
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.h
@@ -0,0 +1,57 @@
+#pragma once
+
+#include <stack>
+#include <ArmarXCore/core/system/ImportExportComponent.h>
+
+#include "../AronTreeWidgetItem.h"
+#include "../Data.h"
+
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h>
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h>
+
+#include <QDialog>
+#include <QTreeWidget>
+
+namespace armarx
+{
+    class AronTreeWidgetModal  :
+            public QDialog
+    {
+        Q_OBJECT
+
+    public:
+        AronTreeWidgetModal(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent);
+
+    protected slots:
+        virtual void reset()
+        {
+            item->aronType = init.aronType;
+            item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME, init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME));
+            item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE));
+            item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE, init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE));
+            for (int i = 0; i < item->childCount(); ++i)
+            {
+                item->removeChild(item->child(i));
+            }
+            for (int i = 0; i < init.childCount(); ++i)
+            {
+                item->addChild(init.child(i)->clone());
+            }
+        }
+        virtual void submit()
+        {
+            accept();
+        }
+
+    protected:
+
+        AronTreeWidgetItem init;
+        AronTreeWidgetItem* item;
+
+    private:
+        std::string label;
+        QTreeWidget* parent;
+    };
+
+    using AronTreeWidgetModalControllerPtr = std::shared_ptr<AronTreeWidgetModal>;
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui
new file mode 100644
index 000000000..b9b800ed2
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AronTreeWidgetDictInputModalWidget</class>
+ <widget class="QWidget" name="AronTreeWidgetDictInputModalWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1015</width>
+    <height>498</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>SkillManagerMonitorWidget</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QSplitter" name="splitter">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <widget class="QGroupBox" name="groupBoxInput">
+      <property name="title">
+       <string>InputField</string>
+      </property>
+      <layout class="QGridLayout" name="gridLayout">
+       <item row="0" column="0" colspan="5">
+        <widget class="QTreeWidget" name="treeWidgetDict">
+         <column>
+          <property name="text">
+           <string>Key</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Value</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Type</string>
+          </property>
+         </column>
+        </widget>
+       </item>
+       <item row="1" column="3" colspan="2">
+        <widget class="QPushButton" name="pushButtonAddElement">
+         <property name="text">
+          <string>+ Add element</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="0" colspan="3">
+        <widget class="QLineEdit" name="lineEditKey">
+         <property name="maximumSize">
+          <size>
+           <width>880</width>
+           <height>16777215</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>Enter Key</string>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="0">
+        <widget class="QPushButton" name="pushButtonReset">
+         <property name="text">
+          <string>Reset</string>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="1" colspan="4">
+        <widget class="QPushButton" name="pushButtonSubmit">
+         <property name="text">
+          <string>Submit</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp
new file mode 100644
index 000000000..f7d83d98b
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp
@@ -0,0 +1,73 @@
+#include "AronTreeWidgetDictInputModalController.h"
+
+#include <RobotAPI/libraries/aron/core/type/variant/All.h>
+#include "../../visitors/AronTreeWidgetCreator.h"
+
+namespace armarx
+{
+    AronTreeWidgetDictInputModalController::AronTreeWidgetDictInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) :
+        AronTreeWidgetModal(label, item, parent)
+    {
+        widget.setupUi(this);
+
+        // set header
+        widget.groupBoxInput->setTitle(QString::fromStdString(label));
+        reset();
+
+        // connect signals
+        connect(widget.pushButtonAddElement, &QPushButton::clicked,
+                this, &AronTreeWidgetDictInputModalController::addEmptyElement);
+
+        connect(widget.pushButtonReset, &QPushButton::clicked,
+                  this, &AronTreeWidgetDictInputModalController::reset);
+        connect(widget.pushButtonSubmit, &QPushButton::clicked,
+                  this, &AronTreeWidgetDictInputModalController::submit);
+
+    }
+
+    void AronTreeWidgetDictInputModalController::submit()
+    {
+        for (const auto& added : addedItems)
+        {
+            item->addChild(added->copy());
+        }
+
+        AronTreeWidgetModal::submit();
+    }
+
+    void AronTreeWidgetDictInputModalController::reset()
+    {
+        AronTreeWidgetModal::reset();
+
+        // reset to initial value
+        widget.treeWidgetDict->clear();
+        for (int i = 0; i < init.childCount(); ++i)
+        {
+            auto el = init.child(i);
+            widget.treeWidgetDict->addTopLevelItem(el->clone());
+        }
+    }
+
+    void AronTreeWidgetDictInputModalController::addEmptyElement()
+    {
+        QString s = widget.lineEditKey->text();
+        widget.lineEditKey->setText("Enter Key");
+
+        if (widget.treeWidgetDict->findItems(s, Qt::MatchFlag::MatchExactly, 0).empty())
+        {
+            auto t = item->aronType;
+            auto d = aron::type::Dict::DynamicCastAndCheck(t);
+            auto ac = d->getAcceptedType();
+
+            AronTreeWidgetCreatorVisitor v;
+            aron::type::visit(v, ac);
+
+            if (v.createdQWidgetItem)
+            {
+                v.createdQWidgetItem->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME, s);
+                addedItems.push_back(v.createdQWidgetItem);
+                widget.treeWidgetDict->addTopLevelItem(v.createdQWidgetItem);
+            }
+        }
+    }
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h
new file mode 100644
index 000000000..f5d94a04b
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <stack>
+#include <ArmarXCore/core/system/ImportExportComponent.h>
+
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h>
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h>
+#include <ArmarXGui/libraries/SimpleConfigDialog/SimpleConfigDialog.h>
+
+#include "../AronTreeWidgetModal.h"
+
+#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/ui_AronTreeWidgetDictInputModal.h>
+
+#include <QDialog>
+
+namespace armarx
+{
+    class AronTreeWidgetDictInputModalController :
+        public AronTreeWidgetModal
+    {
+    public:
+
+        AronTreeWidgetDictInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent);
+
+    private slots:
+
+        void submit() final;
+        void reset() final;
+
+        void addEmptyElement();
+
+    private:
+        std::vector<AronTreeWidgetItem*> addedItems;
+        Ui::AronTreeWidgetDictInputModalWidget widget;
+    };
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/others_are_TODO b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/others_are_TODO
new file mode 100644
index 000000000..e69de29bb
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModal.ui
similarity index 91%
rename from source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModal.ui
rename to source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModal.ui
index baec62815..ed40962f9 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetInputModal.ui
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModal.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>AronTreeWidgetInputModalWidget</class>
- <widget class="QWidget" name="AronTreeWidgetInputModalWidget">
+ <class>AronTreeWidgetTextInputModalWidget</class>
+ <widget class="QWidget" name="AronTreeWidgetTextInputModalWidget">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.cpp
new file mode 100644
index 000000000..972fe6ff9
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.cpp
@@ -0,0 +1,35 @@
+#include "AronTreeWidgetTextInputModalController.h"
+
+namespace armarx
+{
+    AronTreeWidgetTextInputModalController::AronTreeWidgetTextInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) :
+        AronTreeWidgetModal(label, item, parent)
+    {
+        widget.setupUi(this);
+
+        // set header
+        widget.groupBoxInput->setTitle(QString::fromStdString(label));
+        reset();
+
+        // connect signals
+        connect(widget.pushButtonReset, &QPushButton::clicked,
+                  this, &AronTreeWidgetTextInputModalController::reset);
+        connect(widget.pushButtonSubmit, &QPushButton::clicked,
+                  this, &AronTreeWidgetTextInputModalController::submit);
+    }
+
+    void AronTreeWidgetTextInputModalController::submit()
+    {
+        item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, widget.textEditInput->toPlainText());
+
+        AronTreeWidgetModal::submit();
+    }
+
+    void AronTreeWidgetTextInputModalController::reset()
+    {
+        AronTreeWidgetModal::reset();
+
+        // reset to initial value
+        widget.textEditInput->setPlainText(init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE));
+    }
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h
new file mode 100644
index 000000000..216451f4a
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include <stack>
+#include <ArmarXCore/core/system/ImportExportComponent.h>
+
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h>
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h>
+#include <ArmarXGui/libraries/SimpleConfigDialog/SimpleConfigDialog.h>
+
+#include "../AronTreeWidgetModal.h"
+
+#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/ui_AronTreeWidgetTextInputModal.h>
+
+#include <QDialog>
+
+namespace armarx
+{
+    class AronTreeWidgetTextInputModalController :
+        public AronTreeWidgetModal
+    {
+
+    public:
+
+        AronTreeWidgetTextInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent);
+
+    private slots:
+
+        void submit() final;
+        void reset() final;
+
+    private:
+        Ui::AronTreeWidgetTextInputModalWidget widget;
+    };
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp
new file mode 100644
index 000000000..e9effb321
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp
@@ -0,0 +1,252 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \package    RobotAPI::gui-plugins::SkillManagerMonitorWidgetController
+ * \author     Raphael Grimm ( raphael dot grimm at kit dot edu )
+ * \date       2020
+ * \copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include <string>
+
+#include <ArmarXCore/util/CPPUtility/Iterator.h>
+
+#include "AronTreeWidgetConverter.h"
+
+// debug
+#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
+
+//visitors
+namespace armarx
+{
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::ObjectPtr& i)
+    {
+        auto createdAronDict = std::make_shared<aron::data::Dict>();
+        createdAron = createdAronDict;
+        QTreeWidgetItem* el = parentItem->child(index);
+
+        unsigned int x = 0;
+        for (const auto& [key, value] : i->getMemberTypes())
+        {
+            AronTreeWidgetConverterVisitor v(el, x++);
+            aron::type::visit(v, value);
+
+            if (v.createdAron)
+            {
+                createdAronDict->addElement(key, v.createdAron);
+            }
+        }
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::DictPtr& i)
+    {
+        auto createdAronDict = std::make_shared<aron::data::Dict>();
+        createdAron = createdAronDict;
+        QTreeWidgetItem* el = parentItem->child(index);
+
+        for (int x = 0; x < el->childCount(); ++x)
+        {
+            auto it = el->child(x);
+            AronTreeWidgetConverterVisitor v(el, x);
+            aron::type::visit(v, i->getAcceptedType());
+
+            if (v.createdAron)
+            {
+                createdAronDict->addElement(it->text(0).toStdString(), v.createdAron);
+            }
+        }
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::PairPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::TuplePtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::ListPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::NDArrayPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::MatrixPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::QuaternionPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::PositionPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::OrientationPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::PosePtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::ImagePtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::PointCloudPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::IntEnumPtr& i)
+    {
+        // TODO
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::IntPtr& i)
+    {
+        auto createdAronInt = std::make_shared<aron::data::Int>();
+        createdAron = createdAronInt;
+        QTreeWidgetItem* el = parentItem->child(index);
+
+        std::string str = el->text(1).toStdString();
+        if (str.empty())
+        {
+            createdAronInt->setValue(0);
+            return;
+        }
+
+        int val = std::stoi(str);
+        createdAronInt->setValue(val);
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::LongPtr& i)
+    {
+        auto createdAronLong = std::make_shared<aron::data::Long>();
+        createdAron = createdAronLong;
+        QTreeWidgetItem* el = parentItem->child(index);
+
+        std::string str = el->text(1).toStdString();
+        if (str.empty())
+        {
+            str = el->text(3).toStdString();
+        }
+
+        createdAronLong->fromString(str);
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::FloatPtr& i)
+    {
+        auto createdAronFloat = std::make_shared<aron::data::Float>();
+        createdAron = createdAronFloat;
+        QTreeWidgetItem* el = parentItem->child(index);
+
+        std::string str = el->text(1).toStdString();
+        if (str.empty())
+        {
+            str = el->text(3).toStdString();
+        }
+
+        createdAronFloat->fromString(str);
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::DoublePtr& i)
+    {
+        auto createdAronDouble = std::make_shared<aron::data::Double>();
+        createdAron = createdAronDouble;
+        QTreeWidgetItem* el = parentItem->child(index);
+
+        std::string str = el->text(1).toStdString();
+        if (str.empty())
+        {
+            str = el->text(3).toStdString();
+        }
+
+        createdAronDouble->fromString(str);
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::BoolPtr& i)
+    {
+        auto createdAronBool = std::make_shared<aron::data::Bool>();
+        createdAron = createdAronBool;
+        QTreeWidgetItem* el = parentItem->child(index);
+
+        std::string str = el->text(1).toStdString();
+        if (str.empty())
+        {
+            str = el->text(3).toStdString();
+        }
+
+        createdAronBool->fromString(str);
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::StringPtr& i)
+    {
+        auto createdAronString = std::make_shared<aron::data::String>();
+        createdAron = createdAronString;
+        QTreeWidgetItem* el = parentItem->child(index);
+
+        std::string str = el->text(1).toStdString();
+        createdAronString->fromString(str);
+    }
+
+    void
+    AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::TimePtr& i)
+    {
+        auto l = std::make_shared<aron::type::Long>();
+        visitLong(l);
+    }
+
+    void AronTreeWidgetConverterVisitor::visitUnknown(Input&)
+    {
+        ARMARX_WARNING_S << "Received an unknown type when trying to convert a skill argument type to an aron data object.";
+    }
+}
+
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetEditor.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.h
similarity index 60%
rename from source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetEditor.h
rename to source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.h
index 3d3917830..5021cb5ae 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/AronTreeWidgetEditor.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.h
@@ -39,48 +39,8 @@
 
 namespace armarx
 {
-    // Convert aron type to tree widget
-    class AronTreeViewWidgetCreatorVisitor :
-            public armarx::aron::type::ConstVariantVisitor
-    {
-    public:
-        QTreeWidgetItem* parentItem;
-        QTreeWidgetItem* createdQWidgetItem;
-
-        AronTreeViewWidgetCreatorVisitor() = delete;
-        AronTreeViewWidgetCreatorVisitor(QTreeWidgetItem* i) :
-            parentItem(i)
-        {}
-
-        void createSimpleTreeViewWidget(Input& i);
-
-        void visitAronVariant(const aron::type::ObjectPtr&) override;
-        void visitAronVariant(const aron::type::DictPtr& i) override;
-        void visitAronVariant(const aron::type::PairPtr& i) override;
-        void visitAronVariant(const aron::type::TuplePtr& i) override;
-        void visitAronVariant(const aron::type::ListPtr& i) override;
-        void visitAronVariant(const aron::type::NDArrayPtr& i) override;
-        void visitAronVariant(const aron::type::MatrixPtr& i) override;
-        void visitAronVariant(const aron::type::QuaternionPtr& i) override;
-        void visitAronVariant(const aron::type::PositionPtr& i) override;
-        void visitAronVariant(const aron::type::OrientationPtr& i) override;
-        void visitAronVariant(const aron::type::PosePtr& i) override;
-        void visitAronVariant(const aron::type::ImagePtr& i) override;
-        void visitAronVariant(const aron::type::PointCloudPtr& i) override;
-        void visitAronVariant(const aron::type::IntEnumPtr& i) override;
-        void visitAronVariant(const aron::type::IntPtr& i) override;
-        void visitAronVariant(const aron::type::LongPtr& i) override;
-        void visitAronVariant(const aron::type::FloatPtr& i) override;
-        void visitAronVariant(const aron::type::DoublePtr& i) override;
-        void visitAronVariant(const aron::type::BoolPtr& i) override;
-        void visitAronVariant(const aron::type::StringPtr& i) override;
-        void visitAronVariant(const aron::type::TimePtr& i) override;
-        void visitUnknown(Input&) override;
-    };
-
-
     // Conversion from TreeView to aron data
-    class AronTreeViewWidgetConverterVisitor :
+    class AronTreeWidgetConverterVisitor :
             public armarx::aron::type::ConstVariantVisitor
     {
     public:
@@ -88,8 +48,8 @@ namespace armarx
         int index;
         aron::data::VariantPtr createdAron;
 
-        AronTreeViewWidgetConverterVisitor() = delete;
-        AronTreeViewWidgetConverterVisitor(QTreeWidgetItem* i, int x) :
+        AronTreeWidgetConverterVisitor() = delete;
+        AronTreeWidgetConverterVisitor(QTreeWidgetItem* i, int x) :
             parentItem(i), index(x)
         {}
 
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp
new file mode 100644
index 000000000..b3a868208
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp
@@ -0,0 +1,144 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \package    RobotAPI::gui-plugins::SkillManagerMonitorWidgetController
+ * \author     Raphael Grimm ( raphael dot grimm at kit dot edu )
+ * \date       2020
+ * \copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include <string>
+
+#include <ArmarXCore/util/CPPUtility/Iterator.h>
+
+#include "AronTreeWidgetCreator.h"
+
+// debug
+#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
+
+#include "../Data.h"
+
+//visitors
+namespace armarx
+{
+    void
+    AronTreeWidgetCreatorVisitor::createSimpleTreeViewWidget(Input& i, const std::string& defaul)
+    {
+        ARMARX_CHECK_NOT_NULL(i);
+
+        auto key = i->getPath().getLastElement();
+        createdQWidgetItem = new AronTreeWidgetItem();
+        createdQWidgetItem->aronType = i;
+        createdQWidgetItem->setText(0, QString::fromStdString(key));
+        createdQWidgetItem->setText(1, QString::fromStdString(defaul));
+        createdQWidgetItem->setText(2, QString::fromStdString(i->getShortName()));
+        createdQWidgetItem->setText(3, QString::fromStdString(aron_tree_widget::constantes::ITEM_EMPTY_MESSAGE) /*QString::fromStdString(i->getDefaultFromString())*/);
+        createdQWidgetItem->setFlags(createdQWidgetItem->flags() | Qt::ItemIsEditable);
+    }
+
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::ObjectPtr& i)
+    {
+        ARMARX_CHECK_NOT_NULL(i);
+
+        auto key = i->getObjectName();
+        if (i->getPath().hasElement())
+        {
+            key = i->getPath().getLastElement();
+        }
+
+        createdQWidgetItem = new AronTreeWidgetItem();
+        createdQWidgetItem->setText(0, QString::fromStdString(key));
+
+        for (const auto& [key, value] : i->getMemberTypes())
+        {
+            AronTreeWidgetCreatorVisitor v;
+            aron::type::visit(v, value);
+
+            if (v.createdQWidgetItem)
+            {
+                createdQWidgetItem->addChild(v.createdQWidgetItem);
+            }
+        }
+    }
+
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::DictPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::PairPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::TuplePtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::ListPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::NDArrayPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::MatrixPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::QuaternionPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::PositionPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::OrientationPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::PosePtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::ImagePtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::PointCloudPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::IntEnumPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::IntPtr& i)
+    { createSimpleTreeViewWidget(i, "0"); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::LongPtr& i)
+    { createSimpleTreeViewWidget(i, "0"); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::FloatPtr& i)
+    { createSimpleTreeViewWidget(i, "0.0"); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::DoublePtr& i)
+    { createSimpleTreeViewWidget(i, "0.0"); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::BoolPtr& i)
+    { createSimpleTreeViewWidget(i, "false"); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::StringPtr& i)
+    { createSimpleTreeViewWidget(i, ""); }
+    void
+    AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::TimePtr& i)
+    { createSimpleTreeViewWidget(i, "0"); }
+
+    void AronTreeWidgetCreatorVisitor::visitUnknown(Input&)
+    {
+        ARMARX_WARNING_S << "Received an unknown type when trying to create a tree view widget for a skill argument type.";
+    }
+}
+
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.h
new file mode 100644
index 000000000..a81d1137d
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.h
@@ -0,0 +1,79 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::gui-plugins::SkillManagerMonitorWidgetController
+ * @author     Raphael Grimm ( raphael dot grimm at kit dot edu )
+ * @date       2020
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+#pragma once
+
+#include <stack>
+#include <ArmarXCore/core/system/ImportExportComponent.h>
+
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h>
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h>
+#include <ArmarXGui/libraries/SimpleConfigDialog/SimpleConfigDialog.h>
+
+#include <RobotAPI/interface/skills/SkillMemoryInterface.h>
+
+#include <RobotAPI/gui-plugins/SkillManagerPlugin/ui_SkillManagerMonitorWidget.h>
+
+#include "../AronTreeWidgetItem.h"
+
+#include <RobotAPI/libraries/aron/core/type/variant/All.h>
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
+#include <RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h>
+
+namespace armarx
+{
+    // Convert aron type to tree widget
+    class AronTreeWidgetCreatorVisitor :
+            public armarx::aron::type::ConstVariantVisitor
+    {
+    public:
+        AronTreeWidgetItem* createdQWidgetItem;
+
+        AronTreeWidgetCreatorVisitor() = default;
+
+        void createSimpleTreeViewWidget(Input& i, const std::string&);
+
+        void visitAronVariant(const aron::type::ObjectPtr&) override;
+        void visitAronVariant(const aron::type::DictPtr& i) override;
+        void visitAronVariant(const aron::type::PairPtr& i) override;
+        void visitAronVariant(const aron::type::TuplePtr& i) override;
+        void visitAronVariant(const aron::type::ListPtr& i) override;
+        void visitAronVariant(const aron::type::NDArrayPtr& i) override;
+        void visitAronVariant(const aron::type::MatrixPtr& i) override;
+        void visitAronVariant(const aron::type::QuaternionPtr& i) override;
+        void visitAronVariant(const aron::type::PositionPtr& i) override;
+        void visitAronVariant(const aron::type::OrientationPtr& i) override;
+        void visitAronVariant(const aron::type::PosePtr& i) override;
+        void visitAronVariant(const aron::type::ImagePtr& i) override;
+        void visitAronVariant(const aron::type::PointCloudPtr& i) override;
+        void visitAronVariant(const aron::type::IntEnumPtr& i) override;
+        void visitAronVariant(const aron::type::IntPtr& i) override;
+        void visitAronVariant(const aron::type::LongPtr& i) override;
+        void visitAronVariant(const aron::type::FloatPtr& i) override;
+        void visitAronVariant(const aron::type::DoublePtr& i) override;
+        void visitAronVariant(const aron::type::BoolPtr& i) override;
+        void visitAronVariant(const aron::type::StringPtr& i) override;
+        void visitAronVariant(const aron::type::TimePtr& i) override;
+        void visitUnknown(Input&) override;
+    };
+}
+
+
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp
new file mode 100644
index 000000000..a2a2240d3
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp
@@ -0,0 +1,146 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * \package    RobotAPI::gui-plugins::SkillManagerMonitorWidgetController
+ * \author     Raphael Grimm ( raphael dot grimm at kit dot edu )
+ * \date       2020
+ * \copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include <string>
+
+#include <ArmarXCore/util/CPPUtility/Iterator.h>
+
+#include "AronTreeWidgetModalCreator.h"
+
+#include <SimoxUtility/algorithm/string.h>
+
+// debug
+#include "../modal/text/AronTreeWidgetTextInputModalController.h"
+#include "../modal/dict/AronTreeWidgetDictInputModalController.h"
+
+//visitors
+namespace armarx
+{
+
+    void AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::ObjectPtr& i)
+    {
+        // should not happen, right?
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::DictPtr& i)
+    {
+        createdModal = std::make_shared<AronTreeWidgetDictInputModalController>(label, item, parent);
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::PairPtr& i)
+    {
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::TuplePtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::ListPtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::NDArrayPtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::MatrixPtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::QuaternionPtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::PositionPtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::OrientationPtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::PosePtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::ImagePtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::PointCloudPtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::IntEnumPtr& i)
+    { }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::IntPtr& i)
+    {
+        createdModal = std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent);
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::LongPtr& i)
+    {
+        createdModal = std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent);
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::FloatPtr& i)
+    {
+        createdModal = std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent);
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::DoublePtr& i)
+    {
+        createdModal = std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent);
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::BoolPtr& i)
+    {
+        createdModal = std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent);
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::StringPtr& i)
+    {
+        createdModal = std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent);
+    }
+
+    void
+    AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::TimePtr& i)
+    {
+        createdModal = std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent);
+    }
+
+    void AronTreeWidgetModalCreatorVisitor::visitUnknown(Input&)
+    {
+        ARMARX_WARNING_S << "Received an unknown type when trying to create a tree view widget modal for a skill argument type.";
+    }
+}
+
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.h
new file mode 100644
index 000000000..c1bba0790
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.h
@@ -0,0 +1,87 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::gui-plugins::SkillManagerMonitorWidgetController
+ * @author     Raphael Grimm ( raphael dot grimm at kit dot edu )
+ * @date       2020
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+#pragma once
+
+#include <stack>
+#include <ArmarXCore/core/system/ImportExportComponent.h>
+
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h>
+#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h>
+#include <ArmarXGui/libraries/SimpleConfigDialog/SimpleConfigDialog.h>
+
+#include <RobotAPI/interface/skills/SkillMemoryInterface.h>
+
+#include <RobotAPI/gui-plugins/SkillManagerPlugin/ui_SkillManagerMonitorWidget.h>
+
+#include "../modal/AronTreeWidgetModal.h"
+
+#include <RobotAPI/libraries/aron/core/type/variant/All.h>
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
+#include <RobotAPI/libraries/aron/core/type/visitor/variant/VariantVisitor.h>
+
+#include <QTreeWidget>
+
+namespace armarx
+{
+    // Convert aron type to tree widget
+    class AronTreeWidgetModalCreatorVisitor :
+            public armarx::aron::type::ConstVariantVisitor
+    {
+    public:
+        std::string label;
+        AronTreeWidgetItem* item;
+        QTreeWidget* parent;
+        AronTreeWidgetModalControllerPtr createdModal;
+
+        AronTreeWidgetModalCreatorVisitor() = delete;
+        AronTreeWidgetModalCreatorVisitor(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) :
+            label(label),
+            item(item),
+            parent(parent)
+        {}
+
+        void visitAronVariant(const aron::type::ObjectPtr&) override;
+        void visitAronVariant(const aron::type::DictPtr& i) override;
+        void visitAronVariant(const aron::type::PairPtr& i) override;
+        void visitAronVariant(const aron::type::TuplePtr& i) override;
+        void visitAronVariant(const aron::type::ListPtr& i) override;
+        void visitAronVariant(const aron::type::NDArrayPtr& i) override;
+        void visitAronVariant(const aron::type::MatrixPtr& i) override;
+        void visitAronVariant(const aron::type::QuaternionPtr& i) override;
+        void visitAronVariant(const aron::type::PositionPtr& i) override;
+        void visitAronVariant(const aron::type::OrientationPtr& i) override;
+        void visitAronVariant(const aron::type::PosePtr& i) override;
+        void visitAronVariant(const aron::type::ImagePtr& i) override;
+        void visitAronVariant(const aron::type::PointCloudPtr& i) override;
+        void visitAronVariant(const aron::type::IntEnumPtr& i) override;
+        void visitAronVariant(const aron::type::IntPtr& i) override;
+        void visitAronVariant(const aron::type::LongPtr& i) override;
+        void visitAronVariant(const aron::type::FloatPtr& i) override;
+        void visitAronVariant(const aron::type::DoublePtr& i) override;
+        void visitAronVariant(const aron::type::BoolPtr& i) override;
+        void visitAronVariant(const aron::type::StringPtr& i) override;
+        void visitAronVariant(const aron::type::TimePtr& i) override;
+        void visitUnknown(Input&) override;
+    };
+}
+
+
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectInfo.h b/source/RobotAPI/libraries/ArmarXObjects/ObjectInfo.h
index ebd0fc51b..70fd46b47 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/ObjectInfo.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectInfo.h
@@ -61,7 +61,6 @@ namespace armarx
 
         void setLogError(bool enabled);
 
-
         std::string package() const;
 
         std::string dataset() const;
@@ -129,9 +128,11 @@ namespace armarx
         virtual bool checkPaths() const;
 
 
+
     private:
 
         path objectDirectory() const;
+
         std::optional<std::vector<std::string>> loadNames(const std::string& jsonKey) const;
 
 
diff --git a/source/RobotAPI/libraries/PriorKnowledge/CMakeLists.txt b/source/RobotAPI/libraries/PriorKnowledge/CMakeLists.txt
index 596f554c1..7c22f824a 100644
--- a/source/RobotAPI/libraries/PriorKnowledge/CMakeLists.txt
+++ b/source/RobotAPI/libraries/PriorKnowledge/CMakeLists.txt
@@ -1,4 +1,5 @@
 add_subdirectory(core)
 add_subdirectory(motions)
+add_subdirectory(objects)
 #add_subdirectory(subjects)
 
diff --git a/source/RobotAPI/libraries/PriorKnowledge/objects/CMakeLists.txt b/source/RobotAPI/libraries/PriorKnowledge/objects/CMakeLists.txt
new file mode 100644
index 000000000..cdf52fa7d
--- /dev/null
+++ b/source/RobotAPI/libraries/PriorKnowledge/objects/CMakeLists.txt
@@ -0,0 +1,19 @@
+set(LIB_NAME       ${PROJECT_NAME}PriorKnowledgeObjects)
+
+armarx_component_set_name("${LIB_NAME}")
+armarx_set_target("Library: ${LIB_NAME}")
+
+armarx_add_library(
+    LIBS
+        RobotAPI::Core
+        RobotAPI::Aron::Common
+    SOURCES
+        ObjectFinder.cpp
+    HEADERS
+        ObjectFinder.h
+)
+
+add_library(${PROJECT_NAME}::PriorKnowledge::Objects ALIAS ${PROJECT_NAME}PriorKnowledgeObjects)
+
+# add unit tests
+#add_subdirectory(test)
diff --git a/source/RobotAPI/libraries/PriorKnowledge/objects/ObjectFinder.cpp b/source/RobotAPI/libraries/PriorKnowledge/objects/ObjectFinder.cpp
new file mode 100644
index 000000000..ed1b6768e
--- /dev/null
+++ b/source/RobotAPI/libraries/PriorKnowledge/objects/ObjectFinder.cpp
@@ -0,0 +1,71 @@
+// Simox
+#include <SimoxUtility/algorithm/vector.hpp>
+
+// BaseClass
+#include "ObjectFinder.h"
+
+// ArmarX
+
+namespace armarx::priorknowledge::objects
+{
+    std::vector<ObjectFinderInfo> ObjectFinder::findAll() const
+    {
+        const std::filesystem::path absPath = Base::Base::getFullPath();
+        if (std::filesystem::is_regular_file(absPath))
+        {
+            ARMARX_WARNING << "The entered path is leading to a file!";
+            return {};
+        }
+
+        std::vector<ObjectFinderInfo> ret;
+        for (const auto& d : std::filesystem::directory_iterator(absPath))
+        {
+            if (!d.is_directory())
+            {
+                ARMARX_WARNING << "Found invalid path: " << d.path();
+                continue;
+            }
+            std::string k = d.path().filename();
+            if (simox::alg::contains(DATASET_FOLDERS_BLACKLIST, k))
+            {
+                continue;
+            }
+
+            auto motionsForDataset = this->findAll(k);
+            simox::alg::append(ret, motionsForDataset);
+        }
+        return ret;
+    }
+
+    std::vector<ObjectFinderInfo> ObjectFinder::findAll(const std::string &dataset) const
+    {
+        const std::filesystem::path absPathToDataset = this->getFullPath(dataset);
+        if (std::filesystem::is_regular_file(absPathToDataset))
+        {
+            ARMARX_WARNING << "The entered path is leading to a file!";
+            return {};
+        }
+
+        std::vector<ObjectFinderInfo> ret;
+        for (const auto& d : std::filesystem::directory_iterator(absPathToDataset))
+        {
+            if (!d.is_directory())
+            {
+                ARMARX_WARNING << "Found invalid path: " << d.path();
+                continue;
+            }
+            std::string k = d.path().filename();
+            if (simox::alg::contains(ID_FOLDERS_BLACKLIST, k))
+            {
+                continue;
+            }
+
+            if(auto op = this->find(dataset, k); op.has_value())
+            {
+                ret.emplace_back(op.value());
+            }
+        }
+        return ret;
+    }
+
+}
diff --git a/source/RobotAPI/libraries/PriorKnowledge/objects/ObjectFinder.h b/source/RobotAPI/libraries/PriorKnowledge/objects/ObjectFinder.h
new file mode 100644
index 000000000..a0e5b1820
--- /dev/null
+++ b/source/RobotAPI/libraries/PriorKnowledge/objects/ObjectFinder.h
@@ -0,0 +1,41 @@
+#include <RobotAPI/libraries/PriorKnowledge/core/FinderBase.h>
+#include <RobotAPI/libraries/PriorKnowledge/core/FinderInfoBase.h>
+
+// TODO!!!
+namespace armarx::priorknowledge::objects
+{
+    class ObjectFinderInfo : public core::DatasetFinderInfoBase<std::string, std::string>
+    {
+        using Base = core::DatasetFinderInfoBase<std::string, std::string>;
+
+    public:
+        ObjectFinderInfo(const std::string& packageName,
+                         const std::filesystem::path& absPackageDataDir,
+                         const std::filesystem::path& relPackageDataPath,
+                         const std::filesystem::path& relDatasetPath,
+                         const std::string& dataset,
+                         const std::string& id) :
+            Base(packageName, absPackageDataDir, relPackageDataPath, relDatasetPath, dataset, id)
+        {
+        }
+    };
+
+    class ObjectFinder : public core::DatasetFinderBase<std::string, std::string, ObjectFinderInfo>
+    {
+        using Base = core::DatasetFinderBase<std::string, std::string, ObjectFinderInfo>;
+
+    public:
+        ObjectFinder(const std::string& packageName, const std::filesystem::path& relDir) :
+            Base(packageName, relDir)
+        {}
+
+        std::vector<ObjectFinderInfo> findAll() const;
+
+        std::vector<ObjectFinderInfo> findAll(const std::string& dataset) const;
+
+    private:
+        std::vector<std::string> DATASET_FOLDERS_BLACKLIST = {};
+        std::vector<std::string> ID_FOLDERS_BLACKLIST = {"script"};
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
index d2339f87f..1e19f25a7 100644
--- a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
@@ -22,13 +22,13 @@ namespace armarx::armem::base
 
     void detail::toIce(aron::data::dto::DictPtr& ice, const aron::data::DictPtr& data)
     {
-        ice = data ? data->toAronDictPtr() : nullptr;
+        ice = data ? data->toAronDictDTO() : nullptr;
     }
     void detail::fromIce(const aron::data::dto::DictPtr& ice, aron::data::DictPtr& data)
     {
         if (ice)
         {
-            data = aron::data::Dict::FromAronDictPtr(ice);
+            data = aron::data::Dict::FromAronDictDTO(ice);
         }
         else
         {
diff --git a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
index f019f3d78..29f57ca33 100644
--- a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
@@ -83,7 +83,7 @@ namespace armarx
         update.instancesData.clear();
         update.instancesData.reserve(ice.instancesData.size());
         std::transform(ice.instancesData.begin(), ice.instancesData.end(), std::back_inserter(update.instancesData),
-                       aron::data::Dict::FromAronDictPtr);
+                       aron::data::Dict::FromAronDictDTO);
 
         update.timeCreated = Time::microSeconds(ice.timeCreatedMicroSeconds);
 
@@ -98,7 +98,7 @@ namespace armarx
         ice.instancesData.clear();
         ice.instancesData.reserve(update.instancesData.size());
         std::transform(update.instancesData.begin(), update.instancesData.end(), std::back_inserter(ice.instancesData),
-                       aron::data::Dict::ToAronDictPtr);
+                       aron::data::Dict::ToAronDictDTO);
 
         ice.timeCreatedMicroSeconds = update.timeCreated.toMicroSeconds();
 
diff --git a/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp b/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp
index 91b1a6584..dacedd5e0 100644
--- a/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp
@@ -23,16 +23,16 @@ void armarx::armem::from_aron(const aron::data::DictPtr& metadata, const aron::d
     e.data() = data;
 
     auto timeCreated = aron::data::Long::DynamicCastAndCheck(metadata->getElement(DATA_WRAPPER_TIME_CREATED_FIELD));
-    m.timeCreated = Time::microSeconds(timeCreated->toAronLongPtr()->value);
+    m.timeCreated = Time::microSeconds(timeCreated->toAronLongDTO()->value);
 
     auto timeSent = aron::data::Long::DynamicCastAndCheck(metadata->getElement(DATA_WRAPPER_TIME_SENT_FIELD));
-    m.timeSent = Time::microSeconds(timeSent->toAronLongPtr()->value);
+    m.timeSent = Time::microSeconds(timeSent->toAronLongDTO()->value);
 
     auto timeArrived = aron::data::Long::DynamicCastAndCheck(metadata->getElement(DATA_WRAPPER_TIME_ARRIVED_FIELD));
-    m.timeArrived = Time::microSeconds(timeArrived->toAronLongPtr()->value);
+    m.timeArrived = Time::microSeconds(timeArrived->toAronLongDTO()->value);
 
     auto confidence = aron::data::Double::DynamicCastAndCheck(metadata->getElement(DATA_WRAPPER_CONFIDENCE_FIELD));
-    m.confidence = static_cast<float>(confidence->toAronDoublePtr()->value);
+    m.confidence = static_cast<float>(confidence->toAronDoubleDTO()->value);
 }
 
 
diff --git a/source/RobotAPI/libraries/armem_grasping/CMakeLists.txt b/source/RobotAPI/libraries/armem_grasping/CMakeLists.txt
index f79f68880..c555283cc 100644
--- a/source/RobotAPI/libraries/armem_grasping/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_grasping/CMakeLists.txt
@@ -6,37 +6,36 @@ armarx_set_target("Library: ${LIB_NAME}")
 
 armarx_add_library(
     LIBS
+        armem
+        armem_server
+        aron
+        RobotAPI::ArmarXObjects
         GraspingUtility
 
     HEADERS
         armem_grasping.h
 
-        aron_conversions.h
-        GraspCandidateWriter.h
-        GraspCandidateReader.h
-        aron/GraspCandidate.aron.generated.h
+        server/KnownGraspProviderSegment.h
+
+        client/KnownGraspCandidateReader.h
+
+        # TODO: move client code in client folder
+        aron_conversions.h # TODO: Please also provide cpp files (they can be empty except of include<header>)
+        GraspCandidateWriter.h # dito
+        GraspCandidateReader.h # dito
+        aron/GraspCandidate.aron.generated.h # Please only use the xml and let the aron converter generate the header file.
 
     SOURCES
         armem_grasping.cpp
+
+        server/KnownGraspProviderSegment.cpp
+
+        client/KnownGraspCandidateReader.cpp
+
+    ARON_FILES
+        aron/KnownGraspCandidate.xml
 )
 
 add_library(${PROJECT_NAME}::armem_grasping ALIAS armem_grasping)
 
 
-#armarx_add_library(armem_grasping
-#    SOURCES
-#        ./armem_grasping.cpp
-#    HEADERS
-#        ./armem_grasping.h
-#    DEPENDENCIES
-#        ArmarXCoreInterfaces
-#        ArmarXCore
-#)
-
- 
-#armarx_add_test(armem_graspingTest
-#    TEST_FILES
-#        test/armem_graspingTest.cpp
-#    DEPENDENCIES
-#        RobotAPI::armem_grasping
-#)
diff --git a/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml b/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml
new file mode 100644
index 000000000..8397a5d2c
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <AronIncludes>
+        <Include include="<RobotAPI/libraries/armem/aron/MemoryID.xml>" autoinclude="true" />
+        <Include include="<RobotAPI/libraries/aron/common/aron/PackagePath.xml>" autoinclude="true" />
+    </AronIncludes>
+    <GenerateTypes>
+        <Object name='armarx::armem::grasping::arondto::KnownGrasp'>
+
+            <ObjectChild key='name'>
+                <string />
+            </ObjectChild>
+
+            <ObjectChild key='creator'>
+                <string />
+            </ObjectChild>
+
+            <ObjectChild key='quality'>
+                <float />
+            </ObjectChild>
+
+            <ObjectChild key='pose'>
+                <Pose />
+            </ObjectChild>
+
+        </Object>
+
+        <Object name='armarx::armem::grasping::arondto::KnownGraspSet'>
+
+            <ObjectChild key='name'>
+                <string />
+            </ObjectChild>
+
+            <ObjectChild key='grasps'>
+                <Dict>
+                    <armarx::armem::grasping::arondto::KnownGrasp />
+                </Dict>
+            </ObjectChild>
+
+        </Object>
+
+        <Object name='armarx::armem::grasping::arondto::KnownGraspInfo'>
+
+            <ObjectChild key='correspondingObject'>
+                <armarx::armem::arondto::MemoryID />
+            </ObjectChild>
+
+            <ObjectChild key='graspSets'>
+                <Dict>
+                    <armarx::armem::grasping::arondto::KnownGraspSet />
+                </Dict>
+            </ObjectChild>
+
+            <ObjectChild key='xml'>
+                <armarx::arondto::PackagePath />
+            </ObjectChild>
+
+        </Object>
+
+    </GenerateTypes>
+</AronTypeDefinition>
+
diff --git a/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.cpp b/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.cpp
new file mode 100644
index 000000000..17dfd176e
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.cpp
@@ -0,0 +1,101 @@
+#include "KnownGraspCandidateReader.h"
+
+#include <mutex>
+#include <optional>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/PackagePath.h>
+
+#include <RobotAPI/libraries/armem/core/Time.h>
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/client/query/Builder.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
+#include <RobotAPI/libraries/armem/util/util.h>
+#include <RobotAPI/libraries/armem_robot/robot_conversions.h>
+#include <RobotAPI/libraries/armem_robot/aron_conversions.h>
+#include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/aron/Attachment.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/aron_conversions.h>
+#include <RobotAPI/libraries/aron/common/aron_conversions.h>
+
+
+namespace armarx::armem::grasping::known_grasps
+{
+    Reader::Reader(armem::client::MemoryNameSystem& memoryNameSystem) :
+        memoryNameSystem(memoryNameSystem)
+    {}
+
+    void Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
+    {
+        ARMARX_DEBUG << "Reader: registerPropertyDefinitions";
+
+        const std::string prefix = propertyPrefix;
+
+        def->optional(properties.memoryName, prefix + "MemoryName");
+
+        def->optional(properties.coreSegmentName,
+                      prefix + "CoreSegment",
+                      "Name of the memory core segment to use for object instances.");
+    }
+
+
+    void Reader::connect()
+    {
+        // Wait for the memory to become available and add it as dependency.
+        ARMARX_IMPORTANT << "Reader: Waiting for memory '" << properties.memoryName << "' ...";
+        try
+        {
+            memoryReader = memoryNameSystem.useReader(properties.memoryName);
+            ARMARX_IMPORTANT << "Reader: Connected to memory '" << properties.memoryName << "'";
+        }
+        catch (const armem::error::CouldNotResolveMemoryServer& e)
+        {
+            ARMARX_ERROR << e.what();
+            return;
+        }
+    }
+
+    std::optional<armem::grasping::arondto::KnownGraspInfo> Reader::queryKnownGraspInfo(const armem::wm::Memory& memory, const armem::Time&)
+    {
+        // clang-format off
+        const armem::wm::CoreSegment& s = memory
+                .getCoreSegment(properties.coreSegmentName);
+        // clang-format on
+
+        const armem::wm::EntityInstance* instance = nullptr;
+        s.forEachInstance([&instance](const wm::EntityInstance& i)
+                                        { instance = &i; });
+        if (instance == nullptr)
+        {
+            ARMARX_WARNING << "No entity snapshots found";
+            return std::nullopt;
+        }
+        return armem::grasping::arondto::KnownGraspInfo::FromAron(instance->data());
+    }
+
+    std::optional<armarx::armem::grasping::arondto::KnownGraspInfo> Reader::queryKnownGraspInfoByEntityName(const std::string& entityName, const armem::Time& timestamp)
+    {
+        // Query all entities from all provider.
+        armem::client::query::Builder qb;
+
+        // clang-format off
+        qb
+        .coreSegments().withName(properties.coreSegmentName)
+        .providerSegments().all()
+        .entities().withName(entityName)
+        .snapshots().beforeOrAtTime(timestamp);
+        // clang-format on
+
+        const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
+
+        ARMARX_DEBUG << "Lookup result in reader: " << qResult;
+
+        if (not qResult.success) /* c++20 [[unlikely]] */
+        {
+            return std::nullopt;
+        }
+
+        return queryKnownGraspInfo(qResult.memory, timestamp);
+    }
+
+}  // namespace armarx::armem::attachment
diff --git a/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h b/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h
new file mode 100644
index 000000000..945670d82
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h
@@ -0,0 +1,65 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Fabian Reister ( fabian dot reister at kit dot edu )
+ * @date       2021
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+#include <mutex>
+#include <optional>
+
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
+#include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
+#include <RobotAPI/libraries/armem/client/Reader.h>
+
+#include <RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.aron.generated.h>
+
+
+namespace armarx::armem::grasping::known_grasps
+{
+    class Reader
+    {
+    public:
+        Reader(armem::client::MemoryNameSystem& memoryNameSystem);
+        virtual ~Reader() = default;
+
+        void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
+        void connect();
+
+        std::optional<armem::grasping::arondto::KnownGraspInfo> queryKnownGraspInfoByEntityName(const std::string&, const armem::Time&);
+        std::optional<armem::grasping::arondto::KnownGraspInfo> queryKnownGraspInfo(const armem::wm::Memory& memory, const armem::Time&);
+
+    private:
+
+        struct Properties
+        {
+            std::string memoryName                  = "Grasp";
+            std::string coreSegmentName             = "KnownGraspCandidate";
+        } properties;
+
+        const std::string propertyPrefix = "mem.grasping.knowngrasps.";
+
+        armem::client::MemoryNameSystem& memoryNameSystem;
+        armem::client::Reader memoryReader;
+        std::mutex memoryWriterMutex;
+    };
+
+
+}  // namespace armarx::armem::attachment
diff --git a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
new file mode 100644
index 000000000..5b8aaafea
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
@@ -0,0 +1,144 @@
+#include "KnownGraspProviderSegment.h"
+
+#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
+#include <ArmarXCore/core/rapidxml/wrapper/RapidXmlReader.h>
+
+namespace armarx::armem::grasping::segment
+{
+    KnownGraspProviderSegment::KnownGraspProviderSegment(armem::server::MemoryToIceAdapter& iceMemory) :
+        Base(iceMemory, PROVIDER_SEGMENT_NAME, CORE_SEGMENT_NAME)
+    {
+
+    }
+
+    void KnownGraspProviderSegment::init()
+    {
+        Base::init();
+
+        loadMemory();
+    }
+
+    std::optional<arondto::KnownGraspInfo> KnownGraspProviderSegment::knownGraspInfoFromObjectInfo(const ObjectInfo& info)
+    {
+        std::string objectClassName = info.className();
+        auto fileLocInfo = info.file(".xml", "_Grasps");
+        std::filesystem::path graspFilePath = fileLocInfo.absolutePath;
+
+        if (std::filesystem::is_regular_file(graspFilePath))
+        {
+            auto reader = RapidXmlReader::FromFile(graspFilePath);
+            RapidXmlReaderNode root = reader->getRoot();
+
+            std::string objectClassNameXML = root.attribute_value("name");
+            ARMARX_CHECK_EQUAL(objectClassName, objectClassNameXML);
+
+            arondto::KnownGraspInfo ret;
+            ret.correspondingObject.memoryName = "Object";
+            ret.correspondingObject.coreSegmentName = "Class";
+            ret.correspondingObject.providerSegmentName = "PriorKnowledgeData";
+            ret.correspondingObject.entityName = info.idStr();
+            ret.xml.package = fileLocInfo.package;
+            ret.xml.path = fileLocInfo.relativePath;
+
+            for (const auto& graspSetNode : root.nodes())
+            {
+                if (graspSetNode.name() != "GraspSet")
+                {
+                    continue;
+                }
+
+                arondto::KnownGraspSet retGraspSet;
+
+                retGraspSet.name = graspSetNode.attribute_value("name");
+                //std::string robotType = graspSetNode.attribute_value("RobotType");
+                //std::string endEffector = graspSetNode.attribute_value("EndEffector");
+
+                for (const auto& graspNode : graspSetNode.nodes())
+                {
+                    if (graspNode.name() != "Grasp")
+                    {
+                        continue;
+                    }
+
+                    arondto::KnownGrasp retGrasp;
+
+                    retGrasp.name = graspNode.attribute_value("name");
+                    retGrasp.quality = std::stof(graspNode.attribute_value("quality"));
+                    retGrasp.creator = graspNode.attribute_value("Creation");
+
+                    ARMARX_CHECK_EQUAL(graspNode.nodes().size(), 1);
+                    RapidXmlReaderNode transformNode = graspNode.nodes()[0];
+
+                    ARMARX_CHECK_EQUAL(transformNode.nodes().size(), 1);
+                    RapidXmlReaderNode matrixNode = transformNode.nodes()[0];
+
+                    ARMARX_CHECK_EQUAL(matrixNode.nodes().size(), 4);
+                    RapidXmlReaderNode row0 = matrixNode.nodes()[0];
+                    RapidXmlReaderNode row1 = matrixNode.nodes()[1];
+                    RapidXmlReaderNode row2 = matrixNode.nodes()[2];
+                    RapidXmlReaderNode row3 = matrixNode.nodes()[3];
+
+                    retGrasp.pose(0, 0) = std::stof(row0.attribute_value("c1"));
+                    retGrasp.pose(0, 1) = std::stof(row0.attribute_value("c2"));
+                    retGrasp.pose(0, 2) = std::stof(row0.attribute_value("c3"));
+                    retGrasp.pose(0, 3) = std::stof(row0.attribute_value("c4"));
+                    retGrasp.pose(1, 0) = std::stof(row1.attribute_value("c1"));
+                    retGrasp.pose(1, 1) = std::stof(row1.attribute_value("c2"));
+                    retGrasp.pose(1, 2) = std::stof(row1.attribute_value("c3"));
+                    retGrasp.pose(1, 3) = std::stof(row1.attribute_value("c4"));
+                    retGrasp.pose(2, 0) = std::stof(row2.attribute_value("c1"));
+                    retGrasp.pose(2, 1) = std::stof(row2.attribute_value("c2"));
+                    retGrasp.pose(2, 2) = std::stof(row2.attribute_value("c3"));
+                    retGrasp.pose(2, 3) = std::stof(row2.attribute_value("c4"));
+                    retGrasp.pose(3, 0) = std::stof(row3.attribute_value("c1"));
+                    retGrasp.pose(3, 1) = std::stof(row3.attribute_value("c2"));
+                    retGrasp.pose(3, 2) = std::stof(row3.attribute_value("c3"));
+                    retGrasp.pose(3, 3) = std::stof(row3.attribute_value("c4"));
+
+                    ARMARX_INFO << "Found grasp '" << retGrasp.name << "' in set '" << retGraspSet.name << "' for obj '" << objectClassName << "' with pose \n" << retGrasp.pose;
+
+                    retGraspSet.grasps[retGrasp.name] = retGrasp;
+                }
+                ret.graspSets[retGraspSet.name] = retGraspSet;
+            }
+            return ret;
+        }
+        return std::nullopt;
+    }
+
+    void KnownGraspProviderSegment::loadMemory()
+    {
+        // load data from prior knowledge
+        ObjectFinder objectFinder;
+        const auto now = armem::Time::now();
+
+        const bool checkPaths = false;
+        std::vector<ObjectInfo> infos = objectFinder.findAllObjects(checkPaths);
+
+        const MemoryID providerID = segmentPtr->id().withProviderSegmentName(objectFinder.getPackageName());
+        ARMARX_INFO << "Checking up to " << infos.size() << " object classes from '" << objectFinder.getPackageName() << "' ...";
+
+        Commit commit;
+        for (ObjectInfo& info : infos)
+        {
+            info.setLogError(false);
+            if (auto knownGraspCandidate = knownGraspInfoFromObjectInfo(info); knownGraspCandidate)
+            {
+                EntityUpdate& update = commit.add();
+                update.entityID = providerID.withEntityName(info.id().str());
+                update.entityID.timestamp = update.timeArrived = update.timeCreated = update.timeSent = now;
+
+                update.instancesData =
+                {
+                    knownGraspCandidate->toAron()
+                };
+            }
+        }
+        ARMARX_INFO << "Loaded " << commit.updates.size() << " grasp candidates from object classes from '" << objectFinder.getPackageName() << "'.";
+        auto result = iceMemory.commit(commit);
+        if (!result.allSuccess())
+        {
+            ARMARX_WARNING << "Got errors for commit: " << result.allErrorMessages();
+        }
+    }
+}
diff --git a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h
new file mode 100644
index 000000000..de9237258
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h
@@ -0,0 +1,27 @@
+# pragma once
+
+#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
+
+#include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
+#include <RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.aron.generated.h>
+
+namespace armarx::armem::grasping::segment
+{
+    class KnownGraspProviderSegment : public armem::server::segment::SpecializedProviderSegment
+    {
+        using Base = armem::server::segment::SpecializedProviderSegment;
+
+    public:
+        KnownGraspProviderSegment(armem::server::MemoryToIceAdapter& iceMemory);
+
+        void init() override;
+
+    private:
+        void loadMemory();
+        std::optional<arondto::KnownGraspInfo> knownGraspInfoFromObjectInfo(const ObjectInfo&);
+
+    public:
+        static const constexpr char* CORE_SEGMENT_NAME = "KnownGraspCandidate";
+        static const constexpr char* PROVIDER_SEGMENT_NAME = "PriorKnowledgeData";
+    };
+}
diff --git a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
index 88fd8cf80..74928ae14 100644
--- a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
@@ -44,6 +44,8 @@ armarx_add_library(
 
         client/attachment/Reader.h
         client/attachment/Writer.h
+        
+        client/instance/ObjectReader.h
 
     SOURCES
         aron_conversions.cpp
@@ -58,6 +60,8 @@ armarx_add_library(
 
         client/attachment/Reader.cpp
         client/attachment/Writer.cpp
+        
+        client/instance/ObjectReader.cpp
 
     ARON_FILES
         aron/ObjectClass.xml
diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.cpp b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.cpp
new file mode 100644
index 000000000..49dbdcf61
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.cpp
@@ -0,0 +1,138 @@
+#include "ObjectReader.h"
+
+#include <mutex>
+#include <optional>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/PackagePath.h>
+
+#include <RobotAPI/libraries/armem/core/Time.h>
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/client/query/Builder.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
+#include <RobotAPI/libraries/armem/util/util.h>
+#include <RobotAPI/libraries/armem_robot/robot_conversions.h>
+#include <RobotAPI/libraries/armem_robot/aron_conversions.h>
+#include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/aron/Attachment.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/aron_conversions.h>
+#include <RobotAPI/libraries/aron/common/aron_conversions.h>
+
+
+namespace armarx::armem::obj::instance
+{
+    Reader::Reader(armem::client::MemoryNameSystem& memoryNameSystem) :
+        memoryNameSystem(memoryNameSystem)
+    {}
+
+    void Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
+    {
+        ARMARX_DEBUG << "Reader: registerPropertyDefinitions";
+
+        const std::string prefix = propertyPrefix;
+
+        def->optional(properties.memoryName, prefix + "MemoryName");
+
+        def->optional(properties.coreSegmentName,
+                      prefix + "CoreSegment",
+                      "Name of the memory core segment to use for object instances.");
+    }
+
+
+    void Reader::connect()
+    {
+        // Wait for the memory to become available and add it as dependency.
+        ARMARX_IMPORTANT << "Reader: Waiting for memory '" << properties.memoryName << "' ...";
+        try
+        {
+            memoryReader = memoryNameSystem.useReader(properties.memoryName);
+            ARMARX_IMPORTANT << "Reader: Connected to memory '" << properties.memoryName << "'";
+        }
+        catch (const armem::error::CouldNotResolveMemoryServer& e)
+        {
+            ARMARX_ERROR << e.what();
+            return;
+        }
+    }
+
+    std::optional<armarx::armem::arondto::ObjectInstance> Reader::queryObject(const armem::wm::Memory& memory, const armem::Time& timestamp)
+    {
+        // clang-format off
+        const armem::wm::CoreSegment& s = memory
+                .getCoreSegment(properties.coreSegmentName);
+        // clang-format on
+
+        // What to do with timestamp?
+        const armem::wm::EntityInstance* instance = nullptr;
+        s.forEachInstance([&instance](const wm::EntityInstance& i)
+                                        { instance = &i; });
+        if (instance == nullptr)
+        {
+            return std::nullopt;
+        }
+        return armem::arondto::ObjectInstance::FromAron(instance->data());
+    }
+
+    std::optional<armarx::armem::arondto::ObjectInstance> Reader::queryObjectByEntityID(const std::string& entityName, const armem::Time& timestamp)
+    {
+        // Query all entities from all provider.
+        armem::client::query::Builder qb;
+
+        // clang-format off
+        qb
+        .coreSegments().withName(properties.coreSegmentName)
+        .providerSegments().all()
+        .entities().withName(entityName)
+        .snapshots().beforeOrAtTime(timestamp);
+        // clang-format on
+
+        const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
+
+        ARMARX_DEBUG << "Lookup result in reader: " << qResult;
+
+        if (not qResult.success) /* c++20 [[unlikely]] */
+        {
+            return std::nullopt;
+        }
+
+        return queryObject(qResult.memory, timestamp);
+    }
+
+    std::optional<armarx::armem::arondto::ObjectInstance> Reader::queryObjectByObjectID(const std::string& objectId, const armem::Time& timestamp)
+    {
+        // Query all entities from all provider.
+        armem::client::query::Builder qb;
+
+        // clang-format off
+        qb
+        .coreSegments().withName(properties.coreSegmentName)
+        .providerSegments().all()
+        .entities().all()
+        .snapshots().beforeOrAtTime(timestamp);
+        // clang-format on
+
+        const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
+
+        ARMARX_DEBUG << "Lookup result in reader: " << qResult;
+
+        if (not qResult.success) /* c++20 [[unlikely]] */
+        {
+            return std::nullopt;
+        }
+
+        // clang-format off
+        const armem::wm::CoreSegment& s = qResult.memory
+                .getCoreSegment(properties.coreSegmentName);
+        // clang-format on
+
+        const armem::wm::EntityInstance* instance = nullptr;
+        s.forEachInstance([&instance, &objectId](const wm::EntityInstance& i)
+                                        { if (simox::alg::starts_with(i.id().entityName, objectId)) instance = &i; });
+        if (instance == nullptr)
+        {
+            return std::nullopt;
+        }
+        return armem::arondto::ObjectInstance::FromAron(instance->data());
+    }
+
+}  // namespace armarx::armem::attachment
diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h
new file mode 100644
index 000000000..8db6a1cab
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h
@@ -0,0 +1,70 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Fabian Reister ( fabian dot reister at kit dot edu )
+ * @date       2021
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+#include <mutex>
+#include <optional>
+
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
+#include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
+#include <RobotAPI/libraries/armem/client/Reader.h>
+#include <RobotAPI/libraries/armem_objects/types.h>
+
+#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
+
+
+namespace armarx::armem::obj::instance
+{
+    class Reader
+    {
+    public:
+        Reader(armem::client::MemoryNameSystem& memoryNameSystem);
+        virtual ~Reader() = default;
+
+        void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
+        void connect();
+
+
+        std::optional<armem::arondto::ObjectInstance> queryObject(const armem::wm::Memory& memory, const armem::Time&);
+        std::optional<armem::arondto::ObjectInstance> queryObjectByEntityID(const std::string& entityName, const armem::Time&);
+        std::optional<armem::arondto::ObjectInstance> queryObjectByObjectID(const std::string& objectId, const armem::Time&);
+
+
+    private:
+
+
+        struct Properties
+        {
+            std::string memoryName                  = "Object";
+            std::string coreSegmentName             = "Instance";
+        } properties;
+
+        const std::string propertyPrefix = "mem.obj.instance.";
+
+        armem::client::MemoryNameSystem& memoryNameSystem;
+        armem::client::Reader memoryReader;
+        std::mutex memoryWriterMutex;
+    };
+
+
+}  // namespace armarx::armem::attachment
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
index 4428f3d96..bdeeb0bd6 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
@@ -174,7 +174,7 @@ namespace armarx::armem::robot_state
 
     std::optional<robot::RobotState::JointMap>
     RobotReader::queryJointState(const robot::RobotDescription& description,
-                                 const armem::Time& timestamp) const
+                                 const armem::Time& timestamp) const // Why timestamp?!?!
     {
         // TODO(fabian.reister): how to deal with multiple providers?
 
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
index dce0a7f05..57151c646 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
@@ -40,7 +40,7 @@ namespace armarx::skills::segment
         skills::manager::dto::SkillExecutionInfo info;
         info.providerName = request.providerName;
         info.skillName = request.skillName;
-        info.params = params->toAronDictPtr();
+        info.params = aron::data::Dict::ToAronDictDTO(params);
         return info;
     }
 
@@ -58,9 +58,7 @@ namespace armarx::skills::segment
 
         auto aron = request.toAron();
 
-        aron::data::DictPtr aron_params = nullptr;
-        if (info.params) aron_params = std::make_shared<aron::data::Dict>(info.params);
-
+        aron::data::DictPtr aron_params = aron::data::Dict::FromAronDictDTO(info.params);
         aron->addElement("params", aron_params); // todo add as any type
 
         armem::MemoryID skillExecutionMemID = id();
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/Variant.h b/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
index 04c39ea84..aee8c55fc 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/Variant.h
@@ -144,9 +144,6 @@ namespace armarx::aron::data
         /// convert the variant to the ice representation
         virtual data::dto::GenericDataPtr toAronDTO() const = 0;
 
-        /// set a variant from a std string
-        virtual void fromString(const std::string& setter) = 0;
-
     protected:
         const data::Descriptor descriptor;
         const Path path;
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 c5a8b08ab..7de89a06a 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.cpp
@@ -87,6 +87,10 @@ namespace armarx::aron::data
     // static methods
     NDArrayPtr NDArray::FromNDArrayDTO(const data::dto::NDArrayPtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<NDArray>(aron);
     }
 
@@ -156,11 +160,6 @@ namespace armarx::aron::data
     }
 
     // virtual implementations
-    void NDArray::fromString(const std::string& setter)
-    {
-        // TODO!
-    }
-
     std::string NDArray::getShortName() const
     {
         return "NDArray";
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h
index 92dbed05e..31677060a 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h
@@ -90,8 +90,6 @@ namespace armarx::aron::data
             return ret;
         }
 
-        void fromString(const std::string& setter) override;
-
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
 
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 ef895067b..0e7de7dae 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
@@ -90,17 +90,21 @@ namespace armarx::aron::data
     }
 
     // static methods
-    DictPtr Dict::FromAronDictPtr(const data::dto::DictPtr& aron)
+    DictPtr Dict::FromAronDictDTO(const data::dto::DictPtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<Dict>(aron);
     }
 
-    data::dto::DictPtr Dict::ToAronDictPtr(const DictPtr& navigator)
+    data::dto::DictPtr Dict::ToAronDictDTO(const DictPtr& navigator)
     {
-        return navigator ? navigator->toAronDictPtr() : nullptr;
+        return navigator ? navigator->toAronDictDTO() : nullptr;
     }
 
-    data::dto::DictPtr Dict::toAronDictPtr() const
+    data::dto::DictPtr Dict::toAronDictDTO() const
     {
         return aron;
     }
@@ -186,11 +190,6 @@ namespace armarx::aron::data
     }
 
     // virtual implementations
-    void Dict::fromString(const std::string& setter)
-    {
-        // TODO!
-    }
-
     std::string Dict::getShortName() const
     {
         return "Dict";
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 99d7a3682..3c8f5a74d 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.h
@@ -53,11 +53,11 @@ namespace armarx::aron::data
         bool operator==(const DictPtr&) const override;
         VariantPtr operator[](const std::string&) const;
 
-        static PointerType FromAronDictPtr(const data::dto::DictPtr& aron);
-        static data::dto::DictPtr ToAronDictPtr(const PointerType& navigator);
+        static PointerType FromAronDictDTO(const data::dto::DictPtr& aron);
+        static data::dto::DictPtr ToAronDictDTO(const PointerType& navigator);
 
         // public member functions
-        data::dto::DictPtr toAronDictPtr() const;
+        data::dto::DictPtr toAronDictDTO() const;
         std::vector<std::string> getAllKeys() const;
         std::string getAllKeysAsString() const;
 
@@ -82,8 +82,6 @@ namespace armarx::aron::data
             return ret;
         }
 
-        void fromString(const std::string& setter) 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/data/variant/container/List.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
index 0d4dffe9b..bb86d4f1b 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
@@ -93,14 +93,18 @@ namespace armarx::aron::data
     }
 
     // static methods
-    ListPtr List::FromAronListPtr(const data::dto::ListPtr& aron)
+    ListPtr List::FromAronListDTO(const data::dto::ListPtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<List>(aron);
     }
 
-    data::dto::ListPtr List::ToAronListPtr(const ListPtr& navigator)
+    data::dto::ListPtr List::ToAronListDTO(const ListPtr& navigator)
     {
-        return navigator ? navigator->toAronListPtr() : nullptr;
+        return navigator ? navigator->toAronListDTO() : nullptr;
     }
 
     // public member functions
@@ -183,17 +187,12 @@ namespace armarx::aron::data
         aron->elements.clear();
     }
 
-    data::dto::ListPtr List::toAronListPtr() const
+    data::dto::ListPtr List::toAronListDTO() const
     {
         return aron;
     }
 
     // virtual implementations
-    void List::fromString(const std::string& setter)
-    {
-        // TODO!
-    }
-
     std::string List::getShortName() const
     {
         return "List";
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 cab6a38e5..b766ce5aa 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.h
@@ -54,13 +54,13 @@ namespace armarx::aron::data
         bool operator==(const ListPtr&) const override;
 
         // static methods
-        static PointerType FromAronListPtr(const data::dto::ListPtr& aron);
-        static data::dto::ListPtr ToAronListPtr(const PointerType& navigator);
+        static PointerType FromAronListDTO(const data::dto::ListPtr& aron);
+        static data::dto::ListPtr ToAronListDTO(const PointerType& navigator);
 
         // public member functions
         DictPtr getAsDict() const;
 
-        data::dto::ListPtr toAronListPtr() const;
+        data::dto::ListPtr toAronListDTO() const;
 
         void addElement(const VariantPtr&);
         void setElement(unsigned int, const VariantPtr&);
@@ -83,8 +83,6 @@ namespace armarx::aron::data
             return ret;
         }
 
-        void fromString(const std::string& setter) 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/data/variant/detail/PrimitiveVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
index b7356be20..849d146d5 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/PrimitiveVariant.h
@@ -71,6 +71,9 @@ namespace armarx::aron::data::detail
             return this->aron->value == x;
         }*/
 
+        /// set a primitive from a std string
+        virtual void fromString(const std::string& setter) = 0;
+
         // virtual implementations
         VariantPtr navigateAbsolute(const Path &path) const override
         {
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.cpp
index 59f8ffa16..7c5e52682 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.cpp
@@ -44,7 +44,7 @@ namespace armarx::aron::data
     /* operators */
     bool Bool::operator==(const Bool& other) const
     {
-        const auto& otherAron = other.toAronBoolPtr();
+        const auto& otherAron = other.toAronBoolDTO();
         if (aron->value != otherAron->value)
         {
             return false;
@@ -62,18 +62,22 @@ namespace armarx::aron::data
 
 
     /* static methods */
-    BoolPtr Bool::FromAronBoolPtr(const data::dto::AronBoolPtr& aron)
+    BoolPtr Bool::FromAronBoolDTO(const data::dto::AronBoolPtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<Bool>(aron);
     }
 
-    data::dto::AronBoolPtr Bool::ToAronBoolPtr(const BoolPtr& navigator)
+    data::dto::AronBoolPtr Bool::ToAronBoolDTO(const BoolPtr& navigator)
     {
-        return navigator ? navigator->toAronBoolPtr() : nullptr;
+        return navigator ? navigator->toAronBoolDTO() : nullptr;
     }
 
     /* public member functions */
-    data::dto::AronBoolPtr Bool::toAronBoolPtr() const
+    data::dto::AronBoolPtr Bool::toAronBoolDTO() const
     {
         return aron;
     }
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 f76f9396c..65cfc31a7 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Bool.h
@@ -52,11 +52,11 @@ namespace armarx::aron::data
         bool operator==(const BoolPtr&) const override;
 
         // static methods
-        static BoolPtr FromAronBoolPtr(const data::dto::AronBoolPtr& aron);
-        static data::dto::AronBoolPtr ToAronBoolPtr(const BoolPtr& navigator);
+        static BoolPtr FromAronBoolDTO(const data::dto::AronBoolPtr& aron);
+        static data::dto::AronBoolPtr ToAronBoolDTO(const BoolPtr& navigator);
 
         // class methods
-        data::dto::AronBoolPtr toAronBoolPtr() const;
+        data::dto::AronBoolPtr toAronBoolDTO() const;
 
         /* virtual implementations */
         void fromString(const std::string& setter) 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 e96cd8485..729e5bda4 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.cpp
@@ -48,7 +48,7 @@ namespace armarx::aron::data
     /* operators */
     bool Double::operator==(const Double& other) const
     {
-        const auto& otherAron = other.toAronDoublePtr();
+        const auto& otherAron = other.toAronDoubleDTO();
         if (this->aron->value != otherAron->value)
         {
             return false;
@@ -65,19 +65,23 @@ namespace armarx::aron::data
     }
 
     /* static methods */
-    DoublePtr Double::FromAronDoublePtr(const data::dto::AronDoublePtr& aron)
+    DoublePtr Double::FromAronDoubleDTO(const data::dto::AronDoublePtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<Double>(aron);
     }
 
-    data::dto::AronDoublePtr Double::ToAronDoublePtr(const DoublePtr& navigator)
+    data::dto::AronDoublePtr Double::ToAronDoubleDTO(const DoublePtr& navigator)
     {
-        return navigator ? navigator->toAronDoublePtr() : nullptr;
+        return navigator ? navigator->toAronDoubleDTO() : nullptr;
     }
 
 
     /* public member functions */
-    data::dto::AronDoublePtr Double::toAronDoublePtr() const
+    data::dto::AronDoublePtr Double::toAronDoubleDTO() const
     {
         return aron;
     }
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 fdaba984a..b02571f1d 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Double.h
@@ -52,11 +52,11 @@ namespace armarx::aron::data
         bool operator==(const DoublePtr&) const override;
 
         /* static methods */
-        static DoublePtr FromAronDoublePtr(const data::dto::AronDoublePtr& aron);
-        static data::dto::AronDoublePtr ToAronDoublePtr(const DoublePtr& navigator);
+        static DoublePtr FromAronDoubleDTO(const data::dto::AronDoublePtr& aron);
+        static data::dto::AronDoublePtr ToAronDoubleDTO(const DoublePtr& navigator);
 
         /* public member functions */
-        data::dto::AronDoublePtr toAronDoublePtr() const;
+        data::dto::AronDoublePtr toAronDoubleDTO() const;
 
         /* virtual implementations */
         void fromString(const std::string& setter) 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 35fd40845..f638882ea 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.cpp
@@ -44,7 +44,7 @@ namespace armarx::aron::data
     /* operators */
     bool Float::operator==(const Float& other) const
     {
-        const auto& otherAron = other.toAronFloatPtr();
+        const auto& otherAron = other.toAronFloatDTO();
         if (this->aron->value != otherAron->value)
         {
             return false;
@@ -62,18 +62,22 @@ namespace armarx::aron::data
 
 
     /* static methods */
-    FloatPtr Float::FromAronFloatPtr(const data::dto::AronFloatPtr& aron)
+    FloatPtr Float::FromAronFloatDTO(const data::dto::AronFloatPtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<Float>(aron);
     }
 
-    data::dto::AronFloatPtr Float::ToAronFloatPtr(const FloatPtr& navigator)
+    data::dto::AronFloatPtr Float::ToAronFloatDTO(const FloatPtr& navigator)
     {
-        return navigator ? navigator->toAronFloatPtr() : nullptr;
+        return navigator ? navigator->toAronFloatDTO() : nullptr;
     }
 
     /* public member functions */
-    data::dto::AronFloatPtr Float::toAronFloatPtr() const
+    data::dto::AronFloatPtr Float::toAronFloatDTO() const
     {
         return aron;
     }
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 52f3f41cf..d7b44e567 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Float.h
@@ -52,11 +52,11 @@ namespace armarx::aron::data
         bool operator==(const FloatPtr&) const override;
 
         /* static methods */
-        static FloatPtr FromAronFloatPtr(const data::dto::AronFloatPtr& aron);
-        static data::dto::AronFloatPtr ToAronFloatPtr(const FloatPtr& navigator);
+        static FloatPtr FromAronFloatDTO(const data::dto::AronFloatPtr& aron);
+        static data::dto::AronFloatPtr ToAronFloatDTO(const FloatPtr& navigator);
 
         /* public member functions */
-        data::dto::AronFloatPtr toAronFloatPtr() const;
+        data::dto::AronFloatPtr toAronFloatDTO() const;
 
         /* virtual implementations */
         void fromString(const std::string& setter) 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 ba774f9e5..b5f0d3919 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.cpp
@@ -47,7 +47,7 @@ namespace armarx::aron::data
     /* operators */
     bool Int::operator==(const Int& other) const
     {
-        const auto& otherAron = other.toAronIntPtr();
+        const auto& otherAron = other.toAronIntDTO();
         if (this->aron->value != otherAron->value)
         {
             return false;
@@ -65,18 +65,22 @@ namespace armarx::aron::data
 
 
     /* static methods */
-    IntPtr Int::FromAronIntPtr(const data::dto::AronIntPtr& aron)
+    IntPtr Int::FromAronIntDTO(const data::dto::AronIntPtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<Int>(aron);
     }
 
-    data::dto::AronIntPtr Int::ToAronIntPtr(const IntPtr& navigator)
+    data::dto::AronIntPtr Int::ToAronIntDTO(const IntPtr& navigator)
     {
-        return navigator ? navigator->toAronIntPtr() : nullptr;
+        return navigator ? navigator->toAronIntDTO() : nullptr;
     }
 
     /* public member functions */
-    data::dto::AronIntPtr Int::toAronIntPtr() const
+    data::dto::AronIntPtr Int::toAronIntDTO() const
     {
         return aron;
     }
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 7cf20562d..9a803a035 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Int.h
@@ -53,11 +53,11 @@ namespace armarx::aron::data
         bool operator==(const IntPtr&) const override;
 
         /* static methods */
-        static IntPtr FromAronIntPtr(const data::dto::AronIntPtr& aron);
-        static data::dto::AronIntPtr ToAronIntPtr(const IntPtr& navigator);
+        static IntPtr FromAronIntDTO(const data::dto::AronIntPtr& aron);
+        static data::dto::AronIntPtr ToAronIntDTO(const IntPtr& navigator);
 
         /* public member functions */
-        data::dto::AronIntPtr toAronIntPtr() const;
+        data::dto::AronIntPtr toAronIntDTO() const;
 
         /* virtual implementations */
         void fromString(const std::string& setter) 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 4a65a3933..1885fc750 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.cpp
@@ -48,7 +48,7 @@ namespace armarx::aron::data
     /* operators */
     bool Long::operator==(const Long& other) const
     {
-        const auto& otherAron = other.toAronLongPtr();
+        const auto& otherAron = other.toAronLongDTO();
         if (this->aron->value != otherAron->value)
         {
             return false;
@@ -66,18 +66,22 @@ namespace armarx::aron::data
 
 
     /* static methods */
-    LongPtr Long::FromAronLongPtr(const data::dto::AronLongPtr& aron)
+    LongPtr Long::FromAronLongDTO(const data::dto::AronLongPtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<Long>(aron);
     }
 
-    data::dto::AronLongPtr Long::ToAronLongPtr(const LongPtr& navigator)
+    data::dto::AronLongPtr Long::ToAronLongDTO(const LongPtr& navigator)
     {
-        return navigator ? navigator->toAronLongPtr() : nullptr;
+        return navigator ? navigator->toAronLongDTO() : nullptr;
     }
 
     /* public member functions */
-    data::dto::AronLongPtr Long::toAronLongPtr() const
+    data::dto::AronLongPtr Long::toAronLongDTO() const
     {
         return aron;
     }
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 e8136ed7b..82b9481be 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/Long.h
@@ -53,11 +53,11 @@ namespace armarx::aron::data
         bool operator==(const LongPtr&) const override;
 
         /* static methods */
-        static LongPtr FromAronLongPtr(const data::dto::AronLongPtr& aron);
-        static data::dto::AronLongPtr ToAronLongPtr(const LongPtr& navigator);
+        static LongPtr FromAronLongDTO(const data::dto::AronLongPtr& aron);
+        static data::dto::AronLongPtr ToAronLongDTO(const LongPtr& navigator);
 
         /* public member functions */
-        data::dto::AronLongPtr toAronLongPtr() const;
+        data::dto::AronLongPtr toAronLongDTO() const;
 
         /* virtual implementations */
         void fromString(const std::string& setter) override;
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.cpp b/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.cpp
index 4ca2ff4d8..b896221b0 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.cpp
@@ -44,7 +44,7 @@ namespace armarx::aron::data
     /* operators */
     bool String::operator==(const String& other) const
     {
-        const auto& otherAron = other.toAronStringPtr();
+        const auto& otherAron = other.toAronStringDTO();
         if (this->aron->value != otherAron->value)
         {
             return false;
@@ -62,18 +62,22 @@ namespace armarx::aron::data
 
 
     /* static methods */
-    StringPtr String::FromAronStringPtr(const data::dto::AronStringPtr& aron)
+    StringPtr String::FromAronStringDTO(const data::dto::AronStringPtr& aron)
     {
+        if (!aron)
+        {
+            return nullptr;
+        }
         return std::make_shared<String>(aron);
     }
 
-    data::dto::AronStringPtr String::ToAronStringPtr(const StringPtr& navigator)
+    data::dto::AronStringPtr String::ToAronStringDTO(const StringPtr& navigator)
     {
-        return navigator ? navigator->toAronStringPtr() : nullptr;
+        return navigator ? navigator->toAronStringDTO() : nullptr;
     }
 
     /* public member functions */
-    data::dto::AronStringPtr String::toAronStringPtr() const
+    data::dto::AronStringPtr String::toAronStringDTO() const
     {
         return aron;
     }
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 b8ec3ec03..33e9ef6ea 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/primitive/String.h
@@ -52,11 +52,11 @@ namespace armarx::aron::data
         bool operator==(const StringPtr&) const override;
 
         /* static methods */
-        static StringPtr FromAronStringPtr(const data::dto::AronStringPtr& aron);
-        static data::dto::AronStringPtr ToAronStringPtr(const StringPtr& navigator);
+        static StringPtr FromAronStringDTO(const data::dto::AronStringPtr& aron);
+        static data::dto::AronStringPtr ToAronStringDTO(const StringPtr& navigator);
 
         /* public member functions */
-        data::dto::AronStringPtr toAronStringPtr() const;
+        data::dto::AronStringPtr toAronStringDTO() const;
 
         /* virtual implementations */
         void fromString(const std::string& setter) override;
diff --git a/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp
index 77a9ad525..33bb9c320 100644
--- a/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp
+++ b/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp
@@ -107,7 +107,7 @@ void test_toAronType(T& in, T& out)
     {
         type::ObjectPtr in_type_nav = in.toAronType();
 
-        type::dto::AronObjectPtr in_type = in_type_nav->toObjectDTO();
+        type::dto::AronObjectPtr in_type = in_type_nav->toAronObjectDTO();
         BOOST_CHECK(in_type);
 
         armarx::aron::type::writer::NlohmannJSONWriter json_writer_in;
@@ -120,7 +120,7 @@ void test_toAronType(T& in, T& out)
     {
         type::ObjectPtr out_type_nav = out.toAronType();
 
-        type::dto::AronObjectPtr out_type = out_type_nav->toObjectDTO();
+        type::dto::AronObjectPtr out_type = out_type_nav->toAronObjectDTO();
         BOOST_CHECK(out_type);
 
         armarx::aron::type::writer::NlohmannJSONWriter json_writer_out;
@@ -147,7 +147,7 @@ void test_toAron(T& in, T& out)
     }
 
     BOOST_TEST_INFO("getting in aron");
-    data::dto::DictPtr in_aron = in_aron_nav->toAronDictPtr();
+    data::dto::DictPtr in_aron = in_aron_nav->toAronDictDTO();
     BOOST_CHECK(in_aron);
 
     //BOOST_TEST_MESSAGE("in_aron_nav: \n" << converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(in_aron_nav).dump(2));
@@ -162,7 +162,7 @@ void test_toAron(T& in, T& out)
         out_aron_nav = out.toAron();
         BOOST_CHECK(*in_aron_nav == *out_aron_nav);
 
-        data::dto::DictPtr out_aron = out_aron_nav->toAronDictPtr();
+        data::dto::DictPtr out_aron = out_aron_nav->toAronDictDTO();
         BOOST_CHECK(out_aron);
     }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/Variant.h b/source/RobotAPI/libraries/aron/core/type/variant/Variant.h
index aba2fdd51..ab996582c 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/Variant.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/Variant.h
@@ -115,9 +115,6 @@ namespace armarx::aron::type
         /// get the full name of this specific type
         virtual std::string getFullName() const = 0;
 
-        /// the default string to set the corresponding data object from string
-        virtual std::string getDefaultFromString() const = 0;
-
         /// get all child elements
         virtual std::vector<VariantPtr> getChildren() const = 0;
         virtual size_t childrenSize() 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 c58669203..3919bf844 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.cpp
@@ -80,15 +80,6 @@ namespace armarx::aron::type
         return "armarx::aron::type::Dict<" + acceptedType->getFullName() + ">";
     }
 
-    std::string Dict::getDefaultFromString() const
-    {
-        std::stringstream ss;
-        ss << "{" << "\n";
-        ss << "\t" << "\"key\": " << acceptedType->getDefaultFromString() << "\n";
-        ss << "}";
-        return ss.str();
-    }
-
     VariantPtr Dict::navigateAbsolute(const Path& path) const
     {
         if (!path.hasElement())
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 0c2e11ee5..4dfdd35e2 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Dict.h
@@ -56,7 +56,6 @@ namespace armarx::aron::type
 
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
         std::vector<VariantPtr> getChildren() const override;
         size_t childrenSize() 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 d01919203..807d64fed 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/List.cpp
@@ -80,15 +80,6 @@ namespace armarx::aron::type
         return "armarx::aron::type::List<" + acceptedType->getFullName() + ">";
     }
 
-    std::string List::getDefaultFromString() const
-    {
-        std::stringstream ss;
-        ss << "[" << "\n";
-        ss << "\t" << acceptedType->getDefaultFromString() << "\n";
-        ss << "]";
-        return ss.str();
-    }
-
     VariantPtr List::navigateAbsolute(const Path& path) const
     {
         if (!path.hasElement())
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 c739d0694..532146e01 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/List.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/List.h
@@ -55,7 +55,6 @@ namespace armarx::aron::type
 
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
         std::vector<VariantPtr> getChildren() const override;
         size_t childrenSize() 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 ee9ab1195..b3bf45605 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.cpp
@@ -54,6 +54,24 @@ namespace armarx::aron::type
         }
     }
 
+    ObjectPtr Object::FromAronObjectDTO(const type::dto::AronObjectPtr& aron)
+    {
+        if (!aron)
+        {
+            return nullptr;
+        }
+        return std::make_shared<Object>(*aron);
+    }
+
+    type::dto::AronObjectPtr Object::ToAronObjectDTO(const ObjectPtr& aron)
+    {
+        if (!aron)
+        {
+            return nullptr;
+        }
+        return aron->toAronObjectDTO();
+    }
+
     bool Object::checkObjectName(const std::string& s) const
     {
         if (s.empty())
@@ -117,7 +135,7 @@ namespace armarx::aron::type
     void Object::setExtends(const std::shared_ptr<Object>& p)
     {
         ARMARX_CHECK_NOT_NULL(p);
-        type::dto::AronObjectPtr ex = p->toObjectDTO();
+        type::dto::AronObjectPtr ex = p->toAronObjectDTO();
         ARMARX_CHECK_NOT_NULL(ex);
         extends = p;
     }
@@ -154,7 +172,7 @@ namespace armarx::aron::type
         return ret;
     }
 
-    type::dto::AronObjectPtr Object::toObjectDTO() const
+    type::dto::AronObjectPtr Object::toAronObjectDTO() const
     {
         // TODO: Shall we allow empty objects? For now yes!
         //if(acceptedTypeNavigators.empty())
@@ -197,13 +215,6 @@ namespace armarx::aron::type
         return "armarx::aron::type::Object<" + this->aron->objectName + (extends ? (" : " + extends->getFullName()) : "") + ">";
     }
 
-    std::string Object::getDefaultFromString() const
-    {
-        std::stringstream ss;
-        ss << "TODO!";
-        return ss.str();
-    }
-
     VariantPtr Object::navigateAbsolute(const Path& path) const
     {
         if (!path.hasElement())
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 15a3273a0..094d1f532 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Object.h
@@ -48,6 +48,9 @@ namespace armarx::aron::type
         Object(const std::string&, const std::map<std::string, VariantPtr>& = {}, const Path& = Path());
         Object(const type::dto::AronObject&, const Path& = Path());
 
+        static ObjectPtr FromAronObjectDTO(const type::dto::AronObjectPtr&);
+        static type::dto::AronObjectPtr ToAronObjectDTO(const ObjectPtr&);
+
         // public member functions
         bool checkObjectName(const std::string&) const;
 
@@ -65,14 +68,13 @@ namespace armarx::aron::type
 
         std::vector<std::string> getAllKeys() const;
 
-        type::dto::AronObjectPtr toObjectDTO() const;
+        type::dto::AronObjectPtr toAronObjectDTO() const;
 
         // virtual implementations
         VariantPtr navigateAbsolute(const Path& path) const override;
 
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
         std::vector<VariantPtr> getChildren() const override;
         size_t childrenSize() 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 fb938e302..48e0c6f4d 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.cpp
@@ -115,13 +115,6 @@ namespace armarx::aron::type
         return "armarx::aron::type::Pair<" + acceptedType1->getFullName() + ", " + acceptedType2->getFullName() + ">";
     }
 
-    std::string Pair::getDefaultFromString() const
-    {
-        std::stringstream ss;
-        ss << "TODO!";
-        return ss.str();
-    }
-
     VariantPtr Pair::navigateAbsolute(const Path& path) const
     {
         if (!path.hasElement())
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 9798548d0..a63f68194 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Pair.h
@@ -59,7 +59,6 @@ namespace armarx::aron::type
 
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
         std::vector<VariantPtr> getChildren() const override;
         size_t childrenSize() 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 c06d9d1c8..9fdca45e7 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.cpp
@@ -107,13 +107,6 @@ namespace armarx::aron::type
         return "armarx::aron::type::Tuple<" + simox::alg::to_string(names, ", ") + ">";
     }
 
-    std::string Tuple::getDefaultFromString() const
-    {
-        std::stringstream ss;
-        ss << "TODO!";
-        return ss.str();
-    }
-
     VariantPtr Tuple::navigateAbsolute(const Path& path) const
     {
         if (!path.hasElement())
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 d17df06b7..d464f8326 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/container/Tuple.h
@@ -56,7 +56,6 @@ namespace armarx::aron::type
 
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
         std::vector<VariantPtr> getChildren() const override;
         size_t childrenSize() const override;
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/enum/IntEnum.cpp b/source/RobotAPI/libraries/aron/core/type/variant/enum/IntEnum.cpp
index d425e0af8..734509d9e 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/enum/IntEnum.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/enum/IntEnum.cpp
@@ -111,10 +111,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::IntEnum";
     }
-
-    std::string IntEnum::getDefaultFromString() const
-    {
-        return "0";
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/enum/IntEnum.h b/source/RobotAPI/libraries/aron/core/type/variant/enum/IntEnum.h
index 1fd5661e3..cf652d23c 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/enum/IntEnum.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/enum/IntEnum.h
@@ -64,6 +64,5 @@ namespace armarx::aron::type
         // virtual implementations
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Image.cpp b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Image.cpp
index 4ea9d7c93..987a85ce2 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Image.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Image.cpp
@@ -77,10 +77,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Image<" + Pixeltype2String.at(this->aron->pixelType) + ">";
     }
-
-    std::string Image::getDefaultFromString() const
-    {
-        return "TODO!";
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Image.h b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Image.h
index e6bdee312..0b9f9dd09 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Image.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Image.h
@@ -53,7 +53,6 @@ namespace armarx::aron::type
         // virtual implementations
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
 
         static const std::map<image::PixelType, std::string> Pixeltype2String;
         static const std::map<std::string, image::PixelType> String2Pixeltype;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.cpp b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.cpp
index f471b2398..62eabd986 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.cpp
@@ -104,10 +104,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Matrix<" + std::to_string(this->aron->rows) + ", " + std::to_string(this->aron->cols) + ", " + Elementtype2String.at(this->aron->elementType) + ">";
     }
-
-    std::string Matrix::getDefaultFromString() const
-    {
-        return "TODO!";
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.h b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.h
index fa2a7cabe..da9fd537d 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.h
@@ -57,7 +57,6 @@ namespace armarx::aron::type
         // virtual implementations
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
 
         static const std::map<matrix::ElementType, std::string> Elementtype2String;
         static const std::map<std::string, matrix::ElementType> String2Elementtype;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/NDArray.cpp b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/NDArray.cpp
index e30a71b2c..cbbf517ba 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/NDArray.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/NDArray.cpp
@@ -77,10 +77,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::NDArray";
     }
-
-    std::string NDArray::getDefaultFromString() const
-    {
-        return "TODO!";
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/NDArray.h b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/NDArray.h
index b17f6f7ea..d04d218eb 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/NDArray.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/NDArray.h
@@ -56,6 +56,5 @@ namespace armarx::aron::type
         // virtual implementations
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Orientation.cpp b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Orientation.cpp
index 58b7f948c..031fd6f73 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Orientation.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Orientation.cpp
@@ -52,10 +52,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Orientation";
     }
-
-    std::string Orientation::getDefaultFromString() const
-    {
-        return "TODO!";
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Orientation.h b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Orientation.h
index 3a8107a26..b4bebb8ca 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Orientation.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Orientation.h
@@ -50,6 +50,5 @@ namespace armarx::aron::type
         // virtual implementations
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/PointCloud.cpp b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/PointCloud.cpp
index 8278b017d..10a347302 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/PointCloud.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/PointCloud.cpp
@@ -75,10 +75,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::PointCloud<" + Voxeltype2String.at(this->aron->voxelType) + ">";
     }
-
-    std::string PointCloud::getDefaultFromString() const
-    {
-        return "TODO!";
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/PointCloud.h b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/PointCloud.h
index bec4627de..37d3aacdb 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/PointCloud.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/PointCloud.h
@@ -54,7 +54,6 @@ namespace armarx::aron::type
         // virtual implementations
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
 
         static const std::map<pointcloud::VoxelType, std::string> Voxeltype2String;
         static const std::map<std::string, pointcloud::VoxelType> String2Voxeltype;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Pose.cpp
index 8ac9dc886..c6965c12b 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Pose.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Pose.cpp
@@ -52,15 +52,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Pose";
     }
-
-    std::string Pose::getDefaultFromString() const
-    {
-        std::stringstream ss;
-        ss << "0, 0, 0, 0" << "\n";
-        ss << "0, 0, 0, 0" << "\n";
-        ss << "0, 0, 0, 0" << "\n";
-        ss << "0, 0, 0, 0";
-        return ss.str();
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Pose.h b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Pose.h
index 20037341d..fa2c1f184 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Pose.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Pose.h
@@ -50,6 +50,5 @@ namespace armarx::aron::type
         // virtual implementations
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Position.cpp b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Position.cpp
index 8a169dbf2..68effb684 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Position.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Position.cpp
@@ -52,10 +52,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Position";
     }
-
-    std::string Position::getDefaultFromString() const
-    {
-        return "[0, 0, 0]";
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Position.h b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Position.h
index 1ed5a040c..427f0f43a 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Position.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Position.h
@@ -50,6 +50,5 @@ namespace armarx::aron::type
         // virtual implementations
         std::string getShortName() const override;
         std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Quaternion.cpp b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Quaternion.cpp
index 4d439844f..5457ee844 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Quaternion.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Quaternion.cpp
@@ -71,10 +71,5 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Quaternion<" + Elementtype2String.at(this->aron->elementType) + ">";
     }
-
-    std::string Quaternion::getDefaultFromString() const
-    {
-        return "[0, 0, 0]";
-    }
 }
 
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Quaternion.h b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Quaternion.h
index 77f181907..f660702be 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Quaternion.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/ndarray/Quaternion.h
@@ -53,7 +53,6 @@ namespace armarx::aron::type
         // virtual implementations
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
 
         static const std::map<quaternion::ElementType, std::string> Elementtype2String;
         static const std::map<std::string, quaternion::ElementType> String2Elementtype;
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Bool.cpp b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Bool.cpp
index 4ab368a34..9eca55904 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Bool.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Bool.cpp
@@ -57,9 +57,4 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Bool";
     }
-
-    std::string Bool::getDefaultFromString() const
-    {
-        return "true|false";
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Bool.h b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Bool.h
index 104849a71..eac4aeaea 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Bool.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Bool.h
@@ -47,6 +47,5 @@ namespace armarx::aron::type
         /* virtual implementations */
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Double.cpp b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Double.cpp
index 9e2f558b3..256e0a61f 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Double.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Double.cpp
@@ -57,9 +57,4 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Double";
     }
-
-    std::string Double::getDefaultFromString() const
-    {
-        return "0.0";
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Double.h b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Double.h
index 998a2cdf7..17aa98ad7 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Double.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Double.h
@@ -47,6 +47,5 @@ namespace armarx::aron::type
         /* virtual implementations */
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Float.cpp b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Float.cpp
index f98587a18..3d08b5bda 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Float.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Float.cpp
@@ -57,9 +57,4 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Float";
     }
-
-    std::string Float::getDefaultFromString() const
-    {
-        return "0.0";
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Float.h b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Float.h
index 77ff6e4a3..2dedfb173 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Float.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Float.h
@@ -47,6 +47,5 @@ namespace armarx::aron::type
         /* virtual implementations */
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Int.cpp b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Int.cpp
index 511512cfd..b371f53dd 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Int.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Int.cpp
@@ -57,9 +57,4 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Int";
     }
-
-    std::string Int::getDefaultFromString() const
-    {
-        return "0";
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Int.h b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Int.h
index 6a20a43a4..240cd4a50 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Int.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Int.h
@@ -47,6 +47,5 @@ namespace armarx::aron::type
         /* virtual implementations */
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Long.cpp b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Long.cpp
index 9d945e717..2654a773d 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Long.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Long.cpp
@@ -57,9 +57,4 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Long";
     }
-
-    std::string Long::getDefaultFromString() const
-    {
-        return "0";
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Long.h b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Long.h
index eca05833e..710df1a42 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Long.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Long.h
@@ -47,6 +47,5 @@ namespace armarx::aron::type
         /* virtual implementations */
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/String.cpp b/source/RobotAPI/libraries/aron/core/type/variant/primitive/String.cpp
index 1ac6a3c0b..1cced6991 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/String.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/String.cpp
@@ -58,9 +58,4 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::String";
     }
-
-    std::string String::getDefaultFromString() const
-    {
-        return "";
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/String.h b/source/RobotAPI/libraries/aron/core/type/variant/primitive/String.h
index b5da23423..54dedab7b 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/String.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/String.h
@@ -47,6 +47,5 @@ namespace armarx::aron::type
         /* virtual implementations */
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Time.cpp b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Time.cpp
index 1a0e19d85..76ba1e55c 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Time.cpp
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Time.cpp
@@ -58,9 +58,4 @@ namespace armarx::aron::type
     {
         return "armarx::aron::type::Time";
     }
-
-    std::string Time::getDefaultFromString() const
-    {
-        return "0";
-    }
 }
diff --git a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Time.h b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Time.h
index d460e7921..bd92b965d 100644
--- a/source/RobotAPI/libraries/aron/core/type/variant/primitive/Time.h
+++ b/source/RobotAPI/libraries/aron/core/type/variant/primitive/Time.h
@@ -47,6 +47,5 @@ namespace armarx::aron::type
         /* virtual implementations */
         virtual std::string getShortName() const override;
         virtual std::string getFullName() const override;
-        std::string getDefaultFromString() const override;
     };
 }
diff --git a/source/RobotAPI/libraries/skills/provider/Skill.cpp b/source/RobotAPI/libraries/skills/provider/Skill.cpp
index 5cac4402f..fa6824592 100644
--- a/source/RobotAPI/libraries/skills/provider/Skill.cpp
+++ b/source/RobotAPI/libraries/skills/provider/Skill.cpp
@@ -4,34 +4,85 @@ namespace armarx
 {
     namespace skills
     {
-        Skill::Skill()
+        Skill::Skill(const SkillDescription& desc):
+            description(desc)
         {
             // replace constructor if you want to have a specific logging tag
-            Logging::setTag("armarx::skills::Skill");
+            Logging::setTag("armarx::skills::" + description.skillName);
         }
 
-        Skill::Status Skill::execute(const aron::data::DictPtr& params, const CallbackT& callback)
+        std::thread Skill::installTimeoutCondition()
+        {
+            // start timeout check
+            return std::thread{ [&](){
+                    if (description.timeoutMs <= 0) return;
+                    long skillStartedAt = IceUtil::Time::now().toMilliSeconds();
+                    while(running)
+                    {
+                        auto now = IceUtil::Time::now().toMilliSeconds();
+                        if ((now - skillStartedAt) >= description.timeoutMs) notifyTimeoutReached();
+                        std::this_thread::sleep_for(std::chrono::milliseconds(100));
+                    }
+                }
+            };
+        }
+
+        void Skill::notifyTimeoutReached()
+        {
+            timeoutReached = true;
+            _notifyTimeoutReached();
+        }
+
+        void Skill::notifyStopped()
+        {
+            stopped = true;
+            _notifyStopped();
+        }
+
+        void Skill::_notifyTimeoutReached()
+        {
+
+        }
+
+        void Skill::_notifyStopped()
         {
-            (void) params;
 
-            ARMARX_WARNING_S << "You have to override this method!";
-            return Status::Succeeded;
         }
 
         void Skill::reset()
         {
             stopped = false;
             timeoutReached = false;
+
+            _reset();
         }
 
-        void Skill::notifyStopped()
+        void Skill::_reset()
         {
-            stopped = true;
+
         }
 
-        void Skill::notifyTimeoutReached()
+        Skill::Status Skill::execute(const aron::data::DictPtr& params, const CallbackT& callback)
         {
-            timeoutReached = true;
+            running = true;
+            started = IceUtil::Time::now().toMilliSeconds();
+
+            auto timeoutCheck = installTimeoutCondition();
+
+            auto ret = _execute(params, callback);
+
+            started = 0;
+            running = false;
+            timeoutCheck.join(); // safely wait for the timeoutcheck to return
+            return ret;
+        }
+
+        Skill::Status Skill::_execute(const aron::data::DictPtr& params, const CallbackT& callback)
+        {
+            (void) params;
+
+            ARMARX_WARNING_S << "You have to override this method!";
+            return Status::Succeeded;
         }
 
     }
diff --git a/source/RobotAPI/libraries/skills/provider/Skill.h b/source/RobotAPI/libraries/skills/provider/Skill.h
index 27a2c6089..a4bf8ba68 100644
--- a/source/RobotAPI/libraries/skills/provider/Skill.h
+++ b/source/RobotAPI/libraries/skills/provider/Skill.h
@@ -13,6 +13,8 @@
 #include <RobotAPI/interface/skills/SkillManagerInterface.h>
 #include <RobotAPI/libraries/aron/core/data/variant/All.h>
 
+#include "SkillDescription.h"
+
 namespace armarx
 {
     namespace skills
@@ -26,22 +28,45 @@ namespace armarx
             {
                 Succeeded,
                 TimeoutReached,
+                Stopped,
                 Failed
             };
 
-            Skill();
+            Skill() = delete;
+            Skill(const SkillDescription&);
             virtual ~Skill() = default;
 
-            virtual void notifyStopped();
-            virtual void notifyTimeoutReached();
+            /// Execute Skill
+            Status execute(const aron::data::DictPtr& params, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; });
+
+            /// Reset all parameters before starting a skill.
+            void reset();
+
+            /// Set the notification bools
+            void notifyTimeoutReached();
+            void notifyStopped();
 
             /// Override this method with the actual implementation. The callback is for status updates to the calling instance
-            virtual Status execute(const aron::data::DictPtr& params, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; });
+            virtual Status _execute(const aron::data::DictPtr& params, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; });
+
+            /// Override if you have special members that needs to be resetted
+            virtual void _reset();
 
-            /// Reset all parameters before starting a skill. Override if you have special members that needs to be resetted
-            virtual void reset();
+            /// Override these methods if you want to do something special when notification comes
+            virtual void _notifyTimeoutReached();
+            virtual void _notifyStopped();
+
+        private:
+            /// install a condition as a seperate thread
+            std::thread installTimeoutCondition();
+
+        public:
+            const SkillDescription description;
+            std::atomic_bool running = false;
+            long started = 0;
 
         protected:
+            /// Use conditions during runtime this way
             std::atomic_bool stopped = false;
             std::atomic_bool timeoutReached = false;
         };
diff --git a/source/RobotAPI/libraries/skills/provider/SkillDescription.cpp b/source/RobotAPI/libraries/skills/provider/SkillDescription.cpp
index 844249f0e..5295057be 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillDescription.cpp
+++ b/source/RobotAPI/libraries/skills/provider/SkillDescription.cpp
@@ -7,10 +7,7 @@ namespace armarx
         provider::dto::SkillDescription SkillDescription::toIce() const
         {
             provider::dto::SkillDescription ret;
-            if (acceptedType)
-            {
-                ret.acceptedType = acceptedType->toObjectDTO();
-            }
+            ret.acceptedType = aron::type::Object::ToAronObjectDTO(acceptedType);
             ret.description = description;
             ret.skillName = skillName;
             ret.targets = targets;
diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
index 30bbcc86a..c471f140c 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
@@ -52,35 +52,40 @@ namespace armarx
         addPlugin(plugin);
     }
 
-    void SkillProviderComponentPluginUser::addSkill(const std::shared_ptr<skills::Skill>& skill, const skills::SkillDescription& desc)
+    void SkillProviderComponentPluginUser::addSkill(const std::shared_ptr<skills::Skill>& skill)
     {
+        if (!skill)
+        {
+            return;
+        }
+
         std::lock_guard l(skillsMutex);
-        std::string skillName = desc.skillName;
 
+        std::string skillName = skill->description.skillName;
         if (skillImplementations.find(skillName) != skillImplementations.end())
         {
-            ARMARX_WARNING << "Try to add a skill '" + skillName + "' which already exists in list. Ignore this skill.";
+            ARMARX_WARNING << "Try to add a skill '" + skillName + "' which already exists in list. Ignoring this skill.";
             return;
         }
 
-        ARMARX_DEBUG << "Adding skill " << skillName << " to list";
-        skills::detail::SkillImplementationWrapper s(desc, skill);
+        ARMARX_INFO << "Adding skill " << skillName;
+        skills::detail::SkillImplementationWrapper s(skill);
         skillImplementations.insert({skillName, s});
     }
 
     void SkillProviderComponentPluginUser::addSkill(const skills::helper::LambdaSkill::FunT& f, const skills::SkillDescription& desc)
     {
-        auto lambda = std::make_shared<skills::helper::LambdaSkill>(f);
-        addSkill(lambda, desc);
+        auto lambda = std::make_shared<skills::helper::LambdaSkill>(f, desc);
+        addSkill(lambda);
     }
 
     skills::provider::dto::SkillDescriptionMap SkillProviderComponentPluginUser::getSkills(const Ice::Current &current)
     {
         std::lock_guard l(skillsMutex);
         skills::provider::dto::SkillDescriptionMap skillDesciptions;
-        for (const auto& [key, skillImplementation] : skillImplementations)
+        for (const auto& [key, skillWrapper] : skillImplementations)
         {
-            skillDesciptions.insert({key, skillImplementation.description.toIce()});
+            skillDesciptions.insert({key, skillWrapper.skill->description.toIce()});
         }
         return skillDesciptions;
     }
@@ -88,10 +93,10 @@ namespace armarx
     skills::provider::dto::SkillStatusUpdate SkillProviderComponentPluginUser::getSkillExecutionStatus(const std::string& skill, const Ice::Current &current)
     {
         std::lock_guard l(skillsMutex);
-        auto& skillImplementation = skillImplementations.at(skill);
+        auto& skillWrapper = skillImplementations.at(skill);
 
-        std::lock_guard l2(skillImplementation.statusInfo.skillStatusMutex);
-        return skillImplementation.statusInfo.statusUpdate.toIce();
+        std::lock_guard l2(skillWrapper.skillStatusMutex);
+        return skillWrapper.statusUpdate.toIce();
     }
 
     void SkillProviderComponentPluginUser::executeSkill(const skills::provider::dto::SkillExecutionInfo& info, const Ice::Current &current)
@@ -100,38 +105,21 @@ namespace armarx
         std::string skillName = info.skillName;
         ARMARX_CHECK_EXPRESSION(skillImplementations.count(skillName) > 0);
 
-        auto& impl = skillImplementations.at(skillName);
-
-        if (impl.task.joinable())
+        auto& wrapper = skillImplementations.at(skillName);
+        if (wrapper.task.joinable())
         {
-            impl.task.join();
-        }
-        if (impl.timeoutCheck.joinable())
-        {
-            impl.timeoutCheck.join();
-        }
-        if (impl.stoppedCheck.joinable())
-        {
-            impl.stoppedCheck.join();
+            wrapper.task.join();
         }
 
         // update input params
-        impl.reset();
-        impl.statusInfo.statusUpdate.usedCallbackInterface = info.callbackInterface;
-        impl.statusInfo.statusUpdate.skillName = info.skillName;
-        impl.statusInfo.statusUpdate.providerName = getName();
-        if (info.params)
-        {
-            impl.statusInfo.statusUpdate.usedParameterization = std::make_shared<aron::data::Dict>(info.params);
-        }
-
-        // make sure thread is started
-        impl.statusInfo.started = true;
-
-        // recreate thread and execute skill
-        impl.timeoutCheck = std::thread{ [&](){ impl.constantlyCheckForTimeoutReached();}};
-        impl.stoppedCheck = std::thread{ [&](){ impl.constantlyCheckForStopped();}};
-        impl.task = std::thread{ [&] { impl.execute();}};
+        wrapper.reset();
+        wrapper.statusUpdate.usedCallbackInterface = info.callbackInterface;
+        wrapper.statusUpdate.skillName = info.skillName;
+        wrapper.statusUpdate.providerName = getName();
+        wrapper.statusUpdate.usedParameterization = aron::data::Dict::FromAronDictDTO(info.params);
+
+        // recreate thread and execute skill.
+        wrapper.task = std::thread{ [&] { wrapper.execute();}};
     }
 
     skills::provider::dto::SkillStatusUpdate SkillProviderComponentPluginUser::abortSkill(const std::string& skillName, const Ice::Current &current)
@@ -139,33 +127,16 @@ namespace armarx
         std::lock_guard l(skillsMutex);
         ARMARX_CHECK_EXPRESSION(skillImplementations.count(skillName) > 0);
 
-        auto& impl = skillImplementations.at(skillName);
-        auto& statusInfo = impl.statusInfo;
+        auto& wrapper = skillImplementations.at(skillName);
 
-        std::lock_guard l2(statusInfo.skillStatusMutex);
-        auto& statusUpdate = statusInfo.statusUpdate;
-
-        impl.statusInfo.stopped = true;
-        impl.statusInfo.started = false;
-        if (impl.task.joinable())
-        {
-            impl.task.join();
-        }
-        if (impl.timeoutCheck.joinable())
-        {
-            impl.timeoutCheck.join();
-        }
-        if (impl.stoppedCheck.joinable())
-        {
-            impl.stoppedCheck.join();
-        }
+        std::lock_guard l2(wrapper.skillStatusMutex);
 
-        if (statusUpdate.status != skills::provider::dto::Execution::Status::Succeeded &&
-                statusUpdate.status != skills::provider::dto::Execution::Status::Failed)
+        if (wrapper.skill->running)
         {
-            impl.statusInfo.statusUpdate.status = skills::provider::dto::Execution::Status::Aborted;
+            wrapper.skill->notifyStopped();
+            wrapper.task.join();
         }
 
-        return statusUpdate.toIce();
+        return wrapper.statusUpdate.toIce();
     }
 }
diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
index 14b3ce55e..7e370346c 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
+++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
@@ -54,7 +54,7 @@ namespace armarx
 
     protected:
         void addSkill(const skills::helper::LambdaSkill::FunT&, const skills::SkillDescription&);
-        void addSkill(const std::shared_ptr<skills::Skill>&, const skills::SkillDescription&);
+        void addSkill(const std::shared_ptr<skills::Skill>&);
 
     private:
         armarx::plugins::SkillProviderComponentPlugin* plugin = nullptr;
diff --git a/source/RobotAPI/libraries/skills/provider/SkillStatusUpdate.cpp b/source/RobotAPI/libraries/skills/provider/SkillStatusUpdate.cpp
index f19d037dc..cfc9f6fd2 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillStatusUpdate.cpp
+++ b/source/RobotAPI/libraries/skills/provider/SkillStatusUpdate.cpp
@@ -9,13 +9,10 @@ namespace armarx
             provider::dto::SkillStatusUpdate ret;
             ret.providerName = providerName;
             ret.skillName = skillName;
-            if (data)
-            {
-                ret.data = data->toAronDictPtr();
-            }
+            ret.data = aron::data::Dict::ToAronDictDTO(data);
             ret.status = status;
             ret.usedCallbackInterface = usedCallbackInterface;
-            ret.usedParams = usedParameterization->toAronDictPtr();
+            ret.usedParams = aron::data::Dict::ToAronDictDTO(usedParameterization);
             return ret;
         }
     }
diff --git a/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h
index e3606ef52..a1b617a49 100644
--- a/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h
+++ b/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h
@@ -2,6 +2,11 @@
 
 #include "Skill.h"
 
+#include <RobotAPI/libraries/aron/core/type/variant/container/Object.h>
+
+// Debug
+#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
+
 namespace armarx
 {
     namespace skills
@@ -13,8 +18,14 @@ namespace armarx
             using Skill::Skill;
             virtual ~SpecializedSkill() = default;
 
+            /// returns the accepted type of the skill
+            static armarx::aron::type::ObjectPtr GetAcceptedType()
+            {
+                return AronT::toAronType();
+            }
+
             /// Override this method with the actual implementation. The callback is for status updates to the calling instance
-            virtual Status execute(const AronT& params, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; })
+            virtual Status _execute(const AronT& params, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; })
             {
                 (void) params;
 
@@ -23,12 +34,13 @@ namespace armarx
             }
 
             /// Do not use anymore
-            Status execute(const aron::data::DictPtr& params, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; }) final
+            Status _execute(const aron::data::DictPtr& params, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; }) final
             {
                 AronT p;
+                //ARMARX_IMPORTANT << aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(params).dump(2);
                 p.fromAron(params);
 
-                return execute(p, callback);
+                return _execute(p, callback);
             }
         };
     }
diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
index 4160489c0..9f9c573b8 100644
--- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
+++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
@@ -4,126 +4,96 @@ namespace armarx
 {
     namespace skills::detail
     {
-        void SkillImplementationWrapper::constantlyCheckForTimeoutReached() const
-        {
-            while(statusInfo.started)
-            {
-                if (isTimeoutReached())
-                {
-                    skill->notifyTimeoutReached();
-                    break; // only notify once?
-                }
-            }
-            std::this_thread::sleep_for(std::chrono::milliseconds(100));
-        }
-
-        void SkillImplementationWrapper::constantlyCheckForStopped() const
-        {
-            while(statusInfo.started)
-            {
-                if (statusInfo.stopped)
-                {
-                    skill->notifyStopped();
-                    break; // only notify once?
-                }
-            }
-            std::this_thread::sleep_for(std::chrono::milliseconds(100));
-        }
-
         void SkillImplementationWrapper::reset()
         {
-            std::lock_guard l(statusInfo.skillStatusMutex);
-            statusInfo.started = false;
-            statusInfo.stopped = false;
-            statusInfo.statusUpdate.status = skills::provider::dto::Execution::Status::Idle;
-            statusInfo.statusUpdate.data = nullptr;
-            skillStarted = IceUtil::Time::now().toMilliSeconds();
+            ARMARX_CHECK_NOT_NULL(skill);
+            std::lock_guard l(skillStatusMutex);
+            statusUpdate.status = skills::provider::dto::Execution::Status::Idle;
+            statusUpdate.data = nullptr;
             skill->reset();
         }
 
         void SkillImplementationWrapper::execute()
         {
-            ARMARX_INFO_S << "Executing skill: " << description.skillName;
-            statusInfo.started = true;
+            ARMARX_CHECK_NOT_NULL(skill);
+            std::lock_guard l(executingMutex);
+
+            const std::string skillName = skill->description.skillName;
+            ARMARX_INFO_S << "Executing skill: " << skillName;
 
             // get params and setup variables
-            auto& aron_params = statusInfo.statusUpdate.usedParameterization;
-            if (not(aron_params) && description.acceptedType)
-            {
-                throw armarx::LocalException("The Skill '" + description.skillName + "' requires a type but no params are NULL.");
-            }
+            auto& aron_params = statusUpdate.usedParameterization;
 
             try
             {
-                // set scheduled
+                // Check params
+                if (not(aron_params) && skill->description.acceptedType)
                 {
-                    std::lock_guard l(statusInfo.skillStatusMutex);
-                    statusInfo.statusUpdate.status = skills::provider::dto::Execution::Status::Scheduled;
-
-                    // do callback
-                    updateStatusCallback();
+                    throw armarx::LocalException("The Skill '" + skillName + "' requires a type but no params are NULL.");
                 }
 
-
-                // execute
+                // set scheduled
                 {
-                    std::lock_guard l(statusInfo.skillStatusMutex);
-                    statusInfo.statusUpdate.status = skills::provider::dto::Execution::Status::Running;
-                    updateStatusCallback();
+                    std::lock_guard l(skillStatusMutex);
+                    statusUpdate.status = skills::provider::dto::Execution::Status::Scheduled;
+                    updateStatus();
                 }
 
-                auto result = skill->execute(aron_params, [&](const aron::data::DictPtr& update)
-                                {
-                                    statusInfo.statusUpdate.data = update;
-                                    updateStatusCallback();
-                                }
-                );
 
-                if (result == skills::Skill::Status::Failed)
+                // execute
                 {
-                    throw armarx::LocalException("The Skill '"+description.skillName+"' failed during execution.");
+                    std::lock_guard l(skillStatusMutex);
+                    statusUpdate.status = skills::provider::dto::Execution::Status::Running;
+                    updateStatus();
                 }
-                if (result == skills::Skill::Status::TimeoutReached)
+
+                auto execution_callback = [&](const aron::data::DictPtr& update)
                 {
-                    throw armarx::LocalException("The Skill '"+description.skillName+"' reached timeout during execution.");
-                }
+                    statusUpdate.data = update;
+                    updateStatus();
+                };
+                auto result = skill->execute(aron_params, execution_callback);
 
+                switch (result)
                 {
-                    std::lock_guard l(statusInfo.skillStatusMutex);
-                    statusInfo.statusUpdate.status = skills::provider::dto::Execution::Status::Succeeded;
-                    updateStatusCallback();
+                    case skills::Skill::Status::Failed:
+                        throw armarx::LocalException("The Skill '" + skillName + "' failed during execution.");
+                        break;
+                    case skills::Skill::Status::TimeoutReached:
+                        throw armarx::LocalException("The Skill '" + skillName + "' reached timeout during execution.");
+                        break;
+                    case skills::Skill::Status::Stopped:
+                    {
+                        std::lock_guard l(skillStatusMutex);
+                        statusUpdate.status = skills::provider::dto::Execution::Status::Aborted;
+                        updateStatus();
+                        break;
+                    }
+                    default:
+                    {
+                        std::lock_guard l(skillStatusMutex);
+                        statusUpdate.status = skills::provider::dto::Execution::Status::Succeeded;
+                        updateStatus();
+                    }
                 }
             }
             catch (const std::exception& ex)
             {
-                ARMARX_WARNING_S << "Skill " << description.skillName << " died with exception:\n" << ex.what();
-
-                std::lock_guard l(statusInfo.skillStatusMutex);
-                statusInfo.statusUpdate.status = skills::provider::dto::Execution::Status::Failed;
-                updateStatusCallback();
-            }
-
-            statusInfo.started = false;
-        }
+                ARMARX_WARNING_S << "Skill " << skillName << " died with exception:\n" << ex.what();
 
-        bool SkillImplementationWrapper::isTimeoutReached() const
-        {
-            if (description.timeoutMs < 0)
-            {
-                return false;
+                std::lock_guard l(skillStatusMutex);
+                statusUpdate.status = skills::provider::dto::Execution::Status::Failed;
+                updateStatus();
             }
-
-            auto now = IceUtil::Time::now().toMilliSeconds();
-            return (now - skillStarted) >= description.timeoutMs;
         }
 
-        void SkillImplementationWrapper::updateStatusCallback() const
+        void SkillImplementationWrapper::updateStatus() const
         {
-            auto& callbackInterface = statusInfo.statusUpdate.usedCallbackInterface;
+            auto& callbackInterface = statusUpdate.usedCallbackInterface;
 
             if (callbackInterface)
             {
-                callbackInterface->updateStatusForSkill(statusInfo.statusUpdate.toIce());
+                callbackInterface->updateStatusForSkill(statusUpdate.toIce());
             }
         }
     }
diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
index 24a8637b4..35910a968 100644
--- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
+++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
@@ -16,47 +16,32 @@ namespace armarx
             {
             public:
                 // fixed values. Do not change after skill instantiation
-                const SkillDescription description;
                 const std::shared_ptr<Skill> skill;
 
                 // Current execution status. Changes during execution
                 // The status also holds the used parameterization
-                struct StatusInfo
-                {
-                    mutable std::mutex skillStatusMutex;
-                    std::atomic_bool started;
-                    std::atomic_bool stopped;
-                    SkillStatusUpdate statusUpdate;
-                } statusInfo;
+                mutable std::mutex skillStatusMutex;
+                SkillStatusUpdate statusUpdate;
 
                 // Task information. task is recreated every time the skill restarts
+                mutable std::mutex executingMutex;
                 std::thread task;
-                std::thread timeoutCheck;
-                std::thread stoppedCheck;
 
-                SkillImplementationWrapper(const skills::SkillDescription& desc, const std::shared_ptr<skills::Skill> skill) :
-                    description(desc), skill(skill)
+                SkillImplementationWrapper(const std::shared_ptr<skills::Skill> skill) :
+                    skill(skill)
                 {
                     reset();
                 }
 
                 SkillImplementationWrapper(const SkillImplementationWrapper& s) :
-                    SkillImplementationWrapper(s.description, s.skill)
+                    SkillImplementationWrapper(s.skill)
                 {}
 
                 void execute();
                 void reset();
 
-                // checks for interrupts
-                void constantlyCheckForTimeoutReached() const;
-                void constantlyCheckForStopped() const;
-
             protected:
-                bool isTimeoutReached() const;
-                void updateStatusCallback() const;
-
-            private:
-                long skillStarted = 0;
+                void updateStatus() const;
             };
         }
     }
diff --git a/source/RobotAPI/libraries/skills/provider/helper/LambdaSkillImplementation.cpp b/source/RobotAPI/libraries/skills/provider/helper/LambdaSkillImplementation.cpp
index 9b761b403..59d51cd16 100644
--- a/source/RobotAPI/libraries/skills/provider/helper/LambdaSkillImplementation.cpp
+++ b/source/RobotAPI/libraries/skills/provider/helper/LambdaSkillImplementation.cpp
@@ -5,7 +5,7 @@ namespace armarx
     namespace skills::helper
     {
 
-        Skill::Status LambdaSkill::execute(const aron::data::DictPtr& data, const CallbackT& callback)
+        Skill::Status LambdaSkill::_execute(const aron::data::DictPtr& data, const CallbackT& callback)
         {
             (void) callback;
             bool res = fun(data);
diff --git a/source/RobotAPI/libraries/skills/provider/helper/LambdaSkillImplementation.h b/source/RobotAPI/libraries/skills/provider/helper/LambdaSkillImplementation.h
index bb422b1bd..27e1ab0ae 100644
--- a/source/RobotAPI/libraries/skills/provider/helper/LambdaSkillImplementation.h
+++ b/source/RobotAPI/libraries/skills/provider/helper/LambdaSkillImplementation.h
@@ -12,9 +12,13 @@ namespace armarx
             using FunT = std::function<bool(const aron::data::DictPtr&)>;
 
             LambdaSkill() = delete;
-            LambdaSkill(const FunT& f) : fun(f) {};
+            LambdaSkill(const FunT& f, const SkillDescription& desc) :
+                Skill(desc),
+                fun(f)
+            {};
 
-            Skill::Status execute(const aron::data::DictPtr& data, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; }) override;
+        protected:
+            Skill::Status _execute(const aron::data::DictPtr& data, const CallbackT& callback = [](const aron::data::DictPtr& returnValue) { (void) returnValue; }) override;
 
         private:
             FunT fun;
-- 
GitLab