diff --git a/source/RobotAPI/libraries/ArmarXObjects/aron_conversions.cpp b/source/RobotAPI/libraries/ArmarXObjects/aron_conversions.cpp
index 71398d59dc8d00018bcc0d4fb5c1c7cfb6010465..e24325158807546c2e447db8a750a5e5413369f5 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/aron_conversions.cpp
@@ -7,177 +7,144 @@
 // Ice
 #include <IceUtil/Time.h>
 
-// Simox
-#include <SimoxUtility/shapes/OrientedBox.h>
+// boost
+#include <boost/bimap.hpp>
 
-// RobotAPI
-// TODO: ice dependency! header should be removed.
-#include <RobotAPI/interface/objectpose/object_pose_types.h>
+#include <ArmarXCore/core/exceptions/local/UnexpectedEnumValueException.h>
 
-#include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
-#include <RobotAPI/libraries/ArmarXObjects/aron/ObjectPose.aron.generated.h>
 
+void simox::fromAron(const arondto::OrientedBox& dto, OrientedBoxf& bo)
+{
+    bo = OrientedBoxf(dto.centerPose, dto.extends);
+}
 
-namespace armarx::objpose
+void simox::toAron(arondto::OrientedBox& dto, const OrientedBoxf& bo)
 {
+    dto.centerPose = bo.transformation();
+    dto.extends = bo.dimensions();
+}
 
-    ObjectID fromAron(const aron::ObjectID& id)
-    {
-        return ObjectID(id.dataset, id.className, id.instanceName);
-    }
+void armarx::fromAron(const arondto::ObjectID& dto, ObjectID& bo)
+{
+    bo = ObjectID(dto.dataset, dto.className, dto.instanceName);
+}
+void armarx::toAron(arondto::ObjectID& dto, const ObjectID& bo)
+{
+    dto.dataset = bo.dataset();
+    dto.className = bo.className();
+    dto.instanceName = bo.instanceName();
+}
 
-    ObjectTypeEnum fromAron(const aron::ObjectTypes& objectType)
-    {
-        using AronObjectType = aron::ObjectTypes::__ImplEnum;
-
-        ObjectTypeEnum e{};
-
-        switch (objectType.value)
-        {
-            case AronObjectType::ANY_OBJECT:
-                e = ObjectTypeEnum::AnyObject;
-                break;
-            case AronObjectType::KNOWN_OBJECT:
-                e = ObjectTypeEnum::KnownObject;
-                break;
-            case AronObjectType::UNKNOWN_OBJECT:
-                e = ObjectTypeEnum::UnknownObject;
-                break;
-        }
-
-        return e;
-    }
 
-    simox::OrientedBoxf fromAron(const aron::OrientedBoundingBox& obb)
-    {
-        return simox::OrientedBoxf(obb.centerPose, obb.extends);
-    }
+void armarx::objpose::fromAron(const arondto::ObjectAttachmentInfo& dto, ObjectAttachmentInfo& bo)
+{
+    bo.frameName = dto.frameName;
+    bo.agentName = dto.agentName;
+    bo.poseInFrame = dto.poseInFrame;
+}
+void armarx::objpose::toAron(arondto::ObjectAttachmentInfo& dto, const ObjectAttachmentInfo& bo)
+{
+    dto.frameName = bo.frameName;
+    dto.agentName = bo.agentName;
+    dto.poseInFrame = bo.poseInFrame;
+}
 
