diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d5f8e6cbd628fc6f5f5022ad11f6908e6601368f
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp
@@ -0,0 +1,21 @@
+#include "SimplePeriodicSkill.h"
+
+namespace armarx::skills
+{
+
+    PeriodicSkill::StepResult SimplePeriodicSkill::step()
+    {
+        StepInput i;
+        i.executorName = this->executorName;
+        i.parameters = this->parameters;
+        i.callback = this->callback;
+        return this->step(i);
+    }
+
+    PeriodicSkill::StepResult SimplePeriodicSkill::step(const StepInput& in)
+    {
+        ARMARX_IMPORTANT << "Dummy executing once skill '" << description.skillId
+                         << "'. Please overwrite this method!";
+        return {ActiveOrTerminatedSkillStatus::Succeeded, nullptr};
+    }
+}
diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.h b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.h
new file mode 100644
index 0000000000000000000000000000000000000000..69a7ccc1868a53410886f32003849163a587c301
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.h
@@ -0,0 +1,30 @@
+#pragma once
+
+#include <RobotAPI/libraries/skills/provider/PeriodicSkill.h>
+
+namespace armarx
+{
+    namespace skills
+    {
+        class SimplePeriodicSkill : public PeriodicSkill
+        {
+        public:
+          using Base = PeriodicSkill;
+
+          struct StepInput
+          {
+            std::string executorName;
+            aron::data::DictPtr parameters;
+            CallbackT callback;
+          };
+
+          using Base::Base;
+
+        protected:
+          StepResult step() final;
+
+          virtual StepResult step(const StepInput& in);
+
+        };
+    } // namespace skills
+} // namespace armarx
diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.cpp b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a04c2b3d821e7e821dd2158a98a636d9b3338b03
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.cpp
@@ -0,0 +1,6 @@
+#include "SimplePeriodicSpecializedSkill.h"
+
+namespace armarx::skills
+{
+
+}
diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h
new file mode 100644
index 0000000000000000000000000000000000000000..221fdc2c779ea491cca88cff7e52b95f114d549a
--- /dev/null
+++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h
@@ -0,0 +1,51 @@
+#pragma once
+
+#include <RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h>
+
+namespace armarx
+{
+    namespace skills
+    {
+        template <class AronT>
+        class SimplePeriodicSpecializedSkill : public PeriodicSpecializedSkill<AronT>
+        {
+
+        public:
+          using Base = PeriodicSpecializedSkill<AronT>;
+          using Skill::description;
+          using Skill::getSkillId;
+
+          using StepResult = PeriodicSkill::StepResult;
+
+          using Base::Base;
+
+          struct SpecializedStepInput
+          {
+            std::string executorName;
+            AronT parameters;
+            Skill::CallbackT callback;
+          };
+
+        protected:
+          StepResult step() final
+          {
+              AronT p;
+              p.fromAron(this->parameters);
+
+              SpecializedStepInput i;
+              i.executorName = this->executorName;
+              i.parameters = p;
+              i.callback = this->callback;
+              return this->step(i);
+          }
+
+          virtual StepResult step(const SpecializedStepInput& in)
+          {
+              ARMARX_IMPORTANT << "Dummy executing once skill '" << description.skillId
+                               << "'. Please overwrite this method!";
+              return {ActiveOrTerminatedSkillStatus::Succeeded, nullptr};
+          }
+
+        };
+    } // namespace skills
+} // namespace armarx