diff --git a/source/RobotAPI/components/ArViz/ArVizStorage.cpp b/source/RobotAPI/components/ArViz/ArVizStorage.cpp
index 5430091b2b917f819e2acb0e8717e904e8d4e45f..8630c8a9f76cce5bb9b6d61005bed907786e8b3c 100644
--- a/source/RobotAPI/components/ArViz/ArVizStorage.cpp
+++ b/source/RobotAPI/components/ArViz/ArVizStorage.cpp
@@ -203,7 +203,7 @@ namespace armarx
 
                 // Insert or create the layer
                 bool found = false;
-                for (auto& layer : currentState)
+                for (viz::data::TimestampedLayerUpdate& layer : currentState)
                 {
                     if (layer.update.component == update.component
                         && layer.update.name == update.name)
@@ -298,9 +298,9 @@ namespace armarx
 
         std::unique_lock<std::mutex> lock(historyMutex);
 
-        for (auto& interaction : interactions)
+        for (viz::data::InteractionFeedback const& interaction : interactions)
         {
-            for (auto& entry : interactionBuffer)
+            for (viz::data::InteractionFeedback& entry : interactionBuffer)
             {
                 if (entry.component == interaction.component
                         && entry.layer == interaction.layer
@@ -327,7 +327,7 @@ namespace armarx
         }
 
         result.updates.reserve(currentState.size());
-        for (auto& layer : currentState)
+        for (viz::data::TimestampedLayerUpdate& layer : currentState)
         {
             if (layer.revision > revision)
             {
diff --git a/source/RobotAPI/components/ArViz/ArVizStorage.h b/source/RobotAPI/components/ArViz/ArVizStorage.h
index f01a68fba62bd7f9fb961dcb182480774ec848de..c484b6d21c28f8ba25ebf7c8f1ff1e40f816c8d7 100644
--- a/source/RobotAPI/components/ArViz/ArVizStorage.h
+++ b/source/RobotAPI/components/ArViz/ArVizStorage.h
@@ -43,8 +43,8 @@ namespace armarx
      * clients and provides them for visualizing components such as the
      * ArViz gui plugin.
      *
-     * In addition, the ArViz storage can be used to record and restore
-     * visualization episodes and restore.
+     * In addition, the ArViz storage can be used to record and replay
+     * visualization episodes.
      *
      *
      * @class ArVizStorage
diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizationObject.cpp b/source/RobotAPI/components/ArViz/Coin/VisualizationObject.cpp
index 0daa2db1c31eeef0ef6dcc1254693a93d82b8e21..5f6b068fccb635c596f2534068e4516fec63693d 100644
--- a/source/RobotAPI/components/ArViz/Coin/VisualizationObject.cpp
+++ b/source/RobotAPI/components/ArViz/Coin/VisualizationObject.cpp
@@ -218,7 +218,7 @@ namespace armarx::viz::coin
 
         node->removeAllChildren();
 
-        auto& object = *loaded.object;
+        VirtualRobot::ManipulationObject& object = *loaded.object;
 
         SoSeparator* nodeSep = new SoSeparator;
 
@@ -228,7 +228,7 @@ namespace armarx::viz::coin
         nodeMat->setOverride(false);
         nodeSep->addChild(nodeMat);
 
-        auto nodeVisu = object.getVisualization<VirtualRobot::CoinVisualization>(visuType);
+        VirtualRobot::CoinVisualizationPtr nodeVisu = object.getVisualization<VirtualRobot::CoinVisualization>(visuType);
         if (nodeVisu)
         {
             SoNode* sepRobNode = nodeVisu->getCoinVisualization();
diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp
index bca1b041325f5532e8205dbe43c9c0b09429953b..c7d941aa565e37ecd7b53c3035f844c139981d8a 100644
--- a/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp
+++ b/source/RobotAPI/components/armem/server/ExampleMemory/ExampleMemory.cpp
@@ -23,13 +23,14 @@
 #include "ExampleMemory.h"
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 
 #include <SimoxUtility/algorithm/string.h>
 
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/core/error.h>
 #include <RobotAPI/libraries/armem/core/Prediction.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
+#include <RobotAPI/libraries/armem/core/ice_conversions.h>
 #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h>
 
 #include <RobotAPI/components/armem/server/ExampleMemory/aron/ExampleData.aron.generated.h>
@@ -163,7 +164,7 @@ namespace armarx
         ExecuteActionOutputSeq output;
         for (const auto& [id, path] : input)
         {
-            auto memoryID = fromIce<armem::MemoryID>(id);
+            const armem::MemoryID memoryID = armarx::fromIce<armem::MemoryID>(id);
             if (path == ActionPath{"hi"})
             {
                 ARMARX_INFO << "Hello, " << memoryID.str() << "!";
diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/test/ExampleMemoryTest.cpp b/source/RobotAPI/components/armem/server/ExampleMemory/test/ExampleMemoryTest.cpp
index 362a2d2f338fe4e007a34756d006338ebd4611dc..bffeec398b2f5b1b913670f766a5e08d9a623563 100644
--- a/source/RobotAPI/components/armem/server/ExampleMemory/test/ExampleMemoryTest.cpp
+++ b/source/RobotAPI/components/armem/server/ExampleMemory/test/ExampleMemoryTest.cpp
@@ -41,7 +41,7 @@ BOOST_AUTO_TEST_CASE(test_ExampleData_type)
 {
     armarx::aron::type::ObjectPtr type = ExampleData::ToAronType();
 
-    BOOST_CHECK_EQUAL(type->childrenSize(), 20);
+    BOOST_CHECK_EQUAL(type->childrenSize(), 21);
 
     armem::wm::Memory memory;
     armem::wm::CoreSegment& core = memory.addCoreSegment("ExampleData", type);
diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
index 52fa8e1a0538dd41fb4ac6bb760464d31e78eb18..71eba7787783661f2c1dee98c605ab0122e5ece9 100644
--- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
+++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
@@ -22,12 +22,12 @@
 
 #include "ObjectMemory.h"
 
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 #include <ArmarXCore/core/time/ice_conversions.h>
 
 #include <RobotAPI/libraries/ArmarXObjects/aron_conversions.h>
 #include <RobotAPI/libraries/ArmarXObjects/ice_conversions.h>
 #include <RobotAPI/libraries/armem/client/query.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
 #include <RobotAPI/libraries/armem/core/Prediction.h>
 #include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
 
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
index ff79f501c35016154272c659db18233caf39a9d6..ff461269fd3c68bf57c6c69d77116c62dc807d5c 100644
--- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
@@ -36,6 +36,12 @@ namespace armarx
     }
 
 
+    QIcon ArMemMemoryViewerWidgetController::GetWidgetIcon()
+    {
+        return QIcon(":icons/memory-128.png");
+    }
+
+
     ArMemMemoryViewerWidgetController::ArMemMemoryViewerWidgetController()
     {
         widget.setupUi(getWidget());
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h
index dc6789843bc3d079051591c6af992f26835084d0..ca4db2ac23e5756bd96726ef830c103327dd1d5e 100644
--- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h
@@ -73,7 +73,7 @@ namespace armarx
     public:
 
         static QString GetWidgetName();
-
+        static QIcon GetWidgetIcon();
 
         explicit ArMemMemoryViewerWidgetController();
         virtual ~ArMemMemoryViewerWidgetController() override;
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/CMakeLists.txt b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/CMakeLists.txt
index c449d1100f0ed75d7ccabe34e7ab6446b2996a1a..8b46376363d31ce9b1818f95b1fccc73194fdc86 100644
--- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/CMakeLists.txt
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/CMakeLists.txt
@@ -1,4 +1,4 @@
-set(LIB_NAME "ArMemMemoryViewerGuiPlugin")
+set(LIB_NAME ArMemMemoryViewerGuiPlugin)
 armarx_set_target("${LIB_NAME}")
 
 # most qt components will be linked against in the call armarx_gui_library
@@ -26,8 +26,10 @@ set(COMPONENT_LIBS
     RobotAPI::armem_gui
 )
 
+qt5_add_resources(GUI_RCS icons.qrc)
+
 if(ArmarXGui_FOUND)
-    armarx_gui_plugin("${LIB_NAME}" "${SOURCES}" "" "${GUI_UIS}" "" "${COMPONENT_LIBS}")
+    armarx_gui_plugin("${LIB_NAME}" "${SOURCES}" "" "${GUI_UIS}" "${GUI_RCS}" "${COMPONENT_LIBS}")
 
     #find_package(MyLib QUIET)
     #armarx_build_if(MyLib_FOUND "MyLib not available")
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons.qrc b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons.qrc
new file mode 100644
index 0000000000000000000000000000000000000000..71239b0e21cfafe8e45db1fb599f243aefe3b04f
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons.qrc
@@ -0,0 +1,7 @@
+<RCC>
+    <qresource prefix="/">
+        <file>icons/memory-64.png</file>
+        <file>icons/memory-128.png</file>
+        <file>icons/memory-256.png</file>
+    </qresource>
+</RCC>
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-128.png b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-128.png
new file mode 100644
index 0000000000000000000000000000000000000000..930ef5066af85016d0e830e61a573e4577c99f5c
Binary files /dev/null and b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-128.png differ
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-256.png b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-256.png
new file mode 100644
index 0000000000000000000000000000000000000000..777319a1468c4a1987e618e5b7ac3be4605343aa
Binary files /dev/null and b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-256.png differ
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-64.png b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-64.png
new file mode 100644
index 0000000000000000000000000000000000000000..67d1e00324107fbf04d23e0cc41941a1279c95ca
Binary files /dev/null and b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-64.png differ
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory.svg b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c72f8838d719b0817a6eed536eb8ba452d3223b8
--- /dev/null
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   version="1.1"
+   id="svg854"
+   xml:space="preserve"
+   width="192"
+   height="128"
+   viewBox="0 0 192 128"
+   sodipodi:docname="memory.svg"
+   inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
+   inkscape:export-filename="/home/rkartmann/code/armarx/RobotAPI/source/RobotAPI/gui-plugins/ArMemMemoryViewer/icons/memory-128.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"><defs
+     id="defs858"><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath868"><path
+         d="M 0,2.2888e-5 H 84.96 V 84.960023 H 0 Z"
+         clip-rule="evenodd"
+         id="path866" /></clipPath><clipPath
+       id="p.0"><path
+         d="M 0,0 H 64 V 64 H 0 Z"
+         clip-rule="nonzero"
+         id="path2" /></clipPath><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath32362"><rect
+         style="fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:0.380907"
+         id="rect32364"
+         width="144.00002"
+         height="93.222496"
+         x="-2.3536728e-14"
+         y="-84.959999"
+         transform="scale(1,-1)" /></clipPath></defs><sodipodi:namedview
+     id="namedview856"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="false"
+     showgrid="false"
+     width="129px"
+     borderlayer="true"
+     inkscape:zoom="2.6915184"
+     inkscape:cx="49.725291"
+     inkscape:cy="110.97224"
+     inkscape:window-width="1848"
+     inkscape:window-height="1016"
+     inkscape:window-x="72"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g860"
+     inkscape:snap-page="true" /><g
+     id="g860"
+     inkscape:groupmode="layer"
+     inkscape:label="brain"
+     transform="matrix(1.3333333,0,0,-1.3333333,0,113.28)"><rect
+       style="fill:#073763;fill-opacity:1;stroke:none;stroke-width:0.522041"
+       id="rect13881"
+       width="96"
+       height="96"
+       x="-109.75572"
+       y="-84.959999"
+       transform="scale(1,-1)"
+       rx="7.5"
+       ry="7.5" /><path
+       d="m -18.59388,28.36877 c 3.299219,5.039641 3.07158,11.876525 -0.569091,16.674506 0.455279,1.440357 0.682903,2.87911 0.682903,4.319465 0,6.836884 -4.66501,12.595102 -10.920472,13.915427 -1.934914,5.878248 -7.053694,9.715993 -12.969209,9.715993 -1.024362,0 -2.162545,-0.120029 -3.185388,-0.360089 -2.390189,2.999139 -5.915517,4.799583 -9.556186,5.158072 -3.754479,0.240058 -7.39515,-1.078666 -10.125272,-3.717717 -3.526847,2.519022 -7.962725,3.239199 -11.944844,1.918874 -4.095941,-1.318726 -7.281334,-4.557923 -8.759455,-8.877387 -0.227634,0 -0.56909,0 -0.796726,0 -7.507453,0 -13.53678,-6.236736 -13.6506,-14.155486 0,-0.238459 0,-0.478518 0,-0.718579 -4.55122,-2.639049 -7.16752,-7.79712 -6.82606,-13.315278 0.45527,-7.558662 6.82606,-13.196851 14.105873,-13.196851 h 17.632723 c 7.50897,0 13.652121,-6.356766 13.765939,-14.273916 V -3.8999792 h 8.987092 V 6.8962822 c 0,0.4801164 0,1.0802642 0,1.5603829 0,4.4378929 -0.113829,10.0760819 2.843937,13.6753689 1.821087,2.038902 3.868306,3.837745 6.029332,5.398129 1.707279,1.078665 3.185406,2.39899 4.437382,3.957775 0.569107,0.960236 1.136682,1.920473 1.478134,2.879109 -2.388669,0.960237 -4.891148,1.320325 -7.393632,0.960237 -1.251999,-0.12003 -2.390189,0.720177 -2.617826,2.038903 -0.112303,1.320324 0.68291,2.519019 1.934916,2.75908 3.071573,0.480117 6.143137,0.120028 9.100904,-1.078667 0,0.358488 0,0.598547 0.113812,0.958635 0.113812,1.918872 -0.113812,3.839347 -0.682903,5.63819 -1.591953,4.319464 -5.574055,6.238336 -9.328539,7.79712 -0.682916,0.24006 -1.364308,0.480119 -2.274855,0.720177 l -0.68291,0.240059 h -0.113815 c -0.910547,-0.120027 -1.705753,-0.360087 -2.6163,-0.720176 l -1.024376,-0.24006 -1.136658,-0.240059 c -1.934902,-2.398991 -2.957755,-5.518158 -2.730122,-8.755757 0.227644,-3.239197 1.705753,-6.118307 3.980602,-8.15721 0.910554,-0.840206 0.910554,-2.280561 0.227644,-3.359226 -0.682918,-0.840207 -2.047219,-0.960237 -2.957759,-0.240059 -1.364304,1.198695 -2.502483,2.759079 -3.413031,4.437892 h -0.227637 c -3.185393,0.600149 -6.824543,1.200296 -9.7823,3.239199 -1.024364,0.720177 -1.252001,2.158931 -0.56909,3.239198 0.68291,1.078665 2.047211,1.438753 3.071575,0.720177 1.705756,-1.080266 3.640666,-1.800444 5.687878,-2.040504 -0.227638,0.600149 -0.341455,1.200297 -0.455273,1.920475 -0.227637,2.63905 0.227635,5.398129 1.252,7.797121 -1.593455,-0.24006 -3.071576,-0.36009 -4.665032,-0.36009 -1.364301,0 -2.730119,0.12003 -4.095939,0.36009 -2.502483,-3.239201 -6.029332,-5.638189 -9.896116,-6.598426 -5.120306,-2.759078 -9.897637,-6.238337 -9.897637,-12.114984 0,-1.320326 -1.024364,-2.400592 -2.274847,-2.400592 -1.252,0 -2.276365,1.080266 -2.276365,2.400592 0.113817,4.557923 2.048729,8.755757 5.34794,11.634864 -2.73012,0.36009 -5.234123,1.560387 -7.053696,3.719317 -0.796729,1.080266 -0.569091,2.51902 0.341455,3.359229 0.910546,0.840206 2.388666,0.720177 3.185393,-0.24006 0.910546,-1.200296 3.526848,-2.278961 7.279815,-2.158932 3.754485,0 7.508971,1.438753 10.35291,4.077805 -3.299213,1.440355 -6.029333,4.079405 -7.735087,7.437032 -0.682912,1.200295 -0.227639,2.640649 0.795208,3.239196 1.138181,0.720179 2.502484,0.240061 3.071575,-0.838606 3.41303,-6.478395 10.580544,-8.277238 21.842486,-5.518159 -2.047217,1.798843 -3.526853,4.677952 -3.413035,9.235875 0,1.320325 1.138184,2.398992 2.390178,2.27896 1.250487,0 2.274849,-1.198694 2.161034,-2.519019 -0.227637,-5.39813 2.616307,-6.476794 7.165997,-7.91715 0.68291,-0.240059 1.365827,-0.360088 2.048737,-0.600148 1.250481,2.99914 3.754484,5.2797 6.826039,6.118308 1.250494,0.360088 2.502504,-0.480119 2.843956,-1.798844 0.341451,-1.320324 -0.455288,-2.63905 -1.707274,-2.999139 -1.591946,-0.480118 -2.843949,-1.558784 -3.640674,-3.119168 0,-0.12003 0,-0.12003 0,-0.240058 3.526854,-1.798844 6.598426,-4.437893 8.19188,-8.877388 0.341451,-0.958636 0.569091,-1.918872 0.682903,-2.879109 0.453755,0.360088 0.795222,0.840207 1.022862,1.440356 0.796723,1.798842 1.365814,3.599285 1.593454,5.638188 0.113819,0.840207 0.682903,1.558783 1.478117,1.918873 0.796723,0.360089 1.707274,0.120029 2.274841,-0.480119 0.682911,-0.598547 0.910551,-1.438754 0.682911,-2.398991 -0.341459,-2.398992 -1.022846,-4.797983 -2.161029,-6.956913 -1.138182,-2.038903 -2.843932,-3.719315 -4.891156,-4.918011 -0.227632,-2.999139 -1.138175,-5.998278 -2.503997,-8.637328 1.479634,-1.800444 3.071579,-3.359228 5.006493,-4.559523 0.681387,-0.478519 1.136658,-1.318725 1.136658,-2.158932 0,-0.840207 -0.455271,-1.678814 -1.250478,-2.038904 -0.796723,-0.360088 -1.593454,-0.360088 -2.274849,0.120033 -1.934913,1.318723 -3.75449,2.999137 -5.347936,4.79798 -1.136682,-0.960237 -2.388669,-1.918872 -3.526853,-2.75908 -1.93339,-1.318724 -3.639142,-2.759078 -5.118778,-4.557922 -1.819582,-2.278961 -1.70576,-6.718456 -1.70576,-10.5562007 0,-0.6001479 0,-1.0802666 0,-1.6804121 V -3.8999792 h 9.100897 c 0,15.5942412 7.052185,16.4344492 7.96272,16.6745072 2.957768,0.840207 10.808193,5.158071 12.51395,14.035457 0.227624,0.480119 0.113812,1.080268 0.113812,1.558785 -0.113812,0 -0.113812,0 0,0 z"
+       style="fill:#9fc5e8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.3497"
+       id="path872"
+       clip-path="none" /><path
+       d="m 93.54506,-75.140297 c 3.481387,5.317909 3.241177,12.532297 -0.600513,17.595203 0.480417,1.519888 0.72061,3.038082 0.72061,4.557968 0,7.214389 -4.922593,13.290551 -11.523456,14.68378 -2.041752,6.20282 -7.44317,10.252469 -13.685314,10.252469 -1.080924,0 -2.281953,-0.126656 -3.361273,-0.379971 -2.522165,3.164739 -6.242147,5.064596 -10.083839,5.442879 -3.961786,0.253313 -7.80348,-1.138225 -10.684347,-3.922994 -3.721585,2.658113 -8.402394,3.418055 -12.604389,2.024826 -4.322102,-1.39154 -7.68338,-4.809592 -9.243116,-9.367559 -0.240203,0 -0.600513,0 -0.840718,0 -7.921983,0 -14.2842257,-6.581103 -14.4043303,-14.937093 0,-0.251626 0,-0.50494 0,-0.758256 -4.8025196,-2.784767 -7.56328092,-8.227645 -7.20296682,-14.050493 0.4804081,-7.97602 7.20296682,-13.925527 14.88474112,-13.925527 h 18.60633 c 7.923584,0 14.405934,-6.707759 14.526037,-15.062062 v -16.203663 h 9.483322 v 11.392383 c 0,0.506626 0,1.139912 0,1.646541 0,4.682935 -0.120114,10.632441 3.000967,14.430466 1.92164,2.151482 4.081898,4.049649 6.362246,5.696192 1.801549,1.138224 3.361291,2.531452 4.682397,4.176307 0.60053,1.013256 1.199444,2.026513 1.55975,3.038081 -2.520561,1.013257 -5.161217,1.393228 -7.801878,1.013257 -1.321129,-0.126657 -2.522165,0.759942 -2.762371,2.151484 -0.118504,1.393226 0.720618,2.658108 2.041754,2.911424 3.241173,0.506627 6.482336,0.126655 9.603419,-1.138226 0,0.378282 0,0.631596 0.120095,1.011566 0.120097,2.024825 -0.120095,4.05134 -0.72061,5.949508 -1.679854,4.557967 -5.881831,6.582791 -9.843622,8.227645 -0.720624,0.253315 -1.439639,0.506629 -2.400463,0.759942 l -0.720618,0.253314 h -0.120099 c -0.960824,-0.126655 -1.799937,-0.37997 -2.760761,-0.759941 l -1.080938,-0.253315 -1.19942,-0.253314 c -2.041739,-2.531454 -3.12107,-5.822849 -2.880867,-9.239214 0.240213,-3.418052 1.799937,-6.456134 4.200394,-8.607618 0.960831,-0.886598 0.960831,-2.406484 0.240214,-3.544708 -0.720626,-0.8866 -2.160259,-1.013257 -3.121075,-0.253314 -1.439635,1.264881 -2.640659,2.911424 -3.601484,4.682934 h -0.240206 c -3.361278,0.633287 -7.201367,1.266572 -10.322439,3.418054 -1.080924,0.759943 -1.32113,2.278139 -0.600512,3.418053 0.720617,1.138224 2.160249,1.518195 3.241175,0.759943 1.79994,-1.139915 3.841688,-1.899857 6.001938,-2.153172 -0.240207,0.633286 -0.360308,1.266571 -0.480411,2.026515 -0.240206,2.784767 0.240204,5.696191 1.321131,8.227646 -1.681439,-0.253315 -3.241176,-0.379973 -4.922616,-0.379973 -1.439633,0 -2.880865,0.126658 -4.322101,0.379973 -2.640659,-3.418057 -6.362246,-5.949507 -10.442537,-6.962764 -5.403028,-2.911423 -10.444144,-6.582792 -10.444144,-12.783924 0,-1.393228 -1.080926,-2.533142 -2.400455,-2.533142 -1.32113,0 -2.402056,1.139914 -2.402056,2.533142 0.120101,4.809594 2.161851,9.239214 5.64323,12.277293 -2.880865,0.379974 -5.523129,1.646546 -7.443171,3.924683 -0.840722,1.139914 -0.600514,2.65811 0.360308,3.544712 0.960823,0.886598 2.520559,0.759942 3.361278,-0.253315 0.960823,-1.266572 3.721585,-2.404796 7.681776,-2.27814 3.961793,0 7.923586,1.518195 10.924554,4.302965 -3.481381,1.519886 -6.362247,4.304652 -8.162185,7.847674 -0.72062,1.266571 -0.240209,2.786455 0.839115,3.418051 1.201027,0.759944 2.640661,0.253316 3.241175,-0.88491 3.601483,-6.836106 11.164758,-8.734273 23.048538,-5.82285 -2.160256,1.898169 -3.721591,4.93625 -3.601489,9.745843 0,1.393227 1.20103,2.531454 2.522154,2.404794 1.319533,0 2.400456,-1.264881 2.280357,-2.658108 -0.240206,-5.696193 2.760769,-6.834417 7.561674,-8.354302 0.720618,-0.253314 1.441242,-0.379971 2.16186,-0.633287 1.319527,3.16474 3.961791,5.571224 7.202944,6.456136 1.319541,0.37997 2.640682,-0.506629 3.000988,-1.898168 0.360304,-1.393228 -0.480427,-2.784768 -1.801543,-3.164739 -1.679846,-0.506628 -3.00098,-1.644855 -3.841697,-3.291396 0,-0.126658 0,-0.126658 0,-0.253313 3.721593,-1.898169 6.962764,-4.682935 8.644202,-9.367561 0.360305,-1.011568 0.600513,-2.024824 0.72061,-3.038082 0.478809,0.379971 0.839131,0.886601 1.07934,1.519887 0.840715,1.898166 1.441229,3.798023 1.681438,5.949506 0.120104,0.886599 0.72061,1.644852 1.559733,2.024825 0.840714,0.379971 1.801543,0.126656 2.400448,-0.506629 0.720619,-0.631597 0.960828,-1.518196 0.720619,-2.531454 -0.360313,-2.531455 -1.079324,-5.062907 -2.280353,-7.341045 -1.201027,-2.151482 -3.000962,-3.92468 -5.161225,-5.189563 -0.240201,-3.164739 -1.20102,-6.329478 -2.642257,-9.114245 1.561333,-1.899857 3.241179,-3.544711 5.282931,-4.811282 0.71901,-0.50494 1.199419,-1.391539 1.199419,-2.278138 0,-0.886601 -0.480409,-1.771512 -1.319524,-2.151484 -0.840715,-0.379971 -1.681438,-0.379971 -2.400457,0.12666 -2.041751,1.391537 -3.961797,3.164737 -5.643227,5.062904 -1.199445,-1.013257 -2.520561,-2.024823 -3.721591,-2.911424 -2.040144,-1.391539 -3.84008,-2.911423 -5.401416,-4.809592 -1.920051,-2.404795 -1.799945,-7.089421 -1.799945,-11.139071 0,-0.633285 0,-1.139914 0,-1.773197 v -11.392383 h 9.603411 c 0,16.455288 7.441578,17.341888 8.402389,17.595202 3.121083,0.886599 11.404977,5.442878 13.204918,14.810436 0.240193,0.50663 0.120096,1.139916 0.120096,1.644855 -0.120096,0 -0.120096,0 0,0 z"
+       style="fill:#073763;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.34969"
+       id="path872-9"
+       clip-path="none" /><path
+       d="m 127.94268,15.676127 c 4.22041,6.446784 3.92921,15.192627 -0.72799,21.330276 0.5824,1.842525 0.87358,3.683 0.87358,5.525523 0,8.745844 -5.96755,16.111841 -13.96963,17.800821 -2.47517,7.519542 -9.02319,12.428842 -16.590404,12.428842 -1.310379,0 -2.76636,-0.153543 -4.074796,-0.460631 -3.057565,3.836543 -7.567217,6.139698 -12.224415,6.598282 -4.802785,0.307086 -9.459985,-1.379846 -12.952397,-4.755759 -4.511595,3.22237 -10.186036,4.143632 -15.280022,2.454652 -5.239588,-1.686933 -9.314391,-5.830562 -11.205225,-11.356085 -0.291193,0 -0.727988,0 -1.019184,0 -9.603645,0 -17.316455,-7.978125 -17.462052,-18.107907 0,-0.305041 0,-0.612128 0,-0.919217 -5.82198,-3.375911 -9.168792,-9.974192 -8.731999,-17.033101 0.582392,-9.669153 8.731999,-16.881607 18.044447,-16.881607 h 22.55604 c 9.605586,0 17.463995,-8.1316702 17.609593,-18.2594053 V -25.602534 h 11.496421 v 13.810737 c 0,0.614172 0,1.38189 0,1.996065 0,5.6770185 -0.145611,12.8894734 3.638007,17.4937339 2.329561,2.6081941 4.948394,4.9093011 7.712811,6.9053671 2.183976,1.379844 4.074818,3.068824 5.676365,5.062844 0.72801,1.228348 1.45406,2.456698 1.89085,3.682999 -3.05562,1.228349 -6.256828,1.688979 -9.458043,1.228349 -1.601576,-0.153543 -3.057566,0.921262 -3.348762,2.608195 -0.14366,1.688979 0.873589,3.222367 2.475173,3.529456 3.929202,0.614173 7.858392,0.153542 11.642012,-1.379846 0,0.458583 0,0.76567 0.14559,1.2263 0.14559,2.45465 -0.14559,4.91135 -0.87358,7.212456 -2.03645,5.525523 -7.130414,7.980172 -11.933205,9.974191 -0.873597,0.307089 -1.745243,0.614176 -2.910029,0.921262 l -0.873588,0.307087 h -0.145594 c -1.164785,-0.153541 -2.182025,-0.460629 -3.34681,-0.92126 l -1.310397,-0.307089 -1.45403,-0.307086 c -2.475155,-3.068825 -3.783604,-7.05891 -3.492412,-11.200495 0.291205,-4.143629 2.182025,-7.826628 5.092045,-10.434823 1.164794,-1.074804 1.164794,-2.917328 0.291205,-4.297172 -0.873598,-1.074806 -2.618833,-1.228349 -3.783609,-0.307087 -1.745237,1.533388 -3.201213,3.529455 -4.366,5.677017 H 75.26145 c -4.074802,0.76772 -8.730056,1.535437 -12.513663,4.143631 -1.310382,0.921262 -1.601578,2.761737 -0.727989,4.14363 0.873589,1.379845 2.618823,1.840475 3.929205,0.921261 2.182028,-1.381892 4.657194,-2.303154 7.276017,-2.610242 -0.291197,0.767719 -0.436794,1.535437 -0.582392,2.4567 -0.291196,3.375911 0.291195,6.905366 1.601577,9.974192 -2.038371,-0.307088 -3.929205,-0.460632 -5.967577,-0.460632 -1.745234,0 -3.492409,0.153544 -5.239586,0.460632 C 59.835828,41.764206 55.324231,38.695384 50.377783,37.467035 43.827812,33.937581 37.71658,29.486862 37.71658,21.969368 c 0,-1.68898 -1.310382,-3.070873 -2.910019,-3.070873 -1.601577,0 -2.911959,1.381893 -2.911959,3.070873 0.145596,5.830562 2.620764,11.200494 6.841163,14.883491 -3.492409,0.460632 -6.695567,1.996069 -9.023192,4.757805 -1.019187,1.381892 -0.727989,3.222368 0.436795,4.297175 1.164784,1.074804 3.055616,0.921261 4.074802,-0.307088 1.164783,-1.535436 4.511595,-2.915281 9.312447,-2.761738 4.802793,0 9.605586,1.840475 13.243595,5.216389 -4.220401,1.842523 -7.712811,5.218435 -9.894838,9.513562 -0.87359,1.535434 -0.291198,3.377957 1.017242,4.143627 1.455979,0.921263 3.201215,0.307089 3.929205,-1.072757 4.365998,-8.287259 13.534789,-10.588366 27.941231,-7.058911 -2.61883,2.301106 -4.511602,5.984106 -4.366004,11.814668 0,1.68898 1.455981,3.068826 3.057551,2.91528 1.599641,0 2.91002,-1.533387 2.764426,-3.222367 -0.291196,-6.905368 3.346819,-8.285211 9.16685,-10.127735 0.873589,-0.307088 1.747186,-0.46063 2.620775,-0.767719 1.599633,3.836544 4.802791,6.753871 8.73197,7.82663 1.59965,0.460631 3.20124,-0.614175 3.63803,-2.301108 0.43679,-1.688978 -0.58241,-3.375911 -2.18397,-3.836543 -2.03644,-0.614173 -3.638021,-1.994019 -4.657204,-3.990085 0,-0.153545 0,-0.153545 0,-0.307086 4.511604,-2.301108 8.440804,-5.677019 10.479174,-11.356087 0.43679,-1.226301 0.72799,-2.454649 0.87358,-3.682998 0.58045,0.46063 1.01726,1.074805 1.30846,1.842524 1.01918,2.301106 1.74717,4.604259 2.03837,7.212454 0.1456,1.074805 0.87358,1.994019 1.89083,2.454651 1.01918,0.460631 2.18397,0.153543 2.91001,-0.614175 0.87359,-0.765671 1.16479,-1.840476 0.87359,-3.068825 -0.4368,-3.068826 -1.30844,-6.137651 -2.76442,-8.899386 -1.45598,-2.608195 -3.638,-4.757804 -6.25684,-6.291193 -0.29119,-3.836543 -1.45597,-7.673086 -3.20315,-11.048998 1.89277,-2.303155 3.92921,-4.297174 6.40438,-5.832609 0.87164,-0.612129 1.45403,-1.686933 1.45403,-2.7617381 0,-1.074806 -0.58239,-2.147564 -1.59963,-2.608197 -1.01918,-0.460629 -2.03837,-0.460629 -2.91002,0.153548 -2.47517,1.686931 -4.8028,3.8365411 -6.84116,6.1376481 -1.45406,-1.22835 -3.05562,-2.45465 -4.511602,-3.5294561 -2.473221,-1.686932 -4.655245,-3.5294544 -6.548017,-5.8305614 -2.327636,-2.9152814 -2.182033,-8.594348 -2.182033,-13.5036484 0,-0.7677181 0,-1.3818931 0,-2.1496081 v -13.810737 h 11.642002 c 0,19.9483841 9.02126,21.0231899 10.18603,21.3302761 3.78362,1.0748058 13.826,6.5982812 16.00803,17.9543649 0.29118,0.614175 0.14559,1.381894 0.14559,1.99402 -0.14559,0 -0.14559,0 0,0 z"
+       style="fill:#073763;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.22594"
+       id="path872-1"
+       clip-path="url(#clipPath32362)"
+       transform="matrix(1.100951,0,0,1.100951,-8.0715185,-1.9433978)" /></g></svg>
diff --git a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
index 1559cd1cd6e29dc17397c48f20848759620a39d9..14343e6b918853b7b5e36ca4cb07789d8ece238f 100644
--- a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
+++ b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
@@ -20,6 +20,7 @@ namespace armarx::armem::client
 
 
     MemoryNameSystem::MemoryNameSystem(mns::MemoryNameSystemInterfacePrx mns, ManagedIceObject* component) :
+        util::MemoryListener(component),
         mns(mns), component(component)
     {
     }
@@ -28,7 +29,7 @@ namespace armarx::armem::client
     void MemoryNameSystem::initialize(mns::MemoryNameSystemInterfacePrx mns, ManagedIceObject* component)
     {
         this->mns = mns;
-        this->component = component;
+        setComponent(component);
     }
 
 
@@ -407,8 +408,10 @@ namespace armarx::armem::client
         this->mns = mns;
     }
 
+
     void MemoryNameSystem::setComponent(ManagedIceObject* component)
     {
+        util::MemoryListener::setComponent(component);
         this->component = component;
     }
 
diff --git a/source/RobotAPI/libraries/armem/client/Query.cpp b/source/RobotAPI/libraries/armem/client/Query.cpp
index 09f8638b2c7be53b50c9a2dcbefe82de87a536a0..aeb21e97f5420e3394f17f0ff4ec8ceb7a02ae2c 100644
--- a/source/RobotAPI/libraries/armem/client/Query.cpp
+++ b/source/RobotAPI/libraries/armem/client/Query.cpp
@@ -1,9 +1,9 @@
 #include "Query.h"
 
 #include <ArmarXCore/core/ice_conversions.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 
 #include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
 
 
 namespace armarx::armem::client
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp
index 463c6443e11ddd0ec92d6c5bb4b1001e4e97dfed..96126b71241148187068990a18e61776cef5ba4a 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp
@@ -14,8 +14,9 @@ namespace armarx::armem::client::plugins
 
     void ListeningPlugin::postCreatePropertyDefinitions(armarx::PropertyDefinitionsPtr& properties)
     {
+        // This is now done by the client::util::MemoryListener class on subscription of a memory ID.
         // Subscribe topics by single servers, use this as a prefix.
-        properties->topic<MemoryListenerInterface>("MemoryUpdates");
+        // properties->topic<MemoryListenerInterface>("MemoryUpdates");
     }
 
 }
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
index 3a40a9ffe27b1116fe5a78f5d1a3088652818b38..95eed974f77513f9186aed0d8b2633394b73f3be 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
@@ -26,4 +26,3 @@ namespace armarx::armem::client::plugins
     }
 
 }
-
diff --git a/source/RobotAPI/libraries/armem/client/query/selectors.cpp b/source/RobotAPI/libraries/armem/client/query/selectors.cpp
index 5703aee11f5a18242635adeb5294726cf609160e..aeae579c070d8c54692997956589b423956df643 100644
--- a/source/RobotAPI/libraries/armem/client/query/selectors.cpp
+++ b/source/RobotAPI/libraries/armem/client/query/selectors.cpp
@@ -2,9 +2,9 @@
 
 #include <ArmarXCore/core/ice_conversions.h>
 #include <ArmarXCore/core/time/ice_conversions.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 
 #include <RobotAPI/libraries/armem/core/ice_conversions.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
 #include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
 
diff --git a/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp b/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp
index bc180c726f4d573fe69a3a77bfba2b0be12fe2c8..c8a7c6c683467194d6e2248edc0e5be57d3b547b 100644
--- a/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp
+++ b/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp
@@ -4,24 +4,39 @@
 
 #include <ArmarXCore/core/exceptions/LocalException.h>
 #include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
+#include <ArmarXCore/core/ManagedIceObject.h>
+
 #include <RobotAPI/libraries/armem/core/ice_conversions.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
 #include <RobotAPI/libraries/armem/core/error.h>
 
 
 namespace armarx::armem::client::util
 {
 
-    MemoryListener::MemoryListener()
+    std::string MemoryListener::MakeMemoryTopicName(const MemoryID& memoryID)
+    {
+        return "MemoryUpdates." + memoryID.memoryName;
+    }
+
+
+    MemoryListener::MemoryListener(ManagedIceObject* component) :
+        component(component)
     {
     }
 
 
+    void MemoryListener::setComponent(ManagedIceObject* component)
+    {
+        this->component = component;
+    }
+
+
     void
     MemoryListener::updated(const std::vector<data::MemoryID>& updatedSnapshotIDs) const
     {
         std::vector<MemoryID> bos;
-        fromIce(updatedSnapshotIDs, bos);
+        armarx::fromIce(updatedSnapshotIDs, bos);
         updated(bos);
     }
 
@@ -108,6 +123,10 @@ namespace armarx::armem::client::util
     MemoryListener::subscribe(const MemoryID& id, Callback callback)
     {
         callbacks[id].push_back(callback);
+        if (component)
+        {
+            component->usingTopic(MakeMemoryTopicName(id));
+        }
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/client/util/MemoryListener.h b/source/RobotAPI/libraries/armem/client/util/MemoryListener.h
index 2d530097ce6394ddcf4cc815f8e44f93e057d916..ceb765e60db13404fbe170900342cff554b3affe 100644
--- a/source/RobotAPI/libraries/armem/client/util/MemoryListener.h
+++ b/source/RobotAPI/libraries/armem/client/util/MemoryListener.h
@@ -11,6 +11,12 @@
 #include <RobotAPI/libraries/armem/core/MemoryID.h>
 
 
+
+namespace armarx
+{
+    class ManagedIceObject;
+}
+
 namespace armarx::armem::client::util
 {
 
@@ -20,6 +26,7 @@ namespace armarx::armem::client::util
      */
     class MemoryListener
     {
+    public:
 
         using Callback = std::function<void(const MemoryID& subscriptionID, const std::vector<MemoryID>& updatedSnapshotIDs)>;
         using CallbackUpdatedOnly = std::function<void(const std::vector<MemoryID>& updatedSnapshotIDs)>;
@@ -29,11 +36,14 @@ namespace armarx::armem::client::util
         template <class CalleeT>
         using MemberCallbackUpdatedOnly = void(CalleeT::*)(const std::vector<MemoryID>& updatedSnapshotIDs);
 
+        static std::string MakeMemoryTopicName(const MemoryID& memoryID);
+
 
     public:
 
-        MemoryListener();
+        MemoryListener(ManagedIceObject* component = nullptr);
 
+        void setComponent(ManagedIceObject* component);
 
         void subscribe(const MemoryID& subscriptionID, Callback Callback);
         void subscribe(const MemoryID& subscriptionID, CallbackUpdatedOnly Callback);
@@ -73,6 +83,10 @@ namespace armarx::armem::client::util
 
         std::unordered_map<MemoryID, std::vector<Callback>> callbacks;
 
+    private:
+
+        armarx::ManagedIceObject* component;
+
     };
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h b/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
index 56526eb1c589aeaff0924dac1b6117a8942874ef..d7dfcfea91201e5aa817664ca7db3ac5c866d41a 100644
--- a/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
@@ -209,22 +209,34 @@ namespace armarx::armem::base
         // forEachInstance() is provided by ForEachEntityInstanceMixin.
 
 
-        // Get child keys
-        std::vector<std::string> getProviderSegmentNames() const
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func)
         {
-            return simox::alg::get_keys(this->_container);
+            return detail::forEachInstanceIn(
+                        id, func, *this,
+                        id.hasProviderSegmentName(),
+                        id.hasProviderSegmentName() ? this->findProviderSegment(id.providerSegmentName) : nullptr);
         }
-
-
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline const auto& providerSegments() const
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func) const
         {
-            return this->_container;
+            return detail::forEachInstanceIn(
+                        id, func, *this,
+                        id.hasProviderSegmentName(),
+                        id.hasProviderSegmentName() ? this->findProviderSegment(id.providerSegmentName) : nullptr);
         }
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline auto& providerSegments()
+
+
+        // Get child keys
+        std::vector<std::string> getProviderSegmentNames() const
         {
-            return this->_container;
+            return simox::alg::get_keys(this->_container);
         }
 
 
diff --git a/source/RobotAPI/libraries/armem/core/base/EntityBase.h b/source/RobotAPI/libraries/armem/core/base/EntityBase.h
index 7395f1447d568aebfa7b1bcbf10325c0ab6728ec..9c9a8c88a535eb919029c16305f2af72e999423d 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityBase.h
@@ -386,6 +386,29 @@ namespace armarx::armem::base
         {
             return this->forEachChild(func);
         }
+        /**
+         * @param func Function like: bool process(EntitySnapshotT& snapshot)
+         */
+        template <class SnapshotFunctionT>
+        bool forEachSnapshotIn(const MemoryID& id, SnapshotFunctionT&& func)
+        {
+            return this->forEachChild(func);
+        }
+        /**
+         * @param func Function like void process(const EntitySnapshotT& snapshot)
+         */
+        template <class SnapshotFunctionT>
+        bool forEachSnapshotIn(const MemoryID& id, SnapshotFunctionT&& func) const
+        {
+            if (id.hasTimestamp())
+            {
+                if (const auto* child = findSnapshot(id.timestamp))
+                {
+                    child->forEachChild(func);
+                }
+            }
+            return this->forEachChild(func);
+        }
         // forEachInstance() is provided by ForEachEntityInstanceMixin.
 
 
@@ -483,23 +506,35 @@ namespace armarx::armem::base
         }
 
 
-        // Get child keys
-        /// @brief Get all timestamps in the history.
-        std::vector<Time> getTimestamps() const
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func)
         {
-            return simox::alg::get_keys(this->_container);
+            return detail::forEachInstanceIn(
+                        id, func, *this,
+                        id.hasTimestamp(),
+                        id.hasTimestamp() ? this->findSnapshot(id.timestamp) : nullptr);
         }
-
-
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline const ContainerT& history() const
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func) const
         {
-            return this->_container;
+            return detail::forEachInstanceIn(
+                        id, func, *this,
+                        id.hasTimestamp(),
+                        id.hasTimestamp() ? this->findSnapshot(id.timestamp) : nullptr);
         }
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline ContainerT& history()
+
+
+        // Get child keys
+        /// @brief Get all timestamps in the history.
+        std::vector<Time> getTimestamps() const
         {
-            return const_cast<ContainerT&>(const_cast<const EntityBase*>(this)->history());
+            return simox::alg::get_keys(this->_container);
         }
 
 
diff --git a/source/RobotAPI/libraries/armem/core/base/EntitySnapshotBase.h b/source/RobotAPI/libraries/armem/core/base/EntitySnapshotBase.h
index 0d0f091f59847cabd2b9d5f0982d634daaa2723a..c983dd8dec8a9a351b0a4cd1efc9d00320f59a1c 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntitySnapshotBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntitySnapshotBase.h
@@ -172,6 +172,39 @@ namespace armarx::armem::base
             return this->forEachChild(func);
         }
 
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func)
+        {
+            if (id.hasInstanceIndex())
+            {
+                EntityInstanceT* child = findInstance(id.instanceIndex);
+                return child ? base::detail::call(func, *child) : true;
+            }
+            else
+            {
+                return this->forEachInstance(func);
+            }
+        }
+        /**
+         * @param func Function like void process (const EntityInstanceT& instance)
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func) const
+        {
+            if (id.hasInstanceIndex())
+            {
+                const EntityInstanceT* child = findInstance(id.instanceIndex);
+                return child ? base::detail::call(func, *child) : true;
+            }
+            else
+            {
+                return this->forEachInstance(func);
+            }
+        }
+
 
         // Get child keys
         std::vector<int> getInstanceIndices() const
@@ -186,18 +219,6 @@ namespace armarx::armem::base
         }
 
 
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline const std::vector<EntityInstanceT>& instances() const
-        {
-            return this->_container;
-        }
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline std::vector<EntityInstanceT>& instances()
-        {
-            return const_cast<std::vector<EntityInstanceT>&>(const_cast<const EntitySnapshotBase*>(this)->instances());
-        }
-
-
         // MODIFICATION
 
         void update(const EntityUpdate& update)
diff --git a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
index 991cc609edeb0135bd8fdce43cf19fd797fb0204..dd8d93c1c4698c88a0388f03dca11f8ce8d2696b 100644
--- a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
@@ -186,21 +186,33 @@ namespace armarx::armem::base
         // forEachInstance() is provided by ForEachEntityInstanceMixin.
 
 
-        std::vector<std::string> getCoreSegmentNames() const
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func)
         {
-            return simox::alg::get_keys(this->_container);
+            return detail::forEachInstanceIn(
+                        id, func, *this,
+                        id.hasCoreSegmentName(),
+                        id.hasCoreSegmentName() ? this->findCoreSegment(id.coreSegmentName) : nullptr);
         }
-
-
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline auto& coreSegments() const
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func) const
         {
-            return this->_container;
+            return detail::forEachInstanceIn(
+                        id, func, *this,
+                        id.hasCoreSegmentName(),
+                        id.hasCoreSegmentName() ? this->findCoreSegment(id.coreSegmentName) : nullptr);
         }
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline auto& coreSegments()
+
+
+        std::vector<std::string> getCoreSegmentNames() const
         {
-            return this->_container;
+            return simox::alg::get_keys(this->_container);
         }
 
 
diff --git a/source/RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h b/source/RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h
index ffa8bbda11cf691bce42c2966c0b8d6b790e25c4..88485aafd348ade0751ce9fa8fdd6ce8d313660c 100644
--- a/source/RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h
@@ -191,23 +191,34 @@ namespace armarx::armem::base
         // forEachSnapshot() is provided by ForEachEntitySnapshotMixin
         // forEachInstance() is provided by ForEachEntityInstanceMixin
 
-
-        // Get child keys
-        std::vector<std::string> getEntityNames() const
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func)
         {
-            return simox::alg::get_keys(this->_container);
+            return detail::forEachInstanceIn(
+                        id, func, *this,
+                        id.hasEntityName(),
+                        id.hasEntityName() ? this->findEntity(id.entityName) : nullptr);
         }
-
-
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline const ContainerT& entities() const
+        /**
+         * @param func Function like void process(EntityInstanceT& instance)>
+         */
+        template <class InstanceFunctionT>
+        bool forEachInstanceIn(const MemoryID& id, InstanceFunctionT&& func) const
         {
-            return this->_container;
+            return detail::forEachInstanceIn(
+                        id, func, *this,
+                        id.hasEntityName(),
+                        id.hasEntityName() ? this->findEntity(id.entityName) : nullptr);
         }
-        [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
-        inline ContainerT& entities()
+
+
+        // Get child keys
+        std::vector<std::string> getEntityNames() const
         {
-            return this->_container;
+            return simox::alg::get_keys(this->_container);
         }
 
 
diff --git a/source/RobotAPI/libraries/armem/core/base/detail/iteration_mixins.h b/source/RobotAPI/libraries/armem/core/base/detail/iteration_mixins.h
index 876d0d6d73bed644d3b8316c5479f0c15b39b97f..b686b1cc7b304e780579808a6bd3b3f4d1b50ff9 100644
--- a/source/RobotAPI/libraries/armem/core/base/detail/iteration_mixins.h
+++ b/source/RobotAPI/libraries/armem/core/base/detail/iteration_mixins.h
@@ -3,6 +3,9 @@
 #include <functional>
 #include <type_traits>
 
+#include <RobotAPI/libraries/armem/core/MemoryID.h>
+
+
 namespace
 {
     template<typename F, typename Ret, typename A, typename... Rest>
@@ -103,6 +106,31 @@ namespace armarx::armem::base::detail
     }
 
 
+    template <class FunctionT, class ParentT, class ChildT>
+    bool forEachInstanceIn(
+            const MemoryID& id,
+            FunctionT&& func,
+            ParentT& parent,
+            bool single,
+            ChildT* child
+            )
+    {
+        auto childFn = [&id,&func](auto& child)
+        {
+            return child.forEachInstanceIn(id, func);
+        };
+        if (single)
+        {
+            return child ? childFn(*child) : true;
+        }
+        else
+        {
+            return parent.forEachChild(childFn);
+        }
+    }
+
+
+
     // We use auto instead of, e.g. DerivedT::EntitySnapshotT,
     // as we cannot use the typedef before DerivedT was completely defined.
 
diff --git a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
index a71881a57851833f91debb68c1f026f2b1fb7859..6ec40abd7ec808b8aca5aaf3cb4a93a5772e17b1 100644
--- a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
@@ -1,12 +1,12 @@
 #include "ice_conversions.h"
 
 #include <ArmarXCore/core/time/ice_conversions.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 
 #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
 #include <RobotAPI/libraries/aron/core/type/variant/container/Object.h>
 
 #include <RobotAPI/libraries/armem/core/ice_conversions.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
 
 
 namespace armarx::armem::base
@@ -71,11 +71,11 @@ namespace armarx::armem
 
     void base::toIce(data::EntityInstanceMetadataPtr& ice, const EntityInstanceMetadata& metadata)
     {
-        armem::toIce<data::EntityInstanceMetadata>(ice, metadata);
+        armarx::toIce<data::EntityInstanceMetadata>(ice, metadata);
     }
     void base::fromIce(const data::EntityInstanceMetadataPtr& ice, EntityInstanceMetadata& metadata)
     {
-        armem::fromIce<data::EntityInstanceMetadata>(ice, metadata);
+        armarx::fromIce<data::EntityInstanceMetadata>(ice, metadata);
     }
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/base/ice_conversions.h b/source/RobotAPI/libraries/armem/core/base/ice_conversions.h
index b58e820917bd8784f355793c308a8f5fe4d0efdb..e808e01ace5165eb3fb38109cc850138e20061df 100644
--- a/source/RobotAPI/libraries/armem/core/base/ice_conversions.h
+++ b/source/RobotAPI/libraries/armem/core/base/ice_conversions.h
@@ -7,14 +7,13 @@
 #include "CoreSegmentBase.h"
 #include "MemoryBase.h"
 
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
 #include <RobotAPI/libraries/armem/core/ice_conversions.h>
-
 #include <RobotAPI/libraries/aron/core/type/variant/forward_declarations.h>
 
 #include <RobotAPI/interface/armem/memory.h>
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 #include <ArmarXCore/core/time/ice_conversions.h>
 
 
@@ -64,7 +63,7 @@ namespace armarx::armem::base
         ice.instances.clear();
         snapshot.forEachInstance([&ice](const auto & instance)
         {
-            armem::toIce(ice.instances.emplace_back(), instance);
+            armarx::toIce(ice.instances.emplace_back(), instance);
         });
     }
     template <class ...Args>
@@ -75,7 +74,7 @@ namespace armarx::armem::base
         snapshot.clear();
         for (const data::EntityInstancePtr& iceInstance : ice.instances)
         {
-            snapshot.addInstance(armem::fromIce<typename EntitySnapshotBase<Args...>::EntityInstanceT>(iceInstance));
+            snapshot.addInstance(armarx::fromIce<typename EntitySnapshotBase<Args...>::EntityInstanceT>(iceInstance));
         }
     }
 
