diff --git a/source/RobotAPI/libraries/skills/core/ProviderID.cpp b/source/RobotAPI/libraries/skills/core/ProviderID.cpp
index 83330c897d05a6e47def33f19f1b8bddefcd7b90..990898f38fe98a76d6edc4e1ff846ba98af1bf75 100644
--- a/source/RobotAPI/libraries/skills/core/ProviderID.cpp
+++ b/source/RobotAPI/libraries/skills/core/ProviderID.cpp
@@ -19,7 +19,7 @@ namespace armarx
         bool
         ProviderID::operator==(const ProviderID& other) const
         {
-            return providerName == other.providerName;
+            return toString() == other.toString();
         }
 
         bool
@@ -34,6 +34,12 @@ namespace armarx
             return toString() < other.toString();
         }
 
+        bool
+        ProviderID::operator<=(const ProviderID& other) const
+        {
+            return toString() <= other.toString();
+        }
+
         ProviderID
         ProviderID::FromIce(const manager::dto::ProviderID& s)
         {
@@ -59,9 +65,9 @@ namespace armarx
         }
 
         std::string
-        ProviderID::toString(const std::string& prefix) const
+        ProviderID::toString() const
         {
-            return (prefix.empty() ? std::string("") : (prefix + PREFIX_SEPARATOR)) + providerName;
+            return providerName;
         }
     } // namespace skills
 
diff --git a/source/RobotAPI/libraries/skills/core/ProviderID.h b/source/RobotAPI/libraries/skills/core/ProviderID.h
index 3597c291fb53acd156f6ecdab43325febda22777..10079220ba939f0e3ebfb6ac81cbf86741626b7c 100644
--- a/source/RobotAPI/libraries/skills/core/ProviderID.h
+++ b/source/RobotAPI/libraries/skills/core/ProviderID.h
@@ -15,10 +15,6 @@ namespace armarx
         class ProviderID
         {
         public:
-            static const constexpr char* PREFIX_SEPARATOR = "->";
-
-            std::string providerName;
-
             ProviderID() = default;
             ProviderID(const skills::SkillID& skillid);
             ProviderID(const std::string& pName);
@@ -26,6 +22,7 @@ namespace armarx
             bool operator==(const ProviderID& other) const;
             bool operator!=(const ProviderID& other) const;
             bool operator<(const ProviderID& other) const;
+            bool operator<=(const ProviderID& other) const;
 
             manager::dto::ProviderID toManagerIce() const;
             callback::dto::ProviderID toCallbackIce() const;
@@ -33,7 +30,9 @@ namespace armarx
             static ProviderID FromIce(const manager::dto::ProviderID&);
             static ProviderID FromIce(const callback::dto::ProviderID&);
 
-            std::string toString(const std::string& prefix = "") const;
+            std::string toString() const;
+
+            std::string providerName;
         };
 
         std::ostream& operator<<(std::ostream& os, const ProviderID& id);
diff --git a/source/RobotAPI/libraries/skills/core/Skill.cpp b/source/RobotAPI/libraries/skills/core/Skill.cpp
index 754aac8ed4cb7061e6fd1565c3dfacb6fd30920c..7d8d9b9c8c59c4476e7f5b2872cd5967972a65cb 100644
--- a/source/RobotAPI/libraries/skills/core/Skill.cpp
+++ b/source/RobotAPI/libraries/skills/core/Skill.cpp
@@ -160,14 +160,24 @@ namespace armarx
         }
 
         void
-        Skill::checkWhetherSkillShouldTerminate(const std::string& abortedMessage)
+        Skill::throwIfSkillShouldTerminate(const std::function<void()>& do_before,
+                                           const std::string& abortedMessage)
+        {
+            if (shouldSkillTerminate())
+            {
+                do_before();
+                throwIfSkillShouldTerminate(abortedMessage);
+            }
+        }
+
+        void
+        Skill::throwIfSkillShouldTerminate(const std::string& abortedMessage)
         {
             if (stopped)
             {
-                std::string message = abortedMessage.empty()
-                                          ? std::string("The skill '" + getSkillId().toString() +
-                                                        "' was asked to stop.")
-                                          : abortedMessage;
+                std::string message =
+                    std::string("The skill '" + getSkillId().toString() + "' was asked to stop.");
+                message += abortedMessage.empty() ? "" : " Additional message: " + abortedMessage;
 
                 throw error::SkillAbortedException(message);
                 return;
@@ -175,10 +185,9 @@ namespace armarx
 
             if (timeoutReached)
             {
-                std::string message = abortedMessage.empty()
-                                          ? std::string("The skill '" + getSkillId().toString() +
-                                                        "' reached timeout.")
-                                          : abortedMessage;
+                std::string message =
+                    std::string("The skill '" + getSkillId().toString() + "' reached timeout.");
+                message += abortedMessage.empty() ? "" : " Additional message: " + abortedMessage;
 
                 ARMARX_WARNING << message;
                 throw error::SkillFailedException(message);
diff --git a/source/RobotAPI/libraries/skills/core/Skill.h b/source/RobotAPI/libraries/skills/core/Skill.h
index 249b38d6ea0522a822197ec1733172af932c1a6a..ff3cf1e823a9bdcf2e8b4db8b68232a1b4a34cbe 100644
--- a/source/RobotAPI/libraries/skills/core/Skill.h
+++ b/source/RobotAPI/libraries/skills/core/Skill.h
@@ -123,7 +123,9 @@ namespace armarx
             }
 
         protected:
-            void checkWhetherSkillShouldTerminate(const std::string& abortedMessage = "");
+            void throwIfSkillShouldTerminate(const std::string& abortedMessage = "");
+            void throwIfSkillShouldTerminate(const std::function<void()>& do_before,
+                                             const std::string& abortedMessage = "");
 
             static MainResult MakeSucceededResult(aron::data::DictPtr data = nullptr);
             static MainResult MakeFailedResult();
diff --git a/source/RobotAPI/libraries/skills/core/SkillID.cpp b/source/RobotAPI/libraries/skills/core/SkillID.cpp
index 3213183d0a9e267979574df0d50ebb99a2a89a97..fea0eca316bf58380ae9f8428aeac6d07151cc37 100644
--- a/source/RobotAPI/libraries/skills/core/SkillID.cpp
+++ b/source/RobotAPI/libraries/skills/core/SkillID.cpp
@@ -25,7 +25,7 @@ namespace armarx
         bool
         SkillID::operator==(const SkillID& other) const
         {
-            return providerId == other.providerId && skillName == other.skillName;
+            return this->toString() == other.toString();
         }
 
         bool
@@ -40,6 +40,12 @@ namespace armarx
             return toString() < other.toString();
         }
 
+        bool
+        SkillID::operator<=(const SkillID& other) const
+        {
+            return toString() <= other.toString();
+        }
+
         SkillID
         SkillID::FromIce(const manager::dto::SkillID& s)
         {
diff --git a/source/RobotAPI/libraries/skills/core/SkillID.h b/source/RobotAPI/libraries/skills/core/SkillID.h
index 1ae18aec628c12f68274cdb4e1c683ea75f8e4e2..5d0da2a673c1a10df52ae5789836d233ab643c37 100644
--- a/source/RobotAPI/libraries/skills/core/SkillID.h
+++ b/source/RobotAPI/libraries/skills/core/SkillID.h
@@ -26,6 +26,7 @@ namespace armarx
             bool operator==(const SkillID& other) const;
             bool operator!=(const SkillID& other) const;
             bool operator<(const SkillID& other) const;
+            bool operator<=(const SkillID& other) const;
 
             bool
             isFullySpecified() const