diff --git a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp
index f5d4b5f47f2174b165604d55ad862826ad2a7497..57056f83a9901b5423e7ef5e6a946d94b5b7c4a7 100644
--- a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp
+++ b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp
@@ -28,22 +28,36 @@ namespace armarx::skills::example
 
     std::string SkillProviderExample::getDefaultName() const
     {
-        return "SkillProviderExample";
+        // If you want to use the memory, it must contain the core segment name
+        // common means that all robots can execute this skill
+        // the later packages (armar6, armar3) may add other skill providers with robot specific skills
+        return "CommonSkill/SkillProviderExample";
     }
 
     void SkillProviderExample::onInitComponent()
-    {}
-
-    void SkillProviderExample::onConnectComponent()
     {
         // Add example skill
         {
             skills::SkillDescription helloWorldDesc;
             helloWorldDesc.acceptedType = nullptr;
             helloWorldDesc.documentation = "This skill logs a message on ARMARX_IMPORTANT";
-            helloWorldDesc.name = "common/HelloWorld";
+            helloWorldDesc.name = "HelloWorld";
             addSkill(HelloWorldSkill(), helloWorldDesc);
         }
+
+        // Add another example skill
+        {
+            skills::SkillDescription fooDesc;
+            fooDesc.acceptedType = nullptr;
+            fooDesc.documentation = "This skill does nothing.";
+            fooDesc.name = "Foo";
+            addSkill([](const aron::data::DictPtr&){ return true; }, fooDesc);
+        }
+    }
+
+    void SkillProviderExample::onConnectComponent()
+    {
+
     }
 
     void SkillProviderExample::onDisconnectComponent()
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
index f5dc4c7a97aaccf9a2d9da50a67b8c4698de2570..f5396f815a31f12e54836cfe0b1cb1a0b51749ce 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
@@ -38,7 +38,7 @@
 #include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem_skills/aron_conversions.h>
-
+#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 
 namespace armarx
 {
@@ -49,7 +49,8 @@ namespace armarx
         StatechartListenerComponentPluginUser(),
         SkillObserverComponentPluginUser(),
         statechartListenerProviderSegment(iceAdapter()),
-        executableSkillsCoreSegment(iceAdapter())
+        executableSkillCoreSegment(iceAdapter()),
+        skillExecutionRequestCoreSegment(iceAdapter())
     {
     }
 
@@ -60,7 +61,6 @@ namespace armarx
 
         const std::string prefix = "mem.";
         statechartListenerProviderSegment.defineProperties(defs, prefix + "statechartlistener.");
-        executableSkillsCoreSegment.defineProperties(defs, prefix + "skill.");
 
         setMemoryName("Skill");
         return defs;
@@ -76,7 +76,6 @@ namespace armarx
     void SkillsMemory::onInitComponent()
     {
         statechartListenerProviderSegment.init();
-        executableSkillsCoreSegment.init();
     }
 
 
@@ -114,38 +113,23 @@ namespace armarx
         return result;
     }
 
-    void SkillsMemory::addProvider(const std::string& name, const skills::SkillProviderInterfacePrx& provider, const Ice::Current &current)
+    void SkillsMemory::addProvider(const std::string& skillProviderName, const skills::SkillProviderInterfacePrx& provider, const Ice::Current &current)
     {
-        const auto [skillName, providerName] = skills::segment::ExecutableSkillLibraryCoreSegment::GetSkillProviderNames(name);
+        SkillObserverComponentPluginUser::addProvider(skillProviderName, provider, current);
 
-        SkillObserverComponentPluginUser::addProvider(name, provider, current);
-        executableSkillsCoreSegment.addSkillProvider(providerName, skillName, provider);
+        executableSkillCoreSegment.addSkillProvider(skillProviderName, provider);
     }
 
-    void SkillsMemory::removeProvider(const std::string& name, const Ice::Current &current)
+    void SkillsMemory::removeProvider(const std::string& skillProviderName, const Ice::Current &current)
     {
-        std::vector<std::string> names = simox::alg::split(name, "/");
-        ARMARX_CHECK_EXPRESSION(name.size() > 1);
-
-        SkillObserverComponentPluginUser::removeProvider(name, current);
-
-        const std::string providerName = names[0];
-        names.erase(names.begin());
-        const std::string skillName = simox::alg::join(names, "");
+        executableSkillCoreSegment.removeSkillProvider(skillProviderName);
 
-        executableSkillsCoreSegment.removeSkillProvider(providerName, skillName);
+        SkillObserverComponentPluginUser::removeProvider(skillProviderName, current);
     }
 
