From 5eab55679d2263520c8c1bc334c8f4e81a207c23 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 5 Aug 2021 16:41:24 +0200
Subject: [PATCH] Add handling of void forEach() functors, update includes, add
 tests

---
 .../ArticulatedObjectLocalizerExample.cpp     |  2 +-
 .../ArticulatedObjectLocalizerExample.h       |  2 +-
 .../ExampleMemoryClient.cpp                   |  6 +-
 .../ExampleMemoryClient/ExampleMemoryClient.h |  2 +-
 .../VirtualRobotReaderExampleClient.cpp       |  2 +-
 .../VirtualRobotReaderExampleClient.h         |  2 +-
 .../server/SkillsMemory/SkillsMemory.cpp      |  2 +-
 .../ObjectPoseGuiWidgetController.cpp         |  8 +-
 .../objectpose/ObjectPoseStorageInterface.ice |  6 +-
 .../RobotAPI/libraries/armem/client/Query.cpp |  2 +-
 .../RobotAPI/libraries/armem/client/Query.h   |  4 +-
 .../libraries/armem/client/Reader.cpp         | 38 ++++-----
 .../RobotAPI/libraries/armem/client/Reader.h  |  3 +-
 .../RobotAPI/libraries/armem/client/Writer.h  |  2 +-
 .../armem/client/query/selectors.cpp          |  2 +-
 source/RobotAPI/libraries/armem/core.h        |  8 +-
 .../armem/core/base/detail/iteration_mixins.h | 26 ++++++-
 .../armem/core/diskmemory/CoreSegment.h       |  4 +-
 .../libraries/armem/core/diskmemory/Entity.h  |  4 +-
 .../armem/core/diskmemory/EntityInstance.cpp  |  6 +-
 .../armem/core/diskmemory/EntityInstance.h    |  4 +-
 .../armem/core/diskmemory/EntitySnapshot.h    |  4 +-
 .../libraries/armem/core/diskmemory/Memory.h  |  4 +-
 .../armem/core/diskmemory/ProviderSegment.h   |  4 +-
 .../armem/core/longtermmemory/CoreSegment.h   |  4 +-
 .../armem/core/longtermmemory/Entity.h        |  4 +-
 .../core/longtermmemory/EntitySnapshot.cpp    |  4 +-
 .../core/longtermmemory/EntitySnapshot.h      |  4 +-
 .../armem/core/longtermmemory/Memory.h        |  4 +-
 .../core/longtermmemory/ProviderSegment.h     |  4 +-
 .../libraries/armem/core/operations.cpp       |  4 +-
 .../libraries/armem/core/operations.h         | 10 +--
 .../libraries/armem/server/ComponentPlugin.h  |  2 +-
 .../libraries/armem/server/MemoryRemoteGui.h  |  2 +-
 .../armem/server/MemoryToIceAdapter.cpp       |  2 +-
 .../armem/server/MemoryToIceAdapter.h         |  2 +-
 .../CoreSegmentQueryProcessor.cpp             |  2 +-
 .../workingmemory/CoreSegmentQueryProcessor.h |  2 +-
 .../workingmemory/EntityQueryProcessor.cpp    |  2 +-
 .../workingmemory/EntityQueryProcessor.h      |  2 +-
 .../workingmemory/MemoryQueryProcessor.h      |  2 +-
 .../ProviderSegmentQueryProcessor.cpp         |  2 +-
 .../ProviderSegmentQueryProcessor.h           |  2 +-
 .../libraries/armem/test/ArMemForEachTest.cpp | 19 ++++-
 .../armem/test/ArMemIceConversionsTest.cpp    |  2 +-
 .../libraries/armem/test/ArMemLTMTest.cpp     |  4 +-
 .../libraries/armem/test/ArMemMemoryTest.cpp  |  2 +-
 .../armem/test/ArMemQueryBuilderTest.cpp      |  7 +-
 source/RobotAPI/libraries/armem/util/util.h   |  3 +-
 .../libraries/armem_gui/MemoryViewer.cpp      |  2 +-
 .../armem_gui/instance/InstanceView.h         |  2 +-
 .../armem_gui/instance/InstanceViewList.h     |  2 +-
 .../libraries/armem_gui/memory/TreeWidget.h   |  2 +-
 .../MotionDatabase/MDBMotions/Segment.cpp     |  5 +-
 .../ArticulatedObjectReader.cpp               |  2 +-
 .../client/articulated_object/Reader.cpp      |  2 +-
 .../client/articulated_object/utils.h         |  2 +-
 .../client/attachment/Reader.cpp              |  2 +-
 .../server/attachments/Segment.cpp            |  1 -
 .../armem_objects/server/class/FloorVis.cpp   |  2 +-
 .../armem_objects/server/class/Segment.h      |  2 +-
 .../armem_objects/server/instance/Segment.cpp | 77 +++++++------------
 .../armem_objects/server/instance/Segment.h   |  2 +-
 .../armem_robot/robot_conversions.cpp         |  2 +-
 .../client/common/RobotReader.cpp             | 63 +++++++--------
 .../client/localization/TransformReader.cpp   |  6 +-
 .../client/localization/TransformWriter.cpp   |  6 +-
 .../common/localization/TransformHelper.cpp   | 12 +--
 .../common/localization/TransformHelper.h     |  3 +-
 .../server/description/Segment.cpp            |  1 -
 .../server/localization/Segment.cpp           |  1 -
 .../server/proprioception/Segment.cpp         |  1 -
 .../client/laser_scans/Reader.cpp             | 12 ++-
 .../client/laser_scans/Writer.cpp             |  2 +-
 .../client/occupancy_grid/Reader.cpp          | 44 +++++------
 .../client/occupancy_grid/Reader.h            |  6 +-
 .../client/occupancy_grid/Writer.cpp          |  5 +-
 .../client/occupancy_grid/Writer.h            |  4 +-
 78 files changed, 243 insertions(+), 274 deletions(-)

diff --git a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
index 487c9c6fc..72e5b8f33 100644
--- a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
+++ b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
@@ -42,7 +42,7 @@
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h>
 #include <RobotAPI/libraries/armem_objects/types.h>
 
diff --git a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.h b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.h
index f85a804e9..b4cab3fc7 100644
--- a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.h
+++ b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.h
@@ -14,7 +14,7 @@
 #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
 #include <RobotAPI/interface/armem/server/MemoryInterface.h>
 #include <RobotAPI/libraries/armem/client/ComponentPlugin.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.h>
 #include <RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h>
 
diff --git a/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.cpp b/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.cpp
index b0c45c182..036d27d2b 100644
--- a/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.cpp
+++ b/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.cpp
@@ -34,7 +34,7 @@
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
 #include <RobotAPI/libraries/armem/core/error.h>
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 #include <RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.aron.generated.h>
 
@@ -263,14 +263,14 @@ namespace armarx
             ARMARX_IMPORTANT << "Getting entity via ID";
 
             armem::wm::Memory& memory = qResult.memory;
-            ARMARX_CHECK_EQUAL(memory.size(), 1);
+            ARMARX_CHECK_GREATER_EQUAL(memory.size(), 1);
 
             const armem::wm::Entity* entity = memory.findEntity(entityID);
             ARMARX_CHECK_NOT_NULL(entity);
             ARMARX_CHECK_GREATER_EQUAL(entity->size(), 1);
 
             const armem::wm::EntitySnapshot& snapshot = entity->getLatestSnapshot();
