diff --git a/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.cpp b/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.cpp
index 2a1f02718bb8b1fa9465445086238a4e04ba92dd..a89af6168a5f66f366a4df3a36b59c01906a0695 100644
--- a/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.cpp
+++ b/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.cpp
@@ -24,6 +24,7 @@
 
 #include <SimoxUtility/algorithm/string/string_tools.h>
 
+#include "ArmarXCore/core/time/Clock.h"
 #include <ArmarXCore/core/time/DateTime.h>
 #include <ArmarXCore/core/time/Duration.h>
 #include <ArmarXCore/core/time/ice_conversions.h>
@@ -45,9 +46,9 @@ HokuyoLaserUnit::onInitComponent()
     offeringTopicFromProperty("RobotHealthTopicName");
     offeringTopicFromProperty("DebugObserverName");
 
-    topicName = getProperty<std::string>("LaserScannerTopicName").getValue();
-    offeringTopic(topicName);
-    ARMARX_INFO << "Going to report on topic " << topicName;
+    laserScannerListenerProxyName = getProperty<std::string>("LaserScannerListenerName").getValue();
+    usingProxyFromProperty("LaserScannerListenerName");
+    ARMARX_INFO << "Going to report to listener " << laserScannerListenerProxyName;
     updatePeriod = getProperty<int>("UpdatePeriod").getValue();
     angleOffset = getProperty<float>("AngleOffset").getValue();
 
