diff --git a/data/RobotAPI/VariantInfo-RobotAPI.xml b/data/RobotAPI/VariantInfo-RobotAPI.xml
index 9d9342ab21b51d11fd188a70c5e4cf6066afff24..8b869fe31552807e5b47222e396eefa9d564092f 100644
--- a/data/RobotAPI/VariantInfo-RobotAPI.xml
+++ b/data/RobotAPI/VariantInfo-RobotAPI.xml
@@ -344,5 +344,13 @@
             propertyName="MemoryNameSystemName"
             propertyIsOptional="true"
             propertyDefaultValue="MemoryNameSystem" />
+        <Proxy include="RobotAPI/interface/core/RobotLocalization.h"
+            humanName="GlobalRobotPoseProvider"
+            typeName="armarx::GlobalRobotPoseProviderPrx"
+            memberName="GlobalRobotPoseProvider"
+            getterName="getGlobalRobotPoseProvider"
+            propertyName="GlobalRobotPoseProviderName"
+            propertyIsOptional="true"
+            propertyDefaultValue="GlobalRobotPoseProvider" />
     </Lib>
 </VariantInfo>
diff --git a/source/RobotAPI/components/ArViz/Client/elements/Line.cpp b/source/RobotAPI/components/ArViz/Client/elements/Line.cpp
index 985162f1726a66c88c4a310e6b287641294fa9f9..35287f4d55adc284fab6bf74b02f75ecb5307880 100644
--- a/source/RobotAPI/components/ArViz/Client/elements/Line.cpp
+++ b/source/RobotAPI/components/ArViz/Client/elements/Line.cpp
@@ -1,6 +1,6 @@
 #include "Line.h"
 
-#include "ArmarXCore/interface/core/BasicVectorTypesHelpers.h"
+#include <ArmarXCore/interface/core/BasicVectorTypesHelpers.h>
 
 namespace armarx::viz
 {
@@ -17,4 +17,4 @@ namespace armarx::viz
 
         return *this;
     }
-} // namespace armarx::viz
\ No newline at end of file
+} // namespace armarx::viz
diff --git a/source/RobotAPI/components/ArViz/Client/elements/Line.h b/source/RobotAPI/components/ArViz/Client/elements/Line.h
index 6f6d9427e05b9d91606e8ecdfa8a2164f4847515..2d55b5d340f14cdd55252ec9f7f0007d625b5c7e 100644
--- a/source/RobotAPI/components/ArViz/Client/elements/Line.h
+++ b/source/RobotAPI/components/ArViz/Client/elements/Line.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include "RobotAPI/components/ArViz/Client/elements/ElementOps.h"
+#include <RobotAPI/components/ArViz/Client/elements/ElementOps.h>
 #include <RobotAPI/interface/ArViz/Elements.h>
 
 namespace armarx::viz
diff --git a/source/RobotAPI/components/ArViz/Client/elements/Path.h b/source/RobotAPI/components/ArViz/Client/elements/Path.h
index 7cfbecbd973a194cef0e0e350a5c7c3c1aedbc13..54615e9d44a0f12272ea35cecb3d62f63ccff08e 100644
--- a/source/RobotAPI/components/ArViz/Client/elements/Path.h
+++ b/source/RobotAPI/components/ArViz/Client/elements/Path.h
@@ -23,7 +23,7 @@
 
 #pragma once
 
-#include "RobotAPI/components/ArViz/Client/elements/ElementOps.h"
+#include <RobotAPI/components/ArViz/Client/elements/ElementOps.h>
 #include <RobotAPI/interface/ArViz/Elements.h>
 
 namespace armarx::viz
@@ -42,8 +42,3 @@ namespace armarx::viz
         Path& addPoint(Eigen::Vector3f p);
     };
 } // namespace armarx::viz
-
-
-
-
-
diff --git a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
index 70b399165ad3c229d96289676e0da6f2280e91a4..d5c7d69917c8cbba5fafee284b18229f351ea9de 100644
--- a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
+++ b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
@@ -32,7 +32,7 @@
 #include <VirtualRobot/VirtualRobot.h>
 #include <VirtualRobot/XML/RobotIO.h>
 
-#include "ArmarXCore/core/services/tasks/PeriodicTask.h"
+#include <ArmarXCore/core/services/tasks/PeriodicTask.h>
 #include <ArmarXCore/core/PackagePath.h>
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 #include <ArmarXCore/core/logging/Logging.h>
diff --git a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.h b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.h
index e3747fb3f23fb4429ab7a9d028d85efd3f2befaa..d401eed5e741d3d797dfaa8a47f347f4616a53db 100644
--- a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.h
+++ b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.h
@@ -3,14 +3,14 @@
 
 #include <VirtualRobot/VirtualRobot.h>
 
-#include "ArmarXCore/core/services/tasks/PeriodicTask.h"
+#include <ArmarXCore/core/services/tasks/PeriodicTask.h>
 #include <ArmarXCore/core/Component.h>
 #include <ArmarXCore/interface/observers/ObserverInterface.h>
 #include <ArmarXCore/util/tasks.h>
 
 #include <ArmarXGui/libraries/ArmarXGuiComponentPlugins/LightweightRemoteGuiComponentPlugin.h>
 
-#include "RobotAPI/libraries/armem/core/Time.h"
+#include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
 #include <RobotAPI/interface/armem/server/MemoryInterface.h>
 #include <RobotAPI/libraries/armem/client/plugins.h>
diff --git a/source/RobotAPI/components/ObjectPoseClientExample/ObjectPoseClientExample.cpp b/source/RobotAPI/components/ObjectPoseClientExample/ObjectPoseClientExample.cpp
index 43f32295717ff031d2ac9b6f54184c21b8c60e73..6359111c24ef51d35360ff8def6853f9fdae55ae 100644
--- a/source/RobotAPI/components/ObjectPoseClientExample/ObjectPoseClientExample.cpp
+++ b/source/RobotAPI/components/ObjectPoseClientExample/ObjectPoseClientExample.cpp
@@ -70,7 +70,9 @@ namespace armarx
 
         while (objectProcessingTask && !objectProcessingTask->isStopped())
         {
-            const objpose::ObjectPoseSeq objectPoses = ObjectPoseClient::getObjectPoses();
+            // This client can be copied to other classes to give them access to the object pose storage.
+            objpose::ObjectPoseClient client = getClient();
+            const objpose::ObjectPoseSeq objectPoses = client.fetchObjectPoses();
 
             ARMARX_VERBOSE << "Received poses of " << objectPoses.size() << " objects.";
 
diff --git a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp
index 161acac707955748434292a6a477637137e8712d..412b526217bec76a64391cca1de105840032778a 100644
--- a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp
+++ b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp
@@ -55,8 +55,8 @@ namespace armarx::armem::server::grasp
     void GraspMemory::onConnectComponent()
     {
 
-//        createRemoteGuiTab();
-//        RemoteGui_startRunningTask();
+       createRemoteGuiTab();
+       RemoteGui_startRunningTask();
 
     }
 
@@ -402,6 +402,7 @@ namespace armarx::armem::server::grasp
 
         RemoteGui_createTab(getName(), root, &gui.tab);
         gui.tab.rebuild = false;
+
     }
 
 
