diff --git a/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.cpp b/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.cpp
index e5d468c552d96d70d3ef4ae92196cdb714f39163..3d8907a348bad7051e3fc88239f3b816899acd5e 100644
--- a/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.cpp
+++ b/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.cpp
@@ -44,12 +44,6 @@ namespace armarx::armem::client::util
         }
     }
 
-    std::mutex&
-    SimpleWriterBase::memoryWriterMutex()
-    {
-        return memoryMutex;
-    }
-
     armem::client::Writer&
     SimpleWriterBase::memoryWriter()
     {
diff --git a/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.h b/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.h
index 13a54cc5b213a90e1949f73c1b11de716c0593cc..895376b0a2f3ff1f30fdd070c2e50c62b9aa2968 100644
--- a/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.h
+++ b/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.h
@@ -58,7 +58,6 @@ namespace armarx::armem::client::util
         virtual std::string propertyPrefix() const = 0;
         virtual Properties defaultProperties() const = 0;
 
-        std::mutex& memoryWriterMutex();
         armem::client::Writer& memoryWriter();
 
 
@@ -66,7 +65,6 @@ namespace armarx::armem::client::util
         Properties props;
 
         armem::client::Writer memoryWriterClient;
-        std::mutex memoryMutex;
     };
 
 } // namespace armarx::armem::client::util
