diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
index 91ea5b23400f568891326f6dd6c79b5e603d229c..c624379b89ae336aa561e364706f3780b7fbf0e9 100644
--- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
+++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
@@ -59,22 +59,27 @@ namespace armarx::armem::server::obj
         return defs;
     }
 
+
     ObjectMemory::ObjectMemory() :
         server::ComponentPluginUser(),
-        instance::SegmentAdapter(server::ComponentPluginUser::iceMemory,
-                                 server::ComponentPluginUser::workingMemoryMutex),
-        classSegment(server::ComponentPluginUser::iceMemory,
-                     server::ComponentPluginUser::workingMemoryMutex),
-        attachmentSegment(server::ComponentPluginUser::iceMemory,
-                          server::ComponentPluginUser::workingMemoryMutex)
+        instance::SegmentAdapter(server::ComponentPluginUser::iceMemory),
+        classSegment(server::ComponentPluginUser::iceMemory),
+        attachmentSegment(server::ComponentPluginUser::iceMemory)
+    {
+    }
+
+
+    ObjectMemory::~ObjectMemory()
     {
     }
 
+
     std::string ObjectMemory::getDefaultName() const
     {
         return "ObjectMemory";
     }
 
+
     void ObjectMemory::onInitComponent()
     {
         workingMemory.name() = defaultMemoryName;
@@ -114,6 +119,7 @@ namespace armarx::armem::server::obj
         });
     }
 
+
     void ObjectMemory::onConnectComponent()
     {
         // onConnect can be called multiple times, but addRobot will fail if called more than once with the same ID
@@ -141,17 +147,17 @@ namespace armarx::armem::server::obj
             ArVizComponentPluginUser::getArvizClient()
         );
 
-        attachmentSegment.connect(
-            ArVizComponentPluginUser::getArvizClient()
-        );
+        attachmentSegment.connect();
 
         RemoteGui_startRunningTask();
     }
 
+
     void ObjectMemory::onDisconnectComponent()
     {
     }
 
+
     void ObjectMemory::onExitComponent()
     {
     }
diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
index f29b2cef93efb2aa35a7983f4dce87d3db854b80..5ef38a94b418fa1a1bae431e03fe20f4ff9a92da 100644
--- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
+++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
@@ -81,6 +81,7 @@ namespace armarx::armem::server::obj
     public:
 
         ObjectMemory();
+        virtual ~ObjectMemory();
 
 
         /// @see armarx::ManagedIceObject::getDefaultName()
diff --git a/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.cpp
index f2490c841d0042a133fb1c8cf58740eb2af614cd..bb5d930da65b6ddb0e7966aa53e5e8fa766d383d 100644
--- a/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.cpp
@@ -4,6 +4,7 @@
 
 #include <ArmarXCore/core/time/TimeUtil.h>
 #include "ArmarXCore/core/logging/Logging.h"
+#include <ArmarXCore/core/application/properties/forward_declarations.h>
 
 #include "RobotAPI/libraries/armem/util/util.h"
 #include "RobotAPI/libraries/aron/common/aron_conversions.h"
@@ -23,9 +24,8 @@
 
 namespace armarx::armem::server::obj::attachments
 {
-    Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter, std::mutex& memoryMutex) :
-        iceMemory(memoryToIceAdapter),
-        memoryMutex(memoryMutex)
+    Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) :
+        iceMemory(memoryToIceAdapter)
     {
         Logging::setTag("Attachments");
     }
@@ -34,7 +34,7 @@ namespace armarx::armem::server::obj::attachments
 
     void Segment::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
     {
-        defs->optional(p.coreClassSegmentName, prefix + "CoreSegmentName", "Name of the object instance core segment.");
+        defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the object instance core segment.");
         defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of object poses history (-1 for infinite).");
     }
 
@@ -42,20 +42,22 @@ namespace armarx::armem::server::obj::attachments
     {
         ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
 
-        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreClassSegmentName, arondto::Robot::toAronType());
+        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, arondto::Robot::toAronType());
         coreSegment->setMaxHistorySize(p.maxHistorySize);
     }
 
