diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectID.cpp b/source/RobotAPI/libraries/ArmarXObjects/ObjectID.cpp
index f2d76a501ecf8e1f53dcf9bf80a2e8a0f66d7536..8a2856b2516784d6d5c0413a5123af9665696d22 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/ObjectID.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectID.cpp
@@ -19,16 +19,7 @@ namespace armarx
     {
         if (nameOrID.find("/") != nameOrID.npos)
         {
-            const std::vector<std::string> split = simox::alg::split(nameOrID, "/", true);
-            ARMARX_CHECK(split.size() == 2 || split.size() == 3)
-                    << "Expected ID of format 'Dataset/ClassName' or 'Dataset/ClassName/InstanceName'"
-                    << ", but got: '" << nameOrID << "' (too many '/').";
-            _dataset = split[0];
-            _className = split[1];
-            if (split.size() == 3)
-            {
-                _instanceName = split[2];
-            }
+            setFromString(nameOrID);
         }
         else
         {
@@ -37,6 +28,30 @@ namespace armarx
         }
     }
 
+    ObjectID ObjectID::FromString(const std::string& idString)
+    {
+        ObjectID id;
+        id.setFromString(idString);
+        return id;
+    }
+
+    void ObjectID::setFromString(const std::string& idString)
+    {
+        const std::vector<std::string> split = simox::alg::split(idString, "/", true);
+        ARMARX_CHECK(split.size() == 2 || split.size() == 3)
+                << "Expected ID of format 'Dataset/ClassName' or 'Dataset/ClassName/InstanceName'"
+                << ", but got: '" << idString << "' "
+                << "(expected 2 or 3 '/'s, but found " << split.size() << ").";
+
+        _dataset = split[0];
+        _className = split[1];
+
+        if (split.size() == 3)
+        {
+            _instanceName = split[2];
+        }
+    }
+
     std::string ObjectID::str() const
     {
         std::string _str = _dataset + "/" + _className;
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectID.h b/source/RobotAPI/libraries/ArmarXObjects/ObjectID.h
index 389b203a6ecc67f2f6cd074ce103c5b52687a2be..b152844b17f150b80c44f8ed3c849e263b2e8fd4 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/ObjectID.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectID.h
@@ -17,6 +17,9 @@ namespace armarx
         /// Construct from either a class name ("myobject") or ID ("mydataset/myobject", "mydataset/myclass/myinstance").
         ObjectID(const std::string& nameOrID);
 
+        /// Construct from a string produced by `str()`, e.g. ("mydataset/myobject", "mydataset/myclass/myinstance").
+        static ObjectID FromString(const std::string& idString);
+
 
         inline std::string dataset() const
         {
@@ -37,6 +40,8 @@ namespace armarx
 
         /// Return "dataset/className" or "dataset/className/instanceName".
         std::string str() const;
+        void setFromString(const std::string& idString);
+
 
         /// Return just the class ID without an intance name.
         ObjectID getClassID() const;