@@ -505,6 +506,7 @@ namespace armarx::armem::server::grasp
 
         if (gui.tab.rebuild)
         {
+            ARMARX_INFO << "Rebuilding remote gui tab";
             createRemoteGuiTab();
         }
     }
diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
index 0aef2635f6cec7714f654a3437fc95268e0f6963..c1bf3bc93f73ece3f5f85cf7a43a7a2d1ad270bb 100644
--- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
+++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
@@ -21,7 +21,10 @@
  */
 
 #include "RobotStateMemory.h"
+#include "RobotAPI/libraries/armem/core/forward_declarations.h"
 
+#include <RobotAPI/interface/core/PoseBase.h>
+#include <RobotAPI/libraries/core/Pose.h>
 #include <RobotAPI/libraries/armem_robot_state/server/proprioception/aron_conversions.h>
 
 #include <RobotAPI/libraries/armem_robot_state/server/common/Visu.h>
@@ -31,6 +34,10 @@
 #include <ArmarXCore/libraries/ArmarXCoreComponentPlugins/DebugObserverComponentPlugin.h>
 #include <ArmarXCore/core/logging/Logging.h>
 
+#include <IceUtil/Time.h>
+
+#include <SimoxUtility/algorithm/get_map_keys_values.h>
+#include <SimoxUtility/algorithm/contains.h>
 #include <SimoxUtility/algorithm/string.h>
 
 
@@ -182,6 +189,22 @@ namespace armarx::armem::server::robot_state
     }
 
 
+    armarx::PoseBasePtr RobotStateMemory::getGlobalRobotPose(Ice::Long timestamp_us, const std::string& robotName, const ::Ice::Current& /*unused*/)
+    {
+        auto timestamp = armem::Time::microSeconds(timestamp_us);
+        ARMARX_DEBUG << "Getting robot pose of robot " << robotName << " at timestamp " << timestamp << ".";
+
+        auto poseMap = localizationSegment.getRobotGlobalPoses(timestamp);
+        
+        bool robotNameFound = simox::alg::contains_key(poseMap, robotName);
+        ARMARX_CHECK(robotNameFound)
+            << "Robot with name " << robotName << " does not exist at or before timestamp " << timestamp << ".\n"
+            << "Available robots are: " << simox::alg::get_keys(poseMap);
+
+        return new Pose(poseMap[robotName].matrix());
+    }
+
+
     /*************************************************************/
     // RobotUnit Streaming functions
     /*************************************************************/
diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.h b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.h
index 863c9b5711a1effc010488eb9badf3195a88c8c5..d402496819431eded99b506b69fbab48e6804086 100644
--- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.h
+++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.h
@@ -39,6 +39,8 @@
 #include <RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitData.h>
 #include <RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.h>
 
+#include <RobotAPI/interface/core/RobotLocalization.h>
+
 
 namespace armarx::plugins
 {
@@ -62,7 +64,8 @@ namespace armarx::armem::server::robot_state
     class RobotStateMemory :
         virtual public armarx::Component,
         virtual public armem::server::ReadWritePluginUser,
-        virtual public armarx::ArVizComponentPluginUser
+        virtual public armarx::ArVizComponentPluginUser,
+        virtual public armarx::GlobalRobotPoseProvider
     {
     public:
 
@@ -73,6 +76,10 @@ namespace armarx::armem::server::robot_state
         std::string getDefaultName() const override;
 
 
+        // GlobalRobotPoseProvider interface
+        armarx::PoseBasePtr getGlobalRobotPose(Ice::Long timestamp, const std::string& robotName, const ::Ice::Current&) override;
+
+
     protected:
 
         armarx::PropertyDefinitionsPtr createPropertyDefinitions() override;
diff --git a/source/RobotAPI/components/units/ForceTorqueUnit.h b/source/RobotAPI/components/units/ForceTorqueUnit.h
index 30dcf8952b25685214accbd78eb108954a2378a8..d61360637f06d1d1d33ecc2d8c0fe283b7ed0b34 100644
--- a/source/RobotAPI/components/units/ForceTorqueUnit.h
+++ b/source/RobotAPI/components/units/ForceTorqueUnit.h
@@ -28,7 +28,7 @@
 #include <ArmarXCore/core/Component.h>
 #include <ArmarXCore/core/application/properties/Properties.h>
 #include <ArmarXCore/core/system/ImportExportComponent.h>
-#include "RobotAPI/components/units/SensorActorUnit.h"
+#include <RobotAPI/components/units/SensorActorUnit.h>
 
 #include <RobotAPI/interface/units/ForceTorqueUnit.h>
 
@@ -94,4 +94,3 @@ namespace armarx
         std::string listenerName;
     };
 }
-
diff --git a/source/RobotAPI/components/units/HapticUnit.h b/source/RobotAPI/components/units/HapticUnit.h
index df548dc31d42f481da979f56968d25ae89988fa9..26050b48062569e7d154ee2d82e6683e90a67589 100644
--- a/source/RobotAPI/components/units/HapticUnit.h
+++ b/source/RobotAPI/components/units/HapticUnit.h
@@ -27,7 +27,7 @@
 #include <ArmarXCore/core/Component.h>
 #include <ArmarXCore/core/application/properties/Properties.h>
 #include <ArmarXCore/core/system/ImportExportComponent.h>
-#include "RobotAPI/components/units/SensorActorUnit.h"
+#include <RobotAPI/components/units/SensorActorUnit.h>
 
 #include <RobotAPI/interface/units/HapticUnit.h>
 
@@ -83,4 +83,3 @@ namespace armarx
         HapticUnitListenerPrx hapticTopicPrx;
     };
 }