@@ -87,7 +86,7 @@ namespace armarx::armem::base
         ice.history.clear();
         entity.forEachSnapshot([&ice](const auto & snapshot)
         {
-            armem::toIce(ice.history[armem::toIce<dto::Time>(snapshot.time())], snapshot);
+            armarx::toIce(ice.history[armarx::toIce<dto::Time>(snapshot.time())], snapshot);
         });
     }
     template <class ...Args>
@@ -98,7 +97,7 @@ namespace armarx::armem::base
         entity.clear();
         for (const auto& [key, snapshot] : ice.history)
         {
-            entity.addSnapshot(armem::fromIce<typename EntityBase<Args...>::EntitySnapshotT>(snapshot));
+            entity.addSnapshot(armarx::fromIce<typename EntityBase<Args...>::EntitySnapshotT>(snapshot));
         }
     }
 
@@ -114,7 +113,7 @@ namespace armarx::armem::base
         ice.entities.clear();
         providerSegment.forEachEntity([&ice](const auto & entity)
         {
-            armem::toIce(ice.entities[entity.name()], entity);
+            armarx::toIce(ice.entities[entity.name()], entity);
         });
     }
     template <class ...Args>
@@ -129,7 +128,7 @@ namespace armarx::armem::base
         for (const auto& [key, entity] : ice.entities)
         {
             providerSegment.addEntity(
-                armem::fromIce<typename ProviderSegmentBase<Args...>::EntityT>(entity));
+                armarx::fromIce<typename ProviderSegmentBase<Args...>::EntityT>(entity));
         }
     }
 
