diff --git a/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg b/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg
index 6e9a251dfa0299e26cdf1216eb8663695714ed77..88ad0e549f399971ccb3aecafa7d32ef7df4be42 100644
--- a/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg
+++ b/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg
@@ -174,6 +174,41 @@
 # ArmarX.ObjectMemory.mem.cls.CoreSegmentName = Class
 
 
+# ArmarX.ObjectMemory.mem.cls.Floor.EntityName:  Object class entity of the floor.
+#  Attributes:
+#  - Default:            Environment/floor-20x20
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.cls.Floor.EntityName = Environment/floor-20x20
+
+
+# ArmarX.ObjectMemory.mem.cls.Floor.Height:  Height (z) of the floor plane. 
+# Set slightly below 0 to avoid z-fighting when drawing planes on the ground.
+#  Attributes:
+#  - Default:            true
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.cls.Floor.Height = true
+
+
+# ArmarX.ObjectMemory.mem.cls.Floor.LayerName:  Layer to draw the floor on.
+#  Attributes:
+#  - Default:            Floor
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.cls.Floor.LayerName = Floor
+
+
+# ArmarX.ObjectMemory.mem.cls.Floor.Show:  Whether to show the floor.
+#  Attributes:
+#  - Default:            true
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.cls.Floor.Show = true
+
+
 # ArmarX.ObjectMemory.mem.cls.LoadFromObjectsPackage:  If true, load the objects from the objects package on startup.
 #  Attributes:
 #  - Default:            true