-
diff --git a/source/RobotAPI/components/units/PlatformUnit.cpp b/source/RobotAPI/components/units/PlatformUnit.cpp
index 6f5c6b07454e2ad831d48ba327b33c7cd768ddde..b60e943849edd0720eb9b523ee6518e0fced18df 100644
--- a/source/RobotAPI/components/units/PlatformUnit.cpp
+++ b/source/RobotAPI/components/units/PlatformUnit.cpp
@@ -25,7 +25,7 @@
 
 #include "PlatformUnit.h"
 
-#include "ArmarXCore/core/application/properties/PropertyDefinitionContainer.h"
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 
 #include <SimoxUtility/math/convert/mat4f_to_rpy.h>
 
diff --git a/source/RobotAPI/components/units/PlatformUnitSimulation.cpp b/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
index 0f4d58b0fbc2be757117a70aac3a213bea3f8da9..3c9cde6b67a1106976beee9032795262755a4be3 100644
--- a/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
+++ b/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
@@ -24,7 +24,7 @@
 
 
 #include "PlatformUnitSimulation.h"
-#include "RobotAPI/components/units/PlatformUnit.h"
+#include <RobotAPI/components/units/PlatformUnit.h>
 
 #include <RobotAPI/interface/core/GeometryBase.h>
 #include <cmath>
@@ -176,7 +176,7 @@ namespace armarx
                     Eigen::Rotation2Df rot(currentRotation);
                     targetVel = rot * targetVel;
                     velPID->update(timeDeltaInSeconds, currentTranslationVelocity, targetVel);
-                    currentTranslationVelocity += timeDeltaInSeconds * velPID->getControlValue();
+                    currentTranslationVelocity = timeDeltaInSeconds * velPID->getControlValue();
                     currentPositionX += timeDeltaInSeconds * currentTranslationVelocity[0];
                     currentPositionY += timeDeltaInSeconds * currentTranslationVelocity[1];
 
diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointTCPController.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointTCPController.cpp
index 23ae6d2299c3874e9f7501ef7e81c124bc4882d6..c67b41d1985b7bcfc2f9404a09878424302da9a3 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointTCPController.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointTCPController.cpp
@@ -229,7 +229,3 @@ namespace armarx
         }
     }
 } // namespace armarx
-
-
-
-
diff --git a/source/RobotAPI/interface/core/RobotLocalization.ice b/source/RobotAPI/interface/core/RobotLocalization.ice
index dbaee0f7a61dd6b95244e55e06b08bf50e4febec..6e5b38a32d000f219f8a868dfa8d869945637249 100644
--- a/source/RobotAPI/interface/core/RobotLocalization.ice
+++ b/source/RobotAPI/interface/core/RobotLocalization.ice
@@ -24,10 +24,15 @@
 
 #pragma once
 
+#include <RobotAPI/interface/armem/server/MemoryInterface.ice>
 #include <RobotAPI/interface/core/GeometryBase.ice>
+#include <RobotAPI/interface/core/PoseBase.ice>
 
 module armarx{
-
+    interface GlobalRobotPoseProvider extends armem::server::MemoryInterface {
+        // timestamp in microseconds
+        PoseBase getGlobalRobotPose(long timestamp, string robotName);
+    }
 
     interface GlobalRobotPoseLocalizationListener{
         void reportGlobalRobotPose(TransformStamped currentPose);
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp
index de740d244c3e671016956df0b526065b21d3638c..8710af33c07522713bd833e53c7f1e982754e3ec 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.cpp
@@ -54,6 +54,17 @@ namespace armarx::objpose
         }
         return map;
     }
+    
+    ObjectPoseSeq ObjectPoseClient::fetchObjectPosesFromProvider(const std::string& providerName) 
+    {
+        if (!objectPoseStorage)
+        {
+            ARMARX_WARNING << "No object pose observer.";
+            return {};
+        }
+        return fromIce(objectPoseStorage->getObjectPosesByProvider(providerName));
+    }
+
 
 
     const ObjectPoseStorageInterfacePrx&
@@ -70,4 +81,3 @@ namespace armarx::objpose
     }
 
 }
-
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h
index 2e262cc155944c4d9d3cebd6ca57d2b8130da595..33f9a6dd7b40fd933a451d50d093afc937a08635 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h
@@ -27,9 +27,13 @@ namespace armarx::objpose
 
         ObjectPoseSeq
         fetchObjectPoses();
+
         ObjectPoseMap
         fetchObjectPosesAsMap();
 
+        ObjectPoseSeq
+        fetchObjectPosesFromProvider(const std::string& providerName);
+
 
         const ObjectPoseStorageInterfacePrx&
         getObjectPoseStorage() const;
diff --git a/source/RobotAPI/libraries/ArmarXObjects/Scene.h b/source/RobotAPI/libraries/ArmarXObjects/Scene.h
index a4cc41d80b5fccc87b1e9d871808c685ce332401..3c2767c017ce2ac19faef9bde78b7ede5bba8b13 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/Scene.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/Scene.h
@@ -24,6 +24,7 @@
 #include <map>
 #include <string>
 #include <vector>
+#include <optional>
 
 #include <Eigen/Core>
 #include <Eigen/Geometry>
@@ -43,6 +44,7 @@ namespace armarx::objects
         Eigen::Vector3f position = Eigen::Vector3f::Zero();
         Eigen::Quaternionf orientation = Eigen::Quaternionf::Identity();
 
+        std::optional<bool> isStatic;
         std::map<std::string, float> jointValues;
 
         ObjectID getClassID() const;
diff --git a/source/RobotAPI/libraries/ArmarXObjects/json_conversions.cpp b/source/RobotAPI/libraries/ArmarXObjects/json_conversions.cpp
index 617baca941ebb86be7e3b05ecac1e79efc23490c..161983900123a6848d2e667258236f2bd95aa33a 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/json_conversions.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/json_conversions.cpp
@@ -79,31 +79,51 @@ void armarx::objpose::from_json(const nlohmann::json& j, ObjectPose& op)
 
 void armarx::objects::to_json(nlohmann::json& j, const SceneObject& rhs)
 {
-    //     j["instanceID"] = rhs.instanceID;
     j["class"] = rhs.className;
     j["instanceName"] = rhs.instanceName;
     j["collection"] = rhs.collection;
     j["position"] = rhs.position;
     j["orientation"] = rhs.orientation;
+    if (rhs.isStatic.has_value())
+    {
+        j["isStatic"] = rhs.isStatic.value();
+    }
     j["jointValues"] = rhs.jointValues;
 }
 
 
 void armarx::objects::from_json(const nlohmann::json& j, SceneObject& rhs)
 {
-    //     j.at("instanceID").get_to(rhs.instanceID);
     j.at("class").get_to(rhs.className);
     if (j.count("instanceName"))
     {
         j["instanceName"].get_to(rhs.instanceName);
     }
+    else
+    {
+        rhs.instanceName.clear();
+    }
     j.at("collection").get_to(rhs.collection);
     j.at("position").get_to(rhs.position);
     j.at("orientation").get_to(rhs.orientation);
+
+    if (j.count("isStatic"))
+    {
+        rhs.isStatic = j.at("isStatic").get<bool>();
+    }
+    else
+    {
+        rhs.isStatic = std::nullopt;
+    }
+
     if (j.count("jointValues"))
     {
         j.at("jointValues").get_to(rhs.jointValues);
     }
+    else
+    {
+        rhs.jointValues.clear();
+    }
 }
 
 