-            ARMARX_CHECK_EQUAL(snapshot.size(), 1);
+            ARMARX_CHECK_GREATER_EQUAL(snapshot.size(), 1);
 
             ARMARX_INFO << "Result: "
                         << "\n- entity:       \t" << entity->name()
diff --git a/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.h b/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.h
index 5680e316a..ca28ab86b 100644
--- a/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.h
+++ b/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.h
@@ -34,7 +34,7 @@
 #include <RobotAPI/interface/armem/server/MemoryInterface.h>
 #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
 #include <RobotAPI/libraries/armem/client/ComponentPlugin.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 
 namespace armarx
diff --git a/source/RobotAPI/components/armem/client/VirtualRobotReaderExampleClient/VirtualRobotReaderExampleClient.cpp b/source/RobotAPI/components/armem/client/VirtualRobotReaderExampleClient/VirtualRobotReaderExampleClient.cpp
index 6650e5737..8ab75efc7 100644
--- a/source/RobotAPI/components/armem/client/VirtualRobotReaderExampleClient/VirtualRobotReaderExampleClient.cpp
+++ b/source/RobotAPI/components/armem/client/VirtualRobotReaderExampleClient/VirtualRobotReaderExampleClient.cpp
@@ -23,7 +23,7 @@
 
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 
diff --git a/source/RobotAPI/components/armem/client/VirtualRobotReaderExampleClient/VirtualRobotReaderExampleClient.h b/source/RobotAPI/components/armem/client/VirtualRobotReaderExampleClient/VirtualRobotReaderExampleClient.h
index 4e1d01f55..33770ad54 100644
--- a/source/RobotAPI/components/armem/client/VirtualRobotReaderExampleClient/VirtualRobotReaderExampleClient.h
+++ b/source/RobotAPI/components/armem/client/VirtualRobotReaderExampleClient/VirtualRobotReaderExampleClient.h
@@ -33,7 +33,7 @@
 #include <RobotAPI/interface/armem/server/MemoryInterface.h>
 #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
 #include <RobotAPI/libraries/armem/client/ComponentPlugin.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include <RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h>
 
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
index c0a9fd2f3..098fe6f1d 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
@@ -29,7 +29,7 @@
 #include <ArmarXCore/core/logging/Logging.h>
 
 #include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h>
 
 #include <RobotAPI/libraries/armem_skills/aron_conversions.h>
diff --git a/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.cpp b/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.cpp
index dffe7711d..adb7c77bd 100644
--- a/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.cpp
@@ -201,7 +201,7 @@ namespace armarx
         {
             bool expand = item->childCount() == 0;
 
-            TreeWidgetBuilder builder(objectPoses);
+            TreeWidgetBuilder<objpose::ObjectPose> builder;
             builder.setNameFn([](const objpose::ObjectPose & pose)
             {
                 return pose.objectID.str();
@@ -245,7 +245,7 @@ namespace armarx
 
                 return true;
             });
-            builder.updateTree(item, objectPoses);
+            builder.updateTreeWithContainer(item, objectPoses);
 
             if (expand)
             {
@@ -299,7 +299,7 @@ namespace armarx
         {
             (void) dataset;
 
-            TreeWidgetBuilder builder(datasetData);
+            TreeWidgetBuilder<std::pair<std::string, std::string>> builder;
             builder.setCompareFn([](const std::pair<std::string, std::string>& lhs, QTreeWidgetItem * item)
             {
                 auto rhs = std::make_pair(item->text(0).toStdString(), item->text(1).toStdString());
@@ -324,7 +324,7 @@ namespace armarx
                 }
                 return true;
             });
-            builder.updateTree(datasetItem, datasetData);
+            builder.updateTreeWithContainer(datasetItem, datasetData);
 
             return true;
         });
diff --git a/source/RobotAPI/interface/objectpose/ObjectPoseStorageInterface.ice b/source/RobotAPI/interface/objectpose/ObjectPoseStorageInterface.ice
index 3097f6c75..1dfe8b9f2 100644
--- a/source/RobotAPI/interface/objectpose/ObjectPoseStorageInterface.ice
+++ b/source/RobotAPI/interface/objectpose/ObjectPoseStorageInterface.ice
@@ -81,7 +81,7 @@ module armarx
         };
         struct AttachObjectToRobotNodeOutput
         {
-            bool success;
+            bool success = false;
             data::ObjectAttachmentInfo attachment;
         };
 
@@ -99,7 +99,7 @@ module armarx
         struct DetachObjectFromRobotNodeOutput
         {
             /// Whether the object was attached before.
-            bool wasAttached;
+            bool wasAttached = false;
         };
 
         struct DetachAllObjectsFromRobotNodesInput
@@ -113,7 +113,7 @@ module armarx
         struct DetachAllObjectsFromRobotNodesOutput
         {
             /// Number of objects that have been detached.
-            int numDetached;
+            int numDetached = 0;
         };
 
         struct AgentFrames
diff --git a/source/RobotAPI/libraries/armem/client/Query.cpp b/source/RobotAPI/libraries/armem/client/Query.cpp
index 1777839f2..52000cf3d 100644
--- a/source/RobotAPI/libraries/armem/client/Query.cpp
+++ b/source/RobotAPI/libraries/armem/client/Query.cpp
@@ -1,6 +1,6 @@
 #include "Query.h"
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 namespace armarx::armem::client
 {
diff --git a/source/RobotAPI/libraries/armem/client/Query.h b/source/RobotAPI/libraries/armem/client/Query.h
index c6bb445bf..56b9caa79 100644
--- a/source/RobotAPI/libraries/armem/client/Query.h
+++ b/source/RobotAPI/libraries/armem/client/Query.h
@@ -3,10 +3,10 @@
 // RobotAPI
 #include <RobotAPI/interface/armem/query.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 #include <RobotAPI/libraries/armem/core/SuccessHeader.h>
 #include <RobotAPI/libraries/armem/core/DataMode.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 
 namespace armarx::armem::client::query
diff --git a/source/RobotAPI/libraries/armem/client/Reader.cpp b/source/RobotAPI/libraries/armem/client/Reader.cpp
index a589512f1..1f0e2ee51 100644
--- a/source/RobotAPI/libraries/armem/client/Reader.cpp
+++ b/source/RobotAPI/libraries/armem/client/Reader.cpp
@@ -6,9 +6,8 @@
 
 #include <RobotAPI/libraries/armem/core/MemoryID_operators.h>
 #include <RobotAPI/libraries/armem/core/longtermmemory/Memory.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/visitor.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 #include <RobotAPI/libraries/armem/util/util.h>
 
 #include "query/Builder.h"
@@ -162,30 +161,25 @@ namespace armarx::armem::client
     }
 
 
