From d7c295811e510358b3d39e34666cad498b41f34c Mon Sep 17 00:00:00 2001
From: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu>
Date: Wed, 20 Jul 2022 16:13:00 +0200
Subject: [PATCH] Fixed error when executing skills from GUI, added visitor to
 set skill parameterizations from clipboard, added default parameters for
 skills, added special GUIs for ints, floats and bools (still TODO)

---
 .../SkillProviderExample.cpp                  |  27 +++-
 .../SkillManagerPlugin/CMakeLists.txt         |  11 ++
 .../SkillManagerMonitorWidget.ui              |  53 ++++---
 .../SkillManagerMonitorWidgetController.cpp   |  27 ++--
 .../SkillManagerMonitorWidgetController.h     |   1 +
 .../AronTreeWidgetController.cpp              |  35 ++++-
 .../aronTreeWidget/AronTreeWidgetController.h |   2 +-
 .../bool/AronTreeWidgetBoolInputModal.ui      |  52 +++++++
 ...AronTreeWidgetBoolInputModalController.cpp |  27 ++++
 .../AronTreeWidgetBoolInputModalController.h  |  27 ++++
 .../AronTreeWidgetFloatInputModal.ui          |  52 +++++++
 ...ronTreeWidgetFloatInputModalController.cpp |  27 ++++
 .../AronTreeWidgetFloatInputModalController.h |  27 ++++
 .../int_long/AronTreeWidgetIntInputModal.ui   |  52 +++++++
 .../AronTreeWidgetIntInputModalController.cpp |  27 ++++
 .../AronTreeWidgetIntInputModalController.h   |  27 ++++
 .../aronTreeWidget/modal/others_are_TODO      |   0
 .../AronTreeWidgetTextInputModalController.h  |   7 -
 .../visitors/AronTreeWidgetConverter.cpp      |  30 ++--
 .../visitors/AronTreeWidgetConverter.h        |  54 +++----
 .../visitors/AronTreeWidgetCreator.cpp        |   7 +-
 .../visitors/AronTreeWidgetCreator.h          |  53 +++----
 .../visitors/AronTreeWidgetModalCreator.cpp   |   5 +-
 .../visitors/AronTreeWidgetModalCreator.h     |  49 +++----
 .../visitors/AronTreeWidgetSetter.cpp         | 137 ++++++++++++++++++
 .../visitors/AronTreeWidgetSetter.h           |  64 ++++++++
 .../skills/SkillProviderInterface.ice         |   5 +-
 .../converter/json/NLohmannJSONConverter.cpp  |   2 -
 .../data/variant/detail/SpecializedVariant.h  |   2 +-
 .../libraries/skills/provider/Skill.cpp       |  14 +-
 .../libraries/skills/provider/Skill.h         |   7 +-
 .../skills/provider/SkillDescription.cpp      |   6 +
 .../skills/provider/SkillDescription.h        |  15 +-
 .../provider/SkillProviderComponentPlugin.cpp |  16 +-
 .../detail/SkillImplementationWrapper.cpp     |  11 +-
 .../detail/SkillImplementationWrapper.h       |   9 +-
 36 files changed, 759 insertions(+), 208 deletions(-)
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.h
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.h
 delete mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/others_are_TODO
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.cpp
 create mode 100644 source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.h

diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
index dc471cdf1..a5e0c8a63 100644
--- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
+++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
@@ -10,22 +10,33 @@
 
 namespace armarx::skills::provider
 {
-    HelloWorldSkill::HelloWorldSkill() :
-        Skill(SkillDescription{
+
+    SkillDescription CreateHelloWorldSkillDescription()
+    {
+        armarx::skills::Example::HelloWorldAcceptedType default_params;
+        default_params.some_float = 5;
+        default_params.some_int = 42;
+        default_params.some_text = "YOLO";
+
+        return SkillDescription{
             "HelloWorld",
             "This skill logs a message on ARMARX_IMPORTANT",
             {},
             1000,
-            armarx::skills::Example::HelloWorldAcceptedType::ToAronType()
-        })
+            armarx::skills::Example::HelloWorldAcceptedType::ToAronType(),
+            default_params.toAron()
+        };
+    }
+
+    HelloWorldSkill::HelloWorldSkill() :
+        Skill(CreateHelloWorldSkillDescription())
     {}
     Skill::Status HelloWorldSkill::main(const aron::data::DictPtr& d, const CallbackT&)
     {
-
         ARMARX_IMPORTANT << "Hi, from the Hello World Skill.\n" <<
-                            "I received the following data: \n" <<
-                            aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(d).dump(2) << "\n" <<
-                            "(executed at: " << IceUtil::Time::now() << ")";
+                                "I received the following data: \n" <<
+                                aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(d).dump(2) << "\n" <<
+                                "(executed at: " << IceUtil::Time::now() << ")";
         return Skill::Status::Succeeded;
     }
 
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt b/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt
index 1d427101f..89a90ab48 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt
@@ -7,11 +7,15 @@ armarx_build_if(ArmarXGui_FOUND "ArmarXGui not available")
 set(SOURCES
     aronTreeWidget/visitors/AronTreeWidgetCreator.cpp
     aronTreeWidget/visitors/AronTreeWidgetConverter.cpp
+    aronTreeWidget/visitors/AronTreeWidgetSetter.cpp
     aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp
     aronTreeWidget/Data.cpp
     aronTreeWidget/AronTreeWidgetItem.cpp
     aronTreeWidget/AronTreeWidgetController.cpp
     aronTreeWidget/modal/AronTreeWidgetModal.cpp
+    aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp
+    aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp
+    aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp
     aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.cpp
     aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp
     SkillManagerMonitorWidgetController.cpp
@@ -20,11 +24,15 @@ set(SOURCES
 set(HEADERS
     aronTreeWidget/visitors/AronTreeWidgetCreator.h
     aronTreeWidget/visitors/AronTreeWidgetConverter.h
+    aronTreeWidget/visitors/AronTreeWidgetSetter.h
     aronTreeWidget/visitors/AronTreeWidgetModalCreator.h
     aronTreeWidget/Data.h
     aronTreeWidget/AronTreeWidgetItem.h
     aronTreeWidget/AronTreeWidgetController.h
     aronTreeWidget/modal/AronTreeWidgetModal.h
+    aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.h
+    aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.h
+    aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.h
     aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h
     aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h
     SkillManagerMonitorWidgetController.h
@@ -32,6 +40,9 @@ set(HEADERS
 
 set(GUI_UIS
     SkillManagerMonitorWidget.ui
+    aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui
+    aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui
+    aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui
     aronTreeWidget/modal/text/AronTreeWidgetTextInputModal.ui
     aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui
 )
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
index 59089db20..00d50db0a 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
@@ -60,28 +60,7 @@
        <string>Skill Details</string>
       </property>
       <layout class="QGridLayout" name="gridLayout_2">
-       <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 current skill</string>
-         </property>
-        </widget>
-       </item>
-       <item row="0" column="1">
-        <widget class="QPushButton" name="pushButtonCopy">
-         <property name="text">
-          <string>Copy args to clipboard</string>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="0" colspan="2">
+       <item row="1" column="0" colspan="4">
         <widget class="QTreeWidget" name="treeWidgetSkillDetails">
          <column>
           <property name="text">
@@ -105,13 +84,41 @@
          </column>
         </widget>
        </item>
-       <item row="6" column="1">
+       <item row="6" column="3">
         <widget class="QPushButton" name="pushButtonExecuteSkill">
          <property name="text">
           <string>Request Execution</string>
          </property>
         </widget>
        </item>
+       <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 current skill</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="3">
+        <widget class="QPushButton" name="pushButtonReset">
+         <property name="text">
+          <string>Reset args</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="1">
+        <widget class="QPushButton" name="pushButtonCopy">
+         <property name="text">
+          <string>Copy args to clipboard</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 6ad23607b..4c3e3a983 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
@@ -268,9 +268,8 @@ namespace armarx
         exInfo.skillName = selectedSkill.skillName;
         exInfo.params = aron::data::Dict::ToAronDictDTO(data);
 
-        ARMARX_INFO << "Executing skill from GUI: " << selectedSkill.providerName << "/" << selectedSkill.skillName;
+        ARMARX_IMPORTANT << "Executing skill from GUI: " << selectedSkill.providerName << "/" << selectedSkill.skillName << ". The data was: " << data;
         // Note that we execute the skill in a seperate thread so that the GUI thread does not freeze.
-        //executions.emplace_back([&](){ manager->executeSkill(exInfo); });
         manager->begin_executeSkill(exInfo);
     }
 
@@ -303,6 +302,7 @@ namespace armarx
 
         if (!current->parent())
         {
+            // no parent available. Should not happen
             return;
         }
 
@@ -354,20 +354,11 @@ namespace armarx
             widget.treeWidgetSkillDetails->addTopLevelItem(it);
         }
 
-        if (skillDesc.acceptedType)
-        {
-            auto aron_args = std::make_shared<aron::type::Object>(*skillDesc.acceptedType);
-
-            skillsArgumentsTreeWidgetItem = new QTreeWidgetItem(widget.treeWidgetSkillDetails,
-                                          {QString::fromStdString("Arguments")});
+        skillsArgumentsTreeWidgetItem = new QTreeWidgetItem(widget.treeWidgetSkillDetails, {QString::fromStdString("Arguments")});
+        auto aron_args = aron::type::Object::FromAronObjectDTO(skillDesc.acceptedType);
+        auto default_args = aron::data::Dict::FromAronDictDTO(skillDesc.defaultParams);
 
-            aronTreeWidgetController = std::make_shared<AronTreeWidgetController>(widget.treeWidgetSkillDetails, skillsArgumentsTreeWidgetItem, aron_args);
-        }
-        else
-        {
-            auto it = new QTreeWidgetItem(widget.treeWidgetSkillDetails, {QString::fromStdString("No args")});
-            widget.treeWidgetSkillDetails->addTopLevelItem(it);
-        }
+        aronTreeWidgetController = std::make_shared<AronTreeWidgetController>(widget.treeWidgetSkillDetails, skillsArgumentsTreeWidgetItem, aron_args, default_args);
     }
 
     aron::data::DictPtr SkillManagerMonitorWidgetController::getConfigAsAron() const
@@ -408,6 +399,11 @@ namespace armarx
         aronTreeWidgetController->setFromAron(data);
     }
 
+    void SkillManagerMonitorWidgetController::resetCurrentConfig()
+    {
+        // TODO
+    }
+
     void SkillManagerMonitorWidgetController::onTreeWidgetItemDoubleClicked(QTreeWidgetItem* item, int column)
     {
         if (!item)
@@ -424,6 +420,7 @@ namespace armarx
                 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();
 
+                // why visitor?!?!?
                 AronTreeWidgetModalCreatorVisitor v(name, aItem, widget.treeWidgetSkillDetails);
                 aron::type::visit(v, aItem->aronType);
                 auto modal = v.createdModal;
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
index 00e15a756..64256f2d6 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
@@ -86,6 +86,7 @@ namespace armarx
 
         void copyCurrentConfig();
         void pasteCurrentConfig();
+        void resetCurrentConfig();
 
         void onTreeWidgetItemDoubleClicked(QTreeWidgetItem * item, int column);
 
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp
index 1eeaf00ff..0ef63ff50 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp
@@ -1,20 +1,37 @@
 #include "AronTreeWidgetController.h"
 
 #include "visitors/AronTreeWidgetConverter.h"
+#include "visitors/AronTreeWidgetSetter.h"
 
 namespace armarx
 {
-    AronTreeWidgetController::AronTreeWidgetController(QTreeWidget* tree, QTreeWidgetItem* parent, const aron::type::ObjectPtr& type):
+    AronTreeWidgetController::AronTreeWidgetController(QTreeWidget* tree, QTreeWidgetItem* parent, const aron::type::ObjectPtr& type, const aron::data::DictPtr& data):
         parent(parent),
         tree(tree),
         type(type)
     {
-        AronTreeWidgetCreatorVisitor v;
-        aron::type::visit(v, type);
+        if (type) // if there is a type set, we create a tree widget from the typp
+        {
+            AronTreeWidgetCreatorVisitor v;
+            aron::type::visit(v, type);
+
+            if (v.createdQWidgetItem)
+            {
+                parent->addChild(v.createdQWidgetItem);
+            }
 
-        if (v.createdQWidgetItem)
+            if (data) // check if there is a default argument set. Prefill the GUI with it
+            {
+                setFromAron(data);
+            }
+        }
+        else if(data) // there is no type but a default configuration. Prefill the GUI with the default arguments
+        {
+            // create type from data, ...
+        }
+        else
         {
-            parent->addChild(v.createdQWidgetItem);
+            new QTreeWidgetItem(parent, {QString::fromStdString("No args")});
         }
     }
 
@@ -31,8 +48,12 @@ namespace armarx
         return nullptr;
     }
 
-    void AronTreeWidgetController::setFromAron(const aron::data::DictPtr&)
+    void AronTreeWidgetController::setFromAron(const aron::data::DictPtr& data)
     {
-
+        if (parent)
+        {
+            AronTreeWidgetSetterVisitor v(parent, 0);
+            aron::data::visit(v, data);
+        }
     }
 }
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.h
index 4e73deb05..c70b0277b 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.h
@@ -18,7 +18,7 @@ namespace armarx
     {
 
     public:
-        AronTreeWidgetController(QTreeWidget* tree, QTreeWidgetItem* parent, const aron::type::ObjectPtr& type);
+        AronTreeWidgetController(QTreeWidget* tree, QTreeWidgetItem* parent, const aron::type::ObjectPtr& type, const aron::data::DictPtr& data = nullptr);
 
         aron::data::DictPtr convertToAron() const;
         void setFromAron(const aron::data::DictPtr&);
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui
new file mode 100644
index 000000000..69f4a5c99
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AronTreeWidgetBoolInputModalWidget</class>
+ <widget class="QWidget" name="AronTreeWidgetBoolInputModalWidget">
+  <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="1" column="0">
+        <widget class="QPushButton" name="pushButtonReset">
+         <property name="text">
+          <string>Reset</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1">
+        <widget class="QPushButton" name="pushButtonSubmit">
+         <property name="text">
+          <string>Submit</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="0" colspan="2">
+        <widget class="QTextEdit" name="textEditInput"/>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp
new file mode 100644
index 000000000..7bc282597
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp
@@ -0,0 +1,27 @@
+#include "AronTreeWidgetBoolInputModalController.h"
+
+namespace armarx
+{
+    AronTreeWidgetBoolInputModalController::AronTreeWidgetBoolInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) :
+        AronTreeWidgetModal(label, item, parent)
+    {
+        widget.setupUi(this);
+
+        // TODO
+    }
+
+    void AronTreeWidgetBoolInputModalController::submit()
+    {
+        item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, widget.textEditInput->toPlainText());
+
+        AronTreeWidgetModal::submit();
+    }
+
+    void AronTreeWidgetBoolInputModalController::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/bool/AronTreeWidgetBoolInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.h
new file mode 100644
index 000000000..1a1c60a07
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "../AronTreeWidgetModal.h"
+
+#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/ui_AronTreeWidgetBoolInputModal.h>
+
+#include <QDialog>
+
+namespace armarx
+{
+    class AronTreeWidgetBoolInputModalController :
+        public AronTreeWidgetModal
+    {
+
+    public:
+
+        AronTreeWidgetBoolInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent);
+
+    private slots:
+
+        void submit() final;
+        void reset() final;
+
+    private:
+        Ui::AronTreeWidgetBoolInputModalWidget widget;
+    };
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui
new file mode 100644
index 000000000..ba3734066
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AronTreeWidgetFloatInputModalWidget</class>
+ <widget class="QWidget" name="AronTreeWidgetFloatInputModalWidget">
+  <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="1" column="0">
+        <widget class="QPushButton" name="pushButtonReset">
+         <property name="text">
+          <string>Reset</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1">
+        <widget class="QPushButton" name="pushButtonSubmit">
+         <property name="text">
+          <string>Submit</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="0" colspan="2">
+        <widget class="QTextEdit" name="textEditInput"/>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp
new file mode 100644
index 000000000..ae9cbe6aa
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp
@@ -0,0 +1,27 @@
+#include "AronTreeWidgetFloatInputModalController.h"
+
+namespace armarx
+{
+    AronTreeWidgetFloatInputModalController::AronTreeWidgetFloatInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) :
+        AronTreeWidgetModal(label, item, parent)
+    {
+        widget.setupUi(this);
+
+        // TODO
+    }
+
+    void AronTreeWidgetFloatInputModalController::submit()
+    {
+        item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, widget.textEditInput->toPlainText());
+
+        AronTreeWidgetModal::submit();
+    }
+
+    void AronTreeWidgetFloatInputModalController::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/float_double/AronTreeWidgetFloatInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.h
new file mode 100644
index 000000000..debd50e9f
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "../AronTreeWidgetModal.h"
+
+#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/ui_AronTreeWidgetFloatInputModal.h>
+
+#include <QDialog>
+
+namespace armarx
+{
+    class AronTreeWidgetFloatInputModalController :
+        public AronTreeWidgetModal
+    {
+
+    public:
+
+        AronTreeWidgetFloatInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent);
+
+    private slots:
+
+        void submit() final;
+        void reset() final;
+
+    private:
+        Ui::AronTreeWidgetFloatInputModalWidget widget;
+    };
+}
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui
new file mode 100644
index 000000000..538a78e76
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AronTreeWidgetIntInputModalWidget</class>
+ <widget class="QWidget" name="AronTreeWidgetIntInputModalWidget">
+  <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="1" column="0">
+        <widget class="QPushButton" name="pushButtonReset">
+         <property name="text">
+          <string>Reset</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1">
+        <widget class="QPushButton" name="pushButtonSubmit">
+         <property name="text">
+          <string>Submit</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="0" colspan="2">
+        <widget class="QTextEdit" name="textEditInput"/>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp
new file mode 100644
index 000000000..dd9b19e06
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp
@@ -0,0 +1,27 @@
+#include "AronTreeWidgetIntInputModalController.h"
+
+namespace armarx
+{
+    AronTreeWidgetIntInputModalController::AronTreeWidgetIntInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) :
+        AronTreeWidgetModal(label, item, parent)
+    {
+        widget.setupUi(this);
+
+        // TODO
+    }
+
+    void AronTreeWidgetIntInputModalController::submit()
+    {
+        item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, widget.textEditInput->toPlainText());
+
+        AronTreeWidgetModal::submit();
+    }
+
+    void AronTreeWidgetIntInputModalController::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/int_long/AronTreeWidgetIntInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.h
new file mode 100644
index 000000000..1de43a087
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "../AronTreeWidgetModal.h"
+
+#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/ui_AronTreeWidgetIntInputModal.h>
+
+#include <QDialog>
+
+namespace armarx
+{
+    class AronTreeWidgetIntInputModalController :
+        public AronTreeWidgetModal
+    {
+
+    public:
+
+        AronTreeWidgetIntInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent);
+
+    private slots:
+
+        void submit() final;
+        void reset() final;
+
+    private:
+        Ui::AronTreeWidgetIntInputModalWidget 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
deleted file mode 100644
index e69de29bb..000000000
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h
index 216451f4a..c86cb5e84 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h
@@ -1,12 +1,5 @@
 #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>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp
index 04fab49b6..fbdc653ab 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp
@@ -22,18 +22,21 @@
 
 #include <string>
 
+// base class
 #include "AronTreeWidgetConverter.h"
 
-// debug
-#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
+// armarx
+#include <ArmarXCore/core/logging/Logging.h>
+
+// qt
+#include <QTreeWidgetItem>
 
-//visitors
 namespace armarx
 {
     void
     AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::ObjectPtr& i)
     {
-        auto createdAronDict = std::make_shared<aron::data::Dict>();
+        auto createdAronDict = std::make_shared<aron::data::Dict>(i->getPath());
         createdAron = createdAronDict;
         QTreeWidgetItem* el = parentItem->child(index);
 
@@ -43,17 +46,14 @@ namespace armarx
             AronTreeWidgetConverterVisitor v(el, x++);
             aron::type::visit(v, value);
 
-            if (v.createdAron)
-            {
-                createdAronDict->addElement(key, v.createdAron);
-            }
+            createdAronDict->addElement(key, v.createdAron);
         }
     }
 
     void
     AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::DictPtr& i)
     {
-        auto createdAronDict = std::make_shared<aron::data::Dict>();
+        auto createdAronDict = std::make_shared<aron::data::Dict>(i->getPath());
         createdAron = createdAronDict;
         QTreeWidgetItem* el = parentItem->child(index);
 
@@ -127,7 +127,7 @@ namespace armarx
     void
     AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::IntPtr& i)
     {
-        auto createdAronInt = std::make_shared<aron::data::Int>();
+        auto createdAronInt = std::make_shared<aron::data::Int>(i->getPath());
         createdAron = createdAronInt;
         QTreeWidgetItem* el = parentItem->child(index);
 
@@ -145,7 +145,7 @@ namespace armarx
     void
     AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::LongPtr& i)
     {
-        auto createdAronLong = std::make_shared<aron::data::Long>();
+        auto createdAronLong = std::make_shared<aron::data::Long>(i->getPath());
         createdAron = createdAronLong;
         QTreeWidgetItem* el = parentItem->child(index);
 
@@ -161,7 +161,7 @@ namespace armarx
     void
     AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::FloatPtr& i)
     {
-        auto createdAronFloat = std::make_shared<aron::data::Float>();
+        auto createdAronFloat = std::make_shared<aron::data::Float>(i->getPath());
         createdAron = createdAronFloat;
         QTreeWidgetItem* el = parentItem->child(index);
 
@@ -177,7 +177,7 @@ namespace armarx
     void
     AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::DoublePtr& i)
     {
-        auto createdAronDouble = std::make_shared<aron::data::Double>();
+        auto createdAronDouble = std::make_shared<aron::data::Double>(i->getPath());
         createdAron = createdAronDouble;
         QTreeWidgetItem* el = parentItem->child(index);
 
@@ -193,7 +193,7 @@ namespace armarx
     void
     AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::BoolPtr& i)
     {
-        auto createdAronBool = std::make_shared<aron::data::Bool>();
+        auto createdAronBool = std::make_shared<aron::data::Bool>(i->getPath());
         createdAron = createdAronBool;
         QTreeWidgetItem* el = parentItem->child(index);
 
@@ -209,7 +209,7 @@ namespace armarx
     void
     AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::StringPtr& i)
     {
-        auto createdAronString = std::make_shared<aron::data::String>();
+        auto createdAronString = std::make_shared<aron::data::String>(i->getPath());
         createdAron = createdAronString;
         QTreeWidgetItem* el = parentItem->child(index);
 
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.h
index a7d071906..eb056cdc2 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.h
@@ -21,22 +21,14 @@
  */
 #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 <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>
 
+// forward declarations of qt
+class QTreeWidgetItem;
+
+
 namespace armarx
 {
     // Conversion from TreeView to aron data
@@ -46,31 +38,31 @@ namespace armarx
     public:
         QTreeWidgetItem* parentItem;
         int index;
-        aron::data::VariantPtr createdAron;
+        aron::data::VariantPtr createdAron = nullptr;
 
         AronTreeWidgetConverterVisitor() = delete;
         AronTreeWidgetConverterVisitor(QTreeWidgetItem* i, int x) :
             parentItem(i), index(x)
         {}
 
-        void visitAronVariant(const aron::type::ObjectPtr&) override;
-        void visitAronVariant(const aron::type::DictPtr&) override;
-        void visitAronVariant(const aron::type::PairPtr&) override;
-        void visitAronVariant(const aron::type::TuplePtr&) override;
-        void visitAronVariant(const aron::type::ListPtr&) override;
-        void visitAronVariant(const aron::type::NDArrayPtr&) override;
-        void visitAronVariant(const aron::type::MatrixPtr&) override;
-        void visitAronVariant(const aron::type::QuaternionPtr&) override;
-        void visitAronVariant(const aron::type::ImagePtr&) override;
-        void visitAronVariant(const aron::type::PointCloudPtr&) override;
-        void visitAronVariant(const aron::type::IntEnumPtr&) override;
-        void visitAronVariant(const aron::type::IntPtr&) override;
-        void visitAronVariant(const aron::type::LongPtr&) override;
-        void visitAronVariant(const aron::type::FloatPtr&) override;
-        void visitAronVariant(const aron::type::DoublePtr&) override;
-        void visitAronVariant(const aron::type::BoolPtr&) override;
-        void visitAronVariant(const aron::type::StringPtr&) override;
-        void visitUnknown(Input&) override;
+        void visitAronVariant(const aron::type::ObjectPtr&) final;
+        void visitAronVariant(const aron::type::DictPtr&) final;
+        void visitAronVariant(const aron::type::PairPtr&) final;
+        void visitAronVariant(const aron::type::TuplePtr&) final;
+        void visitAronVariant(const aron::type::ListPtr&) final;
+        void visitAronVariant(const aron::type::NDArrayPtr&) final;
+        void visitAronVariant(const aron::type::MatrixPtr&) final;
+        void visitAronVariant(const aron::type::QuaternionPtr&) final;
+        void visitAronVariant(const aron::type::ImagePtr&) final;
+        void visitAronVariant(const aron::type::PointCloudPtr&) final;
+        void visitAronVariant(const aron::type::IntEnumPtr&) final;
+        void visitAronVariant(const aron::type::IntPtr&) final;
+        void visitAronVariant(const aron::type::LongPtr&) final;
+        void visitAronVariant(const aron::type::FloatPtr&) final;
+        void visitAronVariant(const aron::type::DoublePtr&) final;
+        void visitAronVariant(const aron::type::BoolPtr&) final;
+        void visitAronVariant(const aron::type::StringPtr&) final;
+        void visitUnknown(Input&) final;
     };
 }
 
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp
index 5e8cab9ee..ee43334bb 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp
@@ -22,14 +22,13 @@
 
 #include <string>
 