diff --git a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
index a2b3ef47343443b4ac0e1fc85c9f33f52ccc857e..62161ff5cafce827a99191e97ce7bfa6bb2abee4 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.cpp
@@ -72,6 +72,12 @@ namespace armarx
         return objpose::fromIce(objectPoseStorage->getObjectPoses());
     }
 
+    objpose::ObjectPoseSeq ObjectPoseClientPluginUser::getObjectPosesByProvider(const std::string& providerName)
+    {
+        return objpose::ObjectPoseClient(objectPoseStorage, getObjectFinder()).fetchObjectPosesFromProvider(providerName);
+    }
+
+
     plugins::ObjectPoseClientPlugin& ObjectPoseClientPluginUser::getObjectPoseClientPlugin()
     {
         return *plugin;
@@ -86,4 +92,3 @@ namespace armarx
         return plugin->getObjectFinder();
     }
 }
-
diff --git a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
index 9f72ab1eb4b96542352eb34e64e3955382b2c0d2..00c53d4ead2c77fce8710312648d54ce59b29742 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/plugins/ObjectPoseClientPlugin.h
@@ -79,6 +79,8 @@ namespace armarx
 
 
         objpose::ObjectPoseSeq getObjectPoses();
+        objpose::ObjectPoseSeq getObjectPosesByProvider(const std::string& providerName);
+
 
         plugins::ObjectPoseClientPlugin& getObjectPoseClientPlugin();
         const plugins::ObjectPoseClientPlugin& getObjectPoseClientPlugin() const;
diff --git a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp
index 8f875542bce9f7a5ed3fe91bc697eb3cd76e1edf..af59f5fa837a3d80e199350ee9da562bc5745703 100644
--- a/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp
+++ b/source/RobotAPI/libraries/GraspingUtility/GraspCandidateReader.cpp
@@ -246,7 +246,6 @@ namespace armarx::armem
     void GraspCandidateReader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
     {
         ARMARX_DEBUG << "GraspCandidateReader: registerPropertyDefinitions";
-        registerPropertyDefinitions(def);
 
         const std::string prefix = propertyPrefix;
 
diff --git a/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp b/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp
index 743d8a9bc2904a707f42633567f9b59ef184c3af..d0c7371051effc8f00a007687723ece0e2fa5cb9 100644
--- a/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp
@@ -1,7 +1,7 @@
 #include "HeartbeatComponentPlugin.h"
 
-#include "ArmarXCore/core/Component.h"
-#include "ArmarXCore/core/exceptions/local/ExpressionException.h"
+#include <ArmarXCore/core/Component.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
 #include <RobotAPI/interface/components/RobotHealthInterface.h>
 
diff --git a/source/RobotAPI/libraries/armem/client/query/selectors.cpp b/source/RobotAPI/libraries/armem/client/query/selectors.cpp
index ecd3f8c5f4a1b3ed0a7dde04c8dc1ac8a06b5265..0ea7000b229edce38d8a797d3b542d180c2de17a 100644
--- a/source/RobotAPI/libraries/armem/client/query/selectors.cpp
+++ b/source/RobotAPI/libraries/armem/client/query/selectors.cpp
@@ -1,5 +1,5 @@
 #include "selectors.h"
-#include "RobotAPI/libraries/armem/core/ice_conversions.h"
+#include <RobotAPI/libraries/armem/core/ice_conversions.h>
 
 #include <RobotAPI/libraries/armem/core/wm/ice_conversions.h>
 
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp
index c4e703531a9508757a00e6c1dbf5429c7436b470..f26a62736999d28a55001dbaee56d515c6cdd16c 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp
@@ -9,9 +9,9 @@
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/system/ArmarXDataPath.h>
 
-#include "RobotAPI/libraries/ArmarXObjects/ObjectInfo.h"
-#include "RobotAPI/libraries/ArmarXObjects/ObjectPose.h"
-#include "RobotAPI/libraries/armem_objects/aron_conversions.h"
+#include <RobotAPI/libraries/ArmarXObjects/ObjectInfo.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
+#include <RobotAPI/libraries/armem_objects/aron_conversions.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>
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 64dfbc7f546bfc887fd408e444ad2332b8a8aaa0..9a4417080bb027e4ee8d4a9cf0c2dc080fca3890 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
@@ -5,11 +5,11 @@
 
 #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/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>
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/utils.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/utils.h
index 9c5b48f39864b16637739b022c0d1908de69c9a5..5bb773c96354b108185811137602bdc443c0f9a7 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/utils.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/utils.h
@@ -3,7 +3,7 @@
 #include <optional>
 
 #include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
-#include "RobotAPI/libraries/armem_robot/types.h"
+#include <RobotAPI/libraries/armem_robot/types.h>
 #include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
 
 
@@ -13,4 +13,4 @@ namespace armarx::armem::articulated_object
     std::optional<robot::RobotDescription>
     convertRobotDescription(const armem::wm::EntityInstance& instance);
 
-} // namespace armarx::armem::articulated_object
\ No newline at end of file
+} // namespace armarx::armem::articulated_object
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.cpp
index f1b90e5daec4edf42590ce0d8aad7a4aa9d83838..a8060557502fa895f8d632288e32a1c3e0abd5f0 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/ArticulatedObjectVisu.cpp
@@ -4,7 +4,7 @@
 
 #include <SimoxUtility/math/pose.h>
 
