diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp
index 6242391458b2bd8653a2742062517be700b1f27d..5312cde46d0afb5a0ce77e07462c664703d187f7 100644
--- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp
+++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp
@@ -225,6 +225,13 @@ void KinematicUnitWidgetController::onConnectComponent()
         return;
     }
 
+    // check robot name and disable setZero Button if necessary
+    if (robot->getName() != "Armar3")
+    {
+        ARMARX_IMPORTANT << "Disable the SetZero button because the robot name is " << robot->getName();
+        ui.pushButtonKinematicUnitPos1->setDisabled(true);
+    }
+
     kinematicUnitFile = rfile;
     robotNodeSet = robot->getRobotNodeSet(robotNodeSetName);
 
diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui
index 79c6c2ff26258c52f4b002f6b1d53c2277289a7c..a265252ea20b34ad1b381292a2748316e88460b3 100644
--- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui
+++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui
@@ -163,7 +163,7 @@
        <item>
         <widget class="QPushButton" name="pushButtonKinematicUnitPos1">
          <property name="enabled">
-          <bool>false</bool>
+          <bool>true</bool>
          </property>
          <property name="sizePolicy">
           <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
diff --git a/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml b/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml
index 8397a5d2c65f9d1145b69ab45f0b8e21bba33c20..17247c71fb680682a28cbc47e7c14387fc21861b 100644
--- a/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml
+++ b/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml
@@ -6,7 +6,6 @@
     </AronIncludes>
     <GenerateTypes>
         <Object name='armarx::armem::grasping::arondto::KnownGrasp'>
-
             <ObjectChild key='name'>
                 <string />
             </ObjectChild>
@@ -22,25 +21,30 @@
             <ObjectChild key='pose'>
                 <Pose />
             </ObjectChild>
-
         </Object>
 
+        <!-- A Grasp set is a set of grasps that need to be executed to grasp an object. The order is important! -->
         <Object name='armarx::armem::grasping::arondto::KnownGraspSet'>
-
             <ObjectChild key='name'>
                 <string />
             </ObjectChild>
 
+            <ObjectChild key='robot'>
+                <string />
+            </ObjectChild>
+
+            <ObjectChild key='endeffector'>
+                <string />
+            </ObjectChild>
+
             <ObjectChild key='grasps'>
-                <Dict>
+                <List>
                     <armarx::armem::grasping::arondto::KnownGrasp />
-                </Dict>
+                </List>
             </ObjectChild>
-
         </Object>
 
         <Object name='armarx::armem::grasping::arondto::KnownGraspInfo'>
-
             <ObjectChild key='correspondingObject'>
                 <armarx::armem::arondto::MemoryID />
             </ObjectChild>
@@ -54,7 +58,6 @@
             <ObjectChild key='xml'>
                 <armarx::arondto::PackagePath />
             </ObjectChild>
-
         </Object>
 
     </GenerateTypes>
diff --git a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
index 5b8aaafea2d04db384f510d23788b16d94fe34db..e66a190bdf75e652c6505d91f7aae4fe9ae9649a 100644
--- a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
@@ -50,8 +50,8 @@ namespace armarx::armem::grasping::segment
                 arondto::KnownGraspSet retGraspSet;
 
                 retGraspSet.name = graspSetNode.attribute_value("name");
-                //std::string robotType = graspSetNode.attribute_value("RobotType");
-                //std::string endEffector = graspSetNode.attribute_value("EndEffector");
+                retGraspSet.robot = graspSetNode.attribute_value("RobotType");
+                retGraspSet.endeffector = graspSetNode.attribute_value("EndEffector");
 
                 for (const auto& graspNode : graspSetNode.nodes())
                 {
@@ -97,7 +97,7 @@ namespace armarx::armem::grasping::segment
 
                     ARMARX_INFO << "Found grasp '" << retGrasp.name << "' in set '" << retGraspSet.name << "' for obj '" << objectClassName << "' with pose \n" << retGrasp.pose;
 
-                    retGraspSet.grasps[retGrasp.name] = retGrasp;
+                    retGraspSet.grasps.push_back(retGrasp);
                 }
                 ret.graspSets[retGraspSet.name] = retGraspSet;
             }
