diff --git a/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp b/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp
index 510ff8933b6e045ec96e1020e6914f2b064636f2..743d8a9bc2904a707f42633567f9b59ef184c3af 100644
--- a/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp
@@ -67,6 +67,7 @@ namespace armarx::plugins
     HeartbeatComponentPlugin::preOnConnectComponent()
     {
         robotHealthTopic = parent<Component>().getTopic<RobotHealthInterfacePrx>(topicName);
+        componentName = parent<Component>().getName();
     }
 
     void
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp
index e5077dbad6abca53970f20a82f2b4c7534333cc7..df6f5374d391a6bdf0ec9378df8668017599b4eb 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp
@@ -454,6 +454,8 @@ namespace armarx
         debugOutputData.getWriteBuffer().currentDnull_y = dnull.y();
         debugOutputData.getWriteBuffer().currentDnull_z = dnull.z();
 
+        debugOutputData.getWriteBuffer().filteredForceInRoot = filteredForceInRoot;
+
         debugOutputData.commitWrite();
 
     }
@@ -644,6 +646,10 @@ namespace armarx
         datafields["forceDesired_ry"] = new Variant(debugOutputData.getUpToDateReadBuffer().forceDesired_ry);
         datafields["forceDesired_rz"] = new Variant(debugOutputData.getUpToDateReadBuffer().forceDesired_rz);
 
+        datafields["filteredForceInRoot_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().filteredForceInRoot[0]);
+        datafields["filteredForceInRoot_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().filteredForceInRoot[1]);
+        datafields["filteredForceInRoot_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().filteredForceInRoot[2]);
+
         datafields["deltaT"] = new Variant(debugOutputData.getUpToDateReadBuffer().deltaT);
 
         std::string channelName = cfg->nodeSetName + "_TaskSpaceImpedanceControl";
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h
index 58fd840fb1121b4a159c185abb2e72fd7470f082..5361dec0f37c7269c86432c6dff64c95504cca3f 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h
@@ -162,6 +162,8 @@ namespace armarx
             float forceDesired_ry;
             float forceDesired_rz;
 
+            Eigen::Vector3f filteredForceInRoot;
+
             float deltaT;
 
 
diff --git a/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h b/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h
index a78db401d3f578d7be9f9c86542a37f72326aabc..e567b76b8d36d8cf41c00118a49d3e041d0607bc 100644
--- a/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h
+++ b/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h
@@ -44,7 +44,7 @@ namespace armarx::armem::client::util
         virtual ~SimpleReaderBase() = default;
 
         void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
-        void connect();
+        virtual void connect();
 
 
     protected:
@@ -65,6 +65,8 @@ namespace armarx::armem::client::util
         const armem::client::Reader& memoryReader() const;
 
 
+        MemoryNameSystem& memoryNameSystem;
+
     private:
 
         Properties props;
@@ -72,7 +74,6 @@ namespace armarx::armem::client::util
         armem::client::Reader memoryReaderClient;
         std::mutex memoryMutex;
 
-        MemoryNameSystem& memoryNameSystem;
     };
 
 } // namespace armarx::armem::client::util
diff --git a/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.cpp b/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.cpp
index a80a189ff585c7610bebe0978468aec82ebe48b9..a0c606a990fd4635a5fa2cded1c0e5be8f7566a8 100644
--- a/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.cpp
+++ b/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.cpp
@@ -40,6 +40,14 @@ namespace armarx::armem::mns
             }
         }
     }
+    
+    dto::RegisterServerResult MemoryNameSystem::registerServer(const dto::RegisterServerInput& input) 
+    {
+        const auto result = Registry::registerServer(input);
+        waitForServer_processOnce();
+
+        return result;
+    }
 
 
     armarx::RemoteGui::Client::GridLayout MemoryNameSystem::RemoteGui_buildInfoGrid()
@@ -92,4 +100,3 @@ namespace armarx::armem::mns
     }
 
 }
-
diff --git a/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.h b/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.h
index 51e4719f127ee576073e0c9b45cb0635241a185d..e0cf5b88753cb4a96caad2c004a853dcd4d11a34 100644
--- a/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.h
+++ b/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.h
@@ -31,6 +31,8 @@ namespace armarx::armem::mns
 
         void waitForServer_processOnce();
 