-#include "ArmarXCore/core/services/tasks/PeriodicTask.h"
+#include <ArmarXCore/core/services/tasks/PeriodicTask.h>
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/time/CycleUtil.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 485715690f3fdbfe089f3557582bae86ef7210ad..72faed5fee3f85ff9e34d8e3b821c33598d52f37 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -32,6 +32,7 @@
 #include <ArmarXCore/core/time/TimeUtil.h>
 
 #include <SimoxUtility/algorithm/get_map_keys_values.h>
+#include <SimoxUtility/algorithm/string.h>
 #include <SimoxUtility/json.h>
 #include <SimoxUtility/math/pose/pose.h>
 
@@ -100,8 +101,9 @@ namespace armarx::armem::server::obj::instance
         defs->optional(p.sceneSnapshotsDirectory, prefix + "scene.11_Directory",
                        "Directory in Package/data/Package/ containing the scene snapshots.");
         defs->optional(p.sceneSnapshotToLoad, prefix + "scene.12_SnapshotToLoad",
-                       "Scene snapshot to load on startup (e.g. 'Scene_2021-06-24_20-20-03').\n"
-                       "You can also specify paths relative to 'Package/scenes/'.");
+                       "Scene to load on startup (e.g. 'Scene_2021-06-24_20-20-03').\n"
+                       "You can also specify paths relative to 'Package/scenes/'. \n"
+                       "You can also specify a ; separated list of scenes.");
 
         decay.defineProperties(defs, prefix + "decay.");
     }
@@ -113,8 +115,13 @@ namespace armarx::armem::server::obj::instance
 
         if (not p.sceneSnapshotToLoad.empty())
         {
-            bool lockMemory = false;
-            commitSceneSnapshotFromFilename(p.sceneSnapshotToLoad, lockMemory);
+            bool trim = true;
+            const std::vector<std::string> scenes = simox::alg::split(p.sceneSnapshotToLoad, ";", trim);
+            for (const std::string& scene : scenes)
+            {
+                const bool lockMemory = false;
+                commitSceneSnapshotFromFilename(scene, lockMemory);
+            }
         }
     }
 
@@ -936,7 +943,8 @@ namespace armarx::armem::server::obj::instance
 
             pose.providerName = sceneName;
             pose.objectType = objpose::ObjectType::KnownObject;
-            pose.isStatic = true;  // Objects loaded from prior knowledge are considerd static to exclude them from decay.
+            // If not specified, assume loaded objects are static.
+            pose.isStatic = object.isStatic.has_value() ? object.isStatic.value() : true;
             pose.objectID = classID.withInstanceName(
                                 object.instanceName.empty()
                                 ? std::to_string(idCounters[classID]++)
diff --git a/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp
index 1bf28496f697da38e2172a41836ecaccceaa5561..0ab9ff1a46f9e756471ccf8d257e966dcfb7f2ef 100644
--- a/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp
@@ -1,6 +1,6 @@
 #include "aron_conversions.h"
 
-#include "ArmarXCore/core/logging/Logging.h"
+#include <ArmarXCore/core/logging/Logging.h>
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
 
 #include <RobotAPI/libraries/ArmarXObjects/ObjectID.h>
diff --git a/source/RobotAPI/libraries/armem_robot/types.h b/source/RobotAPI/libraries/armem_robot/types.h
index 0a8473073f5b30dce3cb9f2d96682b4184a6a9b3..10ca7475f0d119aeb8f40e2f0d674bb3a6450691 100644
--- a/source/RobotAPI/libraries/armem_robot/types.h
+++ b/source/RobotAPI/libraries/armem_robot/types.h
@@ -8,8 +8,8 @@
 
 #include <IceUtil/Time.h>
 
-#include "ArmarXCore/core/exceptions/local/ExpressionException.h"
-#include "RobotAPI/libraries/ArmarXObjects/ObjectID.h"
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectID.h>
 #include <ArmarXCore/core/PackagePath.h>
 
 
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 6610085a42af19314fdd5f3a062da01dcd1f8cb2..b3dee3440967cf79ae9feee73403116345a23cbf 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp
@@ -1,7 +1,9 @@
 #include "RobotReader.h"
 
+#include <chrono>
 #include <mutex>
 #include <optional>
+#include <thread>
 
 #include <ArmarXCore/core/PackagePath.h>
 #include <ArmarXCore/core/exceptions/LocalException.h>
@@ -91,19 +93,48 @@ namespace armarx::armem::robot_state
         return robot;
     }
 
+    void
+    RobotReader::setSyncTimeout(const armem::Time& duration)
+    {
+        syncTimeout = duration;
+    }
+
+    void
+    RobotReader::setSleepAfterSyncFailure(const armem::Time& duration)
+    {
+        ARMARX_CHECK_NONNEGATIVE(duration.toMicroSeconds());
+        sleepAfterFailure = duration;
+    }
+
     bool
     RobotReader::synchronize(robot::Robot& obj, const armem::Time& timestamp)
     {
-        auto state = queryState(obj.description, timestamp);
+        const auto tsStartFunctionInvokation = armem::Time::now();
 
-        if (not state) /* c++20 [[unlikely]] */
+        while (true)
         {
-            ARMARX_WARNING << "Could not synchronize object " << obj.description.name;
-            return false;
-        }
+            auto state = queryState(obj.description, timestamp);
+
+            if (not state) /* c++20 [[unlikely]] */
+            {
+                ARMARX_VERBOSE << "Could not synchronize object " << obj.description.name;
+
+                // if the syncTime is non-positive there will be no retry
+                const auto elapsedTime = armem::Time::now() - tsStartFunctionInvokation;
+                if (elapsedTime > syncTimeout)
+                {
+                    ARMARX_WARNING << "Could not synchronize object " << obj.description.name;
+                    return false;
+                }
+
+                ARMARX_INFO << "Retrying to query robot state after failure";
+                std::this_thread::sleep_for(
+                    std::chrono::microseconds(sleepAfterFailure.toMicroSeconds()));
+            }
 
-        obj.config = std::move(*state);
-        return true;
+            obj.config = std::move(*state);
+            return true;
+        }
     }
 
     std::optional<robot::RobotDescription>
@@ -117,7 +148,7 @@ namespace armarx::armem::robot_state
         .coreSegments().all() // withName(properties.descriptionCoreSegment)
         .providerSegments().all() // .withName(name)
         .entities().all()
-        .snapshots().latest(); // TODO(fabian.reister): atTime(timestamp);
+        .snapshots().beforeOrAtTime(timestamp);
         // clang-format on
 
         ARMARX_DEBUG << "Lookup query in reader";