diff --git a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
index 63da8444d40d90e6c4e73a1a4fd755082f4914f9..bbb52cc2b5f473d71cbf1d7c73e39002368f71ad 100644
--- a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
@@ -36,6 +36,8 @@ armarx_add_library(
 
         server/attachments/Segment.h
 
+        client/class/ClassReader.h
+        client/class/ClassWriter.h
         client/articulated_object/Reader.h
         client/articulated_object/Writer.h
         client/articulated_object/ArticulatedObjectReader.h
@@ -55,6 +57,8 @@ armarx_add_library(
         types.cpp
         utils.cpp
 
+        client/class/ClassReader.cpp
+        client/class/ClassWriter.cpp
         client/articulated_object/Reader.cpp
         client/articulated_object/Writer.cpp
         client/articulated_object/ArticulatedObjectReader.cpp
diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bceba7d960ffbe41a620c36d47a5d8fc0897c157
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp
@@ -0,0 +1,45 @@
+#include "ClassReader.h"
+
+namespace armarx::armem::obj::clazz
+{
+    std::optional<armem::clazz::ObjectClass>
+    ClassReader::getObjectClass(const std::string& providerName, const ObjectID& id)
+    {
+        auto mid = armarx::armem::MemoryID();
+        mid.memoryName = properties().memoryName;
+        mid.coreSegmentName = properties().coreSegmentName;
+        mid.providerSegmentName = providerName;
+        mid.entityName = id.str();
+
+        auto i = this->memoryReader().getLatestSnapshotIn(mid);
+
+        if (i.has_value() && i->size() == 1)
+        {
+            auto& instance = i->getInstance(0);
+            auto aron = instance.dataAs<armarx::armem::arondto::ObjectClass>();
+
+            armem::clazz::ObjectClass objClass;
+            armarx::armem::clazz::fromAron(aron, objClass);
+
+            return objClass;
+        }
+
+        return std::nullopt;
+    }
+
+    std::string
+    ClassReader::propertyPrefix() const
+    {
+        return "classReader.";
+    }
+
+    client::util::SimpleReaderBase::Properties
+    ClassReader::defaultProperties() const
+    {
+        client::util::SimpleReaderBase::Properties p;
+        p.memoryName = "Object";
+        p.coreSegmentName = "Class";
+        return p;
+    }
+
+} // namespace armarx::armem::obj::clazz
diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h
new file mode 100644
index 0000000000000000000000000000000000000000..4d2805b4f03e81bb6b58b65d73997eeae56755ab
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h
@@ -0,0 +1,49 @@
+/*
+ * 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 <RobotAPI/libraries/armem/client/util/SimpleReaderBase.h>
+#include <RobotAPI/libraries/armem_objects/aron_conversions.h>
+#include <RobotAPI/libraries/armem_objects/types.h>
+
+namespace armarx::armem::obj::clazz
+{
+    class ClassReader : public armem::client::util::SimpleReaderBase
+    {
+    public:
+        ClassReader() = default;
+
+        std::optional<armem::clazz::ObjectClass> getObjectClass(const std::string& providerName,
+                                                                const armarx::ObjectID& id);
+
+    protected:
+        std::string propertyPrefix() const final;
+        Properties defaultProperties() const final;
+
+    private:
+    };
+
+
+} // namespace armarx::armem::obj::clazz
diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.cpp b/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f9f1d109bca843610638ab3473314ab5fe1c4a03
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.cpp
@@ -0,0 +1,48 @@
+#include "ClassWriter.h"
+
+namespace armarx::armem::obj::clazz
+{
+    bool
+    ClassWriter::commitObjectClass(const armarx::armem::clazz::ObjectClass& c,
+                                   const armarx::core::time::DateTime& referenceTime)
+    {
+        armarx::armem::arondto::ObjectClass objClassAron;
+        armarx::armem::clazz::toAron(objClassAron, c);
+
+        armarx::armem::MemoryID mid;
+        mid.memoryName = properties().memoryName;
+        mid.coreSegmentName = properties().coreSegmentName;
+        mid.providerSegmentName = properties().providerName;
+        mid.entityName = c.id.str();
+
+        auto commit = armarx::armem::Commit();
+        auto& update = commit.add();
+
+        update.confidence = 1.0f;
+        update.referencedTime = referenceTime;
+        update.sentTime = armarx::core::time::DateTime::Now();
+        update.entityID = mid;
+        update.instancesData = {objClassAron.toAron()};
+
+        auto res = this->memoryWriter().commit(commit);
+
+        return res.allSuccess();
+    }
+
+    std::string
+    ClassWriter::propertyPrefix() const
+    {
+        return "classWriter.";
+    }
+
+    client::util::SimpleWriterBase::Properties
+    ClassWriter::defaultProperties() const
+    {
+        client::util::SimpleWriterBase::Properties p;
+        p.memoryName = "Object";
+        p.coreSegmentName = "Class";
+        p.providerName = providerName;
+        return p;
+    }
+
+} // namespace armarx::armem::obj::clazz
diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.h b/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.h
new file mode 100644
index 0000000000000000000000000000000000000000..db17223ba7f8dc550283fb2aa5c1ed3d11872f7e
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.h
@@ -0,0 +1,50 @@
+/*
+ * 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 <RobotAPI/libraries/armem/client/util/SimpleWriterBase.h>
+#include <RobotAPI/libraries/armem_objects/aron_conversions.h>
+#include <RobotAPI/libraries/armem_objects/types.h>
+
+namespace armarx::armem::obj::clazz
+{
+    class ClassWriter : public armem::client::util::SimpleWriterBase
+    {
+    public:
+        ClassWriter(const std::string& p) : providerName(p){};
+
+        bool commitObjectClass(const armarx::armem::clazz::ObjectClass& c,
+                               const armarx::core::time::DateTime& referenceTime);
+
+    protected:
+        std::string propertyPrefix() const final;
+        Properties defaultProperties() const final;
+
+    private:
+        const std::string providerName;
+    };
+
+
+} // namespace armarx::armem::obj::clazz
diff --git a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp
index a682162553005783d3ad74e42d78bffefbc09ae2..9c06db1e5ce466aaa3a1461f5274d99b26d64c91 100644
--- a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp
@@ -1,19 +1,21 @@
 #include "Writer.h"
 
-#include <RobotAPI/libraries/armem_vision/aron_conversions.h>
 #include <RobotAPI/libraries/armem_vision/aron/OccupancyGrid.aron.generated.h>
-
+#include <RobotAPI/libraries/armem_vision/aron_conversions.h>
 
 namespace armarx::armem::vision::occupancy_grid::client
 {
     Writer::~Writer() = default;
 
-    bool Writer::store(const OccupancyGrid& grid,
-                       const std::string& frame,
-                       const std::string& providerName,
-                       const std::int64_t& timestamp)
+    bool
+    Writer::store(const OccupancyGrid& grid,
+                  const std::string& frame,
+                  const std::string& providerName,
+                  const std::int64_t& timestamp)
     {
-        std::lock_guard g{memoryWriterMutex()};
+        static std::mutex mutex;
+
+        std::lock_guard g{mutex};
 
         const auto result = memoryWriter().addSegment(properties().coreSegmentName, providerName);
 
@@ -28,7 +30,7 @@ namespace armarx::armem::vision::occupancy_grid::client
         const auto iceTimestamp = Time(Duration::MicroSeconds(timestamp));
 
         const auto providerId = armem::MemoryID(result.segmentID);
-        const auto entityID   = providerId.withEntityName(frame).withTimestamp(iceTimestamp);
+        const auto entityID = providerId.withEntityName(frame).withTimestamp(iceTimestamp);
 
         armem::EntityUpdate update;
         update.entityID = entityID;
@@ -41,7 +43,7 @@ namespace armarx::armem::vision::occupancy_grid::client
         dict->addElement("grid", toAron(grid.grid));
 
         update.instancesData = {dict};
-        update.referencedTime   = iceTimestamp;
+        update.referencedTime = iceTimestamp;
 
         ARMARX_DEBUG << "Committing " << update << " at time " << iceTimestamp;
         armem::EntityUpdateResult updateResult = memoryWriter().commit(update);
@@ -56,7 +58,8 @@ namespace armarx::armem::vision::occupancy_grid::client
         return updateResult.success;
     }
 
-    std::string Writer::propertyPrefix() const
+    std::string
+    Writer::propertyPrefix() const
     {
         return "mem.vision.occupancy_grid.";
     }
@@ -65,7 +68,7 @@ namespace armarx::armem::vision::occupancy_grid::client
     Writer::defaultProperties() const
     {
 
-        return SimpleWriterBase::Properties{.memoryName      = "Vision",
+        return SimpleWriterBase::Properties{.memoryName = "Vision",
                                             .coreSegmentName = "OccupancyGrid"};
     }
 } // namespace armarx::armem::vision::occupancy_grid::client