+        dto::RegisterServerResult registerServer(const dto::RegisterServerInput& input) override;
+
 
         /// Builds a RemoteGui grid containing information about registered memories.
         armarx::RemoteGui::Client::GridLayout RemoteGui_buildInfoGrid();
diff --git a/source/RobotAPI/libraries/armem/mns/Registry.h b/source/RobotAPI/libraries/armem/mns/Registry.h
index bf9348d157ee990f6032c4cf115b9fd56c70f716..c1965bdac24fcdf943ad2b7bc945698358dd3f0c 100644
--- a/source/RobotAPI/libraries/armem/mns/Registry.h
+++ b/source/RobotAPI/libraries/armem/mns/Registry.h
@@ -35,7 +35,7 @@ namespace armarx::armem::mns
          * Causes threads waiting in `waitForMemory()` to resume if the respective
          * memory server was added.
          */
-        dto::RegisterServerResult registerServer(const dto::RegisterServerInput& input);
+        virtual dto::RegisterServerResult registerServer(const dto::RegisterServerInput& input);
         /**
          * @brief Remove a server entry.
          */
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
index 202c4d6c4cc5b94e9a912ee9a24a3387b8542906..c554afd52d27cd534b4015eb2c5114ddd8955181 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
@@ -2,15 +2,16 @@
 
 #include <mutex>
 #include <optional>
-#include <Eigen/src/Geometry/Transform.h>
 
-#include "RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.h"
-#include <ArmarXCore/core/PackagePath.h>
-#include <ArmarXCore/core/logging/Logging.h>
+#include <Eigen/Geometry>
 
+#include "ArmarXCore/core/exceptions/local/ExpressionException.h"
 #include "RobotAPI/libraries/ArmarXObjects/ObjectInfo.h"
 #include "RobotAPI/libraries/ArmarXObjects/ObjectPose.h"
+#include "RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.h"
 #include "RobotAPI/libraries/armem_objects/aron_conversions.h"
+#include <ArmarXCore/core/PackagePath.h>
+#include <ArmarXCore/core/logging/Logging.h>
 #include <RobotAPI/libraries/ArmarXObjects/aron/ObjectPose.aron.generated.h>
 #include <RobotAPI/libraries/armem/client/query/Builder.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
@@ -32,7 +33,8 @@ namespace armarx::armem::articulated_object
     {
     }
 
-    void Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
+    void
+    Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
     {
         ARMARX_DEBUG << "Reader: registerPropertyDefinitions";
 
@@ -49,7 +51,8 @@ namespace armarx::armem::articulated_object
         def->optional(properties.providerName, prefix + "read.ProviderName");
     }
 
-    void Reader::connect()
+    void
+    Reader::connect()
     {
         // Wait for the memory to become available and add it as dependency.
         ARMARX_IMPORTANT << "Reader: Waiting for memory '" << properties.memoryName << "' ...";
@@ -65,14 +68,15 @@ namespace armarx::armem::articulated_object
         }
 
         armem::MemoryID id = armem::MemoryID();
-        id.memoryName      = properties.memoryName;
+        id.memoryName = properties.memoryName;
         id.coreSegmentName = properties.coreClassSegmentName;
         // listen to all provider segments!
 
         memoryNameSystem.subscribe(id, this, &Reader::updateKnownObjects);
     }
 
-    void Reader::updateKnownObject(const armem::MemoryID& snapshotId)
+    void
+    Reader::updateKnownObject(const armem::MemoryID& snapshotId)
     {
         // const std::string& nameWithDataset = snapshotId.providerSegmentName;
 
@@ -82,8 +86,9 @@ namespace armarx::armem::articulated_object
         // TODO(fabian.reister): implement
     }
 
-    void Reader::updateKnownObjects(const armem::MemoryID& subscriptionID,
-                                    const std::vector<armem::MemoryID>& snapshotIDs)
+    void
+    Reader::updateKnownObjects(const armem::MemoryID& subscriptionID,
+                               const std::vector<armem::MemoryID>& snapshotIDs)
     {
         ARMARX_INFO << "New objects available!";
 
@@ -106,9 +111,15 @@ namespace armarx::armem::articulated_object
         // });
     }
 