-    ObjectAttachmentInfo fromAron(const aron::ObjectAttachmentInfo& info)
+void armarx::objpose::fromAron(const arondto::ObjectType& dto, ObjectTypeEnum& bo)
+{
+    switch (dto.value)
     {
-        return
-        {
-            .frameName = info.frameName,
-            .agentName = info.agentName,
-            .poseInFrame = info.poseInFrame
-        };
+        case arondto::ObjectType::AnyObject:
+            bo = ObjectTypeEnum::AnyObject;
+            return;
+        case arondto::ObjectType::KnownObject:
+            bo = ObjectTypeEnum::KnownObject;
+            return;
+        case arondto::ObjectType::UnknownObject:
+            bo = ObjectTypeEnum::UnknownObject;
+            return;
     }
-
-
-    void fromAron(const aron::ObjectPose& aronObjectPose, ObjectPose& objectPose)
+    ARMARX_UNEXPECTED_ENUM_VALUE(arondto::ObjectType, dto.value);
+}
+void armarx::objpose::toAron(arondto::ObjectType& dto, const ObjectTypeEnum& bo)
+{
+    switch (bo)
     {
-        objectPose.providerName = aronObjectPose.providerName;
-
-        objectPose.objectType = fromAron(aronObjectPose.objectType);
-
-        objectPose.objectID = fromAron(aronObjectPose.objectID);
-
-        objectPose.objectPoseRobot = aronObjectPose.objectPoseRobot;
-        objectPose.objectPoseGlobal = aronObjectPose.objectPoseGlobal;
-        objectPose.objectPoseOriginal = aronObjectPose.objectPoseOriginal;
-        objectPose.objectPoseOriginalFrame = aronObjectPose.objectPoseOriginalFrame;
-
-        objectPose.robotConfig = aronObjectPose.robotConfig;
-        objectPose.robotPose = aronObjectPose.robotPose;
-
-        objectPose.attachment = fromAron(aronObjectPose.attachment);
-
-        objectPose.confidence = aronObjectPose.confidence;
-
-        objectPose.timestamp = IceUtil::Time::microSeconds(aronObjectPose.timestamp);
-
-        objectPose.localOOBB = fromAron(aronObjectPose.localOOBB);
-
+        case ObjectTypeEnum::AnyObject:
+            dto.value = arondto::ObjectType::AnyObject;
+            return;
+        case ObjectTypeEnum::KnownObject:
+            dto.value = arondto::ObjectType::KnownObject;
+            return;
+        case ObjectTypeEnum::UnknownObject:
+            dto.value = arondto::ObjectType::UnknownObject;
+            return;
     }
+    ARMARX_UNEXPECTED_ENUM_VALUE(ObjectTypeEnum, bo);
+}
 
 
-    aron::ObjectID toAron(const ObjectID& id)
-    {
-        aron::ObjectID aronId;
+void armarx::objpose::fromAron(const arondto::ObjectPose& dto, ObjectPose& bo)
+{
+    bo.providerName = dto.providerName;
 
-        aronId.className = id.className();
-        aronId.dataset = id.dataset();
-        aronId.instanceName = id.instanceName();
+    fromAron(dto.objectType, bo.objectType);
+    fromAron(dto.objectID, bo.objectID);
 
-        return aronId;
-    }
+    bo.objectPoseRobot = dto.objectPoseRobot;
+    bo.objectPoseGlobal = dto.objectPoseGlobal;
+    bo.objectPoseOriginal = dto.objectPoseOriginal;
+    bo.objectPoseOriginalFrame = dto.objectPoseOriginalFrame;
 
-    aron::ObjectTypes toAron(const ObjectTypeEnum& objectType)
-    {
-        aron::ObjectTypes ot{};
-
-        switch (objectType)
-        {
-            case ObjectTypeEnum::AnyObject:
-                ot = aron::ObjectTypes::ANY_OBJECT;
-                break;
-            case ObjectTypeEnum::KnownObject:
-                ot = aron::ObjectTypes::KNOWN_OBJECT;
-                break;
-            case ObjectTypeEnum::UnknownObject:
-                ot = aron::ObjectTypes::UNKNOWN_OBJECT;
-                break;
-        }
-
-        return ot;
-    }
+    bo.robotConfig = dto.robotConfig;
+    bo.robotPose = dto.robotPose;
 
-    aron::ObjectAttachmentInfo toAron(const ObjectAttachmentInfo& info)
+    if (dto.attachmentValid)
     {
-        aron::ObjectAttachmentInfo aronInfo;
-
-        aronInfo.agentName = info.agentName;
-        aronInfo.frameName = info.frameName;
-        aronInfo.poseInFrame = info.poseInFrame;
-
-        return aronInfo;
+        bo.attachment = ObjectAttachmentInfo();
+        fromAron(dto.attachment, *bo.attachment);
     }
 
-    aron::OrientedBoundingBox toAron(const simox::OrientedBoxf& box)
-    {
-        aron::OrientedBoundingBox aronBox;
-        aronBox.centerPose = box.transformation();
-        aronBox.extends = box.dimensions();
-        return aronBox;
-    }
+    bo.confidence = dto.confidence;
 
-    template <typename T>
-    auto toAron(const std::optional<T>& p)
+    bo.timestamp = IceUtil::Time::microSeconds(dto.timestamp);
+
+    if (dto.localOOBBValid)
     {
-        if (p)
-        {
-            return toAron(p.value());
-        }
-
-        // TODO(fabian.reister): handle optional properly
-        // current fallback: default c'tor
-        return decltype(toAron(p.value()))();
+        bo.localOOBB = simox::OrientedBoxf();
+        fromAron(dto.localOOBB, *bo.localOOBB);
     }
+}
 
 
-    void toAron(const ObjectPose& objectPose, aron::ObjectPose& aronObjectPose)
-    {
-        aronObjectPose.providerName = objectPose.providerName;
-
-        aronObjectPose.objectType = toAron(objectPose.objectType);
+void armarx::objpose::toAron(arondto::ObjectPose& dto, const ObjectPose& bo)
+{
+    dto.providerName = bo.providerName;
 
-        aronObjectPose.objectID = toAron(objectPose.objectID);
+    toAron(dto.objectType, bo.objectType);
+    toAron(dto.objectID, bo.objectID);
 
-        aronObjectPose.objectPoseRobot = objectPose.objectPoseRobot;
-        aronObjectPose.objectPoseGlobal = objectPose.objectPoseGlobal;
-        aronObjectPose.objectPoseOriginal = objectPose.objectPoseOriginal;
-        aronObjectPose.objectPoseOriginalFrame = objectPose.objectPoseOriginalFrame;
+    dto.objectPoseRobot = bo.objectPoseRobot;
+    dto.objectPoseGlobal = bo.objectPoseGlobal;
+    dto.objectPoseOriginal = bo.objectPoseOriginal;
+    dto.objectPoseOriginalFrame = bo.objectPoseOriginalFrame;
 
-        aronObjectPose.robotConfig = objectPose.robotConfig;
-        aronObjectPose.robotPose = objectPose.robotPose;
+    dto.robotConfig = bo.robotConfig;
+    dto.robotPose = bo.robotPose;
 
-        aronObjectPose.attachment = toAron(objectPose.attachment);
+    if (bo.attachment)
+    {
+        dto.attachmentValid = true;
+        toAron(dto.attachment, *bo.attachment);
+    }
 
-        aronObjectPose.confidence = objectPose.confidence;
+    dto.confidence = bo.confidence;
 
-        aronObjectPose.timestamp = objectPose.timestamp.toMicroSeconds();
+    dto.timestamp = bo.timestamp.toMicroSeconds();
 
-        aronObjectPose.localOOBB = toAron(objectPose.localOOBB);
+    if (bo.localOOBB)
+    {
+        dto.localOOBBValid = true;
+        toAron(dto.localOOBB, *bo.localOOBB);
     }
+}
 
-} // namespace armarx::objpose
diff --git a/source/RobotAPI/libraries/ArmarXObjects/aron_conversions.h b/source/RobotAPI/libraries/ArmarXObjects/aron_conversions.h
index 50e7fc9412d1a30ac166386a29723547ef04cbda..043ef05614aed294872283a96508295b146c8086 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/aron_conversions.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/aron_conversions.h
@@ -1,16 +1,44 @@
 #pragma once
 