@@ -92,7 +93,7 @@ HokuyoLaserUnit::onConnectComponent()
 {
     ARMARX_TRACE;
 
-    topic = getTopic<LaserScannerUnitListenerPrx>(topicName);
+    getProxyFromProperty(listenerPrx, "LaserScannerListenerName");
     debugObserver = getTopic<DebugObserverInterfacePrx>(
         getProperty<std::string>("DebugObserverName").getValue());
 
@@ -133,7 +134,7 @@ HokuyoLaserUnit::onConnectComponent()
         info.stepSize = (info.maxAngle - info.minAngle) / (maxStep - minStep);
         device.lengthData.resize(lengthDataSize);
 
-        device.scanTopic = topic;
+        device.listenerPrx = listenerPrx;
         device.robotHealthPlugin = heartbeat;
         device.debugObserver = debugObserver;
 
@@ -181,7 +182,7 @@ HokuyoLaserUnit::createPropertyDefinitions()
 std::string
 HokuyoLaserUnit::getReportTopicName(const Ice::Current&) const
 {
-    return topicName;
+    return laserScannerListenerProxyName;
 }
 
 LaserScannerInfoSeq
@@ -230,6 +231,8 @@ HokuyoLaserScanDevice::run()
     ARMARX_TRACE;
     while (!task->isStopped())
     {
+        ARMARX_INFO << deactivateSpam() << "Running update loop for laserscanner device " << ip;
+
         IceUtil::Time time_start = TimeUtil::GetTime();
 
         if (errorCounter > 10)
@@ -272,15 +275,16 @@ HokuyoLaserScanDevice::run()
 
             errorCounter = 0;
 
-            if (scanTopic)
+            if (listenerPrx)
             {
-                scanTopic->reportSensorValues(ip, frame, scan, now);
+
+                listenerPrx->reportSensorValues(ip, frame, scan, now);
             }
             else
             {
-                ARMARX_WARNING << "No scan topic available: IP: " << ip << ", Port: " << port;
+                ARMARX_WARNING << "No proxy available: IP: " << ip << ", Port: " << port;
             }
-            IceUtil::Time time_topicSensor = TimeUtil::GetTime();
+            IceUtil::Time time_proxyReport = TimeUtil::GetTime();
 
             if (robotHealthPlugin != nullptr)
             {
@@ -302,10 +306,10 @@ HokuyoLaserScanDevice::run()
                 new Variant((time_measure - time_start).toMilliSecondsDouble());
             durations["update_ms"] =
                 new Variant((time_update - time_measure).toMilliSecondsDouble());
-            durations["topic_sensor_ms"] =
-                new Variant((time_topicSensor - time_update).toMilliSecondsDouble());
+            durations["proxy_report_ms"] =
+                new Variant((time_proxyReport - time_update).toMilliSecondsDouble());
             durations["topic_health_ms"] =
-                new Variant((time_topicHeartbeat - time_topicSensor).toMilliSecondsDouble());
+                new Variant((time_topicHeartbeat - time_proxyReport).toMilliSecondsDouble());
             debugObserver->setDebugChannel(
                 "LaserScannerDuration_" + simox::alg::replace_all(ip, ".", "_"), durations);
 
@@ -318,9 +322,9 @@ HokuyoLaserScanDevice::run()
                                << "Update:    "
                                << (time_update - time_measure).toMilliSecondsDouble() << "ms\n"
                                << "TopicSensor: "
-                               << (time_topicSensor - time_update).toMilliSecondsDouble() << "ms\n"
+                               << (time_proxyReport - time_update).toMilliSecondsDouble() << "ms\n"
                                << "TopicHeart:  "
-                               << (time_topicHeartbeat - time_topicSensor).toMilliSecondsDouble()
+                               << (time_topicHeartbeat - time_proxyReport).toMilliSecondsDouble()
                                << "ms\n";
             }
         }
diff --git a/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.h b/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.h
index 0b8ad3985e9e3b1825054fe1339cb41a5c59f4cd..98da02fce21736694803272e4e76e046080d2cd4 100644
--- a/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.h
+++ b/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.h
@@ -47,7 +47,7 @@ namespace armarx
             armarx::ComponentPropertyDefinitions(prefix)
         {
             defineOptionalProperty<std::string>(
-                "LaserScannerTopicName", "LaserScans", "Name of the laser scan topic.");
+                "LaserScannerListenerName", "CartographerMappingAndLocalization", "Name of the laser scan listener.");
             defineOptionalProperty<int>("UpdatePeriod", 25, "Update period for laser scans");
             defineOptionalProperty<float>("AngleOffset",
                                           -2.3561944902,
@@ -87,7 +87,7 @@ namespace armarx
         LaserScan scan;
 
         std::string componentName;
-        LaserScannerUnitListenerPrx scanTopic;
+        LaserScannerUnitListenerPrx listenerPrx;
         armarx::plugins::HeartbeatComponentPlugin* robotHealthPlugin;
         DebugObserverInterfacePrx debugObserver;
     };
@@ -150,8 +150,8 @@ namespace armarx
         LaserScannerInfoSeq getConnectedDevices(const Ice::Current& c) const override;
 
     private:
-        std::string topicName;
-        LaserScannerUnitListenerPrx topic;
+        std::string laserScannerListenerProxyName;
+        LaserScannerUnitListenerPrx listenerPrx;
         int updatePeriod = 25;
         float angleOffset = 0.0f;
         std::vector<HokuyoLaserScanDevice> devices;
diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h
index 0a77d4d0fe8e77557a5fb4659b52aa9b1be23035..81a0fc03092bbbe67c476d3e5f2146a28d62517a 100644
--- a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h
+++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h
@@ -74,6 +74,11 @@ namespace armarx::armem::obj::instance
             return this->p;
         }
 
