diff --git a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
index b41d385f32ffcc3c437a3090658e7eedcbec22e9..7009a9267a2828a4cd6ca5cc2238d9e153a7062f 100644
--- a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
+++ b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
@@ -66,6 +66,7 @@ namespace armarx::articulated_object
 
         defs->optional(p.updateFrequency, "updateFrequency", "Memory update frequency (write).");
 
+        // Reader will override some properties of writer.
         articulatedObjectWriter->registerPropertyDefinitions(defs);
         articulatedObjectReader->registerPropertyDefinitions(defs);
 
@@ -77,7 +78,11 @@ namespace armarx::articulated_object
         return "ArticulatedObjectLocalizerExample";
     }
 
-    void ArticulatedObjectLocalizerExample::onInitComponent() {}
+    void ArticulatedObjectLocalizerExample::onInitComponent()
+    {
+        // Reader overwrote property registered property of articulatedObjectWriter.
+        articulatedObjectWriter->setProviderName(articulatedObjectReader->getProviderName());
+    }
 
     void ArticulatedObjectLocalizerExample::onConnectComponent()
     {
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 e94cfbc11f465d6d7e2c8335f8b8a43135d15bf3..f7ba4898f46ca303e45accff465426e97b96cf79 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
@@ -162,6 +162,16 @@ namespace armarx::armem::articulated_object
         return getRobotDescriptions(qResult.memory);
     }
 
+    std::string Reader::getProviderName() const
+    {
+        return properties.providerName;
+    }
+
+    void Reader::setProviderName(const std::string& providerName)
+    {
+        this->properties.providerName = providerName;
+    }
+
     std::optional<robot::RobotDescription> Reader::queryDescription(const std::string& name,
             const armem::Time& timestamp)
     {
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
index d7a0d3c75b45546760b8be8be5b1749c7e35fbf0..5bc5efc3e3fe2a66716467444bd4ee54c86ac92c 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
@@ -54,6 +54,9 @@ namespace armarx::armem::articulated_object
 
         std::vector<robot::RobotDescription> queryDescriptions(const armem::Time& timestamp);
 
+        std::string getProviderName() const;
+        void setProviderName(const std::string& providerName);
+
         // TODO(fabian.reister): register property defs
 
     protected:
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 04dc6d4bf485063b25bc8cb5cf077b53630c1739..ec87004d5136fd93042765dff80ca85ee577616f 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
@@ -38,6 +38,8 @@ namespace armarx::armem::articulated_object
         def->optional(properties.coreClassSegmentName,
                       prefix + "CoreSegment",
                       "Name of the memory core segment to use for object classes.");
+
+        ARMARX_IMPORTANT << "Writer: add property '" << prefix << "ProviderName'";
         def->required(properties.providerName, prefix + "ProviderName", "Name of this provider");
     }
 
@@ -159,31 +161,51 @@ namespace armarx::armem::articulated_object
         return updateResult.snapshotID;
     }
 
+    std::string Writer::getProviderName() const
+    {
+        return properties.providerName;
+    }
+
+    void Writer::setProviderName(const std::string& providerName)
+    {
+        this->properties.providerName = providerName;
+    }
+
     bool Writer::storeInstance(const ArticulatedObject& obj)
     {
         std::lock_guard g{memoryWriterMutex};
 
         ARMARX_DEBUG << "Trying to create core segment + provider segment";
 
-        const auto result =
-            memoryWriter.addSegment(properties.coreInstanceSegmentName, properties.providerName);
-
-        if (not result.success)
+        // Provider segments are now added when necessary.
+        // Adding them explicitly is only needed to set a deriving provider segment type.
+        if (false)
         {
-            ARMARX_ERROR << "Creating core segment failed. Reason: " << result.errorMessage;
-            return false;
+            const auto result =
+                memoryWriter.addSegment(properties.coreInstanceSegmentName, properties.providerName);
+
+            if (not result.success)
+            {
+                ARMARX_ERROR << "Creating core segment failed. Reason: " << result.errorMessage;
+                return false;
+            }
+            else
+            {
+                ARMARX_IMPORTANT << VAROUT(result.segmentID);
+            }
         }
 
         const auto& timestamp = obj.timestamp;
 
-        const auto providerId = armem::MemoryID(result.segmentID);
-        const auto entityID =
-            providerId
-            .withEntityName(obj.description.name)
-            .withTimestamp(timestamp);
+        const auto providerId = armem::MemoryID()
+                                .withMemoryName(properties.memoryName)
+                                .withCoreSegmentName(properties.coreInstanceSegmentName)
+                                .withProviderSegmentName(properties.providerName);
+        ARMARX_IMPORTANT << VAROUT(providerId) << " | " << VAROUT(properties.providerName);
 
         armem::EntityUpdate update;
-        update.entityID = entityID;
+        update.entityID = providerId.withEntityName(obj.description.name);
+        // .withTimestamp(timestamp); // You only need to specify the entity ID, not the snapshot ID
 
         arondto::Robot aronArticulatedObject;
         robot::toAron(aronArticulatedObject, obj);
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 62629b674cdbc0b860d2f158886d747fde79fd36..c5fa97dd6e5d37402b1a2a7d0626131348f1e25c 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
@@ -42,7 +42,6 @@ namespace armarx::armem::articulated_object
         Writer(armem::client::MemoryNameSystem& memoryNameSystem);
         virtual ~Writer() = default;
 
-
         void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
         void connect();
 
@@ -54,7 +53,12 @@ namespace armarx::armem::articulated_object
 
         // const std::string& getPropertyPrefix() const override;
 
+        std::string getProviderName() const;
+        void setProviderName(const std::string& providerName);
+
+
     private:
+
         std::optional<armem::MemoryID> storeOrGetClass(const ArticulatedObject& obj);
 
         void updateKnownObjects(const armem::MemoryID& subscriptionID, const std::vector<armem::MemoryID>& snapshotIDs);
@@ -72,7 +76,7 @@ namespace armarx::armem::articulated_object
             std::string memoryName              = "Object";
             std::string coreInstanceSegmentName = "ArticulatedObjectInstance";
             std::string coreClassSegmentName    = "ArticulatedObjectClass";
-            std::string providerName;
+            std::string providerName            = "";
 
             bool allowClassCreation             = false;
         } properties;