+// base class
 #include "AronTreeWidgetCreator.h"
 
-// debug
-#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
-
+// data
+#include "../AronTreeWidgetItem.h"
 #include "../Data.h"
 
-//visitors
 namespace armarx
 {
     void
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.h
index 5a696d52c..63dde7ef0 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.h
@@ -21,26 +21,15 @@
  */
 #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 AronTreeWidgetItem;
+
+    // Convert aron type to tree widgets
     class AronTreeWidgetCreatorVisitor :
             public armarx::aron::type::ConstVariantVisitor
     {
@@ -51,24 +40,24 @@ namespace armarx
 
         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::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 visitUnknown(Input&) override;
+        void visitAronVariant(const aron::type::ObjectPtr&) final;
+        void visitAronVariant(const aron::type::DictPtr& i) final;
+        void visitAronVariant(const aron::type::PairPtr& i) final;
+        void visitAronVariant(const aron::type::TuplePtr& i) final;
+        void visitAronVariant(const aron::type::ListPtr& i) final;
+        void visitAronVariant(const aron::type::NDArrayPtr& i) final;
+        void visitAronVariant(const aron::type::MatrixPtr& i) final;
+        void visitAronVariant(const aron::type::QuaternionPtr& i) final;
+        void visitAronVariant(const aron::type::ImagePtr& i) final;
+        void visitAronVariant(const aron::type::PointCloudPtr& i) final;
+        void visitAronVariant(const aron::type::IntEnumPtr& i) final;
+        void visitAronVariant(const aron::type::IntPtr& i) final;
+        void visitAronVariant(const aron::type::LongPtr& i) final;
+        void visitAronVariant(const aron::type::FloatPtr& i) final;
+        void visitAronVariant(const aron::type::DoublePtr& i) final;
+        void visitAronVariant(const aron::type::BoolPtr& i) final;
+        void visitAronVariant(const aron::type::StringPtr& i) final;
+        void visitUnknown(Input&) final;
     };
 }
 
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp
index 07c0eee7a..7ff248bd5 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp
@@ -26,10 +26,13 @@
 
 #include <SimoxUtility/algorithm/string.h>
 