+        objpose::ObjectPoseStorageInterfacePrx getObjectPoseStorage() const
+        {
+            return objPoseStorage;
+        }
+
     private:
         Properties p;
 
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 7e3908c5503d4ead6a018f9e9555618b01ca2d28..0cc87be10ec27214b2cf9e8540537aaf0a8d98ba 100644
--- a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp
@@ -68,11 +68,12 @@ namespace armarx::armem::common::robot_state::localization
 
         if (transforms.empty())
         {
-            ARMARX_WARNING << deactivateSpam(1) << "No transform available.";
+            ARMARX_INFO << deactivateSpam(1) << "No transform available.";
             return {.transform = {.header = query.header},
                     .status = TransformResult::Status::ErrorFrameNotAvailable,
-                    .errorMessage = "Error in TF loookup:  '" + query.header.parentFrame + " -> " +
-                                    query.header.frame + "'. No memory data in time range."};
+                    .errorMessage = "Error in TF loookup:  '" + query.header.parentFrame +
+                                    " -> " + query.header.frame +
+                                    "'. No memory data in time range."};
         }
 
         const Eigen::Affine3f transform = std::accumulate(
@@ -107,12 +108,15 @@ namespace armarx::armem::common::robot_state::localization
             localizationCoreSegment, tfChain, query.header.agent, query.header.timestamp);
         if (transforms.empty())
         {
-            ARMARX_WARNING << deactivateSpam(1) << "No transform available.";
-            return {.header = query.header,
-                    .transforms = {},
-                    .status = TransformChainResult::Status::ErrorFrameNotAvailable,
-                    .errorMessage = "Error in TF loookup:  '" + query.header.parentFrame + " -> " +
-                                    query.header.frame + "'. No memory data in time range."};
+            ARMARX_INFO << deactivateSpam(1) << "No transform available.";
+            return
+            {
+                .header = query.header,
+                .transforms = {},
+                .status = TransformChainResult::Status::ErrorFrameNotAvailable,
+                .errorMessage = "Error in TF loookup:  '" + query.header.parentFrame + " -> " +
+                                 query.header.frame + "'. No memory data in time range."};
+            };
         }
 
 
@@ -161,9 +165,9 @@ namespace armarx::armem::common::robot_state::localization
 
         if (chain.empty() or chain.back() != query.header.frame)
         {
-            ARMARX_WARNING << deactivateSpam(60) << "Cannot create tf lookup chain '"
-                           << query.header.parentFrame << " -> " << query.header.frame
-                           << "' for robot `" + query.header.agent + "`.";
+            ARMARX_INFO << deactivateSpam(60) << "Cannot create tf lookup chain '"
+                        << query.header.parentFrame << " -> " << query.header.frame
+                        << "' for robot `" + query.header.agent + "`.";
             return {};
         }
 
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.cpp b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.cpp
index 1233be7dadb4a548efd9d7c8c38a797d4138c707..34260f51e36951f7b9a0a68369cf8317e8a4dedc 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.cpp
@@ -141,7 +141,7 @@ namespace armarx::armem::server::robot_state::proprioception
                 debugObserver->setDebugObserverDatafield("RobotUnitReader | RT Timestamp USec",
                                                          data.back().timestampUSec);
                 debugObserver->setDebugObserverDatafield(
-                    "RobotUnitReader | RT TS Since Last Iteration",
+                    "RobotUnitReader | RT Timestamp Since Last Iteration",
                     data.back().timesSinceLastIterationUSec);
             }
         }
diff --git a/source/RobotAPI/statecharts/CMakeLists.txt b/source/RobotAPI/statecharts/CMakeLists.txt
index 006016c5daa24d555c8a5d9537b8bfbbd0c96229..33340476f9568dce65fbd43bcd3f745f80df32f6 100644
--- a/source/RobotAPI/statecharts/CMakeLists.txt
+++ b/source/RobotAPI/statecharts/CMakeLists.txt
@@ -13,3 +13,5 @@ add_subdirectory(StatechartExecutionGroup)
 
 add_subdirectory(ProsthesisKinestheticTeachIn)
 add_subdirectory(DebugDrawerToArVizGroup)