@@ -188,7 +219,7 @@ namespace armarx::armem::robot_state
         .coreSegments().withName(properties.proprioceptionCoreSegment)
         .providerSegments().withName(description.name) // agent
         .entities().all() // TODO
-        .snapshots().latest();
+        .snapshots().beforeOrAtTime(timestamp);
         // clang-format on
 
         const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
@@ -252,7 +283,7 @@ namespace armarx::armem::robot_state
         .coreSegments().withName(properties.proprioceptionCoreSegment)
         .providerSegments().withName(description.name) // agent
         .entities().all() // TODO
-        .snapshots().latest();
+        .snapshots().beforeOrAtTime(timestamp);
         // clang-format on
 
         const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
@@ -322,8 +353,8 @@ namespace armarx::armem::robot_state
     std::optional<AronClass>
     tryCast(const wm::EntityInstance& item)
     {
-        static_assert(
-            std::is_base_of<armarx::aron::codegenerator::cpp::AronGeneratedClass, AronClass>::value);
+        static_assert(std::is_base_of<armarx::aron::codegenerator::cpp::AronGeneratedClass,
+                                      AronClass>::value);
 
         try
         {
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h
index 20cafbd2225160c7b9abacc2d73b981f60260e34..46b0924fc2cb06ebee34ff8b61174746939dd7dc 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h
+++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h
@@ -24,6 +24,7 @@
 #include <mutex>
 #include <optional>
 
+#include "RobotAPI/libraries/armem/core/Time.h"
 #include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
 #include <RobotAPI/libraries/armem/client/Reader.h>
 #include <RobotAPI/libraries/armem_robot/client/interfaces.h>
@@ -67,10 +68,10 @@ namespace armarx::armem::robot_state
                         const armem::Time& timestamp) const;
 
         using JointTrajectory = std::map<armem::Time, robot::RobotState::JointMap>;
-        
-        JointTrajectory
-        queryJointStates(const robot::RobotDescription& description,
-                        const armem::Time& begin, const armem::Time& end) const;
+
+        JointTrajectory queryJointStates(const robot::RobotDescription& description,
+                                         const armem::Time& begin,
+                                         const armem::Time& end) const;
 
         std::optional<robot::RobotState::Pose>
         queryGlobalPose(const robot::RobotDescription& description,
@@ -80,6 +81,8 @@ namespace armarx::armem::robot_state
         queryPlatformState(const robot::RobotDescription& description,
                            const armem::Time& timestamp) const;
 
+        void setSyncTimeout(const armem::Time& duration);
+        void setSleepAfterSyncFailure(const armem::Time& duration);
 
         enum class Hand
         {
@@ -96,6 +99,11 @@ namespace armarx::armem::robot_state
                           const armem::Time& start,
                           const armem::Time& end) const;
 
+    protected:
+        // by default, no timeout mechanism
+        armem::Time syncTimeout = armem::Time::microSeconds(0);
+        armem::Time sleepAfterFailure = armem::Time::microSeconds(0);
+
     private:
         std::optional<robot::RobotState> getRobotState(const armarx::armem::wm::Memory& memory,
                                                        const std::string& name) const;
@@ -106,9 +114,8 @@ namespace armarx::armem::robot_state
         std::optional<robot::RobotState::JointMap>
         getRobotJointState(const armarx::armem::wm::Memory& memory, const std::string& name) const;
 
-        JointTrajectory
-        getRobotJointStates(const armarx::armem::wm::Memory& memory,
-                                    const std::string& name) const;
+        JointTrajectory getRobotJointStates(const armarx::armem::wm::Memory& memory,
+                                            const std::string& name) const;
 
         std::optional<robot::PlatformState>
         getRobotPlatformState(const armarx::armem::wm::Memory& memory,
@@ -117,7 +124,7 @@ namespace armarx::armem::robot_state
         std::map<RobotReader::Hand, robot::ForceTorque>
         getForceTorque(const armarx::armem::wm::Memory& memory, const std::string& name) const;
 
- 
+
         std::map<RobotReader::Hand, std::map<armem::Time, robot::ForceTorque>>
         getForceTorques(const armarx::armem::wm::Memory& memory, const std::string& name) const;
 
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 0907cb70b01220686d2b6b30a2d5577c1e6838c3..5ef7564f8a0e374060114d0391bfaeebf1df6198 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp
@@ -1,14 +1,16 @@
 #include "VirtualRobotReader.h"
 
 #include <optional>
+#include <thread>
 
 #include <VirtualRobot/Robot.h>
+#include <VirtualRobot/VirtualRobot.h>
 #include <VirtualRobot/XML/RobotIO.h>
 
-#include "ArmarXCore/core/PackagePath.h"
-#include "ArmarXCore/core/logging/Logging.h"
-#include "ArmarXCore/core/system/ArmarXDataPath.h"
-#include "ArmarXCore/core/system/cmake/CMakePackageFinder.h"
+#include <ArmarXCore/core/PackagePath.h>
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/system/ArmarXDataPath.h>
+#include <ArmarXCore/core/system/cmake/CMakePackageFinder.h>
 
 
 namespace armarx::armem::robot_state
@@ -19,30 +21,33 @@ namespace armarx::armem::robot_state
     {
     }
 
-    void VirtualRobotReader::connect()
+    void
+    VirtualRobotReader::connect()
     {
         RobotReader::connect();
     }
 
     // TODO(fabian.reister): register property defs
-    void VirtualRobotReader::registerPropertyDefinitions(::armarx::PropertyDefinitionsPtr& def)
+    void
+    VirtualRobotReader::registerPropertyDefinitions(::armarx::PropertyDefinitionsPtr& def)
     {
         RobotReader::registerPropertyDefinitions(def);
     }
 
-    bool VirtualRobotReader::synchronizeRobot(VirtualRobot::Robot& robot,
-            const armem::Time& timestamp)
+    bool
+    VirtualRobotReader::synchronizeRobot(VirtualRobot::Robot& robot, const armem::Time& timestamp)
     {
         const auto packages = armarx::CMakePackageFinder::FindAllArmarXSourcePackages();
         const auto package = armarx::ArmarXDataPath::getProject(packages, robot.getFilename());
 
-        const robot::RobotDescription robotDescription{.name = robot.getName(),
-                .xml = PackagePath{package, robot.getFilename()}};
+        const robot::RobotDescription robotDescription{
+            .name = robot.getName(), .xml = PackagePath{package, robot.getFilename()}};
 
         const auto robotState = queryState(robotDescription, timestamp);
         if (not robotState)
         {
-            ARMARX_WARNING << "Querying robot state failed for robot `" << robot.getName() << " / " << robot.getType() << "`!";
+            ARMARX_WARNING << "Querying robot state failed for robot `" << robot.getName() << " / "
+                           << robot.getType() << "`!";
             return false;
         }
 
@@ -52,9 +57,10 @@ namespace armarx::armem::robot_state
         return true;
     }
 
-    VirtualRobot::RobotPtr VirtualRobotReader::getRobot(const std::string& name,
-            const armem::Time& timestamp,
-            const VirtualRobot::RobotIO::RobotDescription& loadMode)
+    VirtualRobot::RobotPtr
+    VirtualRobotReader::getRobot(const std::string& name,
+                                 const armem::Time& timestamp,
+                                 const VirtualRobot::RobotIO::RobotDescription& loadMode)
     {
         ARMARX_INFO << "Querying robot description for robot '" << name << "'";
         const auto description = queryDescription(name, timestamp);
@@ -64,24 +70,42 @@ namespace armarx::armem::robot_state
             return nullptr;
         }
 
-        const std::string xmlFilename = ArmarXDataPath::resolvePath(description->xml.serialize().path);
-        ARMARX_INFO << "Loading (virtual) robot '" << description->name << "' from XML file '" << xmlFilename << "'";
+        const std::string xmlFilename =
+            ArmarXDataPath::resolvePath(description->xml.serialize().path);
+        ARMARX_INFO << "Loading (virtual) robot '" << description->name << "' from XML file '"
+                    << xmlFilename << "'";
 
         auto robot = VirtualRobot::RobotIO::loadRobot(xmlFilename, loadMode);
         robot->setName(name);
+
+        synchronizeRobot(*robot, timestamp);
+
         return robot;
     }
 
 
-    VirtualRobot::RobotPtr VirtualRobotReader::getSynchronizedRobot(const std::string& name,
-            const armem::Time& timestamp,
-            const VirtualRobot::RobotIO::RobotDescription& loadMode)
+    VirtualRobot::RobotPtr
+    VirtualRobotReader::getSynchronizedRobot(
+        const std::string& name,
+        const armem::Time& timestamp,
+        const VirtualRobot::RobotIO::RobotDescription& loadMode,
+        const bool blocking)
     {
-        auto robot = getRobot(name, timestamp, loadMode);
-
-        synchronizeRobot(*robot, timestamp);
+        while (blocking)
+        {
+            VirtualRobot::RobotPtr robot = getRobot(name, timestamp, loadMode);
+            if (robot and synchronizeRobot(*robot, timestamp))
+            {
+                return robot;
+            }
+
+            ARMARX_INFO << "Retrying to query robot after failure";
+            std::this_thread::sleep_for(
+                std::chrono::microseconds(sleepAfterFailure.toMicroSeconds()));
+        }
 
-        return robot;
+        ARMARX_WARNING << "Failed to get synchronized robot `" << name << "`";
+        return nullptr;
     }
 
 
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h
index 68c0d5e7df911f23b06fcc582108bbf9f205e49c..c14e60aee78a490bd1ffb0937ca008dc56895499 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h
+++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h
@@ -21,12 +21,12 @@
 
 #pragma once
 
-#include "RobotReader.h"
-
 #include <VirtualRobot/Robot.h>
 #include <VirtualRobot/VirtualRobot.h>
 #include <VirtualRobot/XML/RobotIO.h>
 
+#include "RobotReader.h"
+
 
 namespace armarx::armem::robot_state
 {
@@ -42,7 +42,7 @@ namespace armarx::armem::robot_state
     {
     public:
         VirtualRobotReader(armem::client::MemoryNameSystem& memoryNameSystem);
-        virtual ~VirtualRobotReader() = default;
+        ~VirtualRobotReader() override = default;
 
         void connect();
         void registerPropertyDefinitions(::armarx::PropertyDefinitionsPtr& def);
@@ -59,7 +59,8 @@ namespace armarx::armem::robot_state
         getSynchronizedRobot(const std::string& name,
                              const armem::Time& timestamp,
                              const VirtualRobot::RobotIO::RobotDescription& loadMode =
-                                 VirtualRobot::RobotIO::RobotDescription::eStructure);
+                                 VirtualRobot::RobotIO::RobotDescription::eStructure,
+                             bool blocking = true);
     };
 
 } // namespace armarx::armem::robot_state
diff --git a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp
index 2b2c942490e2b7527552881cbf1be5e8a4c11cff..21b8e55a9fa9c74d63f61dc67aea86bce381c01f 100644
--- a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp
@@ -151,7 +151,7 @@ namespace armarx::armem::client::robot_state::localization
         .coreSegments().withName(properties.localizationSegment)
         .providerSegments().withName(query.header.agent) // agent
         .entities().all() // parentFrame,frame
-        .snapshots().latest();
+        .snapshots().beforeOrAtTime(query.header.timestamp);
         // clang-format on
 
         const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
diff --git a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp
index dbf23a23772f1399aac9045593409e6c2d66c669..a595d5502c7139e51d9e940d71f24925ab39f199 100644
--- a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp
@@ -5,6 +5,8 @@
 #include <SimoxUtility/math/pose/interpolate.h>
 
 #include <ArmarXCore/core/exceptions/LocalException.h>
+#include "ArmarXCore/core/exceptions/local/ExpressionException.h"
+
 #include <RobotAPI/libraries/core/FramedPose.h>
 
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
@@ -249,7 +251,10 @@ namespace armarx::armem::common::robot_state::localization
         // }
 
         std::vector<::armarx::armem::robot_state::Transform> transforms;
-        transforms.push_back(_convertEntityToTransform(entity.getLatestSnapshot().getInstance(0)));
+
+        auto snapshot = entity.findLatestSnapshotBeforeOrAt(timestamp);
+        ARMARX_CHECK(snapshot) << "No snapshot found before or at time " << timestamp;
+        transforms.push_back(_convertEntityToTransform(snapshot->getInstance(0)));
 
         // ARMARX_DEBUG << "obtaining transform";
         if (transforms.size() > 1)
diff --git a/source/RobotAPI/libraries/armem_robot_state/common/localization/types.h b/source/RobotAPI/libraries/armem_robot_state/common/localization/types.h
index e16d599ba8fdd21f653a951ea16fdda6571bf243..26311961772c03b70519de0cde245b44e17bf0db 100644
--- a/source/RobotAPI/libraries/armem_robot_state/common/localization/types.h
+++ b/source/RobotAPI/libraries/armem_robot_state/common/localization/types.h
@@ -26,7 +26,7 @@
 
 #include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 
-#include <Eigen/src/Geometry/Transform.h>
+
 #include <RobotAPI/libraries/armem_robot_state/types.h>
 
 namespace armarx::armem::common::robot_state::localization
@@ -79,4 +79,4 @@ namespace armarx::armem::common::robot_state::localization
         // bool exact;
     };
 
