diff --git a/source/RobotAPI/libraries/skills/core/CMakeLists.txt b/source/RobotAPI/libraries/skills/core/CMakeLists.txt
index 29145e60e305fa10decf06200685dcb99ec6a3d5..f757e4b5d8d069673c67d39e8b559250202d6c03 100644
--- a/source/RobotAPI/libraries/skills/core/CMakeLists.txt
+++ b/source/RobotAPI/libraries/skills/core/CMakeLists.txt
@@ -4,6 +4,8 @@ armarx_component_set_name("${LIB_NAME}")
 armarx_set_target("Library: ${LIB_NAME}")
 
 armarx_add_library(
+    ARON_FILES
+        aron/SkillErrorResult.xml
     LIBS     
         ArmarXCoreInterfaces
         ArmarXCore
diff --git a/source/RobotAPI/libraries/skills/core/aron/SkillErrorResult.xml b/source/RobotAPI/libraries/skills/core/aron/SkillErrorResult.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f222af7c14a350cfcb90c5081d938af5355ad2f4
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/core/aron/SkillErrorResult.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+
+  <GenerateTypes>
+
+    <Object name='armarx::skills::arondto::SkillErrorResult'>
+        <ObjectChild key='errorCode'>
+          <string />
+        </ObjectChild>
+
+        <ObjectChild key='data'>
+          <AnyObject shared_ptr="true" />
+        </ObjectChild>
+
+        <ObjectChild key='errorMessage'>
+          <string />
+        </ObjectChild>
+
+    </Object>
+
+  </GenerateTypes>
+
+</AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
index ae4c5dd5cc39aac9ba52557f62527a50451c4c93..e9ca4358858f81395714792d44e4878c2acef008 100644
--- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
+++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
@@ -1,5 +1,10 @@
 #include "SkillImplementationWrapper.h"
+#include <ArmarXCore/core/exceptions/LocalException.h>
+#include "RobotAPI/libraries/aron/core/data/variant/container/Dict.h"
+#include "RobotAPI/libraries/aron/core/data/variant/primitive/Long.h"
+#include "RobotAPI/libraries/aron/core/data/variant/primitive/String.h"
 
+#include <RobotAPI/libraries/skills/core/aron/SkillErrorResult.aron.generated.h>
 namespace armarx
 {
     namespace skills::detail
@@ -75,6 +80,7 @@ namespace armarx
             {
                 std::unique_lock l(skillStatusesMutex);
                 statusUpdate.status = status;
+
                 statusUpdate.result = data;
                 if (skill) // if skill has been constructed
                 {
@@ -89,14 +95,6 @@ namespace armarx
                 }
             };
 
-            auto createErrorMessageData = [](const std::string& message)
-            {
-                auto obj = aron::make_dict();
-                auto m = aron::make_string(message, aron::Path({"errormessage"}));
-                obj->addElement("errormessage", m);
-                return obj;
-            };
-
             {
                 std::unique_lock l(skillStatusesMutex);
 
@@ -130,9 +128,14 @@ namespace armarx
             // set initial parameters that were attached to the execution request (only add as we are not sure whether some updates already arrived)
             this->updateSkillParameters(initial_aron_params);
 
-            auto makeAbortedResult = [&](const aron::data::DictPtr& data)
+            auto makeAbortedResult = [&](const std::string& errorCode, const aron::data::DictPtr& data, const std::string& message)
             {
-                updateStatus(SkillStatus::Aborted, data);
+                armarx::skills::arondto::SkillErrorResult errorResult;
+                errorResult.errorCode = errorCode;
+                errorResult.data = data;
+                errorResult.errorMessage = message;
+
+                updateStatus(SkillStatus::Aborted, errorResult.toAron());
 
                 std::unique_lock l(skillStatusesMutex);
                 auto terminated = TerminatedSkillStatusUpdate{
@@ -145,9 +148,14 @@ namespace armarx
             };
 
 
-            auto makeFailedResult = [&](const aron::data::DictPtr& data)
+            auto makeFailedResult = [&](const std::string& errorCode, const aron::data::DictPtr& data, const std::string& message)
             {
-                updateStatus(SkillStatus::Failed, data);
+                armarx::skills::arondto::SkillErrorResult errorResult;
+                errorResult.errorCode = errorCode;
+                errorResult.data = data;
+                errorResult.errorMessage = message;
+
+                updateStatus(SkillStatus::Failed, errorResult.toAron());
 
                 std::unique_lock l(skillStatusesMutex);
                 auto terminated = TerminatedSkillStatusUpdate{
@@ -174,15 +182,15 @@ namespace armarx
             //            }
 
 
-            auto exitAndMakeFailedResult = [&](const aron::data::DictPtr& data)
+            auto exitAndMakeFailedResult = [&](const std::string& errorCode, const aron::data::DictPtr& data, const std::string& message)
             {
                 skill->exitSkill(); // try to exit skill. Ignore return value
-                return makeFailedResult(data);
+                return makeFailedResult(errorCode, data, message);
             };
-            auto exitAndMakeAbortedResult = [&](const aron::data::DictPtr& data)
+            auto exitAndMakeAbortedResult = [&](const std::string& errorCode, const aron::data::DictPtr& data, const std::string& message)
             {
                 skill->exitSkill(); // try to exit skill. Ignore return value
-                return makeAbortedResult(data);
+                return makeAbortedResult(errorCode, data, message);
             };
 
             // Construction succeeded!
@@ -199,16 +207,16 @@ namespace armarx
                 {
                     std::string message = "SkillError 101: The initialization of skill '" +
                                           skillName + "' did not succeed.";
-                    return exitAndMakeFailedResult(createErrorMessageData(message));
+                    return exitAndMakeFailedResult("101", nullptr, message);
                 }
             }
             catch (const error::SkillAbortedException& ex)
             {
-                return exitAndMakeAbortedResult(createErrorMessageData(GetHandledExceptionString()));
+                return exitAndMakeAbortedResult("101x", nullptr, GetHandledExceptionString());
             }
             catch (const error::SkillFailedException& ex)
             {
-                return exitAndMakeFailedResult(createErrorMessageData(GetHandledExceptionString()));
+                return exitAndMakeFailedResult("101x", nullptr, GetHandledExceptionString());
             }
             catch (const std::exception& ex)
             {
@@ -216,7 +224,7 @@ namespace armarx
                     "SkillError 101e: An error occured during the initialization of skill '" +
                     skillName + "'. The error was: " + GetHandledExceptionString();
                 ARMARX_ERROR_S << message;
-                return exitAndMakeFailedResult(createErrorMessageData(message));
+                return exitAndMakeFailedResult("101e", nullptr, message);
             }
 
             // Init succeeded!
@@ -244,16 +252,16 @@ namespace armarx
                     std::string message = "SkillError 201: The prepare method of skill '" +
                                           skillName + "' did not succeed.";
                     ARMARX_ERROR_S << message;
-                    return exitAndMakeFailedResult(createErrorMessageData(message));
+                    return exitAndMakeFailedResult("201", nullptr, message);
                 }
             }
             catch (const error::SkillAbortedException& ex)
             {
-                return exitAndMakeAbortedResult(createErrorMessageData(GetHandledExceptionString()));
+                return exitAndMakeAbortedResult("201x", nullptr, GetHandledExceptionString());
             }
             catch (const error::SkillFailedException& ex)
             {
-                return exitAndMakeFailedResult(createErrorMessageData(GetHandledExceptionString()));
+                return exitAndMakeFailedResult("201x", nullptr, GetHandledExceptionString());
             }
             catch (const std::exception& ex)
             {
@@ -262,7 +270,7 @@ namespace armarx
                                       skillName +
                                       "'. The error was: " + GetHandledExceptionString();
                 ARMARX_ERROR_S << message;
-                return exitAndMakeFailedResult(createErrorMessageData(message));
+                return exitAndMakeFailedResult("201e", nullptr, message);
             }
 
             // Prepare succeeded!
@@ -282,22 +290,22 @@ namespace armarx
                     std::string message =
                         "SkillError 501: The main method of skill '" + skillName + "' did fail.";
 
-                    return exitAndMakeFailedResult(mainRet.data);
+                    return exitAndMakeFailedResult("501", mainRet.data, message);
                 }
                 else if (mainRet.status == TerminatedSkillStatus::Aborted)
                 {
                     std::string message =
                         "SkillError 501: The main method of skill '" + skillName + "' got aborted.";
-                    return exitAndMakeAbortedResult(mainRet.data);
+                    return exitAndMakeAbortedResult("501", mainRet.data, message);
                 }
             }
             catch (const error::SkillAbortedException& ex)
             {
-                return exitAndMakeAbortedResult(mainRet.data);
+                return exitAndMakeAbortedResult("501x", mainRet.data, GetHandledExceptionString());
             }
             catch (const error::SkillFailedException& ex)
             {
-                return exitAndMakeFailedResult(mainRet.data);
+                return exitAndMakeFailedResult("501x", mainRet.data, GetHandledExceptionString());
             }
             catch (const std::exception& ex)
             {
@@ -305,7 +313,7 @@ namespace armarx
                     "SkillError 501e: An error occured during the main method of skill '" +
                     skillName + "'. The error was: " + GetHandledExceptionString();
                 ARMARX_ERROR_S << message;
-                return exitAndMakeFailedResult(mainRet.data);
+                return exitAndMakeFailedResult("501e", mainRet.data,  message);
             }
 
             // Main succeeded!
@@ -318,18 +326,18 @@ namespace armarx
                 Skill::ExitResult exitRet = skill->exitSkill();
                 if (exitRet.status != TerminatedSkillStatus::Succeeded)
                 {
-                    // std::string message = "SkillError 601: The exit method of skill '" + skillName +
-                    //                       "' did not succeed.";
-                    return makeFailedResult(mainRet.data);
+                    std::string message = "SkillError 601: The exit method of skill '" + skillName +
+                                          "' did not succeed.";
+                    return makeFailedResult("601", mainRet.data, message);
                 }
             }
             catch (const error::SkillAbortedException& ex)
             {
-                return makeAbortedResult(mainRet.data);
+                return makeAbortedResult("601x", mainRet.data, GetHandledExceptionString());
             }
             catch (const error::SkillFailedException& ex)
             {
-                return makeFailedResult(mainRet.data);
+                return makeFailedResult("601x", mainRet.data, GetHandledExceptionString());
             }
             catch (const std::exception& ex)
             {
@@ -337,7 +345,7 @@ namespace armarx
                     "SkillError 601e: An error occured during the exit method of skill '" +
                     skillName + "'. The error was: " + GetHandledExceptionString();
                 ARMARX_ERROR_S << message;
-                return makeFailedResult(mainRet.data);
+                return makeFailedResult("601e", mainRet.data, message);
             }
 
             // Exit succeeded!