-    void SkillsMemory::executeSkill(const std::string& name, const skills::SkillParametrization& params, const Ice::Current &current)
+    void SkillsMemory::executeSkill(const std::string& skillProviderName, const skills::SkillParametrization& params, const Ice::Current &current)
     {
-        std::vector<std::string> names = simox::alg::split(name, "/");
-        ARMARX_CHECK_EXPRESSION(name.size() > 1);
-
-        const std::string providerName = names[0];
-        names.erase(names.begin());
-        const std::string skillName = simox::alg::join(names, "");
-
-        executableSkillsCoreSegment.directlyExecuteSkill(providerName, skillName);
+        executableSkillCoreSegment.directlyExecuteSkill(skillProviderName, params);
     }
 
     void SkillsMemory::reportStatechartTransitionWithParameters(const ProfilerStatechartTransitionWithParameters& x, const Ice::Current&)
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
index 059619eff043f2a9bfce6f45e6b384295cc814cb..cc1f95b9b19bf3a4d2ffc2ea877c47849bb634cf 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
@@ -40,7 +40,7 @@
 #include <RobotAPI/libraries/armem_skills/aron/Statechart.aron.generated.h>
 #include <RobotAPI/libraries/armem_skills/server/segment/StatechartListenerSegment.h>
 #include <RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h>
