diff --git a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
index 35f54669285b085c2c14fb7929585f2bba6bc0c0..1f812f23af7684ca55576fef2c9a01e5c4838cee 100644
--- a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
+++ b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
@@ -22,6 +22,7 @@
 #include "ArticulatedObjectLocalizerExample.h"
 
 #include <memory>
+#include <optional>
 
 #include <Eigen/Geometry>
 
@@ -38,6 +39,9 @@
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/services/tasks/PeriodicTask.h>
 #include <ArmarXCore/core/time/CycleUtil.h>
+#include <ArmarXCore/core/time/Duration.h>
+#include <ArmarXCore/core/time/ScopedStopWatch.h>
+#include <ArmarXCore/core/time/StopWatch.h>
 
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/armem_objects/types.h>
@@ -162,13 +166,32 @@ namespace armarx::articulated_object
             }
         }
 
-        const auto state = articulatedObjectReaderPlugin->get().queryState(
-            articulatedObject->getType() + "/" + articulatedObject->getName(),
-            Clock::Now(),
-            p.obj.readProviderName);
+        const armem::robot_state::RobotState state = [this]()
+        {
+            // Query state from memory
+            {
+                const std::optional<armem::robot_state::RobotState> state =
+                    articulatedObjectReaderPlugin->get().queryState(
+                        articulatedObject->getType() + "/" + articulatedObject->getName(),
+                        Clock::Now(),
+                        p.obj.readProviderName);
+
+                if (state)
+                {
+                    return state.value();
+                }
+            }
+
+            // The object does not exist in the memory (yet). Therefore, we create an initial state.
+            armem::robot_state::RobotState state{.timestamp = Clock::Now(),
+                                                 .globalPose = Eigen::Isometry3f::Identity(),
+                                                 .jointMap = articulatedObject->getJointValues(),
+                                                 .proprioception = std::nullopt};
+
+            return state;
+        }();
 
-        ARMARX_CHECK(state.has_value());
-        articulatedObject->setGlobalPose(state->globalPose.matrix());
+        articulatedObject->setGlobalPose(state.globalPose.matrix());
 
         ARMARX_DEBUG << "Reporting articulated objects";
 
@@ -189,8 +212,14 @@ namespace armarx::articulated_object
         // articulatedObject->setGlobalPose(simox::math::pose(Eigen::Vector3f(1000, 0, 0)));
         articulatedObject->setJointValues(jointValues);
 
-        auto& articulatedObjectWriter = articulatedObjectWriterPlugin->get();
-        articulatedObjectWriter.storeArticulatedObject(articulatedObject, now);
+        {
+            core::time::ScopedStopWatch sw(
+                [this](const armarx::Duration& dur)
+                { ARMARX_INFO << "Storing object took " << dur << "."; });
+
+            auto& articulatedObjectWriter = articulatedObjectWriterPlugin->get();
+            articulatedObjectWriter.storeArticulatedObject(articulatedObject, now);
+        }
     }
 
 } // namespace armarx::articulated_object
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
index 55a10158299de3cd3a64883ea44fb957bd0c355a..4feb69e7672a23669680b7997754f111b3b91e9d 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
@@ -352,7 +352,7 @@ namespace armarx::armem::articulated_object
         }
         catch (...)
         {
-            ARMARX_FATAL << "Failed to obtain robot state";
+            ARMARX_VERBOSE << "Failed to obtain robot state";
             return std::nullopt;
         }
     }
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
index f5ae8c13b383662411bc4d33399cc87ec3048a79..b8fb2887e5c1c6c129da78cbf6b41cd313750732 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
@@ -68,46 +68,18 @@ namespace armarx::armem::articulated_object
 
         const auto resultCoreInstanceSegmentName =
             memoryWriter.addSegment(properties.coreInstanceSegmentName, properties.providerName);
