diff --git a/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp
index f723f30b2eb2d704dcfae73f47e9351cf659b7ad..e5e91c3093e84237c832a85c84b79e8ebe183cab 100644
--- a/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp
@@ -25,50 +25,42 @@ namespace armarx::armem::attachment
     namespace
     {
 
-        template<typename AronClass, typename ArmemClass>
+        template <typename AronClass, typename ArmemClass>
         auto getAttachments(const armarx::armem::wm::Memory& memory)
         {
             // using ArmemClass = decltype(fromAron(AronClass()));
             using ArmemClassVector = std::vector<ArmemClass>;
 
             ArmemClassVector attachments;
-
-            for (const auto&[_, coreSegment] : memory.coreSegments())
+            memory.forEachEntity([&attachments](const wm::Entity & entity)
             {
-                for (const auto& [providerName, providerSegment] : coreSegment.providerSegments())
+                if (entity.empty())
                 {
-                    for (const auto& [name, entity] : providerSegment.entities())
+                    ARMARX_WARNING << "No entity snapshot found";
+                    return true;
+                }
+
+                const armem::wm::EntityInstance& instance = entity.getFirstSnapshot().getInstance(0);
+                try
+                {
+                    AronClass aronAttachment;
+                    aronAttachment.fromAron(instance.data());
+
+                    ArmemClass attachment;
+                    fromAron(aronAttachment, attachment);
+
+                    if (attachment.active)
                     {
-                        if (entity.empty())
-                        {
-                            ARMARX_WARNING << "No entity found";
-                            continue;
-                        }
-
-                        const auto entitySnapshots = simox::alg::get_values(entity.history());
-                        const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0);
-
-                        try
-                        {
-                            AronClass aronAttachment;
-                            aronAttachment.fromAron(instance.data());
-
-                            ArmemClass attachment;
-                            fromAron(aronAttachment, attachment);
-
-                            if (attachment.active)
-                            {
-                                attachments.push_back(attachment);
-                            }
-
-                        }
-                        catch (const armarx::aron::error::AronException&)
-                        {
-                            continue;
-                        }
+                        attachments.push_back(attachment);
                     }
+
                 }
-            }
+                catch (const armarx::aron::error::AronException&)
+                {
+                    return true;
+                }
+                return true;
+            });
 
             return attachments;
         }
@@ -131,7 +123,9 @@ namespace armarx::armem::attachment
             return {};
         }
 
-        return getAttachments<::armarx::armem::arondto::attachment::ObjectAttachment, ::armarx::armem::attachment::ObjectAttachment>(qResult.memory);
+        return getAttachments <
+               ::armarx::armem::arondto::attachment::ObjectAttachment,
+               ::armarx::armem::attachment::ObjectAttachment > (qResult.memory);
     }
 
     std::vector<ObjectAttachment> Reader::queryObjectAttachments(const armem::Time& timestamp, const std::string& providerName) const
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 09a412f4bfa40a1a6288e86dfe65fa8b50953061..15a5776196fb9589d26ee27a1950152bf7c8e422 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -786,16 +786,23 @@ namespace armarx::armem::server::obj::instance
         const ObjectID classID = { objectID.dataset(), objectID.className() };
         try
         {
-            for (const auto& [_, provSeg] : iceMemory.workingMemory->getCoreSegment("Class"))
+            std::optional<wm::EntityInstance> result;
+            iceMemory.workingMemory->getCoreSegment("Class").forEachProviderSegment(
+                [&classID, &result](const wm::ProviderSegment & provSeg)
             {
                 if (provSeg.hasEntity(classID.str()))
                 {
-                    return provSeg.getEntity(classID.str()).getLatestSnapshot().getInstance(0);
+                    result = provSeg.getEntity(classID.str()).getLatestSnapshot().getInstance(0);
+                    return false;
                 }
-            }
+                return true;
+            });
 
-            ARMARX_WARNING << "No provider segment for classID " << classID.str() << " found";
-            return std::nullopt;
+            if (not result.has_value())
+            {
+                ARMARX_WARNING << "No provider segment for classID " << classID.str() << " found";
+            }
+            return result;
         }
         catch (const armem::error::ArMemError& e)
         {
diff --git a/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp b/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp
index 9c46b0c4729dfe6ca038c1f31ef81255f56d4968..61eeb6fffed87ea4ed83c6dccfc00812df81b7ef 100644
--- a/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp
@@ -124,11 +124,10 @@ namespace armarx::armem::vision::laser_scans::client
     }
 
     std::vector<LaserScanStamped>
-    asLaserScans(const std::map<std::string, wm::Entity>& entities)
+    asLaserScans(const wm::ProviderSegment& providerSegment)
     {
         std::vector<LaserScanStamped> outV;
-
-        if (entities.empty())
+        if (providerSegment.empty())
         {
             ARMARX_WARNING << "No entities!";
         }
@@ -153,29 +152,25 @@ namespace armarx::armem::vision::laser_scans::client
         };
 
         // loop over all entities and their snapshots
-        for (const auto& [s, entity] : entities)
+        providerSegment.forEachEntity([&outV, &convert](const wm::Entity & entity)
         {
+            // If we don't need this warning, we could directly iterate over the snapshots.
             if (entity.empty())
             {
-                ARMARX_WARNING << "Empty history for " << s;
+                ARMARX_WARNING << "Empty history for " << entity.id();
             }
-
             ARMARX_DEBUG << "History size: " << entity.size();
 
-            for (const auto& [ss, entitySnapshot] : entity)
+            entity.forEachInstance([&outV, &convert](const wm::EntityInstance & entityInstance)
             {
-                for (const auto& entityInstance : entitySnapshot.instances())
+                if (const auto o = tryCast<arondto::LaserScanStamped>(entityInstance))
                 {
-                    const auto o =
-                        tryCast<arondto::LaserScanStamped>(entityInstance);
-
-                    if (o)
-                    {
-                        outV.push_back(convert(*o, entityInstance));
-                    }
+                    outV.push_back(convert(*o, entityInstance));
                 }
-            }
-        }
+                return true;
+            });
+            return true;
+        });
 
         return outV;
     }
@@ -202,13 +197,16 @@ namespace armarx::armem::vision::laser_scans::client
         }
 
         // now create result from memory
-        const auto& entities =
-            qResult.memory.getCoreSegment(properties.memoryName)
-            .getProviderSegment(query.agent)
-            .entities();
+        const wm::ProviderSegment& providerSegment =
+            qResult.memory.getCoreSegment(properties.memoryName).getProviderSegment(query.agent);
 
-        const auto laserScans = asLaserScans(entities);
-        const auto sensors    = simox::alg::get_keys(entities);
+        const auto laserScans = asLaserScans(providerSegment);
+        std::vector<std::string> sensors;
+        providerSegment.forEachEntity([&sensors](const wm::Entity & entity)
+        {
+            sensors.push_back(entity.name());
+            return true;
+        });
 
         return {.laserScans   = laserScans,
                 .sensors      = sensors,