@@ -144,7 +143,7 @@ namespace armarx::armem::base
         ice.providerSegments.clear();
         coreSegment.forEachProviderSegment([&ice](const auto & providerSegment)
         {
-            armem::toIce(ice.providerSegments[providerSegment.name()], providerSegment);
+            armarx::toIce(ice.providerSegments[providerSegment.name()], providerSegment);
         });
     }
     template <class ...Args>
@@ -160,7 +159,7 @@ namespace armarx::armem::base
         for (const auto& [key, providerSegment] : ice.providerSegments)
         {
             coreSegment.addProviderSegment(
-                armem::fromIce<typename CoreSegmentBase<Args...>::ProviderSegmentT>(providerSegment));
+                armarx::fromIce<typename CoreSegmentBase<Args...>::ProviderSegmentT>(providerSegment));
         }
     }
 
@@ -172,7 +171,7 @@ namespace armarx::armem::base
         ice.coreSegments.clear();
         memory.forEachCoreSegment([&ice](const auto & coreSegment)
         {
-            armem::toIce(ice.coreSegments[coreSegment.name()], coreSegment);
+            armarx::toIce(ice.coreSegments[coreSegment.name()], coreSegment);
         });
     }
     template <class ...Args>
@@ -184,7 +183,7 @@ namespace armarx::armem::base
         for (const auto& [key, coreSegment] : ice.coreSegments)
         {
             // We can avoid using CoreSegment's copy constructor this way:
-            armem::fromIce(coreSegment, memory.addCoreSegment(coreSegment->id.coreSegmentName));
+            armarx::fromIce(coreSegment, memory.addCoreSegment(coreSegment->id.coreSegmentName));
         }
     }
 
