From 4f2b0fc5e178c5f7818cb55960b1da9b7ddf35a2 Mon Sep 17 00:00:00 2001
From: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu>
Date: Thu, 15 Sep 2022 11:47:13 +0200
Subject: [PATCH] skill provider updates

---
 .../SkillProviderExample.cpp                  | 91 ++++++++++---------
 .../SkillProviderExample.h                    | 27 +++++-
 .../segment/SkillExecutionRequestSegment.cpp  | 33 +++++--
 .../RobotAPI/libraries/skills/CMakeLists.txt  | 15 +--
 .../libraries/skills/provider/LambdaSkill.cpp | 15 +--
 .../libraries/skills/provider/LambdaSkill.h   |  2 +-
 .../skills/provider/PeriodicSkill.cpp         | 28 +++---
 .../libraries/skills/provider/PeriodicSkill.h | 14 ++-
 .../provider/PeriodicSpecializedSkill.h       | 24 +++--
 .../libraries/skills/provider/Skill.cpp       | 10 +-
 .../libraries/skills/provider/Skill.h         | 19 ++--
 .../provider/SkillProviderComponentPlugin.h   |  7 ++
 .../libraries/skills/provider/SkillProxy.cpp  |  6 ++
 .../libraries/skills/provider/SkillProxy.h    |  1 +
 .../skills/provider/SpecializedSkill.h        | 19 ++--
 .../detail/SkillImplementationWrapper.cpp     | 40 ++++----
 .../detail/SkillImplementationWrapper.h       |  3 +-
 .../libraries/skills/provider/mixins/All.h    |  7 ++
 .../skills/provider/mixins/ArvizSkillMixin.h  | 26 ++++++
 .../provider/mixins/GraspReadingSkillMixin.h  | 25 +++++
 .../skills/provider/mixins/MNSSkillMixin.h    | 16 ++++
 .../provider/mixins/MemoryReadingSkillMixin.h | 16 ++++
 .../provider/mixins/ObjectReadingSkillMixin.h | 25 +++++
 .../provider/mixins/ObjectWritingSkillMixin.h | 16 ++++
 .../provider/mixins/RobotReadingSkillMixin.h  | 28 ++++++
 .../libraries/skills/provider/util/All.h      |  6 --
 .../skills/provider/util/ArvizSkillUtil.h     | 20 ----
 .../provider/util/GraspReadingSkillUtil.h     | 20 ----
 .../provider/util/MemoryReadingSkillUtil.h    | 13 ---
 .../provider/util/ObjectReadingSkillUtil.h    | 20 ----
 .../provider/util/ObjectWritingSkillUtil.h    | 13 ---
 .../provider/util/RobotReadingSkillUtil.h     | 19 ----
 32 files changed, 361 insertions(+), 263 deletions(-)
 create mode 100644 source/RobotAPI/libraries/skills/provider/mixins/All.h
 create mode 100644 source/RobotAPI/libraries/skills/provider/mixins/ArvizSkillMixin.h
 create mode 100644 source/RobotAPI/libraries/skills/provider/mixins/GraspReadingSkillMixin.h
 create mode 100644 source/RobotAPI/libraries/skills/provider/mixins/MNSSkillMixin.h
 create mode 100644 source/RobotAPI/libraries/skills/provider/mixins/MemoryReadingSkillMixin.h
 create mode 100644 source/RobotAPI/libraries/skills/provider/mixins/ObjectReadingSkillMixin.h
 create mode 100644 source/RobotAPI/libraries/skills/provider/mixins/ObjectWritingSkillMixin.h
 create mode 100644 source/RobotAPI/libraries/skills/provider/mixins/RobotReadingSkillMixin.h
 delete mode 100644 source/RobotAPI/libraries/skills/provider/util/All.h
 delete mode 100644 source/RobotAPI/libraries/skills/provider/util/ArvizSkillUtil.h
 delete mode 100644 source/RobotAPI/libraries/skills/provider/util/GraspReadingSkillUtil.h
 delete mode 100644 source/RobotAPI/libraries/skills/provider/util/MemoryReadingSkillUtil.h
 delete mode 100644 source/RobotAPI/libraries/skills/provider/util/ObjectReadingSkillUtil.h
 delete mode 100644 source/RobotAPI/libraries/skills/provider/util/ObjectWritingSkillUtil.h
 delete mode 100644 source/RobotAPI/libraries/skills/provider/util/RobotReadingSkillUtil.h

diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
index 45a16b150..783821b06 100644
--- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
+++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp
@@ -10,8 +10,11 @@
 
 namespace armarx::skills::provider
 {
+    HelloWorldSkill::HelloWorldSkill() :
+        Skill(GetSkillDescription())
+    {}
 
-    SkillDescription CreateHelloWorldSkillDescription()
+    SkillDescription HelloWorldSkill::GetSkillDescription()
     {
         armarx::skills::Example::HelloWorldAcceptedType default_params;
         default_params.some_float = 5;
@@ -28,30 +31,32 @@ namespace armarx::skills::provider
         };
     }
 
-    HelloWorldSkill::HelloWorldSkill() :
-        Skill(CreateHelloWorldSkillDescription())
-    {}
-    TerminatedSkillStatusUpdate HelloWorldSkill::main(const MainInput& in)
+    Skill::MainResult HelloWorldSkill::main(const MainInput& in)
     {
         ARMARX_IMPORTANT << "Hi, from the Hello World Skill.\n" <<
                                 "I received the following data: \n" <<
                                 aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(in.params).dump(2) << "\n" <<
                                 "(executed at: " << IceUtil::Time::now() << ")";
-        return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Succeeded};
+        return {TerminatedSkillStatus::Succeeded, nullptr};
     }
 
     ChainingSkill::ChainingSkill() :