-    struct FindLatestSnapshotVisitor : public wm::Visitor
-    {
-        std::optional<wm::EntitySnapshot> latest = std::nullopt;
-
-        bool visitEnter(const wm::EntitySnapshot& snapshot) override;
-    };
-    bool FindLatestSnapshotVisitor::visitEnter(const wm::EntitySnapshot& snapshot)
-    {
-        if (not latest.has_value() or snapshot.time() < latest->time())
-        {
-            latest = snapshot;
-        }
-        return true;
-    }
-
-
     std::optional<wm::EntitySnapshot> Reader::getLatestSnapshotIn(const MemoryID& id, DataMode dataMode) const
     {
         client::QueryResult result = getLatestSnapshotsIn(id, dataMode);
         if (result.success)
         {
-            FindLatestSnapshotVisitor visitor;
-            visitor.applyTo(result.memory);
-            return visitor.latest;
+            std::optional<wm::EntitySnapshot> latest = std::nullopt;
+            result.memory.forEachEntity([&latest](const wm::Entity & entity)
+            {
+                if (not entity.empty())
+                {
+                    const wm::EntitySnapshot& snapshot = entity.getLatestSnapshot();
+                    if (not latest.has_value() or latest->time() < snapshot.time())
+                    {
+                        latest = snapshot;
+                    }
+                }
+                return true;
+            });
+            return latest;
         }
         else
         {
diff --git a/source/RobotAPI/libraries/armem/client/Reader.h b/source/RobotAPI/libraries/armem/client/Reader.h
index 1d69491d2..e9ee1b69a 100644
--- a/source/RobotAPI/libraries/armem/client/Reader.h
+++ b/source/RobotAPI/libraries/armem/client/Reader.h
@@ -8,8 +8,7 @@
 // RobotAPI
 #include <RobotAPI/interface/armem/server/ReadingMemoryInterface.h>
 #include <RobotAPI/interface/armem/server/StoringMemoryInterface.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/EntitySnapshot.h>
-// #include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include "Query.h"
 
diff --git a/source/RobotAPI/libraries/armem/client/Writer.h b/source/RobotAPI/libraries/armem/client/Writer.h
index dd953fa36..92c7ce04a 100644
--- a/source/RobotAPI/libraries/armem/client/Writer.h
+++ b/source/RobotAPI/libraries/armem/client/Writer.h
@@ -2,7 +2,7 @@
 
 #include <RobotAPI/interface/armem/server/WritingMemoryInterface.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 
 namespace armarx::armem::client
diff --git a/source/RobotAPI/libraries/armem/client/query/selectors.cpp b/source/RobotAPI/libraries/armem/client/query/selectors.cpp
index 98e79d06a..ecd3f8c5f 100644
--- a/source/RobotAPI/libraries/armem/client/query/selectors.cpp
+++ b/source/RobotAPI/libraries/armem/client/query/selectors.cpp
@@ -1,7 +1,7 @@
 #include "selectors.h"
 #include "RobotAPI/libraries/armem/core/ice_conversions.h"
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 
 namespace dq = ::armarx::armem::query::data;
diff --git a/source/RobotAPI/libraries/armem/core.h b/source/RobotAPI/libraries/armem/core.h
index c8ddee31c..11abe789b 100644
--- a/source/RobotAPI/libraries/armem/core.h
+++ b/source/RobotAPI/libraries/armem/core.h
@@ -6,13 +6,7 @@
 #include "core/MemoryID.h"
 #include "core/Time.h"
 
-#include "core/workingmemory/Memory.h"
-#include "core/workingmemory/CoreSegment.h"
-#include "core/workingmemory/ProviderSegment.h"
-#include "core/workingmemory/Entity.h"
-#include "core/workingmemory/EntitySnapshot.h"
-#include "core/workingmemory/EntityInstance.h"
-#include "core/workingmemory/ice_conversions.h"
+#include "core/wm.h"
 
 
 namespace armarx::armem
diff --git a/source/RobotAPI/libraries/armem/core/base/detail/iteration_mixins.h b/source/RobotAPI/libraries/armem/core/base/detail/iteration_mixins.h
index 9a6f7e53b..189c33799 100644
--- a/source/RobotAPI/libraries/armem/core/base/detail/iteration_mixins.h
+++ b/source/RobotAPI/libraries/armem/core/base/detail/iteration_mixins.h
@@ -15,13 +15,21 @@ namespace armarx::armem::base::detail
     {
         for (auto& child : container)
         {
-            if (!func(child))
+            if constexpr(std::is_same_v<decltype(func(child)), bool>)
             {
-                return false;
+                if (!func(child))
+                {
+                    return false;
+                }
+            }
+            else
+            {
+                func(child);
             }
         }
         return true;
     }
+#if 0
     template <class ContainerT, class FunctionT>
     bool forEachChildSingle(const ContainerT& container, FunctionT&& func)
     {
@@ -34,6 +42,7 @@ namespace armarx::armem::base::detail
         }
         return true;
     }
+#endif
 
     // Pair-valued containers.
     template <class ContainerT, class FunctionT>
@@ -41,13 +50,21 @@ namespace armarx::armem::base::detail
     {
         for (auto& [_, child] : container)
         {
-            if (!func(child))
+            if constexpr(std::is_same_v<decltype(func(child)), bool>)
             {
-                return false;
+                if (!func(child))
+                {
+                    return false;
+                }
+            }
+            else
+            {
+                func(child);
             }
         }
         return true;
     }
+#if 0
     template <class ContainerT, class FunctionT>
     bool forEachChildPair(const ContainerT& container, FunctionT&& func)
     {
@@ -60,6 +77,7 @@ namespace armarx::armem::base::detail
         }
         return true;
     }
+#endif
 
 
     // see: https://en.cppreference.com/w/cpp/types/void_t
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/CoreSegment.h b/source/RobotAPI/libraries/armem/core/diskmemory/CoreSegment.h
index cccf81b00..2d8bd8f29 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/CoreSegment.h
@@ -2,8 +2,8 @@
 
 #include <filesystem>
 
-#include "../base/CoreSegmentBase.h"
-#include "../workingmemory/CoreSegment.h"
+#include <RobotAPI/libraries/armem/core/base/CoreSegmentBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include "ProviderSegment.h"
 
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/Entity.h b/source/RobotAPI/libraries/armem/core/diskmemory/Entity.h
index 09b8ab78c..63011ceff 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/Entity.h
@@ -2,8 +2,8 @@
 
 #include <filesystem>
 
-#include "../base/EntityBase.h"
-#include "../workingmemory/Entity.h"
+#include <RobotAPI/libraries/armem/core/base/EntityBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include "EntitySnapshot.h"
 
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
index e3bff18fa..e658ce8c2 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
@@ -1,8 +1,8 @@
 #include "EntityInstance.h"
 
-#include "../../core/error.h"
-#include "../workingmemory/json_conversions.h"
-#include "../workingmemory/entityInstance_conversions.h"
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/wm/aron_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/json_conversions.h>
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
index c94ee5dcd..c56a944f2 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
@@ -2,8 +2,8 @@
 
 #include <filesystem>
 
-#include "../base/EntityInstanceBase.h"
-#include "../workingmemory/EntityInstance.h"
+#include <RobotAPI/libraries/armem/core/base/EntityInstanceBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include <RobotAPI/libraries/aron/core/navigator/type/forward_declarations.h>
 
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.h
index 5005af5f7..9587e3be4 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.h
@@ -2,8 +2,8 @@
 
 #include <filesystem>
 
-#include "../base/EntitySnapshotBase.h"
-#include "../workingmemory/EntitySnapshot.h"
+#include <RobotAPI/libraries/armem/core/base/EntitySnapshotBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include "EntityInstance.h"
 
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/Memory.h b/source/RobotAPI/libraries/armem/core/diskmemory/Memory.h
index de2cae3c7..aaa1e460a 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/Memory.h
@@ -2,8 +2,8 @@
 
 #include <filesystem>
 