-// debug
+// modals
 #include "../modal/text/AronTreeWidgetTextInputModalController.h"
 #include "../modal/dict/AronTreeWidgetDictInputModalController.h"
 
+// qt
+#include <QTreeWidget>
+
 //visitors
 namespace armarx
 {
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.h
index 26764e6d2..e22930a10 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.h
@@ -21,25 +21,12 @@
  */
 #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
@@ -59,24 +46,24 @@ namespace armarx
             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::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 visitUnknown(Input&) override;
+        void visitAronVariant(const aron::type::ObjectPtr&) final;
+        void visitAronVariant(const aron::type::DictPtr& i) final;
+        void visitAronVariant(const aron::type::PairPtr& i) final;
+        void visitAronVariant(const aron::type::TuplePtr& i) final;
+        void visitAronVariant(const aron::type::ListPtr& i) final;
+        void visitAronVariant(const aron::type::NDArrayPtr& i) final;
+        void visitAronVariant(const aron::type::MatrixPtr& i) final;
+        void visitAronVariant(const aron::type::QuaternionPtr& i) final;
+        void visitAronVariant(const aron::type::ImagePtr& i) final;
+        void visitAronVariant(const aron::type::PointCloudPtr& i) final;
+        void visitAronVariant(const aron::type::IntEnumPtr& i) final;
+        void visitAronVariant(const aron::type::IntPtr& i) final;
+        void visitAronVariant(const aron::type::LongPtr& i) final;
+        void visitAronVariant(const aron::type::FloatPtr& i) final;
+        void visitAronVariant(const aron::type::DoublePtr& i) final;
+        void visitAronVariant(const aron::type::BoolPtr& i) final;
+        void visitAronVariant(const aron::type::StringPtr& i) final;
+        void visitUnknown(Input&) final;
     };
 }
 
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.cpp
new file mode 100644
index 000000000..87d99fe16
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.cpp
@@ -0,0 +1,137 @@
+/*
+ * 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 "AronTreeWidgetSetter.h"
+
+//visitors
+namespace armarx
+{
+    bool AronTreeWidgetSetterVisitor::checkTreeWidgetItemForSimilarName(const std::string& name) const
+    {
+        QTreeWidgetItem* el = parentItem->child(index);
+        std::string n = el->text(0).toStdString();
+        if (name != n)
+        {
+            ARMARX_WARNING_S << "Could not set a tree widget value for the element with key '" << name << "' because it is different from the expected name '" << n << "'.";
+            return false;
+        }
+        return true;
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::DictPtr& i)
+    {
+        if (i->getPath().size() == 0 || checkTreeWidgetItemForSimilarName(i->getPath().getLastElement())) // either it is the root or it has a name
+        {
+            QTreeWidgetItem* el = parentItem->child(index);
+
+            unsigned int x = 0;
+            for (const auto& [key, value] : i->getElements())
+            {
+                AronTreeWidgetSetterVisitor v(el, x++);
+                aron::data::visit(v, value);
+            }
+            return;
+        }
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::ListPtr& i)
+    {
+        if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement()))
+        {
+            QTreeWidgetItem* el = parentItem->child(index);
+
+            unsigned int x = 0;
+            for (const auto& value : i->getElements())
+            {
+                AronTreeWidgetSetterVisitor v(el, x++);
+                aron::data::visit(v, value);
+            }
+        }
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::NDArrayPtr& i)
+    {
+
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::IntPtr& i)
+    {
+        if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement()))
+        {
+            QTreeWidgetItem* el = parentItem->child(index);
+            el->setText(1, QString::fromStdString(std::to_string(i->getValue())));
+        }
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::LongPtr& i)
+    {
+        if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement()))
+        {
+            QTreeWidgetItem* el = parentItem->child(index);
+            el->setText(1, QString::fromStdString(std::to_string(i->getValue())));
+        }
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::FloatPtr& i)
+    {
+        if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement()))
+        {
+            QTreeWidgetItem* el = parentItem->child(index);
+            el->setText(1, QString::fromStdString(std::to_string(i->getValue())));
+        }
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::DoublePtr& i)
+    {
+        if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement()))
+        {
+            QTreeWidgetItem* el = parentItem->child(index);
+            el->setText(1, QString::fromStdString(std::to_string(i->getValue())));
+        }
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::BoolPtr& i)
+    {
+        if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement()))
+        {
+            QTreeWidgetItem* el = parentItem->child(index);
+            el->setText(1, QString::fromStdString(std::to_string(i->getValue())));
+        }
+    }
+
+    void AronTreeWidgetSetterVisitor::visitAronVariant(const aron::data::StringPtr& i)
+    {
+        if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement()))
+        {
+            QTreeWidgetItem* el = parentItem->child(index);
+            el->setText(1, QString::fromStdString(i->getValue()));
+        }
+    }
+
+    void AronTreeWidgetSetterVisitor::visitUnknown(Input&)
+    {
+        ARMARX_WARNING_S << "Received an unknown type when trying to set a skill argument type from an aron data object.";
+    }
+}
+
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.h
new file mode 100644
index 000000000..336be31e2
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.h
@@ -0,0 +1,64 @@
+/*
+ * 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 "../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/data/visitor/variant/VariantVisitor.h>
+
+namespace armarx
+{
+    // Conversion from TreeView to aron data
+    class AronTreeWidgetSetterVisitor :
+            public armarx::aron::data::ConstVariantVisitor
+    {
+    public:
+        QTreeWidgetItem* parentItem;
+        int index;
+        AronTreeWidgetItem* qWidgetItem;
+
+        AronTreeWidgetSetterVisitor() = delete;
+        AronTreeWidgetSetterVisitor(QTreeWidgetItem* i, int x) :
+            parentItem(i), index(x)
+        {}
+
+        virtual void visitAronVariant(const aron::data::DictPtr&) final;
+        virtual void visitAronVariant(const aron::data::ListPtr&) final;
+        virtual void visitAronVariant(const aron::data::NDArrayPtr&) final;
+        virtual void visitAronVariant(const aron::data::IntPtr&) final;
+        virtual void visitAronVariant(const aron::data::LongPtr&) final;
+        virtual void visitAronVariant(const aron::data::FloatPtr&) final;
+        virtual void visitAronVariant(const aron::data::DoublePtr&) final;
+        virtual void visitAronVariant(const aron::data::BoolPtr&) final;
+        virtual void visitAronVariant(const aron::data::StringPtr&) final;
+        void visitUnknown(Input&) final;
+
+    private:
+        bool checkTreeWidgetItemForSimilarName(const std::string& name) const;
+    };
+}
+
+
diff --git a/source/RobotAPI/interface/skills/SkillProviderInterface.ice b/source/RobotAPI/interface/skills/SkillProviderInterface.ice
index b21e5135e..33fbf744f 100644
--- a/source/RobotAPI/interface/skills/SkillProviderInterface.ice
+++ b/source/RobotAPI/interface/skills/SkillProviderInterface.ice
@@ -25,6 +25,7 @@
 #include <RobotAPI/interface/aron.ice>
 
 
+// We need to prototype the interface
 module armarx
 {
     module skills
@@ -56,9 +57,10 @@ module armarx
                 {
                     string                        skillName;     // the name of the skill
                     string                        description;   // a human readable description of what the skill does
-                    StringList                    robots;        // see above
+                    StringList                    robots;        // the names of the robotis that are able to eecute that skill
                     long                          timeoutMs;     // in milliseconds
                     aron::type::dto::AronObject   acceptedType;  // the name of the object is irrelevant and only used in GUI
+                    aron::data::dto::Dict         defaultParams; // the default parameterization used in GUI. nullptr if not set
                 };
                 dictionary<string, SkillDescription> SkillDescriptionMap;
 
@@ -128,6 +130,7 @@ module armarx
     }
 }
 
+
 module armarx
 {
     module skills
diff --git a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp
index 537b389e3..e6429e7fe 100644
--- a/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp
+++ b/source/RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.cpp
@@ -11,7 +11,6 @@ namespace armarx::aron::converter
 
     void AronNlohmannJSONConverter::ConvertToNlohmannJSON(const aron::data::VariantPtr& aron, nlohmann::json& j)
     {
-        aron::data::writer::NlohmannJSONWriter dataWriter;
         j = aron::data::readAndWrite<data::FromVariantConverter<data::writer::NlohmannJSONWriter>>(aron);
     }
 
@@ -24,7 +23,6 @@ namespace armarx::aron::converter
 
     void AronNlohmannJSONConverter::ConvertToNlohmannJSON(const aron::type::VariantPtr& aron, nlohmann::json& j)
     {
-        aron::type::writer::NlohmannJSONWriter typeWriter;
         j = aron::type::readAndWrite<type::FromVariantConverter<type::writer::NlohmannJSONWriter>>(aron);
     }
 
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h b/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
index e8a00e47c..4ac67da09 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
+++ b/source/RobotAPI/libraries/aron/core/data/variant/detail/SpecializedVariant.h
@@ -113,7 +113,7 @@ namespace armarx::aron::data::detail
                 return nullptr;
             }
 
-            auto casted = DerivedT::DynamicCast(n);
+            PointerType casted = DerivedT::DynamicCast(n);
             ARMARX_CHECK_NOT_NULL(casted) << "The path was: " << n->getPath().toString() << ".\n"
                                           << "It has the descriptor: '" << data::defaultconversion::string::Descriptor2String.at(n->getDescriptor()) << "'.\n"
                                           << "And the typeid: " << typeid(n).name() << ". Tried to cast to " << typeid(PointerType).name();
diff --git a/source/RobotAPI/libraries/skills/provider/Skill.cpp b/source/RobotAPI/libraries/skills/provider/Skill.cpp
index c3265710f..23588f899 100644
--- a/source/RobotAPI/libraries/skills/provider/Skill.cpp
+++ b/source/RobotAPI/libraries/skills/provider/Skill.cpp
@@ -11,6 +11,7 @@ namespace armarx
             Logging::setTag("armarx::skills::" + description.skillName);
         }
 
+        // install a local condition via a lambda
         void Skill::installCondition(std::function<bool()>&& f, std::function<void()>&& cb)
         {
             std::lock_guard l(callbacksMutex);
@@ -27,6 +28,7 @@ namespace armarx
             stopped = true;
         }
 
+        // reset all local variables
         void Skill::reset()
         {
             started = IceUtil::Time::milliSeconds(-1);
@@ -37,13 +39,13 @@ namespace armarx
             timeoutReached = false;
         }
 
+        // always called before execute (should not take longer than 100ms)
         void Skill::init(const aron::data::DictPtr& params)
         {
             (void) params;
 
             ARMARX_IMPORTANT << "Initializing Skill '" << description.skillName << "'";
 
-            // always called before execute (should not take longer than 100ms)
             callbacks.clear();
             running = true;
             started = IceUtil::Time::now();
@@ -54,7 +56,7 @@ namespace armarx
                         [&](){ notifyTimeoutReached(); }
             );
 
-            callbackThread = std::thread([&]()
+            conditionCheckingThread = std::thread([&]()
             {
                 while (running)
                 {
@@ -70,17 +72,17 @@ namespace armarx
             });
         }
 
+        // always called after execute (should not take longer than 100ms)
         void Skill::exit(const aron::data::DictPtr& params)
         {
             (void) params;
 
             ARMARX_IMPORTANT << "Exiting Skill '" << description.skillName << "'";
 
-            // always called after execute (should not take longer than 100ms)
-            running = false;
-            if (callbackThread.joinable())
+            running = false; // notify all conditions to stop
+            if (conditionCheckingThread.joinable())
             {
-                callbackThread.join();
+                conditionCheckingThread.join();
             }
             exited = IceUtil::Time::now();
         }
diff --git a/source/RobotAPI/libraries/skills/provider/Skill.h b/source/RobotAPI/libraries/skills/provider/Skill.h
index 0ecb43166..1447fdd13 100644
--- a/source/RobotAPI/libraries/skills/provider/Skill.h
+++ b/source/RobotAPI/libraries/skills/provider/Skill.h
@@ -8,6 +8,7 @@
 #include <ArmarXCore/core/ComponentPlugin.h>
 #include <ArmarXCore/core/ManagedIceObject.h>
 
+#include <ArmarXCore/core/time/DateTime.h>
 #include <ArmarXCore/core/services/tasks/RunningTask.h>
 
 #include <RobotAPI/interface/skills/SkillManagerInterface.h>
@@ -68,7 +69,7 @@ namespace armarx
             std::vector<std::pair<std::function<bool()>, std::function<void()>>> callbacks;
             mutable std::mutex callbacksMutex;
 
-            /// running params
+            /// running params. TODO switch to armarx::core::time
             IceUtil::Time started = IceUtil::Time::milliSeconds(-1);
             IceUtil::Time exited = IceUtil::Time::milliSeconds(-1);
 
@@ -76,13 +77,13 @@ namespace armarx
             manager::dti::SkillManagerInterfacePrx manager = nullptr;
 
         protected:
-            /// Use conditions managerme this way
+            /// Use conditions this way
             std::atomic_bool running = true;
             std::atomic_bool stopped = false;
             std::atomic_bool timeoutReached = false;
 
         private:
-            std::thread callbackThread;
+            std::thread conditionCheckingThread;
         };
     }
 }
diff --git a/source/RobotAPI/libraries/skills/provider/SkillDescription.cpp b/source/RobotAPI/libraries/skills/provider/SkillDescription.cpp
index 547cb389c..3256f3e11 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillDescription.cpp
+++ b/source/RobotAPI/libraries/skills/provider/SkillDescription.cpp
@@ -4,6 +4,11 @@ namespace armarx
 {
     namespace skills
     {
+        SkillDescription::SkillDescription(const std::string& name, const std::string& desc, const std::vector<std::string>& r, long timeoutMs, const aron::type::ObjectPtr& type, const aron::data::DictPtr& def) :
+            skillName(name), description(desc), robots(r), timeoutMs(timeoutMs), acceptedType(type), defaultParams(def)
+        {
+        }
+
         provider::dto::SkillDescription SkillDescription::toIce() const
         {
             provider::dto::SkillDescription ret;
@@ -12,6 +17,7 @@ namespace armarx
             ret.skillName = skillName;
             ret.robots = robots;
             ret.timeoutMs = timeoutMs;
+            ret.defaultParams = aron::data::Dict::ToAronDictDTO(defaultParams);
             return ret;
         }
     }
diff --git a/source/RobotAPI/libraries/skills/provider/SkillDescription.h b/source/RobotAPI/libraries/skills/provider/SkillDescription.h
index 70b294b11..14bb86dc3 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillDescription.h
+++ b/source/RobotAPI/libraries/skills/provider/SkillDescription.h
@@ -4,6 +4,7 @@
 #include <vector>
 
 #include <RobotAPI/interface/skills/SkillProviderInterface.h>
+#include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
 #include <RobotAPI/libraries/aron/core/type/variant/container/Object.h>
 
 namespace armarx
@@ -12,11 +13,15 @@ namespace armarx
     {
         struct SkillDescription
         {
-            std::string                        skillName;
-            std::string                        description;
-            std::vector<std::string>           robots;
-            long                               timeoutMs;
-            aron::type::ObjectPtr              acceptedType;
+            std::string                        skillName = "";
+            std::string                        description = "";
+            std::vector<std::string>           robots = {};
+            long                               timeoutMs = -1;
+            aron::type::ObjectPtr              acceptedType = nullptr;
+            aron::data::DictPtr                defaultParams = nullptr;
+
+            SkillDescription() = default;
+            SkillDescription(const std::string&, const std::string&, const std::vector<std::string>&, long, const aron::type::ObjectPtr&, const aron::data::DictPtr& = nullptr);
 
             provider::dto::SkillDescription toIce() const;
         };
diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
index a17411d10..0691a6f71 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
@@ -138,7 +138,14 @@ namespace armarx
     // Please not that this method waits until the skill can be scheduled!
     void SkillProviderComponentPluginUser::executeSkill(const skills::provider::dto::SkillExecutionRequest& info, const Ice::Current &)
     {
+        // The skill will be executed in a different thread
         std::thread execution;
+
+        // setup input args for skill execution
+        skills::SkillParameterization usedParameterization;
+        usedParameterization.usedCallbackInterface = info.callbackInterface;
+        usedParameterization.usedInputParams = aron::data::Dict::FromAronDictDTO(info.params);
+
         {
             std::shared_lock l(skillsMutex);
             std::string skillName = info.skillName;
@@ -147,19 +154,14 @@ namespace armarx
             // get reference of the wrapper
             auto& wrapper = skillImplementations.at(skillName);
 
-            // setup input args
-            skills::SkillParameterization usedParameterization;
-            usedParameterization.usedCallbackInterface = info.callbackInterface;
-            usedParameterization.usedInputParams = aron::data::Dict::FromAronDictDTO(info.params);
-
             // async start execution. But we wait for the execution to finish at the end of this method
-            execution = std::thread([&](){
+            execution = std::thread([&wrapper, &usedParameterization](){
                 // execute waits until the previous execution finishes.
                 wrapper.execute(usedParameterization);
             });
         } // release lock. We don't know how long the skill needs to finish and we have to releasethe lock for being able to abort the execution
 
-        if(execution.joinable())
+        if (execution.joinable())
         {
             execution.join();
         }
diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
index 15cc6af55..50d95cade 100644
--- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
+++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
@@ -4,6 +4,12 @@ namespace armarx
 {
     namespace skills::detail
     {
+        SkillImplementationWrapper::SkillImplementationWrapper(std::unique_ptr<skills::Skill>&& skill) :
+            skill(std::move(skill))
+        {
+            ARMARX_CHECK_NOT_NULL(this->skill);
+        }
+
         void SkillImplementationWrapper::execute(const skills::SkillParameterization parameterization)
         {
             std::unique_lock l(executingMutex);
@@ -54,7 +60,10 @@ namespace armarx
                 updateStatus(skills::provider::dto::Execution::Status::Running);
 
                 skill->init(aron_params);
-                auto ret = skill->main(aron_params, [&](const aron::data::DictPtr& update) { updateStatus(statusUpdate.status, update); });
+                auto ret = skill->main(aron_params, [&](const aron::data::DictPtr& update)
+                    {
+                        updateStatus(statusUpdate.status, update);
+                    });
                 skill->exit(aron_params);
 
                 switch (ret)
diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
index 1c70a14e5..f06420a2f 100644
--- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
+++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
@@ -26,15 +26,10 @@ namespace armarx
                 mutable std::shared_mutex skillStatusMutex;
                 SkillStatusUpdate statusUpdate;
 
-                // Task information. task is recreated every time the skill restarts
+                // Task information
                 mutable std::shared_mutex executingMutex;
-                std::thread task;
 
-                SkillImplementationWrapper(std::unique_ptr<skills::Skill>&& skill) :
-                    skill(std::move(skill))
-                {
-                    ARMARX_CHECK_NOT_NULL(this->skill);
-                }
+                SkillImplementationWrapper(std::unique_ptr<skills::Skill>&& skill);
 
                 // execute a skill. The parameterization is copied
                 void execute(const skills::SkillParameterization);
-- 
GitLab