diff --git a/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.cpp b/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.cpp
index 88e72c19d6d60350a6d8ac7c7fc2fb14df193518..d60649b2fe5e301264c5f5cc7fcba1ab58be9b6d 100644
--- a/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.cpp
+++ b/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.cpp
@@ -17,8 +17,17 @@
 
 namespace armarx::skills
 {
-    FluxioCompositeExecutor::FluxioCompositeExecutor(std::string& id, skills::FluxioSkill* skill) :
-        FluxioExecutor(id, false), skill(skill)
+    FluxioCompositeExecutor::FluxioCompositeExecutor(
+        std::string& id,
+        skills::FluxioSkill* skill,
+        const std::function<void(const std::string& executionId)>&& abortFluxioSkillFunc,
+        const std::function<FluxioExecutor*(const std::string& skillId,
+                                            const std::string& executorName)>&&
+            executeFluxioSkillFunc) :
+        FluxioExecutor(id, false),
+        skill(skill),
+        abortFluxioSkill(abortFluxioSkillFunc),
+        executeFluxioSkill(executeFluxioSkillFunc)
     {
     }
 
@@ -220,7 +229,7 @@ namespace armarx::skills
         }
 
         // start skill execution
-        auto* executorPtr = plugin->executeFluxioSkill(subSkillNode->skillPtr->id, executorName);
+        auto* executorPtr = executeFluxioSkill(subSkillNode->skillPtr->id, executorName);
         if (executorPtr == nullptr)
         {
             ARMARX_WARNING << "Failed to execute subskill " << subSkillNode->skillPtr->id;
@@ -390,7 +399,7 @@ namespace armarx::skills
 
                 // there is no execution for the merger yet, let´s start one
                 subExecutionsMap[controlNode->nodeId] =
-                    new FluxioMergerExecutor(IceUtil::generateUUID(), plugin, paramIds);
+                    new FluxioMergerExecutor(IceUtil::generateUUID(), paramIds);
 
                 mergerExecutorPtr =
                     dynamic_cast<FluxioMergerExecutor*>(subExecutionsMap[controlNode->nodeId]);
diff --git a/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h b/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h
index 2064a79d53c87d8ead2cdb2abbb1c80892359512..5fc27bb61cfd921c895d5c99fb4a11bee044c753 100644
--- a/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h
+++ b/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h
@@ -19,7 +19,13 @@ namespace armarx::skills
     class FluxioCompositeExecutor : public FluxioExecutor
     {
     public:
-        FluxioCompositeExecutor(std::string& id, skills::FluxioSkill* skill);
+        FluxioCompositeExecutor(
+            std::string& id,
+            skills::FluxioSkill* skill,
+            const std::function<void(const std::string& executionId)>&& abortFluxioSkillFunc,
+            const std::function<FluxioExecutor*(const std::string& skillId,
+                                                const std::string& executorName)>&&
+                executeFluxioSkillFunc);
         void run(const std::string executorName, armarx::aron::data::DictPtr parameters) override;
         void abort() override;
         std::optional<std::vector<skills::FluxioSkillStatusUpdate>> getStatusUpdate() override;
@@ -48,5 +54,9 @@ namespace armarx::skills
         void setStatus(skills::SkillStatus status) override;
         void pollSubStatuses();
         std::map<std::string, FluxioExecutor*> subExecutionsMap; // key is node id
+        const std::function<void(const std::string& executionId)> abortFluxioSkill;
+        const std::function<FluxioExecutor*(const std::string& skillId,
+                                            const std::string& executorName)>
+            executeFluxioSkill;
     };
 } // namespace armarx::skills