+#include <SimoxUtility/shapes/OrientedBox.h>
 
-namespace armarx::objpose
+#include <RobotAPI/libraries/ArmarXObjects/ObjectID.h>
+#include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h>
+
+#include <RobotAPI/libraries/ArmarXObjects/aron/ObjectID.aron.generated.h>
+#include <RobotAPI/libraries/ArmarXObjects/aron/ObjectPose.aron.generated.h>
+#include <RobotAPI/libraries/ArmarXObjects/aron/OrientedBox.aron.generated.h>
+
+
+namespace simox
+{
+    void fromAron(const arondto::OrientedBox& dto, OrientedBoxf& bo);
+    void toAron(arondto::OrientedBox& dto, const OrientedBoxf& bo);
+}
+
+
+namespace armarx
 {
-    struct ObjectPose;
+    void fromAron(const arondto::ObjectID& dto, ObjectID& bo);
+    void toAron(arondto::ObjectID& dto, const ObjectID& bo);
+}
 
-    namespace aron
-    {
-        struct ObjectPose;
-    }
 
-    void fromAron(const aron::ObjectPose& aronObjectPose, ObjectPose& objectPose);
-    void toAron(const ObjectPose& objectPose, aron::ObjectPose& aronObjectPose);
+namespace armarx
+{
+    void fromAron(const arondto::ObjectID& dto, ObjectID& bo);
+    void toAron(arondto::ObjectID& dto, const ObjectID& bo);
+}
+
+
+namespace armarx::objpose
+{
+    void fromAron(const arondto::ObjectAttachmentInfo& dto, ObjectAttachmentInfo& bo);
+    void toAron(arondto::ObjectAttachmentInfo& dto, const ObjectAttachmentInfo& bo);
+
+    void fromAron(const arondto::ObjectType& dto, ObjectTypeEnum& bo);
+    void toAron(arondto::ObjectType& dto, const ObjectTypeEnum& bo);
 
-} // namespace armarx::objpose
\ No newline at end of file
+    void fromAron(const arondto::ObjectPose& dto, ObjectPose& bo);
+    void toAron(arondto::ObjectPose& dto, const ObjectPose& bo);
+}