diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index ae63606b77d4a4afa13e574f43f27ad8dc0f6f70..501500e6720612b68554ea7a1bcdc296129a3548 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -105,6 +105,7 @@ set(LIB_FILES
     server/RemoteGuiAronDataVisitor.cpp
 
     server/segment/SpecializedSegment.cpp
+
     server/query_proc/base/BaseQueryProcessorBase.cpp
     server/query_proc/base/EntityQueryProcessorBase.cpp
     server/query_proc/base/ProviderSegmentQueryProcessorBase.cpp
@@ -227,6 +228,7 @@ set(LIB_HEADERS
     server/RemoteGuiAronDataVisitor.h
 
     server/segment/SpecializedSegment.h
+
     server/query_proc.h
     server/query_proc/base/BaseQueryProcessorBase.h
     server/query_proc/base/EntityQueryProcessorBase.h
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
index a1f678d523c5db79dc163a05e013d8fc0875fa8e..22608257c1abcf39340643870b704c2dadfcd54d 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
@@ -3,9 +3,11 @@
 #include <RobotAPI/libraries/aron/core/Exception.h>
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
 #include <RobotAPI/libraries/ArmarXObjects/aron_conversions.h>
+#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 #include <RobotAPI/libraries/armem_objects/aron_conversions.h>
+#include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
 
-#include <ArmarXCore/core/Component.h>
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
 
 #include <SimoxUtility/color/Color.h>
@@ -20,16 +22,20 @@ namespace armarx::armem::server::obj::clazz
 {
 
     Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) :
-        iceMemory(memoryToIceAdapter)
+        SpecializedSegment(memoryToIceAdapter,
+                           arondto::ObjectClass::toAronType(), "Class", -1)
+    {
+    }
+
+
+    Segment::~Segment()
     {
-        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.");
-        defs->optional(p.maxHistorySize, prefix + "MaxHistorySize", "Maximal size of object poses history (-1 for infinite).");
+        SpecializedSegment::defineProperties(defs, prefix);
 
         defs->optional(p.objectsPackage, prefix + "ObjectsPackage", "Name of the objects package to load from.");
         defs->optional(p.loadFromObjectsPackage, prefix + "LoadFromObjectsPackage",
@@ -41,10 +47,7 @@ namespace armarx::armem::server::obj::clazz
 
     void Segment::init()
     {
-        ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
-
-        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, arondto::ObjectClass::toAronType());
-        coreSegment->setMaxHistorySize(p.maxHistorySize);
+        SpecializedSegment::init();
 
         if (p.loadFromObjectsPackage)
         {
@@ -62,13 +65,6 @@ 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));
@@ -244,9 +240,9 @@ namespace armarx::armem::server::obj::clazz
 
         reloadButton.setLabel("Reload");
 
-        maxHistorySize.setValue(std::max(1, int(segment.p.maxHistorySize)));
+        maxHistorySize.setValue(std::max(1, int(segment.properties.maxHistorySize)));
         maxHistorySize.setRange(1, 1e6);
-        infiniteHistory.setValue(segment.p.maxHistorySize == -1);
+        infiniteHistory.setValue(segment.properties.maxHistorySize == -1);
 
         GridLayout grid;
         int row = 0;
@@ -274,10 +270,10 @@ namespace armarx::armem::server::obj::clazz
         if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged())
         {
             std::scoped_lock lock(segment.mutex());
-            segment.p.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
+            segment.properties.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
             if (segment.coreSegment)
             {
-                segment.coreSegment->setMaxHistorySize(long(segment.p.maxHistorySize));
+                segment.coreSegment->setMaxHistorySize(long(segment.properties.maxHistorySize));
             }
         }
     }
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
index 03dce0e9a1214060778ada2bf98ea2b872aa28cb..15c7c4f373f20c43c0febfb142675c5058c45909 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
@@ -3,9 +3,6 @@
 #include <mutex>
 #include <string>
 
-#include <ArmarXCore/core/logging/Logging.h>
-#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
-
 #include <ArmarXGui/libraries/RemoteGui/Client/Widgets.h>
 
 #include <RobotAPI/components/ArViz/Client/Client.h>
@@ -13,26 +10,29 @@
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 
 #include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
-#include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
+#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
 #include <RobotAPI/libraries/armem_objects/server/class/FloorVis.h>
 
 
+namespace armarx::armem::arondto
+{
+    class ObjectClass;
+}
 namespace armarx::armem::server::obj::clazz
 {
 
-    class Segment : public armarx::Logging
+    class Segment : public segment::SpecializedSegment
     {
     public:
 
         Segment(armem::server::MemoryToIceAdapter& iceMemory);
+        virtual ~Segment() override;
 
 
-        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
-        void init();
+        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override;
+        void init() override;
         void connect(viz::Client arviz);
 
-        std::mutex& mutex() const;
 
         void loadByObjectFinder(const std::string& objectsPackage);
         void loadByObjectFinder(const ObjectFinder& finder);
@@ -46,9 +46,6 @@ namespace armarx::armem::server::obj::clazz
 
     private:
 
-        armem::server::MemoryToIceAdapter& iceMemory;
-        armem::wm::CoreSegment* coreSegment = nullptr;
-
         ObjectFinder objectFinder;
 
         viz::Client arviz;
@@ -57,9 +54,6 @@ namespace armarx::armem::server::obj::clazz
 
         struct Properties
         {
-            std::string coreSegmentName = "Class";
-            long maxHistorySize = -1;
-
             std::string objectsPackage = ObjectFinder::DefaultObjectsPackageName;
             bool loadFromObjectsPackage = true;
         };
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 1a18f84a14dbfdd35ec97eed0d6dd152ae9793d4..09a412f4bfa40a1a6288e86dfe65fa8b50953061 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -1,6 +1,7 @@
 #include "Segment.h"
 
 #include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
 #include <RobotAPI/libraries/armem_objects/aron_conversions.h>
 #include <RobotAPI/libraries/armem_objects/SceneSnapshot.h>
 
@@ -10,6 +11,7 @@
 #include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
+#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 #include <RobotAPI/libraries/armem/util/util.h>
 
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
@@ -43,10 +45,9 @@ namespace armarx::armem::server::obj::instance
 {
 
     Segment::Segment(armem::server::MemoryToIceAdapter& memoryToIceAdapter) :
-        iceMemory(memoryToIceAdapter)
+        SpecializedSegment(memoryToIceAdapter,
+                           arondto::ObjectInstance::toAronType(), "Instance", 64)
     {
-        Logging::setTag("InstanceSegment");
-
         oobbCache.setFetchFn([this](const ObjectID & id) -> std::optional<simox::OrientedBoxf>
         {
             // Try to get OOBB from repository.
@@ -78,10 +79,15 @@ namespace armarx::armem::server::obj::instance
     }
 
 
+    Segment::~Segment()
+    {
+    }
+
+
     void Segment::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
     {
-        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).");
+        SpecializedSegment::defineProperties(defs, prefix);
+
         defs->optional(p.discardSnapshotsWhileAttached, prefix + "DiscardSnapshotsWhileAttached",
                        "If true, no new snapshots are stored while an object is attached to a robot node.\n"
                        "If false, new snapshots are stored, but the attachment is kept in the new snapshots.");
@@ -101,10 +107,7 @@ namespace armarx::armem::server::obj::instance
 
     void Segment::init()
     {
-        ARMARX_CHECK_NOT_NULL(iceMemory.workingMemory);
-
-        coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegmentName, arondto::ObjectInstance::toAronType());
-        coreSegment->setMaxHistorySize(p.maxHistorySize);
+        SpecializedSegment::init();
 
         if (not p.sceneSnapshotToLoad.empty())
         {
@@ -113,6 +116,7 @@ namespace armarx::armem::server::obj::instance
         }
     }
 
+
     void Segment::connect(viz::Client arviz)
     {
         (void) arviz;
@@ -122,12 +126,6 @@ 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,
@@ -994,9 +992,9 @@ namespace armarx::armem::server::obj::instance
     {
         using namespace armarx::RemoteGui::Client;
 
-        maxHistorySize.setValue(std::max(1, int(data.p.maxHistorySize)));
+        maxHistorySize.setValue(std::max(1, int(data.properties.maxHistorySize)));
         maxHistorySize.setRange(1, 1e6);
-        infiniteHistory.setValue(data.p.maxHistorySize == -1);
+        infiniteHistory.setValue(data.properties.maxHistorySize == -1);
         discardSnapshotsWhileAttached.setValue(data.p.discardSnapshotsWhileAttached);
 
         storeLoadLine.setValue("Scene_" + timestampPlaceholder);
@@ -1056,10 +1054,10 @@ namespace armarx::armem::server::obj::instance
 
             if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged())
             {
-                segment.p.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
+                segment.properties.maxHistorySize = infiniteHistory.getValue() ? -1 : maxHistorySize.getValue();
                 if (segment.coreSegment)
                 {
-                    segment.coreSegment->setMaxHistorySize(long(segment.p.maxHistorySize));
+                    segment.coreSegment->setMaxHistorySize(long(segment.properties.maxHistorySize));
                 }
             }
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
index 378cf02daac285c9998f30b7f98b42853a1ab7b4..918a4efade3c596763d90fec427b18fa78a774bf 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
@@ -10,32 +10,35 @@
 
 #include <ArmarXCore/core/logging/Logging.h>
 
-#include "RobotAPI/components/ArViz/Client/Client.h"
 #include <RobotAPI/interface/core/RobotState.h>
 #include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h>
 
+#include <RobotAPI/components/ArViz/Client/Client.h>
+
 #include <RobotAPI/libraries/ArmarXObjects/ObjectID.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 
 #include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
-#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
-
-#include "Decay.h"
+#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
 
 #include "ArticulatedObjectVisu.h"
+#include "Decay.h"
 
 
 namespace armarx::armem::obj
 {
     struct SceneSnapshot;
 }
+namespace armarx::armem::arondto
+{
+    class ObjectInstance;
+}
 
 namespace armarx::armem::server::obj::instance
 {
 
-    class Segment : public armarx::Logging
+    class Segment : public segment::SpecializedSegment
     {
     public:
 
@@ -51,14 +54,13 @@ namespace armarx::armem::server::obj::instance
     public:
 
         Segment(server::MemoryToIceAdapter& iceMemory);
+        virtual ~Segment() override;
 
 
-        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
-        void init();
+        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") override;
+        void init() override;
         void connect(viz::Client arviz);
 
-        std::mutex& mutex() const;
-
 
 
         CommitStats commitObjectPoses(
@@ -178,15 +180,8 @@ namespace armarx::armem::server::obj::instance
 
     private:
 
-        server::MemoryToIceAdapter& iceMemory;
-        wm::CoreSegment* coreSegment = nullptr;
-
-
         struct Properties
         {
-            std::string coreSegmentName = "Instance";
-            // -1 would be infinite, but this can let the RAM grow quickly.
-            long maxHistorySize = 25;
             bool discardSnapshotsWhileAttached = true;
 
             /// Package containing the scene snapshots
@@ -207,6 +202,7 @@ namespace armarx::armem::server::obj::instance
 
         static const std::string timestampPlaceholder;
 
+
     public:
 
         struct RemoteGui
@@ -225,7 +221,9 @@ namespace armarx::armem::server::obj::instance
             void update(Segment& data);
         };
 
+
     private:
+
         std::unique_ptr<ArticulatedObjectVisu> visu;
 
     };