-        Skill(SkillDescription{
+        Skill(GetSkillDescription())
+    {}
+
+    SkillDescription ChainingSkill::GetSkillDescription()
+    {
+        return SkillDescription{
             "ChainingSkill",
             "This skill calls the HelloWorld skill three times.",
             {},
             3000,
             nullptr
-        })
-    {}
-    TerminatedSkillStatusUpdate ChainingSkill::main(const MainInput& in)
+        };
+    }
+
+    Skill::MainResult ChainingSkill::main(const MainInput& in)
     {
-        // TODO: Switch to SkillProxy
         armarx::skills::Example::HelloWorldAcceptedType exec1;
         armarx::skills::Example::HelloWorldAcceptedType exec2;
         armarx::skills::Example::HelloWorldAcceptedType exec3;
@@ -60,58 +65,54 @@ namespace armarx::skills::provider
         exec2.some_text = "Hello from the ChainingSkill 2";
         exec3.some_text = "Hello from the ChainingSkill 3";
 
-        manager::dto::SkillExecutionRequest exec;
-        exec.skillId = {"SkillProviderExample", "HelloWorld"};
-
-        exec.params = exec1.toAron()->toAronDictDTO();
-        manager->executeSkill(exec);
+        SkillProxy skillExecPrx(manager, {"SkillProviderExample", "HelloWorld"});
 
-        exec.params = exec2.toAron()->toAronDictDTO();
-        manager->executeSkill(exec);
+        skillExecPrx.executeFullSkill(getSkillId().toString(), exec1.toAron());
+        skillExecPrx.executeFullSkill(getSkillId().toString(), exec2.toAron());
+        skillExecPrx.executeFullSkill(getSkillId().toString(), exec3.toAron());
 
-        exec.params = exec3.toAron()->toAronDictDTO();
-        manager->executeSkill(exec);
-
-        return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Succeeded};
+        return {TerminatedSkillStatus::Succeeded, nullptr};
     }
 
     TimeoutSkill::TimeoutSkill() :
-        Skill(SkillDescription{
+        PeriodicSkill(GetSkillDescription(), armarx::core::time::Frequency::Hertz(5))
+    {}
+
+    SkillDescription TimeoutSkill::GetSkillDescription()
+    {
+        return SkillDescription{
             "Timeout",
             "This fails with timeout reached",
             {},
             1000,
             nullptr
-        })
-    {}
-    TerminatedSkillStatusUpdate TimeoutSkill::main(const MainInput& in)
+        };
+    }
+
+    PeriodicSkill::StepResult TimeoutSkill::step(const MainInput& in)
     {
-        int i = 0;
-        while (!timeoutReached)
-        {
-            // do heavy work
-            std::this_thread::sleep_for(std::chrono::milliseconds(200));
-
-            // check if work is done
-            if(i++ > 15)
-            {
-                ARMARX_IMPORTANT << "Somehow the timeout check succeceded....";
-                return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Succeeded};
-            }
-        }
-        return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Failed};
+        // do heavy work
+        std::this_thread::sleep_for(std::chrono::milliseconds(200));
+
+        return {ActiveOrTerminatedSkillStatus::Running, nullptr};
     }
 
     CallbackSkill::CallbackSkill() :
-        Skill(SkillDescription{
+        Skill(GetSkillDescription())
+    {}
+
+    SkillDescription CallbackSkill::GetSkillDescription()
+    {
+        return SkillDescription{
             "ShowMeCallbacks",
             "This skill does shows callbacks",
             {},
             1000,
             nullptr
-        })
-    {}
-    TerminatedSkillStatusUpdate CallbackSkill::main(const MainInput& in)
+        };
+    }
+
+    Skill::MainResult CallbackSkill::main(const MainInput& in)
     {
         ARMARX_IMPORTANT << "Logging three updates via the callback";
         auto up1 = std::make_shared<aron::data::Dict>();
@@ -126,7 +127,7 @@ namespace armarx::skills::provider
         up3->addElement("updateInfo", std::make_shared<aron::data::String>("Update 3"));
         in.callback(up3);
 
-        return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Succeeded};
+        return {TerminatedSkillStatus::Succeeded, nullptr};
     }
 
 
diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h
index 32be05cb6..cbd795396 100644
--- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h
+++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h
@@ -27,6 +27,7 @@
 #include <ArmarXCore/core/Component.h>
 
 // RobotAPI
+#include <RobotAPI/libraries/skills/provider/SkillProxy.h>
 #include <RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h>
 
 namespace armarx::skills::provider
@@ -36,22 +37,34 @@ namespace armarx::skills::provider
     {
     public:
         HelloWorldSkill();
-        TerminatedSkillStatusUpdate main(const MainInput& in) final;
+
+        static SkillDescription GetSkillDescription();
+
+    private:
+        Skill::MainResult main(const MainInput& in) final;
     };
 
     class ChainingSkill : public Skill
     {
     public:
         ChainingSkill();
-        TerminatedSkillStatusUpdate main(const MainInput& in) final;
+
+        static SkillDescription GetSkillDescription();
+
+    private:
+        Skill::MainResult main(const MainInput& in) final;
     };
 
 
-    class TimeoutSkill : public Skill
+    class TimeoutSkill : public PeriodicSkill
     {
     public:
         TimeoutSkill();
-        TerminatedSkillStatusUpdate main(const MainInput& in) final;
+
+        static SkillDescription GetSkillDescription();
+
+    private:
+        PeriodicSkill::StepResult step(const MainInput& in) final;
     };
 
 
