diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
index 71021ee3ddfd84030f1b2b6a06a457ed87e1d779..13e240f38cf471e85c6782d6ee3e6bdce38c00c4 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
+++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
@@ -55,19 +55,9 @@ namespace armarx
         defs->defineOptionalProperty<std::string>("KinematicUnitObserverName", "KinematicUnitObserver", "Name of the kinematic unit observer.");
         defs->topic(debugObserver);
 
-        defs->optional(visu.enabled, "visu.enabled", "Enable or disable visualization of objects.");
-        defs->optional(visu.inGlobalFrame, "visu.inGlobalFrame", "If true, show global poses. If false, show poses in robot frame.");
-        defs->optional(visu.alpha, "visu.alpha", "Alpha of objects (1 = solid, 0 = transparent).");
-        defs->optional(visu.oobbs, "visu.oobbs", "Enable showing oriented bounding boxes.");
-        defs->optional(visu.objectFrames, "visu.objectFrames", "Enable showing object frames.");
-        defs->optional(visu.objectFramesScale, "visu.objectFramesScale", "Scaling of object frames.");
-
-        defs->optional(calibration.robotNode, "calibration.robotNode", "Robot node which can be calibrated.");
-        defs->optional(calibration.offset, "calibration.offset", "Offset for the node to be calibrated.");
-
-        defs->optional(robotHead.checkHeadVelocity, "head.checkHeadVelocity", "If true, check whether the head is moving and discard updates in the meantime.");
-        defs->optional(robotHead.maxJointVelocity, "head.maxJointVelocity", "If a head joint's velocity is higher, the head is considered moving.");
-        defs->optional(robotHead.discardIntervalAfterMoveMS, "head.discardIntervalAfterMoveMS", "For how long new updates are ignored after moving the head.");
+        visu.defineProperties(defs, "visu.");
+        calibration.defineProperties(defs, "calibration.");
+        robotHead.defineProperties(defs, "head.");
 
         return defs;
     }
@@ -923,6 +913,22 @@ namespace armarx
         }
     }
 
+    void ObjectPoseObserver::Visu::defineProperties(PropertyDefinitionsPtr defs, const std::string& prefix)
+    {
+        defs->optional(enabled, prefix + "enabled", "Enable or disable visualization of objects.");
+        defs->optional(inGlobalFrame, prefix + "inGlobalFrame", "If true, show global poses. If false, show poses in robot frame.");
+        defs->optional(alpha, prefix + "alpha", "Alpha of objects (1 = solid, 0 = transparent).");
+        defs->optional(oobbs, prefix + "oobbs", "Enable showing oriented bounding boxes.");
+        defs->optional(objectFrames, prefix + "objectFrames", "Enable showing object frames.");
+        defs->optional(objectFramesScale, prefix + "objectFramesScale", "Scaling of object frames.");
+    }
+
+    void ObjectPoseObserver::Calibration::defineProperties(PropertyDefinitionsPtr defs, const std::string& prefix)
+    {
+        defs->optional(robotNode, prefix + "robotNode", "Robot node which can be calibrated.");
+        defs->optional(offset, prefix + "offset", "Offset for the node to be calibrated.");
+    }
+
 
 }
 
diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
index 09c839d298fc7018c7aa14cf80e65c43e0811540..bf693a18dfb9f52a159891ee107c41b256cb44dc 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
+++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
@@ -202,6 +202,8 @@ namespace armarx
             bool oobbs = false;
             bool objectFrames = false;
             float objectFramesScale = 1.0;
+
+            void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "visu.");
         };
         Visu visu;
 
@@ -209,6 +211,8 @@ namespace armarx
         {
             std::string robotNode = "Neck_2_Pitch";
             float offset = 0.0f;
+
+            void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "calibration.");
         };
         Calibration calibration;
 
diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.cpp b/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.cpp
index c0c68e6d1f1f59a9d7812e198276d8f57d000726..b9ac721ca1ade44a8667b28667520093169d0770 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.cpp
+++ b/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.cpp
@@ -1,11 +1,22 @@
 #include "RobotHeadMovement.h"
 
 #include <ArmarXCore/core/time/TimeUtil.h>
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 
 
 namespace armarx::objpose
 {
 
+    void RobotHeadMovement::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
+    {
+        defs->optional(checkHeadVelocity, prefix + "checkHeadVelocity",
+                       "If true, check whether the head is moving and discard updates in the meantime.");
+        defs->optional(maxJointVelocity, prefix + "maxJointVelocity",
+                       "If a head joint's velocity is higher, the head is considered moving.");
+        defs->optional(discardIntervalAfterMoveMS, prefix + "discardIntervalAfterMoveMS",
+                       "For how long new updates are ignored after moving the head.");
+    }
+
     void RobotHeadMovement::fetchDatafields()
     {
         if (kinematicUnitObserver)
diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h b/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h
index b0345e7c39a0c27caa693dcf075b5d7f9ffa2510..fd06a1b2d83831642b4abcfe6fc16784c105c554 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h
+++ b/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h
@@ -12,10 +12,29 @@
 #include <RobotAPI/interface/observers/KinematicUnitObserverInterface.h>
 
 
+namespace armarx
+{
+    class PropertyDefinitionContainer;
+    using PropertyDefinitionsPtr = IceUtil::Handle<PropertyDefinitionContainer>;
+}
+
 namespace armarx::objpose
 {
     class RobotHeadMovement : public armarx::Logging
     {
+    public:
+
+        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "head.");
+
+        void fetchDatafields();
+        bool isMoving() const;
+
+        void movementStarts(long discardIntervalMs);
+        void movementStarts(IceUtil::Time discardInterval);
+        void movementStops(long discardIntervalMs);
+        void movementStops(IceUtil::Time discardInterval);
+
+
     public:
 
         bool checkHeadVelocity = true;
@@ -31,13 +50,6 @@ namespace armarx::objpose
 
         DebugObserverInterfacePrx debugObserver;
 
-        void fetchDatafields();
-        bool isMoving() const;
-
-        void movementStarts(long discardIntervalMs);
-        void movementStarts(IceUtil::Time discardInterval);
-        void movementStops(long discardIntervalMs);
-        void movementStops(IceUtil::Time discardInterval);
     };