-
+#include <RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h>
 
 namespace armarx
 {
@@ -114,8 +114,8 @@ namespace armarx
         Properties p;
 
         skills::segment::StatechartListenerProviderSegment statechartListenerProviderSegment;
-        skills::segment::ExecutableSkillLibraryCoreSegment executableSkillsCoreSegment;
-
+        skills::segment::ExecutableSkillLibraryCoreSegment executableSkillCoreSegment;
+        skills::segment::SkillExecutionRequestCoreSegment skillExecutionRequestCoreSegment;
 
         struct RemoteGuiTab : RemoteGui::Client::Tab
         {
diff --git a/source/RobotAPI/interface/skills/SkillProviderInterface.ice b/source/RobotAPI/interface/skills/SkillProviderInterface.ice
index a01ea8f9e75a64b86504ecfa0f46f7df4a1d61ff..8e710ed8259c8be71bd1f7236f1566c707b728c4 100644
--- a/source/RobotAPI/interface/skills/SkillProviderInterface.ice
+++ b/source/RobotAPI/interface/skills/SkillProviderInterface.ice
@@ -24,16 +24,17 @@
 
 #include <RobotAPI/interface/aron.ice>
 
-//Forward declaration
 module armarx
 {
     module skills
     {
         sequence<string> StringList;
 
+        // Description of a skill. Needs to be sent to a skill observer or memory
         struct SkillDescription
         {
             string                        name;
+            string                        robot;
             string                        documentation;
             aron::type::dto::AronObject   acceptedType;
         };
@@ -56,7 +57,8 @@ module armarx
         struct SkillStatus
         {
             Execution::Status       status;
-            aron::data::dto::Dict   params;
+            aron::data::dto::Dict   usedParams;
+            aron::data::dto::Dict   returnValue;
             string                  message;
             string                  error;
         };
diff --git a/source/RobotAPI/libraries/armem/server/segment/SpecializedCoreSegment.cpp b/source/RobotAPI/libraries/armem/server/segment/SpecializedCoreSegment.cpp
index 32f0f8f5683241d789d6688e11d16dd65818fdcb..b0afa282677c45325993feee0fcba60245236611 100644
--- a/source/RobotAPI/libraries/armem/server/segment/SpecializedCoreSegment.cpp
+++ b/source/RobotAPI/libraries/armem/server/segment/SpecializedCoreSegment.cpp
@@ -51,16 +51,16 @@ namespace armarx::armem::server::segment
 
         if (iceMemory.workingMemory->hasCoreSegment(properties.segmentName))
         {
-            ARMARX_WARNING << "Core segment with name '" << properties.segmentName << "' already exists.";
             segmentPtr = &iceMemory.workingMemory->getCoreSegment(properties.segmentName);
         }
         else
         {
             ARMARX_INFO << "Adding core segment '" << properties.segmentName << "'";
             segmentPtr = &iceMemory.workingMemory->addCoreSegment(properties.segmentName);
+
+            segmentPtr->aronType() = aronType;
+            segmentPtr->setMaxHistorySize(properties.maxHistorySize);
         }
-        segmentPtr->aronType() = aronType;
-        segmentPtr->setMaxHistorySize(properties.maxHistorySize);
     }
 
     void SpecializedCoreSegment::setDefaultCoreSegmentName(const std::string& coreSegmentName)
diff --git a/source/RobotAPI/libraries/armem/server/segment/SpecializedProviderSegment.cpp b/source/RobotAPI/libraries/armem/server/segment/SpecializedProviderSegment.cpp
index 6bbdc36de8abe3ef2537fb90abcb5b16b431b3a5..747b2bec833e5f1b13366e2954b5af4f12f64b4b 100644
--- a/source/RobotAPI/libraries/armem/server/segment/SpecializedProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/server/segment/SpecializedProviderSegment.cpp
@@ -56,16 +56,16 @@ namespace armarx::armem::server::segment
 
         if (coreSegment.segmentPtr->hasProviderSegment(properties.segmentName))
         {
-            ARMARX_WARNING << "Provider segment with name '" << properties.segmentName << "' already exists.";
             segmentPtr = &coreSegment.segmentPtr->getProviderSegment(properties.segmentName);
         }
         else
         {
             ARMARX_INFO << "Adding provider segment '" << properties.segmentName << "'";
             segmentPtr = &coreSegment.segmentPtr->addProviderSegment(properties.segmentName);
+
+            segmentPtr->aronType() = aronType;
+            segmentPtr->setMaxHistorySize(properties.maxHistorySize);
         }
-        segmentPtr->aronType() = aronType;
-        segmentPtr->setMaxHistorySize(properties.maxHistorySize);
     }
 
     void SpecializedProviderSegment::setDefaultProviderSegmentName(const std::string& providerSegmentName)
diff --git a/source/RobotAPI/libraries/armem/server/segment/detail/SpecializedSegment.h b/source/RobotAPI/libraries/armem/server/segment/detail/SpecializedSegment.h
index f1ca29d3e066461b890ee9f321c97282d4ada7ef..f739c0dd3dd7a6b1a2196013f1500e2c4bbd52b5 100644
--- a/source/RobotAPI/libraries/armem/server/segment/detail/SpecializedSegment.h
+++ b/source/RobotAPI/libraries/armem/server/segment/detail/SpecializedSegment.h
@@ -37,7 +37,6 @@ namespace armarx::armem::server::segment
             virtual void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") = 0;
             virtual void init() = 0;
 
-
         public:
 
             SegmentType* segmentPtr;
diff --git a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt
index 5f3e01c944d704418d64a4eb1ee607f026ebaeab..bec7daa0d7d986ceb7f77ac7587347d6b9f27d0f 100644
--- a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt
@@ -11,6 +11,7 @@ armarx_add_library(
 
         RobotAPI::Core
         RobotAPI::armem_server
+        aronjsonconverter
     SOURCES  
         ./aron_conversions.cpp
 
@@ -18,6 +19,7 @@ armarx_add_library(
         ./server/SkillObserverComponentPlugin.cpp
         ./server/segment/StatechartListenerSegment.cpp
         ./server/segment/ExecutableSkillLibrarySegment.cpp
+        ./server/segment/SkillExecutionRequestSegment.cpp
 
         ./client/SkillProviderComponentPlugin.cpp
     HEADERS  
@@ -27,6 +29,7 @@ armarx_add_library(
         ./server/SkillObserverComponentPlugin.h
         ./server/segment/StatechartListenerSegment.h
         ./server/segment/ExecutableSkillLibrarySegment.h
+        ./server/segment/SkillExecutionRequestSegment.h
 
         ./client/SkillProviderComponentPlugin.h
 )
@@ -36,6 +39,7 @@ armarx_enable_aron_file_generation_for_target(
         "${LIB_NAME}"
     ARON_FILES
         aron/Statechart.xml
+        aron/Skill.xml
 )
 
 
diff --git a/source/RobotAPI/libraries/armem_skills/aron/Skill.xml b/source/RobotAPI/libraries/armem_skills/aron/Skill.xml
new file mode 100644
index 0000000000000000000000000000000000000000..398a5b6821f99ed7dc086dbd3564861937b8a07f
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_skills/aron/Skill.xml
@@ -0,0 +1,37 @@
+<!--
+A data description of an executable skill in aron.
+The memory should look like the following:
+    - Skills
+        - ExecutableSKill               // CoreSeg
+            - MySkillProvider           // ProvSeg
+                - MyFancySkill          // Entity
+            - StatechartSkillProvider
+                - ...
+-->
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <GenerateTypes>
+        <Object name='armarx::skills::arondto::SkillDescription'>
+            <ObjectChild key='name'>
+                <String />
+            </ObjectChild>
+
+            <ObjectChild key='robot'>
+                <String />
+            </ObjectChild>
+
+            <ObjectChild key='documentation'>
+                <String />
+            </ObjectChild>
+
+            <ObjectChild key='ice_info'>
+                <String />
+            </ObjectChild>
+
+            <ObjectChild key='accepted_type_json'>
+                <String />
+            </ObjectChild>
+
+        </Object>
+    </GenerateTypes>
+</AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp
index 9e10c893134d2f149fc2b53fd7ffea64df9f923d..ca01298108e1640b969b45f24d9a2f84302debfb 100644
--- a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp
@@ -48,6 +48,7 @@ namespace armarx
             return;
         }
 
+        ARMARX_DEBUG << "Adding skill " << skillName << " to list";
         SkillImplementationWrapper skill(fun, desc);
         skillImplementations.insert({skillName, skill});
     }
@@ -90,7 +91,7 @@ namespace armarx
         auto& impl = skillImplementations.at(skillName);
 
         impl.task->join();
-        impl.status.params = params.params;
+        impl.status.usedParams = params.params;
         impl.task->start();
     }
 
@@ -137,7 +138,7 @@ namespace armarx
                 std::lock_guard l(skillStatusMutex);
                 status.status = skills::Execution::Running;
             }