+
+add_subdirectory(ObjectMemoryGroup)
diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/CMakeLists.txt b/source/RobotAPI/statecharts/ObjectMemoryGroup/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a751e89b2566ed34fadcfa9c04943088955c1d5e
--- /dev/null
+++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/CMakeLists.txt
@@ -0,0 +1,31 @@
+# Modern CMake way:
+#armarx_add_statechart(ObjectMemoryGroup
+#    SOURCES
+#        ObjectMemoryGroupRemoteStateOfferer.cpp
+#    HEADERS
+#        ObjectMemoryGroupRemoteStateOfferer.h
+#    DEPENDENCIES
+#)
+
+# Legacy CMake way:
+
+armarx_component_set_name("ObjectMemoryGroup")
+
+set(COMPONENT_LIBS
+    ArmarXCoreInterfaces ArmarXCore ArmarXCoreStatechart ArmarXCoreObservers
+    # RobotAPI
+    RobotAPIArmarXObjects
+    armem_objects
+)
+
+set(SOURCES
+    ObjectMemoryGroupRemoteStateOfferer.cpp
+)
+
+set(HEADERS
+    ObjectMemoryGroupRemoteStateOfferer.h
+    ObjectMemoryGroup.scgxml
+)
+
+armarx_generate_statechart_cmake_lists()
+armarx_add_component("${SOURCES}" "${HEADERS}")
diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroup.scgxml b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroup.scgxml
new file mode 100644
index 0000000000000000000000000000000000000000..8f7d00053ef37819464e9d1b7bc4171cf4caf72b
--- /dev/null
+++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroup.scgxml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<StatechartGroup name="ObjectMemoryGroup" package="RobotAPI" generateContext="true">
+	<Proxies>
+		<Proxy value="RobotAPIInterfaces.MemoryNameSystem"/>
+	</Proxies>
+	<Folder basename="test">
+		<State filename="RequestObjectsTest.xml" visibility="public"/>
+	</Folder>
+	<State filename="RequestObjects.xml" visibility="public"/>
+</StatechartGroup>
+
diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.cpp b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1324dfff62f4a6ec3df04e61d451f062125a50c8
--- /dev/null
+++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.cpp
@@ -0,0 +1,29 @@
+#include "ObjectMemoryGroupRemoteStateOfferer.h"
+
+namespace armarx::ObjectMemoryGroup
+{
+    // DO NOT EDIT NEXT LINE
+    ObjectMemoryGroupRemoteStateOfferer::SubClassRegistry ObjectMemoryGroupRemoteStateOfferer::Registry(ObjectMemoryGroupRemoteStateOfferer::GetName(), &ObjectMemoryGroupRemoteStateOfferer::CreateInstance);
+
+    ObjectMemoryGroupRemoteStateOfferer::ObjectMemoryGroupRemoteStateOfferer(StatechartGroupXmlReaderPtr reader) :
+        XMLRemoteStateOfferer < ObjectMemoryGroupStatechartContext > (reader)
+    {}
+
+    void ObjectMemoryGroupRemoteStateOfferer::onInitXMLRemoteStateOfferer() {}
+
+    void ObjectMemoryGroupRemoteStateOfferer::onConnectXMLRemoteStateOfferer() {}
+
+    void ObjectMemoryGroupRemoteStateOfferer::onExitXMLRemoteStateOfferer() {}
+
+    // DO NOT EDIT NEXT FUNCTION
+    std::string ObjectMemoryGroupRemoteStateOfferer::GetName()
+    {
+        return "ObjectMemoryGroupRemoteStateOfferer";
+    }
+
+    // DO NOT EDIT NEXT FUNCTION
+    XMLStateOffererFactoryBasePtr ObjectMemoryGroupRemoteStateOfferer::CreateInstance(StatechartGroupXmlReaderPtr reader)
+    {
+        return XMLStateOffererFactoryBasePtr(new ObjectMemoryGroupRemoteStateOfferer(reader));
+    }
+}
diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.h b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.h
new file mode 100644
index 0000000000000000000000000000000000000000..882627aec09b55c16b4b0f07fe313c0138392368
--- /dev/null
+++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include <ArmarXCore/statechart/xmlstates/XMLRemoteStateOfferer.h>
+#include "ObjectMemoryGroupStatechartContext.generated.h"
+
+namespace armarx::ObjectMemoryGroup
+{
+    class ObjectMemoryGroupRemoteStateOfferer :
+        virtual public XMLRemoteStateOfferer < ObjectMemoryGroupStatechartContext > // Change this statechart context if you need another context (dont forget to change in the constructor as well)
+    {
+    public:
+        ObjectMemoryGroupRemoteStateOfferer(StatechartGroupXmlReaderPtr reader);
+
+        // inherited from RemoteStateOfferer
+        void onInitXMLRemoteStateOfferer() override;
+        void onConnectXMLRemoteStateOfferer() override;
+        void onExitXMLRemoteStateOfferer() override;
+
+        // static functions for AbstractFactory Method
+        static std::string GetName();
+        static XMLStateOffererFactoryBasePtr CreateInstance(StatechartGroupXmlReaderPtr reader);
+        static SubClassRegistry Registry;
+
+
+    };
+}
diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.cpp b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..562ddabd56b6d07428f8ce2b386fa682ac95dd1f
--- /dev/null
+++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.cpp
@@ -0,0 +1,133 @@
+#include "RequestObjects.h"
+
+//#include <ArmarXCore/core/time/TimeUtil.h>
+//#include <ArmarXCore/observers/variant/DatafieldRef.h>
+
+#include <RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectID.h>
+#include <RobotAPI/libraries/ArmarXObjects/ice_conversions.h>
+
+#include "ObjectMemoryGroupStatechartContext.generated.h"
+
+namespace armarx::ObjectMemoryGroup
+{
+    // DO NOT EDIT NEXT LINE
+    RequestObjects::SubClassRegistry RequestObjects::Registry(RequestObjects::GetName(), &RequestObjects::CreateInstance);
+
+    RequestObjects::RequestObjects(const XMLStateConstructorParams& stateData):
+        XMLStateTemplate<RequestObjects>(stateData), RequestObjectsGeneratedBase<RequestObjects>(stateData)
+    {
+    }
+
+    void RequestObjects::onEnter()
+    {
+
+        // put your user code for the enter-point here
+        // execution time should be short (<100ms)
+    }
+
+    void RequestObjects::run()
+    {
+        if (not in.getEnable())
+        {
+            emitSuccess();
+            return;
+        }
+
+        using Reader = armarx::armem::obj::instance::Reader;
+
+        const std::string provider = in.isProviderSet() ? in.getProvider() : "";
+
+        const std::vector<std::string> objectIdsString = in.getObjectIds();
+        const armarx::Duration relativeTimeout = armarx::Duration::MilliSeconds(in.getRelativeTimeoutMilliseconds());
+
+        std::stringstream info;
+        std::stringstream warn;
+
+        std::vector<armarx::ObjectID> objectIds;
+        for (const std::string& idString : objectIdsString)
+        {
+            try
+            {
+                 armarx::ObjectID id = armarx::ObjectID::FromString(idString);
+                 objectIds.push_back(id);
+                 info << "Requesting object " << id << "\n";
+            }
+            catch (const armarx::LocalException& e)
+            {
+                warn << "\nGiven object ID '" << idString << "' could not parsed as ObjectID: " << e.what();
+            }
+        }
+
+        auto context = getContext<ObjectMemoryGroupStatechartContext>();
+        armarx::armem::client::MemoryNameSystem mns(getMemoryNameSystem(), context);
+
+        Reader reader{mns};
+        reader.connect();
+        objpose::ObjectPoseStorageInterfacePrx storage = reader.getObjectPoseStorage();
+
+        armarx::objpose::observer::RequestObjectsInput input;
+        input.provider = provider;
+        for (const armarx::ObjectID& id : objectIds)
+        {
+            armarx::toIce(input.request.objectIDs.emplace_back(), id);
+        }
+        input.request.relativeTimeoutMS = relativeTimeout.toMilliSeconds();
+
+
+        objpose::observer::RequestObjectsOutput output;
+        try
+        {
+            output = storage->requestObjects(input);
+        }
+        catch (const Ice::Exception& e)
+        {
+            ARMARX_WARNING << "Failed to request object localization: " << e.what();
+            emitFailure();
+            return;
+        }
+
+        for (const auto& [id, result] : output.results)
+        {
+            if (result.result.success)
+            {
+                info << "Requested object " << id << " via provider '" << result.providerName << "'.\n";
+            }
+            else
+            {
+                warn << "\nFailed to request the object " << id << " for localization.";
+            }
+        }
+
+        if (not info.str().empty())
+        {
+            ARMARX_INFO << info.str();
+        }
+        if (not warn.str().empty())
+        {
+            ARMARX_WARNING << "The following issues occurred whhen requesting objects for localization:"
+                           << warn.str();
+        }
+
+        emitSuccess();
+    }
+
+    //void RequestObjects::onBreak()
+    //{
+    //    // put your user code for the breaking point here
+    //    // execution time should be short (<100ms)
+    //}
+
+    void RequestObjects::onExit()
+    {
+        // put your user code for the exit point here
+        // execution time should be short (<100ms)
+    }
+
+
+    // DO NOT EDIT NEXT FUNCTION
+    XMLStateFactoryBasePtr RequestObjects::CreateInstance(XMLStateConstructorParams stateData)
+    {
+        return XMLStateFactoryBasePtr(new RequestObjects(stateData));
+    }
+}
diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.h b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.h
new file mode 100644
index 0000000000000000000000000000000000000000..4390865434749d591d6082df003c55e3b8560cd6
--- /dev/null
+++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.generated.h>
+
+namespace armarx::ObjectMemoryGroup
+{
+    class RequestObjects :
+        public RequestObjectsGeneratedBase < RequestObjects >
+    {
+    public:
+        RequestObjects(const XMLStateConstructorParams& stateData);
+
+        // inherited from StateBase
+        void onEnter() override;
+        void run() override;
+        // void onBreak() override;
+        void onExit() override;
+
+        // static functions for AbstractFactory Method
+        static XMLStateFactoryBasePtr CreateInstance(XMLStateConstructorParams stateData);
+        static SubClassRegistry Registry;
+
+        // DO NOT INSERT ANY CLASS MEMBERS,
+        // use stateparameters instead,
+        // if classmember are neccessary nonetheless, reset them in onEnter
+    };
+}
diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.xml b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8b32c20109a1bee77bcd3ee1203716d3abb02f0d
--- /dev/null
+++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<State version="1.2" name="RequestObjects" uuid="9F09FB2F-CC0C-4B8A-A716-F130E04A7230" width="800" height="600" type="Normal State">
+	<InputParameters>
+		<Parameter name="Enable" type="::armarx::BoolVariantData" docType="bool" optional="no">
+			<DefaultValue value='{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::BoolVariantData","value":true}}' docValue="True"/>
+		</Parameter>
+		<Parameter name="ObjectIds" type="::armarx::SingleTypeVariantListBase(::armarx::StringVariantData)" docType="List(string)" optional="no"/>
+		<Parameter name="Provider" type="::armarx::StringVariantData" docType="string" optional="yes"/>
+		<Parameter name="RelativeTimeoutMilliseconds" type="::armarx::IntVariantData" docType="int" optional="no"/>
+	</InputParameters>
+	<OutputParameters/>
+	<LocalParameters/>
+	<Substates/>
+	<Events>
+		<Event name="Failure">
+			<Description>Event for statechart-internal failures or optionally user-code failures</Description>
+		</Event>
+		<Event name="Success"/>
+	</Events>
+	<Transitions/>
+</State>
+
diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/test/RequestObjectsTest.xml b/source/RobotAPI/statecharts/ObjectMemoryGroup/test/RequestObjectsTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..edb16e98297feb19d1769ca6c54ab28901da7ad1
--- /dev/null
+++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/test/RequestObjectsTest.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<State version="1.2" name="RequestObjectsTest" uuid="E74E1D8D-2E97-4846-9282-73AC4F49FAEE" width="493.167" height="355.278" type="Normal State">
+	<InputParameters>
+		<Parameter name="ObjectIds" type="::armarx::SingleTypeVariantListBase(::armarx::StringVariantData)" docType="List(string)" optional="no">
+			<DefaultValue value='{"array":[{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"Maintenance/spraybottle"}},{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"Maintenance/handwash-paste"}},{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"Maintenance/mounting-adhesive"}},{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"Maintenance/multipurpose-grease"}}],"type":"::armarx::SingleTypeVariantListBase"}' docValue="Maintenance/spraybottle\nMaintenance/handwash-paste\nMaintenance/mounting-adhesive\nMaintenance/multipurpose-grease"/>
+		</Parameter>
+		<Parameter name="Provider" type="::armarx::StringVariantData" docType="string" optional="no">
+			<DefaultValue value='{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"sim_track"}}' docValue="sim_track"/>
+		</Parameter>
+		<Parameter name="RelativeTimeoutMilliseconds" type="::armarx::IntVariantData" docType="int" optional="no">
+			<DefaultValue value='{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::IntVariantData","value":10000}}' docValue="10000"/>
+		</Parameter>
+	</InputParameters>
+	<OutputParameters/>
+	<LocalParameters/>
+	<Substates>
+		<EndState name="Failure" event="Failure" left="363.167" top="140.056" boundingSquareSize="99.6636"/>
+		<LocalState name="RequestObjects" refuuid="9F09FB2F-CC0C-4B8A-A716-F130E04A7230" left="114.167" top="196.278" boundingSquareSize="99.6636"/>
+		<EndState name="Success" event="Success" left="363.167" top="250.278" boundingSquareSize="99.6636"/>
+	</Substates>
+	<Events>
+		<Event name="Failure">
+			<Description>Event for statechart-internal failures or optionally user-code failures</Description>
+		</Event>
+	</Events>
+	<StartState substateName="RequestObjects">
+		<ParameterMappings>
+			<ParameterMapping sourceType="Parent" from="ObjectIds" to="ObjectIds"/>
+			<ParameterMapping sourceType="Parent" from="Provider" to="Provider"/>
+			<ParameterMapping sourceType="Parent" from="RelativeTimeoutMilliseconds" to="RelativeTimeoutMilliseconds"/>
+		</ParameterMappings>
+		<SupportPoints>
+			<SupportPoint posX="67.1067" posY="233.278"/>
+			<SupportPoint posX="76.5839" posY="233.278"/>
+			<SupportPoint posX="88.7241" posY="233.278"/>
+			<SupportPoint posX="101.186" posY="233.278"/>
+		</SupportPoints>
+	</StartState>
+	<Transitions>
+		<Transition from="RequestObjects" to="Failure" eventName="Failure">
+			<ParameterMappings/>
+			<ParameterMappingsToParentsLocal/>
+			<ParameterMappingsToParentsOutput/>
+			<SupportPoints>
+				<SupportPoint posX="214.588" posY="221.9"/>
+				<SupportPoint posX="253.892" posY="213.031"/>
+				<SupportPoint posX="308.683" posY="200.669"/>
+				<SupportPoint posX="350.786" posY="191.175"/>
+			</SupportPoints>
+		</Transition>
+		<Transition from="RequestObjects" to="Success" eventName="Success">
+			<ParameterMappings/>
+			<ParameterMappingsToParentsLocal/>
+			<ParameterMappingsToParentsOutput/>
+			<SupportPoints>
+				<SupportPoint posX="214.358" posY="252.153"/>
+				<SupportPoint posX="221.884" posY="254.613"/>
+				<SupportPoint posX="229.602" posY="256.935"/>
+				<SupportPoint posX="237" posY="258.833"/>
+				<SupportPoint posX="274.158" posY="268.372"/>
+				<SupportPoint posX="316.529" posY="275.551"/>
+				<SupportPoint posX="350.428" posY="280.424"/>
+			</SupportPoints>
+		</Transition>
+	</Transitions>
+</State>
+