diff --git a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
index 1dd76ae471eab7f3041b7ea835891f53d6df3f3f..dfd25e3ba39ca2bc9a18be1b45684d004255297f 100644
--- a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
@@ -1,6 +1,7 @@
 #include "ice_conversions.h"
 
 #include <ArmarXCore/core/time/ice_conversions.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 
 #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
 
@@ -8,8 +9,6 @@
 #include <RobotAPI/interface/armem/commit.h>
 #include <RobotAPI/interface/armem/memory.h>
 
-#include "ice_conversions_templates.h"
-
 #include "actions.h"
 #include "Commit.h"
 #include "MemoryID.h"
@@ -137,7 +136,7 @@ namespace armarx
 
     void armem::fromIce(const data::EntityUpdate& ice, EntityUpdate& update, Time timeArrived)
     {
-        armem::fromIce(ice, update);
+        fromIce(ice, update);
         update.timeArrived = timeArrived;
     }
 
diff --git a/source/RobotAPI/libraries/armem/core/ice_conversions.h b/source/RobotAPI/libraries/armem/core/ice_conversions.h
index 2a4daf725a32bb9ca12a5865be8207b87076871a..b88157c688bcaeefd301b1764bf6a78d33badf71 100644
--- a/source/RobotAPI/libraries/armem/core/ice_conversions.h
+++ b/source/RobotAPI/libraries/armem/core/ice_conversions.h
@@ -28,7 +28,6 @@ namespace armarx::armem
     void fromIce(const data::Commit& ice, Commit& commit, Time timeArrived);
     void fromIce(const data::EntityUpdate& ice, EntityUpdate& update, Time timeArrived);
 