@@ -59,7 +72,11 @@ namespace armarx::skills::provider
     {
     public:
         CallbackSkill();
-        TerminatedSkillStatusUpdate main(const MainInput& in) final;
+
+        static SkillDescription GetSkillDescription();
+
+    private:
+        Skill::MainResult main(const MainInput& in) final;
     };
 
     /**
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
index f8c1b9e99..f8333282e 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
@@ -47,7 +47,6 @@ namespace armarx::skills::segment
     {
         // override directly execution to add a request to the memory
         armem::Commit comm;
-        auto& entityUpdate = comm.add();
 
         skills::arondto::SkillExecutionRequest request;
         request.executorName = info.executorName;
@@ -57,14 +56,32 @@ namespace armarx::skills::segment
 
         auto aron = request.toAron();
 
-        armem::MemoryID skillExecutionMemID = id();
-        skillExecutionMemID.providerSegmentName = request.providerName;
-        skillExecutionMemID.entityName = request.skillName;
+        {
+            auto& entityUpdate = comm.add();
+
+            armem::MemoryID skillExecutionMemID = id();
+            skillExecutionMemID.providerSegmentName = request.providerName;
+            skillExecutionMemID.entityName = request.skillName;
+
+            entityUpdate.entityID = skillExecutionMemID;
+            entityUpdate.instancesData = { aron };
+            entityUpdate.confidence = 1.0;
+            entityUpdate.timeCreated = armem::Time::Now();
+        }
+
+        {
+            auto& entityUpdate = comm.add();
+
+            armem::MemoryID skillExecutionMemID = id();
+            skillExecutionMemID.providerSegmentName = "All Skill Execution Requests";
+            skillExecutionMemID.entityName = "All Skill Execution Requests";
+
+            entityUpdate.entityID = skillExecutionMemID;
+            entityUpdate.instancesData = { aron };
+            entityUpdate.confidence = 1.0;
+            entityUpdate.timeCreated = armem::Time::Now();
+        }
 
-        entityUpdate.entityID = skillExecutionMemID;
-        entityUpdate.instancesData = { aron };
-        entityUpdate.confidence = 1.0;
-        entityUpdate.timeCreated = armem::Time::Now();
 
         iceMemory.commit(comm);
     }
diff --git a/source/RobotAPI/libraries/skills/CMakeLists.txt b/source/RobotAPI/libraries/skills/CMakeLists.txt
index 0b2473cd6..30241deae 100644
--- a/source/RobotAPI/libraries/skills/CMakeLists.txt
+++ b/source/RobotAPI/libraries/skills/CMakeLists.txt
@@ -44,13 +44,14 @@ armarx_add_library(
         ./provider/SkillID.h
         ./provider/detail/SkillImplementationWrapper.h
 
-        provider/util/All.h
-        provider/util/ArvizSkillUtil.h
-        provider/util/MemoryReadingSkillUtil.h
-        provider/util/RobotReadingSkillUtil.h
-        provider/util/ObjectReadingSkillUtil.h
-        provider/util/ObjectWritingSkillUtil.h
-        provider/util/GraspReadingSkillUtil.h
+        provider/mixins/All.h
+        provider/mixins/ArvizSkillMixin.h
+        provider/mixins/MNSSkillMixin.h
+        provider/mixins/MemoryReadingSkillMixin.h
+        provider/mixins/RobotReadingSkillMixin.h
+        provider/mixins/ObjectReadingSkillMixin.h
+        provider/mixins/ObjectWritingSkillMixin.h
+        provider/mixins/GraspReadingSkillMixin.h
 )
 
 add_library(RobotAPI::skills ALIAS RobotAPISkills)
diff --git a/source/RobotAPI/libraries/skills/provider/LambdaSkill.cpp b/source/RobotAPI/libraries/skills/provider/LambdaSkill.cpp
index ed4e675b1..e922a69bb 100644
--- a/source/RobotAPI/libraries/skills/provider/LambdaSkill.cpp
+++ b/source/RobotAPI/libraries/skills/provider/LambdaSkill.cpp
@@ -5,24 +5,15 @@ namespace armarx
     namespace skills
     {
 
-        TerminatedSkillStatusUpdate LambdaSkill::main(const MainInput& in)
+        Skill::MainResult LambdaSkill::main(const MainInput& in)
         {
             bool res = fun(in.executorName, in.params);
 
-            TerminatedSkillStatusUpdate ret;
-            ret.executorName = in.executorName;
-            ret.skillId = getSkillId();
-            ret.usedParameterization = {in.params, nullptr}; // ToDo: How to set the callback interface?
             if (res)
             {
-                ret.status = TerminatedSkillStatus::Succeeded;
+                return {TerminatedSkillStatus::Succeeded, nullptr};
             }
-            else
-            {
-                ret.status = TerminatedSkillStatus::Failed;
-            }
-
-            return ret;
+            return {TerminatedSkillStatus::Failed, nullptr};
         }
     }
 }
diff --git a/source/RobotAPI/libraries/skills/provider/LambdaSkill.h b/source/RobotAPI/libraries/skills/provider/LambdaSkill.h
index cba43489f..e73206e45 100644
--- a/source/RobotAPI/libraries/skills/provider/LambdaSkill.h
+++ b/source/RobotAPI/libraries/skills/provider/LambdaSkill.h
@@ -18,7 +18,7 @@ namespace armarx
             {};
 
         private:
-            TerminatedSkillStatusUpdate main(const MainInput& in) override;
+            MainResult main(const MainInput& in) override;
 
         private:
             FunT fun;
diff --git a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp
index 1c3038f08..70daa959f 100644
--- a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp
+++ b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp
@@ -30,62 +30,62 @@
 
 namespace armarx::skills
 {
-    PeriodicSkill::PeriodicSkill(const SkillDescription& skillDescription,
-                                 const armarx::Frequency& frequency) :
+    PeriodicSkill::PeriodicSkill(const SkillDescription& skillDescription, const armarx::Frequency& frequency) :
         Skill(skillDescription), frequency(frequency)
     {
     }
 
-    ActiveOrTerminatedSkillStatusUpdate PeriodicSkill::stepOfSkill(const MainInput& in)
+    PeriodicSkill::StepResult PeriodicSkill::stepOfSkill(const MainInput& in)
     {
         return this->step(in);
     }
 
-    TerminatedSkillStatusUpdate PeriodicSkill::main(const MainInput& in)
+    Skill::MainResult PeriodicSkill::main(const MainInput& in)
     {
         core::time::Metronome metronome(frequency);
 
         while (not Skill::checkWhetherSkillShouldStopASAP())
         {
-            const auto statusUpdate = stepOfSkill(in);
-            switch (statusUpdate.status)
+            const auto res = stepOfSkill(in);
+            switch (res.status)
             {
                 case ActiveOrTerminatedSkillStatus::Running:
                     // nothing to do here
                     break;
                 case ActiveOrTerminatedSkillStatus::Aborted:
-                    return {{statusUpdate.skillId, statusUpdate.executorName, {statusUpdate.usedParameterization.usedInputParams, statusUpdate.usedParameterization.usedCallbackInterface}, statusUpdate.data}, TerminatedSkillStatus::Aborted};
+                    return {TerminatedSkillStatus::Aborted, res.data};
                 case ActiveOrTerminatedSkillStatus::Succeeded:
-                    return {{statusUpdate.skillId, statusUpdate.executorName, {statusUpdate.usedParameterization.usedInputParams, statusUpdate.usedParameterization.usedCallbackInterface}, statusUpdate.data}, TerminatedSkillStatus::Succeeded};
+                    return {TerminatedSkillStatus::Succeeded, res.data};
                 case ActiveOrTerminatedSkillStatus::Failed:
-                    return {{statusUpdate.skillId, statusUpdate.executorName, {statusUpdate.usedParameterization.usedInputParams, statusUpdate.usedParameterization.usedCallbackInterface}, statusUpdate.data}, TerminatedSkillStatus::Failed};
+                    return {TerminatedSkillStatus::Failed, res.data};
             }
 
             const auto sleepDuration = metronome.waitForNextTick();
             if (not sleepDuration.isPositive())
             {
-                ARMARX_INFO << deactivateSpam() << "PeriodicSkill: execution took too long (" << -sleepDuration << " vs " << frequency.toCycleDuration() << ")";
+                ARMARX_INFO << deactivateSpam() << "PeriodicSkill: execution took too long (" << -sleepDuration << " too long. Expected " << frequency.toCycleDuration() << ")";
             }
         }
 
         if (stopped)
         {
-            return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Aborted};
+            return {TerminatedSkillStatus::Aborted, nullptr};
         }
 
         if (timeoutReached)
         {
-            return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Failed};
+            ARMARX_WARNING << "The skill " << getSkillId().toString() << " reached timeout!";
+            return {TerminatedSkillStatus::Failed, nullptr};
         }
 
         throw skills::error::SkillException(__PRETTY_FUNCTION__, "Should not happen!");
     }
 
 
-    ActiveOrTerminatedSkillStatusUpdate PeriodicSkill::step(const MainInput& in)
+    PeriodicSkill::StepResult PeriodicSkill::step(const MainInput& in)
     {
         ARMARX_IMPORTANT << "Dummy executing once skill '" << description.skillName << "'. Please overwrite this method!";
-        return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, ActiveOrTerminatedSkillStatus::Succeeded};
+        return {ActiveOrTerminatedSkillStatus::Succeeded, nullptr};
     }
 
 } // namespace armarx::skills
diff --git a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.h b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.h
index 24eb7aa93..5df6e07e9 100644
--- a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.h
+++ b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.h
@@ -29,19 +29,25 @@
 namespace armarx::skills
 {
 
-    class PeriodicSkill : virtual public Skill
+    class PeriodicSkill : public Skill
     {
     public:
+        struct StepResult
+        {
+            ActiveOrTerminatedSkillStatus status;
+            aron::data::DictPtr data;
+        };
+
         PeriodicSkill(const SkillDescription& skillDescription, const armarx::Frequency& frequency);
 
-        ActiveOrTerminatedSkillStatusUpdate stepOfSkill(const MainInput& in);
+        StepResult stepOfSkill(const MainInput& in);
 
     private:
         /// Do not use anymore
-        TerminatedSkillStatusUpdate main(const MainInput& in) final;
+        Skill::MainResult main(const MainInput& in) final;
 
         /// Override this method with your own step function
-        virtual ActiveOrTerminatedSkillStatusUpdate step(const MainInput& in);
+        virtual StepResult step(const MainInput& in);
 
     private:
         const armarx::Frequency frequency;
diff --git a/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h
index 98b1572bc..06efba4d4 100644
--- a/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h
+++ b/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h
@@ -25,6 +25,7 @@
 #include <ArmarXCore/core/time/Metronome.h>
 
 #include "Skill.h"
+#include "PeriodicSkill.h"
 #include "SpecializedSkill.h"
 
 namespace armarx::skills
@@ -38,6 +39,8 @@ namespace armarx::skills
         using Skill::description;
         using Skill::getSkillId;
 
+        using StepResult = PeriodicSkill::StepResult;
+
         PeriodicSpecializedSkill() = delete;
         PeriodicSpecializedSkill(const SkillDescription& skillDescription, const armarx::Frequency& frequency) :
             Base(skillDescription), frequency(frequency)
@@ -45,7 +48,7 @@ namespace armarx::skills
         }
 
 
-        ActiveOrTerminatedSkillStatusUpdate stepOfSkill(const typename Base::SpecializedMainInput& in)
+        StepResult stepOfSkill(const typename Base::SpecializedMainInput& in)
         {
             return this->step(in);
         }
@@ -55,7 +58,7 @@ namespace armarx::skills
         using Skill::timeoutReached;
 
         /// Do not use anymore
-        TerminatedSkillStatusUpdate main(const typename Base::SpecializedMainInput& in) final
+        Skill::MainResult main(const typename Base::SpecializedMainInput& in) final
         {
             core::time::Metronome metronome(frequency);
 
@@ -68,38 +71,39 @@ namespace armarx::skills
                         // nothing to do here
                         break;
                     case ActiveOrTerminatedSkillStatus::Aborted:
-                        return {{statusUpdate.skillId, statusUpdate.executorName, {statusUpdate.usedParameterization.usedInputParams, statusUpdate.usedParameterization.usedCallbackInterface}, statusUpdate.data}, TerminatedSkillStatus::Aborted};
+                        return {TerminatedSkillStatus::Aborted, statusUpdate.data};
                     case ActiveOrTerminatedSkillStatus::Succeeded:
-                        return {{statusUpdate.skillId, statusUpdate.executorName, {statusUpdate.usedParameterization.usedInputParams, statusUpdate.usedParameterization.usedCallbackInterface}, statusUpdate.data}, TerminatedSkillStatus::Succeeded};
+                        return {TerminatedSkillStatus::Succeeded, statusUpdate.data};
                     case ActiveOrTerminatedSkillStatus::Failed:
-                        return {{statusUpdate.skillId, statusUpdate.executorName, {statusUpdate.usedParameterization.usedInputParams, statusUpdate.usedParameterization.usedCallbackInterface}, statusUpdate.data}, TerminatedSkillStatus::Failed};
+                        return {TerminatedSkillStatus::Failed, statusUpdate.data};
                 }
 
                 const auto sleepDuration = metronome.waitForNextTick();
                 if (not sleepDuration.isPositive())
                 {
-                    ARMARX_INFO << deactivateSpam() << "PeriodicSkill: execution took too long (" << -sleepDuration << " vs " << frequency.toCycleDuration() << ")";
+                    ARMARX_INFO << deactivateSpam() << "PeriodicSkill: execution took too long (" << -sleepDuration << " too long. Expected " << frequency.toCycleDuration() << ")";
                 }
             }
 
             if (stopped)
             {
-                return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Aborted};
+                return {TerminatedSkillStatus::Aborted, nullptr};
             }
 
             if (timeoutReached)
             {
-                return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Failed};
+                ARMARX_WARNING << "The skill " << getSkillId().toString() << " reached timeout!";
+                return {TerminatedSkillStatus::Failed, nullptr};
             }
 
             throw skills::error::SkillException(__PRETTY_FUNCTION__, "Should not happen!");
         }
 
         /// Override this method with your own step function
-        virtual ActiveOrTerminatedSkillStatusUpdate step(const typename Base::SpecializedMainInput& in)
+        virtual StepResult step(const typename Base::SpecializedMainInput& in)
         {
             ARMARX_IMPORTANT << "Dummy executing once skill '" << description.skillName << "'. Please overwrite this method!";
-            return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, ActiveOrTerminatedSkillStatus::Succeeded};
+            return {ActiveOrTerminatedSkillStatus::Succeeded, nullptr};
         }
 
     private:
diff --git a/source/RobotAPI/libraries/skills/provider/Skill.cpp b/source/RobotAPI/libraries/skills/provider/Skill.cpp
index e4bdd58df..3bac7956d 100644
--- a/source/RobotAPI/libraries/skills/provider/Skill.cpp
+++ b/source/RobotAPI/libraries/skills/provider/Skill.cpp
@@ -92,7 +92,7 @@ namespace armarx
         {
 
         }
-        TerminatedSkillStatusUpdate Skill::mainOfSkill(const MainInput& in)
+        Skill::MainResult Skill::mainOfSkill(const MainInput& in)
         {
             this->_main();
             return this->main(in);
@@ -165,19 +165,19 @@ namespace armarx
             // Default nothing to exit
         }
 
-        TerminatedSkillStatusUpdate Skill::main(const MainInput& in)
+        Skill::MainResult Skill::main(const MainInput& in)
         {
             // This is just a dummy implementation
             ARMARX_IMPORTANT << "Dummy executing skill '" << description.skillName << "'. Please overwrite this method.";
 
-            return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Succeeded};
+            return {TerminatedSkillStatus::Succeeded, nullptr};
         }
 
-        TerminatedSkillStatusUpdate Skill::executeFullSkill(const ExecuteInput& in)
+        Skill::MainResult Skill::executeFullSkill(const MainInput& in)
         {
             this->resetSkill();
             this->initSkill(InitInput{in.executorName, in.params});
-            auto ret = this->mainOfSkill(MainInput{in.executorName, in.params, in.callback});
+            auto ret = this->mainOfSkill(in);
             this->exitSkill(ExitInput{in.executorName, in.params});
             return ret;
         }
diff --git a/source/RobotAPI/libraries/skills/provider/Skill.h b/source/RobotAPI/libraries/skills/provider/Skill.h
index 32645d4ec..9629f6311 100644
--- a/source/RobotAPI/libraries/skills/provider/Skill.h
+++ b/source/RobotAPI/libraries/skills/provider/Skill.h
@@ -44,17 +44,16 @@ namespace armarx
                 CallbackT callback;
             };
 
-            struct ExitInput
+            struct MainResult
             {
-                std::string executorName;
-                aron::data::DictPtr params;
+                TerminatedSkillStatus status;
+                aron::data::DictPtr data;
             };
 
-            struct ExecuteInput
+            struct ExitInput
             {
                 std::string executorName;
                 aron::data::DictPtr params;
-                CallbackT callback;
             };
 
             Skill() = delete;
@@ -71,7 +70,7 @@ namespace armarx
             void resetSkill();
             void waitForDependenciesOfSkill();
             void initSkill(const InitInput& in);
-            TerminatedSkillStatusUpdate mainOfSkill(const MainInput& in);
+            MainResult mainOfSkill(const MainInput& in);
             void exitSkill(const ExitInput& in);
 
             // used to notify the skill from extern to stop
@@ -81,7 +80,7 @@ namespace armarx
             bool checkWhetherSkillShouldStopASAP() const;
 
             /// Do all methods at once.
-            TerminatedSkillStatusUpdate executeFullSkill(const ExecuteInput& in);
+            MainResult executeFullSkill(const MainInput& in);
 
         protected:
             // fires if the skill reaches timeout
@@ -103,7 +102,7 @@ namespace armarx
             virtual void init(const InitInput& in);
 
             /// Override this method with the actual implementation. The callback is for status updates to the calling instance
-            virtual TerminatedSkillStatusUpdate main(const MainInput& in);
+            virtual MainResult main(const MainInput& in);
 
             /// Override this method with the actual implementation.
             virtual void exit(const ExitInput& in);
@@ -115,8 +114,8 @@ namespace armarx
             /// Override this method if you have own conditions to abort the skill as soon as possible
             virtual bool notifySkillToStopASAPCustom() const;
 
-        private:
-            /// install a condition
+        protected:
+            /// install a condition which is frequently checked from the conditionCheckingThread
             void installCondition(std::function<bool()>&& f, std::function<void()>&& cb);
 
         public:
diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
index badf2e127..c018ecd9a 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
+++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h
@@ -13,7 +13,14 @@
 #include <RobotAPI/interface/skills/SkillManagerInterface.h>
 #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
 
+// Include all types of skills
+#include "Skill.h"
+#include "SpecializedSkill.h"
 #include "LambdaSkill.h"
+#include "PeriodicSkill.h"
+#include "PeriodicSpecializedSkill.h"
+
+// Helper wrapper for execution
 #include "detail/SkillImplementationWrapper.h"
 
 namespace armarx::plugins
diff --git a/source/RobotAPI/libraries/skills/provider/SkillProxy.cpp b/source/RobotAPI/libraries/skills/provider/SkillProxy.cpp
index c75cbeb47..e0ebdb3b6 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProxy.cpp
+++ b/source/RobotAPI/libraries/skills/provider/SkillProxy.cpp
@@ -10,6 +10,12 @@ namespace armarx
         {
         }
 
+        SkillProxy::SkillProxy(const manager::dti::SkillManagerInterfacePrx& manager, const std::string& skillProviderName, const std::string& skillName) :
+            manager(manager),
+            skillId(skillProviderName, skillName)
+        {
+        }
+
         SkillProxy::SkillProxy(const manager::dti::SkillManagerInterfacePrx& manager, const std::string& skillProviderName, const SkillDescription& skillDesc) :
             manager(manager),
             skillId(skillProviderName, skillDesc.skillName)
diff --git a/source/RobotAPI/libraries/skills/provider/SkillProxy.h b/source/RobotAPI/libraries/skills/provider/SkillProxy.h
index b4eaf0186..6e8ddc5c7 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProxy.h
+++ b/source/RobotAPI/libraries/skills/provider/SkillProxy.h
@@ -11,6 +11,7 @@ namespace armarx
         {
         public:
             SkillProxy(const manager::dti::SkillManagerInterfacePrx& manager, const SkillID& skillId);
+            SkillProxy(const manager::dti::SkillManagerInterfacePrx& manager, const std::string& skillProviderName, const std::string& skillName);
             SkillProxy(const manager::dti::SkillManagerInterfacePrx& manager, const std::string& skillProviderName, const SkillDescription& skillDesc);
 
             TerminatedSkillStatusUpdate executeFullSkill(const std::string& executorName, const aron::data::DictPtr& params = nullptr);
diff --git a/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h
index 735f5f8e4..80752a235 100644
--- a/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h
+++ b/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h
@@ -36,13 +36,6 @@ namespace armarx
                 AronT params;
             };
 
-            struct SpecializedExecuteInput
-            {
-                std::string executorName;
-                AronT params;
-                CallbackT callback;
-            };
-
             using Skill::Skill;
             virtual ~SpecializedSkill() = default;
 
@@ -57,7 +50,7 @@ namespace armarx
                 Skill::_init();
                 this->init(in);
             }
-            TerminatedSkillStatusUpdate mainOfSkill(const SpecializedMainInput& in)
+            Skill::MainResult mainOfSkill(const SpecializedMainInput& in)
             {
                 Skill::_main();
                 return this->main(in);
@@ -68,11 +61,11 @@ namespace armarx
                 this->exit(in);
             }
 
-            TerminatedSkillStatusUpdate executeFullSkill(const SpecializedExecuteInput& in)
+            Skill::MainResult executeFullSkill(const SpecializedMainInput& in)
             {
                 this->resetSkill();
                 this->initSkill(SpecializedInitInput({in.executorName, in.params}));
-                auto ret = this->mainOfSkill(SpecializedMainInput({in.executorName, in.params, in.callback}));
+                auto ret = this->mainOfSkill(in);
                 this->exit(SpecializedExitInput({in.executorName, in.params}));
                 return ret;
             }
@@ -84,10 +77,10 @@ namespace armarx
             }
 
             /// Override this method with the actual implementation. The callback is for status updates to the calling instance
-            virtual TerminatedSkillStatusUpdate main(const SpecializedMainInput& in)
+            virtual Skill::MainResult main(const SpecializedMainInput& in)
             {
                 ARMARX_IMPORTANT << "Dummy executing skill '" << description.skillName << "'. Please overwrite this method.";
-                return {{getSkillId(), in.executorName, {in.params, nullptr}, nullptr}, TerminatedSkillStatus::Succeeded};
+                return {TerminatedSkillStatus::Succeeded, nullptr};
             }
 
             /// Override this method with the actual implementation. The callback is for status updates to the calling instance
@@ -96,7 +89,7 @@ namespace armarx
             }
 
             /// Do not use anymore
-            TerminatedSkillStatusUpdate main(const MainInput& in) final
+            Skill::MainResult main(const MainInput& in) final
             {
                 AronT p;
                 p.fromAron(in.params);
diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
index 9afb52542..e5516749d 100644
--- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
+++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
@@ -24,15 +24,16 @@ namespace armarx
                 statusUpdate.data = nullptr;
                 statusUpdate.executorName = "";
             };
-            resetExecParam();
 
             // set params and setup variables
-            auto setParams = [&](){
+            auto setExecParams = [&](){
                 std::lock_guard l(skillStatusMutex);
                 statusUpdate.usedParameterization = parameterization;
                 statusUpdate.executorName = executorName;
             };
-            setParams();
+
+            resetExecParam();
+            setExecParams();
 
             auto& aron_params = parameterization.usedInputParams;
             auto updateStatus = [&](const SkillStatus status, const aron::data::DictPtr& data = nullptr){
@@ -50,13 +51,20 @@ namespace armarx
 
 
             // Check params
-            if (not(aron_params) && skill->description.acceptedType)
+            if (skill->description.acceptedType && not(aron_params))
             {
                 ARMARX_ERROR_S << "The Skill '" + skillName + "' requires a type but params are NULL.";
                 resetExecParam();
                 return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, nullptr}, TerminatedSkillStatus::Failed});
             }
 
+            if (skill->description.acceptedType && aron_params && not(aron_params->fullfillsType(skill->description.acceptedType)))
+            {
+                ARMARX_ERROR_S << "The Skill '" + skillName + "' has a type and got parameters but the input does not match the type.";
+                resetExecParam();
+                return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, nullptr}, TerminatedSkillStatus::Failed});
+            }
+
             // set scheduled
             updateStatus(SkillStatus::Scheduled);
 
@@ -67,7 +75,7 @@ namespace armarx
             }
             catch (const std::exception& ex)
             {
-                ARMARX_ERROR_S << "An errr occured during the reset of skill '" << skillName << "'. The error was: " << ex.what();
+                ARMARX_ERROR_S << "An error occured during the reset of skill '" << skillName << "'. The error was: " << ex.what();
 
                 updateStatus(SkillStatus::Failed);
                 resetExecParam();
@@ -80,7 +88,7 @@ namespace armarx
             }
             catch (const std::exception& ex)
             {
-                ARMARX_ERROR_S << "An errr occured during waiting for skill dependencies of skill '" << skillName << "'. The error was: " << ex.what();
+                ARMARX_ERROR_S << "An error occured during waiting for skill dependencies of skill '" << skillName << "'. The error was: " << ex.what();
 
                 updateStatus(SkillStatus::Failed);
                 resetExecParam();
@@ -96,7 +104,7 @@ namespace armarx
             }
             catch (const std::exception& ex)
             {
-                ARMARX_ERROR_S << "An errr occured during the initialization of skill '" << skillName << "'. Executing exit for safety. The error was: " << ex.what();
+                ARMARX_ERROR_S << "An error occured during the initialization of skill '" << skillName << "'. Executing exit for safety. The error was: " << ex.what();
                 skill->exitSkill({executorName, aron_params});
 
                 updateStatus(SkillStatus::Failed);
@@ -104,17 +112,18 @@ namespace armarx
                 return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, nullptr}, TerminatedSkillStatus::Failed});
             }
 
-            TerminatedSkillStatusUpdate ret;
+            Skill::MainResult ret;
             try
             {
-                ret = skill->mainOfSkill({executorName, aron_params, [&](const aron::data::DictPtr& update)
+                ret = skill->mainOfSkill({executorName, aron_params, [&updateStatus](const aron::data::DictPtr& update)
                 {
-                    updateStatus(statusUpdate.status, update);
+                    // during execution the statusUpdate.status is always RUNNING
+                    updateStatus(SkillStatus::Running, update);
                 }});
             }
             catch (const std::exception& ex)
             {
-                ARMARX_ERROR_S << "An errr occured during the main method of skill '" << skillName << "'. Executing exit for safety. The error was: " << ex.what();
+                ARMARX_ERROR_S << "An error occured during the main method of skill '" << skillName << "'. Executing exit for safety. The error was: " << ex.what();
                 skill->exitSkill({executorName, aron_params});
 
                 updateStatus(SkillStatus::Failed);
@@ -128,23 +137,20 @@ namespace armarx
             }
             catch (const std::exception& ex)
             {
-                ARMARX_ERROR_S << "An errr occured during the exit of skill '" << skillName << "'." << ex.what();
+                ARMARX_ERROR_S << "An error occured during the exit of skill '" << skillName << "'." << ex.what();
 
                 updateStatus(SkillStatus::Failed);
                 resetExecParam();
                 return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, nullptr}, TerminatedSkillStatus::Failed});
             }
 
+            // Also log return value and update status using callback
             switch (ret.status)
             {
                 case TerminatedSkillStatus::Failed:
                     ARMARX_INFO_S << ("The Skill '" + skillName + "' failed during execution.");
                     updateStatus(SkillStatus::Failed);
                     break;
-                //case TerminatedSkillStatus::TimeoutReached:
-                //    ARMARX_INFO_S << ("The Skill '" + skillName + "' reached timeout during execution.");
-                //    updateStatus(SkillStatus::Failed);
-                //    break;
                 case TerminatedSkillStatus::Aborted:
                 {
                     ARMARX_INFO_S << ("The Skill '" + skillName + "' got stopped.");
@@ -159,7 +165,7 @@ namespace armarx
             }
 
             resetExecParam();
-            return ret;
+            return {{skill->getSkillId(), executorName, parameterization, ret.data}, ret.status};
         }
     }
 }
diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
index e002dbb6e..982bcc366 100644
--- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
+++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.h
@@ -32,7 +32,8 @@ namespace armarx
                 // ctor
                 SkillImplementationWrapper(std::unique_ptr<skills::Skill>&& skill);
 
-                // execute a skill. The parameterization is copied
+                // execute a skill. The parameterization is copied. T
+                // the return type additionally contains the input configuration (similar to the status updates used in callbacks)
                 TerminatedSkillStatusUpdate setupAndExecuteSkill(const std::string& executorName, const skills::SkillParameterization);
             };
         }
diff --git a/source/RobotAPI/libraries/skills/provider/mixins/All.h b/source/RobotAPI/libraries/skills/provider/mixins/All.h
new file mode 100644
index 000000000..7f74ab14f
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/mixins/All.h
@@ -0,0 +1,7 @@
+#include "ArvizSkillMixin.h"
+#include "MNSSkillMixin.h"
+#include "GraspReadingSkillMixin.h"
+#include "MemoryReadingSkillMixin.h"
+#include "ObjectReadingSkillMixin.h"
+#include "ObjectWritingSkillMixin.h"
+#include "RobotReadingSkillMixin.h"
diff --git a/source/RobotAPI/libraries/skills/provider/mixins/ArvizSkillMixin.h b/source/RobotAPI/libraries/skills/provider/mixins/ArvizSkillMixin.h
new file mode 100644
index 000000000..7b77cb543
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/mixins/ArvizSkillMixin.h
@@ -0,0 +1,26 @@
+#pragma once
+
+
+// Others
+#include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
+
+namespace armarx::skills::mixin
+{
+    struct ArvizSkillMixin
+    {
+        armarx::viz::Client arviz;
+        std::string layerName;
+
+        ArvizSkillMixin(const armarx::viz::Client& a, const std::string& ln) :
+            arviz(a),
+            layerName(ln)
+        {
+        }
+
+        void clearLayer()
+        {
+            auto l = arviz.layer(layerName);
+            arviz.commit(l);
+        }
+    };
+}
diff --git a/source/RobotAPI/libraries/skills/provider/mixins/GraspReadingSkillMixin.h b/source/RobotAPI/libraries/skills/provider/mixins/GraspReadingSkillMixin.h
new file mode 100644
index 000000000..d69f390da
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/mixins/GraspReadingSkillMixin.h
@@ -0,0 +1,25 @@
+#pragma once
+
+
+// Others
+#include <RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h>
+
+namespace armarx::skills::mixin
+{
+    struct GraspReadingSkillMixin
+    {
+        armem::grasping::known_grasps::Reader graspReader;
+
+        GraspReadingSkillMixin(armem::client::MemoryNameSystem& mns) : graspReader(mns)
+        {}
+    };
+
+    struct SpecificGraspReadingSkillMixin
+    {
+        std::string objectEntityId;
+        armem::grasping::known_grasps::Reader graspReader;
+
+        SpecificGraspReadingSkillMixin(const std::string& n, armem::client::MemoryNameSystem& mns) : objectEntityId(n), graspReader(mns)
+        {}
+    };
+}
diff --git a/source/RobotAPI/libraries/skills/provider/mixins/MNSSkillMixin.h b/source/RobotAPI/libraries/skills/provider/mixins/MNSSkillMixin.h
new file mode 100644
index 000000000..f0bde8bdf
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/mixins/MNSSkillMixin.h
@@ -0,0 +1,16 @@
+#pragma once
+
+
+// Others
+#include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
+
+namespace armarx::skills::mixin
+{
+    struct MNSSkillMixin
+    {
+        armem::client::MemoryNameSystem mns;
+
+        MNSSkillMixin(const armem::client::MemoryNameSystem& m) : mns(m)
+        {}
+    };
+}
diff --git a/source/RobotAPI/libraries/skills/provider/mixins/MemoryReadingSkillMixin.h b/source/RobotAPI/libraries/skills/provider/mixins/MemoryReadingSkillMixin.h
new file mode 100644
index 000000000..214fbac44
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/mixins/MemoryReadingSkillMixin.h
@@ -0,0 +1,16 @@
+#pragma once
+
+
+// Others
+#include <RobotAPI/libraries/armem/client/Reader.h>
+
+namespace armarx::skills::mixin
+{
+    struct MemoryReadingSkillMixin
+    {
+        armem::client::Reader memoryReader;
+
+        //MemoryReadingSkillMixin(armem::client::MemoryNameSystem& mns) : memoryReader(mns)
+        //{}
+    };
+}
diff --git a/source/RobotAPI/libraries/skills/provider/mixins/ObjectReadingSkillMixin.h b/source/RobotAPI/libraries/skills/provider/mixins/ObjectReadingSkillMixin.h
new file mode 100644
index 000000000..de5ef34b1
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/mixins/ObjectReadingSkillMixin.h
@@ -0,0 +1,25 @@
+#pragma once
+
+
+// Others
+#include <RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h>
+
+namespace armarx::skills::mixin
+{
+    struct ObjectReadingSkillMixin
+    {
+        armem::obj::instance::Reader objectReader;
+
+        ObjectReadingSkillMixin(armem::client::MemoryNameSystem& mns, const objpose::ObjectPoseProviderPrx& o) : objectReader(mns, o)
+        {}
+    };
+
+    struct SpecificObjectReadingSkillMixin
+    {
+        std::string objectEntityId;
+        armem::obj::instance::Reader objectReader;
+
+        SpecificObjectReadingSkillMixin(const std::string& n, armem::client::MemoryNameSystem& mns, const objpose::ObjectPoseProviderPrx& o) : objectEntityId(n), objectReader(mns, o)
+        {}
+    };
+}
diff --git a/source/RobotAPI/libraries/skills/provider/mixins/ObjectWritingSkillMixin.h b/source/RobotAPI/libraries/skills/provider/mixins/ObjectWritingSkillMixin.h
new file mode 100644
index 000000000..edf8e6a2e
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/mixins/ObjectWritingSkillMixin.h
@@ -0,0 +1,16 @@
+#pragma once
+
+
+// Others
+#include <RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.h>
+
+namespace armarx::skills::mixin
+{
+    struct ObjectWritingSkillMixin
+    {
+        armem::obj::instance::Writer objectWriter;
+
+        ObjectWritingSkillMixin(armem::client::MemoryNameSystem& mns) : objectWriter(mns)
+        {}
+    };
+}
diff --git a/source/RobotAPI/libraries/skills/provider/mixins/RobotReadingSkillMixin.h b/source/RobotAPI/libraries/skills/provider/mixins/RobotReadingSkillMixin.h
new file mode 100644
index 000000000..631491ddc
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/mixins/RobotReadingSkillMixin.h
@@ -0,0 +1,28 @@
+#pragma once
+
+
+// Others
+#include <RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h>
+
+namespace armarx::skills::mixin
+{
+    struct RobotReadingSkillMixin
+    {
+        armem::robot_state::VirtualRobotReader robotReader;
+
+        RobotReadingSkillMixin(armem::client::MemoryNameSystem& mns) :
+            robotReader(mns)
+        {}
+    };
+
+    struct SpecificRobotReadingSkillMixin
+    {
+        std::string robotName;
+        armem::robot_state::VirtualRobotReader robotReader;
+
+        SpecificRobotReadingSkillMixin(const std::string& rn, armem::client::MemoryNameSystem& mns) :
+            robotName(rn),
+            robotReader(mns)
+        {}
+    };
+}
diff --git a/source/RobotAPI/libraries/skills/provider/util/All.h b/source/RobotAPI/libraries/skills/provider/util/All.h
deleted file mode 100644
index bd64c524c..000000000
--- a/source/RobotAPI/libraries/skills/provider/util/All.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "ArvizSkillUtil.h"
-#include "GraspReadingSkillUtil.h"
-#include "MemoryReadingSkillUtil.h"
-#include "ObjectReadingSkillUtil.h"
-#include "ObjectWritingSkillUtil.h"
-#include "RobotReadingSkillUtil.h"
diff --git a/source/RobotAPI/libraries/skills/provider/util/ArvizSkillUtil.h b/source/RobotAPI/libraries/skills/provider/util/ArvizSkillUtil.h
deleted file mode 100644
index 10a21b73d..000000000
--- a/source/RobotAPI/libraries/skills/provider/util/ArvizSkillUtil.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-
-// Others
-#include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
-
-namespace armarx::skills::util
-{
-    struct ArvizSkillUtil
-    {
-        armarx::viz::Client& arviz;
-        std::string layerName;
-
-        void clearLayer() const
-        {
-            auto l = arviz.layer(layerName);
-            arviz.commit(l);
-        }
-    };
-}
diff --git a/source/RobotAPI/libraries/skills/provider/util/GraspReadingSkillUtil.h b/source/RobotAPI/libraries/skills/provider/util/GraspReadingSkillUtil.h
deleted file mode 100644
index b48b2c98f..000000000
--- a/source/RobotAPI/libraries/skills/provider/util/GraspReadingSkillUtil.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-
-// Others
-#include <RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h>
-
-namespace armarx::skills::util
-{
-    struct GraspReadingSkillUtil
-    {
-        armem::grasping::known_grasps::Reader& graspReader;
-    };
-
-    struct SpecificGraspReadingSkillUtil
-    {
-        std::string objectEntityId;
-
-        armem::grasping::known_grasps::Reader& graspReader;
-    };
-}
diff --git a/source/RobotAPI/libraries/skills/provider/util/MemoryReadingSkillUtil.h b/source/RobotAPI/libraries/skills/provider/util/MemoryReadingSkillUtil.h
deleted file mode 100644
index 0282ae15b..000000000
--- a/source/RobotAPI/libraries/skills/provider/util/MemoryReadingSkillUtil.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#pragma once
-
-
-// Others
-#include <RobotAPI/libraries/armem/client/Reader.h>
-
-namespace armarx::skills::util
-{
-    struct MemoryReadingSkillUtil
-    {
-        armem::client::Reader& memoryReader;
-    };
-}
diff --git a/source/RobotAPI/libraries/skills/provider/util/ObjectReadingSkillUtil.h b/source/RobotAPI/libraries/skills/provider/util/ObjectReadingSkillUtil.h
deleted file mode 100644
index 5c421a931..000000000
--- a/source/RobotAPI/libraries/skills/provider/util/ObjectReadingSkillUtil.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-
-// Others
-#include <RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h>
-
-namespace armarx::skills::util
-{
-    struct ObjectReadingSkillUtil
-    {
-        armem::obj::instance::Reader& objectReader;
-    };
-
-    struct SpecificObjectReadingSkillUtil
-    {
-        std::string objectEntityId;
-
-        armem::obj::instance::Reader& objectReader;
-    };
-}
diff --git a/source/RobotAPI/libraries/skills/provider/util/ObjectWritingSkillUtil.h b/source/RobotAPI/libraries/skills/provider/util/ObjectWritingSkillUtil.h
deleted file mode 100644
index 25297bb3d..000000000
--- a/source/RobotAPI/libraries/skills/provider/util/ObjectWritingSkillUtil.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#pragma once
-
-
-// Others
-#include <RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.h>
-
-namespace armarx::skills::util
-{
-    struct ObjectWritingSkillUtil
-    {
-        armem::obj::instance::Writer& objectWriter;
-    };
-}
diff --git a/source/RobotAPI/libraries/skills/provider/util/RobotReadingSkillUtil.h b/source/RobotAPI/libraries/skills/provider/util/RobotReadingSkillUtil.h
deleted file mode 100644
index c5777100d..000000000
--- a/source/RobotAPI/libraries/skills/provider/util/RobotReadingSkillUtil.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#pragma once
-
-
-// Others
-#include <RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h>
-
-namespace armarx::skills::util
-{
-    struct RobotReadingSkillUtil
-    {
-        armem::robot_state::VirtualRobotReader& robotReader;
-    };
-
-    struct SpecificRobotReadingSkillUtil
-    {
-        std::string robotName;
-        armem::robot_state::VirtualRobotReader& robotReader;
-    };
-}
-- 
GitLab