diff --git a/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt b/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
index 31fd00c7edcc840eb0a629580f3b28058698bae9..b2e71660ae1552d33eeaddb37f93a6f6b5d72491 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
@@ -16,6 +16,7 @@ set(LIB_FILES
     ObjectInfo.cpp
     ObjectFinder.cpp
     ObjectPose.cpp
+    ObjectPoseClient.cpp
 
     json_conversions.cpp
     ice_conversions.cpp
@@ -33,6 +34,7 @@ set(LIB_HEADERS
     ObjectInfo.h
     ObjectFinder.h
     ObjectPose.h
+    ObjectPoseClient.h
 
     json_conversions.h
     ice_conversions.h
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..de740d244c3e671016956df0b526065b21d3638c
--- /dev/null
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp
@@ -0,0 +1,73 @@
+#include "ObjectPoseClient.h"
+
+
+namespace armarx::objpose
+{
+
+    ObjectPoseClient::ObjectPoseClient()
+    {
+    }
+
+
+    ObjectPoseClient::ObjectPoseClient(
+            const ObjectPoseStorageInterfacePrx& objectPoseStorage,
+            const ObjectFinder& finder) :
+        objectFinder(finder)
+    {
+        this->connect(objectPoseStorage);
+    }
+
+
+    void
+    ObjectPoseClient::connect(
+            const ObjectPoseStorageInterfacePrx& objectPoseStorage)
+    {
+        this->objectPoseStorage = objectPoseStorage;
+    }
+
+
+    bool
+    ObjectPoseClient::isConnected() const
+    {
+        return bool(objectPoseStorage);
+    }
+
+
+    ObjectPoseSeq
+    ObjectPoseClient::fetchObjectPoses()
+    {
+        if (not objectPoseStorage)
+        {
+            ARMARX_WARNING << "No object pose observer.";
+            return {};
+        }
+        return fromIce(objectPoseStorage->getObjectPoses());
+    }
+
+
+    ObjectPoseMap ObjectPoseClient::fetchObjectPosesAsMap()
+    {
+        ObjectPoseMap map;
+        for (auto& pose : fetchObjectPoses())
+        {
+            map.emplace(pose.objectID, std::move(pose));
+        }
+        return map;
+    }
+
+
+    const ObjectPoseStorageInterfacePrx&
+    ObjectPoseClient::getObjectPoseStorage() const
+    {
+        return objectPoseStorage;
+    }
+
+
+    const ObjectFinder&
+    ObjectPoseClient::getObjectFinder() const
+    {
+        return objectFinder;
+    }
+
+}
+
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h
new file mode 100644
index 0000000000000000000000000000000000000000..2e262cc155944c4d9d3cebd6ca57d2b8130da595
--- /dev/null
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
+
+
+namespace armarx::objpose
+{
+
+    /**
+     * @brief Provides access to the `armarx::objpose::ObjectPoseStorageInterface`
+     * (aka the object memory).
+     */
+    class ObjectPoseClient
+    {
+    public:
+
+        ObjectPoseClient();
+        ObjectPoseClient(const ObjectPoseStorageInterfacePrx& objectPoseStorage,
+                         const ObjectFinder& finder = {});
+
+        void connect(const ObjectPoseStorageInterfacePrx& objectPoseStorage);
+
+        bool isConnected() const;
+
+
+        ObjectPoseSeq
+        fetchObjectPoses();
+        ObjectPoseMap
+        fetchObjectPosesAsMap();
+
+
+        const ObjectPoseStorageInterfacePrx&
+        getObjectPoseStorage() const;
+
+        const ObjectFinder&
+        getObjectFinder() const;
+
+
+    public:
+
+        ObjectPoseStorageInterfacePrx objectPoseStorage;
+
+        ObjectFinder objectFinder;
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
index 9bf87346d6014d3add6edad66bbda0bfa84019ad..a2b3ef47343443b4ac0e1fc85c9f33f52ccc857e 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
@@ -55,6 +55,13 @@ namespace armarx
         return plugin->createObjectPoseStorage();
     }
 
+
+    objpose::ObjectPoseClient ObjectPoseClientPluginUser::getClient() const
+    {
+        return objpose::ObjectPoseClient(objectPoseStorage, getObjectFinder());
+    }
+
+
     objpose::ObjectPoseSeq ObjectPoseClientPluginUser::getObjectPoses()
     {
         if (!objectPoseStorage)
diff --git a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
index 769d1176dd1fc8db6063fe867a3aec1ff3e1b90d..9f72ab1eb4b96542352eb34e64e3955382b2c0d2 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
@@ -5,6 +5,7 @@
 #include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h>
 
 
 namespace armarx::plugins
@@ -73,6 +74,10 @@ namespace armarx
         objpose::ObjectPoseStorageInterfacePrx createObjectPoseStorage();
         objpose::ObjectPoseStorageInterfacePrx objectPoseStorage;
 
+
+        objpose::ObjectPoseClient getClient() const;
+
+
         objpose::ObjectPoseSeq getObjectPoses();
 
         plugins::ObjectPoseClientPlugin& getObjectPoseClientPlugin();