-
     void fromIce(const actions::data::MenuPtr& ice, actions::Menu& menu);
     void toIce(actions::data::MenuPtr& ice, const actions::Menu& menu);
 
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
index 930c1c15d2e3cbd9adf1882ab2e805a21a8027f8..12610c2ac042b237473f4fba8014f3c1b266d860 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
@@ -3,14 +3,14 @@
 #include "query_proc/wm/wm.h"
 #include "query_proc/ltm/disk/ltm.h"
 
-#include <RobotAPI/libraries/armem/server/wm/ice_conversions.h>
-
+#include <RobotAPI/libraries/aron/core/Exception.h>
 #include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/ice_conversions.h>
 #include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
-
-#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/armem/server/wm/ice_conversions.h>
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/time/ice_conversions.h>
 
@@ -123,7 +123,7 @@ namespace armarx::armem::server
         armem::Commit commit;
         try
         {
-            armem::fromIce(commitIce, commit, timeArrived);
+            ::armarx::armem::fromIce(commitIce, commit, timeArrived);
         }
         catch (const aron::error::AronNotValidException& e)
         {
@@ -138,7 +138,7 @@ namespace armarx::armem::server
 
         armem::CommitResult result = this->commit(commit);
         data::CommitResult resultIce;
-        armem::toIce(resultIce, result);
+        toIce(resultIce, result);
 
         return resultIce;
     }