-}  // namespace armarx::armem::common::robot_state::localization
\ No newline at end of file
+}  // namespace armarx::armem::common::robot_state::localization
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.cpp b/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.cpp
index 051ab03e793a0afceca524e007b834f4f510e6a0..67d537d19cf74af3da62dc72ae217f996977433f 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.cpp
@@ -12,6 +12,7 @@
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/time/CycleUtil.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
+#include <ArmarXCore/interface/core/PackagePath.h>
 
 #include <RobotAPI/libraries/armem/core/Time.h>
 
@@ -79,7 +80,7 @@ namespace armarx::armem::server::robot_state
     {
         for (const robot::Robot& robot : robots)
         {
-            const data::PackagePath xmlPath = robot.description.xml.serialize();
+            const armarx::data::PackagePath xmlPath = robot.description.xml.serialize();
 
             // clang-format off
             viz::Robot robotVisu = viz::Robot(robot.description.name)
diff --git a/source/RobotAPI/libraries/armem_robot_state/utils.h b/source/RobotAPI/libraries/armem_robot_state/utils.h
index 239e0ddb2d1b99a513ed97a3e1b8fb63122a4c70..9b495f91f30544fbdb2cfc2f68ee10bb111e1903 100644
--- a/source/RobotAPI/libraries/armem_robot_state/utils.h
+++ b/source/RobotAPI/libraries/armem_robot_state/utils.h
@@ -1,10 +1,9 @@
 #pragma once
 
-#include "RobotAPI/libraries/armem/core/MemoryID.h"
-#include "RobotAPI/libraries/armem_robot/types.h"
+#include <RobotAPI/libraries/armem/core/MemoryID.h>
+#include <RobotAPI/libraries/armem_robot/types.h>
 
 namespace armarx::armem::robot_state
 {
     armarx::armem::MemoryID makeMemoryID(const robot::RobotDescription& desc);
 }
-
diff --git a/source/RobotAPI/libraries/armem_vision/aron_conversions.h b/source/RobotAPI/libraries/armem_vision/aron_conversions.h
index 53527f2b5ad9357c8f9bd627b2c3d83793e7c9a8..681049dac2250e30ad6a3ccee5f25cc6412b074e 100644
--- a/source/RobotAPI/libraries/armem_vision/aron_conversions.h
+++ b/source/RobotAPI/libraries/armem_vision/aron_conversions.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include "RobotAPI/libraries/armem_vision/types.h"
+#include <RobotAPI/libraries/armem_vision/types.h>
 #include <RobotAPI/interface/units/LaserScannerUnit.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/armem_vision/aron/OccupancyGrid.aron.generated.h>
@@ -79,4 +79,4 @@ namespace armarx::armem
         return aron::converter::AronEigenConverter::ConvertFromArray(grid);
     }
 
-} // namespace armarx::armem
\ No newline at end of file
+} // namespace armarx::armem
diff --git a/source/RobotAPI/libraries/aron/common/aron_conversions/armarx.cpp b/source/RobotAPI/libraries/aron/common/aron_conversions/armarx.cpp
index 2cd6b7eb906d4b85cf6527979eb9573f4d9568ea..d408f45ef12fe9ac8624469e6a25326e96498295 100644
--- a/source/RobotAPI/libraries/aron/common/aron_conversions/armarx.cpp
+++ b/source/RobotAPI/libraries/aron/common/aron_conversions/armarx.cpp
@@ -1,6 +1,6 @@
 #include "armarx.h"
 
