diff --git a/source/RobotAPI/libraries/armem/client/ComponentPlugin.cpp b/source/RobotAPI/libraries/armem/client/ComponentPlugin.cpp
index e49e46c15bfeab22f90c3ed9d628c0071058215e..f67ed63b52a23149b1888e0fe96aa3be184091bd 100644
--- a/source/RobotAPI/libraries/armem/client/ComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/armem/client/ComponentPlugin.cpp
@@ -12,3 +12,10 @@ armarx::armem::client::ComponentPluginUser::ComponentPluginUser()
 {
     // pass
 }
+
+
+armarx::armem::client::ComponentPluginUser::~ComponentPluginUser()
+{
+    // pass
+}
+
diff --git a/source/RobotAPI/libraries/armem/client/ComponentPlugin.h b/source/RobotAPI/libraries/armem/client/ComponentPlugin.h
index da3dc0f5bdcc8e3c3cb21d7f7e2ef6a6282e0d8e..8e6983a778501b10f0df04e210e769e700de56fe 100644
--- a/source/RobotAPI/libraries/armem/client/ComponentPlugin.h
+++ b/source/RobotAPI/libraries/armem/client/ComponentPlugin.h
@@ -29,6 +29,7 @@ namespace armarx::armem::client
     public:
 
         ComponentPluginUser();
+        ~ComponentPluginUser() override;
 
     };
 
diff --git a/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.cpp b/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.cpp
index 0d9bd7d76a6fea8ae281726c6d1df51fb724faea..693a2883c3c4b851dc3864e75879684396645c09 100644
--- a/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.cpp
@@ -14,8 +14,45 @@ armarx::armem::client::ReaderComponentPlugin::~ReaderComponentPlugin()
 }
 
 
-armarx::armem::client::ReaderComponentPluginUser::ReaderComponentPluginUser() :
-    memoryReader{nullptr}
+void
+armarx::armem::client::ReaderComponentPlugin::postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties)
+{
+    properties->topic<MemoryListenerInterface>("MemoryUpdates");
+}
+
+
+armarx::armem::client::ReaderComponentPluginUser::ReaderComponentPluginUser()
 {
     addPlugin(plugin);
 }
+
+
+armarx::armem::client::ReaderComponentPluginUser::~ReaderComponentPluginUser()
+{
+    // pass
+}
+
+
+void
+armarx::armem::client::ReaderComponentPluginUser::memoryUpdated(const UpdateInfos& updateInfos, const Ice::Current& current)
+{
+    MemoryID id;
+    for (const UpdateInfo& updateInfo : updateInfos)
+    {
+        armem::fromIce(updateInfo.entitySnapshotID, id);
+        const std::string sid = id.getEntityID().str();
+        if (m_callbacks.find(sid) != m_callbacks.end())
+        {
+            m_callbacks[sid](updateInfo);
+        }
+    }
+}
+
+
+void
+armarx::armem::client::ReaderComponentPluginUser::memorySubscribe(const MemoryID& id, callback callback)
+{
+    ARMARX_CHECK(id.hasEntityName()) << "MemoryID must be an entity ID.";
+    const std::string sid = id.getEntityID().str();
+    m_callbacks[sid] = callback;
+}
diff --git a/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.h b/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.h
index b67727b5a7946cb407f4a91f31aea112caa1cbcc..96ffa8bbaed2202b97db40f67bb266e719d7d6ad 100644
--- a/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.h
+++ b/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.h
@@ -2,13 +2,15 @@
 
 
 // STD/STL
-#include <mutex>
+#include <functional>
+#include <unordered_map>
 
 // ArmarX
 #include <ArmarXCore/core/Component.h>
 
 // RobotAPI
 #include <RobotAPI/interface/armem/MemoryInterface.h>
+#include <RobotAPI/interface/armem/MemoryListenerInterface.h>
 #include <RobotAPI/interface/armem/MemoryNameSystemInterface.h>
 #include <RobotAPI/libraries/armem/client/Reader.h>
 #include <RobotAPI/libraries/armem/mns/MemoryNameSystemClientPlugin.h>
@@ -24,19 +26,31 @@ namespace armarx::armem::client
     public:
 
         using plugins::MemoryNameSystemClientPlugin::MemoryNameSystemClientPlugin;
-        virtual ~ReaderComponentPlugin() override;
+        ~ReaderComponentPlugin() override;
+
+        void postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) override;
 
     };
 
 
     class ReaderComponentPluginUser :
         virtual public ManagedIceObject,
-        virtual public plugins::MemoryNameSystemClientPluginUser
+        virtual public plugins::MemoryNameSystemClientPluginUser,
+        virtual public MemoryListenerInterface
     {
 
+        using callback = std::function<void(const UpdateInfo&)>;
+
     public:
 
         ReaderComponentPluginUser();
+        ~ReaderComponentPluginUser() override;
+
+        void memoryUpdated(const UpdateInfos& updateInfos, const Ice::Current& current) override;
+
+    protected:
+
+        void memorySubscribe(const MemoryID& entityID, callback callback);
 
     protected:
 
@@ -44,6 +58,8 @@ namespace armarx::armem::client
 
     private:
 
+        std::unordered_map<std::string, callback> m_callbacks;
+
         ReaderComponentPlugin* plugin = nullptr;
 
     };
diff --git a/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.cpp b/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.cpp
index 3a4885596c2827fccc7a354b8f89b7061b5aa377..7b8780f32a5aa9ddf61dbf69d5d2ba7d83fb86f3 100644
--- a/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.cpp
@@ -14,8 +14,13 @@ armarx::armem::client::WriterComponentPlugin::~WriterComponentPlugin()
 }
 
 
-armarx::armem::client::WriterComponentPluginUser::WriterComponentPluginUser() :
-    memoryWriter{nullptr}
+armarx::armem::client::WriterComponentPluginUser::WriterComponentPluginUser()
 {
     addPlugin(plugin);
 }
+
+
+armarx::armem::client::WriterComponentPluginUser::~WriterComponentPluginUser()
+{
+    // pass
+}
diff --git a/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.h b/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.h
index 179f3227ca0d2a4c5866647e8cd6597d3485c79d..110ba2590364806f639678e13a22580062b1b7a8 100644
--- a/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.h
+++ b/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.h
@@ -24,7 +24,7 @@ namespace armarx::armem::client
     public:
 
         using plugins::MemoryNameSystemClientPlugin::MemoryNameSystemClientPlugin;
-        virtual ~WriterComponentPlugin() override;
+        ~WriterComponentPlugin() override;
 
     };
 
@@ -37,6 +37,7 @@ namespace armarx::armem::client
     public:
 
         WriterComponentPluginUser();
+        ~WriterComponentPluginUser() override;
 
     protected:
 
diff --git a/source/RobotAPI/libraries/armem/component/MemoryComponentPlugin.cpp b/source/RobotAPI/libraries/armem/component/MemoryComponentPlugin.cpp
index 568646bd9a747f388c2d9db7fff6b91e85e07bed..2cc74f5b60963e9accaafb69a04d6a64750cb41f 100644
--- a/source/RobotAPI/libraries/armem/component/MemoryComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/armem/component/MemoryComponentPlugin.cpp
@@ -16,7 +16,7 @@ namespace armarx::armem::plugins
 
     void MemoryComponentPlugin::postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties)
     {
-        properties->topic(memoryListener);
+        properties->topic(memoryListener, "MemoryUpdates");
     }