diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index 32c3b9b949577ab7f91b4993c186f181151abc6d..88519c9ba53edf07b8c3ed5a1d7183cf8eb67d36 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -60,11 +60,13 @@ set(LIB_FILES
     core/error/ArMemError.cpp
     core/error/mns.cpp
 
+
     client/MemoryNameSystem.cpp
     client/Reader.cpp
     client/Writer.cpp
 
     client/plugins/ListeningPluginUser.cpp
+    client/plugins/ListeningPlugin.cpp
     client/plugins/PluginUser.cpp
     client/plugins/Plugin.cpp
 
@@ -76,6 +78,7 @@ set(LIB_FILES
     client/query/Builder.cpp
     client/query/selectors.cpp
 
+
     server/MemoryToIceAdapter.cpp
     server/ComponentPlugin.cpp
     server/MemoryRemoteGui.cpp
@@ -102,6 +105,7 @@ set(LIB_FILES
     server/query_proc/ltm.cpp
     server/query_proc/wm.cpp
 
+
     mns/MemoryNameSystem.cpp
     mns/Registry.cpp
     mns/plugins/Plugin.cpp
@@ -155,6 +159,7 @@ set(LIB_HEADERS
     core/wm/visitor/Visitor.h
     core/wm/visitor/FunctionalVisitor.h
 
+
     client.h
     client/forward_declarations.h
     client/MemoryNameSystem.h
@@ -163,6 +168,7 @@ set(LIB_HEADERS
 
     client/plugins.h
     client/plugins/ListeningPluginUser.h
+    client/plugins/ListeningPlugin.h
     client/plugins/PluginUser.h
     client/plugins/Plugin.h
 
@@ -178,6 +184,7 @@ set(LIB_HEADERS
     client/util/SimpleReaderBase.h
     client/util/SimpleWriterBase.h
 
+
     server.h
     server/forward_declarations.h
 
@@ -210,6 +217,7 @@ set(LIB_HEADERS
     server/query_proc/ltm.h
     server/query_proc/wm.h
 
+
     mns.h
     mns/MemoryNameSystem.h
     mns/Registry.h
diff --git a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
index 4dcb3d624e42b901fe0d70d91a89c136ff1692ba..121b2924802c1a8c7d6ab411fd1c88755ee56621 100644
--- a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
+++ b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
@@ -9,6 +9,8 @@
 
 #include <SimoxUtility/algorithm/string/string_tools.h>
 
+
+
 namespace armarx::armem::client
 {
 
@@ -190,6 +192,7 @@ namespace armarx::armem::client
     }
 
 
+
     template <class ClientT>
     std::map<std::string, ClientT>
     MemoryNameSystem::_getAllClients(auto&& getProxyFn) const
@@ -197,7 +200,10 @@ namespace armarx::armem::client
         std::map<std::string, ClientT> result;
         for (const auto& [name, server] : servers)
         {
-            result[name] = ClientT(getProxyFn(server));
+            if (auto proxy = getProxyFn(server))
+            {
+                result[name] = ClientT(proxy);
+            }
         }
         return result;
     }
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..463c6443e11ddd0ec92d6c5bb4b1001e4e97dfed
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp
@@ -0,0 +1,21 @@
+#include "ListeningPlugin.h"
+
+#include <RobotAPI/interface/armem/client/MemoryListenerInterface.h>
+
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
+
+namespace armarx::armem::client::plugins
+{
+
+    ListeningPlugin::~ListeningPlugin()
+    {}
+
+
+    void ListeningPlugin::postCreatePropertyDefinitions(armarx::PropertyDefinitionsPtr& properties)
+    {
+        // Subscribe topics by single servers, use this as a prefix.
+        properties->topic<MemoryListenerInterface>("MemoryUpdates");
+    }
+
+}
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.h b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.h
new file mode 100644
index 0000000000000000000000000000000000000000..80aac20c61d49ffc67963da3b14be0c984ab5a3a
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include <ArmarXCore/core/ComponentPlugin.h>
+
+
+namespace armarx::armem::client::plugins
+{
+
+    /**
+     * @brief Subscribes the memory updates topic.
+     *
+     * When using this plugin, the component needs to implement the
+     * `MemoryListenerInterface`.
+     *
+     * @see MemoryListenerInterface
+     */
+    class ListeningPlugin :
+        public armarx::ComponentPlugin
+    {
+    public:
+
+        using ComponentPlugin::ComponentPlugin;
+        virtual ~ListeningPlugin() override;
+
+        virtual void postCreatePropertyDefinitions(armarx::PropertyDefinitionsPtr& properties) override;
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
index 3b3027a3808e14157378214637bd0c832c431fa6..3a40a9ffe27b1116fe5a78f5d1a3088652818b38 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
@@ -1,5 +1,7 @@
 #include "ListeningPluginUser.h"
 
+#include "ListeningPlugin.h"
+
 #include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
 
 
@@ -8,6 +10,7 @@ namespace armarx::armem::client::plugins
 
     ListeningPluginUser::ListeningPluginUser()
     {
+        addPlugin(listeningPlugin);
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h
index dd80b88e6fd5f705aa707569a19c6ad57bac4106..20b124d5de44b9e2f0a67bb7ec4302a51cdc1ccd 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h
@@ -9,6 +9,8 @@
 
 namespace armarx::armem::client::plugins
 {
+    class ListeningPlugin;
+
 
     /**
      * @brief A memory name system client which listens to the memory updates
@@ -27,8 +29,14 @@ namespace armarx::armem::client::plugins
 
 
         // MemoryListenerInterface
-        virtual void memoryUpdated(const std::vector<data::MemoryID>& updatedSnapshotIDs,
-                                   const Ice::Current&) override;
+        virtual void
+        memoryUpdated(const std::vector<data::MemoryID>& updatedSnapshotIDs,
+                      const Ice::Current&) override;
+
+
+    private:
+
+        ListeningPlugin* listeningPlugin = nullptr;
 
     };
 
diff --git a/source/RobotAPI/libraries/armem/client/plugins/Plugin.cpp b/source/RobotAPI/libraries/armem/client/plugins/Plugin.cpp
index e31d2d0e5d8d9446dc087eab1f3709a4034f6223..74cf798f6f65d31ee1e4bb2a2ba239c264d9f88b 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/Plugin.cpp
+++ b/source/RobotAPI/libraries/armem/client/plugins/Plugin.cpp
@@ -1,18 +1,18 @@
 #include "Plugin.h"
 
-#include <ArmarXCore/core/Component.h>
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
 #include <RobotAPI/libraries/armem/core/error.h>
 #include <RobotAPI/libraries/armem/core/ice_conversions.h>
 
+#include <ArmarXCore/core/Component.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/logging/Logging.h>
 
 
 namespace armarx::armem::client::plugins
 {
 
     Plugin::Plugin(
-            ManagedIceObject& parent, std::string pre) :
+        ManagedIceObject& parent, std::string pre) :
         ComponentPlugin(parent, pre)
     {
     }
@@ -24,14 +24,14 @@ namespace armarx::armem::client::plugins
 
     void Plugin::postCreatePropertyDefinitions(armarx::PropertyDefinitionsPtr& properties)
     {
-        if (!properties->hasDefinition(makePropertyName(PROPERTY_MNS_NAME_NAME)))
+        if (not properties->hasDefinition(makePropertyName(PROPERTY_MNS_NAME_NAME)))
         {
             properties->defineOptionalProperty<std::string>(
                 makePropertyName(PROPERTY_MNS_NAME_NAME),
                 memoryNameSystemName,
                 "Name of the Memory Name System (MNS) component.");
         }
-        if (!properties->hasDefinition(makePropertyName(PROPERTY_MNS_ENABLED_NAME)))
+        if (not properties->hasDefinition(makePropertyName(PROPERTY_MNS_ENABLED_NAME)))
         {
             properties->defineOptionalProperty<bool>(
                 makePropertyName(PROPERTY_MNS_ENABLED_NAME),
@@ -39,9 +39,6 @@ namespace armarx::armem::client::plugins
                 "Whether to use (and depend on) the Memory Name System (MNS)."
                 "\nSet to false to use this memory as a stand-alone.");
         }
-
-        // Subscribe topics by single servers, use this as a prefix.
-        properties->topic<MemoryListenerInterface>("MemoryUpdates");
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/client/plugins/Plugin.h b/source/RobotAPI/libraries/armem/client/plugins/Plugin.h
index 550f893bfcbdacd83dbd9abecebe3ad642309bcb..eff9134fda523d7b91b6cda2fdd4845dd78238cb 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/Plugin.h
+++ b/source/RobotAPI/libraries/armem/client/plugins/Plugin.h
@@ -25,6 +25,7 @@ namespace armarx::armem::client::plugins
         Plugin(ManagedIceObject& parent, std::string pre);
         virtual ~Plugin() override;
 
+
         void postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) override;
 
         void preOnInitComponent() override;