@@ -229,7 +229,7 @@ namespace armarx::armem::server
                 if (publishUpdates)
                 {
                     data::MemoryID& id = updatedIDs.emplace_back();
-                    armem::toIce(id, result.snapshotID);
+                    toIce(id, result.snapshotID);
                 }
             }
             catch (const error::ArMemError& e)
@@ -310,7 +310,7 @@ namespace armarx::armem::server
             }
         }
 
-        result.memory = toIce<data::MemoryPtr>(wmResult);
+        result.memory = armarx::toIce<data::MemoryPtr>(wmResult);
 
         result.success = true;
         if (result.memory->coreSegments.size() == 0)
@@ -352,8 +352,7 @@ namespace armarx::armem::server
 
         if (queryResult.success)
         {
-            armem::wm::Memory m;
-            fromIce(queryResult.memory, m);
+            armem::wm::Memory m = armarx::fromIce<armem::wm::Memory>(queryResult.memory);
             longtermMemory->store(m);
         }
 
diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp
index 298983e478fbc03f5ec6187e9394da128e2a5171..40d22cead44dea33a993364415ea6cbe59d6413a 100644
--- a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp
+++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp
@@ -1,6 +1,7 @@
 #include "Plugin.h"
 
 #include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/client/util/MemoryListener.h>
 #include <RobotAPI/libraries/armem/client/plugins/Plugin.h>
 
 #include <ArmarXCore/core/Component.h>
@@ -37,9 +38,13 @@ namespace armarx::armem::server::plugins
             properties->optional(longtermMemory.enabled, prefix + "ltm.enabled");
         }
         longtermMemory.createPropertyDefinitions(properties, prefix + "ltm.");
+    }
+
 
-        // Publish memory updates topic
-        properties->topic(memoryTopic, memoryTopicDefaultName);
+    void Plugin::preOnInitComponent()
+    {
+        memoryTopicName = client::util::MemoryListener::MakeMemoryTopicName(MemoryID(workingMemory.name()));
+        parent().offeringTopic(memoryTopicName);
     }
 
 
@@ -52,6 +57,7 @@ namespace armarx::armem::server::plugins
         {
             registerServer(parent);
         }
+        parent.getTopic(memoryTopic, memoryTopicName);
         iceAdapter.setMemoryListener(memoryTopic);
     }
 
diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.h b/source/RobotAPI/libraries/armem/server/plugins/Plugin.h
index 8a5a68934003997a9588117ecc985f2fa9dfe456..dcbe7adc4c3b519a55da2b234f6f3b28338fd74f 100644
--- a/source/RobotAPI/libraries/armem/server/plugins/Plugin.h
+++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.h
@@ -33,6 +33,7 @@ namespace armarx::armem::server::plugins
 
         virtual void postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) override;
 
+        virtual void preOnInitComponent() override;
         virtual void postOnConnectComponent() override;
         virtual void preOnDisconnectComponent() override;
 
@@ -74,7 +75,9 @@ namespace armarx::armem::server::plugins
 
         // Working Memory Updates (publishing)
 
-        std::string memoryTopicDefaultName = "MemoryUpdates";
+        /// Available at onInit().
+        std::string memoryTopicName;
+        /// Available after onConnect().
         client::MemoryListenerInterfacePrx memoryTopic;
 
 
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h
index 73a77eddd0d7efab69dc16f37e544049e743fc43..432453afbf5de7e1c4d1b0cdd21d18bef1b56787 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h
@@ -3,11 +3,11 @@
 #include "BaseQueryProcessorBase.h"
 
 #include <ArmarXCore/core/time/ice_conversions.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/armem/core/error.h>
 #include <RobotAPI/libraries/armem/core/ice_conversions.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
 
 #include <RobotAPI/interface/armem/query.h>
 
@@ -108,7 +108,7 @@ namespace armarx::armem::server::query_proc::base
             }
             else
             {
-                const Time time = armem::fromIce<Time>(query.timestamp);
+                const Time time = armarx::fromIce<Time>(query.timestamp);
                 if (auto snapshot = entity.findSnapshot(time))
                 {
                     this->addResultSnapshot(result, *snapshot);
@@ -141,8 +141,8 @@ namespace armarx::armem::server::query_proc::base
                 || query.minTimestamp.timeSinceEpoch.microSeconds < 0
                 || query.maxTimestamp.timeSinceEpoch.microSeconds < 0)
             {
-                const Time min = fromIce<Time>(query.minTimestamp);
-                const Time max = fromIce<Time>(query.maxTimestamp);
+                const Time min = armarx::fromIce<Time>(query.minTimestamp);
+                const Time max = armarx::fromIce<Time>(query.maxTimestamp);
                 process(result, min, max, entity, query);
             }
         }
@@ -181,7 +181,7 @@ namespace armarx::armem::server::query_proc::base
                      const armem::query::data::entity::BeforeOrAtTime& query,
                      const EntityT& entity) const
         {
-            const Time referenceTimestamp = fromIce<Time>(query.timestamp);
+            const Time referenceTimestamp = armarx::fromIce<Time>(query.timestamp);
             base::detail::checkReferenceTimestampNonNegative(referenceTimestamp);
 
             if (auto beforeOrAt = entity.findLatestSnapshotBeforeOrAt(referenceTimestamp))
@@ -195,7 +195,7 @@ namespace armarx::armem::server::query_proc::base
                      const armem::query::data::entity::BeforeTime& query,
                      const EntityT& entity) const
         {
-            const Time referenceTimestamp = fromIce<Time>(query.timestamp);
+            const Time referenceTimestamp = armarx::fromIce<Time>(query.timestamp);
             base::detail::checkReferenceTimestampNonNegative(referenceTimestamp);
 
             std::vector<const EntitySnapshotT*> befores;
@@ -226,7 +226,7 @@ namespace armarx::armem::server::query_proc::base
                      const armem::query::data::entity::TimeApprox& query,
                      const EntityT& entity) const
         {
-            const Time referenceTimestamp = fromIce<Time>(query.timestamp);
+            const Time referenceTimestamp = armarx::fromIce<Time>(query.timestamp);
             base::detail::checkReferenceTimestampNonNegative(referenceTimestamp);
 
             // elements have to be in range [t_ref - eps, t_ref + eps] if eps is positive
diff --git a/source/RobotAPI/libraries/armem/test/ArMemForEachTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemForEachTest.cpp
index 8cb721c4b724e0c6f307a6ee6b796c01c974680a..f1b5b362318e577dda941c1dd8fff97dd3cf72d7 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemForEachTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemForEachTest.cpp
@@ -167,7 +167,6 @@ BOOST_AUTO_TEST_CASE(test_forEach)
     });
     BOOST_TEST_INFO(toVector(cids));
     BOOST_CHECK_EQUAL(cids.size(), 0);
-
 }
 
 
@@ -186,3 +185,240 @@ BOOST_AUTO_TEST_CASE(test_forEach_non_bool_func)
     });
     BOOST_CHECK_EQUAL(i, 2);
 }
