diff --git a/source/RobotAPI/components/ObjectPoseObserver/ice_conversions.cpp b/source/RobotAPI/components/ObjectPoseObserver/ice_conversions.cpp
index fb5a3bebe7c005c8799398df79909922ed360e9a..0f520c8fcc12391e7b47474248043dbafac0d73b 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/ice_conversions.cpp
+++ b/source/RobotAPI/components/ObjectPoseObserver/ice_conversions.cpp
@@ -34,17 +34,6 @@ namespace armarx
         return cast->toEigen();
     }
 
-
-    std::ostream& objpose::operator<<(std::ostream& os, const ObjectID& id)
-    {
-        os << "'" << id.dataset << "/" << id.className;
-        if (!id.instanceName.empty())
-        {
-            os << "/" << id.instanceName;
-        }
-        return os << "'";
-    }
-
     const simox::meta::EnumNames<objpose::ObjectTypeEnum> objpose::ObjectTypeEnumNames =
     {
         { objpose::ObjectTypeEnum::AnyObject, "AnyObject" },
diff --git a/source/RobotAPI/components/ObjectPoseObserver/ice_conversions.h b/source/RobotAPI/components/ObjectPoseObserver/ice_conversions.h
index 0957980702de8cb17bf4c59214330cc9015ab99d..1cfac6f00fa39c73cd7f74db6e68fd6d3b14d30b 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/ice_conversions.h
+++ b/source/RobotAPI/components/ObjectPoseObserver/ice_conversions.h
@@ -19,8 +19,6 @@ namespace simox
 namespace armarx::objpose
 {
 
-    std::ostream& operator<<(std::ostream& os, const ObjectID& id);
-
     extern const simox::meta::EnumNames<objpose::ObjectTypeEnum> ObjectTypeEnumNames;
 
 
diff --git a/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt b/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
index 8bda146bb3a89d2ccd32fd3ffb54ac612bbdfb84..1eb0e4d8158f766649e7b0089e7001761241e664 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/ArmarXObjects/CMakeLists.txt
@@ -13,6 +13,7 @@ set(LIB_FILES
     ObjectFinder.cpp
 
     json_conversions.cpp
+    ice_conversions.cpp
 )
 set(LIB_HEADERS
     ArmarXObjects.h
@@ -22,6 +23,7 @@ set(LIB_HEADERS
     ObjectFinder.h
 
     json_conversions.h
+    ice_conversions.h
 )
 
 
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ice_conversions.cpp b/source/RobotAPI/libraries/ArmarXObjects/ice_conversions.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7dd31ad9379e40a716869631b72ae3a6a7fb99a4
--- /dev/null
+++ b/source/RobotAPI/libraries/ArmarXObjects/ice_conversions.cpp
@@ -0,0 +1,68 @@
+#include "ice_conversions.h"
+
+
+namespace armarx
+{
+    std::ostream& data::operator<<(std::ostream& os, const ObjectID& id)
+    {
+        os << "'" << id.dataset << "/" << id.className;
+        if (!id.instanceName.empty())
+        {
+            os << "/" << id.instanceName;
+        }
+        return os << "'";
+    }
+
+}
+
+void armarx::fromIce(const data::ObjectID& ice, ObjectID& id)
+{
+    id = fromIce(ice);
+}
+
+armarx::ObjectID armarx::fromIce(const data::ObjectID& ice)
+{
+    return { ice.dataset, ice.className, ice.instanceName };
+}
+
+void armarx::toIce(data::ObjectID& ice, const ObjectID& id)
+{
+    ice.dataset = id.dataset();
+    ice.className = id.className();
+    ice.instanceName = id.instanceName();
+}
+
+armarx::data::ObjectID armarx::toIce(const ObjectID& id)
+{
+    data::ObjectID ice;
+    toIce(ice, id);
+    return ice;
+}
+
+void armarx::fromIce(const data::ObjectIDSeq& ice, std::vector<ObjectID>& ids)
+{
+    ids.clear();
+    std::transform(ice.begin(), ice.end(), std::back_inserter(ids),
+                   static_cast<ObjectID(*)(const data::ObjectID&)>(&fromIce));
+}
+
+std::vector<armarx::ObjectID> armarx::fromIce(const data::ObjectIDSeq& ice)
+{
+    std::vector<ObjectID> ids;
+    fromIce(ice, ids);
+    return ids;
+}
+
+void armarx::toIce(data::ObjectIDSeq& ice, const std::vector<ObjectID>& ids)
+{
+    ice.clear();
+    std::transform(ids.begin(), ids.end(), std::back_inserter(ice),
+                   static_cast<data::ObjectID(*)(const ObjectID&)>(&toIce));
+}
+
+armarx::data::ObjectIDSeq armarx::toIce(const std::vector<ObjectID>& ids)
+{
+    data::ObjectIDSeq ice;
+    toIce(ice, ids);
+    return ice;
+}
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ice_conversions.h b/source/RobotAPI/libraries/ArmarXObjects/ice_conversions.h
new file mode 100644
index 0000000000000000000000000000000000000000..e17f37e35e1ff217d3fe8baab719ccaefe2d88b6
--- /dev/null
+++ b/source/RobotAPI/libraries/ArmarXObjects/ice_conversions.h
@@ -0,0 +1,28 @@
+#pragma once
+
+#include <RobotAPI/interface/ArmarXObjects/ArmarXObjectsTypes.h>
+
+#include "ObjectID.h"
+
+
+namespace armarx::data
+{
+    std::ostream& operator<<(std::ostream& os, const ObjectID& id);
+}
+
+namespace armarx
+{
+
+    void fromIce(const data::ObjectID& ice, ObjectID& id);
+    ObjectID fromIce(const data::ObjectID& id);
+
+    void fromIce(const data::ObjectIDSeq& ice, std::vector<ObjectID>& ids);
+    std::vector<ObjectID> fromIce(const data::ObjectIDSeq& id);
+
+    void toIce(data::ObjectID& ice, const ObjectID& ids);
+    data::ObjectID toIce(const ObjectID& ids);
+
+    void toIce(data::ObjectIDSeq& ice, const std::vector<ObjectID>& ids);
+    data::ObjectIDSeq toIce(const std::vector<ObjectID>& ids);
+
+}