-    void Segment::connect(viz::Client arviz)
+    void Segment::connect()
     {
-        // this->visu = std::make_unique<Visu>(arviz, *this);
     }
 
     std::vector<armarx::armem::attachment::ObjectAttachment> Segment::getAttachments(const armem::Time& timestamp) const
     {
+        ARMARX_CHECK_NOT_NULL(coreSegment);
+        std::scoped_lock(coreSegment->mutex());
+
         std::vector<armarx::armem::attachment::ObjectAttachment> attachments;
 
-        for (const auto& [_, provSeg] : iceMemory.workingMemory->getCoreSegment(p.coreClassSegmentName))
+        for (const auto& [_, provSeg] : *coreSegment)
         {
             for (const auto& [name, entity] :  provSeg.entities())
             {
@@ -80,47 +82,4 @@ namespace armarx::armem::server::obj::attachments
         return attachments;
     }
 
-
-    // void Segment::RemoteGui::setup(const Segment& data)
-    // {
-    //     using namespace armarx::RemoteGui::Client;
-
-    //     maxHistorySize.setValue(std::max(1, int(data.p.maxHistorySize)));
-    //     maxHistorySize.setRange(1, 1e6);
-    //     infiniteHistory.setValue(data.p.maxHistorySize == -1);
-    //     discardSnapshotsWhileAttached.setValue(data.p.discardSnapshotsWhileAttached);
-
-    //     GridLayout grid;
-    //     int row = 0;
-    //     grid.add(Label("Max History Size"), {row, 0}).add(maxHistorySize, {row, 1});
-    //     row++;
-    //     grid.add(Label("Infinite History Size"), {row, 0}).add(infiniteHistory, {row, 1});
-    //     row++;
-    //     grid.add(Label("Discard Snapshots while Attached"), {row, 0}).add(discardSnapshotsWhileAttached, {row, 1});
-    //     row++;
-
-    //     group.setLabel("Data");
-    //     group.addChild(grid);
-    // }
-
-    // void Segment::RemoteGui::update(Segment& data)
-    // {
-    //     if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged()
-    //         || discardSnapshotsWhileAttached.hasValueChanged())
-    //     {
-    //         std::scoped_lock lock(data.memoryMutex);
-
-    //         if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged())
-    //         {
-    //             data.p.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
-    //             if (data.coreSegment)
-    //             {
-    //                 data.coreSegment->setMaxHistorySize(long(data.p.maxHistorySize));
-    //             }
-    //         }
-
-    //         data.p.discardSnapshotsWhileAttached = discardSnapshotsWhileAttached.getValue();
-    //     }
-    // }
-
 }  // namespace armarx::armem::server::obj::attachments
diff --git a/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.h b/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.h
index 3817bc22a51227422848ebbe1e4296aa570fee24..0b9302d93390c473b87c67066bfe173237f3774b 100644
--- a/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.h
@@ -27,7 +27,7 @@
 #include <unordered_map>
 
 #include <ArmarXCore/core/logging/Logging.h>
-#include "ArmarXCore/core/application/properties/PropertyDefinitionContainer.h"
+#include <ArmarXCore/core/application/properties/forward_declarations.h>
 
 // #include "ArmarXGui/libraries/RemoteGui/Client/Widgets.h"
 
@@ -37,6 +37,7 @@
 #include "RobotAPI/libraries/armem/core/Time.h"
 #include "RobotAPI/libraries/armem_objects/types.h"
 
+
 namespace armarx::armem
 {
     namespace server
@@ -59,16 +60,14 @@ namespace armarx::armem::server::obj::attachments
     class Segment : public armarx::Logging
     {
     public:
-        Segment(server::MemoryToIceAdapter& iceMemory,
-                std::mutex& memoryMutex);
 
+        Segment(server::MemoryToIceAdapter& iceMemory);
         virtual ~Segment();
 
-        void connect(viz::Client arviz);
-
         void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
 
         void init();
+        void connect();
 
         std::vector<armarx::armem::attachment::ObjectAttachment> getAttachments(const armem::Time& timestamp) const;
 
@@ -77,31 +76,14 @@ namespace armarx::armem::server::obj::attachments
 
         server::MemoryToIceAdapter& iceMemory;
         wm::CoreSegment* coreSegment = nullptr;
-        std::mutex& memoryMutex;
 
         struct Properties
         {
-            std::string coreClassSegmentName = "Attachments";
+            std::string coreSegmentName = "Attachments";
             int64_t maxHistorySize = -1;
         };
         Properties p;
 
-        // std::unique_ptr<Visu> visu;
-
-    public:
-
-        // struct RemoteGui
-        // {
-        //     armarx::RemoteGui::Client::GroupBox group;
-
-        //     armarx::RemoteGui::Client::IntSpinBox maxHistorySize;
-        //     armarx::RemoteGui::Client::CheckBox infiniteHistory;
-        //     armarx::RemoteGui::Client::CheckBox discardSnapshotsWhileAttached;
-
-        //     void setup(const Segment& data);
-        //     void update(Segment& data);
-        // };
-
     };
 
 }  // namespace armarx::armem::server::obj::attachments
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
index 3e6ecfed37e3d75d60b3d509f97520c7627f0fcc..49c9b6dd800cfb040a792d5495793ebf96f9dba8 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
@@ -19,13 +19,13 @@
 namespace armarx::armem::server::obj::clazz
 {
 
-    Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter, std::mutex& memoryMutex) :
-        iceMemory(memoryToIceAdapter),
-        memoryMutex(memoryMutex)
+    Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) :
+        iceMemory(memoryToIceAdapter)
     {
         Logging::setTag("ClassSegment");
     }
 