diff --git a/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.cpp b/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.cpp
index a88e2df115a1ab49d7f13750d17f1d5e92f680e0..e3b2f03fbd531c571b4b5d36349b49b250b1ec15 100644
--- a/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.cpp
+++ b/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.cpp
@@ -10,10 +10,21 @@
 
 namespace armarx::skills
 {
-    FluxioNativeExecutor::FluxioNativeExecutor(std::string& id,
-                                               skills::SkillID& skillId,
-                                               std::string& fluxioUUID) :
-        FluxioExecutor(id, true), skillId(skillId), fluxioUUID(fluxioUUID)
+    FluxioNativeExecutor::FluxioNativeExecutor(
+        std::string& id,
+        skills::SkillID& skillId,
+        std::string& fluxioUUID,
+        const std::function<bool(const skills::SkillExecutionID&)>&& abortSkillFunc,
+        const std::function<skills::SkillExecutionID(const skills::SkillExecutionRequest&)>&&
+            executeSkillAsyncFunc,
+        const std::function<std::optional<skills::SkillStatusUpdate>(
+            const skills::SkillExecutionID&)>&& getSkillExecutionStatusFunc) :
+        FluxioExecutor(id, true),
+        skillId(skillId),
+        fluxioUUID(fluxioUUID),
+        abortSkill(abortSkillFunc),
+        executeSkillAsync(executeSkillAsyncFunc),
+        getSkillExecutionStatus(getSkillExecutionStatusFunc)
     {
     }
 
@@ -26,7 +37,7 @@ namespace armarx::skills
         req.parameters = parameters;
         req.executorName = executorName;
 
-        auto eid = this->plugin->executeSkillAsync(req);
+        auto eid = executeSkillAsync(req);
 
         this->executionId = eid;
     }