-
-        armem::MemoryID refId = armem::MemoryID(resultCoreClassSegment.segmentID);
-
-        armem::MemoryID id;
-        id.setCoreSegmentID(refId); // listen to all provider segments!
-
-        updateKnownObjects();
-        memoryNameSystem.subscribe(id, this, &Writer::updateKnownObjects);
-    }
-
-    void
-    Writer::updateKnownObject(const armem::MemoryID& snapshotId)
-    {
-        arondto::RobotDescription aronArticulatedObjectDescription;
-        // aronArticulatedObjectDescription.fromAron(snapshotId.ent);
-
-        // TODO(fabian.reister): implement
     }
 
-    void
-    Writer::updateKnownObjects(const armem::MemoryID& subscriptionID,
-                               const std::vector<armem::MemoryID>& snapshotIDs)
-    {
-        ARMARX_INFO << "New objects available!";
-        updateKnownObjects();
-    }
-
-    void
-    Writer::updateKnownObjects()
-    {
-        knownObjects = queryDescriptions(Time::Now());
-
-        ARMARX_INFO << "Known articulated objects " << simox::alg::get_keys(knownObjects);
-    }
 
     std::optional<armem::MemoryID>
     Writer::storeOrGetClass(const ArticulatedObject& obj) const
     {
         ARMARX_TRACE;
 
+        // key: name of object: RobotDescription::name
+        const std::unordered_map<std::string, MemoryID> knownObjects = queryDescriptions(Time::Now());
+        ARMARX_VERBOSE << "Known articulated objects " << simox::alg::get_keys(knownObjects);
+
         const auto objectId = knownObjects.find(obj.description.name);
 
         // check if exists
@@ -172,9 +144,6 @@ namespace armarx::armem::articulated_object
             return std::nullopt;
         }
 
-        // update cache (TODO: likely remove this)
-        knownObjects[obj.description.name] = updateResult.snapshotID;
-
         return updateResult.snapshotID;
     }
 
@@ -276,7 +245,7 @@ namespace armarx::armem::articulated_object
         if (not classId)
         {
             ARMARX_WARNING << "Could not get class id for object " << obj.description.name << "! "
-                           << "Known classes are " << simox::alg::get_keys(knownObjects);
+                           << "Known classes are " << simox::alg::get_keys(queryDescriptions(Time::Now()));
             return false;
         }
 
@@ -333,7 +302,7 @@ namespace armarx::armem::articulated_object
     }
 
     std::unordered_map<std::string, armem::MemoryID>
-    Writer::queryDescriptions(const armem::Time& timestamp)
+    Writer::queryDescriptions(const armem::Time& timestamp) const
     {
         // Query all entities from provider.
         armem::client::query::Builder qb;
@@ -343,7 +312,7 @@ namespace armarx::armem::articulated_object
         .coreSegments().withName(properties.coreClassSegmentName)
         .providerSegments().all()
         .entities().all()
-        .snapshots().latest(); // TODO beforeTime(timestamp);
+        .snapshots().beforeTime(timestamp);
         // clang-format on
 
         const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
index 568bec35dad164f665cd41f9067d92b16693e380..c31f5ce72eb4c95038b82e01b3ea73641352544d 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
@@ -59,14 +59,9 @@ namespace armarx::armem::articulated_object
     private:
         std::optional<armem::MemoryID> storeOrGetClass(const ArticulatedObject& obj) const;
 
-        void updateKnownObjects(const armem::MemoryID& subscriptionID,
-                                const std::vector<armem::MemoryID>& snapshotIDs);
-        void updateKnownObjects();
-        void updateKnownObject(const armem::MemoryID& snapshotId);
-
         // TODO duplicate
         std::unordered_map<std::string, armem::MemoryID>
-        queryDescriptions(const armem::Time& timestamp);
+        queryDescriptions(const armem::Time& timestamp) const;
         std::optional<robot_state::description::RobotDescription>
         getRobotDescription(const armarx::armem::wm::Memory& memory) const;
         std::unordered_map<std::string, armem::MemoryID>
@@ -89,9 +84,6 @@ namespace armarx::armem::articulated_object
 
         armem::client::Reader memoryReader;
         mutable std::mutex memoryReaderMutex;
-
-        // key: name of object: RobotDescription::name
-        mutable std::unordered_map<std::string, MemoryID> knownObjects;
     };