diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index 84a5e312a9ef7502b9b3c22fcd7da4ab0f7e725b..6898b8e364aa449e87fdb7dac83735f933cb1e1d 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -41,7 +41,7 @@ set(LIB_FILES
 
     # core/base/CoreSegmentBase.cpp
     core/base/EntityBase.cpp
-    # core/base/EntityInstanceBase.cpp
+    core/base/EntityInstanceBase.cpp
     core/base/EntitySnapshotBase.cpp
     # core/base/MemoryBase.cpp
     # core/base/ProviderSegmentBase.cpp
diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp
index a6cfc7103728d5a81fecefe4ade6c96efef2814e..1cc2e9544d00ce96d65658acaf853c670418bdce 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp
+++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp
@@ -1 +1,25 @@
 #include "EntityInstanceBase.h"
+
+
+namespace armarx::armem::base
+{
+    bool EntityInstanceMetadata::operator==(const EntityInstanceMetadata& other) const
+    {
+        return timeCreated == other.timeCreated
+               && timeSent == other.timeSent
+               && timeArrived == other.timeArrived
+               && std::abs(confidence - other.confidence) < 1e-6f;
+    }
+}
+
+
+std::ostream& armarx::armem::base::operator<<(std::ostream& os, const EntityInstanceMetadata& d)
+{
+    os << "EntityInstanceMetadata: "
+       << "\n- t_create =   \t" << armem::toStringMicroSeconds(d.timeCreated) << " us"
+       << "\n- t_sent =     \t" << armem::toStringMicroSeconds(d.timeSent) << " us"
+       << "\n- t_arrived =  \t" << armem::toStringMicroSeconds(d.timeArrived) << " us"
+       << "\n- confidence = \t" << d.confidence << " us"
+       ;
+    return os;
+}
diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
index c9689c1822154c17d906132fbe95b46c9e214ed7..fcb1869f791d9094fd793ff3af721e5fb942f111 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
@@ -2,15 +2,52 @@
 
 #include <RobotAPI/libraries/armem/core/Commit.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
+
 #include "detail/MemoryItem.h"
 
 
 namespace armarx::armem::base
 {
+
+    /**
+     * @brief Default data of an entity instance (empty).
+     */
+    struct NoData
+    {
+    };
+
+
+    /**
+     * @brief Metadata of an entity instance.
+     */
+    struct EntityInstanceMetadata
+    {
+        /// Time when this value was created.
+        Time timeCreated;
+        /// Time when this value was sent to the memory.
+        Time timeSent;
+        /// Time when this value has arrived at the memory.
+        Time timeArrived;
+
+        /// An optional confidence, may be used for things like decay.
+        float confidence = 1.0;
+
+
+        bool operator==(const EntityInstanceMetadata& other) const;
+        inline bool operator!=(const EntityInstanceMetadata& other) const
+        {
+            return !(*this == other);
+        }
+    };
+
+    std::ostream& operator<<(std::ostream& os, const EntityInstanceMetadata& rhs);
+
+
+
     /**
      * @brief Data of a single entity instance.
      */
-    template <class _DerivedT>
+    template <class _DataT = NoData, class _MetadataT = EntityInstanceMetadata>
     class EntityInstanceBase :
         public detail::MemoryItem
     {
@@ -18,10 +55,9 @@ namespace armarx::armem::base
 
     public:
 
-        using DerivedT = _DerivedT;
-
+        using MetadataT = _MetadataT;
+        using DataT = _DataT;
 
-    public:
 
         EntityInstanceBase()
         {
@@ -45,17 +81,28 @@ namespace armarx::armem::base
             return id().instanceIndex;
         }
 
-        /**
-         * @brief Fill `*this` with the update's values.
-         * @param update The update.
-         * @param index The instances index.
-         */
-        virtual void update(const EntityUpdate& update) = 0;
 
-        virtual bool equalsDeep(const DerivedT& other) const = 0;
+        EntityInstanceMetadata& metadata()
+        {
+            return _metadata;
+        }
+        const EntityInstanceMetadata& metadata() const
+        {
+            return _metadata;
+        }
 
+        const DataT& data() const
+        {
+            return _data;
+        }
 
-        std::string getLevelName() const
+        DataT& data()
+        {
+            return _data;
+        }
+
+
+        static std::string getLevelName()
         {
             return "entity instance";
         }
@@ -65,6 +112,17 @@ namespace armarx::armem::base
             return std::to_string(index());
         }
 
+
+
+    protected:
+
+        /// The metadata.
+        MetadataT _metadata;
+
+        /// The data. May be nullptr.
+        DataT _data;
+
+
     };
 
 }
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp
index f0afc6a703c1ac7d8fda6b8127c1ad4692ffb946..63fe18145c561e9efda0ba2a14cb07175b029d1c 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp
@@ -6,14 +6,6 @@
 namespace armarx::armem::ltm
 {
 
-    bool EntityInstanceMetadata::operator==(const EntityInstanceMetadata& other) const
-    {
-        return timeCreated == other.timeCreated
-               && timeSent == other.timeSent
-               && timeArrived == other.timeArrived
-               && std::abs(confidence - other.confidence) < 1e-6f;
-    }
-
     bool EntityInstance::equalsDeep(const EntityInstance& other) const
     {
         return id() == other.id() && _metadata == other.metadata();
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
index c8d28b8e59136f04f38cb6795b5d06f2bfbf104a..ba72d68bf6e758f4770b5215754a6c73f2fa3e66 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
@@ -6,36 +6,16 @@
 namespace armarx::armem::ltm
 {
 
-    /**
-     * @brief Metadata of an entity instance.
-     */
-    struct EntityInstanceMetadata
-    {
-        /// Time when this value was created.
-        Time timeCreated;
-        /// Time when this value was sent to the memory.
-        Time timeSent;
-        /// Time when this value has arrived at the memory.
-        Time timeArrived;
+    using EntityInstanceMetadata = base::EntityInstanceMetadata;
 
-        /// An optional confidence, may be used for things like decay.
-        float confidence = 1.0;
-
-
-        bool operator==(const EntityInstanceMetadata& other) const;
-        inline bool operator!=(const EntityInstanceMetadata& other) const
-        {
-            return !(*this == other);
-        }
-    };
 
     /**
      * @brief Data of a single entity instance.
      */
     class EntityInstance :
-        public base::EntityInstanceBase<EntityInstance>
+        public base::EntityInstanceBase<base::NoData, EntityInstanceMetadata>
     {
-        using Base = base::EntityInstanceBase<EntityInstance>;
+        using Base = base::EntityInstanceBase<base::NoData, EntityInstanceMetadata>;
 
     public:
 
@@ -47,16 +27,6 @@ namespace armarx::armem::ltm
         EntityInstance& operator=(EntityInstance&& other) = default;
 
 
-        EntityInstanceMetadata& metadata()
-        {
-            return _metadata;
-        }
-        inline const EntityInstanceMetadata& metadata() const
-        {
-            return _metadata;
-        }
-
-
         /**
          * @brief Fill `*this` with the update's values.
          * @param update The update.
@@ -65,10 +35,6 @@ namespace armarx::armem::ltm
         void update(const EntityUpdate& update);
 
         bool equalsDeep(const EntityInstance& other) const;
-    private:
-
-        /// The metadata.
-        EntityInstanceMetadata _metadata;
 
     };
 }
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
index 1be40a13108fc30ac615a3ed08ec1a64f3245b5f..8cda21f290bdae1b7fc837fc1559fdf821bb0f2f 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
@@ -5,29 +5,9 @@
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
 
-std::ostream& armarx::armem::wm::operator<<(std::ostream& os, const EntityInstanceMetadata& d)
-{
-    os << "EntityInstanceMetadata: "
-       << "\n- t_create =   \t" << armem::toStringMicroSeconds(d.timeCreated) << " us"
-       << "\n- t_sent =     \t" << armem::toStringMicroSeconds(d.timeSent) << " us"
-       << "\n- t_arrived =  \t" << armem::toStringMicroSeconds(d.timeArrived) << " us"
-       << "\n- confidence = \t" << d.confidence << " us"
-       ;
-    return os;
-}
-
 namespace armarx::armem::wm
 {
 
-    bool EntityInstanceMetadata::operator==(const EntityInstanceMetadata& other) const
-    {
-        return timeCreated == other.timeCreated
-               && timeSent == other.timeSent
-               && timeArrived == other.timeArrived
-               && std::abs(confidence - other.confidence) < 1e-6f;
-    }
-
-
     bool EntityInstance::equalsDeep(const EntityInstance& other) const
     {
         if (_data and other.data())
@@ -48,7 +28,7 @@ namespace armarx::armem::wm
     {
         ARMARX_CHECK_FITS_SIZE(this->index(), update.instancesData.size());
 
-        setData(update.instancesData.at(size_t(this->index())));
+        this->data() = update.instancesData.at(size_t(this->index()));
 
         this->_metadata.confidence = update.confidence;
 
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
index fbeb3f19f93e594604fd9de94da6975584b12745..18d744c59731331e010d8ebea257e7d51aa5ed0b 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
@@ -6,43 +6,18 @@
 namespace armarx::armem::wm
 {
 
+    using EntityInstanceMetadata = base::EntityInstanceMetadata;
     using EntityInstanceData = armarx::aron::datanavigator::DictNavigator;
     using EntityInstanceDataPtr = armarx::aron::datanavigator::DictNavigatorPtr;
 
 
-    /**
-     * @brief Metadata of an entity instance.
-     */
-    struct EntityInstanceMetadata
-    {
-        /// Time when this value was created.
-        Time timeCreated;
-        /// Time when this value was sent to the memory.
-        Time timeSent;
-        /// Time when this value has arrived at the memory.
-        Time timeArrived;
-
-        /// An optional confidence, may be used for things like decay.
-        float confidence = 1.0;
-
-
-        bool operator==(const EntityInstanceMetadata& other) const;
-        inline bool operator!=(const EntityInstanceMetadata& other) const
-        {
-            return !(*this == other);
-        }
-    };
-
-    std::ostream& operator<<(std::ostream& os, const EntityInstanceMetadata& rhs);
-
-
     /**
      * @brief Data of a single entity instance.
      */
     class EntityInstance :
-        public base::EntityInstanceBase<EntityInstance>
+        public base::EntityInstanceBase<EntityInstanceDataPtr, EntityInstanceMetadata>
     {
-        using Base = base::EntityInstanceBase<EntityInstance>;
+        using Base = base::EntityInstanceBase<EntityInstanceDataPtr, EntityInstanceMetadata>;
 
     public:
 
@@ -54,43 +29,14 @@ namespace armarx::armem::wm
         EntityInstance& operator=(EntityInstance&& other) = default;
 
 
-        EntityInstanceMetadata& metadata()
-        {
-            return _metadata;
-        }
-        inline const EntityInstanceMetadata& metadata() const
-        {
-            return _metadata;
-        }
-
-        inline EntityInstanceDataPtr data() const
-        {
-            return _data;
-        }
-
-        void setData(const aron::datanavigator::DictNavigatorPtr& data)
-        {
-            this->_data = data;
-        }
-
-
         /**
          * @brief Fill `*this` with the update's values.
          * @param update The update.
          * @param index The instances index.
          */
-        virtual void update(const EntityUpdate& update) override;
-
-        virtual bool equalsDeep(const EntityInstance& other) const override;
-
-
-    private:
-
-        /// The metadata.
-        EntityInstanceMetadata _metadata;
+        void update(const EntityUpdate& update);
 
-        /// The data. May be nullptr.
-        EntityInstanceDataPtr _data;
+        bool equalsDeep(const EntityInstance& other) const;
 
     };
 }
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.cpp
index 31538f8d8e2f1eeaf932ed16e50b7040520f0a99..0d9344be877417264f27c9370052b7fb4d098604 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.cpp
@@ -16,8 +16,7 @@ namespace armarx::armem
 
         if (dataWrapped->hasElement(DATA_WRAPPER_DATA_FIELD))
         {
-            aron::datanavigator::DictNavigatorPtr data = aron::datanavigator::DictNavigator::DynamicCastAndCheck(dataWrapped->getElement(DATA_WRAPPER_DATA_FIELD));
-            e.setData(data);
+            e.data() = aron::datanavigator::DictNavigator::DynamicCastAndCheck(dataWrapped->getElement(DATA_WRAPPER_DATA_FIELD));
         }
 
         auto timeCreated = aron::datanavigator::LongNavigator::DynamicCastAndCheck(dataWrapped->getElement(DATA_WRAPPER_TIME_CREATED_FIELD));
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.h b/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.h
index f3b25566f110dca844e24dcac4c997f724c74548..ab9ab27c4e361b6faad31c8063ed175316d960b0 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/entityInstance_conversions.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Memory.h"
+#include "EntityInstance.h"
 
 namespace armarx::armem
 {
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/ice_conversions.cpp
index 58db49b16deda95182a9307d8866b3d9f2326b40..8509ed5ea641028af0ab60c27af0f947acbf8a58 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/ice_conversions.cpp
@@ -37,7 +37,7 @@ namespace armarx::armem
 
         if (ice.data)
         {
-            data.setData(aron::datanavigator::DictNavigator::FromAronDictPtr(ice.data));
+            data.data() = aron::datanavigator::DictNavigator::FromAronDictPtr(ice.data);
         }
         fromIce(ice.metadata, data.metadata());
     }
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp
index a4945405e752f32cd8d5b9836650fc92e5cdd7ea..b8d97d2d06958e5a49bee86447de23aa1c665f9f 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp
@@ -25,7 +25,7 @@ namespace armarx::armem::wm::query_proc
             wm::EntitySnapshot copy = snapshot;
             copy.forEachInstance([](EntityInstance & i)
             {
-                i.setData(nullptr);
+                i.data() = nullptr;
                 return true;
             });
             result.addSnapshot(std::move(copy));