diff --git a/source/RobotAPI/libraries/armem_objects/SceneSnapshot.cpp b/source/RobotAPI/libraries/armem_objects/SceneSnapshot.cpp
index 2fcfbb4ae129edf59214cc8a398d535d95a2e86e..d3ece87d9746198af2f5b9acc5b81cce38d189aa 100644
--- a/source/RobotAPI/libraries/armem_objects/SceneSnapshot.cpp
+++ b/source/RobotAPI/libraries/armem_objects/SceneSnapshot.cpp
@@ -30,6 +30,18 @@ namespace armarx::armem::obj
         return id;
     }
 
+
+    ObjectID SceneSnapshot::Object::getObjectID() const
+    {
+        return getClassID().withInstanceName(instanceName);
+    }
+
+
+    ObjectID SceneSnapshot::Object::getObjectID(ObjectFinder& finder) const
+    {
+        return getClassID(finder).withInstanceName(instanceName);
+    }
+
 }
 
 
@@ -37,6 +49,7 @@ void armarx::armem::obj::to_json(nlohmann::json& j, const SceneSnapshot::Object&
 {
     //     j["instanceID"] = rhs.instanceID;
     j["class"] = rhs.className;
+    j["instanceName"] = rhs.instanceName;
     j["collection"] = rhs.collection;
     j["position"] = rhs.position;
     j["orientation"] = rhs.orientation;
@@ -48,6 +61,10 @@ void armarx::armem::obj::from_json(const nlohmann::json& j, SceneSnapshot::Objec
 {
     //     j.at("instanceID").get_to(rhs.instanceID);
     j.at("class").get_to(rhs.className);
+    if (j.count("instanceName"))
+    {
+        j["instanceName"].get_to(rhs.instanceName);
+    }
     j.at("collection").get_to(rhs.collection);
     j.at("position").get_to(rhs.position);
     j.at("orientation").get_to(rhs.orientation);
diff --git a/source/RobotAPI/libraries/armem_objects/SceneSnapshot.h b/source/RobotAPI/libraries/armem_objects/SceneSnapshot.h
index 30e144b6300327b969904a662fd1bd3466dc467b..3e24156490544ebc537372a0d204c052ae8b2428 100644
--- a/source/RobotAPI/libraries/armem_objects/SceneSnapshot.h
+++ b/source/RobotAPI/libraries/armem_objects/SceneSnapshot.h
@@ -39,6 +39,7 @@ namespace armarx::armem::obj
         struct Object
         {
             std::string className;
+            std::string instanceName;
             std::string collection;
 
             Eigen::Vector3f position = Eigen::Vector3f::Zero();
@@ -48,6 +49,8 @@ namespace armarx::armem::obj
 
             ObjectID getClassID() const;
             ObjectID getClassID(ObjectFinder& finder) const;
+            ObjectID getObjectID() const;
+            ObjectID getObjectID(ObjectFinder& finder) const;
         };
         std::vector<Object> objects;
     };
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index 5c76dfb7289ba6f503dfd17eaa7bda26af0e9e2c..31f25a68ad359505e52ea3928c16bde8fb10385b 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -863,7 +863,11 @@ namespace armarx::armem::server::obj::instance
             pose.providerName = sceneName;
             pose.objectType = objpose::ObjectTypeEnum::KnownObject;
             pose.isStatic = true;  // Objects loaded from prior knowledge are considerd static to exclude them from decay.
-            pose.objectID = classID.withInstanceName(std::to_string(idCounters[classID]++));
+            pose.objectID = classID.withInstanceName(
+                                object.instanceName.empty()
+                                ? std::to_string(idCounters[classID]++)
+                                : object.instanceName
+                            );
 
             pose.objectPoseGlobal = simox::math::pose(object.position, object.orientation);
             pose.objectPoseRobot = pose.objectPoseGlobal;