+
     void Segment::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
     {
         defs->optional(p.coreSegmentName, prefix + "CoreSegmentName", "Name of the object clazz core segment.");
@@ -38,6 +38,7 @@ namespace armarx::armem::server::obj::clazz
         floorVis.defineProperties(defs, prefix + "Floor.");
     }
 
+
     void Segment::init()
     {
         ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
@@ -51,6 +52,7 @@ namespace armarx::armem::server::obj::clazz
         }
     }
 
+
     void Segment::connect(viz::Client arviz)
     {
         this->arviz = arviz;
@@ -60,17 +62,26 @@ namespace armarx::armem::server::obj::clazz
     }
 
 
+    std::mutex& Segment::mutex() const
+    {
+        ARMARX_CHECK_NOT_NULL(coreSegment);
+        return coreSegment->mutex();
+    }
+
+
     void Segment::loadByObjectFinder(const std::string& objectsPackage)
     {
         loadByObjectFinder(ObjectFinder(objectsPackage));
     }
 
+
     void Segment::loadByObjectFinder(const ObjectFinder& finder)
     {
         this->objectFinder = finder;
         loadByObjectFinder();
     }
 
+
     void Segment::loadByObjectFinder()
     {
         const Time now = TimeUtil::GetTime();
@@ -106,6 +117,7 @@ namespace armarx::armem::server::obj::clazz
         iceMemory.commit(commit);
     }
 
+
     void Segment::visualizeClass(const MemoryID& entityID, bool showAABB, bool showOOBB)
     {
         const Eigen::Matrix4f pose = Eigen::Matrix4f::Identity();
@@ -164,6 +176,7 @@ namespace armarx::armem::server::obj::clazz
         arviz.commit(layerObject, layerOrigin, layerAABB, layerOOBB);
     }
 