diff --git a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
index 6e11e66194887d0304f34b9bd2cbaf58da4732fc..f222e9c2092d984d2faeda9cac2ec64858f324e0 100644
--- a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
@@ -34,6 +34,8 @@ armarx_add_library(
         # server/articulated_object/SegmentAdapter.h
         # server/articulated_object/Visu.h
 
+        client/articulated_object/Reader.cpp
+        client/articulated_object/Writer.cpp
 
     SOURCES
         aron_conversions.cpp
@@ -51,8 +53,15 @@ armarx_add_library(
         # server/articulated_object/Segment.cpp
         # server/articulated_object/SegmentAdapter.cpp
         # server/articulated_object/Visu.cpp
+
+        client/articulated_object/Reader.h
+        client/articulated_object/Writer.h
+        client/articulated_object/interfaces.h
+
 )
 
+
+
 armarx_enable_aron_file_generation_for_target(
     TARGET_NAME
         "${LIB_NAME}"
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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b445f3ae6d780866cecbb44b8bd9a1a06f06fd17 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
@@ -0,0 +1,96 @@
+#include "Writer.h"
+#include "RobotAPI/libraries/armem_objects/aron_conversions.h"
+
+#include <mutex>
+#include <RobotAPI/libraries/armem_objects/aron/Robot.aron.generated.h>
+
+
+namespace armarx::armem::articulated_object
+{
+
+    void Writer::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
+    {
+        ARMARX_DEBUG << "Writer: registerPropertyDefinitions";
+
+        MemoryConnector::registerPropertyDefinitions(def);
+
+        const std::string prefix = getPropertyPrefix();
+
+        def->optional(properties.coreSegmentName,
+                      prefix + "CoreSegment",
+                      "Name of the memory core segment to use.");
+
+        def->optional(properties.memoryName, prefix + "MemoryName");
+
+        def->required(properties.providerName, prefix + "ProviderName");
+    }
+
+    void Writer::connect()
+    {
+        // Wait for the memory to become available and add it as dependency.
+        ARMARX_IMPORTANT << "Writer: Waiting for memory '" << properties.memoryName << "' ...";
+        auto result = useMemory(properties.memoryName);
+        if (not result.success)
+        {
+            ARMARX_ERROR << result.errorMessage;
+            return;
+        }
+
+        ARMARX_IMPORTANT << "Writer: Connected to memory '" << properties.memoryName;
+
+        memoryWriter.setWritingMemory(result.proxy);
+    }
+
+    bool Writer::store(const ArticulatedObject& obj)
+    {
+        std::lock_guard g{memoryWriterMutex};
+
+        ARMARX_DEBUG << "Trying to create core segment + provider segment";
+
+        const auto result =
+            memoryWriter.addSegment(properties.memoryName, properties.providerName);
+
+        if (not result.success)
+        {
+            ARMARX_ERROR << result.errorMessage;
+
+            // TODO(fabian.reister): message
+            return false;
+        }
+
+        const auto& timestamp = obj.timestamp;
+
+        const auto providerId = armem::MemoryID(result.segmentID);
+        const auto entityID =
+            providerId
+            .withEntityName(obj.description.name)
+            .withTimestamp(timestamp);
+
+        armem::EntityUpdate update;
+        update.entityID = entityID;
+
+        arondto::Robot aronArticulatedObject;
+        toAron(aronArticulatedObject, obj);
+
+        update.instancesData = {aronArticulatedObject.toAron()};
+        update.timeCreated   = timestamp;
+
+        ARMARX_DEBUG << "Committing " << update << " at time " << timestamp;
+        armem::EntityUpdateResult updateResult = memoryWriter.commit(update);
+
+        ARMARX_DEBUG << updateResult;
+
+        if (not updateResult.success)
+        {
+            ARMARX_ERROR << updateResult.errorMessage;
+        }
+
+        return updateResult.success;
+    }
+
+    const std::string& Writer::getPropertyPrefix() const
+    {
+        return propertyPrefix;
+    }
+
+} // namespace armarx::armem::articulated_object
\ No newline at end of file
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 9afe430b8e7241b09f21e2745f93bb9e56f2e33c..fdcac2eaf2aa1020079c2173df47d9925767592a 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
@@ -1,17 +1,45 @@
 #pragma once
 
+#include <mutex>
+
+#include "RobotAPI/libraries/armem/client/MemoryConnector.h"
+#include "RobotAPI/libraries/armem/client/Writer.h"
+
 #include "interfaces.h"
 
 
 namespace armarx::armem::articulated_object
 {
 
-    class Writer: public WriterInterface
+    class Writer:
+        virtual public WriterInterface,
+        virtual public MemoryConnector
     {
     public:
-        virtual ~WriterInterface() = default;
+        virtual ~Writer() = default;
+
+        bool store(const ArticulatedObject& obj) override;
+
+
+        void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
+        void connect();
+
+        const std::string& getPropertyPrefix() const override;
+
+    private:
+
+        struct Properties
+        {
+            std::string memoryName       = "ObjectMemory";
+            std::string coreSegmentName  = "ArticulatedObjectInstance";
+            std::string providerName;
+        } properties;
+
+        const std::string propertyPrefix = "mem.obj.articulated.write.";
+
+        armem::client::Writer memoryWriter;
+        std::mutex memoryWriterMutex;
 
-        void store(const ArticulatedObject& obj) override;
     };
 
 
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h
index 9ffb994aee690080a8254d11ab8f5d4f7eba14d5..56ade407493d602bc6d64692f656a22ab606e708 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h
@@ -21,7 +21,7 @@ namespace armarx::armem::articulated_object
     public:
         virtual ~WriterInterface() = default;
 
-        virtual void store(const ArticulatedObject& obj) = 0;
+        virtual bool store(const ArticulatedObject& obj) = 0;
     };
 
 }  // namespace armarx::armem::articulated_object
\ No newline at end of file
diff --git a/source/RobotAPI/libraries/armem_objects/types.h b/source/RobotAPI/libraries/armem_objects/types.h
index c772840db4e270470bce8efa2535af5c81e92094..0db042762ef9e95da2508be38da71688a722a49f 100644
--- a/source/RobotAPI/libraries/armem_objects/types.h
+++ b/source/RobotAPI/libraries/armem_objects/types.h
@@ -36,7 +36,7 @@ namespace armarx::armem
         RobotDescription description;
         RobotState config;
 
-        // IceUtil::Time timestamp;
+        IceUtil::Time timestamp;
     };
 
     namespace articulated_object