diff --git a/source/RobotAPI/libraries/skills/core/CMakeLists.txt b/source/RobotAPI/libraries/skills/core/CMakeLists.txt
index 29145e60e305fa10decf06200685dcb99ec6a3d5..ad74a2763e350da6eaa72cf550b23acd0271d07f 100644
--- a/source/RobotAPI/libraries/skills/core/CMakeLists.txt
+++ b/source/RobotAPI/libraries/skills/core/CMakeLists.txt
@@ -26,8 +26,10 @@ armarx_add_library(
         Skill.cpp
         SkillProxy.cpp
         SkillDescription.cpp
+        FluxioResult.cpp
     HEADERS
         error/Exception.h
+        FluxioResult.h
         SkillID.h
         ProviderID.h
         ProviderInfo.h
diff --git a/source/RobotAPI/libraries/skills/core/FluxioResult.cpp b/source/RobotAPI/libraries/skills/core/FluxioResult.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..457081a9d161d1e351a6d12a7134e47781f9e4ba
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/core/FluxioResult.cpp
@@ -0,0 +1,30 @@
+#include <stdexcept>
+
+template<typename T, typename E = std::exception>
+
+class Result {
+  private: bool success_; T result_; E error_; //maybe even an error list for a better stacktrace
+
+  public:
+    Result(const T& res) : success_(true),       result_(res) {}
+
+    Result(const E& err) : success_(false),   error_(err) {}
+
+    bool isSuccess() const {
+        return success_;
+    }
+
+ T getResult() const {
+        if (!success_) {
+            throw std::logic_error("Result is not successful");
+        }
+        return result_;
+    }
+
+    E getError() const {
+        if (success_) {
+            throw std::logic_error("Result does not contain an error");
+        }
+        return error_;
+    }
+};
\ No newline at end of file
diff --git a/source/RobotAPI/libraries/skills/core/FluxioResult.h b/source/RobotAPI/libraries/skills/core/FluxioResult.h
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391