-    std::optional<ArticulatedObject> Reader::get(const std::string& name,
-            const armem::Time& timestamp)
+    std::optional<ArticulatedObject>
+    Reader::get(const std::string& name, const armem::Time& timestamp)
     {
+        const auto splits = simox::alg::split(name, "/");
+        ARMARX_CHECK_EQUAL(splits.size(), 3) << "`name` must be of form `DATASET/NAME/INSTANCE`";
+
+        const std::string className = splits.at(0) + "/" + splits.at(1); // `DATASET/NAME`
+        const std::string instanceName = splits.at(2);
+
         const auto description = queryDescription(name, timestamp);
 
         if (not description)
@@ -117,36 +128,42 @@ namespace armarx::armem::articulated_object
             return std::nullopt;
         }
 
-        return get(*description, timestamp);
+        return get(*description, timestamp, instanceName);
     }
 
-    ArticulatedObject Reader::get(const ArticulatedObjectDescription& description,
-                                  const armem::Time& timestamp)
+    ArticulatedObject
+    Reader::get(const ArticulatedObjectDescription& description,
+                const armem::Time& timestamp,
+                const std::string& instanceName)
     {
         ArticulatedObject obj{.description = description,
-                              .instance    = "", // TODO(fabian.reister):
-                              .config      = {}, // will be populated by synchronize
-                              .timestamp   = timestamp};
+                              .instance = instanceName,
+                              .config = {}, // will be populated by `synchronize()`
+                              .timestamp = timestamp};
 
         synchronize(obj, timestamp);
 
         return obj;
     }
 
-    void Reader::synchronize(ArticulatedObject& obj, const armem::Time& timestamp)
+    void
+    Reader::synchronize(ArticulatedObject& obj, const armem::Time& timestamp)
     {
-        auto state = queryState(obj.description, timestamp);
+        ARMARX_CHECK_NOT_EMPTY(obj.instance) << "An instance name must be provided!";
+
+        auto state = queryState(obj.name(), timestamp);
 
         if (not state) /* c++20 [[unlikely]] */
         {
-            ARMARX_WARNING << "Could not synchronize object " << obj.description.name;
+            ARMARX_WARNING << "Could not synchronize object " << obj.instance;
             return;
         }
 
         obj.config = std::move(*state);
     }
 
-    std::vector<robot::RobotDescription> Reader::queryDescriptions(const armem::Time& timestamp)
+    std::vector<robot::RobotDescription>
+    Reader::queryDescriptions(const armem::Time& timestamp)
     {
         // Query all entities from provider.
         armem::client::query::Builder qb;
@@ -171,19 +188,23 @@ namespace armarx::armem::articulated_object
         return getRobotDescriptions(qResult.memory);
     }
 
-    std::string Reader::getProviderName() const
+    std::string
+    Reader::getProviderName() const
     {
         return properties.providerName;
     }
 
-    void Reader::setProviderName(const std::string& providerName)
+    void
+    Reader::setProviderName(const std::string& providerName)
     {
         this->properties.providerName = providerName;
     }
 
-    std::optional<robot::RobotDescription> Reader::queryDescription(const std::string& name,
-            const armem::Time& timestamp)
+    std::optional<robot::RobotDescription>
+    Reader::queryDescription(const std::string& name, const armem::Time& timestamp)
     {
+        // FIXME: why is `name` unused?
+
         // Query all entities from provider.
         armem::client::query::Builder qb;
 
@@ -208,8 +229,8 @@ namespace armarx::armem::articulated_object
         return getRobotDescription(qResult.memory);
     }
 
-    std::optional<robot::RobotState> Reader::queryState(const robot::RobotDescription& description,
-            const armem::Time& timestamp)
+    std::optional<robot::RobotState>
+    Reader::queryState(const std::string& instanceName, const armem::Time& timestamp)
     {
         // TODO(fabian.reister): how to deal with multiple providers?
 
@@ -220,7 +241,7 @@ namespace armarx::armem::articulated_object
         qb
         .coreSegments().withName(properties.coreInstanceSegmentName)
         .providerSegments().all() // withName(properties.providerName) // agent
-        .entities().withName(description.name)
+        .entities().withName(instanceName)
         .snapshots().latest();
         // clang-format on
 
@@ -237,7 +258,8 @@ namespace armarx::armem::articulated_object
     }
 
 