-#include <Eigen/src/Core/Matrix.h>
+
 #include <RobotAPI/libraries/aron/common/aron_conversions/core.h>
 #include <RobotAPI/libraries/aron/common/aron_conversions/stl.h>
 
diff --git a/source/RobotAPI/libraries/aron/converter/eigen/EigenConverter.h b/source/RobotAPI/libraries/aron/converter/eigen/EigenConverter.h
index 56f6690c41d8eef765a0788312d8dff220d92695..e1213b86b1f2f6386fb22d318f4ed798a72eb040 100644
--- a/source/RobotAPI/libraries/aron/converter/eigen/EigenConverter.h
+++ b/source/RobotAPI/libraries/aron/converter/eigen/EigenConverter.h
@@ -28,7 +28,7 @@
 // Eigen
 #include <Eigen/Geometry>
 #include <Eigen/Core>
-#include <Eigen/src/Core/util/Constants.h>
+
 
 // ArmarX
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
diff --git a/source/RobotAPI/libraries/core/Pose.cpp b/source/RobotAPI/libraries/core/Pose.cpp
index f837f87117f5c8934ab5430af9491277010cb4e9..4849196ad868ebc11c5247c780e9dd6ea41814a6 100644
--- a/source/RobotAPI/libraries/core/Pose.cpp
+++ b/source/RobotAPI/libraries/core/Pose.cpp
@@ -432,3 +432,8 @@ armarx::PosePtr armarx::toIce(const Eigen::Matrix4f& pose)
 {
     return new Pose(pose);
 }
+
+armarx::PosePtr armarx::toIce(const Eigen::Isometry3f& pose)
+{
+    return armarx::toIce(pose.matrix());
+}
diff --git a/source/RobotAPI/libraries/core/Pose.h b/source/RobotAPI/libraries/core/Pose.h
index 268b6ba846022f0586fbdfafb5cf8d2999665c55..2748a0ded0a959633c3a44a1c8dd3f1c789c6ff6 100644
--- a/source/RobotAPI/libraries/core/Pose.h
+++ b/source/RobotAPI/libraries/core/Pose.h
@@ -289,6 +289,7 @@ namespace armarx
     QuaternionPtr toIce(const Eigen::Matrix3f& rotation);
     QuaternionPtr toIce(const Eigen::Quaternionf& quaternion);
     PosePtr toIce(const Eigen::Matrix4f& pose);
+    PosePtr toIce(const Eigen::Isometry3f& pose);
 
 }