@@ -34,7 +45,7 @@ namespace armarx::skills
     void
     FluxioNativeExecutor::abort()
     {
-        if (!this->executionId.has_value() || this->plugin == nullptr)
+        if (!this->executionId.has_value())
         {
             // error
             ARMARX_WARNING << "Execution ID or plugin is not set";
@@ -42,13 +53,13 @@ namespace armarx::skills
         }
 
         // TODO: check last execution status
-        this->plugin->abortSkill(this->executionId.value());
+        abortSkill(this->executionId.value());
     }
 
     std::optional<std::vector<skills::FluxioSkillStatusUpdate>>
     FluxioNativeExecutor::getStatusUpdate()
     {
-        if (!this->executionId.has_value() || this->plugin == nullptr)
+        if (!this->executionId.has_value())
         {
             // error
             ARMARX_WARNING << "Execution ID or plugin is not set";
@@ -57,7 +68,7 @@ namespace armarx::skills
 
         auto executionId = this->executionId.value();
 
-        auto status = this->plugin->getSkillExecutionStatus(executionId);
+        auto status = getSkillExecutionStatus(executionId);
 
         if (!status.has_value())
         {
diff --git a/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.h b/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.h
index fc312fb4b7924af1aea785f573757f737c72e398..3b8288cac2887a7fdb446a7152f4e32912dc4b3f 100644
--- a/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.h
+++ b/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.h
@@ -3,6 +3,10 @@
 #include <optional>
 #include <string>
 
+#include "RobotAPI/libraries/skills/core/SkillExecutionRequest.h"
+#include "RobotAPI/libraries/skills/core/SkillID.h"
+#include "RobotAPI/libraries/skills/core/SkillStatusUpdate.h"
+
 #include "../FluxioSkillStatusUpdate.h"
 #include "../SkillExecutionID.h"
 #include "FluxioExecutor.h"
@@ -12,7 +16,15 @@ namespace armarx::skills
     class FluxioNativeExecutor : public FluxioExecutor
     {
     public:
-        FluxioNativeExecutor(std::string& id, skills::SkillID& skillId, std::string& fluxioUUID);
+        FluxioNativeExecutor(
+            std::string& id,
+            skills::SkillID& skillId,
+            std::string& fluxioUUID,
+            const std::function<bool(const skills::SkillExecutionID&)>&& abortSkillFunc,
+            const std::function<skills::SkillExecutionID(const skills::SkillExecutionRequest&)>&&
+                executeSkillAsyncFunc,
+            const std::function<std::optional<skills::SkillStatusUpdate>(
+                const skills::SkillExecutionID&)>&& getSkillExecutionStatusFunc);
 
         void run(const std::string executorName, armarx::aron::data::DictPtr parameters) override;
         void abort() override;
@@ -23,7 +35,11 @@ namespace armarx::skills
         skills::SkillID skillId;
         std::string fluxioUUID;
         void setStatus(skills::SkillStatus status) override;
-
-        //std::function<void(skills::SkillID&)> foo;
+        const std::function<bool(const skills::SkillExecutionID&)> abortSkill;
+        const std::function<skills::SkillExecutionID(const skills::SkillExecutionRequest&)>
+            executeSkillAsync;
+        const std::function<std::optional<skills::SkillStatusUpdate>(
+            const skills::SkillExecutionID&)>
+            getSkillExecutionStatus;
     };
 } // namespace armarx::skills
diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
index 28abe0c8fd385a3da916e2ea1c7a0e2b6d8f337a..985558d8ed38b4e3c681a1605b1ab2a2383e07da 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
@@ -619,7 +619,7 @@ namespace armarx::plugins
     //****************************//
 
     skills::FluxioExecutor*
-    SkillManagerComponentPlugin::executeFluxioSkill(std::string skillId,
+    SkillManagerComponentPlugin::executeFluxioSkill(const std::string& skillId,
                                                     const std::string& executorName)
     {
         const auto& skill = getSkill(skillId);
@@ -636,8 +636,18 @@ namespace armarx::plugins
             // currently empty parameters
             armarx::aron::data::DictPtr emptyParameters = {};
 
+            const auto& executeFluxioSkillFunc =
+                [this](const std::string& skillId, const std::string& executorName)
+            { return this->executeFluxioSkill(skillId, executorName); };
+
+            const auto& abortFluxioSkill = [this](const std::string& executionId)
+            { this->abortFluxioSkill(executionId); };
+
             fluxioDC.fluxioExecutors[executionId] =
-                new skills::FluxioCompositeExecutor(executionId, &fluxioDC.skills[skillId]);
+                new skills::FluxioCompositeExecutor(executionId,
+                                                    &fluxioDC.skills[skillId],
+                                                    std::move(abortFluxioSkill),
+                                                    std::move(executeFluxioSkillFunc));
 
             std::thread(
                 [this, executionId, executorName, emptyParameters]()
@@ -658,10 +668,26 @@ namespace armarx::plugins
                 return nullptr;
             }
 
+            const auto& abortSkillFunc = [this](const skills::SkillExecutionID& executionId)
+            { return this->abortSkill(executionId); };
+
+            const auto& executeSkillAsyncFunc = [this](const skills::SkillExecutionRequest& req)
+            { return this->executeSkillAsync(req); };
+
+            const auto& getSkillExecutionStatusFunc =
+                [this](const skills::SkillExecutionID& executionId)
+            { return this->getSkillExecutionStatus(executionId); };
+
+
             // FIXME: do not use new, instead use smart pointer
             std::string fluxioSkillUUID = skill->id;
             fluxioDC.fluxioExecutors[executionId] =
-                new skills::FluxioNativeExecutor(executionId, sID, fluxioSkillUUID);
+                new skills::FluxioNativeExecutor(executionId,
+                                                 sID,
+                                                 fluxioSkillUUID,
+                                                 std::move(abortSkillFunc),
+                                                 std::move(executeSkillAsyncFunc),
+                                                 std::move(getSkillExecutionStatusFunc));
             fluxioDC.fluxioExecutors[executionId]->run(executorName,
                                                        skillDescr->rootProfileDefaults);
         }
diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h
index 6f8a782065779e8e4b36d5ba0091c846f6c44b9d..d99c2860106fd8cfc50d986c4e1d8d0834174a8e 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h
@@ -75,7 +75,7 @@ namespace armarx::plugins
         //** Fluxio related methods **//
         //****************************//
 
-        skills::FluxioExecutor* executeFluxioSkill(std::string skillId,
+        skills::FluxioExecutor* executeFluxioSkill(const std::string& skillId,
                                                    const std::string& executorName);
 
         void abortFluxioSkill(const std::string& executionId);