-    std::optional<robot::RobotState> convertToRobotState(const armem::wm::EntityInstance& instance)
+    std::optional<robot::RobotState>
+    convertToRobotState(const armem::wm::EntityInstance& instance)
     {
         armarx::armem::arondto::ObjectInstance aronObjectInstance;
         try
@@ -253,12 +275,9 @@ namespace armarx::armem::articulated_object
         objpose::ObjectPose objectPose;
         objpose::fromAron(aronObjectInstance.pose, objectPose);
 
-        robot::RobotState robotState
-        {
-            .timestamp = objectPose.timestamp,
-            .globalPose = Eigen::Affine3f(objectPose.objectPoseGlobal),
-            .jointMap = objectPose.objectJointValues
-        };
+        robot::RobotState robotState{.timestamp = objectPose.timestamp,
+                                     .globalPose = Eigen::Affine3f(objectPose.objectPoseGlobal),
+                                     .jointMap = objectPose.objectJointValues};
 
         return robotState;
     }
@@ -272,20 +291,16 @@ namespace armarx::armem::articulated_object
         // clang-format on
 
         std::optional<wm::EntityInstance> instance;
-        coreSegment.forEachInstance([&instance](const wm::EntityInstance & i)
-        {
-            instance = i;
-        });
-        
+        coreSegment.forEachInstance([&instance](const wm::EntityInstance& i) { instance = i; });
+
         if (instance.has_value())
         {
             return convertToRobotState(instance.value());
             // return robot::convertRobotState(instance.value());
         }
-        
+
         ARMARX_FATAL << "Failed to obtain robot state";
         return std::nullopt;
-       
     }
 
 
@@ -297,10 +312,7 @@ namespace armarx::armem::articulated_object
         // clang-format on
 
         std::optional<wm::EntityInstance> instance;
-        coreSegment.forEachInstance([&instance](const wm::EntityInstance & i)
-        {
-            instance = i;
-        });
+        coreSegment.forEachInstance([&instance](const wm::EntityInstance& i) { instance = i; });
 
         if (instance.has_value())
         {
@@ -309,7 +321,6 @@ namespace armarx::armem::articulated_object
 
         ARMARX_DEBUG << "No robot description";
         return std::nullopt;
-       
     }
 
 
@@ -320,17 +331,19 @@ namespace armarx::armem::articulated_object
             memory.getCoreSegment(properties.coreClassSegmentName);
 
         std::vector<robot::RobotDescription> descriptions;
-        coreSegment.forEachEntity([&descriptions](const wm::Entity & entity)
-        {
-            if (not entity.empty())
+        coreSegment.forEachEntity(
+            [&descriptions](const wm::Entity& entity)
             {
-                const auto robotDescription = convertRobotDescription(entity.getFirstSnapshot().getInstance(0));
-                if (robotDescription)
+                if (not entity.empty())
                 {
-                    descriptions.push_back(*robotDescription);
+                    const auto robotDescription =
+                        convertRobotDescription(entity.getFirstSnapshot().getInstance(0));
+                    if (robotDescription)
+                    {
+                        descriptions.push_back(*robotDescription);
+                    }
                 }
-            }
-        });
+            });
 
         return descriptions;
     }
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
index e0dca8f3ebd68e682f7bff2bcc759c6bb2673759..3108b17f9b7054a61290a4647d5d3965f17d2fbd 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
@@ -50,9 +50,9 @@ namespace armarx::armem::articulated_object
         std::optional<ArticulatedObject> get(const std::string& name,
                                              const armem::Time& timestamp) override;
         ArticulatedObject get(const ArticulatedObjectDescription& description,
-                              const armem::Time& timestamp) override;
+                              const armem::Time& timestamp, const std::string& instanceName) override;
 
