From cd45220de4d5a8774c14f71e0ae93a5943104261 Mon Sep 17 00:00:00 2001
From: "fabian.peller-konrad@kit.edu" <fabian.peller-konrad@kit.edu>
Date: Thu, 22 Apr 2021 18:06:23 +0200
Subject: [PATCH] changes to query proc

---
 source/RobotAPI/interface/armem/io.ice        |  27 +--
 .../armem/server/LoadingMemoryInterface.ice   |   2 +-
 .../RobotAPI/libraries/armem/CMakeLists.txt   |  47 +++--
 .../libraries/armem/client/Reader.cpp         |  30 ++-
 .../RobotAPI/libraries/armem/client/Reader.h  |  14 +-
 .../libraries/armem/core/base/CoreSegment.h   |  52 ++----
 .../libraries/armem/core/base/Entity.h        |  55 ++----
 .../armem/core/base/EntityInstance.h          |  13 +-
 .../armem/core/base/EntitySnapshot.h          |  40 ++--
 .../libraries/armem/core/base/Memory.h        |  63 +++----
 .../armem/core/base/ProviderSegment.h         |  55 ++----
 .../armem/core/base/detail/EntityContainer.h  |  13 +-
 .../core/base/detail/TypedEntityContainer.h   |  12 +-
 .../armem/core/longtermMemory/CoreSegment.cpp |  34 +++-
 .../armem/core/longtermMemory/CoreSegment.h   |  13 +-
 .../armem/core/longtermMemory/Entity.cpp      |  26 +++
 .../armem/core/longtermMemory/Entity.h        |  11 ++
 .../core/longtermMemory/EntityInstance.cpp    |  13 +-
 .../core/longtermMemory/EntityInstance.h      |  10 +
 .../core/longtermMemory/EntitySnapshot.cpp    |  23 +++
 .../core/longtermMemory/EntitySnapshot.h      |  11 ++
 .../armem/core/longtermMemory/Memory.cpp      |  31 ++++
 .../armem/core/longtermMemory/Memory.h        |  20 +-
 .../core/longtermMemory/ProviderSegment.cpp   |  33 +++-
 .../core/longtermMemory/ProviderSegment.h     |  13 +-
 .../longtermMemory/detail/EntityContainer.h   |   4 +-
 .../detail/TypedEntityContainer.h             |   4 +-
 .../core/longtermMemory/ice_conversions.cpp   |   0
 .../core/longtermMemory/ice_conversions.h     |   0
 .../mongodb/MongoDBConnectionManager.h        |  54 ++++++
 .../armem/core/workingMemory/CoreSegment.cpp  |   8 +-
 .../armem/core/workingMemory/CoreSegment.h    |   5 +-
 .../armem/core/workingMemory/Entity.h         |   3 +
 .../armem/core/workingMemory/EntityInstance.h |   2 +
 .../armem/core/workingMemory/EntitySnapshot.h |   3 +
 .../armem/core/workingMemory/Memory.h         |   5 +-
 .../core/workingMemory/ProviderSegment.cpp    |   8 +-
 .../core/workingMemory/ProviderSegment.h      |   5 +-
 .../workingMemory/detail/EntityContainer.h    |   4 +-
 .../detail/TypedEntityContainer.h             |   4 +-
 .../armem/server/ComponentPlugin.cpp          |  15 +-
 .../libraries/armem/server/ComponentPlugin.h  |   8 +-
 .../armem/server/MemoryToIceAdapter.cpp       |  14 +-
 .../armem/server/MemoryToIceAdapter.h         |   2 +-
 .../query_proc/CoreSegmentQueryProcessor.cpp  |  79 --------
 .../query_proc/CoreSegmentQueryProcessor.h    |  45 -----
 .../query_proc/EntityQueryProcessor.cpp       | 159 ----------------
 .../server/query_proc/EntityQueryProcessor.h  |  50 -----
 .../query_proc/MemoryQueryProcessor.cpp       |  88 ---------
 .../server/query_proc/MemoryQueryProcessor.h  |  49 -----
 .../ProviderSegmentQueryProcessor.cpp         |  79 --------
 .../ProviderSegmentQueryProcessor.h           |  45 -----
 .../{ => base}/BaseQueryProcessor.cpp         |   0
 .../{ => base}/BaseQueryProcessor.h           |  20 +-
 .../base/CoreSegmentQueryProcessor.cpp        |  14 ++
 .../base/CoreSegmentQueryProcessor.h          |  97 ++++++++++
 .../query_proc/base/EntityQueryProcessor.cpp  |  13 ++
 .../query_proc/base/EntityQueryProcessor.h    | 172 ++++++++++++++++++
 .../query_proc/base/MemoryQueryProcessor.cpp  |  15 ++
 .../query_proc/base/MemoryQueryProcessor.h    |  94 ++++++++++
 .../base/ProviderSegmentQueryProcessor.cpp    |  15 ++
 .../base/ProviderSegmentQueryProcessor.h      |  95 ++++++++++
 .../longtermMemory/BaseQueryProcessor.cpp     |  13 ++
 .../longtermMemory/BaseQueryProcessor.h       |  26 +++
 .../CoreSegmentQueryProcessor.cpp             |  14 ++
 .../CoreSegmentQueryProcessor.h               |  37 ++++
 .../longtermMemory/EntityQueryProcessor.cpp   |  13 ++
 .../longtermMemory/EntityQueryProcessor.h     |  39 ++++
 .../longtermMemory/MemoryQueryProcessor.cpp   |  15 ++
 .../longtermMemory/MemoryQueryProcessor.h     |  36 ++++
 .../ProviderSegmentQueryProcessor.cpp         |  15 ++
 .../ProviderSegmentQueryProcessor.h           |  38 ++++
 .../workingMemory/BaseQueryProcessor.cpp      |  13 ++
 .../workingMemory/BaseQueryProcessor.h        |  28 +++
 .../CoreSegmentQueryProcessor.cpp             |  14 ++
 .../workingMemory/CoreSegmentQueryProcessor.h |  43 +++++
 .../workingMemory/EntityQueryProcessor.cpp    |  13 ++
 .../workingMemory/EntityQueryProcessor.h      |  52 ++++++
 .../workingMemory/MemoryQueryProcessor.cpp    |  15 ++
 .../workingMemory/MemoryQueryProcessor.h      |  59 ++++++
 .../ProviderSegmentQueryProcessor.cpp         |  15 ++
 .../ProviderSegmentQueryProcessor.h           |  42 +++++
 .../libraries/armem/test/ArMemQueryTest.cpp   |   6 +-
 .../libraries/armem_gui/LTMControlWidget.cpp  |  37 +---
 .../libraries/armem_gui/LTMControlWidget.h    |  15 +-
 .../libraries/armem_gui/MemoryViewer.cpp      |  43 ++---
 .../libraries/armem_gui/MemoryViewer.h        |   7 +-
 87 files changed, 1588 insertions(+), 998 deletions(-)
 delete mode 100644 source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.cpp
 delete mode 100644 source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.h
 create mode 100644 source/RobotAPI/libraries/armem/core/longtermMemory/mongodb/MongoDBConnectionManager.h
 delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.cpp
 delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.h
 delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.cpp
 delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.h
 delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.cpp
 delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.h
 delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.cpp
 delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.h
 rename source/RobotAPI/libraries/armem/server/query_proc/{ => base}/BaseQueryProcessor.cpp (100%)
 rename source/RobotAPI/libraries/armem/server/query_proc/{ => base}/BaseQueryProcessor.h (84%)
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.h
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.h

diff --git a/source/RobotAPI/interface/armem/io.ice b/source/RobotAPI/interface/armem/io.ice
index 853e8c1c8..f721edfad 100644
--- a/source/RobotAPI/interface/armem/io.ice
+++ b/source/RobotAPI/interface/armem/io.ice
@@ -10,31 +10,11 @@ module armarx
     {
         module data
         {
-            struct LoadInput
-            {
-                armarx::data::PackagePath packagePath;
-                armem::query::data::Input query;
-            };
-
-            struct LoadResult
-            {
-                bool success = false;
-                long timeStartedMicroSeconds;
-                long timeFinishedMicroSeconds;
-
-                long numLoadedCoreSegments;
-                long numLoadedProviderSegments;
-                long numLoadedEntities;
-                long numLoadedEntitySnapshots;
-
-                string errorMessage;
-            };
-
             struct StoreInput
             {
-                armarx::data::PackagePath packagePath;
                 armem::query::data::Input query;
             };
+            sequence<StoreInput> StoreInputSeq;
 
             struct StoreResult
             {
@@ -42,11 +22,6 @@ module armarx
                 long timeStartedMicroSeconds;
                 long timeFinishedMicroSeconds;
 
-                long numStoredCoreSegments;
-                long numStoredLoadedProviderSegments;
-                long numStoredLoadedEntities;
-                long numStoredLoadedEntitySnapshots;
-
                 string errorMessage;
             };
         };
diff --git a/source/RobotAPI/interface/armem/server/LoadingMemoryInterface.ice b/source/RobotAPI/interface/armem/server/LoadingMemoryInterface.ice
index 0fb10c441..bb1e7f221 100644
--- a/source/RobotAPI/interface/armem/server/LoadingMemoryInterface.ice
+++ b/source/RobotAPI/interface/armem/server/LoadingMemoryInterface.ice
@@ -11,7 +11,7 @@ module armarx
         {
             interface LoadingMemoryInterface
             {
-                data::LoadResult load(data::LoadInput input);
+                armem::query::data::Result load(armem::query::data::Input query);
             };
         };
     };
diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index 7551773bf..1f9fad1f9 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -42,7 +42,6 @@ set(LIB_FILES
     core/workingMemory/Memory.cpp
     core/workingMemory/ProviderSegment.cpp
 
-    core/longtermMemory/ice_conversions.cpp
     core/longtermMemory/CoreSegment.cpp
     core/longtermMemory/Entity.cpp
     core/longtermMemory/EntityInstance.cpp
@@ -67,11 +66,23 @@ set(LIB_FILES
     server/MemoryRemoteGui.cpp
     server/RemoteGuiAronDataVisitor.cpp
 
-    server/query_proc/BaseQueryProcessor.cpp
-    server/query_proc/EntityQueryProcessor.cpp
-    server/query_proc/ProviderSegmentQueryProcessor.cpp
-    server/query_proc/CoreSegmentQueryProcessor.cpp
-    server/query_proc/MemoryQueryProcessor.cpp
+    server/query_proc/base/BaseQueryProcessor.cpp
+    server/query_proc/base/EntityQueryProcessor.cpp
+    server/query_proc/base/ProviderSegmentQueryProcessor.cpp
+    server/query_proc/base/CoreSegmentQueryProcessor.cpp
+    server/query_proc/base/MemoryQueryProcessor.cpp
+
+    server/query_proc/workingMemory/BaseQueryProcessor.cpp
+    server/query_proc/workingMemory/EntityQueryProcessor.cpp
+    server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp
+    server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp
+    server/query_proc/workingMemory/MemoryQueryProcessor.cpp
+
+    server/query_proc/longtermMemory/BaseQueryProcessor.cpp
+    server/query_proc/longtermMemory/EntityQueryProcessor.cpp
+    server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp
+    server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp
+    server/query_proc/longtermMemory/MemoryQueryProcessor.cpp
 
     mns/MemoryNameSystem.cpp
     mns/ClientPlugin.cpp
@@ -122,13 +133,13 @@ set(LIB_HEADERS
     core/longtermMemory/detail/EntityContainer.h
     core/longtermMemory/detail/TypedEntityContainer.h
 
-    core/longtermMemory/ice_conversions.h
     core/longtermMemory/CoreSegment.h
     core/longtermMemory/Entity.h
     core/longtermMemory/EntityInstance.h
     core/longtermMemory/EntitySnapshot.h
     core/longtermMemory/Memory.h
     core/longtermMemory/ProviderSegment.h
+    core/longtermMemory/mongodb/MongoDBConnectionManager.h
 
     client.h
     client/ComponentPlugin.h
@@ -151,11 +162,23 @@ set(LIB_HEADERS
     server/RemoteGuiAronDataVisitor.h
 
     server/query_proc.h
-    server/query_proc/BaseQueryProcessor.h
-    server/query_proc/EntityQueryProcessor.h
-    server/query_proc/ProviderSegmentQueryProcessor.h
-    server/query_proc/CoreSegmentQueryProcessor.h
-    server/query_proc/MemoryQueryProcessor.h
+    server/query_proc/base/BaseQueryProcessor.h
+    server/query_proc/base/EntityQueryProcessor.h
+    server/query_proc/base/ProviderSegmentQueryProcessor.h
+    server/query_proc/base/CoreSegmentQueryProcessor.h
+    server/query_proc/base/MemoryQueryProcessor.h
+
+    server/query_proc/workingMemory/BaseQueryProcessor.h
+    server/query_proc/workingMemory/EntityQueryProcessor.h
+    server/query_proc/workingMemory/ProviderSegmentQueryProcessor.h
+    server/query_proc/workingMemory/CoreSegmentQueryProcessor.h
+    server/query_proc/workingMemory/MemoryQueryProcessor.h
+
+    server/query_proc/longtermMemory/BaseQueryProcessor.h
+    server/query_proc/longtermMemory/EntityQueryProcessor.h
+    server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h
+    server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h
+    server/query_proc/longtermMemory/MemoryQueryProcessor.h
 
     mns.h
     mns/MemoryNameSystem.h
diff --git a/source/RobotAPI/libraries/armem/client/Reader.cpp b/source/RobotAPI/libraries/armem/client/Reader.cpp
index 8c336da2f..ac6eb489b 100644
--- a/source/RobotAPI/libraries/armem/client/Reader.cpp
+++ b/source/RobotAPI/libraries/armem/client/Reader.cpp
@@ -9,7 +9,7 @@
 namespace armarx::armem::client
 {
 
-    Reader::Reader(server::ReadingMemoryInterfacePrx memory) : memory(memory)
+    Reader::Reader(server::ReadingMemoryInterfacePrx memory) : memoryPrx(memory)
     {
     }
 
@@ -33,7 +33,7 @@ namespace armarx::armem::client
         armem::query::data::Result result;
         try
         {
-            result = memory->query(input);
+            result = memoryPrx->query(input);
         }
         catch (const Ice::ConnectionRefusedException& e)
         {
@@ -63,7 +63,7 @@ namespace armarx::armem::client
         return this->query(input);
     }
 
-    QueryResult Reader::getAll(DataMode dataMode)
+    QueryResult Reader::getAll(DataMode dataMode) const
     {
         using namespace client::query_fns;
 
@@ -73,7 +73,7 @@ namespace armarx::armem::client
         return this->query(qb.buildQueryInput());
     }
 
-    QueryResult Reader::getLatestSnapshots(DataMode dataMode)
+    QueryResult Reader::getLatestSnapshots(DataMode dataMode) const
     {
         using namespace client::query_fns;
 
@@ -84,7 +84,7 @@ namespace armarx::armem::client
     }
 
     void
-    Reader::updated(const std::vector<MemoryID>& updatedSnapshotIDs)
+    Reader::updated(const std::vector<MemoryID>& updatedSnapshotIDs) const
     {
         for (const auto& [subscription, callback] : callbacks)
         {
@@ -105,6 +105,24 @@ namespace armarx::armem::client
         }
     }
 
+    data::StoreResult
+    Reader::readAndStore(const data::StoreInput& input) const
+    {
+        ARMARX_IMPORTANT << "Trying to cast the proxy!";
+        server::StoringMemoryInterfacePrx storingMemoryPrx = server::StoringMemoryInterfacePrx::uncheckedCast(memoryPrx);
+        ARMARX_IMPORTANT << "Uncehcked cast done.";
+        if (storingMemoryPrx)
+        {
+
+            return storingMemoryPrx->store(input);
+        }
+        else
+        {
+            ARMARX_WARNING << "Could not store a query into the LTM. It seems like the Memory does not implement the StoringMemoryInterface.";
+            return {};
+        }
+    }
+
 
     void
     Reader::subscribe(const MemoryID& id, callback callback)
@@ -116,7 +134,7 @@ namespace armarx::armem::client
     void
     Reader::setReadingMemory(server::ReadingMemoryInterfacePrx memory)
     {
-        this->memory = memory;
+        this->memoryPrx = memory;
     }
 
 }
diff --git a/source/RobotAPI/libraries/armem/client/Reader.h b/source/RobotAPI/libraries/armem/client/Reader.h
index 8164cc7f7..17076216a 100644
--- a/source/RobotAPI/libraries/armem/client/Reader.h
+++ b/source/RobotAPI/libraries/armem/client/Reader.h
@@ -8,6 +8,7 @@
 
 // RobotAPI
 #include <RobotAPI/interface/armem/server/ReadingMemoryInterface.h>
+#include <RobotAPI/interface/armem/server/StoringMemoryInterface.h>
 #include <RobotAPI/interface/armem/client/MemoryListenerInterface.h>
 #include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
 #include <RobotAPI/libraries/armem/core/workingMemory/Memory.h>
@@ -39,7 +40,6 @@ namespace armarx::armem::client
 
         void setReadingMemory(server::ReadingMemoryInterfacePrx memory);
 
-
         QueryResult query(const QueryInput& input) const;
         armem::query::data::Result query(const armem::query::data::Input& input) const;
 
@@ -47,9 +47,11 @@ namespace armarx::armem::client
         QueryResult query(const armem::query::data::MemoryQuerySeq& queries, DataMode dataMode = DataMode::WithData) const;
 
 
-        QueryResult getAll(DataMode dataMode = DataMode::WithData);
-        QueryResult getLatestSnapshots(DataMode dataMode = DataMode::WithData);
+        QueryResult getAll(DataMode dataMode = DataMode::WithData) const;
+        QueryResult getLatestSnapshots(DataMode dataMode = DataMode::WithData) const;
 
+        //data::StoreResult readAndStore(data::StoreInputSeq& input);
+        data::StoreResult readAndStore(const data::StoreInput& input) const;
 
         void subscribe(const MemoryID& subscriptionID, callback callback);
         /**
@@ -68,17 +70,17 @@ namespace armarx::armem::client
             subscribe(subscriptionID, cb);
         }
         /// Function handling updates from the MemoryListener ice topic.
-        void updated(const std::vector<MemoryID>& updatedIDs);
+        void updated(const std::vector<MemoryID>& updatedIDs) const;
 
 
         inline operator bool() const
         {
-            return bool(memory);
+            return bool(memoryPrx);
         }
 
     public:
 
-        server::ReadingMemoryInterfacePrx memory;
+        server::ReadingMemoryInterfacePrx memoryPrx;
 
     private:
 
diff --git a/source/RobotAPI/libraries/armem/core/base/CoreSegment.h b/source/RobotAPI/libraries/armem/core/base/CoreSegment.h
index 64223917a..f0f02976d 100644
--- a/source/RobotAPI/libraries/armem/core/base/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/core/base/CoreSegment.h
@@ -14,38 +14,16 @@ namespace armarx::armem
     /**
      * @brief Data of a core segment containing multiple provider segments.
      */
-    template <class _ProviderSegmentT, class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived>
+    template <class _ProviderSegmentT, class Derived>
     class CoreSegmentBase :
-        virtual public detail::TypedEntityContainerBase<_ProviderSegmentT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>,
+        virtual public detail::TypedEntityContainerBase<_ProviderSegmentT, typename _ProviderSegmentT::EntityT, Derived>,
         virtual public armarx::armem::detail::MaxHistorySize
     {
-        using Base = detail::TypedEntityContainerBase<_ProviderSegmentT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>;
+        using Base = detail::TypedEntityContainerBase<_ProviderSegmentT, typename _ProviderSegmentT::EntityT, Derived>;
 
-    public:
-        using ProviderSegmentT = _ProviderSegmentT;
-        using EntityT = _EntityT;
+        using _EntityT = typename _ProviderSegmentT::EntityT;
 
     public:
-        /*CoreSegmentBase();
-        CoreSegmentBase(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) :
-            CoreSegmentBase(name, MemoryID(), aronType)
-        {
-        }
-
-        CoreSegmentBase(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) :
-            CoreSegmentBase(parentID.getMemoryID().withCoreSegmentName(name), aronType)
-        {
-        }
-
-        CoreSegmentBase(const MemoryID& id, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) :
-            Base(id, aronType)
-        {
-        }
-
-        CoreSegmentBase(const CoreSegmentBase& other) : Base(other)
-        {
-            // *this = other;
-        }*/
 
         CoreSegmentBase& operator=(const CoreSegmentBase& other)
         {
@@ -65,13 +43,13 @@ namespace armarx::armem
 
 
         using Base::container;
-        inline const std::map<std::string, ProviderSegmentT>& providerSegments() const
+        inline const std::map<std::string, _ProviderSegmentT>& providerSegments() const
         {
             return container;
         }
-        inline std::map<std::string, ProviderSegmentT>& providerSegments()
+        inline std::map<std::string, _ProviderSegmentT>& providerSegments()
         {
-            return const_cast<std::map<std::string, ProviderSegmentT>&>(const_cast<const CoreSegmentBase*>(this)->providerSegments());
+            return const_cast<std::map<std::string, _ProviderSegmentT>&>(const_cast<const CoreSegmentBase*>(this)->providerSegments());
         }
 
 
@@ -80,12 +58,12 @@ namespace armarx::armem
             return container.count(name) > 0;
         }
 
-        ProviderSegmentT& getProviderSegment(const std::string& name)
+        _ProviderSegmentT& getProviderSegment(const std::string& name)
         {
-            return const_cast<ProviderSegmentT&>(const_cast<const CoreSegmentBase*>(this)->getProviderSegment(name));
+            return const_cast<_ProviderSegmentT&>(const_cast<const CoreSegmentBase*>(this)->getProviderSegment(name));
         }
 
-        const ProviderSegmentT& getProviderSegment(const std::string& name) const
+        const _ProviderSegmentT& getProviderSegment(const std::string& name) const
         {
             auto it = this->container.find(name);
             if (it != container.end())
@@ -99,7 +77,7 @@ namespace armarx::armem
         }
 
         using Base::_checkContainerName;
-        const EntityT& getEntity(const MemoryID& id) const override
+        const _EntityT& getEntity(const MemoryID& id) const override
         {
             _checkContainerName(id.coreSegmentName, this->getKeyString());
             return getProviderSegment(id.providerSegmentName).getEntity(id);
@@ -126,20 +104,20 @@ namespace armarx::armem
          * @param providerSegmentType The provider type. If nullptr, the core segment type is used.
          * @return The added provider segment.
          */
-        ProviderSegmentT& addProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr providerSegmentType = nullptr)
+        _ProviderSegmentT& addProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr providerSegmentType = nullptr)
         {
             aron::typenavigator::ObjectNavigatorPtr type = providerSegmentType ? providerSegmentType : this->aronType;
-            return addProviderSegment(ProviderSegmentT(name, type));
+            return addProviderSegment(_ProviderSegmentT(name, type));
         }
 
         /// Copy and insert a provider segment.
-        ProviderSegmentT& addProviderSegment(const ProviderSegmentT& providerSegment)
+        _ProviderSegmentT& addProviderSegment(const _ProviderSegmentT& providerSegment)
         {
             return addProviderSegment(ProviderSegment(providerSegment));
         }
 
         /// Move and insert a provider segment.
-        ProviderSegmentT& addProviderSegment(ProviderSegmentT&& providerSegment)
+        _ProviderSegmentT& addProviderSegment(_ProviderSegmentT&& providerSegment)
         {
             if (hasProviderSegment(providerSegment.name()))
             {
diff --git a/source/RobotAPI/libraries/armem/core/base/Entity.h b/source/RobotAPI/libraries/armem/core/base/Entity.h
index 05cd45008..f52944ccc 100644
--- a/source/RobotAPI/libraries/armem/core/base/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/base/Entity.h
@@ -41,29 +41,6 @@ namespace armarx::armem
         using Base = detail::MemoryContainerBase<std::map<Time, _EntitySnapshotT>, Derived>;
 
     public:
-        using EntitySnapshotT = _EntitySnapshotT;
-
-
-    public:
-
-        /*EntityBase()
-        {}
-
-        EntityBase(const std::string& name, const MemoryID& parentID = {}) :
-            EntityBase(parentID.withEntityName(name))
-        {}
-
-        EntityBase(const MemoryID& id) :
-            Base(id)
-        {}
-
-        /// Copy the history from `other` to this.
-        EntityBase(const EntityBase& other) :
-            Base(id)
-        {
-            // *this = other;
-        }*/
-
         EntityBase& operator=(const EntityBase& other)
         {
             other._copySelf(*this);
@@ -149,12 +126,12 @@ namespace armarx::armem
          * @throws `armem::error::MissingEntry` If there is no such entry.
          * @throws `armem::error::MissingData` If the entry has no data.
          */
-        EntitySnapshotT& getSnapshot(Time time)
+        _EntitySnapshotT& getSnapshot(Time time)
         {
-            return const_cast<EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getSnapshot(time));
+            return const_cast<_EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getSnapshot(time));
         }
 
-        const EntitySnapshotT& getSnapshot(Time time) const
+        const _EntitySnapshotT& getSnapshot(Time time) const
         {
             auto it = container.find(time);
             if (it != container.end())
@@ -167,12 +144,12 @@ namespace armarx::armem
             }
         }
 
-        EntitySnapshotT& getSnapshot(const MemoryID& id)
+        _EntitySnapshotT& getSnapshot(const MemoryID& id)
         {
-            return const_cast<EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getSnapshot(id));
+            return const_cast<_EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getSnapshot(id));
         }
 
-        const EntitySnapshotT& getSnapshot(const MemoryID& id) const
+        const _EntitySnapshotT& getSnapshot(const MemoryID& id) const
         {
             checkEntityName(id.entityName);
             return getSnapshot(id.timestamp);
@@ -184,12 +161,12 @@ namespace armarx::armem
          * @throw `armem::error::EntityHistoryEmpty` If the history is empty.
          * @throw `armem::error::MissingData` If the latest snapshot has no data.
          */
-        EntitySnapshotT& getLatestSnapshot()
+        _EntitySnapshotT& getLatestSnapshot()
         {
-            return const_cast<EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getLatestSnapshot());
+            return const_cast<_EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getLatestSnapshot());
         }
 
-        const EntitySnapshotT& getLatestSnapshot() const
+        const _EntitySnapshotT& getLatestSnapshot() const
         {
             return getLatestItem().second;
         }
@@ -205,7 +182,7 @@ namespace armarx::armem
             checkEntityName(update.entityID.entityName);
             id = update.entityID;
 
-            EntitySnapshotT* snapshot;
+            _EntitySnapshotT* snapshot;
 
             auto it = container.find(update.timeCreated);
             if (it == container.end())
@@ -229,21 +206,21 @@ namespace armarx::armem
          * @param snapshot The snapshot.
          * @return The stored snapshot.
          */
-        EntitySnapshotT& addSnapshot(const EntitySnapshotT& snapshot)
+        _EntitySnapshotT& addSnapshot(const _EntitySnapshotT& snapshot)
         {
-            return addSnapshot(EntitySnapshotT(snapshot));
+            return addSnapshot(_EntitySnapshotT(snapshot));
         }
 
-        EntitySnapshotT& addSnapshot(EntitySnapshotT&& snapshot)
+        _EntitySnapshotT& addSnapshot(_EntitySnapshotT&& snapshot)
         {
             auto it = container.emplace(snapshot.time(), std::move(snapshot)).first;
             it->second.id.setEntityID(id);
             return it->second;
         }
 
-        EntitySnapshotT& addSnapshot(const Time& timestamp)
+        _EntitySnapshotT& addSnapshot(const Time& timestamp)
         {
-            return addSnapshot(EntitySnapshotT(timestamp));
+            return addSnapshot(_EntitySnapshotT(timestamp));
         }
 
 
@@ -319,7 +296,7 @@ namespace armarx::armem
          * @return The latest snapshot.
          * @throw `armem::error::EntityHistoryEmpty` If the history is empty.
          */
-        const typename std::map<Time, EntitySnapshotT>::value_type& getLatestItem() const
+        const typename std::map<Time, _EntitySnapshotT>::value_type& getLatestItem() const
         {
             if (container.empty())
             {
diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstance.h b/source/RobotAPI/libraries/armem/core/base/EntityInstance.h
index f6d3e3baa..32f6bdbbd 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityInstance.h
@@ -16,23 +16,12 @@ namespace armarx::armem
      */
     template <class Derived>
     class EntityInstanceBase :
-            virtual public armarx::armem::detail::MemoryItem
+        virtual public armarx::armem::detail::MemoryItem
     {
         using Base = armarx::armem::detail::MemoryItem;
 
     public:
 
-        /*EntityInstanceBase()
-        {}
-
-        EntityInstanceBase(int index, const MemoryID& parentID = {}) :
-            EntityInstanceBase(parentID.withInstanceIndex(index))
-        {}
-
-        EntityInstanceBase(const MemoryID& id) :
-            Base(id)
-        {}*/
-
         EntityInstanceBase& operator=(const EntityInstanceBase& other)
         {
             //other._copySelf(*this);
diff --git a/source/RobotAPI/libraries/armem/core/base/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/base/EntitySnapshot.h
index e4b527b6e..341b1e448 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntitySnapshot.h
@@ -22,24 +22,6 @@ namespace armarx::armem
         using Base = detail::MemoryContainerBase<std::vector<_EntityInstanceT>, Derived>;
 
     public:
-        using EntityInstanceT = _EntityInstanceT;
-
-    public:
-        /*EntitySnapshotBase()
-        {}
-
-        EntitySnapshotBase(Time time, const MemoryID& parentID = {})  :
-            EntitySnapshotBase(parentID.withTimestamp(time))
-        {}
-
-        EntitySnapshotBase(const MemoryID& id) : Base(id)
-        {}
-
-        /// Copy the container from `other` to this.
-        EntitySnapshotBase(const EntitySnapshotBase& other) : Base(other)
-        {
-            // *this = other;
-        }*/
 
         EntitySnapshotBase& operator=(const EntitySnapshotBase& other)
         {
@@ -101,7 +83,7 @@ namespace armarx::armem
             container.clear();
             for (int i = 0; i < int(update.instancesData.size()); ++i)
             {
-                EntityInstanceT& data = container.emplace_back(i, id);
+                _EntityInstanceT& data = container.emplace_back(i, id);
                 data.update(update, i);
             }
         }
@@ -119,12 +101,12 @@ namespace armarx::armem
          * @return The instance.
          * @throw `armem::error::MissingEntry` If the given index is invalid.
          */
-        EntityInstanceT& getInstance(int index)
+        _EntityInstanceT& getInstance(int index)
         {
-            return const_cast<EntityInstanceT&>(const_cast<const EntitySnapshotBase*>(this)->getInstance(index));
+            return const_cast<_EntityInstanceT&>(const_cast<const EntitySnapshotBase*>(this)->getInstance(index));
         }
 
-        const EntityInstanceT& getInstance(int index) const
+        const _EntityInstanceT& getInstance(int index) const
         {
             if (hasInstance(index))
             {
@@ -133,7 +115,7 @@ namespace armarx::armem
             }
             else
             {
-                throw armem::error::MissingEntry(EntityInstanceT().getLevelName(), std::to_string(index), getLevelName(), toDateTimeMilliSeconds(time()));
+                throw armem::error::MissingEntry(_EntityInstanceT().getLevelName(), std::to_string(index), getLevelName(), toDateTimeMilliSeconds(time()));
             }
         }
 
@@ -144,12 +126,12 @@ namespace armarx::armem
          * @throw `armem::error::MissingEntry` If the given index is invalid.
          * @throw `armem::error::InvalidMemoryID` If memory ID does not have an instance index.
          */
-        EntityInstanceT& getInstance(const MemoryID& id)
+        _EntityInstanceT& getInstance(const MemoryID& id)
         {
-            return const_cast<EntityInstanceT&>(const_cast<const EntitySnapshotBase*>(this)->getInstance(id));
+            return const_cast<_EntityInstanceT&>(const_cast<const EntitySnapshotBase*>(this)->getInstance(id));
         }
 
-        const EntityInstanceT& getInstance(const MemoryID& id) const
+        const _EntityInstanceT& getInstance(const MemoryID& id) const
         {
             if (!id.hasInstanceIndex())
             {
@@ -165,12 +147,12 @@ namespace armarx::armem
          * @return The stored instance.
          * @throw `armem::error::InvalidArgument` If the given index is invalid. Must be equal to container.size() or -1 (meaning push_back)
          */
-        EntityInstanceT& addInstance(const EntityInstanceT& instance)
+        _EntityInstanceT& addInstance(const _EntityInstanceT& instance)
         {
-            return addInstance(EntityInstanceT(instance));
+            return addInstance(_EntityInstanceT(instance));
         }
 
-        EntityInstanceT& addInstance(EntityInstanceT&& instance)
+        _EntityInstanceT& addInstance(_EntityInstanceT&& instance)
         {
             if (instance.index() > 0 && (size_t) instance.index() < container.size())
             {
diff --git a/source/RobotAPI/libraries/armem/core/base/Memory.h b/source/RobotAPI/libraries/armem/core/base/Memory.h
index cf1a18020..99e820796 100644
--- a/source/RobotAPI/libraries/armem/core/base/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/base/Memory.h
@@ -3,7 +3,7 @@
 #include <map>
 #include <string>
 
-#include "ProviderSegment.h"
+#include "CoreSegment.h"
 #include "detail/EntityContainer.h"
 
 namespace armarx::armem
@@ -12,36 +12,15 @@ namespace armarx::armem
     /**
      * @brief Data of a memory consisting of multiple core segments.
      */
-    template <class _CoreSegmentT, class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived>
+    template <class _CoreSegmentT, class Derived>
     class MemoryBase :
-        virtual public detail::EntityContainerBase<_CoreSegmentT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>
+        virtual public detail::EntityContainerBase<_CoreSegmentT, typename _CoreSegmentT::ProviderSegmentT::EntityT, Derived>
     {
-        using Base = detail::EntityContainerBase<_CoreSegmentT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>;
+        using Base = detail::EntityContainerBase<_CoreSegmentT, typename _CoreSegmentT::ProviderSegmentT::EntityT, Derived>;
 
-    public:
-        using CoreSegmentT = _CoreSegmentT;
-        using EntityT = _EntityT;
+        using _EntityT = typename _CoreSegmentT::ProviderSegmentT::EntityT;
 
     public:
-        /*MemoryBase()
-        {}
-
-        MemoryBase(const std::string& name) :
-            MemoryBase(MemoryID().withMemoryName(name))
-        {
-        }
-
-        MemoryBase(const MemoryID& id) :
-            Base(id)
-        {
-        }
-
-        MemoryBase(const MemoryBase& other) :
-            Base(other)
-        {
-            // *this = other;
-        }*/
-
         MemoryBase& operator=(const MemoryBase& other)
         {
             other._copySelf(*this);
@@ -60,13 +39,13 @@ namespace armarx::armem
 
 
         using Base::container;
-        inline const std::map<std::string, CoreSegmentT>& coreSegments() const
+        inline const std::map<std::string, _CoreSegmentT>& coreSegments() const
         {
             return container;
         }
-        inline std::map<std::string, CoreSegmentT>& coreSegments()
+        inline std::map<std::string, _CoreSegmentT>& coreSegments()
         {
-            return const_cast<std::map<std::string, CoreSegmentT>&>(const_cast<const MemoryBase*>(this)->coreSegments());
+            return const_cast<std::map<std::string, _CoreSegmentT>&>(const_cast<const MemoryBase*>(this)->coreSegments());
         }
 
 
@@ -75,12 +54,12 @@ namespace armarx::armem
             return container.count(name) > 0;
         }
 
-        CoreSegmentT& getCoreSegment(const std::string& name)
+        _CoreSegmentT& getCoreSegment(const std::string& name)
         {
-            return const_cast<CoreSegmentT&>(const_cast<const MemoryBase*>(this)->getCoreSegment(name));
+            return const_cast<_CoreSegmentT&>(const_cast<const MemoryBase*>(this)->getCoreSegment(name));
         }
 
-        const CoreSegmentT& getCoreSegment(const std::string& name) const
+        const _CoreSegmentT& getCoreSegment(const std::string& name) const
         {
             auto it = this->container.find(name);
             if (it != container.end())
@@ -89,12 +68,12 @@ namespace armarx::armem
             }
             else
             {
-                throw armem::error::MissingEntry(CoreSegmentT().getLevelName(), name, getLevelName(), this->name());
+                throw armem::error::MissingEntry(_CoreSegmentT().getLevelName(), name, getLevelName(), this->name());
             }
         }
 
         using Base::_checkContainerName;
-        const EntityT& getEntity(const MemoryID& id) const override
+        const _EntityT& getEntity(const MemoryID& id) const override
         {
             _checkContainerName(id.memoryName, this->name());
             return getCoreSegment(id.coreSegmentName).getEntity(id);
@@ -106,17 +85,17 @@ namespace armarx::armem
          * @param coreSegmentType The core segment type (optional).
          * @return The added core segment.
          */
-        CoreSegmentT& addCoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr coreSegmentType = nullptr)
+        _CoreSegmentT& addCoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr coreSegmentType = nullptr)
         {
-            return addCoreSegment(CoreSegmentT(name, coreSegmentType));
+            return addCoreSegment(_CoreSegmentT(name, coreSegmentType));
         }
         /// Copy and insert a core segment.
-        CoreSegmentT& addCoreSegment(const CoreSegmentT& coreSegment)
+        _CoreSegmentT& addCoreSegment(const _CoreSegmentT& coreSegment)
         {
-            return addCoreSegment(CoreSegmentT(coreSegment));
+            return addCoreSegment(_CoreSegmentT(coreSegment));
         }
         /// Move and insert a core segment.
-        CoreSegmentT& addCoreSegment(CoreSegmentT&& coreSegment)
+        _CoreSegmentT& addCoreSegment(_CoreSegmentT&& coreSegment)
         {
             if (container.count(coreSegment.name()) > 0)
             {
@@ -133,9 +112,9 @@ namespace armarx::armem
          * @param The core segment names.
          * @return The core segments. The contained pointers are never null.
          */
-        std::vector<CoreSegmentT*> addCoreSegments(const std::vector<std::string>& names)
+        std::vector<_CoreSegmentT*> addCoreSegments(const std::vector<std::string>& names)
         {
-            std::vector<CoreSegmentT*> segments;
+            std::vector<_CoreSegmentT*> segments;
             for (const auto& name : names)
             {
                 try
@@ -161,7 +140,7 @@ namespace armarx::armem
             }
             else
             {
-                throw armem::error::MissingEntry(CoreSegmentT().getLevelName(), update.entityID.coreSegmentName, getLevelName(), this->name());
+                throw armem::error::MissingEntry(_CoreSegmentT().getLevelName(), update.entityID.coreSegmentName, getLevelName(), this->name());
             }
         }
 
diff --git a/source/RobotAPI/libraries/armem/core/base/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/base/ProviderSegment.h
index 1ef59929b..e2e789c5f 100644
--- a/source/RobotAPI/libraries/armem/core/base/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/base/ProviderSegment.h
@@ -14,37 +14,14 @@ namespace armarx::armem
     /**
      * @brief Data of a provider segment containing multiple entities.
      */
-    template <class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived>
+    template <class _EntityT, class Derived>
     class ProviderSegmentBase :
-        virtual public detail::TypedEntityContainerBase<_EntityT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>,
+        virtual public detail::TypedEntityContainerBase<_EntityT, _EntityT, Derived>,
         virtual public armarx::armem::detail::MaxHistorySize
     {
-        using Base = detail::TypedEntityContainerBase<_EntityT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>;
+        using Base = detail::TypedEntityContainerBase<_EntityT, _EntityT, Derived>;
 
     public:
-        using EntityT = _EntityT;
-
-    public:
-        /*ProviderSegmentBase()
-        {}
-
-        ProviderSegmentBase(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) :
-            ProviderSegmentBase(name, MemoryID(), aronType)
-        {
-        }
-        ProviderSegmentBase(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) :
-            ProviderSegmentBase(parentID.withProviderSegmentName(name), aronType)
-        {
-        }
-        ProviderSegmentBase(const MemoryID id, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) :
-            Base(id, aronType)
-        {
-        }
-
-        ProviderSegmentBase(const ProviderSegmentBase& other) : Base(other)
-        {
-            // *this = other;
-        }*/
 
         ProviderSegmentBase& operator=(const ProviderSegmentBase& other)
         {
@@ -64,13 +41,13 @@ namespace armarx::armem
 
 
         using Base::container;
-        inline const std::map<std::string, EntityT>& entities() const
+        inline const std::map<std::string, _EntityT>& entities() const
         {
             return container;
         }
-        inline std::map<std::string, EntityT>& entities()
+        inline std::map<std::string, _EntityT>& entities()
         {
-            return const_cast<std::map<std::string, EntityT>&>(const_cast<const ProviderSegmentBase*>(this)->entities());
+            return const_cast<std::map<std::string, _EntityT>&>(const_cast<const ProviderSegmentBase*>(this)->entities());
         }
 
 
@@ -80,18 +57,18 @@ namespace armarx::armem
         }
 
         using Base::_checkContainerName;
-        const EntityT& getEntity(const MemoryID& id) const override
+        const _EntityT& getEntity(const MemoryID& id) const override
         {
             _checkContainerName(id.providerSegmentName, this->getKeyString());
             return getEntity(id.entityName);
         }
 
-        EntityT& getEntity(const std::string& name)
+        _EntityT& getEntity(const std::string& name)
         {
-            return const_cast<EntityT&>(const_cast<const ProviderSegmentBase*>(this)->getEntity(name));
+            return const_cast<_EntityT&>(const_cast<const ProviderSegmentBase*>(this)->getEntity(name));
         }
 
-        const EntityT& getEntity(const std::string& name) const
+        const _EntityT& getEntity(const std::string& name) const
         {
             auto it = this->container.find(name);
             if (it != container.end())
@@ -113,7 +90,7 @@ namespace armarx::armem
         {
             _checkContainerName(update.entityID.providerSegmentName, this->name());
 
-            EntityT* entity;
+            _EntityT* entity;
             auto it = this->container.find(update.entityID.providerSegmentName);
             if (it == container.end())
             {
@@ -130,17 +107,17 @@ namespace armarx::armem
         }
 
         /// Add an empty entity with the given name.
-        EntityT& addEntity(const std::string& name)
+        _EntityT& addEntity(const std::string& name)
         {
-            return addEntity(EntityT(name));
+            return addEntity(_EntityT(name));
         }
         /// Copy and insert an entity.
-        EntityT& addEntity(const EntityT& entity)
+        _EntityT& addEntity(const _EntityT& entity)
         {
-            return addEntity(EntityT(entity));
+            return addEntity(_EntityT(entity));
         }
         /// Move and insert an entity.
-        EntityT& addEntity(EntityT&& entity)
+        _EntityT& addEntity(_EntityT&& entity)
         {
             auto it = container.emplace(entity.name(), std::move(entity)).first;
             it->second.id.setProviderSegmentID(id);
diff --git a/source/RobotAPI/libraries/armem/core/base/detail/EntityContainer.h b/source/RobotAPI/libraries/armem/core/base/detail/EntityContainer.h
index f241353a5..fd2c66107 100644
--- a/source/RobotAPI/libraries/armem/core/base/detail/EntityContainer.h
+++ b/source/RobotAPI/libraries/armem/core/base/detail/EntityContainer.h
@@ -17,19 +17,16 @@ namespace armarx::armem::detail
      *
      * Can be updated by multiple entity updates.
      */
-    template <class _ValueT, class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived>
+    template <class _ValueT, class _EntityT, class Derived>
     class EntityContainerBase :
-            virtual public MemoryContainerBase<std::map<std::string, _ValueT>, Derived>
+        virtual public MemoryContainerBase<std::map<std::string, _ValueT>, Derived>
     {
         using Base = MemoryContainerBase<std::map<std::string, _ValueT>, Derived>;
 
-    public:
-        /*EntityContainerBase()
-        {}
-        EntityContainerBase(const MemoryID& id) :
-            MemoryItem(id)
-        {}*/
+        using _EntitySnapshotT = typename _EntityT::EntitySnapshotT;
+        using _EntityInstanceT = typename _EntitySnapshotT::EntityInstanceT;
 
+    public:
         EntityContainerBase& operator=(const EntityContainerBase& other)
         {
             other._copySelf(*this);
diff --git a/source/RobotAPI/libraries/armem/core/base/detail/TypedEntityContainer.h b/source/RobotAPI/libraries/armem/core/base/detail/TypedEntityContainer.h
index f9860959f..3c067aca8 100644
--- a/source/RobotAPI/libraries/armem/core/base/detail/TypedEntityContainer.h
+++ b/source/RobotAPI/libraries/armem/core/base/detail/TypedEntityContainer.h
@@ -10,19 +10,21 @@ namespace armarx::armem::detail
     /**
      * @brief An entity container with a specific (Aron) type.
      */
-    template <class _ValueT, class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived>
+    template <class _ValueT, class _EntityT, class Derived>
     class TypedEntityContainerBase :
-            virtual public EntityContainerBase<_ValueT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>
+        virtual public EntityContainerBase<_ValueT, _EntityT, Derived>
     {
-        using Base = EntityContainerBase<_ValueT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>;
+        using Base = EntityContainerBase<_ValueT, _EntityT, Derived>;
 
-    public:
+        using _EntitySnapshotT = typename _EntityT::EntitySnapshotT;
+        using _EntityInstanceT = typename _EntitySnapshotT::EntityInstanceT;
 
+    public:
         TypedEntityContainerBase(aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) :
             aronType(aronType)
         {}
 
-        TypedEntityContainerBase(const TypedEntityContainerBase<_ValueT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>& other) :
+        TypedEntityContainerBase(const TypedEntityContainerBase<_ValueT, _EntityT, Derived>& other) :
             MemoryItem(other),
             MemoryContainerBase<std::map<std::string, _ValueT>, Derived>(other),
             aronType(other.aronType)
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.cpp
index 3d42bbbe5..c4c12bf1a 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.cpp
@@ -14,26 +14,26 @@ namespace armarx::armem::longtermmemory
 
     CoreSegment::CoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(MemoryID().withCoreSegmentName(name)),
-        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(MemoryID().withCoreSegmentName(name), aronType)
+        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(MemoryID().withCoreSegmentName(name), aronType)
     {
     }
 
     CoreSegment::CoreSegment(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(MemoryID().withCoreSegmentName(name)),
-        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(parentID.withCoreSegmentName(name), aronType)
+        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(parentID.withCoreSegmentName(name), aronType)
     {
     }
 
     CoreSegment::CoreSegment(const MemoryID& id, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(id),
-        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(id, aronType)
+        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(id, aronType)
     {
     }
 
     CoreSegment::CoreSegment(const CoreSegment& other) :
         armarx::armem::detail::MemoryItem(other),
         MemoryContainerBase<std::map<std::string, ProviderSegment>, CoreSegment>(other),
-        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(other)
+        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(other)
     {
     }
 
@@ -42,4 +42,30 @@ namespace armarx::armem::longtermmemory
         other._copySelf(*this);
         return *this;
     }
+
+    workingmemory::CoreSegment CoreSegment::convert() const
+    {
+        workingmemory::CoreSegment m;
+        for (const auto& [_, s] : container)
+        {
+            m.addProviderSegment(s.convert());
+        }
+        return m;
+    }
+
+    void CoreSegment::append(const workingmemory::CoreSegment& m)
+    {
+        for (const auto& [k, s] : m.container)
+        {
+            if (const auto& it = container.find(k); it == container.end())
+            {
+                it->second.append(s);
+            }
+            else
+            {
+                auto wms = container.emplace(std::make_pair(k, id.withCoreSegmentName(k)));
+                wms.first->second.append(s);
+            }
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.h b/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.h
index c2bc57f8f..ec710907f 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.h
@@ -5,6 +5,8 @@
 #include "ProviderSegment.h"
 #include "detail/TypedEntityContainer.h"
 
+#include "../workingMemory/CoreSegment.h"
+
 
 namespace armarx::armem::longtermmemory
 {
@@ -13,10 +15,13 @@ namespace armarx::armem::longtermmemory
      * @brief Data of a core segment containing multiple provider segments.
      */
     class CoreSegment :
-        virtual public CoreSegmentBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>,
+        virtual public CoreSegmentBase<ProviderSegment, CoreSegment>,
         virtual public detail::TypedEntityContainer<ProviderSegment, CoreSegment>
     {
     public:
+        using Base = CoreSegmentBase<ProviderSegment, CoreSegment>;
+        using ProviderSegmentT = ProviderSegment;
+
         CoreSegment();
         CoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr);
         CoreSegment(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr);
@@ -24,6 +29,12 @@ namespace armarx::armem::longtermmemory
 
         CoreSegment(const CoreSegment& other);
         CoreSegment& operator=(const CoreSegment& other);
+
+        // Conversion
+        workingmemory::CoreSegment convert() const;
+
+        // MongoDB connection
+        void append(const workingmemory::CoreSegment&);
     };
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.cpp
index 09ea28d25..8e3a50e88 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.cpp
@@ -28,4 +28,30 @@ namespace armarx::armem::longtermmemory
         other._copySelf(*this);
         return *this;
     }
+
+    workingmemory::Entity Entity::convert() const
+    {
+        workingmemory::Entity m;
+        for (const auto& [_, s] : container)
+        {
+            m.addSnapshot(s.convert());
+        }
+        return m;
+    }
+
+    void Entity::append(const workingmemory::Entity& m)
+    {
+        for (const auto& [k, s] : m.container)
+        {
+            if (const auto& it = container.find(k); it == container.end())
+            {
+                it->second.setTo(s);
+            }
+            else
+            {
+                auto wms = container.emplace(std::make_pair(k, id.withTimestamp(k)));
+                wms.first->second.setTo(s);
+            }
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.h b/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.h
index 7d25e3fc8..967fa2b76 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.h
@@ -5,6 +5,8 @@
 #include "EntitySnapshot.h"
 #include "detail/MemoryContainer.h"
 
+#include "../workingMemory/Entity.h"
+
 
 namespace armarx::armem::longtermmemory
 {
@@ -33,6 +35,9 @@ namespace armarx::armem::longtermmemory
     {
 
     public:
+        using Base = EntityBase<EntitySnapshot, Entity>;
+        using EntitySnapshotT = EntitySnapshot;
+
         Entity();
         Entity(const std::string& name, const MemoryID& parentID = {});
         Entity(const MemoryID& id);
@@ -41,6 +46,12 @@ namespace armarx::armem::longtermmemory
         Entity(const Entity& other);
         /// Copy the history from `other` to this.
         Entity& operator=(const Entity& other);
+
+        // Conversion
+        workingmemory::Entity convert() const;
+
+        // MongoDB connection
+        void append(const workingmemory::Entity&);
     };
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.cpp
index e1800f72a..273aa1cb9 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.cpp
@@ -40,7 +40,6 @@ namespace armarx::armem::longtermmemory
         return *this;
     }
 
-
     bool EntityInstance::equalsDeep(const EntityInstance& other) const
     {
         return id == other.id && _metadata == other.metadata();
@@ -53,7 +52,6 @@ namespace armarx::armem::longtermmemory
         this->index() = index;
 
         this->_metadata.confidence = update.confidence;
-
         this->_metadata.timeCreated = update.timeCreated;
         this->_metadata.timeSent = update.timeSent;
         this->_metadata.timeArrived = update.timeArrived;
@@ -71,4 +69,15 @@ namespace armarx::armem::longtermmemory
         EntityInstanceBase<EntityInstance>::_copySelf(other);
         other._metadata = _metadata;
     }
+
+    workingmemory::EntityInstance EntityInstance::convert() const
+    {
+        workingmemory::EntityInstance m;
+        return m;
+    }
+
+    void EntityInstance::setTo(const workingmemory::EntityInstance& m)
+    {
+        std::cout << "Longtermmemory received an entity instance: " << m.id.str() << std::endl;
+    }
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.h
index 4884b43fb..76e594567 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.h
@@ -2,6 +2,8 @@
 
 #include "../base/EntityInstance.h"
 
+#include "../workingMemory/EntityInstance.h"
+
 namespace armarx::armem::longtermmemory
 {
 
@@ -36,6 +38,8 @@ namespace armarx::armem::longtermmemory
     {
 
     public:
+        using Base = EntityInstanceBase<EntityInstance>;
+
         EntityInstance();
         EntityInstance(const EntityInstance&);
         EntityInstance(int index, const MemoryID& parentID = {});
@@ -64,6 +68,12 @@ namespace armarx::armem::longtermmemory
 
         virtual EntityInstance copy() const override;
 
+        // Conversion
+        workingmemory::EntityInstance convert() const;
+
+        // MongoDB connection
+        void setTo(const workingmemory::EntityInstance&);
+
     protected:
         virtual void _copySelf(EntityInstance& other) const override;
 
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.cpp
index 11b2045e5..0338e6577 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.cpp
@@ -34,4 +34,27 @@ namespace armarx::armem::longtermmemory
         other._copySelf(*this);
         return *this;
     }
+
+    workingmemory::EntitySnapshot EntitySnapshot::convert() const
+    {
+        workingmemory::EntitySnapshot m;
+        for (const auto& s : container)
+        {
+            m.addInstance(s.convert());
+        }
+        return m;
+    }
+
+    void EntitySnapshot::setTo(const workingmemory::EntitySnapshot& m)
+    {
+        // We remove the contente here and reset it with new values
+        container.clear();
+
+        unsigned int i = 0;
+        for (const auto& s : m.container)
+        {
+            auto wms = container.emplace_back(id.withInstanceIndex(i++));
+            wms.setTo(s);
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.h
index b357f4e52..6f2b9c74c 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.h
@@ -5,6 +5,8 @@
 #include "EntityInstance.h"
 #include "detail/MemoryContainer.h"
 
+#include "../workingMemory/EntitySnapshot.h"
+
 
 namespace armarx::armem::longtermmemory
 {
@@ -18,6 +20,9 @@ namespace armarx::armem::longtermmemory
     {
 
     public:
+        using Base = EntitySnapshotBase<EntityInstance, EntitySnapshot>;
+        using EntityInstanceT = EntityInstance;
+
         EntitySnapshot();
         EntitySnapshot(Time time, const MemoryID& parentID = {});
         EntitySnapshot(const MemoryID& id);
@@ -27,5 +32,11 @@ namespace armarx::armem::longtermmemory
 
         /// Copy the instances from `other` to this.
         EntitySnapshot& operator=(const EntitySnapshot& other);
+
+        // Conversion
+        workingmemory::EntitySnapshot convert() const;
+
+        // MongoDB connection
+        void setTo(const workingmemory::EntitySnapshot&);
     };
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.cpp
index ee58ef2ab..9f1709048 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.cpp
@@ -36,4 +36,35 @@ namespace armarx::armem::longtermmemory
         return *this;
     }
 
+    workingmemory::Memory Memory::convert() const
+    {
+        workingmemory::Memory m;
+        for (const auto& [_, s] : container)
+        {
+            m.addCoreSegment(s.convert());
+        }
+        return m;
+    }
+
+    void Memory::reload(const MongoDBConnectionManager::MongoDBSettings& settings)
+    {
+        dbsettings = settings;
+        std::cout << "Setting connection to: " << settings.uniqueString() << std::endl;
+    }
+
+    void Memory::append(const workingmemory::Memory& m)
+    {
+        for (const auto& [k, s] : m.container)
+        {
+            if (const auto& it = container.find(k); it == container.end())
+            {
+                it->second.append(s);
+            }
+            else
+            {
+                auto wms = container.emplace(std::make_pair(k, id.withCoreSegmentName(k)));
+                wms.first->second.append(s);
+            }
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.h b/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.h
index 5dc1262cf..85137aaf4 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.h
@@ -5,6 +5,9 @@
 #include "CoreSegment.h"
 #include "detail/EntityContainer.h"
 
+#include "../workingMemory/Memory.h"
+#include "mongodb/MongoDBConnectionManager.h"
+
 namespace armarx::armem::longtermmemory
 {
 
@@ -12,15 +15,30 @@ namespace armarx::armem::longtermmemory
      * @brief Data of a memory consisting of multiple core segments.
      */
     class Memory :
-        virtual public MemoryBase<CoreSegment, Entity, EntitySnapshot, EntityInstance, Memory>,
+        virtual public MemoryBase<CoreSegment, Memory>,
         virtual public detail::EntityContainer<CoreSegment, Memory>
     {
     public:
+        using Base = MemoryBase<CoreSegment, Memory>;
+        using CoreSegmentT = CoreSegment;
+
         Memory();
         Memory(const std::string& name);
         Memory(const MemoryID& id);
 
         Memory(const Memory& other);
         Memory& operator=(const Memory& other);
+
+
+        // Conversion
+        workingmemory::Memory convert() const;
+
+        // MongoDB connection
+        void reload(const MongoDBConnectionManager::MongoDBSettings&);
+        void append(const workingmemory::Memory&);
+
+
+    public:
+        MongoDBConnectionManager::MongoDBSettings dbsettings;
     };
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.cpp
index dac106c1e..48c65cd21 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.cpp
@@ -14,26 +14,26 @@ namespace armarx::armem::longtermmemory
 
     ProviderSegment::ProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(MemoryID().withProviderSegmentName(name)),
-        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(MemoryID().withProviderSegmentName(name), aronType)
+        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(MemoryID().withProviderSegmentName(name), aronType)
     {
     }
 
     ProviderSegment::ProviderSegment(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(parentID.withProviderSegmentName(name)),
-        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(parentID.withProviderSegmentName(name), aronType)
+        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(parentID.withProviderSegmentName(name), aronType)
     {
     }
 
     ProviderSegment::ProviderSegment(const MemoryID id, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(id),
-        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(id, aronType)
+        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(id, aronType)
     {
     }
 
     ProviderSegment::ProviderSegment(const ProviderSegment& other) :
         armarx::armem::detail::MemoryItem(other),
         MemoryContainerBase<std::map<std::string, Entity>, ProviderSegment>(other),
-        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(other)
+        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(other)
     {
     }
 
@@ -43,4 +43,29 @@ namespace armarx::armem::longtermmemory
         return *this;
     }
 
+    workingmemory::ProviderSegment ProviderSegment::convert() const
+    {
+        workingmemory::ProviderSegment m;
+        for (const auto& [_, s] : container)
+        {
+            m.addEntity(s.convert());
+        }
+        return m;
+    }
+
+    void ProviderSegment::append(const workingmemory::ProviderSegment& m)
+    {
+        for (const auto& [k, s] : m.container)
+        {
+            if (const auto& it = container.find(k); it == container.end())
+            {
+                it->second.append(s);
+            }
+            else
+            {
+                auto wms = container.emplace(std::make_pair(k, id.withEntityName(k)));
+                wms.first->second.append(s);
+            }
+        }
+    }
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.h
index c204c40eb..0c43e80e1 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.h
@@ -5,6 +5,8 @@
 #include "Entity.h"
 #include "detail/TypedEntityContainer.h"
 
+#include "../workingMemory/ProviderSegment.h"
+
 
 namespace armarx::armem::longtermmemory
 {
@@ -13,10 +15,13 @@ namespace armarx::armem::longtermmemory
      * @brief Data of a provider segment containing multiple entities.
      */
     class ProviderSegment :
-        virtual public ProviderSegmentBase<Entity, EntitySnapshot, EntityInstance, ProviderSegment>,
+        virtual public ProviderSegmentBase<Entity, ProviderSegment>,
         virtual public detail::TypedEntityContainer<Entity, ProviderSegment>
     {
     public:
+        using Base = ProviderSegmentBase<Entity, ProviderSegment>;
+        using EntityT = Entity;
+
         ProviderSegment();
         ProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr);
         ProviderSegment(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr);
@@ -24,6 +29,12 @@ namespace armarx::armem::longtermmemory
 
         ProviderSegment(const ProviderSegment& other);
         ProviderSegment& operator=(const ProviderSegment& other);
+
+        // Conversion
+        workingmemory::ProviderSegment convert() const;
+
+        // MongoDB connection
+        void append(const workingmemory::ProviderSegment&);
     };
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/detail/EntityContainer.h b/source/RobotAPI/libraries/armem/core/longtermMemory/detail/EntityContainer.h
index 155b00912..73e5ea68e 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/detail/EntityContainer.h
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/detail/EntityContainer.h
@@ -18,8 +18,8 @@ namespace armarx::armem::longtermmemory::detail
      */
     template <class _ValueT, class Derived>
     class EntityContainer :
-            virtual public armarx::armem::detail::EntityContainerBase<_ValueT, Entity, EntitySnapshot, EntityInstance, Derived>,
-            virtual public MemoryContainer<std::map<std::string, _ValueT>, Derived>
+        virtual public armarx::armem::detail::EntityContainerBase<_ValueT, Entity, Derived>,
+        virtual public MemoryContainer<std::map<std::string, _ValueT>, Derived>
     {
     public:
         EntityContainer& operator=(const EntityContainer& other)
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/detail/TypedEntityContainer.h b/source/RobotAPI/libraries/armem/core/longtermMemory/detail/TypedEntityContainer.h
index da5c96c10..ea826343e 100644
--- a/source/RobotAPI/libraries/armem/core/longtermMemory/detail/TypedEntityContainer.h
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/detail/TypedEntityContainer.h
@@ -13,8 +13,8 @@ namespace armarx::armem::longtermmemory::detail
      */
     template <class _ValueT, class Derived>
     class TypedEntityContainer :
-            virtual public armarx::armem::detail::TypedEntityContainerBase<_ValueT, Entity, EntitySnapshot, EntityInstance, Derived>,
-            virtual public EntityContainer<_ValueT, Derived>
+        virtual public armarx::armem::detail::TypedEntityContainerBase<_ValueT, Entity, Derived>,
+        virtual public EntityContainer<_ValueT, Derived>
     {
     public:
         TypedEntityContainer& operator=(const TypedEntityContainer& other)
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.cpp
deleted file mode 100644
index e69de29bb..000000000
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.h b/source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.h
deleted file mode 100644
index e69de29bb..000000000
diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/mongodb/MongoDBConnectionManager.h b/source/RobotAPI/libraries/armem/core/longtermMemory/mongodb/MongoDBConnectionManager.h
new file mode 100644
index 000000000..799b59d86
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/core/longtermMemory/mongodb/MongoDBConnectionManager.h
@@ -0,0 +1,54 @@
+#pragma once
+
+#include <string>
+#include <vector>
+#include <map>
+#include <memory>
+
+namespace armarx::armem::longtermmemory
+{
+
+    /**
+     * @brief Data of a memory consisting of multiple core segments.
+     */
+    class MongoDBConnectionManager
+    {
+    public:
+        struct MongoDBSettings
+        {
+            std::string host = "localhost";
+            std::string user = "root";
+            std::string password = "";
+
+            bool isSet() const
+            {
+                // we always need a user and a host
+                return !host.empty() and !user.empty();
+            }
+
+            std::string uniqueString() const
+            {
+                return host + "::" + user;
+            }
+        };
+
+        static int EstablishConnection(const MongoDBSettings& settings)
+        {
+            const auto str_rep = settings.uniqueString();
+            const auto& it = Connections.find(str_rep);
+            if(it == Connections.end())
+            {
+                auto con = Connections.emplace(str_rep, 0);
+                return con.first->second;
+            }
+            else
+            {
+                // A connection already exists. We do not need to open another one.
+                return it->second;
+            }
+        }
+
+    private:
+        static std::map<std::string, int> Connections;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.cpp b/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.cpp
index e91e5fa4c..447dad9c5 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.cpp
@@ -14,26 +14,26 @@ namespace armarx::armem::workingmemory
 
     CoreSegment::CoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(MemoryID().withCoreSegmentName(name)),
-        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(MemoryID().withCoreSegmentName(name), aronType)
+        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(MemoryID().withCoreSegmentName(name), aronType)
     {
     }
 
     CoreSegment::CoreSegment(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(MemoryID().withCoreSegmentName(name)),
-        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(parentID.withCoreSegmentName(name), aronType)
+        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(parentID.withCoreSegmentName(name), aronType)
     {
     }
 
     CoreSegment::CoreSegment(const MemoryID& id, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(id),
-        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(id, aronType)
+        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(id, aronType)
     {
     }
 
     CoreSegment::CoreSegment(const CoreSegment& other) :
         armarx::armem::detail::MemoryItem(other),
         MemoryContainerBase<std::map<std::string, ProviderSegment>, CoreSegment>(other),
-        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(other)
+        armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(other)
     {
     }
 
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.h b/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.h
index e1fe33469..3dcd65d9e 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.h
@@ -13,10 +13,13 @@ namespace armarx::armem::workingmemory
      * @brief Data of a core segment containing multiple provider segments.
      */
     class CoreSegment :
-        virtual public CoreSegmentBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>,
+        virtual public CoreSegmentBase<ProviderSegment, CoreSegment>,
         virtual public detail::TypedEntityContainer<ProviderSegment, CoreSegment>
     {
     public:
+        using Base = CoreSegmentBase<ProviderSegment, CoreSegment>;
+        using ProviderSegmentT = ProviderSegment;
+
         CoreSegment();
         CoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr);
         CoreSegment(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr);
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/Entity.h b/source/RobotAPI/libraries/armem/core/workingMemory/Entity.h
index 3484406ae..e1054a7e8 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/Entity.h
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/Entity.h
@@ -33,6 +33,9 @@ namespace armarx::armem::workingmemory
     {
 
     public:
+        using Base = EntityBase<EntitySnapshot, Entity>;
+        using EntitySnapshotT = EntitySnapshot;
+
         Entity();
         Entity(const std::string& name, const MemoryID& parentID = {});
         Entity(const MemoryID& id);
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/workingMemory/EntityInstance.h
index 38709d42f..589290441 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/EntityInstance.h
@@ -36,6 +36,8 @@ namespace armarx::armem::workingmemory
     {
 
     public:
+        using Base = EntityInstanceBase<EntityInstance>;
+
         EntityInstance();
         EntityInstance(const EntityInstance&);
         EntityInstance(int index, const MemoryID& parentID = {});
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/workingMemory/EntitySnapshot.h
index 95af4a5e8..7f88288ea 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/EntitySnapshot.h
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/EntitySnapshot.h
@@ -18,6 +18,9 @@ namespace armarx::armem::workingmemory
     {
 
     public:
+        using Base = EntitySnapshotBase<EntityInstance, EntitySnapshot>;
+        using EntityInstanceT = EntityInstance;
+
         EntitySnapshot();
         EntitySnapshot(Time time, const MemoryID& parentID = {});
         EntitySnapshot(const MemoryID& id);
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/Memory.h b/source/RobotAPI/libraries/armem/core/workingMemory/Memory.h
index 1b29e3afd..7ec0f660f 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/Memory.h
@@ -12,10 +12,13 @@ namespace armarx::armem::workingmemory
      * @brief Data of a memory consisting of multiple core segments.
      */
     class Memory :
-        virtual public MemoryBase<CoreSegment, Entity, EntitySnapshot, EntityInstance, Memory>,
+        virtual public MemoryBase<CoreSegment, Memory>,
         virtual public detail::EntityContainer<CoreSegment, Memory>
     {
     public:
+        using Base = MemoryBase<CoreSegment, Memory>;
+        using CoreSegmentT = CoreSegment;
+
         Memory();
         Memory(const std::string& name);
         Memory(const MemoryID& id);
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.cpp
index 832e9c6c9..652edf3ce 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.cpp
@@ -14,26 +14,26 @@ namespace armarx::armem::workingmemory
 
     ProviderSegment::ProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(MemoryID().withProviderSegmentName(name)),
-        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(MemoryID().withProviderSegmentName(name), aronType)
+        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(MemoryID().withProviderSegmentName(name), aronType)
     {
     }
 
     ProviderSegment::ProviderSegment(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(parentID.withProviderSegmentName(name)),
-        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(parentID.withProviderSegmentName(name), aronType)
+        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(parentID.withProviderSegmentName(name), aronType)
     {
     }
 
     ProviderSegment::ProviderSegment(const MemoryID id, aron::typenavigator::ObjectNavigatorPtr aronType) :
         armarx::armem::detail::MemoryItem(id),
-        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(id, aronType)
+        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(id, aronType)
     {
     }
 
     ProviderSegment::ProviderSegment(const ProviderSegment& other) :
         armarx::armem::detail::MemoryItem(other),
         MemoryContainerBase<std::map<std::string, Entity>, ProviderSegment>(other),
-        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(other)
+        armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(other)
     {
     }
 
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.h
index d80f53172..4596041a2 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.h
@@ -13,10 +13,13 @@ namespace armarx::armem::workingmemory
      * @brief Data of a provider segment containing multiple entities.
      */
     class ProviderSegment :
-        virtual public ProviderSegmentBase<Entity, EntitySnapshot, EntityInstance, ProviderSegment>,
+        virtual public ProviderSegmentBase<Entity, ProviderSegment>,
         virtual public detail::TypedEntityContainer<Entity, ProviderSegment>
     {
     public:
+        using Base = ProviderSegmentBase<Entity, ProviderSegment>;
+        using EntityT = Entity;
+
         ProviderSegment();
         ProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr);
         ProviderSegment(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr);
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/detail/EntityContainer.h b/source/RobotAPI/libraries/armem/core/workingMemory/detail/EntityContainer.h
index a4ccb8ffc..05c491b21 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/detail/EntityContainer.h
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/detail/EntityContainer.h
@@ -18,8 +18,8 @@ namespace armarx::armem::workingmemory::detail
      */
     template <class _ValueT, class Derived>
     class EntityContainer :
-            virtual public armarx::armem::detail::EntityContainerBase<_ValueT, Entity, EntitySnapshot, EntityInstance, Derived>,
-            virtual public MemoryContainer<std::map<std::string, _ValueT>, Derived>
+        virtual public armarx::armem::detail::EntityContainerBase<_ValueT, Entity, Derived>,
+        virtual public MemoryContainer<std::map<std::string, _ValueT>, Derived>
     {
     public:
         EntityContainer& operator=(const EntityContainer& other)
diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/detail/TypedEntityContainer.h b/source/RobotAPI/libraries/armem/core/workingMemory/detail/TypedEntityContainer.h
index ce775841c..ebcb1f62d 100644
--- a/source/RobotAPI/libraries/armem/core/workingMemory/detail/TypedEntityContainer.h
+++ b/source/RobotAPI/libraries/armem/core/workingMemory/detail/TypedEntityContainer.h
@@ -13,8 +13,8 @@ namespace armarx::armem::workingmemory::detail
      */
     template <class _ValueT, class Derived>
     class TypedEntityContainer :
-            virtual public armarx::armem::detail::TypedEntityContainerBase<_ValueT, Entity, EntitySnapshot, EntityInstance, Derived>,
-            virtual public EntityContainer<_ValueT, Derived>
+        virtual public armarx::armem::detail::TypedEntityContainerBase<_ValueT, Entity, Derived>,
+        virtual public EntityContainer<_ValueT, Derived>
     {
     public:
         TypedEntityContainer& operator=(const TypedEntityContainer& other)
diff --git a/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp b/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp
index f39e7a2df..2c12bbb49 100644
--- a/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp
@@ -19,7 +19,7 @@ namespace armarx::armem::server::plugins
         ClientPlugin::postCreatePropertyDefinitions(properties);
         properties->topic(memoryListener, this->parent<ComponentPluginUser>().memoryListenerDefaultName);
 
-        properties->optional(longTermMemoryDatabaseURL, this->parent<ComponentPluginUser>().longTermMemoryDatabaseURLDefault);
+        properties->optional(longTermMemoryDatabaseHost, this->parent<ComponentPluginUser>().longTermMemoryDatabaseHostDefault);
         properties->optional(longTermMemoryDatabaseUser, this->parent<ComponentPluginUser>().longTermMemoryDatabaseUserDefault);
         properties->optional(longTermMemoryDatabasePassword, this->parent<ComponentPluginUser>().longTermMemoryDatabasePasswordDefault);
     }
@@ -34,6 +34,14 @@ namespace armarx::armem::server::plugins
             registerMemory(parent);
         }
         parent.iceMemory.setMemoryListener(memoryListener);
+
+        // establishing connection to ltm and mongodb
+        longtermmemory::MongoDBConnectionManager::MongoDBSettings settings;
+        settings.host = longTermMemoryDatabaseHost;
+        settings.user = longTermMemoryDatabaseUser;
+        settings.password = longTermMemoryDatabasePassword;
+
+        parent.longtermmemory.reload(settings);
     }
 
 
@@ -138,14 +146,15 @@ namespace armarx::armem::server
     data::StoreResult ComponentPluginUser::store(const data::StoreInput& input, const Ice::Current&)
     {
         std::scoped_lock lock(workingmemoryMutex);
+        std::scoped_lock lock2(longtermmemoryMutex);
         return iceMemory.store(input);
     }
 
 
     // LTM STORING
-    data::LoadResult ComponentPluginUser::load(const data::LoadInput& input, const Ice::Current&)
+    armem::query::data::Result ComponentPluginUser::load(const armem::query::data::Input& input, const Ice::Current&)
     {
-        std::scoped_lock lock(workingmemoryMutex);
+        std::scoped_lock lock(longtermmemoryMutex);
         return iceMemory.load(input);
     }
 
diff --git a/source/RobotAPI/libraries/armem/server/ComponentPlugin.h b/source/RobotAPI/libraries/armem/server/ComponentPlugin.h
index 12db6a741..0aa7c6b3b 100644
--- a/source/RobotAPI/libraries/armem/server/ComponentPlugin.h
+++ b/source/RobotAPI/libraries/armem/server/ComponentPlugin.h
@@ -50,7 +50,7 @@ namespace armarx::armem::server::plugins
 
         client::MemoryListenerInterfacePrx memoryListener;
 
-        std::string longTermMemoryDatabaseURL;
+        std::string longTermMemoryDatabaseHost;
         std::string longTermMemoryDatabaseUser;
         std::string longTermMemoryDatabasePassword;
     };
@@ -87,11 +87,11 @@ namespace armarx::armem::server
 
 
         // StoringInterface interface
-        data::StoreResult store(const data::StoreInput&, const Ice::Current& = Ice::emptyCurrent) override;
+        virtual data::StoreResult store(const data::StoreInput&, const Ice::Current& = Ice::emptyCurrent) override;
 
 
         // LoadingInterface interface
-        data::LoadResult load(const data::LoadInput&, const Ice::Current& = Ice::emptyCurrent) override;
+        virtual armem::query::data::Result load(const armem::query::data::Input&, const Ice::Current& = Ice::emptyCurrent) override;
 
 
     public:
@@ -104,7 +104,7 @@ namespace armarx::armem::server
 
         /// property defaults
         std::string memoryListenerDefaultName = "MemoryUpdates";
-        std::string longTermMemoryDatabaseURLDefault = "";
+        std::string longTermMemoryDatabaseHostDefault = "";
         std::string longTermMemoryDatabaseUserDefault = "";
         std::string longTermMemoryDatabasePasswordDefault = "";
 
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
index d1ed7fc92..3c4c0b5f7 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
@@ -4,7 +4,7 @@
 
 #include "../error.h"
 #include "../core/workingMemory/ice_conversions.h"
-#include "query_proc/MemoryQueryProcessor.h"
+#include "query_proc/workingMemory/MemoryQueryProcessor.h"
 
 //#include "../core/io/diskWriter/NlohmannJSON/NlohmannJSONDiskWriter.h"
 //#include "../core/io/diskReader/NlohmannJSON/NlohmannJSONDiskReader.h"
@@ -163,17 +163,17 @@ namespace armarx::armem::server
     {
         ARMARX_CHECK_NOT_NULL(workingmemory);
 
-        armem::query_proc::MemoryQueryProcessor processor(
+        armem::workingmemory::query_proc::MemoryQueryProcessor processor(
             input.withData ? armem::DataMode::WithData
             : armem::DataMode::NoData);
         return processor.process(input, *workingmemory);
     }
 
     // LTM LOADING
-    data::LoadResult MemoryToIceAdapter::load(const armem::data::LoadInput& input)
+    query::data::Result MemoryToIceAdapter::load(const armem::query::data::Input& query)
     {
         ARMARX_CHECK_NOT_NULL(longtermmemory);
-        data::LoadResult output;
+        query::data::Result output;
 
         output.success = true;
         return output;
@@ -186,12 +186,12 @@ namespace armarx::armem::server
         ARMARX_CHECK_NOT_NULL(longtermmemory);
         data::StoreResult output;
 
-        // query workingMemory
         armem::query::data::Result queryResult = this->query(input.query);
-
         if (queryResult.success)
         {
-
+            workingmemory::Memory m;
+            fromIce(queryResult.memory, m);
+            longtermmemory->append(m);
         }
         else
         {
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h
index 1d74fbb5b..b0d1ac098 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h
@@ -43,7 +43,7 @@ namespace armarx::armem::server
         query::data::Result query(const armem::query::data::Input& input);
 
         // LTM LOADING
-        data::LoadResult load(const armem::data::LoadInput& input);
+        query::data::Result load(const armem::query::data::Input& input);
 
         // LTM STORING
         data::StoreResult store(const armem::data::StoreInput& input);
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.cpp
deleted file mode 100644
index cce5b13cc..000000000
--- a/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-#include "CoreSegmentQueryProcessor.h"
-
-#include <regex>
-
-#include <ArmarXCore/core/logging/Logging.h>
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
-#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
-#include <RobotAPI/libraries/armem/core/error.h>
-
-
-namespace armarx::armem::query_proc
-{
-
-    void CoreSegmentQueryProcessor::process(workingmemory::CoreSegment& result, const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const
-    {
-        if (auto q = dynamic_cast<const armem::query::data::core::All*>(&query))
-        {
-            process(result, *q, coreSegment);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::core::Single*>(&query))
-        {
-            process(result, *q, coreSegment);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::core::Regex*>(&query))
-        {
-            process(result, *q, coreSegment);
-        }
-        else
-        {
-            throw armem::error::UnknownQueryType("core segment", query);
-        }
-    }
-
-
-    void CoreSegmentQueryProcessor::process(workingmemory::CoreSegment& result,
-                                            const armem::query::data::core::All& query, const workingmemory::CoreSegment& coreSegment) const
-    {
-        for (const auto& [name, providerSegment] : coreSegment.providerSegments())
-        {
-            result.addProviderSegment(providerSegmentProcessor.process(query.providerSegmentQueries, providerSegment));
-        }
-    }
-
-    void CoreSegmentQueryProcessor::process(workingmemory::CoreSegment& result,
-                                            const armem::query::data::core::Single& query, const workingmemory::CoreSegment& coreSegment) const
-    {
-        try
-        {
-            const workingmemory::ProviderSegment& providerSegment = coreSegment.getProviderSegment(query.providerSegmentName);
-            result.addProviderSegment(providerSegmentProcessor.process(query.providerSegmentQueries, providerSegment));
-        }
-        catch (const error::MissingEntry&)
-        {
-            // Leave empty.
-        }
-    }
-
-    void CoreSegmentQueryProcessor::process(workingmemory::CoreSegment& result,
-                                            const armem::query::data::core::Regex& query, const workingmemory::CoreSegment& coreSegment) const
-    {
-        std::regex regex(query.providerSegmentNameRegex);
-        for (const auto& [name, providerSegment] : coreSegment.providerSegments())
-        {
-            if (std::regex_search(providerSegment.name(), regex))
-            {
-                result.addProviderSegment(providerSegmentProcessor.process(query.providerSegmentQueries, providerSegment));
-            }
-        }
-    }
-
-
-    data::CoreSegment CoreSegmentQueryProcessor::processToIce(
-        const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const
-    {
-        return toIce<data::CoreSegment>(process(query, coreSegment));
-    }
-
-}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.h
deleted file mode 100644
index 2806875cf..000000000
--- a/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#pragma once
-
-#include <RobotAPI/interface/armem/query.h>
-
-#include <RobotAPI/libraries/armem/core/workingMemory/Memory.h>
-
-#include "BaseQueryProcessor.h"
-#include "ProviderSegmentQueryProcessor.h"
-
-
-
-namespace armarx::armem::query_proc
-{
-
-    /**
-     * @brief Handles memory queries.
-     */
-    class CoreSegmentQueryProcessor : public BaseQueryProcessor<workingmemory::CoreSegment, armem::query::data::CoreSegmentQuery>
-    {
-    public:
-
-        CoreSegmentQueryProcessor(DataMode dataMode = DataMode::WithData) :
-            BaseQueryProcessor(dataMode), providerSegmentProcessor(dataMode)
-        {}
-
-
-        using BaseQueryProcessor::process;
-
-        void process(workingmemory::CoreSegment& result, const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const;
-
-        void process(workingmemory::CoreSegment& result, const armem::query::data::core::All& query, const workingmemory::CoreSegment& coreSegment) const;
-        void process(workingmemory::CoreSegment& result, const armem::query::data::core::Single& query, const workingmemory::CoreSegment& coreSegment) const;
-        void process(workingmemory::CoreSegment& result, const armem::query::data::core::Regex& query, const workingmemory::CoreSegment& coreSegment) const;
-
-
-        data::CoreSegment processToIce(const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const;
-
-
-    private:
-
-        ProviderSegmentQueryProcessor providerSegmentProcessor;
-
-    };
-
-}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.cpp
deleted file mode 100644
index d840425d3..000000000
--- a/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-#include "EntityQueryProcessor.h"
-
-#include <ArmarXCore/core/logging/Logging.h>
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
-#include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
-
-
-namespace armarx::armem::query_proc
-{
-
-    void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const
-    {
-        if (auto q = dynamic_cast<const armem::query::data::entity::All*>(&query))
-        {
-            process(result, *q, entity);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::entity::Single*>(&query))
-        {
-            process(result, *q, entity);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::entity::TimeRange*>(&query))
-        {
-            process(result, *q, entity);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::entity::IndexRange*>(&query))
-        {
-            process(result, *q, entity);
-        }
-        else
-        {
-            throw armem::error::UnknownQueryType("entity snapshot", query);
-        }
-    }
-
-    void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::entity::All& query, const workingmemory::Entity& entity) const
-    {
-        (void) query;
-        // Copy this entitiy and its contents.
-
-        for (const auto& [time, snapshot] : entity)
-        {
-            addResultSnapshot(result, snapshot);
-        }
-    }
-
-    void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::entity::Single& query, const workingmemory::Entity& entity) const
-    {
-        if (query.timestamp < 0)
-        {
-            try
-            {
-                addResultSnapshot(result, entity.getLatestSnapshot());
-            }
-            catch (const armem::error::EntityHistoryEmpty&)
-            {
-                // Leave empty.
-            }
-        }
-        else
-        {
-            Time time = fromIce<Time>(query.timestamp);
-            try
-            {
-                addResultSnapshot(result, entity.getSnapshot(time));
-            }
-            catch (const armem::error::MissingEntry&)
-            {
-                // Leave empty.
-            }
-        }
-    }
-
-    void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::entity::IndexRange& query, const workingmemory::Entity& entity) const
-    {
-        if (entity.empty())
-        {
-            return;
-        }
-
-        size_t first = negativeIndexSemantics(query.first, entity.history().size());
-        size_t last = negativeIndexSemantics(query.last, entity.history().size());
-
-        if (first <= last)
-        {
-            auto it = entity.begin();
-            std::advance(it, first);
-
-            size_t num = last - first + 1;  // +1 to make last inclusive
-            for (size_t i = 0; i < num; ++i, ++it)
-            {
-                addResultSnapshot(result, it);
-            }
-        }
-    }
-
-    void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::entity::TimeRange& query, const workingmemory::Entity& entity) const
-    {
-        if (query.minTimestamp <= query.maxTimestamp || query.minTimestamp < 0 || query.maxTimestamp < 0)
-        {
-            Time min = fromIce<Time>(query.minTimestamp);
-            Time max = fromIce<Time>(query.maxTimestamp);
-            process(result, min, max, entity, query);
-        }
-    }
-
-    void EntityQueryProcessor::process(workingmemory::Entity& result, const Time& min, const Time& max, const workingmemory::Entity& entity,
-                                       const armem::query::data::EntityQuery& query) const
-    {
-        (void) query;
-
-        // Returns an iterator pointing to the first element that is not less than (i.e. greater or equal to) key.
-        auto begin = min.toMicroSeconds() > 0 ? entity.history().lower_bound(min) : entity.history().begin();
-        // Returns an iterator pointing to the first element that is *greater than* key.
-        auto end = max.toMicroSeconds() > 0 ? entity.history().upper_bound(max) : entity.history().end();
-
-        for (auto it = begin; it != end && it != entity.history().end(); ++it)
-        {
-            addResultSnapshot(result, it);
-        }
-    }
-
-    data::Entity EntityQueryProcessor::processToIce(const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const
-    {
-        return toIce<data::Entity>(process(query, entity));
-    }
-
-    size_t EntityQueryProcessor::negativeIndexSemantics(long index, size_t size)
-    {
-        const size_t max = size > 0 ? size - 1 : 0;
-        if (index >= 0)
-        {
-            return std::clamp<size_t>(static_cast<size_t>(index), 0, max);
-        }
-        else
-        {
-            return static_cast<size_t>(std::clamp<long>(static_cast<long>(size) + index, 0, static_cast<long>(max)));
-        }
-    }
-
-    void EntityQueryProcessor::addResultSnapshot(workingmemory::Entity& result, workingmemory::Entity::ContainerT::const_iterator it) const
-    {
-        addResultSnapshot(result, it->second);
-    }
-
-    void EntityQueryProcessor::addResultSnapshot(workingmemory::Entity& result, const workingmemory::EntitySnapshot& snapshot) const
-    {
-        bool withData = (dataMode == DataMode::WithData);
-        if (withData)
-        {
-            result.addSnapshot(snapshot.copy());
-        }
-        else
-        {
-            result.addSnapshot(snapshot.copyWithoutData());
-        }
-    }
-}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.h
deleted file mode 100644
index 52ded22bb..000000000
--- a/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#pragma once
-
-#include <RobotAPI/interface/armem/query.h>
-
-#include <RobotAPI/libraries/armem/core/workingMemory/Memory.h>
-
-#include "BaseQueryProcessor.h"
-
-
-namespace armarx::armem::query_proc
-{
-
-    /**
-     * @brief Handles memory queries.
-     */
-    class EntityQueryProcessor : public BaseQueryProcessor<workingmemory::Entity, armem::query::data::EntityQuery>
-    {
-    public:
-
-        EntityQueryProcessor(DataMode dataMode = DataMode::WithData) :
-            BaseQueryProcessor(dataMode)
-        {}
-
-
-        using BaseQueryProcessor::process;
-
-        void process(workingmemory::Entity& result, const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const override;
-
-        void process(workingmemory::Entity& result, const armem::query::data::entity::All& query, const workingmemory::Entity& entity) const;
-        void process(workingmemory::Entity& result, const armem::query::data::entity::Single& query, const workingmemory::Entity& entity) const;
-        void process(workingmemory::Entity& result, const armem::query::data::entity::TimeRange& query, const workingmemory::Entity& entity) const;
-        void process(workingmemory::Entity& result, const armem::query::data::entity::IndexRange& query, const workingmemory::Entity& entity) const;
-
-        void process(workingmemory::Entity& result, const Time& min, const Time& max, const workingmemory::Entity& entity,
-                     const armem::query::data::EntityQuery& query) const;
-
-
-        data::Entity processToIce(const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const;
-
-
-        static size_t negativeIndexSemantics(long index, size_t size);
-
-    private:
-
-        void addResultSnapshot(workingmemory::Entity& result, workingmemory::Entity::ContainerT::const_iterator it) const;
-        void addResultSnapshot(workingmemory::Entity& result, const workingmemory::EntitySnapshot& snapshot) const;
-
-    };
-
-}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.cpp
deleted file mode 100644
index 1982845a0..000000000
--- a/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#include "MemoryQueryProcessor.h"
-
-#include <regex>
-
-#include <ArmarXCore/core/logging/Logging.h>
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
-#include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
-
-
-namespace armarx::armem::query_proc
-{
-
-    armem::query::data::Result MemoryQueryProcessor::process(const armem::query::data::Input& input, const workingmemory::Memory& memory) const
-    {
-        armem::query::data::Result result;
-        result.memory = processToIce(input.memoryQueries, memory);
-        result.success = true;
-        return result;
-    }
-
-    data::MemoryPtr MemoryQueryProcessor::processToIce(
-        const armem::query::data::MemoryQuery& query, const workingmemory::Memory& memory) const
-    {
-        return toIce<data::MemoryPtr>(process(query, memory));
-    }
-
-    data::MemoryPtr MemoryQueryProcessor::processToIce(const armem::query::data::MemoryQuerySeq& queries, const workingmemory::Memory& memory) const
-    {
-        return toIce<data::MemoryPtr>(process(queries, memory));
-    }
-
-    void MemoryQueryProcessor::process(workingmemory::Memory& result, const armem::query::data::MemoryQuery& query, const workingmemory::Memory& memory) const
-    {
-        if (auto q = dynamic_cast<const armem::query::data::memory::All*>(&query))
-        {
-            process(result, *q, memory);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::memory::Single*>(&query))
-        {
-            process(result, *q, memory);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::memory::Regex*>(&query))
-        {
-            process(result, *q, memory);
-        }
-        else
-        {
-            throw armem::error::UnknownQueryType("memory segment", query);
-        }
-    }
-
-
-    void MemoryQueryProcessor::process(workingmemory::Memory& result, const armem::query::data::memory::All& query, const workingmemory::Memory& memory) const
-    {
-        for (const auto& [name, coreSegment] : memory.coreSegments())
-        {
-            result.addCoreSegment(coreSegmentProcessor.process(query.coreSegmentQueries, coreSegment));
-        }
-    }
-
-    void MemoryQueryProcessor::process(workingmemory::Memory& result, const armem::query::data::memory::Single& query, const workingmemory::Memory& memory) const
-    {
-        try
-        {
-            const workingmemory::CoreSegment& coreSegment = memory.getCoreSegment(query.coreSegmentName);
-            result.addCoreSegment(coreSegmentProcessor.process(query.coreSegmentQueries, coreSegment));
-        }
-        catch (const error::MissingEntry&)
-        {
-            // Leave empty.
-        }
-    }
-
-    void MemoryQueryProcessor::process(workingmemory::Memory& result, const armem::query::data::memory::Regex& query, const workingmemory::Memory& memory) const
-    {
-        std::regex regex(query.coreSegmentNameRegex);
-        for (const auto& [name, coreSegment] : memory.coreSegments())
-        {
-            if (std::regex_search(coreSegment.name(), regex))
-            {
-                result.addCoreSegment(coreSegmentProcessor.process(query.coreSegmentQueries, coreSegment));
-            }
-        }
-    }
-
-}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.h
deleted file mode 100644
index b32b5afa2..000000000
--- a/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#pragma once
-
-#include <RobotAPI/interface/armem/query.h>
-
-#include <RobotAPI/libraries/armem/core/workingMemory/Memory.h>
-
-#include "BaseQueryProcessor.h"
-#include "CoreSegmentQueryProcessor.h"
-
-
-
-namespace armarx::armem::query_proc
-{
-
-    /**
-     * @brief Handles memory queries.
-     */
-    class MemoryQueryProcessor : public BaseQueryProcessor<workingmemory::Memory, armem::query::data::MemoryQuery>
-    {
-    public:
-
-        MemoryQueryProcessor(DataMode dataMode = DataMode::WithData) :
-            BaseQueryProcessor(dataMode), coreSegmentProcessor(dataMode)
-        {}
-
-
-        using BaseQueryProcessor::process;
-
-        armem::query::data::Result process(const armem::query::data::Input& input, const workingmemory::Memory& memory) const;
-
-
-        void process(workingmemory::Memory& result, const armem::query::data::MemoryQuery& query, const workingmemory::Memory& memory) const;
-
-        void process(workingmemory::Memory& result, const armem::query::data::memory::All& query, const workingmemory::Memory& memory) const;
-        void process(workingmemory::Memory& result, const armem::query::data::memory::Single& query, const workingmemory::Memory& memory) const;
-        void process(workingmemory::Memory& result, const armem::query::data::memory::Regex& query, const workingmemory::Memory& memory) const;
-
-
-        data::MemoryPtr processToIce(const armem::query::data::MemoryQuery& query, const workingmemory::Memory& memory) const;
-        data::MemoryPtr processToIce(const armem::query::data::MemoryQuerySeq& query, const workingmemory::Memory& memory) const;
-
-
-    private:
-
-        CoreSegmentQueryProcessor coreSegmentProcessor;
-
-    };
-
-}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.cpp
deleted file mode 100644
index d6bc87a69..000000000
--- a/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-#include "ProviderSegmentQueryProcessor.h"
-
-#include <regex>
-
-#include <ArmarXCore/core/logging/Logging.h>
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
-#include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
-
-
-namespace armarx::armem::query_proc
-{
-
-    void ProviderSegmentQueryProcessor::process(workingmemory::ProviderSegment& result, const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const
-    {
-        if (auto q = dynamic_cast<const armem::query::data::provider::All*>(&query))
-        {
-            process(result, *q, providerSegment);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::provider::Single*>(&query))
-        {
-            process(result, *q, providerSegment);
-        }
-        else if (auto q = dynamic_cast<const armem::query::data::provider::Regex*>(&query))
-        {
-            process(result, *q, providerSegment);
-        }
-        else
-        {
-            throw armem::error::UnknownQueryType("provider segment", query);
-        }
-    }
-
-
-    void ProviderSegmentQueryProcessor::process(workingmemory::ProviderSegment& result,
-            const armem::query::data::provider::All& query, const workingmemory::ProviderSegment& providerSegment) const
-    {
-        for (const auto& [name, entity] : providerSegment.entities())
-        {
-            result.addEntity(entityProcessor.process(query.entityQueries, entity));
-        }
-    }
-
-    void ProviderSegmentQueryProcessor::process(workingmemory::ProviderSegment& result,
-            const armem::query::data::provider::Single& query, const workingmemory::ProviderSegment& providerSegment) const
-    {
-        try
-        {
-            const workingmemory::Entity& entity = providerSegment.getEntity(query.entityName);
-            result.addEntity(entityProcessor.process(query.entityQueries, entity));
-        }
-        catch (const error::MissingEntry&)
-        {
-            // Leave empty.
-        }
-    }
-
-    void ProviderSegmentQueryProcessor::process(workingmemory::ProviderSegment& result,
-            const armem::query::data::provider::Regex& query, const workingmemory::ProviderSegment& providerSegment) const
-    {
-        std::regex regex(query.entityNameRegex);
-        for (const auto& [name, entity] : providerSegment.entities())
-        {
-            if (std::regex_search(entity.name(), regex))
-            {
-                result.addEntity(entityProcessor.process(query.entityQueries, entity));
-            }
-        }
-    }
-
-
-    data::ProviderSegment ProviderSegmentQueryProcessor::processToIce(
-        const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const
-    {
-        return toIce<data::ProviderSegment>(process(query, providerSegment));
-    }
-
-}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.h
deleted file mode 100644
index 8397431e4..000000000
--- a/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#pragma once
-
-#include <RobotAPI/interface/armem/query.h>
-
-#include <RobotAPI/libraries/armem/core/workingMemory/Memory.h>
-
-#include "BaseQueryProcessor.h"
-#include "EntityQueryProcessor.h"
-
-
-
-namespace armarx::armem::query_proc
-{
-
-    /**
-     * @brief Handles memory queries.
-     */
-    class ProviderSegmentQueryProcessor : public BaseQueryProcessor<workingmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>
-    {
-    public:
-
-        ProviderSegmentQueryProcessor(DataMode dataMode = DataMode::WithData) :
-            BaseQueryProcessor(dataMode), entityProcessor(dataMode)
-        {}
-
-
-        using BaseQueryProcessor::process;
-
-        void process(workingmemory::ProviderSegment& result, const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const;
-
-        void process(workingmemory::ProviderSegment& result, const armem::query::data::provider::All& query, const workingmemory::ProviderSegment& providerSegment) const;
-        void process(workingmemory::ProviderSegment& result, const armem::query::data::provider::Single& query, const workingmemory::ProviderSegment& providerSegment) const;
-        void process(workingmemory::ProviderSegment& result, const armem::query::data::provider::Regex& query, const workingmemory::ProviderSegment& providerSegment) const;
-
-
-        data::ProviderSegment processToIce(const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const;
-
-
-    private:
-
-        EntityQueryProcessor entityProcessor;
-
-    };
-
-}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.cpp
similarity index 100%
rename from source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.cpp
rename to source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.cpp
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.h
similarity index 84%
rename from source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.h
rename to source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.h
index 7858b2b71..77526c56a 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.h
@@ -12,30 +12,21 @@ namespace armarx::armem::query_proc
      * @brief Base class for memory query processors.
      */
     template <class DataT, class QueryT>
-    class BaseQueryProcessor
+    class BaseQueryProcessorBase
     {
     public:
-
         using QueryPtrT = ::IceInternal::Handle<QueryT>;
         using QuerySeqT = std::vector<QueryPtrT>;
 
-
     public:
 
-        BaseQueryProcessor(DataMode dataMode = DataMode::WithData) :
-            dataMode(dataMode)
-        {}
-
-        virtual ~BaseQueryProcessor()
-        {}
-
-
         DataT process(const QueryT& query, const DataT& data) const
         {
             DataT result = data.copyEmpty();
             this->process(result, query, data);
             return result;
         }
+
         DataT process(const QueryPtrT& query, const DataT& data) const
         {
             return this->process(*query, *data);
@@ -48,7 +39,6 @@ namespace armarx::armem::query_proc
             return result;
         }
 
-
         void process(DataT& result, const QuerySeqT& queries, const DataT& data) const
         {
             for (const auto& query : queries)
@@ -58,12 +48,6 @@ namespace armarx::armem::query_proc
         }
 
         virtual void process(DataT& result, const QueryT& query, const DataT& data) const = 0;
-
-
-    protected:
-
-        DataMode dataMode;
-
     };
 
 }
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.cpp
new file mode 100644
index 000000000..474ed5e5c
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.cpp
@@ -0,0 +1,14 @@
+#include "CoreSegmentQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/error.h>
+
+
+namespace armarx::armem::query_proc
+{
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.h
new file mode 100644
index 000000000..04b7f3ff3
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.h
@@ -0,0 +1,97 @@
+#pragma once
+
+#include <RobotAPI/interface/armem/query.h>
+
+#include "BaseQueryProcessor.h"
+#include "ProviderSegmentQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+
+
+
+namespace armarx::armem::query_proc
+{
+
+    /**
+     * @brief Handles memory queries.
+     */
+    template <class _CoreSegmentT>
+    class CoreSegmentQueryProcessorBase :
+        virtual public BaseQueryProcessorBase<_CoreSegmentT, armem::query::data::CoreSegmentQuery>
+    {
+        using Base = BaseQueryProcessorBase<_CoreSegmentT, armem::query::data::CoreSegmentQuery>;
+        using ProviderSegmentT = typename _CoreSegmentT::ProviderSegmentT;
+
+    public:
+
+        using Base::process;
+        void process(_CoreSegmentT& result,
+                     const armem::query::data::CoreSegmentQuery& query,
+                     const _CoreSegmentT& coreSegment) const override
+        {
+            if (auto q = dynamic_cast<const armem::query::data::core::All*>(&query))
+            {
+                process(result, *q, coreSegment);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::core::Single*>(&query))
+            {
+                process(result, *q, coreSegment);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::core::Regex*>(&query))
+            {
+                process(result, *q, coreSegment);
+            }
+            else
+            {
+                throw armem::error::UnknownQueryType("core segment", query);
+            }
+        }
+
+        void process(_CoreSegmentT& result,
+                     const armem::query::data::core::All& query,
+                     const _CoreSegmentT& coreSegment) const
+        {
+            for (const auto& [name, providerSegment] : coreSegment.providerSegments())
+            {
+                result.addProviderSegment(providerSegmentProcessorProcess(query.providerSegmentQueries, providerSegment));
+            }
+        }
+
+        void process(_CoreSegmentT& result,
+                     const armem::query::data::core::Single& query,
+                     const _CoreSegmentT& coreSegment) const
+        {
+            try
+            {
+                const ProviderSegmentT& providerSegment = coreSegment.getProviderSegment(query.providerSegmentName);
+                result.addProviderSegment(providerSegmentProcessorProcess(query.providerSegmentQueries, providerSegment));
+            }
+            catch (const error::MissingEntry&)
+            {
+                // Leave empty.
+            }
+        }
+
+        void process(_CoreSegmentT& result,
+                     const armem::query::data::core::Regex& query,
+                     const _CoreSegmentT& coreSegment) const
+        {
+            std::regex regex(query.providerSegmentNameRegex);
+            for (const auto& [name, providerSegment] : coreSegment.providerSegments())
+            {
+                if (std::regex_search(providerSegment.name(), regex))
+                {
+                    result.addProviderSegment(providerSegmentProcessorProcess(query.providerSegmentQueries, providerSegment));
+                }
+            }
+        }
+
+    protected:
+        virtual ProviderSegmentT providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& a, const ProviderSegmentT& o) const = 0;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.cpp
new file mode 100644
index 000000000..25f477bf0
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.cpp
@@ -0,0 +1,13 @@
+#include "EntityQueryProcessor.h"
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.h
new file mode 100644
index 000000000..4558dbfad
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.h
@@ -0,0 +1,172 @@
+#pragma once
+
+#include <RobotAPI/interface/armem/query.h>
+
+#include "BaseQueryProcessor.h"
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+    /**
+     * @brief Handles memory queries.
+     */
+    template <class _EntityT>
+    class EntityQueryProcessorBase :
+        virtual public BaseQueryProcessorBase<_EntityT, armem::query::data::EntityQuery>
+    {
+        using Base = BaseQueryProcessorBase<_EntityT, armem::query::data::EntityQuery>;
+        using EntitySnapshotT = typename _EntityT::EntitySnapshotT;
+
+    public:
+        using Base::process;
+        void process(_EntityT& result,
+                     const armem::query::data::EntityQuery& query,
+                     const _EntityT& entity) const override
+        {
+            if (auto q = dynamic_cast<const armem::query::data::entity::All*>(&query))
+            {
+                process(result, *q, entity);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::entity::Single*>(&query))
+            {
+                process(result, *q, entity);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::entity::TimeRange*>(&query))
+            {
+                process(result, *q, entity);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::entity::IndexRange*>(&query))
+            {
+                process(result, *q, entity);
+            }
+            else
+            {
+                throw armem::error::UnknownQueryType("entity snapshot", query);
+            }
+        }
+
+        void process(_EntityT& result,
+                     const armem::query::data::entity::All& query,
+                     const _EntityT& entity) const
+        {
+            (void) query;
+            // Copy this entitiy and its contents.
+
+            for (const auto& [time, snapshot] : entity)
+            {
+                addResultSnapshot(result, snapshot);
+            }
+        }
+
+        void process(_EntityT& result,
+                     const armem::query::data::entity::Single& query,
+                     const _EntityT& entity) const
+        {
+            if (query.timestamp < 0)
+            {
+                try
+                {
+                    addResultSnapshot(result, entity.getLatestSnapshot());
+                }
+                catch (const armem::error::EntityHistoryEmpty&)
+                {
+                    // Leave empty.
+                }
+            }
+            else
+            {
+                Time time = fromIce<Time>(query.timestamp);
+                try
+                {
+                    addResultSnapshot(result, entity.getSnapshot(time));
+                }
+                catch (const armem::error::MissingEntry&)
+                {
+                    // Leave empty.
+                }
+            }
+        }
+
+        void process(_EntityT& result,
+                     const armem::query::data::entity::TimeRange& query,
+                     const _EntityT& entity) const
+        {
+            if (query.minTimestamp <= query.maxTimestamp || query.minTimestamp < 0 || query.maxTimestamp < 0)
+            {
+                Time min = fromIce<Time>(query.minTimestamp);
+                Time max = fromIce<Time>(query.maxTimestamp);
+                process(result, min, max, entity, query);
+            }
+        }
+
+        void process(_EntityT& result,
+                     const armem::query::data::entity::IndexRange& query,
+                     const _EntityT& entity) const
+        {
+            if (entity.empty())
+            {
+                return;
+            }
+
+            size_t first = negativeIndexSemantics(query.first, entity.history().size());
+            size_t last = negativeIndexSemantics(query.last, entity.history().size());
+
+            if (first <= last)
+            {
+                auto it = entity.begin();
+                std::advance(it, first);
+
+                size_t num = last - first + 1;  // +1 to make last inclusive
+                for (size_t i = 0; i < num; ++i, ++it)
+                {
+                    addResultSnapshot(result, it);
+                }
+            }
+        }
+
+        void process(_EntityT& result,
+                     const Time& min,
+                     const Time& max,
+                     const _EntityT& entity,
+                     const armem::query::data::EntityQuery& query) const
+        {
+            (void) query;
+
+            // Returns an iterator pointing to the first element that is not less than (i.e. greater or equal to) key.
+            auto begin = min.toMicroSeconds() > 0 ? entity.history().lower_bound(min) : entity.history().begin();
+            // Returns an iterator pointing to the first element that is *greater than* key.
+            auto end = max.toMicroSeconds() > 0 ? entity.history().upper_bound(max) : entity.history().end();
+
+            for (auto it = begin; it != end && it != entity.history().end(); ++it)
+            {
+                addResultSnapshot(result, it);
+            }
+        }
+
+
+        static size_t negativeIndexSemantics(long index, size_t size)
+        {
+            const size_t max = size > 0 ? size - 1 : 0;
+            if (index >= 0)
+            {
+                return std::clamp<size_t>(static_cast<size_t>(index), 0, max);
+            }
+            else
+            {
+                return static_cast<size_t>(std::clamp<long>(static_cast<long>(size) + index, 0, static_cast<long>(max)));
+            }
+        }
+
+    protected:
+        virtual void addResultSnapshot(_EntityT& result, typename _EntityT::ContainerT::const_iterator it) const = 0;
+        virtual void addResultSnapshot(_EntityT& result, const typename _EntityT::EntitySnapshotT& snapshot) const = 0;
+
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.cpp
new file mode 100644
index 000000000..c1caf0c27
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.cpp
@@ -0,0 +1,15 @@
+#include "MemoryQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.h
new file mode 100644
index 000000000..d9937eed3
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.h
@@ -0,0 +1,94 @@
+#pragma once
+
+#include <regex>
+
+#include <RobotAPI/interface/armem/query.h>
+
+#include "BaseQueryProcessor.h"
+#include "CoreSegmentQueryProcessor.h"
+
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+
+
+namespace armarx::armem::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    template <class _MemoryT>
+    class MemoryQueryProcessorBase :
+            virtual public BaseQueryProcessorBase<_MemoryT, armem::query::data::MemoryQuery>
+    {
+        using Base = BaseQueryProcessorBase<_MemoryT, armem::query::data::MemoryQuery>;
+        using CoreSegmentT = typename _MemoryT::CoreSegmentT;
+
+    public:
+
+        void process(_MemoryT& result,
+                     const armem::query::data::MemoryQuery& query,
+                     const _MemoryT& memory) const override
+        {
+            if (auto q = dynamic_cast<const armem::query::data::memory::All*>(&query))
+            {
+                process(result, *q, memory);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::memory::Single*>(&query))
+            {
+                process(result, *q, memory);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::memory::Regex*>(&query))
+            {
+                process(result, *q, memory);
+            }
+            else
+            {
+                throw armem::error::UnknownQueryType("memory segment", query);
+            }
+        }
+
+        void process(_MemoryT& result,
+                     const armem::query::data::memory::All& query,
+                     const _MemoryT& memory) const
+        {
+            for (const auto& [name, coreSegment] : memory.coreSegments())
+            {
+                result.addCoreSegment(coreSegmentProcessorProcess(query.coreSegmentQueries, coreSegment));
+            }
+        }
+
+        void process(_MemoryT& result,
+                     const armem::query::data::memory::Single& query,
+                     const _MemoryT& memory) const
+        {
+            try
+            {
+                const CoreSegmentT& coreSegment = memory.getCoreSegment(query.coreSegmentName);
+                result.addCoreSegment(coreSegmentProcessorProcess(query.coreSegmentQueries, coreSegment));
+            }
+            catch (const error::MissingEntry&)
+            {
+            }
+        }
+
+        void process(_MemoryT& result,
+                     const armem::query::data::memory::Regex& query,
+                     const _MemoryT& memory) const
+        {
+            std::regex regex(query.coreSegmentNameRegex);
+            for (const auto& [name, coreSegment] : memory.coreSegments())
+            {
+                if (std::regex_search(coreSegment.name(), regex))
+                {
+                    result.addCoreSegment(coreSegmentProcessorProcess(query.coreSegmentQueries, coreSegment));
+                }
+            }
+        }
+
+    protected:
+        virtual CoreSegmentT coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& a, const CoreSegmentT& o) const = 0;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.cpp
new file mode 100644
index 000000000..d07f30836
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.cpp
@@ -0,0 +1,15 @@
+#include "ProviderSegmentQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.h
new file mode 100644
index 000000000..ff586eb47
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.h
@@ -0,0 +1,95 @@
+#pragma once
+
+#include <RobotAPI/interface/armem/query.h>
+
+#include "BaseQueryProcessor.h"
+#include "EntityQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+    /**
+     * @brief Handles memory queries.
+     */
+    template <class _ProviderSegmentT>
+    class ProviderSegmentQueryProcessorBase :
+        virtual public BaseQueryProcessorBase<_ProviderSegmentT, armem::query::data::ProviderSegmentQuery>
+    {
+        using Base = BaseQueryProcessorBase<_ProviderSegmentT, armem::query::data::ProviderSegmentQuery>;
+        using EntityT = typename _ProviderSegmentT::EntityT;
+
+    public:
+        using Base::process;
+        void process(_ProviderSegmentT& result,
+                     const armem::query::data::ProviderSegmentQuery& query,
+                     const _ProviderSegmentT& providerSegment) const override
+        {
+            if (auto q = dynamic_cast<const armem::query::data::provider::All*>(&query))
+            {
+                process(result, *q, providerSegment);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::provider::Single*>(&query))
+            {
+                process(result, *q, providerSegment);
+            }
+            else if (auto q = dynamic_cast<const armem::query::data::provider::Regex*>(&query))
+            {
+                process(result, *q, providerSegment);
+            }
+            else
+            {
+                throw armem::error::UnknownQueryType("provider segment", query);
+            }
+        }
+
+        void process(_ProviderSegmentT& result,
+                     const armem::query::data::provider::All& query,
+                     const _ProviderSegmentT& providerSegment) const
+        {
+            for (const auto& [name, entity] : providerSegment.entities())
+            {
+                result.addEntity(entityProcessorProcess(query.entityQueries, entity));
+            }
+        }
+
+        void process(_ProviderSegmentT& result,
+                     const armem::query::data::provider::Single& query,
+                     const _ProviderSegmentT& providerSegment) const
+        {
+            try
+            {
+                const EntityT& entity = providerSegment.getEntity(query.entityName);
+                result.addEntity(entityProcessorProcess(query.entityQueries, entity));
+            }
+            catch (const error::MissingEntry&)
+            {
+                // Leave empty.
+            }
+        }
+
+        void process(_ProviderSegmentT& result,
+                     const armem::query::data::provider::Regex& query,
+                     const _ProviderSegmentT& providerSegment) const
+        {
+            std::regex regex(query.entityNameRegex);
+            for (const auto& [name, entity] : providerSegment.entities())
+            {
+                if (std::regex_search(entity.name(), regex))
+                {
+                    result.addEntity(entityProcessorProcess(query.entityQueries, entity));
+                }
+            }
+        }
+
+    protected:
+        virtual EntityT entityProcessorProcess(const armem::query::data::EntityQuerySeq& a, const EntityT& o) const = 0;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.cpp
new file mode 100644
index 000000000..5bb5942e8
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.cpp
@@ -0,0 +1,13 @@
+#include "BaseQueryProcessor.h"
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.h
new file mode 100644
index 000000000..c129b8545
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include <RobotAPI/interface/armem/query.h>
+#include <RobotAPI/libraries/armem/core/DataMode.h>
+
+#include "../base/BaseQueryProcessor.h"
+
+
+namespace armarx::armem::longtermmemory::query_proc
+{
+    /**
+     * @brief Base class for memory query processors.
+     */
+    template <class DataT, class QueryT>
+    class BaseQueryProcessor :
+            virtual public armarx::armem::query_proc::BaseQueryProcessorBase<DataT, QueryT>
+    {
+    public:
+        using Base = armarx::armem::query_proc::BaseQueryProcessorBase<DataT, QueryT>;
+
+        BaseQueryProcessor()
+        {}
+
+    protected:
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp
new file mode 100644
index 000000000..474ed5e5c
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp
@@ -0,0 +1,14 @@
+#include "CoreSegmentQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/error.h>
+
+
+namespace armarx::armem::query_proc
+{
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h
new file mode 100644
index 000000000..17c07c312
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "BaseQueryProcessor.h"
+#include "../base/CoreSegmentQueryProcessor.h"
+
+#include "../../../core/longtermMemory/CoreSegment.h"
+
+#include "ProviderSegmentQueryProcessor.h"
+
+
+namespace armarx::armem::longtermmemory::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    class CoreSegmentQueryProcessor :
+        virtual public BaseQueryProcessor<longtermmemory::CoreSegment, armem::query::data::CoreSegmentQuery>,
+        virtual public armarx::armem::query_proc::CoreSegmentQueryProcessorBase<longtermmemory::CoreSegment>
+    {
+        using Base = BaseQueryProcessor<longtermmemory::CoreSegment, armem::query::data::CoreSegmentQuery>;
+        using ProviderSegmentT = typename longtermmemory::CoreSegment::ProviderSegmentT;
+
+    public:
+        CoreSegmentQueryProcessor() :
+            Base()
+        {}
+
+    protected:
+        virtual ProviderSegmentT providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& q, const ProviderSegmentT& s) const override
+        {
+            return providerSegmentProcessor.process(q, s);
+        }
+
+    private:
+        ProviderSegmentQueryProcessor providerSegmentProcessor;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.cpp
new file mode 100644
index 000000000..25f477bf0
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.cpp
@@ -0,0 +1,13 @@
+#include "EntityQueryProcessor.h"
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.h
new file mode 100644
index 000000000..d7306cb30
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include "BaseQueryProcessor.h"
+#include "../base/EntityQueryProcessor.h"
+
+#include "../../../core/longtermMemory/Entity.h"
+
+#include "EntityQueryProcessor.h"
+
+namespace armarx::armem::longtermmemory::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    class EntityQueryProcessor :
+            virtual public BaseQueryProcessor<longtermmemory::Entity, armem::query::data::EntityQuery>,
+            virtual public armarx::armem::query_proc::EntityQueryProcessorBase<longtermmemory::Entity>
+    {
+        using Base = BaseQueryProcessor<longtermmemory::Entity, armem::query::data::EntityQuery>;
+
+    public:
+        EntityQueryProcessor() :
+            Base()
+        {}
+
+    private:
+        void addResultSnapshot(longtermmemory::Entity& result, longtermmemory::Entity::ContainerT::const_iterator it) const override
+        {
+            addResultSnapshot(result, it->second);
+        }
+
+        void addResultSnapshot(longtermmemory::Entity& result, const longtermmemory::EntitySnapshot& snapshot) const override
+        {
+            result.addSnapshot(snapshot.copy());
+        }
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.cpp
new file mode 100644
index 000000000..c1caf0c27
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.cpp
@@ -0,0 +1,15 @@
+#include "MemoryQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.h
new file mode 100644
index 000000000..6e70fb7b0
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include "BaseQueryProcessor.h"
+#include "../base/MemoryQueryProcessor.h"
+
+#include "../../../core/longtermMemory/Memory.h"
+
+#include "CoreSegmentQueryProcessor.h"
+
+namespace armarx::armem::longtermmemory::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    class MemoryQueryProcessor :
+            virtual public BaseQueryProcessor<longtermmemory::Memory, armem::query::data::MemoryQuery>,
+            virtual public armarx::armem::query_proc::MemoryQueryProcessorBase<longtermmemory::Memory>
+    {
+        using Base = BaseQueryProcessor<longtermmemory::Memory, armem::query::data::MemoryQuery>;
+        using CoreSegmentT = typename longtermmemory::Memory::CoreSegmentT;
+
+    public:
+        MemoryQueryProcessor() :
+            Base()
+        {}
+
+    protected:
+        virtual CoreSegmentT coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& q, const CoreSegmentT& s) const override
+        {
+            return coreSegmentProcessor.process(q, s);
+        }
+
+    private:
+        CoreSegmentQueryProcessor coreSegmentProcessor;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp
new file mode 100644
index 000000000..d07f30836
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp
@@ -0,0 +1,15 @@
+#include "ProviderSegmentQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h
new file mode 100644
index 000000000..57cb91c41
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include "BaseQueryProcessor.h"
+#include "../base/ProviderSegmentQueryProcessor.h"
+
+#include "../../../core/longtermMemory/ProviderSegment.h"
+
+#include "EntityQueryProcessor.h"
+
+namespace armarx::armem::longtermmemory::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    class ProviderSegmentQueryProcessor :
+        virtual public BaseQueryProcessor<longtermmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>,
+        virtual public armarx::armem::query_proc::ProviderSegmentQueryProcessorBase<longtermmemory::ProviderSegment>
+    {
+        using Base = BaseQueryProcessor<longtermmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>;
+        using EntityT = longtermmemory::ProviderSegment::EntityT;
+
+    public:
+        ProviderSegmentQueryProcessor() :
+            Base()
+        {}
+
+    protected:
+        virtual EntityT entityProcessorProcess(const armem::query::data::EntityQuerySeq& q, const EntityT& s) const override
+        {
+            return entityProcessor.process(q, s);
+        }
+
+    private:
+        EntityQueryProcessor entityProcessor;
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.cpp
new file mode 100644
index 000000000..5bb5942e8
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.cpp
@@ -0,0 +1,13 @@
+#include "BaseQueryProcessor.h"
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.h
new file mode 100644
index 000000000..dee5d621c
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.h
@@ -0,0 +1,28 @@
+#pragma once
+
+#include <RobotAPI/interface/armem/query.h>
+#include <RobotAPI/libraries/armem/core/DataMode.h>
+
+#include "../base/BaseQueryProcessor.h"
+
+
+namespace armarx::armem::workingmemory::query_proc
+{
+    /**
+     * @brief Base class for memory query processors.
+     */
+    template <class DataT, class QueryT>
+    class BaseQueryProcessor :
+            virtual public armarx::armem::query_proc::BaseQueryProcessorBase<DataT, QueryT>
+    {
+    public:
+        using Base = armarx::armem::query_proc::BaseQueryProcessorBase<DataT, QueryT>;
+
+        BaseQueryProcessor(DataMode dataMode = DataMode::WithData) :
+            dataMode(dataMode)
+        {}
+
+    protected:
+        DataMode dataMode;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp
new file mode 100644
index 000000000..474ed5e5c
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp
@@ -0,0 +1,14 @@
+#include "CoreSegmentQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+#include <RobotAPI/libraries/armem/core/error.h>
+
+
+namespace armarx::armem::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
new file mode 100644
index 000000000..6cc1dea86
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "BaseQueryProcessor.h"
+#include "../base/CoreSegmentQueryProcessor.h"
+
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+#include "ProviderSegmentQueryProcessor.h"
+
+
+namespace armarx::armem::workingmemory::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    class CoreSegmentQueryProcessor :
+        virtual public BaseQueryProcessor<workingmemory::CoreSegment, armem::query::data::CoreSegmentQuery>,
+        virtual public armarx::armem::query_proc::CoreSegmentQueryProcessorBase<workingmemory::CoreSegment>
+    {
+        using Base = BaseQueryProcessor<workingmemory::CoreSegment, armem::query::data::CoreSegmentQuery>;
+        using ProviderSegmentT = typename workingmemory::CoreSegment::ProviderSegmentT;
+
+    public:
+        CoreSegmentQueryProcessor(DataMode dataMode = DataMode::WithData) :
+            Base(dataMode), providerSegmentProcessor(dataMode)
+        {}
+
+        using Base::process;
+        data::CoreSegment processToIce(const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const
+        {
+            return toIce<data::CoreSegment>(process(query, coreSegment));
+        }
+
+    protected:
+        virtual ProviderSegmentT providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& q, const ProviderSegmentT& s) const override
+        {
+            return providerSegmentProcessor.process(q, s);
+        }
+
+    private:
+        ProviderSegmentQueryProcessor providerSegmentProcessor;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.cpp
new file mode 100644
index 000000000..25f477bf0
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.cpp
@@ -0,0 +1,13 @@
+#include "EntityQueryProcessor.h"
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::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
new file mode 100644
index 000000000..eaf0c84af
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.h
@@ -0,0 +1,52 @@
+#pragma once
+
+#include "BaseQueryProcessor.h"
+#include "../base/EntityQueryProcessor.h"
+
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+#include "EntityQueryProcessor.h"
+
+namespace armarx::armem::workingmemory::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    class EntityQueryProcessor :
+            virtual public BaseQueryProcessor<workingmemory::Entity, armem::query::data::EntityQuery>,
+            virtual public armarx::armem::query_proc::EntityQueryProcessorBase<workingmemory::Entity>
+    {
+        using Base = BaseQueryProcessor<workingmemory::Entity, armem::query::data::EntityQuery>;
+
+    public:
+        EntityQueryProcessor(DataMode dataMode = DataMode::WithData) :
+            Base(dataMode)
+        {}
+
+        data::Entity processToIce(const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const
+        {
+            return toIce<data::Entity>(process(query, entity));
+        }
+
+    private:
+        void addResultSnapshot(workingmemory::Entity& result, workingmemory::Entity::ContainerT::const_iterator it) const override
+        {
+            addResultSnapshot(result, it->second);
+        }
+
+        void addResultSnapshot(workingmemory::Entity& result, const workingmemory::EntitySnapshot& snapshot) const override
+        {
+            bool withData = (dataMode == DataMode::WithData);
+            if (withData)
+            {
+                result.addSnapshot(snapshot.copy());
+            }
+            else
+            {
+                result.addSnapshot(snapshot.copyWithoutData());
+            }
+        }
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.cpp
new file mode 100644
index 000000000..c1caf0c27
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.cpp
@@ -0,0 +1,15 @@
+#include "MemoryQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::query_proc
+{
+
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.h
new file mode 100644
index 000000000..26a589619
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.h
@@ -0,0 +1,59 @@
+#pragma once
+
+#include "BaseQueryProcessor.h"
+#include "../base/MemoryQueryProcessor.h"
+
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+#include "CoreSegmentQueryProcessor.h"
+
+namespace armarx::armem::workingmemory::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    class MemoryQueryProcessor :
+            virtual public BaseQueryProcessor<workingmemory::Memory, armem::query::data::MemoryQuery>,
+            virtual public armarx::armem::query_proc::MemoryQueryProcessorBase<workingmemory::Memory>
+    {
+        using Base = BaseQueryProcessor<workingmemory::Memory, armem::query::data::MemoryQuery>;
+        using CoreSegmentT = typename workingmemory::Memory::CoreSegmentT;
+
+    public:
+        MemoryQueryProcessor(DataMode dataMode = DataMode::WithData) :
+            Base(dataMode), coreSegmentProcessor(dataMode)
+        {}
+
+        armem::query::data::Result process(const armem::query::data::Input& input,
+                                           const workingmemory::Memory& memory) const
+        {
+            armem::query::data::Result result;
+            result.memory = processToIce(input.memoryQueries, memory);
+            result.success = true;
+            return result;
+        }
+
+        using Base::process;
+        data::MemoryPtr processToIce(const armem::query::data::MemoryQuery& query,
+                                     const workingmemory::Memory& memory) const
+        {
+            return toIce<data::MemoryPtr>(process(query, memory));
+        }
+
+        data::MemoryPtr processToIce(const armem::query::data::MemoryQuerySeq& queries,
+                                     const workingmemory::Memory& memory) const
+        {
+            return toIce<data::MemoryPtr>(process(queries, memory));
+        }
+
+    protected:
+        virtual CoreSegmentT coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& q, const CoreSegmentT& s) const override
+        {
+            return coreSegmentProcessor.process(q, s);
+        }
+
+
+    private:
+        CoreSegmentQueryProcessor coreSegmentProcessor;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp
new file mode 100644
index 000000000..d07f30836
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp
@@ -0,0 +1,15 @@
+#include "ProviderSegmentQueryProcessor.h"
+
+#include <regex>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+
+namespace armarx::armem::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
new file mode 100644
index 000000000..abaa868f9
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include "BaseQueryProcessor.h"
+#include "../base/ProviderSegmentQueryProcessor.h"
+
+#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h>
+
+#include "EntityQueryProcessor.h"
+
+namespace armarx::armem::workingmemory::query_proc
+{
+    /**
+     * @brief Handles memory queries.
+     */
+    class ProviderSegmentQueryProcessor :
+        virtual public BaseQueryProcessor<workingmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>,
+        virtual public armarx::armem::query_proc::ProviderSegmentQueryProcessorBase<workingmemory::ProviderSegment>
+    {
+        using Base = BaseQueryProcessor<workingmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>;
+        using EntityT = workingmemory::ProviderSegment::EntityT;
+
+    public:
+        ProviderSegmentQueryProcessor(DataMode dataMode = DataMode::WithData) :
+            Base(dataMode), entityProcessor(dataMode)
+        {}
+
+        using Base::process;
+        data::ProviderSegment processToIce(const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const
+        {
+            return toIce<data::ProviderSegment>(process(query, providerSegment));
+        }
+
+    protected:
+        virtual EntityT entityProcessorProcess(const armem::query::data::EntityQuerySeq& q, const EntityT& s) const override
+        {
+            return entityProcessor.process(q, s);
+        }
+
+    private:
+        EntityQueryProcessor entityProcessor;
+    };
+}
diff --git a/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp
index 51227ab81..4f0f297dd 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp
@@ -25,7 +25,7 @@
 #define ARMARX_BOOST_TEST
 
 #include <RobotAPI/Test.h>
-#include "../server/query_proc/EntityQueryProcessor.h"
+#include "../server/query_proc/workingMemory/EntityQueryProcessor.h"
 #include "../error.h"
 
 
@@ -38,7 +38,7 @@
 namespace armem = armarx::armem;
 namespace aron = armarx::aron;
 namespace query = armarx::armem::query::data;
-using EntityQueryProcessor = armarx::armem::query_proc::EntityQueryProcessor;
+using EntityQueryProcessor = armarx::armem::workingmemory::query_proc::EntityQueryProcessor;
 
 
 namespace ArMemQueryTest
@@ -52,7 +52,7 @@ namespace ArMemQueryTest
     {
         armem::workingmemory::Entity entity;
 
-        armem::query_proc::EntityQueryProcessor processor;
+        armem::workingmemory::query_proc::EntityQueryProcessor processor;
         query::EntityQueryPtr entityQuery;
 
         std::vector<armem::workingmemory::Entity> results;
diff --git a/source/RobotAPI/libraries/armem_gui/LTMControlWidget.cpp b/source/RobotAPI/libraries/armem_gui/LTMControlWidget.cpp
index 53358453d..257e43d3a 100644
--- a/source/RobotAPI/libraries/armem_gui/LTMControlWidget.cpp
+++ b/source/RobotAPI/libraries/armem_gui/LTMControlWidget.cpp
@@ -22,25 +22,19 @@ namespace armarx::armem::gui
         layout->setContentsMargins(margin, margin, margin, margin);
 
         _lineEdit = new QLineEdit("/tmp/MemoryExport", this);
-        _loadFromHereButton = new QPushButton("Load", this);
-        _encodeButton = new QPushButton("Encode", this);
-        _exportHereButton = new QPushButton("Export", this);
-        _retrieveButton = new QPushButton("Retrieve", this);
-        _removeFromWMButton = new QPushButton("Clear", this);
+        _exportHereButton = new QPushButton("Export here", this);
+
+        _storeButton = new QPushButton("Store in LTM", this);
 
         layout->addWidget(_lineEdit);
-        layout->addWidget(_loadFromHereButton);
-        layout->addWidget(_encodeButton);
+        layout->addWidget(_storeButton);
         layout->addWidget(_exportHereButton);
-        layout->addWidget(_retrieveButton);
-        layout->addWidget(_removeFromWMButton);
 
         // Private connections.
 
         // Public connections.
-        //connect(_mkdirButton, &QPushButton::pressed, this, &This::mkdir);
-        //connect(_loadButton, &QPushButton::pressed, this, &This::load);
-        //connect(_storeButton, &QPushButton::pressed, this, &This::store);
+        connect(_storeButton, &QPushButton::pressed, this, &This::store);
+        connect(_exportHereButton, &QPushButton::pressed, this, &This::exportHere);
     }
 
     QLineEdit* LTMControlWidget::pathInputBox()
@@ -53,29 +47,14 @@ namespace armarx::armem::gui
         return _lineEdit->text();
     }
 
-    QPushButton* LTMControlWidget::loadFromHere()
+    QPushButton* LTMControlWidget::storeButton()
     {
-        return _loadFromHereButton;
-    }
-
-    QPushButton* LTMControlWidget::encodeButton()
-    {
-        return _encodeButton;
+        return _storeButton;
     }
 
     QPushButton* LTMControlWidget::exportHereButton()
     {
         return _exportHereButton;
     }
-
-    QPushButton* LTMControlWidget::retrieveButton()
-    {
-        return _retrieveButton;
-    }
-
-    QPushButton* LTMControlWidget::removeFromWMButton()
-    {
-        return _removeFromWMButton;
-    }
 }
 
diff --git a/source/RobotAPI/libraries/armem_gui/LTMControlWidget.h b/source/RobotAPI/libraries/armem_gui/LTMControlWidget.h
index 31dda4098..9c827b011 100644
--- a/source/RobotAPI/libraries/armem_gui/LTMControlWidget.h
+++ b/source/RobotAPI/libraries/armem_gui/LTMControlWidget.h
@@ -20,21 +20,15 @@ namespace armarx::armem::gui
         QLineEdit* pathInputBox();
         QString getEnteredPath();
 
-        QPushButton* loadFromHere();
-        QPushButton* encodeButton();
+        QPushButton* storeButton();
         QPushButton* exportHereButton();
-        QPushButton* retrieveButton();
-        QPushButton* removeFromWMButton();
 
     public slots:
 
     signals:
 
-        void loadAndAppend();
-        void encode();
+        void store();
         void exportHere();
-        void retrieve();
-        void removeFromWM();
 
     private slots:
 
@@ -46,11 +40,8 @@ namespace armarx::armem::gui
 
         QLineEdit* _lineEdit;
 
-        QPushButton* _loadFromHereButton;
-        QPushButton* _encodeButton;
+        QPushButton* _storeButton;
         QPushButton* _exportHereButton;
-        QPushButton* _retrieveButton;
-        QPushButton* _removeFromWMButton;
 
     };
 
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
index 53669802d..564984f22 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
+++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
@@ -59,9 +59,8 @@ namespace armarx::armem::gui
 
         //connect(this, &This::connected, this, &This::updateMemory);
 
-        //connect(ltmControlWidget, &armem::gui::LTMControlWidget::store, this, &This::store);
-        //connect(ltmControlWidget, &armem::gui::LTMControlWidget::load, this, &This::load);
-        //connect(ltmControlWidget, &armem::gui::LTMControlWidget::mkdir, this, &This::mkdir);
+        connect(ltmControlWidget, &armem::gui::LTMControlWidget::store, this, &This::store);
+        connect(ltmControlWidget, &armem::gui::LTMControlWidget::exportHere, this, &This::exportHere);
 
         connect(this, &This::connected, this, &This::updateMemories);
         connect(updateWidget, &armem::gui::PeriodicUpdateWidget::update, this, &This::updateMemories);
@@ -121,46 +120,30 @@ namespace armarx::armem::gui
         emit disconnected();
     }
 
-    /*void MemoryViewer::store()
+    void MemoryViewer::store()
     {
-        if (!memoryReader)
-        {
-            return;
-        }
+        TIMING_START(MemoryStore);
 
-        TIMING_START(MemoryDump);
-        QString qs = ltmControlWidget->getEnteredPath();
-        std::string utf8_text = qs.toUtf8().constData();
-
-        if (this->memoryData)
+        for (auto& [name, reader] : memoryReaders)
         {
-            io::DiskMemory d(*this->memoryData, utf8_text, std::make_shared<io::NlohmannJSONDiskWriter>());
+            data::StoreInput input;
+            input.query = memoryGroup->queryWidget()->queryInput().toIce();
+            reader.readAndStore(input);
         }
 
-        TIMING_END_STREAM(MemoryDump, ARMARX_VERBOSE);
-
-        if (statusLabel)
-        {
-            statusLabel->setText(QString::fromStdString("Successfully stored memory."));
-        }
+        TIMING_END_STREAM(MemoryStore, ARMARX_VERBOSE);
     }
 
-    void MemoryViewer::load()
+    void MemoryViewer::exportHere()
     {
-        TIMING_START(MemoryLoad);
+        TIMING_START(MemoryExport);
         QString qs = ltmControlWidget->getEnteredPath();
         std::string utf8_text = qs.toUtf8().constData();
 
-        io::DiskMemory d(std::filesystem::path(utf8_text), std::make_shared<io::NlohmannJSONDiskWriter>());
-        this->memoryData = d.toMemory();
 
-        TIMING_END_STREAM(MemoryLoad, ARMARX_VERBOSE);
 
-        if (this->memoryData)
-        {
-            emit memoryDataChanged();
-        }
-    }*/
+        TIMING_END_STREAM(MemoryExport, ARMARX_VERBOSE);
+    }
 
     void MemoryViewer::updateMemories()
     {
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
index 2a31ba203..7bcd788a0 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
+++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
@@ -63,10 +63,11 @@ namespace armarx::armem::gui
 
     public slots:
 
-        //void store();
-        //void load();
-        //void mkdir();
+        // LTMControlWidget
+        void store();
+        void exportHere();
 
+        // Other
         void updateMemories();
         void updateInstanceTree(const armem::MemoryID& selectedID);
 
-- 
GitLab