-            auto params = std::make_shared<aron::data::Dict>(status.params);
+            auto params = std::make_shared<aron::data::Dict>(status.usedParams);
             auto result = skill.execute(params);
             {
                 std::lock_guard l(skillStatusMutex);
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
index a2103b02b6914a834c0aa6d90e564dc86af8aa8f..10914c7da2cd777b72229f405b72b47c8e2d8233 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp
@@ -3,49 +3,67 @@
 #include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 #include <SimoxUtility/algorithm/string.h>
 
+#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
+
+#include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h>
+
+
 namespace armarx::skills::segment
 {
-    std::pair<std::string, std::string> ExecutableSkillLibraryCoreSegment::GetSkillProviderNames(const std::string& name)
-    {
-        std::vector<std::string> names = simox::alg::split(name, "/");
-        ARMARX_CHECK_EXPRESSION(name.size() > 1);
+    std::string ExecutableSkillCoreSegmentName = "ExecutableSkill";
 
-        const std::string providerName = names[0];
-        names.erase(names.begin());
-        const std::string skillName = simox::alg::join(names, "");
-        return {providerName, skillName};
-    }
-
-    ExecutableSkillLibraryProviderSegment::ExecutableSkillLibraryProviderSegment(const std::string& name, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory):
-        Base(iceMemory, name, "ExecutableSkill"),
+    ExecutableSkillLibraryProviderSegment::ExecutableSkillLibraryProviderSegment(const std::string& provName, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory):
+        Base(iceMemory, provName, ExecutableSkillCoreSegmentName, skills::arondto::SkillDescription::toAronType()),
         skillProvider(prx)
     {
-        ARMARX_IMPORTANT << "CREATED A SKILL";
-        // add skills
-        auto skills = skillProvider->getSkills();
-        for (const auto& [key, desc] : skills)
-        {
-            (void) key;
-            (void) desc;
-        }
     }
 
     void ExecutableSkillLibraryProviderSegment::defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix)
     {
+        // No properties! (meaning no name and no max size)
     }
 
     void ExecutableSkillLibraryProviderSegment::init()
     {
         Base::init();
+
+        // add skills
+        auto skills = skillProvider->getSkills();
+
+        ARMARX_INFO << "During init the providerSegment '" << getProviderSegment().id().providerSegmentName << "' has " << skills.size() << " skills.";
+        for (const auto& [key, desc] : skills)
+        {
+            skills::arondto::SkillDescription skillDescription;
+            skillDescription.name = desc.name;
+            skillDescription.documentation = desc.documentation;
+            skillDescription.ice_info = "TODO";
+            skillDescription.robot = desc.robot;
+            if (desc.acceptedType)
+            {
+                aron::type::VariantPtr t = aron::type::Variant::FromAronDTO(*desc.acceptedType);
+                skillDescription.accepted_type_json = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(t).dump(2);
+            }
+
+            armem::Commit commit;
+            auto& entityUpdate = commit.add();
+            entityUpdate.confidence = 1.0;
+            entityUpdate.timeCreated = armem::Time::now();
+            entityUpdate.instancesData = {skillDescription.toAron()};
+            entityUpdate.entityID = getProviderSegment().id().withEntityName(key);
+
+            // Commit data to memory and notify
+            iceMemory.commit(commit);
+        }
     }
 
     ExecutableSkillLibraryCoreSegment::ExecutableSkillLibraryCoreSegment(armem::server::MemoryToIceAdapter& iceMemory):
-        Base(iceMemory, "ExecutableSkill")
+        Base(iceMemory, ExecutableSkillCoreSegmentName, skills::arondto::SkillDescription::toAronType())
     {
     }
 
     void ExecutableSkillLibraryCoreSegment::defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix)
     {
+        // No properties! (meaning no name and no max size)
     }
 
     void ExecutableSkillLibraryCoreSegment::init()