diff --git a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
index b0663babe7059ddbc2915869dc49d06a128f03e5..ac67c9ad6cc34d051144df93def583c94ce63187 100644
--- a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
@@ -44,6 +44,7 @@ armarx_add_library(
         client/attachment/Writer.h
         
         client/instance/ObjectReader.h
+        client/instance/ObjectWriter.h
 
     SOURCES
         aron_conversions.cpp
@@ -58,6 +59,7 @@ armarx_add_library(
         client/attachment/Writer.cpp
         
         client/instance/ObjectReader.cpp
+        client/instance/ObjectWriter.cpp
 
     ARON_FILES
         aron/ObjectClass.xml
diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ad9c8c83f2ca8889292c8a2023a74fd54528e04a
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp
@@ -0,0 +1,81 @@
+#include "ObjectWriter.h"
+
+#include <mutex>
+#include <optional>
+
+#include <ArmarXCore/core/logging/Logging.h>
+#include <ArmarXCore/core/PackagePath.h>
+
+#include <RobotAPI/libraries/armem/core/Time.h>
+#include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/client/query/Builder.h>
+#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
+#include <RobotAPI/libraries/armem/util/util.h>
+#include <RobotAPI/libraries/armem_robot/robot_conversions.h>
+#include <RobotAPI/libraries/armem_robot/aron_conversions.h>
+#include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/aron/Attachment.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/aron_conversions.h>
+#include <RobotAPI/libraries/aron/common/aron_conversions.h>
+
+
+namespace armarx::armem::obj::instance
+{
+    Writer::Writer(armem::client::MemoryNameSystem& memoryNameSystem) :
+        memoryNameSystem(memoryNameSystem)
+    {}
+
+    void Writer::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
+    {
+        ARMARX_DEBUG << "Writer: registerPropertyDefinitions";
+
+        const std::string prefix = propertyPrefix;
+
+        def->optional(properties.memoryName, prefix + "MemoryName");
+
+        def->optional(properties.coreSegmentName,
+                      prefix + "CoreSegment",
+                      "Name of the memory core segment to use for object instances.");
+    }
+
+
+    void Writer::connect()
+    {
+        // Wait for the memory to become available and add it as dependency.
+        ARMARX_IMPORTANT << "Writer: Waiting for memory '" << properties.memoryName << "' ...";
+        try
+        {
+            memoryWriter = memoryNameSystem.useWriter(properties.memoryName);
+            ARMARX_IMPORTANT << "Writer: Connected to memory '" << properties.memoryName << "'";
+        }
+        catch (const armem::error::CouldNotResolveMemoryServer& e)
+        {
+            ARMARX_ERROR << e.what();
+            return;
+        }
+    }
+
+    bool Writer::commitObject(const armem::arondto::ObjectInstance& inst, const std::string& provider, const armem::Time& t)
+    {
+        armem::Commit c;
+        auto& e = c.add();
+
+        e.entityID.memoryName = properties.memoryName;
+        e.entityID.coreSegmentName = properties.coreSegmentName;
+        e.entityID.providerSegmentName = provider;
+        e.entityID.entityName = inst.pose.objectID.dataset + "/" + inst.pose.objectID.className + "/" + inst.pose.objectID.instanceName;
+        e.timeCreated = t;
+        e.timeSent = IceUtil::Time::now();
+        e.instancesData = { inst.toAron() };
+
+        auto res = memoryWriter.commit(c);
+
+        if(!res.allSuccess())
+        {
+            ARMARX_ERROR << "Failed to commit an ObjectInstance to memory: " << res.allErrorMessages();
+            return false;
+        }
+        return true;
+    }
+
+}  // namespace armarx::armem::instance
diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.h b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.h
new file mode 100644
index 0000000000000000000000000000000000000000..1c9f82e01dd6e48f4264b5de597413fb0b2eb57c
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.h
@@ -0,0 +1,67 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Fabian Reister ( fabian dot reister at kit dot edu )
+ * @date       2021
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+#include <mutex>
+#include <optional>
+
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
+#include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
+#include <RobotAPI/libraries/armem/client/Writer.h>
+#include <RobotAPI/libraries/armem_objects/types.h>
+
+#include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
+
+
+namespace armarx::armem::obj::instance
+{
+    class Writer
+    {
+    public:
+        Writer(armem::client::MemoryNameSystem& memoryNameSystem);
+        virtual ~Writer() = default;
+
+        void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
+        void connect();
+
+        bool commitObject(const armem::arondto::ObjectInstance& inst, const std::string& provider, const armem::Time&);
+
+
+    private:
+
+
+        struct Properties
+        {
+            std::string memoryName                  = "Object";
+            std::string coreSegmentName             = "Instance";
+        } properties;
+
+        const std::string propertyPrefix = "mem.obj.instance.";
+
+        armem::client::MemoryNameSystem& memoryNameSystem;
+        armem::client::Writer memoryWriter;
+        std::mutex memoryWriterMutex;
+    };
+
+
+}  // namespace armarx::armem::instance