-#include "../base/MemoryBase.h"
-#include "../workingmemory/Memory.h"
+#include <RobotAPI/libraries/armem/core/base/MemoryBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include "CoreSegment.h"
 
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.h
index eb7d300e0..0e866b08c 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.h
@@ -2,8 +2,8 @@
 
 #include <filesystem>
 
-#include "../base/ProviderSegmentBase.h"
-#include "../workingmemory/ProviderSegment.h"
+#include <RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include "Entity.h"
 
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/CoreSegment.h b/source/RobotAPI/libraries/armem/core/longtermmemory/CoreSegment.h
index 797b9df1f..32f05ef2f 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/CoreSegment.h
@@ -3,8 +3,8 @@
 #include "ProviderSegment.h"
 #include "mongodb/MongoDBConnectionManager.h"
 
-#include "../base/CoreSegmentBase.h"
-#include "../workingmemory/CoreSegment.h"
+#include <RobotAPI/libraries/armem/core/base/CoreSegmentBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 
 namespace armarx::armem::ltm
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h b/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h
index 79c783de9..e3feb413c 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Entity.h
@@ -3,8 +3,8 @@
 #include "EntitySnapshot.h"
 #include "mongodb/MongoDBConnectionManager.h"
 
-#include "../base/EntityBase.h"
-#include "../workingmemory/Entity.h"
+#include <RobotAPI/libraries/armem/core/base/EntityBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 
 namespace armarx::armem::ltm
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.cpp
index 1244abb46..443291c13 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.cpp
@@ -2,8 +2,8 @@
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
-#include "../workingmemory/entityInstance_conversions.h"
-#include "../workingmemory/json_conversions.h"
+#include <RobotAPI/libraries/armem/core/wm/aron_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/json_conversions.h>
 
 #include "error.h"
 
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.h
index b3d6211bd..3029f8a7c 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntitySnapshot.h
@@ -3,8 +3,8 @@
 #include "EntityInstance.h"
 #include "mongodb/MongoDBConnectionManager.h"
 
-#include "../base/EntitySnapshotBase.h"
-#include "../workingmemory/EntitySnapshot.h"
+#include <RobotAPI/libraries/armem/core/base/EntitySnapshotBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include <RobotAPI/libraries/aron/core/navigator/type/forward_declarations.h>
 
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
index 18b655ef5..dbeb2a538 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
@@ -3,8 +3,8 @@
 #include "CoreSegment.h"
 #include "mongodb/MongoDBConnectionManager.h"
 
-#include "../base/MemoryBase.h"
-#include "../workingmemory/Memory.h"
+#include <RobotAPI/libraries/armem/core/base/MemoryBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include <ArmarXCore/core/application/properties/forward_declarations.h>
 
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/longtermmemory/ProviderSegment.h
index ed48ff071..bf1d5e3a9 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/ProviderSegment.h
@@ -3,8 +3,8 @@
 #include "Entity.h"
 #include "mongodb/MongoDBConnectionManager.h"
 
-#include "../base/ProviderSegmentBase.h"
-#include "../workingmemory/ProviderSegment.h"
+#include <RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 
 namespace armarx::armem::ltm
diff --git a/source/RobotAPI/libraries/armem/core/operations.cpp b/source/RobotAPI/libraries/armem/core/operations.cpp
index e43995730..b9ebedd31 100644
--- a/source/RobotAPI/libraries/armem/core/operations.cpp
+++ b/source/RobotAPI/libraries/armem/core/operations.cpp
@@ -1,7 +1,5 @@
 #include "operations.h"
 