@@ -53,19 +71,31 @@ namespace armarx::skills::segment
         Base::init();
     }
 
-    void ExecutableSkillLibraryCoreSegment::addSkillProvider(const std::string& providerSegmentName, const std::string& skillName, const SkillProviderInterfacePrx& provider)
+    void ExecutableSkillLibraryCoreSegment::addSkillProvider(const std::string& providerSegmentName, const SkillProviderInterfacePrx& provider)
+    {
+        auto it = providerSegments.emplace(providerSegmentName, ExecutableSkillLibraryProviderSegment{providerSegmentName, provider, iceMemory});
+        if (it.second)
+        {
+            it.first->second.init();
+        }
+        else
+        {
+            ARMARX_WARNING << "Could not insert a skillProvider '"<<providerSegmentName<<"' to the segment '" << getCoreSegment().id().str() << "'. This may leave the skillObserver and the memory unsynchronized.";
+        }
+    }
+
+    void ExecutableSkillLibraryCoreSegment::removeSkillProvider(const std::string& providerName)
     {
-        ARMARX_IMPORTANT << "ADDING A SKILL SEGMENT";
-        providerSegments.emplace(providerSegmentName, ExecutableSkillLibraryProviderSegment{skillName, provider, iceMemory});
+        providerSegments.erase(providerName);
     }
 
-    void ExecutableSkillLibraryCoreSegment::removeSkillProvider(const std::string& providerName, const std::string& skillName)
+    void ExecutableSkillLibraryCoreSegment::directlyExecuteSkill(const std::string& providerName, const skills::SkillParametrization& params)
     {
 
     }
 
-    void ExecutableSkillLibraryCoreSegment::directlyExecuteSkill(const std::string& providerName, const std::string& skillName)
+    size_t ExecutableSkillLibraryCoreSegment::size() const
     {
-
+        return providerSegments.size();
     }
 }
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h
index b5285da0667ca1826abb05f0ad458e1e1fdcf610..7e4a5dcb1b45a3042c16fd2acabfc5a1781d8bd1 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h
@@ -18,7 +18,7 @@ namespace armarx::skills::segment
         using Base = armem::server::segment::SpecializedProviderSegment;
 
     public:
-        ExecutableSkillLibraryProviderSegment(const std::string& name, const SkillProviderInterfacePrx&, armem::server::MemoryToIceAdapter& iceMemory);
+        ExecutableSkillLibraryProviderSegment(const std::string& provName, const SkillProviderInterfacePrx&, armem::server::MemoryToIceAdapter& iceMemory);
 
         void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix);
         void init();
@@ -38,11 +38,11 @@ namespace armarx::skills::segment
         void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix);
         void init();
 
-        void addSkillProvider(const std::string& providerSegmentName, const std::string& skillName, const SkillProviderInterfacePrx& provider);
-        void removeSkillProvider(const std::string& providerName, const std::string& skillName);
-        void directlyExecuteSkill(const std::string& providerName, const std::string& skillName);
+        void addSkillProvider(const std::string& providerName, const SkillProviderInterfacePrx& provider);
+        void removeSkillProvider(const std::string& providerName);
+        void directlyExecuteSkill(const std::string& providerName, const skills::SkillParametrization& params);
 
-        static std::pair<std::string, std::string> GetSkillProviderNames(const std::string& n);
+        size_t size() const;
 
     private:
         std::map<std::string, ExecutableSkillLibraryProviderSegment> providerSegments;
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillSegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillSegment.cpp
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillSegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillSegment.h
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f4b65623003f78ef124a23db021efce101974de7
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp
@@ -0,0 +1,44 @@
+#include "SkillExecutionRequestSegment.h"
+
+#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
+#include <SimoxUtility/algorithm/string.h>
+
+#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
+
+#include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h>
+
+
+namespace armarx::skills::segment
+{
+    std::string StringExecutionRequestCoreSegmentName = "SkillExecutionRequest";
+
+    SkillExecutionRequestProviderSegment::SkillExecutionRequestProviderSegment(const std::string& provName, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory):
+        Base(iceMemory, provName, StringExecutionRequestCoreSegmentName)
+    {
+    }
+
+    void SkillExecutionRequestProviderSegment::defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix)
+    {
+        // No properties! (meaning no name and no max size)
+    }
+
+    void SkillExecutionRequestProviderSegment::init()
+    {
+        Base::init();
+    }
+
+    SkillExecutionRequestCoreSegment::SkillExecutionRequestCoreSegment(armem::server::MemoryToIceAdapter& iceMemory):
+        Base(iceMemory, StringExecutionRequestCoreSegmentName)
+    {
+    }
+
+    void SkillExecutionRequestCoreSegment::defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix)
+    {
+        // No properties! (meaning no name and no max size)
+    }
+
+    void SkillExecutionRequestCoreSegment::init()
+    {
+        Base::init();
+    }
+}
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h
new file mode 100644
index 0000000000000000000000000000000000000000..9f9b38486e9bc1049065763b9d89f89ec17083e2
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h
@@ -0,0 +1,41 @@
+#pragma once
+
+// Base Class
+#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
+
+// ArmarX
+#include <ArmarXCore/interface/core/Profiler.h>
+#include <ArmarXCore/observers/ObserverObjectFactories.h>
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
+#include <RobotAPI/interface/skills/SkillProviderInterface.h>
+
+namespace armarx::skills::segment
+{
+    class SkillExecutionRequestProviderSegment :
+            public armem::server::segment::SpecializedProviderSegment
+    {
+        using Base = armem::server::segment::SpecializedProviderSegment;
+
+    public:
+        SkillExecutionRequestProviderSegment(const std::string& provName, const SkillProviderInterfacePrx&, armem::server::MemoryToIceAdapter& iceMemory);
+
+        void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix);
+        void init();
+    };
+
+    class SkillExecutionRequestCoreSegment :
+        public armem::server::segment::SpecializedCoreSegment
+    {
+        using Base = armem::server::segment::SpecializedCoreSegment;
+
+    public:
+        SkillExecutionRequestCoreSegment(armem::server::MemoryToIceAdapter& iceMemory);
+
+        void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix);
+        void init();
+
+    private:
+        std::map<std::string, SkillExecutionRequestProviderSegment> providerSegments;
+    };
+}