+
+
+
+BOOST_AUTO_TEST_CASE(test_forEachInstanceIn)
+{
+    armem::wm::EntitySnapshot snapshot(armem::Time::Now());
+    snapshot.addInstance();
+    snapshot.addInstance();
+
+    int i = 0;
+    auto count = [&i](const auto&) -> void
+    {
+        ++i;
+    };
+
+    {
+        auto test = [&](auto&& snapshot)
+        {
+            armem::MemoryID id;
+
+            // Count any.
+            i = 0;
+            snapshot.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 2);
+
+            // Just index 0.
+            id.instanceIndex = 0;
+            i = 0;
+            snapshot.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 1);
+
+            // Just index 1.
+            id.instanceIndex = 1;
+            i = 0;
+            snapshot.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 1);
+
+            // Just index 2, but does not exist.
+            id.instanceIndex = 2;
+            i = 0;
+            snapshot.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 0);
+        };
+        test(snapshot);
+        test(const_cast<const armem::wm::EntitySnapshot&>(snapshot));
+    }
+
+
+    armem::wm::Entity entity("entity");
+    entity.addSnapshot(snapshot);
+    entity.addSnapshot(snapshot.time() + armem::Duration::Seconds(1)).addInstance();
+
+    {
+        auto test = [&](auto&& entity)
+        {
+            armem::MemoryID id;
+
+            // Count any.
+            i = 0;
+            entity.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 3);
+
+            // Count only one snapshot (with 2 instances).
+            id.timestamp = snapshot.time();
+            i = 0;
+            entity.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 2);
+
+            // Count only one snapshot and only one instance.
+            id.instanceIndex = 1;
+            i = 0;
+            entity.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 1);
+
+            // Count non-existing snapshot.
+            id = {};
+            id.timestamp = snapshot.time() - armem::Duration::Seconds(1);
+            i = 0;
+            entity.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 0);
+        };
+        test(entity);
+        test(const_cast<const armem::wm::Entity&>(entity));
+    }
+
+
+    armem::wm::ProviderSegment provSeg("provider");
+    provSeg.addEntity(entity);
+    provSeg.addEntity(entity.name() + " 2")
+            .addSnapshot(armem::Time::Now())
+            .addInstance();
+
+    {
+        auto test = [&](auto&& provSeg)
+        {
+            armem::MemoryID id;
+
+            // Count all (2+1) + 1 instances.
+            i = 0;
+            provSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 4);
+
+            // Count only one entity (with 2+1 instances).
+            id.entityName = entity.name();
+            i = 0;
+            provSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 3);
+
+            // Count only one entity and one snapshot with 2 instances.
+            id.timestamp = snapshot.time();
+            i = 0;
+            provSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 2);
+
+            // Count only one entity and one snapshot, 1 instance.
+            id.instanceIndex = 1;
+            i = 0;
+            provSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 1);
+
+            // Count non-existing entity.
+            id = {};
+            id.entityName = "non existing";
+            i = 0;
+            provSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 0);
+        };
+        test(provSeg);
+        test(const_cast<const armem::wm::ProviderSegment&>(provSeg));
+    }
+
+
+    armem::wm::CoreSegment coreSeg("core");
+    coreSeg.addProviderSegment(provSeg);
+    coreSeg.addProviderSegment("other prov segment")
+            .addEntity("other entity")
+            .addSnapshot(armem::Time::Now())
+            .addInstance();
+
+    {
+        auto test = [&](auto&& coreSeg)
+        {
+            armem::MemoryID id;
+
+            // Count all ( (2+1) + 1) + 1 instances.
+            i = 0;
+            coreSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 5);
+
+            // Count only one provider segment (with (2+1) + 1 instances).
+            id.providerSegmentName = provSeg.name();
+            i = 0;
+            coreSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 4);
+
+            id.entityName = entity.name();
+            i = 0;
+            coreSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 3);
+
+            id.timestamp = snapshot.time();
+            i = 0;
+            coreSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 2);
+
+            id.instanceIndex = 1;
+            i = 0;
+            coreSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 1);
+
+            // Count non-existing provider segment.
+            id = {};
+            id.providerSegmentName = "non existing";
+            i = 0;
+            coreSeg.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 0);
+        };
+        test(coreSeg);
+        test(const_cast<const armem::wm::CoreSegment&>(coreSeg));
+    }
+
+
+    armem::wm::Memory memory("memory");
+    memory.addCoreSegment(coreSeg);
+    memory.addCoreSegment("other memory")
+            .addProviderSegment("other provider segment")
+            .addEntity("other entity")
+            .addSnapshot(armem::Time::Now())
+            .addInstance();
+
+    {
+        auto test = [&](auto&& memory)
+        {
+            armem::MemoryID id;
+
+            // Count all ( ( (2+1) + 1) + 1 ) + 1 instances.
+            i = 0;
+            memory.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 6);
+
+            // Count only one provider segment (with (2+1) + 1 instances).
+            id.coreSegmentName = coreSeg.name();
+            i = 0;
+            memory.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 5);
+
+            id.providerSegmentName = provSeg.name();
+            i = 0;
+            memory.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 4);
+
+            id.entityName = entity.name();
+            i = 0;
+            memory.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 3);
+
+            id.timestamp = snapshot.time();
+            i = 0;
+            memory.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 2);
+
+            id.instanceIndex = 1;
+            i = 0;
+            memory.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 1);
+
+            // Count non-existing provider segment.
+            id = {};
+            id.coreSegmentName = "non existing";
+            i = 0;
+            memory.forEachInstanceIn(id, count);
+            BOOST_CHECK_EQUAL(i, 0);
+        };
+        test(memory);
+        test(const_cast<const armem::wm::Memory&>(memory));
+    }
+}
diff --git a/source/RobotAPI/libraries/armem/test/ArMemIceConversionsTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemIceConversionsTest.cpp
index 07ea4e3acc307aa3d7abb97c7f9bd3f450a4129e..071b0bc4b38882bbd7e87307d946312ba50d6f10 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemIceConversionsTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemIceConversionsTest.cpp
@@ -26,7 +26,7 @@
 
 #include <RobotAPI/Test.h>
 #include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 
 #include <iostream>
 #include <SimoxUtility/algorithm/get_map_keys_values.h>
@@ -52,7 +52,7 @@ BOOST_AUTO_TEST_CASE(test_entity)
     entity.addSnapshot(snapshot);
 
     armem::data::EntityPtr ice;
-    armem::toIce(ice, entity);
+    armarx::toIce(ice, entity);
 
     BOOST_CHECK_EQUAL(ice->id.memoryName, entity.id().memoryName);
     BOOST_CHECK_EQUAL(ice->id.coreSegmentName, entity.id().coreSegmentName);
@@ -62,7 +62,7 @@ BOOST_AUTO_TEST_CASE(test_entity)
     BOOST_CHECK_EQUAL(ice->history.size(), entity.size());
 
     armem::wm::Entity entityOut;
-    armem::fromIce(ice, entityOut);
+    armarx::fromIce(ice, entityOut);
 
     BOOST_CHECK_EQUAL(entityOut.size(), entity.size());
 
diff --git a/source/RobotAPI/libraries/armem/test/ArMemQueryBuilderTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemQueryBuilderTest.cpp
index 535ce2b80b6b9b5ac7c95fcf3f9847ab943d1729..1f92ff883c67fe070328bd51ff6a9baad7afa81b 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemQueryBuilderTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemQueryBuilderTest.cpp
@@ -28,7 +28,7 @@
 
 #include <ArmarXCore/core/time/ice_conversions.h>
 
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
 
@@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE(test_mixed)
         {
             auto atTime = query::entity::SinglePtr::dynamicCast(*it);
             BOOST_REQUIRE(atTime);
-            BOOST_CHECK_EQUAL(atTime->timestamp, armem::toIce<armem::dto::Time>(armem::Time(armem::Duration::MilliSeconds(3000))));
+            BOOST_CHECK_EQUAL(atTime->timestamp, armarx::toIce<armem::dto::Time>(armem::Time(armem::Duration::MilliSeconds(3000))));
             ++it;
         }
         {
@@ -160,8 +160,8 @@ BOOST_AUTO_TEST_CASE(test_mixed)
         {
             auto timeRange = query::entity::TimeRangePtr::dynamicCast(*it);
             BOOST_REQUIRE(timeRange);
-            BOOST_CHECK_EQUAL(timeRange->minTimestamp, armem::toIce<armem::dto::Time>(armem::Time(armem::Duration::MilliSeconds(1000))));
-            BOOST_CHECK_EQUAL(timeRange->maxTimestamp, armem::toIce<armem::dto::Time>(armem::Time(armem::Duration::MilliSeconds(2000))));
+            BOOST_CHECK_EQUAL(timeRange->minTimestamp, armarx::toIce<armem::dto::Time>(armem::Time(armem::Duration::MilliSeconds(1000))));
+            BOOST_CHECK_EQUAL(timeRange->maxTimestamp, armarx::toIce<armem::dto::Time>(armem::Time(armem::Duration::MilliSeconds(2000))));
             ++it;
         }
     }
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
index 4572bb8d645123296d5d7026ac21eb27032e9be4..1c2b1a25a9a050e4ea597477780ccc340fdcb60b 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
+++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
@@ -19,6 +19,7 @@
 #include <ArmarXCore/core/ManagedIceObject.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
 #include <ArmarXCore/observers/variant/Variant.h>
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 
 #include <ArmarXGui/libraries/SimpleConfigDialog/SimpleConfigDialog.h>
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 2c8ca4e7d00a27665104e6002e09c39ff52284f2..6bad86c0f05ccdaa33855d9411c27d9cc04d50f6 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -9,7 +9,6 @@
 
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
 #include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/ice_conversions_templates.h>
 #include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/client/query/query_fns.h>
@@ -28,6 +27,7 @@
 #include <RobotAPI/libraries/core/FramedPose.h>
 #include <RobotAPI/libraries/core/remoterobot/RemoteRobot.h>
 
+#include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/system/cmake/CMakePackageFinder.h>
 #include <ArmarXCore/core/time/DateTime.h>
diff --git a/source/RobotAPI/libraries/aron/common/aron_conversions/eigen.cpp b/source/RobotAPI/libraries/aron/common/aron_conversions/eigen.cpp
index deed74c9ada113f05d10286a370b703d6a712642..8b738d098d56b40796fc427f6d69dd744beab9cc 100644
--- a/source/RobotAPI/libraries/aron/common/aron_conversions/eigen.cpp
+++ b/source/RobotAPI/libraries/aron/common/aron_conversions/eigen.cpp
@@ -24,4 +24,15 @@ namespace armarx::aron
         dto = bo.matrix();
     }
 
+    void fromAron(const AronPose& dto, Eigen::Isometry3d& bo)
+    {
+        bo.matrix() = dto.cast<double>();
+    }
+
+    void toAron(AronPose& dto, const Eigen::Isometry3d& bo)
+    {
+        dto = bo.matrix().cast<float>();
+    }
+
+
 }  // namespace armarx::aron
diff --git a/source/RobotAPI/libraries/aron/common/aron_conversions/eigen.h b/source/RobotAPI/libraries/aron/common/aron_conversions/eigen.h
index 3520b2dedd7c10f2d358cb7997269871979b52ed..3ace8f400192823bd7c59cce605ef50e77dfdbff 100644
--- a/source/RobotAPI/libraries/aron/common/aron_conversions/eigen.h
+++ b/source/RobotAPI/libraries/aron/common/aron_conversions/eigen.h
@@ -12,4 +12,7 @@ namespace armarx::aron
     void fromAron(const AronPose& dto, Eigen::Isometry3f& bo);
     void toAron(AronPose& dto, const Eigen::Isometry3f& bo);
 
+    void fromAron(const AronPose& dto, Eigen::Isometry3d& bo);
+    void toAron(AronPose& dto, const Eigen::Isometry3d& bo);
+
 }  // namespace armarx
diff --git a/source/RobotAPI/libraries/aron/core/test/aronCodeGenerationTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronCodeGenerationTest.cpp
index e62f3d3d786bdd232631daa00d28f4724d03bd01..392739b2d4de4681cbfda63abbd41b93a10ff692 100644
--- a/source/RobotAPI/libraries/aron/core/test/aronCodeGenerationTest.cpp
+++ b/source/RobotAPI/libraries/aron/core/test/aronCodeGenerationTest.cpp
@@ -61,6 +61,16 @@
 using namespace armarx;
 using namespace aron;
 