-#include "workingmemory/EntityInstance.h"
-
 
 namespace armarx
 {
@@ -10,7 +8,7 @@ namespace armarx
     armem::getAronData(const wm::EntitySnapshot& snapshot)
     {
         std::vector<aron::datanavigator::DictNavigatorPtr> result;
-        snapshot.forEachChild([&result](const wm::EntityInstance& instance)
+        snapshot.forEachChild([&result](const wm::EntityInstance & instance)
         {
             result.push_back(instance.data());
             return true;
diff --git a/source/RobotAPI/libraries/armem/core/operations.h b/source/RobotAPI/libraries/armem/core/operations.h
index 9fc479dcf..3b0182e32 100644
--- a/source/RobotAPI/libraries/armem/core/operations.h
+++ b/source/RobotAPI/libraries/armem/core/operations.h
@@ -1,14 +1,6 @@
 #pragma once
 
-#if 0  // Not need at the moment.
-#include "workingmemory/Memory.h"
-#include "workingmemory/CoreSegment.h"
-#include "workingmemory/ProviderSegment.h"
-#include "workingmemory/Entity.h"
-#include "workingmemory/EntityInstance.h"
-#endif
-
-#include "workingmemory/EntitySnapshot.h"
+#include "wm/memory_definitions.h"
 
 
 /*
diff --git a/source/RobotAPI/libraries/armem/server/ComponentPlugin.h b/source/RobotAPI/libraries/armem/server/ComponentPlugin.h
index 06ba31f7a..50951ab82 100644
--- a/source/RobotAPI/libraries/armem/server/ComponentPlugin.h
+++ b/source/RobotAPI/libraries/armem/server/ComponentPlugin.h
@@ -8,7 +8,7 @@
 #include <RobotAPI/interface/armem/client/MemoryListenerInterface.h>
 #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/core/longtermmemory/Memory.h>
 #include <RobotAPI/libraries/armem/client/MemoryNameSystemComponentPlugin.h>
 
diff --git a/source/RobotAPI/libraries/armem/server/MemoryRemoteGui.h b/source/RobotAPI/libraries/armem/server/MemoryRemoteGui.h
index f4a7fad95..0c363e075 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryRemoteGui.h
+++ b/source/RobotAPI/libraries/armem/server/MemoryRemoteGui.h
@@ -2,7 +2,7 @@
 
 #include <ArmarXGui/libraries/RemoteGui/Client/Widgets.h>
 
-#include "../core/workingmemory/Memory.h"
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 
 namespace armarx::armem::server
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
index 60f134edc..b6c14f5a1 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
@@ -5,7 +5,7 @@
 #include "query_proc/longtermmemory/MemoryQueryProcessor.h"
 
 #include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 #include <RobotAPI/libraries/aron/core/Exception.h>
 
 #include <ArmarXCore/core/logging/Logging.h>
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h
index f4b4b4c94..cc6657459 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h
@@ -3,7 +3,7 @@
 #include <RobotAPI/interface/armem/server/MemoryInterface.h>
 #include <RobotAPI/interface/armem/client/MemoryListenerInterface.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/core/longtermmemory/Memory.h>
 #include <RobotAPI/libraries/armem/client/Query.h>
 
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp
index 4c41f1666..deb66ad71 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp
@@ -1,6 +1,6 @@
 #include "CoreSegmentQueryProcessor.h"
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 
 namespace armarx::armem::wm::query_proc
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.h
index f9e1d59c9..a09f5c8ce 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.h
@@ -2,7 +2,7 @@
 
 #include <mutex>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h>
 
 #include "BaseQueryProcessor.h"
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp
index b8d97d2d0..ec1c7640c 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp
@@ -1,6 +1,6 @@
 #include "EntityQueryProcessor.h"
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 
 namespace armarx::armem::wm::query_proc
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.h
index dde53a8ff..4d0a2e02a 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Entity.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h>
 
 #include "BaseQueryProcessor.h"
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/MemoryQueryProcessor.h
index c57eea94a..a442baaf3 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/MemoryQueryProcessor.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/MemoryQueryProcessor.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h>
 
 #include "BaseQueryProcessor.h"
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.cpp
index eb2524631..d50d252aa 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.cpp
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.cpp
@@ -1,6 +1,6 @@
 #include "ProviderSegmentQueryProcessor.h"
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 
 namespace armarx::armem::wm::query_proc
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.h
index 8e4f5a5e8..ee878428d 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessorBase.h>
 
 #include "BaseQueryProcessor.h"
diff --git a/source/RobotAPI/libraries/armem/test/ArMemForEachTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemForEachTest.cpp
index 1aa9e3cfd..cc34f7e2d 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemForEachTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemForEachTest.cpp
@@ -26,7 +26,7 @@
 
 #include <RobotAPI/Test.h>
 #include <RobotAPI/libraries/armem/core/Commit.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include <iostream>
 #include <set>
@@ -168,3 +168,20 @@ BOOST_AUTO_TEST_CASE(test_forEach)
     BOOST_CHECK_EQUAL(cids.size(), 0);
 
 }
+
+
+BOOST_AUTO_TEST_CASE(test_forEach_non_bool_func)
+{
+    // Check whether this compiles + runs without break.
+
+    armem::wm::Entity entity;
+    entity.addSnapshot(armem::Time::microSeconds(500));
+    entity.addSnapshot(armem::Time::microSeconds(1500));
+
+    int i = 0;
+    entity.forEachSnapshot([&i](const armem::wm::EntitySnapshot&) -> void
+    {
+        ++i;
+    });
+    BOOST_CHECK_EQUAL(i, 2);
+}
diff --git a/source/RobotAPI/libraries/armem/test/ArMemIceConversionsTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemIceConversionsTest.cpp
index 52530a7c5..9fd00a4cf 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemIceConversionsTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemIceConversionsTest.cpp
@@ -25,7 +25,7 @@
 #define ARMARX_BOOST_TEST
 
 #include <RobotAPI/Test.h>
-#include "../core/workingmemory/ice_conversions.h"
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 
 #include <iostream>
diff --git a/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp
index 01b3756af..3ac3d5041 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp
@@ -25,8 +25,8 @@
 #define ARMARX_BOOST_TEST
 
 #include <RobotAPI/Test.h>
-#include "../core/workingmemory/Memory.h"
-#include "../core/error.h"
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/error.h>
 
 #include <RobotAPI/libraries/aron/core/navigator/data/AllNavigators.h>
 #include <RobotAPI/libraries/aron/core/navigator/type/AllNavigators.h>
diff --git a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
index 022df2fc3..0e5149395 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
@@ -26,7 +26,7 @@
 
 #include <RobotAPI/Test.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/core/longtermmemory/Memory.h>
 #include <RobotAPI/libraries/armem/core/diskmemory/Memory.h>
 #include <RobotAPI/libraries/armem/core/error.h>
diff --git a/source/RobotAPI/libraries/armem/test/ArMemQueryBuilderTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemQueryBuilderTest.cpp
index 535735b09..78d3077c0 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemQueryBuilderTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemQueryBuilderTest.cpp
@@ -25,9 +25,10 @@
 #define ARMARX_BOOST_TEST
 
 #include <RobotAPI/Test.h>
-#include "../client/query/Builder.h"
-#include "../client/query/query_fns.h"
-#include "../core/workingmemory/ice_conversions.h"
+#include <RobotAPI/libraries/armem/client/query/Builder.h>
+#include <RobotAPI/libraries/armem/client/query/query_fns.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
+
 
 #include <iostream>
 
diff --git a/source/RobotAPI/libraries/armem/util/util.h b/source/RobotAPI/libraries/armem/util/util.h
index b1e3e7f3d..3045d583a 100644
--- a/source/RobotAPI/libraries/armem/util/util.h
+++ b/source/RobotAPI/libraries/armem/util/util.h
@@ -26,8 +26,7 @@
 
 #include <ArmarXCore/core/logging/Logging.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Entity.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h>
 
 
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
index 76272adcf..ba8e66ff9 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
+++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
@@ -1,6 +1,6 @@
 #include "MemoryViewer.h"
 
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 #include <RobotAPI/libraries/armem_gui/gui_utils.h>
 
 #include <RobotAPI/libraries/armem/core/diskmemory/Memory.h>
diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h
index 26f9d3be5..c331f2b45 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h
@@ -7,7 +7,7 @@
 
 #include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 
 class QGroupBox;
diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceViewList.h b/source/RobotAPI/libraries/armem_gui/instance/InstanceViewList.h
index 5f937f419..8dc24e0dc 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/InstanceViewList.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceViewList.h
@@ -6,7 +6,7 @@
 
 #include <RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 
 class QGroupBox;
diff --git a/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.h b/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.h
index 0dda62162..72987cda1 100644
--- a/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.h
+++ b/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.h
@@ -4,7 +4,7 @@
 
 #include <QTreeWidget>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/core/longtermmemory/Memory.h>
 
 #include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h>
diff --git a/source/RobotAPI/libraries/armem_motions/server/MotionDatabase/MDBMotions/Segment.cpp b/source/RobotAPI/libraries/armem_motions/server/MotionDatabase/MDBMotions/Segment.cpp
index 93bec90ca..67ffed4ba 100644
--- a/source/RobotAPI/libraries/armem_motions/server/MotionDatabase/MDBMotions/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_motions/server/MotionDatabase/MDBMotions/Segment.cpp
@@ -10,8 +10,7 @@
 #include "MotionConverter.h"
 
 #include <RobotAPI/libraries/PriorKnowledge/motions/MotionFinder.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 #include <ArmarXCore/core/application/properties/ProxyPropertyDefinition.h>
@@ -79,7 +78,7 @@ namespace armarx::armem::server::motions::mdb
                     instance.metadata().timeSent = IceUtil::Time::now();
                     instance.metadata().timeArrived = IceUtil::Time::now();
                     instance.metadata().confidence = 1.0;
-                    instance.setData(op->toAron());
+                    instance.data() = op->toAron();
                 }
                 else
                 {
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp
index c973cf248..976d5bf9a 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp
@@ -16,7 +16,7 @@
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
 #include <RobotAPI/libraries/armem_robot/aron_conversions.h>
 #include <RobotAPI/libraries/armem_robot/robot_conversions.h>
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 d0bfb3570..be9a624f4 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
@@ -13,7 +13,7 @@
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
 #include <RobotAPI/libraries/armem_robot/aron_conversions.h>
 #include <RobotAPI/libraries/armem_robot/robot_conversions.h>
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/utils.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/utils.h
index 2e51a9e4b..9c5b48f39 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/utils.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/utils.h
@@ -2,7 +2,7 @@
 
 #include <optional>
 
-#include "RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h"
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include "RobotAPI/libraries/armem_robot/types.h"
 #include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
 
diff --git a/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp
index e5e91c309..938ba0986 100644
--- a/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/attachment/Reader.cpp
@@ -9,7 +9,7 @@
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/armem/core/error.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/util/util.h>
 #include <RobotAPI/libraries/armem_robot/robot_conversions.h>
 #include <RobotAPI/libraries/armem_robot/aron_conversions.h>
diff --git a/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.cpp
index bb5d930da..365958be8 100644
--- a/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/attachments/Segment.cpp
@@ -10,7 +10,6 @@
 #include "RobotAPI/libraries/aron/common/aron_conversions.h"
 
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/visitor.h>
 #include "RobotAPI/libraries/armem/core/MemoryID.h"
 #include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.cpp b/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.cpp
index 08927d1e7..35ce3d1cf 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.cpp
@@ -1,6 +1,6 @@
 #include "FloorVis.h"
 
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
 
 #include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
index 15c7c4f37..3e9717b3e 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
@@ -9,7 +9,7 @@
 #include <RobotAPI/libraries/ArmarXObjects/ObjectID.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
 #include <RobotAPI/libraries/armem_objects/server/class/FloorVis.h>
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 15a577619..e1826b2b2 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -7,7 +7,6 @@
 
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
 #include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/visitor.h>
 #include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
@@ -290,14 +289,17 @@ namespace armarx::armem::server::obj::instance
         armem::MemoryID entityID = armem::MemoryID().withEntityName(objectID.str());
         if (providerName.empty())
         {
-            for (auto& [_, prov] : *coreSegment)
+            armem::wm::Entity* result = nullptr;
+            coreSegment->forEachProviderSegment([&result, &entityID](wm::ProviderSegment & prov)
             {
                 if (prov.hasEntity(entityID.entityName))
                 {
-                    return &prov.getEntity(entityID);
+                    result = &prov.getEntity(entityID);
+                    return false;
                 }
-            }
-            return nullptr;
+                return true;
+            });
+            return result;
         }
         else
         {
@@ -420,16 +422,16 @@ namespace armarx::armem::server::obj::instance
 
     void Segment::getLatestObjectPoses(const armem::wm::CoreSegment& coreSeg, ObjectPoseMap& out)
     {
-        for (const auto& [_, provSegment] : coreSeg)
+        coreSeg.forEachProviderSegment([&out](const wm::ProviderSegment & provSegment)
         {
             getLatestObjectPoses(provSegment, out);
-        }
+        });
     }
 
 
     void Segment::getLatestObjectPoses(const armem::wm::ProviderSegment& provSegment, ObjectPoseMap& out)
     {
-        for (const auto& [_, entity] : provSegment)
+        provSegment.forEachEntity([&out](const wm::Entity & entity)
         {
             if (!entity.empty())
             {
@@ -445,19 +447,19 @@ namespace armarx::armem::server::obj::instance
                     }
                 }
             }
-        }
+        });
     }
 
 
     void Segment::getLatestObjectPose(const armem::wm::Entity& entity, ObjectPose& out)
     {
-        for (const armem::wm::EntityInstance& instance : entity.getLatestSnapshot())
+        entity.getLatestSnapshot().forEachInstance([&out](const wm::EntityInstance & instance)
         {
             arondto::ObjectInstance dto;
             dto.fromAron(instance.data());
 
             fromAron(dto, out);
-        }
+        });
     }
 
 
@@ -697,36 +699,6 @@ namespace armarx::armem::server::obj::instance
     }
 
 
-    struct DetachVisitor : public armem::wm::Visitor
-    {
-        Segment& owner;
-        armem::Time now;
-        bool commitAttachedPose;
-
-        int numDetached = 0;
-
-        DetachVisitor(Segment& owner, armem::Time now, bool commitAttachedPose) :
-            owner(owner), now(now), commitAttachedPose(commitAttachedPose)
-        {
-        }
-
-        virtual bool visitEnter(armem::wm::Entity& entity) override;
-    };
-
-
-    bool DetachVisitor::visitEnter(armem::wm::Entity& entity)
-    {
-        const arondto::ObjectInstance data = owner.getLatestInstanceData(entity);
-        if (data.pose.attachmentValid)
-        {
-            numDetached++;
-            // Store non-attached pose in new snapshot.
-            owner.storeDetachedSnapshot(entity, data, now, commitAttachedPose);
-        }
-        return false; // Stop descending.
-    }
-
-
     objpose::DetachAllObjectsFromRobotNodesOutput Segment::detachAllObjectsFromRobotNodes(
         const objpose::DetachAllObjectsFromRobotNodesInput& input)
     {
@@ -734,11 +706,18 @@ namespace armarx::armem::server::obj::instance
 
         const armem::Time now = armem::Time::now();
 
-        DetachVisitor visitor(*this, now, input.commitAttachedPose);
-        visitor.applyTo(*coreSegment);
-
         objpose::DetachAllObjectsFromRobotNodesOutput output;
-        output.numDetached = visitor.numDetached;
+        output.numDetached = 0;
+        coreSegment->forEachEntity([this, now, &input, &output](wm::Entity & entity)
+        {
+            const arondto::ObjectInstance data = this->getLatestInstanceData(entity);
+            if (data.pose.attachmentValid)
+            {
+                ++output.numDetached;
+                // Store non-attached pose in new snapshot.
+                this->storeDetachedSnapshot(entity, data, now, input.commitAttachedPose);
+            }
+        });
 
         ARMARX_INFO << "Detached all objects (" << output.numDetached << ") from robot nodes.";
 
@@ -901,9 +880,7 @@ namespace armarx::armem::server::obj::instance
     armem::obj::SceneSnapshot Segment::getSceneSnapshot() const
     {
         armem::obj::SceneSnapshot scene;
-
-        wm::FunctionalVisitor visitor;
-        visitor.entityFn = [&scene](wm::Entity & entity)
+        coreSegment->forEachEntity([&scene](wm::Entity & entity)
         {
             try
             {
@@ -923,10 +900,8 @@ namespace armarx::armem::server::obj::instance
             {
                 ARMARX_WARNING_S << e.what();
             }
-            return false;
-        };
+        });
 
-        visitor.applyTo(*coreSegment);
         return scene;
     }
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
index 918a4efad..f6ba67189 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h
@@ -19,7 +19,7 @@
 #include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
 
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
 
 #include "ArticulatedObjectVisu.h"
diff --git a/source/RobotAPI/libraries/armem_robot/robot_conversions.cpp b/source/RobotAPI/libraries/armem_robot/robot_conversions.cpp
index 3bf417148..6ba61bba4 100644
--- a/source/RobotAPI/libraries/armem_robot/robot_conversions.cpp
+++ b/source/RobotAPI/libraries/armem_robot/robot_conversions.cpp
@@ -4,7 +4,7 @@
 
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
 
-#include "RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h"
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
 
 #include <RobotAPI/libraries/armem_robot/aron/RobotDescription.aron.generated.h>
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
index 7a500d139..85370141f 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
@@ -10,7 +10,7 @@
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/core/error.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem_robot/aron_conversions.h>
 #include <RobotAPI/libraries/armem_robot/robot_conversions.h>
 #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
@@ -214,30 +214,31 @@ namespace armarx::armem::robot_state
         const armem::wm::ProviderSegment& providerSegment = memory
                 .getCoreSegment(properties.proprioceptionCoreSegment)
                 .getProviderSegment(name);
-        // clang-format on
-        const auto entities = simox::alg::get_values(providerSegment.entities());
 
         // TODO entitiesToRobotState()
 
-        if (entities.empty())
+        if (providerSegment.empty())
         {
             ARMARX_WARNING << "No entity found";
             return std::nullopt;
         }
 
-        const auto entitySnapshots = simox::alg::get_values(entities.front().history());
+        // clang-format on
 
-        if (entitySnapshots.empty())
+        const armem::wm::EntityInstance* instance = nullptr;
+        providerSegment.forEachInstance([&instance](const wm::EntityInstance & i)
+        {
+            instance = &i;
+            return false;  // break
+        });
+        if (!instance)
         {
             ARMARX_WARNING << "No entity snapshots found";
             return std::nullopt;
         }
 
-        // TODO(fabian.reister): check if 0 available
-        const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0);
-
         // Here, we access the RobotUnit streaming data stored in the proprioception segment.
-        return robot::convertRobotState(instance);
+        return robot::convertRobotState(*instance);
     }
 
     // FIXME remove this, use armem/util/util.h
@@ -271,24 +272,19 @@ namespace armarx::armem::robot_state
                 .getCoreSegment(properties.proprioceptionCoreSegment);
         // clang-format on
 
-        for (const auto &[_, providerSegment] : coreSegment.providerSegments())
+        coreSegment.forEachEntity([&jointMap](const wm::Entity & entity)
         {
+            const auto& entityInstance = entity.getLatestSnapshot().getInstance(0);
 
-            for (const auto &[name, entity] : providerSegment.entities())
+            const auto jointState = tryCast<::armarx::armem::arondto::JointState>(entityInstance);
+            if (not jointState)
             {
-                const auto& entityInstance = entity.getLatestSnapshot().getInstance(0);
-
-                const auto jointState = tryCast<::armarx::armem::arondto::JointState>(entityInstance);
-
-                if (not jointState)
-                {
-                    // ARMARX_WARNING << "Could not convert entity instance to 'JointState'";
-                    continue;
-                }
-
-                jointMap.emplace(jointState->name, jointState->position);
+                // ARMARX_WARNING << "Could not convert entity instance to 'JointState'";
+                return;
             }
-        }
+
+            jointMap.emplace(jointState->name, jointState->position);
+        });
 
         if (jointMap.empty())
         {
@@ -307,26 +303,19 @@ namespace armarx::armem::robot_state
                 .getCoreSegment(properties.descriptionCoreSegment)
                 .getProviderSegment(name); // TODO(fabian.reister): all
         // clang-format on
-        const auto entities = simox::alg::get_values(providerSegment.entities());
 
-        if (entities.empty())
+        const armem::wm::EntityInstance* instance = nullptr;
+        providerSegment.forEachInstance([&instance](const wm::EntityInstance & i)
         {
-            ARMARX_WARNING << "No entity found";
-            return std::nullopt;
-        }
-
-        const auto entitySnapshots = simox::alg::get_values(entities.front().history());
-
-        if (entitySnapshots.empty())
+            instance = &i;
+        });
+        if (!instance)
         {
             ARMARX_WARNING << "No entity snapshots found";
             return std::nullopt;
         }
 
-        // TODO(fabian.reister): check if 0 available
-        const armem::wm::EntityInstance& instance = entitySnapshots.front().getInstance(0);
-
-        return robot::convertRobotDescription(instance);
+        return robot::convertRobotDescription(*instance);
     }
 
 } // namespace armarx::armem::robot_state
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp
index 6aa026431..32da2d645 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp
@@ -48,9 +48,9 @@
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
 #include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h>
 #include <RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.h>
 #include <RobotAPI/libraries/core/FramedPose.h>
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformWriter.cpp b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformWriter.cpp
index 4230394aa..608dfa394 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformWriter.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformWriter.cpp
@@ -37,9 +37,9 @@
 
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ice_conversions.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h>
 #include <RobotAPI/libraries/aron/core/navigator/type/NavigatorFactory.h>
 #include <RobotAPI/libraries/core/FramedPose.h>
diff --git a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp
index c4d0e05b4..7990703b1 100644
--- a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp
@@ -5,18 +5,18 @@
 #include <SimoxUtility/color/cmaps.h>
 #include <SimoxUtility/math/pose/interpolate.h>
 
-#include "ArmarXCore/core/exceptions/LocalException.h"
-#include "RobotAPI/libraries/core/FramedPose.h"
+#include <ArmarXCore/core/exceptions/LocalException.h>
+#include <RobotAPI/libraries/core/FramedPose.h>
 
-#include "RobotAPI/libraries/aron/common/aron_conversions.h"
+#include <RobotAPI/libraries/aron/common/aron_conversions.h>
 
-#include "RobotAPI/libraries/armem/core/error/ArMemError.h"
-#include "RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h"
-#include "RobotAPI/libraries/armem/core/workingmemory/Memory.h"
+#include <RobotAPI/libraries/armem/core/error/ArMemError.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 
 #include <RobotAPI/libraries/armem_robot_state/aron/Transform.aron.generated.h>
 #include <RobotAPI/libraries/armem_robot_state/aron_conversions.h>
 
+
 namespace armarx::armem::common::robot_state::localization
 {
 
diff --git a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.h b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.h
index cafbedcbc..0f1f20de8 100644
--- a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.h
+++ b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.h
@@ -28,6 +28,7 @@
 
 #include <RobotAPI/libraries/armem_robot_state/common/localization/types.h>
 
+
 namespace armarx::armem::wm
 {
     class CoreSegment;
@@ -66,4 +67,4 @@ namespace armarx::armem::common::robot_state::localization
                         const armem::wm::ProviderSegment& agentProviderSegment,
                         const armem::Time& timestamp);
     };
-} // namespace armarx::armem::common::robot_state::localization
\ No newline at end of file
+} // namespace armarx::armem::common::robot_state::localization
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
index fc4eef76e..e4e9dc4f7 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
@@ -19,7 +19,6 @@
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/visitor.h>
 #include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 
 #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
index 604795dd4..118123c6b 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
@@ -26,7 +26,6 @@
 #include <RobotAPI/libraries/armem/core/MemoryID.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/visitor.h>
 #include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 
 #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
index e94fc83e2..d08ae0866 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/Segment.cpp
@@ -11,7 +11,6 @@
 #include <RobotAPI/libraries/armem_robot_state/types.h>
 
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/visitor.h>
 #include <RobotAPI/libraries/armem/core/MemoryID.h>
 #include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
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 61eeb6fff..4bc22306d 100644
--- a/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_vision/client/laser_scans/Reader.cpp
@@ -33,22 +33,20 @@
 #include <RobotAPI/libraries/aron/core/navigator/data/complex/NDArray.h>
 
 // RobotAPI Armem
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
+#include <RobotAPI/libraries/armem/util/util.h>
+
 #include <RobotAPI/libraries/armem/client/Query.h>
 #include <RobotAPI/libraries/armem/client/Reader.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/selectors.h>
 
-#include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Entity.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h>
-#include <RobotAPI/libraries/armem/util/util.h>
 #include <RobotAPI/libraries/armem_vision/aron/LaserScan.aron.generated.h>
 #include <RobotAPI/libraries/armem_vision/aron_conversions.h>
 #include <RobotAPI/libraries/armem_vision/types.h>
 
+
 namespace armarx::armem::vision::laser_scans::client
 {
 
diff --git a/source/RobotAPI/libraries/armem_vision/client/laser_scans/Writer.cpp b/source/RobotAPI/libraries/armem_vision/client/laser_scans/Writer.cpp
index 7358e504f..861e02c4c 100644
--- a/source/RobotAPI/libraries/armem_vision/client/laser_scans/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_vision/client/laser_scans/Writer.cpp
@@ -1,7 +1,7 @@
 #include "Writer.h"
 
 #include <RobotAPI/libraries/armem/core/error.h>
-#include "RobotAPI/libraries/armem_vision/aron_conversions.h"
+#include <RobotAPI/libraries/armem_vision/aron_conversions.h>
 #include <RobotAPI/libraries/armem_vision/aron/LaserScan.aron.generated.h>
 
 
diff --git a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.cpp b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.cpp
index ba7edf547..717a2ec98 100644
--- a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.cpp
@@ -19,13 +19,13 @@
 #include <SimoxUtility/algorithm/get_map_keys_values.h>
 
 // ArmarXCore
-#include "ArmarXCore/core/exceptions/LocalException.h"
+#include <ArmarXCore/core/exceptions/LocalException.h>
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 #include <ArmarXCore/core/logging/LogSender.h>
 #include <ArmarXCore/core/logging/Logging.h>
 
 // RobotAPI Interfaces
-#include "RobotAPI/libraries/aron/converter/eigen/EigenConverter.h"
+#include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
 #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
 #include <RobotAPI/interface/armem/server/ReadingMemoryInterface.h>
 #include <RobotAPI/interface/units/LaserScannerUnit.h>
@@ -40,11 +40,7 @@
 #include <RobotAPI/libraries/armem/client/Reader.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/selectors.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Entity.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
-#include <RobotAPI/libraries/armem/core/workingmemory/ProviderSegment.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
 #include <RobotAPI/libraries/armem/util/util.h>
 #include <RobotAPI/libraries/armem_vision/aron/LaserScan.aron.generated.h>
 #include <RobotAPI/libraries/armem_vision/aron_conversions.h>
@@ -68,20 +64,23 @@ namespace armarx::armem::vision::occupancy_grid::client
         return qb;
     }
 
-    OccupancyGrid asOccupancyGrid(const std::map<std::string, wm::Entity>& entities)
+    OccupancyGrid asOccupancyGrid(const wm::ProviderSegment& providerSegment)
     {
-        ARMARX_CHECK(not entities.empty()) << "No entities";
-        ARMARX_CHECK(entities.size() == 1) << "There should be only one entity!";
+        ARMARX_CHECK(not providerSegment.empty()) << "No entities";
+        ARMARX_CHECK(providerSegment.size() == 1) << "There should be only one entity!";
 
-        const wm::Entity& entity = entities.begin()->second;
-        ARMARX_CHECK(not entity.empty()) << "No snapshots";
-
-        const auto& entitySnapshot = entity.getLatestSnapshot();
-        ARMARX_CHECK(not entitySnapshot.empty()) << "No entity snapshot instances";
+        const wm::EntityInstance* entityInstance = nullptr;
+        providerSegment.forEachEntity([&entityInstance](const wm::Entity & entity)
+        {
+            const auto& entitySnapshot = entity.getLatestSnapshot();
+            ARMARX_CHECK(not entitySnapshot.empty()) << "No entity snapshot instances";
 
-        const auto& entityInstance = entitySnapshot.instances().front();
+            entityInstance = &entitySnapshot.getInstance(0);
+            return false;
+        });
+        ARMARX_CHECK_NOT_NULL(entityInstance);
 
-        const auto aronDto = tryCast<arondto::OccupancyGrid>(entityInstance);
+        const auto aronDto = tryCast<arondto::OccupancyGrid>(*entityInstance);
         ARMARX_CHECK(aronDto) << "Failed casting to OccupancyGrid";
 
         OccupancyGrid occupancyGrid;
@@ -89,7 +88,7 @@ namespace armarx::armem::vision::occupancy_grid::client
 
         // direct access to grid data
         const auto ndArrayNavigator = aron::datanavigator::NDArrayNavigator::DynamicCast(
-                                          entityInstance.data()->getElement("grid"));
+                                          entityInstance->data()->getElement("grid"));
         ARMARX_CHECK_NOT_NULL(ndArrayNavigator);
 
         occupancyGrid.grid = aron::converter::AronEigenConverter::ConvertToArray<float>(*ndArrayNavigator);
@@ -118,11 +117,10 @@ namespace armarx::armem::vision::occupancy_grid::client
         }
 
         // now create result from memory
-        const auto& entities = qResult.memory.getCoreSegment(properties().memoryName)
-                               .getProviderSegment(query.providerName)
-                               .entities();
+        const wm::ProviderSegment& providerSegment = qResult.memory.getCoreSegment(properties().memoryName)
+                .getProviderSegment(query.providerName);
 
-        if (entities.empty())
+        if (providerSegment.empty())
         {
             ARMARX_WARNING << "No entities.";
             return {.occupancyGrid = std::nullopt,
@@ -132,7 +130,7 @@ namespace armarx::armem::vision::occupancy_grid::client
 
         try
         {
-            const auto occupancyGrid = asOccupancyGrid(entities);
+            const auto occupancyGrid = asOccupancyGrid(providerSegment);
             return Result{.occupancyGrid = occupancyGrid,
                           .status        = Result::Status::Success};
         }
diff --git a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.h b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.h
index a43c2c7c1..eaf9b2fdf 100644
--- a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.h
+++ b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.h
@@ -23,9 +23,9 @@
 
 #include <mutex>
 
-#include "RobotAPI/libraries/armem/client/util/SimpleReaderBase.h"
-#include "RobotAPI/libraries/armem/core/Time.h"
-#include "RobotAPI/libraries/armem_vision/types.h"
+#include <RobotAPI/libraries/armem/client/util/SimpleReaderBase.h>
+#include <RobotAPI/libraries/armem/core/Time.h>
+#include <RobotAPI/libraries/armem_vision/types.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 
 namespace armarx::armem::vision::occupancy_grid::client
diff --git a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp
index f2930f14f..ce5883afb 100644
--- a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp
@@ -1,8 +1,9 @@
 #include "Writer.h"
 
-#include "RobotAPI/libraries/armem_vision/aron_conversions.h"
+#include <RobotAPI/libraries/armem_vision/aron_conversions.h>
 #include <RobotAPI/libraries/armem_vision/aron/OccupancyGrid.aron.generated.h>
 
+
 namespace armarx::armem::vision::occupancy_grid::client
 {
     Writer::~Writer() = default;
@@ -67,4 +68,4 @@ namespace armarx::armem::vision::occupancy_grid::client
         return SimpleWriterBase::Properties{.memoryName      = "Vision",
                                             .coreSegmentName = "OccupancyGrid"};
     }
-} // namespace armarx::armem::vision::occupancy_grid::client
\ No newline at end of file
+} // namespace armarx::armem::vision::occupancy_grid::client
diff --git a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.h b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.h
index bf1268444..b2a900321 100644
--- a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.h
+++ b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.h
@@ -24,8 +24,8 @@
 
 #include <mutex>
 
-#include "RobotAPI/libraries/armem/client/util/SimpleWriterBase.h"
-#include "RobotAPI/libraries/armem_vision/types.h"
+#include <RobotAPI/libraries/armem/client/util/SimpleWriterBase.h>
+#include <RobotAPI/libraries/armem_vision/types.h>
 
 namespace armarx::armem::vision::occupancy_grid::client
 {
-- 
GitLab