-        std::optional<robot::RobotState> queryState(const robot::RobotDescription& description,
+        std::optional<robot::RobotState> queryState(const std::string &instanceName,
                 const armem::Time& timestamp);
         std::optional<robot::RobotDescription> queryDescription(const std::string& name,
                 const armem::Time& timestamp);
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
index dcd44d6739bfaa3e211a79721a330cc10b4751fc..05506152012d6527110801adb5bfe5b015a42d1b 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
@@ -104,6 +104,8 @@ namespace armarx::armem::articulated_object
 
     std::optional<armem::MemoryID> Writer::storeOrGetClass(const ArticulatedObject& obj)
     {
+        ARMARX_TRACE;
+
         const auto objectId = knownObjects.find(obj.description.name);
 
         // check if exists
@@ -187,7 +189,10 @@ namespace armarx::armem::articulated_object
 
         const auto& timestamp = obj.timestamp;
 
-        ARMARX_DEBUG << "Storing articulated object instance '" << obj.description.name << "' (provider '" << properties.providerName << "')";
+        ARMARX_CHECK(not obj.instance.empty()) << "An object instance name must be provided!";
+        const std::string entityName = obj.description.name + "/" + obj.instance;
+
+        ARMARX_DEBUG << "Storing articulated object instance '" << entityName << "' (provider '" << properties.providerName << "')";
 
         const auto providerId = armem::MemoryID()
                                 .withMemoryName(properties.memoryName)
@@ -195,7 +200,7 @@ namespace armarx::armem::articulated_object
                                 .withProviderSegmentName(properties.providerName);
 
         armem::EntityUpdate update;
-        update.entityID = providerId.withEntityName(obj.description.name);
+        update.entityID = providerId.withEntityName(entityName);
         // .withTimestamp(timestamp); // You only need to specify the entity ID, not the snapshot ID
 
         // arondto::Robot aronArticulatedObject;
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h
index ced0a76fd07fe4575ea4762ea062a804431fff2a..a3061a553cb545605ce37febf9632d6c73d50cda 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h
@@ -13,7 +13,7 @@ namespace armarx::armem::articulated_object
 
         virtual void synchronize(ArticulatedObject& obj, const armem::Time& timestamp) = 0;
 
-        virtual ArticulatedObject get(const ArticulatedObjectDescription& description, const armem::Time& timestamp) = 0;
+        virtual ArticulatedObject get(const ArticulatedObjectDescription& description, const armem::Time& timestamp, const std::string& instanceName) = 0;
         virtual std::optional<ArticulatedObject> get(const std::string& name, const armem::Time& timestamp) = 0;
     };
 
@@ -26,4 +26,4 @@ namespace armarx::armem::articulated_object
         virtual bool store(const ArticulatedObject& obj) = 0;
     };
 
-}  // namespace armarx::armem::articulated_object
\ No newline at end of file
+}  // namespace armarx::armem::articulated_object
diff --git a/source/RobotAPI/libraries/armem_robot/types.h b/source/RobotAPI/libraries/armem_robot/types.h
index df39df99e945e4a1ef38c38db6f9428404a35bed..92f16199a760a2a11475b21fcd63a570dbedbedf 100644
--- a/source/RobotAPI/libraries/armem_robot/types.h
+++ b/source/RobotAPI/libraries/armem_robot/types.h
@@ -8,6 +8,7 @@
 
 #include <IceUtil/Time.h>
 
+#include "ArmarXCore/core/exceptions/local/ExpressionException.h"
 #include "RobotAPI/libraries/ArmarXObjects/ObjectID.h"
 #include <ArmarXCore/core/PackagePath.h>
 
@@ -41,6 +42,14 @@ namespace armarx::armem::robot
         RobotState config;
 
         IceUtil::Time timestamp;
+
+        std::string name() const 
+        {
+            ARMARX_CHECK_NOT_EMPTY(description.name) << "The robot name must be set!";
+            ARMARX_CHECK_NOT_EMPTY(instance) << "The robot instance name must be provided!";
+
+            return description.name + "/" + instance;
+        }
     };
 
     using Robots = std::vector<Robot>;
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
index 764c443a7cc595f7c1f32ca51d4bdde6ee9309a4..5ea6d2cd90c0412c2b9243262ffb3166f5ce9f13 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
@@ -113,7 +113,7 @@ namespace armarx::armem::robot_state
         .snapshots().latest(); // TODO(fabian.reister): atTime(timestamp);
         // clang-format on
 