+
+namespace std
+{
+    ostream& operator<<(ostream& os, const type_info& i)
+    {
+        return os << "'" << i.name() << "'";
+    }
+}
+
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationAnyTest)
 {
     std::cout << "Running Code Gen Any test" << std::endl;
@@ -84,6 +94,7 @@ BOOST_AUTO_TEST_CASE(AronCodeGenerationAnyTest)
     BOOST_CHECK_EQUAL(int_var2->getValue(), 5);
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationTemplateTest)
 {
     std::cout << "Running Code Gen Tmpl test" << std::endl;
@@ -136,148 +147,156 @@ BOOST_AUTO_TEST_CASE(AronCodeGenerationTemplateTest)
     BOOST_CHECK_EQUAL(tt_daimpl_dablarg->getTemplateInstantiations(), std::vector<std::string>{});
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationListTest)
 {
     std::cout << "Running Code Gen List test" << std::endl;
     ListTest p_tmp;
     ListTest p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
-
-    BOOST_CHECK_EQUAL(typeid(p.intList) == typeid(std::vector<int>), true);
-    BOOST_CHECK_EQUAL(typeid(p.longList) == typeid(std::vector<long>), true);
-    BOOST_CHECK_EQUAL(typeid(p.floatList) == typeid(std::vector<float>), true);
-    BOOST_CHECK_EQUAL(typeid(p.doubleList) == typeid(std::vector<double>), true);
-    BOOST_CHECK_EQUAL(typeid(p.stringList) == typeid(std::vector<std::string>), true);
-    BOOST_CHECK_EQUAL(typeid(p.boolList) == typeid(std::vector<bool>), true);
-    //BOOST_CHECK_EQUAL(typeid(p.objectList) == typeid(std::vector<ListTest::ListClass>), true);
-
-    BOOST_CHECK_EQUAL(p.intList.size() == 0, true);
-    BOOST_CHECK_EQUAL(p.longList.size() == 0, true);
-    BOOST_CHECK_EQUAL(p.floatList.size() == 0, true);
-    BOOST_CHECK_EQUAL(p.doubleList.size() == 0, true);
-    BOOST_CHECK_EQUAL(p.stringList.size() == 0, true);
-    BOOST_CHECK_EQUAL(p.boolList.size() == 0, true);
-    BOOST_CHECK_EQUAL(p.objectList.size() == 0, true);
+    BOOST_CHECK(p_tmp == p);
+
+    BOOST_CHECK_EQUAL(typeid(p.intList), typeid(std::vector<int>));
+    BOOST_CHECK_EQUAL(typeid(p.longList), typeid(std::vector<long>));
+    BOOST_CHECK_EQUAL(typeid(p.floatList), typeid(std::vector<float>));
+    BOOST_CHECK_EQUAL(typeid(p.doubleList), typeid(std::vector<double>));
+    BOOST_CHECK_EQUAL(typeid(p.stringList), typeid(std::vector<std::string>));
+    BOOST_CHECK_EQUAL(typeid(p.boolList), typeid(std::vector<bool>));
+    //BOOST_CHECK_EQUAL(typeid(p.objectList), typeid(std::vector<ListTest::ListClass>));
+
+    BOOST_CHECK_EQUAL(p.intList.size(), 0);
+    BOOST_CHECK_EQUAL(p.longList.size(), 0);
+    BOOST_CHECK_EQUAL(p.floatList.size(), 0);
+    BOOST_CHECK_EQUAL(p.doubleList.size(), 0);
+    BOOST_CHECK_EQUAL(p.stringList.size(), 0);
+    BOOST_CHECK_EQUAL(p.boolList.size(), 0);
+    BOOST_CHECK_EQUAL(p.objectList.size(), 0);
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationDictTest)
 {
     std::cout << "Running Code Gen Dict test" << std::endl;
     DictTest p_tmp;
     DictTest p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
+    BOOST_CHECK(p_tmp == p);
 
-    BOOST_CHECK_EQUAL(p.dict.size() == 0, true);
+    BOOST_CHECK_EQUAL(p.dict.size(), 0);
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationEigenMatrixTest)
 {
     std::cout << "Running Code Gen EigenMatrix test" << std::endl;
     EigenMatrixTest p_tmp;
     EigenMatrixTest p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
-
-    BOOST_CHECK_EQUAL(p.the_short_eigen_matrix.rows() == 5, true);
-    BOOST_CHECK_EQUAL(p.the_short_eigen_matrix.cols() == 7, true);
-    BOOST_CHECK_EQUAL(p.the_int_eigen_matrix.rows() == 7, true);
-    BOOST_CHECK_EQUAL(p.the_int_eigen_matrix.cols() == 7, true);
-    BOOST_CHECK_EQUAL(p.the_long_eigen_matrix.rows() == 7, true);
-    BOOST_CHECK_EQUAL(p.the_long_eigen_matrix.cols() == 5, true);
-    BOOST_CHECK_EQUAL(p.the_float_eigen_matrix.rows() == 1, true);
-    BOOST_CHECK_EQUAL(p.the_float_eigen_matrix.cols() == 9, true);
-    BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.rows() == 25, true);
-    BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.cols() == 1, true);
+    BOOST_CHECK(p_tmp == p);
+
+    BOOST_CHECK_EQUAL(p.the_short_eigen_matrix.rows(), 5);
+    BOOST_CHECK_EQUAL(p.the_short_eigen_matrix.cols(), 7);
+    BOOST_CHECK_EQUAL(p.the_int_eigen_matrix.rows(), 7);
+    BOOST_CHECK_EQUAL(p.the_int_eigen_matrix.cols(), 7);
+    BOOST_CHECK_EQUAL(p.the_long_eigen_matrix.rows(), 7);
+    BOOST_CHECK_EQUAL(p.the_long_eigen_matrix.cols(), 5);
+    BOOST_CHECK_EQUAL(p.the_float_eigen_matrix.rows(), 1);
+    BOOST_CHECK_EQUAL(p.the_float_eigen_matrix.cols(), 9);
+    BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.rows(), 5);
+    BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.cols(), 1);
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationEigenQuaternionTest)
 {
     std::cout << "Running Code Gen EigenQuaternion test" << std::endl;
     EigenQuaternionTest p_tmp;
     EigenQuaternionTest p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
+    BOOST_CHECK(p_tmp == p);
 
-    //BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.w() == 0, true);
-    //BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.x() == 0, true);
-    //BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.y() == 0, true);
-    //BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.z() == 0, true);
+    //BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.w(), 0);
+    //BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.x(), 0);
+    //BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.y(), 0);
+    //BOOST_CHECK_EQUAL(p.the_double_eigen_matrix.z(), 0);
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationEigenPositionTest)
 {
     std::cout << "Running Code Gen EigenPosition test" << std::endl;
     PositionTest p_tmp;
     PositionTest p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
+    BOOST_CHECK(p_tmp == p);
 
-    BOOST_CHECK_EQUAL(p.position.rows() == 3, true);
-    BOOST_CHECK_EQUAL(p.position.cols() == 1, true);
+    BOOST_CHECK_EQUAL(p.position.rows(), 3);
+    BOOST_CHECK_EQUAL(p.position.cols(), 1);
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationEigenPoseTest)
 {
     std::cout << "Running Code Gen EigenPose test" << std::endl;
     PoseTest p_tmp;
     PoseTest p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
+    BOOST_CHECK(p_tmp == p);
 
-    BOOST_CHECK_EQUAL(p.pose.rows() == 4, true);
-    BOOST_CHECK_EQUAL(p.pose.cols() == 4, true);
+    BOOST_CHECK_EQUAL(p.pose.rows(), 4);
+    BOOST_CHECK_EQUAL(p.pose.cols(), 4);
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationIntEnumTest)
 {
     std::cout << "Running Code Gen IntEnum test" << std::endl;
     TheObjectThatUsesTheIntEnum p_tmp;
     TheObjectThatUsesTheIntEnum p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
+    BOOST_CHECK(p_tmp == p);
 
-    BOOST_CHECK_EQUAL(p.the_int_enum.value == TheIntEnum::INT_ENUM_VALUE_0, true);
+    BOOST_CHECK(p.the_int_enum.value == TheIntEnum::INT_ENUM_VALUE_0);
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationPrimitiveTest)
 {
     std::cout << "Running Code Gen Primitive test" << std::endl;
     PrimitiveTest p_tmp;
     PrimitiveTest p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
-
-    BOOST_CHECK_EQUAL(p.the_bool == false, true);
-    BOOST_CHECK_EQUAL(p.the_double == 0.0, true);
-    BOOST_CHECK_EQUAL(p.the_float == 0.0, true);
-    BOOST_CHECK_EQUAL(p.the_int == 0, true);
-    BOOST_CHECK_EQUAL(p.the_long == 0, true);
-    BOOST_CHECK_EQUAL(p.the_string == "", true);
-    BOOST_CHECK_EQUAL(p.the_time == IceUtil::Time(), true);
+    BOOST_CHECK(p_tmp == p);
+
+    BOOST_CHECK_EQUAL(p.the_bool, false);
+    BOOST_CHECK_EQUAL(p.the_double, 0.0);
+    BOOST_CHECK_EQUAL(p.the_float, 0.0);
+    BOOST_CHECK_EQUAL(p.the_int, 0);
+    BOOST_CHECK_EQUAL(p.the_long, 0);
+    BOOST_CHECK_EQUAL(p.the_string, "");
+    BOOST_CHECK(p.the_time == IceUtil::Time());
 }
 
+
 BOOST_AUTO_TEST_CASE(AronCodeGenerationOptionalTest)
 {
     std::cout << "Running Code Gen Optional test" << std::endl;
     OptionalTest p_tmp;
     OptionalTest p = p_tmp; // test assignment
-    BOOST_CHECK_EQUAL(p_tmp == p, true);
-
-    BOOST_CHECK_EQUAL(typeid(p.some_dict) == typeid(std::optional<std::map<std::string, float>>), true);
-    BOOST_CHECK_EQUAL(typeid(p.some_dict_with_optional_type) == typeid(std::map<std::string, std::optional<float>>), true);
-    BOOST_CHECK_EQUAL(typeid(p.some_eigen_matrix) == typeid(std::optional<Eigen::Matrix<long, 25, 10>>), true);
-    BOOST_CHECK_EQUAL(typeid(p.some_float) == typeid(std::optional<float>), true);
-    BOOST_CHECK_EQUAL(typeid(p.some_list) == typeid(std::optional<std::vector<double>>), true);
-    BOOST_CHECK_EQUAL(typeid(p.some_list_with_optional_list) == typeid(std::optional<std::vector<std::optional<std::vector<std::optional<float>>>>>), true);
-    BOOST_CHECK_EQUAL(typeid(p.some_list_with_optional_type) == typeid(std::vector<std::optional<double>>), true);
-    BOOST_CHECK_EQUAL(typeid(p.some_obj) == typeid(std::optional<armarx::OptionalTestElement>), true);
-    BOOST_CHECK_EQUAL(typeid(p.some_string) == typeid(std::optional<std::string>), true);
-
+    BOOST_CHECK(p_tmp == p);
+
+    BOOST_CHECK_EQUAL(typeid(p.some_dict), typeid(std::optional<std::map<std::string, float>>));
+    BOOST_CHECK_EQUAL(typeid(p.some_dict_with_optional_type), typeid(std::map<std::string, std::optional<float>>));
+    BOOST_CHECK_EQUAL(typeid(p.some_eigen_matrix), typeid(std::optional<Eigen::Matrix<long, 25, 10>>));
+    BOOST_CHECK_EQUAL(typeid(p.some_float), typeid(std::optional<float>));
+    BOOST_CHECK_EQUAL(typeid(p.some_list), typeid(std::optional<std::vector<double>>));
+    BOOST_CHECK_EQUAL(typeid(p.some_list_with_optional_list), typeid(std::optional<std::vector<std::optional<std::vector<std::optional<float>>>>>));
+    BOOST_CHECK_EQUAL(typeid(p.some_list_with_optional_type), typeid(std::vector<std::optional<double>>));
+    BOOST_CHECK_EQUAL(typeid(p.some_obj), typeid(std::optional<armarx::OptionalTestElement>));
+    BOOST_CHECK_EQUAL(typeid(p.some_string), typeid(std::optional<std::string>));
 
     auto aronType = p.ToAronType();
-    BOOST_CHECK_EQUAL(aronType->getMemberType("some_float")->getMaybe() == aron::type::Maybe::eOptional, true);
+    BOOST_CHECK_EQUAL(aronType->getMemberType("some_float")->getMaybe(), aron::type::Maybe::eOptional);
 
-    BOOST_CHECK_EQUAL(p.some_float.has_value() == false, true);
+    BOOST_CHECK(not p.some_float.has_value());
     auto aron = p.toAron();
-    BOOST_CHECK_EQUAL(aron->getElement("some_float") == nullptr, true);
+    BOOST_CHECK(aron->getElement("some_float") == nullptr);
 
     p.some_float = 5.0f;
-    BOOST_CHECK_EQUAL(p.some_float.has_value() == true, true);
+    BOOST_CHECK(p.some_float.has_value());
     aron = p.toAron();
-    BOOST_CHECK_EQUAL(*aron->getElement("some_float") == std::make_shared<armarx::aron::data::Float>(5.0f), true);
-    BOOST_CHECK_EQUAL(*aron->getElement("some_float") == nullptr, false);
+    BOOST_CHECK(aron->getElement("some_float"));
+    BOOST_CHECK(*aron->getElement("some_float") == armarx::aron::data::Float(5.0f));
 }