+
     arondto::ObjectClass Segment::objectClassFromInfo(const ObjectInfo& info)
     {
         namespace fs = std::filesystem;
@@ -173,8 +186,8 @@ namespace armarx::armem::server::obj::clazz
         toAron(data.id, info.id());
 
         auto setPathIfExists = [](
-                armarx::arondto::PackagePath & aron,
-                const PackageFileLocation & location)
+                                   armarx::arondto::PackagePath & aron,
+                                   const PackageFileLocation & location)
         {
             if (fs::is_regular_file(location.absolutePath))
             {
@@ -223,12 +236,14 @@ namespace armarx::armem::server::obj::clazz
         group.addChildren({layout, VSpacer()});
     }
 
+
     void Segment::RemoteGui::update(Segment& segment)
     {
         data.update(segment);
         visu.update(segment);
     }
 
+
     void Segment::RemoteGui::Data::setup(const Segment& segment)
     {
         using namespace armarx::RemoteGui::Client;
@@ -253,17 +268,18 @@ namespace armarx::armem::server::obj::clazz
         group.addChild(grid);
     }
 
+
     void Segment::RemoteGui::Data::update(Segment& segment)
     {
         if (reloadButton.wasClicked())
         {
-            std::scoped_lock lock(segment.memoryMutex);
+            std::scoped_lock lock(segment.mutex());
             segment.loadByObjectFinder();
             rebuild = true;
         }
         if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged())
         {
-            std::scoped_lock lock(segment.memoryMutex);
+            std::scoped_lock lock(segment.mutex());
             segment.p.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
             if (segment.coreSegment)
             {
@@ -273,7 +289,6 @@ namespace armarx::armem::server::obj::clazz
     }
 
 
-
     void Segment::RemoteGui::Visu::setup(const Segment& segment)
     {
         using namespace armarx::RemoteGui::Client;
@@ -308,6 +323,7 @@ namespace armarx::armem::server::obj::clazz
         group.addChild(grid);
     }
 
+
     void Segment::RemoteGui::Visu::update(Segment& segment)
     {
         if (showButton.wasClicked())
@@ -315,7 +331,7 @@ namespace armarx::armem::server::obj::clazz
             const size_t index = static_cast<size_t>(showComboBox.getIndex());
             if (/*index >= 0 &&*/ index < showOptionsIndex.size())
             {
-                std::scoped_lock lock(segment.memoryMutex);
+                std::scoped_lock lock(segment.mutex());
                 segment.visualizeClass(showOptionsIndex.at(index));
             }
         }
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
index 88eaedbefb6529b873dfe6033e6a2857672c0586..03dce0e9a1214060778ada2bf98ea2b872aa28cb 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
@@ -25,14 +25,15 @@ namespace armarx::armem::server::obj::clazz
     {
     public:
 
-        Segment(armem::server::MemoryToIceAdapter& iceMemory,
-                std::mutex& memoryMutex);
+        Segment(armem::server::MemoryToIceAdapter& iceMemory);
 
 
         void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
         void init();
         void connect(viz::Client arviz);
 
+        std::mutex& mutex() const;
+
         void loadByObjectFinder(const std::string& objectsPackage);
         void loadByObjectFinder(const ObjectFinder& finder);
         void loadByObjectFinder();
@@ -47,7 +48,6 @@ namespace armarx::armem::server::obj::clazz
 
         armem::server::MemoryToIceAdapter& iceMemory;
         armem::wm::CoreSegment* coreSegment = nullptr;
-        std::mutex& memoryMutex;
 
         ObjectFinder objectFinder;
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index db706075c9bd5431fefd2b04b7634cf5e8ff6747..95611ed7ac4f3317b136bd1f1f7924366d095929 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -42,9 +42,8 @@
 namespace armarx::armem::server::obj::instance
 {
 
-    Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter, std::mutex& memoryMutex) :
-        iceMemory(memoryToIceAdapter),
-        memoryMutex(memoryMutex)
+    Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) :
+        iceMemory(memoryToIceAdapter)
     {
         Logging::setTag("InstanceSegment");
 
@@ -123,6 +122,13 @@ namespace armarx::armem::server::obj::instance
     }
 
 
+    std::mutex& Segment::mutex() const
+    {
+        ARMARX_CHECK_NOT_NULL(coreSegment);
+        return coreSegment->mutex();
+    }
+
+
     Segment::CommitStats Segment::commitObjectPoses(
         const std::string& providerName,
         const objpose::data::ProvidedObjectPoseSeq& providedPoses,
@@ -973,7 +979,7 @@ namespace armarx::armem::server::obj::instance
 
                 if (lockMemory)
                 {
-                    std::scoped_lock lock(memoryMutex);
+                    std::scoped_lock lock(mutex());
                     commitSceneSnapshot(snapshot.value(), filename.string());
                 }
                 else
@@ -1038,7 +1044,7 @@ namespace armarx::armem::server::obj::instance
         {
             armem::obj::SceneSnapshot scene;
             {
-                std::scoped_lock lock(data.memoryMutex);
+                std::scoped_lock lock(data.mutex());
                 scene = data.getSceneSnapshot();
             }
             data.storeScene(storeLoadLine.getValue(), scene);
@@ -1047,7 +1053,7 @@ namespace armarx::armem::server::obj::instance
         if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged()
             || discardSnapshotsWhileAttached.hasValueChanged())
         {
-            std::scoped_lock lock(data.memoryMutex);
+            std::scoped_lock lock(data.mutex());
 
             if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged())
             {
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
index 3ec6a2f22f41569945cc0c0ed3f5fd0a4021241e..378cf02daac285c9998f30b7f98b42853a1ab7b4 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
@@ -50,16 +50,15 @@ namespace armarx::armem::server::obj::instance
 
     public:
 
-        Segment(server::MemoryToIceAdapter& iceMemory,
-                std::mutex& memoryMutex);
+        Segment(server::MemoryToIceAdapter& iceMemory);
 
 
         void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
-
         void init();
-
         void connect(viz::Client arviz);
 
+        std::mutex& mutex() const;
+
 
 
         CommitStats commitObjectPoses(
@@ -181,7 +180,6 @@ namespace armarx::armem::server::obj::instance
 
         server::MemoryToIceAdapter& iceMemory;
         wm::CoreSegment* coreSegment = nullptr;
-        std::mutex& memoryMutex;
 
 
         struct Properties
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
index e0577877f2ac9e9c7e97e8aaa50d99c438fe4c9f..7cd8b1202ac34600f8bfc6ecc912037b49d8bee6 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
@@ -37,17 +37,18 @@
 namespace armarx::armem::server::obj::instance
 {
 
-    SegmentAdapter::SegmentAdapter(MemoryToIceAdapter& iceMemory, std::mutex& memoryMutex) :
-        segment(iceMemory, memoryMutex),
-        memoryMutex(memoryMutex)
+    SegmentAdapter::SegmentAdapter(MemoryToIceAdapter& iceMemory) :
+        segment(iceMemory)
     {
     }
 
+
     std::string SegmentAdapter::getName() const
     {
         return Logging::tag.tagName;
     }
 
+
     void SegmentAdapter::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
     {
         calibration.defineProperties(defs, prefix + "calibration.");
@@ -56,6 +57,7 @@ namespace armarx::armem::server::obj::instance
         visu.defineProperties(defs, prefix + "visu.");
     }
 
+
     void SegmentAdapter::init()
     {
         segment.setTag(getName());
@@ -66,6 +68,7 @@ namespace armarx::armem::server::obj::instance
         segment.init();
     }
 
+
     void SegmentAdapter::connect(
         RobotStateComponentInterfacePrx robotStateComponent,
         VirtualRobot::RobotPtr robot,
@@ -97,6 +100,7 @@ namespace armarx::armem::server::obj::instance
         segment.connect(arviz);
     }
 
+
     void SegmentAdapter::reportProviderAvailable(const std::string& providerName, const objpose::ProviderInfo& info, const Ice::Current&)
     {
         updateProviderInfo(providerName, info);
@@ -120,7 +124,7 @@ namespace armarx::armem::server::obj::instance
             return;
         }
         {
-            std::scoped_lock lock(memoryMutex);
+            std::scoped_lock lock(segment.mutex());
             std::stringstream ss;
             for (const auto& id : info.supportedObjects)
             {
@@ -161,7 +165,7 @@ namespace armarx::armem::server::obj::instance
         }
 
         {
-            std::scoped_lock lock(memoryMutex);
+            std::scoped_lock lock(segment.mutex());
             RemoteRobot::synchronizeLocalClone(segment.robot, segment.robotStateComponent);
 
             if (segment.robot->hasRobotNode(calibration.robotNode))
@@ -215,7 +219,7 @@ namespace armarx::armem::server::obj::instance
         TIMING_START(tGetObjectPoses);
 
         TIMING_START(tGetObjectPosesLock);
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         TIMING_END_STREAM(tGetObjectPosesLock, ARMARX_VERBOSE);
 
         const IceUtil::Time now = TimeUtil::GetTime();
@@ -240,7 +244,7 @@ namespace armarx::armem::server::obj::instance
         TIMING_START(GetObjectPoses);
 
         TIMING_START(GetObjectPosesLock);
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         TIMING_END_STREAM(GetObjectPosesLock, ARMARX_VERBOSE);
 
         const IceUtil::Time now = TimeUtil::GetTime();
@@ -292,7 +296,7 @@ namespace armarx::armem::server::obj::instance
         }
         else
         {
-            std::scoped_lock lock(memoryMutex);
+            std::scoped_lock lock(segment.mutex());
             for (const auto& objectID : input.request.objectIDs)
             {
                 bool found = true;
@@ -336,27 +340,31 @@ namespace armarx::armem::server::obj::instance
         return output;
     }
 
+
     objpose::ProviderInfoMap SegmentAdapter::getAvailableProvidersInfo(const Ice::Current&)
     {
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         return segment.providers;
     }
 
+
     Ice::StringSeq SegmentAdapter::getAvailableProviderNames(const Ice::Current&)
     {
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         return simox::alg::get_keys(segment.providers);
     }
 
+
     objpose::ProviderInfo SegmentAdapter::getProviderInfo(const std::string& providerName, const Ice::Current&)
     {
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         return segment.getProviderInfo(providerName);
     }
 
+
     bool SegmentAdapter::hasProvider(const std::string& providerName, const Ice::Current&)
     {
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         return segment.providers.count(providerName) > 0;
     }
 
@@ -364,28 +372,30 @@ namespace armarx::armem::server::obj::instance
     objpose::AttachObjectToRobotNodeOutput SegmentAdapter::attachObjectToRobotNode(
         const objpose::AttachObjectToRobotNodeInput& input, const Ice::Current&)
     {
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         return segment.attachObjectToRobotNode(input);
     }
 
+
     objpose::DetachObjectFromRobotNodeOutput SegmentAdapter::detachObjectFromRobotNode(
         const objpose::DetachObjectFromRobotNodeInput& input, const Ice::Current&)
     {
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         return segment.detachObjectFromRobotNode(input);
     }
 
+
     objpose::DetachAllObjectsFromRobotNodesOutput SegmentAdapter::detachAllObjectsFromRobotNodes(
         const objpose::DetachAllObjectsFromRobotNodesInput& input, const Ice::Current&)
     {
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
         return segment.detachAllObjectsFromRobotNodes(input);
     }
 
 
     objpose::AgentFramesSeq SegmentAdapter::getAttachableFrames(const Ice::Current&)
     {
-        std::scoped_lock lock(memoryMutex);
+        std::scoped_lock lock(segment.mutex());
 
         objpose::AgentFramesSeq output;
         std::vector<VirtualRobot::RobotPtr> agents = { segment.robot };
@@ -398,6 +408,7 @@ namespace armarx::armem::server::obj::instance
         return output;
     }
 
+
     objpose::SignalHeadMovementOutput
     SegmentAdapter::signalHeadMovement(const objpose::SignalHeadMovementInput& input, const Ice::Current&)
     {
@@ -423,7 +434,7 @@ namespace armarx::armem::server::obj::instance
                     objpose::ObjectPoseMap objectPoses;
                     visu.minConfidence = -1;
                     {
-                        std::scoped_lock lock(memoryMutex);
+                        std::scoped_lock lock(segment.mutex());
 
                         const IceUtil::Time now = TimeUtil::GetTime();
 
@@ -493,6 +504,7 @@ namespace armarx::armem::server::obj::instance
         group.addChild(layout);
     }
 
+
     void SegmentAdapter::RemoteGui::update(SegmentAdapter& adapter)
     {
         // Non-atomic variables need to be guarded by a mutex if accessed by multiple threads
@@ -502,7 +514,7 @@ namespace armarx::armem::server::obj::instance
         }
         this->segment.update(adapter.segment);
         {
-            std::scoped_lock lock(adapter.memoryMutex);
+            std::scoped_lock lock(adapter.segment.mutex());
             this->decay.update(adapter.segment.decay);
         }
         {
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h
index a1e356e53c77608937b0df952798d0427a3cc86b..353f2e0644dc044edfd1f260a76eb0c5d7857a11 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h
@@ -55,7 +55,7 @@ namespace armarx::armem::server::obj::instance
     {
     public:
 
-        SegmentAdapter(MemoryToIceAdapter& iceMemory, std::mutex& memoryMutex);
+        SegmentAdapter(MemoryToIceAdapter& iceMemory);
 
         std::string getName() const;
         void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
@@ -127,7 +127,6 @@ namespace armarx::armem::server::obj::instance
         DebugObserverInterfacePrx debugObserver;
 
         instance::Segment segment;
-        std::mutex& memoryMutex;
 
         instance::RobotHeadMovement robotHead;
         std::mutex robotHeadMutex;