diff --git a/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h b/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
index f4d0b530f43afcfa7f7aeba95389bdb8a5371918..4f63c6f3a5cb14ad61f4d4664ead485c78345938 100644
--- a/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/CoreSegmentBase.h
@@ -247,11 +247,10 @@ namespace armarx::armem::base
         }
 
 
-        void append(const _Derived& m)
+        template <class OtherDerivedT>
+        void append(const OtherDerivedT& other)
         {
-            // ARMARX_INFO << "CoreSegment: Merge name '" << m.name() << "' into '" << name() << "'";
-
-            m.forEachProviderSegment([this](const ProviderSegmentT & provSeg)
+            other.forEachProviderSegment([this](const auto& provSeg)
             {
                 auto it = this->_container.find(provSeg.name());
                 if (it == this->_container.end())
diff --git a/source/RobotAPI/libraries/armem/core/base/EntityBase.h b/source/RobotAPI/libraries/armem/core/base/EntityBase.h
index f45018ff955fac99b7cf0824eaff7539eee9ac29..30c58aeca6c5f0374705a481be22db6e28645792 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityBase.h
@@ -535,20 +535,19 @@ namespace armarx::armem::base
         }
 
 
-        void append(const DerivedT& m)
+        template <class OtherDerivedT>
+        void append(const OtherDerivedT& other)
         {
-            // ARMARX_INFO << "Entity: Merge name '" << m.name() << "' into '" << name() << "'";
-
-            m.forEachSnapshot([this](const EntitySnapshotT & snapshot)
+            other.forEachSnapshot([this](const auto& snapshot)
             {
                 auto it = this->_container.find(snapshot.time());
                 if (it == this->_container.end())
                 {
                     EntitySnapshotT copy { snapshot };
-                    copy.id() = this->id().withTimestamp(snapshot.time()); // update id (e.g. memory name) if necessary
+                    copy.id() = this->id().withTimestamp(snapshot.time());  // update id (e.g. memory name) if necessary
                     this->_container.emplace(snapshot.time(), copy);
                 }
-                // else: segment already exists
+                // else: snapshot already exists
                 // We assume that a snapshot does not change, so ignore
                 return true;
             });
diff --git a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
index e1729bbcd90cc6062e93b8e62ed8db29e3bb4387..2d28474e232281c085cad9a88cd0dcd85fec70d0 100644
--- a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
@@ -281,11 +281,10 @@ namespace armarx::armem::base
          * @brief Merge another memory into this one. Append all data
          * @param m The other memory
          */
-        void append(const _Derived& m)
+        template <class OtherDerivedT>
+        void append(const OtherDerivedT& other)
         {
-            // ARMARX_INFO << "Memory: Merge name '" << m.name() << "' into '" << name() << "'";
-
-            m.forEachCoreSegment([this](const CoreSegmentT & coreSeg)
+            other.forEachCoreSegment([this](const auto& coreSeg)
             {
                 auto it = this->_container.find(coreSeg.name());
                 if (it == this->_container.end())
diff --git a/source/RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h b/source/RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h
index 6a5497444c9e5959ac7d59300e1bc99e0fac2018..a2a9f2a8c8ae6b57ff33ce1ecf8d1d1b5710ff55 100644
--- a/source/RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/ProviderSegmentBase.h
@@ -229,9 +229,11 @@ namespace armarx::armem::base
             return ret;
         }
 
-        void append(const DerivedT& m)
+
+        template <class OtherDerivedT>
+        void append(const OtherDerivedT& other)
         {
-            m.forEachEntity([this](const EntityT & entity)
+            other.forEachEntity([this](const auto& entity)
             {
                 auto it = this->_container.find(entity.name());
                 if (it == this->_container.end())