-        ARMARX_INFO << "Lookup query in reader";
+        ARMARX_DEBUG << "Lookup query in reader";
 
         if (not memoryReader)
         {
@@ -125,7 +125,7 @@ namespace armarx::armem::robot_state
         {
             const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
 
-            ARMARX_INFO << "Lookup result in reader: " << qResult;
+            ARMARX_DEBUG << "Lookup result in reader: " << qResult;
 
             if (not qResult.success) /* c++20 [[unlikely]] */
             {
@@ -149,14 +149,14 @@ namespace armarx::armem::robot_state
         const auto jointMap = queryJointState(description, timestamp);
         if (not jointMap)
         {
-            ARMARX_WARNING << "Failed to query joint state";
+            ARMARX_WARNING << "Failed to query joint state for robot " << description.name;
             return std::nullopt;
         }
 
         const auto globalPose = queryGlobalPose(description, timestamp);
         if (not globalPose)
         {
-            ARMARX_WARNING << "Failed to query global pose";
+            ARMARX_WARNING << "Failed to query global pose for robot " << description.name;
             return std::nullopt;
         }
 
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp
index 10e13611f3fd8608a5d0b5027fd92b960c3a7754..1c0152a463d5c38abb3b1c81f1014e1f74ef4d77 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp
@@ -42,7 +42,7 @@ namespace armarx::armem::robot_state
         const auto robotState = queryState(robotDescription, timestamp);
         if (not robotState)
         {
-            ARMARX_WARNING << "Querying robot state failed!";
+            ARMARX_WARNING << "Querying robot state failed for robot `" << robot.getName() << " / " << robot.getType() << "`!";
             return false;
         }
 
@@ -67,7 +67,9 @@ namespace armarx::armem::robot_state
         const std::string xmlFilename = ArmarXDataPath::resolvePath(description->xml.serialize().path);
         ARMARX_INFO << "Loading (virtual) robot '" << description->name << "' from XML file '" << xmlFilename << "'";
 
-        return VirtualRobot::RobotIO::loadRobot(xmlFilename, loadMode);
+        auto robot = VirtualRobot::RobotIO::loadRobot(xmlFilename, loadMode);
+        robot->setName(name);
+        return robot;
     }
 
 
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
index 0db5f2d68e1de29da18c9327a5b25ee5bd834bc5..5f3c8043a69376538f41f8a55313b53f0c331f80 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp
@@ -59,7 +59,7 @@ namespace armarx::aron::cppserializer::serializer
         for (const auto& [key, value] : typenavigator->getAcceptedValueMap())
         {
             std::string enumKeyWithNamespace = std::string(IMPL_ENUM) + "::" + key;
-            fields.push_back(std::make_shared<CppField>("const static " + std::string(IMPL_ENUM), key + " = " + enumKeyWithNamespace));
+            fields.push_back(std::make_shared<CppField>("static constexpr " + std::string(IMPL_ENUM), key + " = " + enumKeyWithNamespace));
 
             enum_to_name << "\t\t{" << enumKeyWithNamespace << ", \"" << key << "\"}," << std::endl;
             name_to_enum << "\t\t{\"" << key << "\", " << enumKeyWithNamespace << "}," << std::endl;
diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
index bd4a0f8128b19bbe28b388e3fa97faddf8f743b1..4a73767f0f800f03be6c1d77759ba17993cac1a3 100644
--- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
+++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h
@@ -66,6 +66,6 @@ namespace armarx::aron::cppserializer::serializer
     private:
         // Members
         static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES;
-        static constexpr const char* IMPL_ENUM = "__ImplEnum";
+        static constexpr const char* IMPL_ENUM = "ImplEnum";
     };
 }
diff --git a/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp
index 4ff0724c95ca3c0cbc31dd051b6ba3afdff37fe9..b9c54acda1e8d0e1b70477427a2d8c848bbedb15 100644
--- a/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp
+++ b/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp
@@ -384,3 +384,11 @@ BOOST_AUTO_TEST_CASE(test_Optional)
     OptionalTest pc2;
     runTestWithInstances<OptionalTest>(pc, pc2);
 }
+
+
+BOOST_AUTO_TEST_CASE(test_Enum)
+{
+    BOOST_TEST_MESSAGE("Running Optional test");
+    TheIntEnum value = TheIntEnum::INT_ENUM_VALUE_2;
+    BOOST_CHECK_EQUAL(value.toString(), "INT_ENUM_VALUE_2");
+}