diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
index 3ec7db60a82604d2f87f4476d592197184daeccc..94d26b5c58ff6894d3cb898e4755e64ea14beacf 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
@@ -453,18 +453,26 @@ namespace armarx::armem::server
     {
         ARMARX_TRACE;
         ARMARX_CHECK_NOT_NULL(longtermMemory);
+        ARMARX_CHECK_NOT_NULL(workingMemory);
         ARMARX_IMPORTANT << "Disabling the recording of memory " << longtermMemory->id().str();
 
+        if(longtermMemory->p.storeOnStop){ //if true this means when stopping LTM recording leftover snapshots are transferred to WM using the simulated consolidation
+            ARMARX_INFO << "Starting to save left-over WM data into LTM";
+            longtermMemory->directlyStore(*workingMemory, true);
+            ARMARX_INFO << "Stored leftover WM data into LTM";
+        } else {
+            ARMARX_INFO << "Not storing WM data into LTM on stop, because storeOnStop is " << longtermMemory->p.storeOnStop;
+        }
+
         //put calling stopRecording into a seperate thread and detach to make sure GUI does not freeze
         auto ltm = longtermMemory;
+
         std::thread stopRecordingThread([&ltm](){
             ltm->stopRecording();
-        });
-        std::thread savingDataUpdateThread([&ltm](){
             ltm->bufferFinished();
+            ARMARX_INFO << "Storing finished";
         });
         stopRecordingThread.detach();
-        savingDataUpdateThread.detach();
 
         ARMARX_IMPORTANT
             << "Stopped all LTM recordings, please wait with stopping the component until "
diff --git a/source/RobotAPI/libraries/armem/server/ltm/CoreSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/CoreSegment.cpp
index 3f8d4f8d62fbdcefe48b1e76f5798303e0dfe336..ff955d28e1778f3d30fa28ca9dc56345b44273bd 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/CoreSegment.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/CoreSegment.cpp
@@ -155,7 +155,7 @@ namespace armarx::armem::server::ltm
     }
 
     void
-    CoreSegment::_store(const armem::wm::CoreSegment& c)
+    CoreSegment::_store(const armem::wm::CoreSegment& c, bool simulatedVersion)
     {
         std::lock_guard l(ltm_mutex);
 
@@ -207,7 +207,7 @@ namespace armarx::armem::server::ltm
                                   id().withProviderSegmentName(prov.id().providerSegmentName),
                                   processors);
 
-                c.store(prov);
+                c.store(prov, simulatedVersion);
             });
     }
 } // namespace armarx::armem::server::ltm
diff --git a/source/RobotAPI/libraries/armem/server/ltm/CoreSegment.h b/source/RobotAPI/libraries/armem/server/ltm/CoreSegment.h
index 062ce79c398577de0cc6927315a042d141e5b587..1c36d1436f03d185419c638cf88964d4f5a1656f 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/CoreSegment.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/CoreSegment.h
@@ -30,7 +30,7 @@ namespace armarx::armem::server::ltm
         void _loadAllReferences(armem::wm::CoreSegment&) override;
         void _loadLatestNReferences(int n, armem::wm::CoreSegment& c) override;
         void _resolve(armem::wm::CoreSegment&) override;
-        void _store(const armem::wm::CoreSegment&) override;
+        void _store(const armem::wm::CoreSegment&, bool simulatedVersion) override;
 
     private:
     };
diff --git a/source/RobotAPI/libraries/armem/server/ltm/Entity.cpp b/source/RobotAPI/libraries/armem/server/ltm/Entity.cpp
index 306bd90e2ac7b22273870752ab794404eca0ef24..5ce8cab3d761b2f2ce78b37fe290617c3732d030 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/Entity.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/Entity.cpp
@@ -423,7 +423,7 @@ namespace armarx::armem::server::ltm
     }
 
     void
-    Entity::_store(const armem::wm::Entity& c)
+    Entity::_store(const armem::wm::Entity& c, bool simulatedVersion)
     {
         std::lock_guard l(ltm_mutex);
         if (id().entityName.empty())
@@ -464,17 +464,19 @@ namespace armarx::armem::server::ltm
 
                 for (auto& f : processors->snapFilters)
                 {
-
-                    bool accepted = f->accept(snap);
+                    bool accepted = f->accept(snap, simulatedVersion);
+                    
                     if (!accepted)
                     {
-                        //ARMARX_INFO << "Ignoring to put an EntitiySnapshot into the LTM because it got filtered.";
+                        ARMARX_DEBUG << "Ignoring to put an EntitySnapshot into the LTM because it got filtered.";
                         return;
                     } else {
                         //ARMARX_INFO << "Storing EntitySnapshot";
                     }
                 }
 
+                ARMARX_DEBUG << "Snapshot: " << c.id().timestamp << " of coreSegment " << c.id().coreSegmentName;
+
                 c.store(snap);
                 statistics.recordedSnapshots++;
             });
diff --git a/source/RobotAPI/libraries/armem/server/ltm/Entity.h b/source/RobotAPI/libraries/armem/server/ltm/Entity.h
index 82f22a63c1e8f6829d6f6538b91a44ea68a34a65..a873f444b3f0ea23a404eb66989990803d37edfc 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/Entity.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/Entity.h
@@ -49,7 +49,7 @@ namespace armarx::armem::server::ltm
         void _loadAllReferences(armem::wm::Entity&) override;
         void _loadLatestNReferences(int n, armem::wm::Entity& e) override;
         void _resolve(armem::wm::Entity&) override;
-        void _store(const armem::wm::Entity&) override;
+        void _store(const armem::wm::Entity& e, bool simulatedVersion) override;
 
     private:
     };
diff --git a/source/RobotAPI/libraries/armem/server/ltm/Memory.cpp b/source/RobotAPI/libraries/armem/server/ltm/Memory.cpp
index 39e18a3724a652aa6a44cbce5e78889ec33a6407..a950f15410ed4a4283895e896d42856f835c5575 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/Memory.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/Memory.cpp
@@ -62,7 +62,7 @@ namespace armarx::armem::server::ltm
     Memory::_disable()
     {
         BufferedBase::stop();
-        MongoDBStorageMixin::stop();
+        //MongoDBStorageMixin::stop();
         ARMARX_IMPORTANT << "Storing of data finished, starting to generate and save statistics...";
         getAndSaveStatistics();
     }
@@ -261,7 +261,7 @@ namespace armarx::armem::server::ltm
     }
 
     void
-    Memory::_directlyStore(const armem::wm::Memory& memory)
+    Memory::_directlyStore(const armem::wm::Memory& memory, bool simulatedVersion)
     {
         std::lock_guard l(ltm_mutex); // we cannot store a memory multiple times simultaneously
 
@@ -280,6 +280,8 @@ namespace armarx::armem::server::ltm
             return;
         }*/
 
+        ARMARX_DEBUG << "CoreSegments: " << memory.getCoreSegmentNames().size();
+
         memory.forEachCoreSegment(
             [&](const auto& core)
             {
@@ -290,7 +292,7 @@ namespace armarx::armem::server::ltm
                               processors);
 
                 // 2. store data
-                c.store(core);
+                c.store(core, simulatedVersion);
                 
 
                 // 3. update statistics
diff --git a/source/RobotAPI/libraries/armem/server/ltm/Memory.h b/source/RobotAPI/libraries/armem/server/ltm/Memory.h
index 4c7b287fc15e3f713250e2e082250e8baf309661..bb022c1e2e4e196215eb7288f5dc0a28d70b458a 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/Memory.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/Memory.h
@@ -60,8 +60,8 @@ namespace armarx::armem::server::ltm
         void _loadLatestNReferences(int n, armem::wm::Memory& m) final;
         void _loadLatestNReferences(int n, armem::wm::Memory& m, std::list<std::string> coreSegNames) final;
         void _resolve(armem::wm::Memory&) final;
-        void _store(const armem::wm::Memory&) final;
-        void _directlyStore(const armem::wm::Memory&) final;
+        void _store(const armem::wm::Memory& m) final;
+        void _directlyStore(const armem::wm::Memory& m, bool simulatedVersion) final;
         void _loadOnStartup() final;
 
     private:
diff --git a/source/RobotAPI/libraries/armem/server/ltm/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/server/ltm/ProviderSegment.cpp
index 8978aecedae25da25c3dba5abbc89bfd6793be3a..f568b32137ab22872076c72c32e6078b03a2e99c 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/ProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/ProviderSegment.cpp
@@ -155,7 +155,7 @@ namespace armarx::armem::server::ltm
     }
 
     void
-    ProviderSegment::_store(const armem::wm::ProviderSegment& p)
+    ProviderSegment::_store(const armem::wm::ProviderSegment& p, bool simulatedVersion)
     {
         std::lock_guard l(ltm_mutex);
 
@@ -206,7 +206,7 @@ namespace armarx::armem::server::ltm
                          id().withEntityName(e.id().entityName),
                          processors);
 
-                c.store(e);
+                c.store(e, simulatedVersion);
                 statistics.recordedEntities++;
             });
         }
diff --git a/source/RobotAPI/libraries/armem/server/ltm/ProviderSegment.h b/source/RobotAPI/libraries/armem/server/ltm/ProviderSegment.h
index 1d6ac9d36a5a75edb80d0ab609518aeef07407f5..056740808ca2508c3eb1e1e1ca99b9ff7f1e1362 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/ProviderSegment.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/ProviderSegment.h
@@ -30,7 +30,7 @@ namespace armarx::armem::server::ltm
         void _loadAllReferences(armem::wm::ProviderSegment&) override;
         void _loadLatestNReferences(int n, armem::wm::ProviderSegment& p) override;
         void _resolve(armem::wm::ProviderSegment&) override;
-        void _store(const armem::wm::ProviderSegment&) override;
+        void _store(const armem::wm::ProviderSegment&, bool simulatedVersion) override;
 
     private:
     };
diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/CoreSegmentBase.h b/source/RobotAPI/libraries/armem/server/ltm/detail/CoreSegmentBase.h
index 79a5cc7742dbd1c44f5998fd5a14b3cb86dc9de5..ce70f089d74cb7beae72b037449676f087c4befd 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/CoreSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/CoreSegmentBase.h
@@ -50,9 +50,9 @@ namespace armarx::armem::server::ltm::detail
 
         /// encode the content of a wm::Memory and store
         void
-        store(const armem::wm::CoreSegment& coreSeg)
+        store(const armem::wm::CoreSegment& coreSeg, bool simulatedVersion)
         {
-            _store(coreSeg);
+            _store(coreSeg, simulatedVersion);
         }
 
         /// statistics
@@ -95,7 +95,7 @@ namespace armarx::armem::server::ltm::detail
         virtual void _loadAllReferences(armem::wm::CoreSegment&) = 0;
         virtual void _loadLatestNReferences(int n, armem::wm::CoreSegment& c) = 0;
         virtual void _resolve(armem::wm::CoreSegment&) = 0;
-        virtual void _store(const armem::wm::CoreSegment&) = 0;
+        virtual void _store(const armem::wm::CoreSegment& c, bool simulatedVersion=false) = 0;
 
     protected:
         mutable std::recursive_mutex ltm_mutex;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/EntityBase.h b/source/RobotAPI/libraries/armem/server/ltm/detail/EntityBase.h
index 3bf90a7f48c0743d8aeea804be40d8cbf477475d..3de97348618f77988bf87f92d5c97c2508f08fb5 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/EntityBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/EntityBase.h
@@ -50,9 +50,9 @@ namespace armarx::armem::server::ltm::detail
 
         /// encode the content of a wm::Memory and store
         void
-        store(const armem::wm::Entity& e)
+        store(const armem::wm::Entity& e, bool simulatedVersion)
         {
-            _store(e);
+            _store(e, simulatedVersion);
         }
 
         /// statistics
@@ -108,7 +108,7 @@ namespace armarx::armem::server::ltm::detail
         virtual void _loadAllReferences(armem::wm::Entity&) = 0;
         virtual void _loadLatestNReferences(int n, armem::wm::Entity& e) = 0;
         virtual void _resolve(armem::wm::Entity&) = 0;
-        virtual void _store(const armem::wm::Entity&) = 0;
+        virtual void _store(const armem::wm::Entity& e, bool simulatedVersion=false) = 0;
 
     protected:
         mutable std::recursive_mutex ltm_mutex;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/EntitySnapshotBase.h b/source/RobotAPI/libraries/armem/server/ltm/detail/EntitySnapshotBase.h
index cebbca9555f09e09da6b143056a024ac15b9d6a9..f6488bad8a09dcd3ae9c6204bc2a2babea1467c8 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/EntitySnapshotBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/EntitySnapshotBase.h
@@ -78,7 +78,7 @@ namespace armarx::armem::server::ltm::detail
     protected:
         virtual void _loadAllReferences(armem::wm::EntitySnapshot&) const = 0;
         virtual void _resolve(armem::wm::EntitySnapshot&) const = 0;
-        virtual void _store(const armem::wm::EntitySnapshot&) = 0;
+        virtual void _store(const armem::wm::EntitySnapshot& s) = 0;
 
     protected:
         mutable std::recursive_mutex ltm_mutex;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h b/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h
index 4feb130787c76b9c21e54147255ada9216ba54a5..eab1c6b743f8692d738f73add82ed415d41a65a2 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h
@@ -213,8 +213,8 @@ namespace armarx::armem::server::ltm::detail
         void
         store(const armem::server::wm::Memory& serverMemory)
         {
-            wm::Memory memory;
-            memory.update(armem::toCommit(serverMemory));
+            armem::wm::Memory memory(serverMemory.name());
+            memory.update(armem::toCommit(serverMemory), true);
             this->store(memory);
         }
 
@@ -234,11 +234,11 @@ namespace armarx::armem::server::ltm::detail
             defs->optional(p.enabled_on_startup, prefix + "enabled");
             defs->optional(p.configuration_on_startup, prefix + "configuration");
             defs->optional(p.export_name, prefix + "exportName");
+            defs->optional(p.storeOnStop, prefix + "storeOnStop");
 
             defs->optional(p.importOnStartUp, prefix + "importOnStartUp");
             defs->optional(p.maxAmountOfSnapshotsLoaded, prefix + "maxAmountSnapshotsLoaded");
             defs->optional(p.coreSegmentsToLoad, prefix + "loadedCoreSegments");
-            
         }
 
         /// enable/disable
@@ -337,7 +337,7 @@ namespace armarx::armem::server::ltm::detail
         virtual void _loadAllReferences(armem::wm::Memory& memory) = 0;
         virtual void _resolve(armem::wm::Memory& memory) = 0;
         virtual void _store(const armem::wm::Memory& memory) = 0;
-        virtual void _directlyStore(const armem::wm::Memory& memory) = 0;
+        virtual void _directlyStore(const armem::wm::Memory& memory, bool simulatedVersion=false) = 0;
         virtual void _loadOnStartup() = 0;
         virtual void _loadLatestNReferences(int n, armem::wm::Memory& memory) = 0;
         virtual void _loadLatestNReferences(int n, armem::wm::Memory& memory, std::list<std::string> coreSegNames) = 0;
@@ -348,7 +348,7 @@ namespace armarx::armem::server::ltm::detail
         {
             bool enabled_on_startup = false;
             std::string configuration_on_startup =
-                "{ \"SnapshotFrequencyFilter\": {\"WaitingTimeInMsForFilter\" : 50}"; //record with 20 fps as standard
+                "{ \"SnapshotFrequencyFilter\": {\"WaitingTimeInMsForFilter\" : 50}}"; //record with 20 fps as standard
             std::string export_name = "MemoryExport";
             std::string export_path = "/tmp/ltm";
             bool storeOnStop = true; 
diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/ProviderSegmentBase.h b/source/RobotAPI/libraries/armem/server/ltm/detail/ProviderSegmentBase.h
index 0aa25896fbbe481fdc682525b77224301882f38f..91f853f92a44cf227f11569bca4442837d11ac8a 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/ProviderSegmentBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/ProviderSegmentBase.h
@@ -48,9 +48,9 @@ namespace armarx::armem::server::ltm::detail
 
         /// encode the content of a wm::Memory and store
         void
-        store(const armem::wm::ProviderSegment& provSeg)
+        store(const armem::wm::ProviderSegment& provSeg, bool simulatedVersion)
         {
-            _store(provSeg);
+            _store(provSeg, simulatedVersion);
         }
 
         /// statistics
@@ -91,7 +91,7 @@ namespace armarx::armem::server::ltm::detail
         virtual void _loadAllReferences(armem::wm::ProviderSegment&) = 0;
         virtual void _loadLatestNReferences(int n, armem::wm::ProviderSegment& p) = 0;
         virtual void _resolve(armem::wm::ProviderSegment&) = 0;
-        virtual void _store(const armem::wm::ProviderSegment&) = 0;
+        virtual void _store(const armem::wm::ProviderSegment& p, bool simulatedVersion=false) = 0;
 
     protected:
         mutable std::recursive_mutex ltm_mutex;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/BufferedMemoryMixin.h b/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/BufferedMemoryMixin.h
index 103811f410578b39acf50ab7575b0aa8208f5e6e..0a17f6adcac3f7d491e55047247b83deb10f3aa9 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/BufferedMemoryMixin.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/BufferedMemoryMixin.h
@@ -28,22 +28,23 @@ namespace armarx::armem::server::ltm::detail::mixin
         virtual ~BufferedMemoryMixin() = default;
 
         void
-        directlyStore(const armem::wm::Memory& memory)
+        directlyStore(const armem::wm::Memory& memory, bool simulatedVersion=false)
         {
             std::lock_guard l(storeMutex);
 
             TIMING_START(LTM_Memory_DirectlyStore);
-            _directlyStore(memory);
+            _directlyStore(memory, simulatedVersion);
             TIMING_END_STREAM(LTM_Memory_DirectlyStore, ARMARX_DEBUG);
         }
 
         void
-        directlyStore(const armem::server::wm::Memory& serverMemory)
+        directlyStore(const armem::server::wm::Memory& serverMemory, bool simulatedVersion=false)
         {
-            wm::Memory memory;
+            armem::wm::Memory memory;
             memory.setName(serverMemory.name());
-            memory.update(armem::toCommit(serverMemory));
-            this->directlyStore(memory);
+            auto ids = memory.update(armem::toCommit(serverMemory), true);
+            ARMARX_DEBUG << "Amount of ids in update: " << ids.size();
+            this->directlyStore(memory, simulatedVersion);
         }
 
         void
@@ -137,7 +138,7 @@ namespace armarx::armem::server::ltm::detail::mixin
             defs->optional(storeFrequency, prefix + "storeFrequency");
         }
 
-        virtual void _directlyStore(const armem::wm::Memory& memory) = 0;
+        virtual void _directlyStore(const armem::wm::Memory& memory, bool simulatedVersion=false) = 0;
 
         void
         addToBuffer(const armem::wm::Memory& memory)
diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/Filter.h b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/Filter.h
index 7cd2ade2e06a3d623f9138b23bb85cccef9f1dd1..4bf8ec0493bf70a31a402ef7e196e1463c4de515 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/Filter.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/Filter.h
@@ -29,7 +29,7 @@ namespace armarx::armem::server::ltm::processor
         SnapshotFilter() = default;
         virtual ~SnapshotFilter() = default;
 
-        virtual bool accept(const armem::wm::EntitySnapshot& e) = 0;
+        virtual bool accept(const armem::wm::EntitySnapshot& e, bool simulatedVersion = false) = 0;
         virtual void configure(const nlohmann::json& json);
 
         struct FilterStatistics {
diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.cpp b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.cpp
index 715520f7b51d362cfab9df471ef677e5d926e464..6f55b623a9fdc92a5ba518d63e2ace9c8003826b 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.cpp
@@ -9,7 +9,7 @@
 namespace armarx::armem::server::ltm::processor::filter
 {
     bool
-    SnapshotSimilarityFilter::accept(const armem::wm::EntitySnapshot& e)
+    SnapshotSimilarityFilter::accept(const armem::wm::EntitySnapshot& e, bool simulatedVersion)
     {
         auto start = std::chrono::high_resolution_clock::now();
 
diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.h b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.h
index e5d3a7b1fac491353895ecfa44fbb9df089b4578..407290de8f18931e71b79a97efe49cd28930405c 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.h
@@ -25,7 +25,7 @@ namespace armarx::armem::server::ltm::processor::filter
 
         SnapshotSimilarityFilter() = default;
 
-        virtual bool accept(const armem::wm::EntitySnapshot& e) override;
+        virtual bool accept(const armem::wm::EntitySnapshot& e, bool simulatedVersion) override;
         void configure(const nlohmann::json& json) override;
 
         FilterStatistics getFilterStatistics() override;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/frequencyFilter/FrequencyFilter.cpp b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/frequencyFilter/FrequencyFilter.cpp
index 2dd6e1d7c09c0f5757842c5d8bf07d869d51dd68..5f4777423458116e39cb1f67a782dbb505a86284 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/frequencyFilter/FrequencyFilter.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/frequencyFilter/FrequencyFilter.cpp
@@ -6,7 +6,7 @@ namespace armarx::armem::server::ltm::processor::filter
 {
 
     bool
-    SnapshotFrequencyFilter::accept(const armem::wm::EntitySnapshot &e)
+    SnapshotFrequencyFilter::accept(const armem::wm::EntitySnapshot &e, bool simulatedVersion)
     {
         //accepting to many elements makes the filter slow and brings problems with the buffer with itself!
 
@@ -17,13 +17,24 @@ namespace armarx::armem::server::ltm::processor::filter
         // get entity id of this snapshot:
         auto memID = e.id().getEntityID();
 
+        //find out if timestamps are corrupted:
+        if(this->nonCorruptedType == TimestampType::NOT_SET){
+            ARMARX_DEBUG << "Setting timestamp type";
+            this->setNonCorruptedTimestampType(e);
+            ARMARX_DEBUG << VAROUT(this->nonCorruptedType);
+        }
+
+        if(this->nonCorruptedType == TimestampType::ALL_CORRUPTED) {
+            return true;
+        }
+
         if(this->lastTimesPerEntity.end() == this->lastTimesPerEntity.find(memID)){
           //this happens if the key is not in the map, which means this is the first time this
           //entity tries to save a snapshot
-          ARMARX_INFO << "First time this entity is saved";
+          ARMARX_DEBUG << "First time this entity is saved";
           auto firstIndex = e.getInstanceIndices()[0];
           auto firstInsance = e.getInstance(firstIndex);
-          auto lastT = firstInsance.metadata().sentTime.toMilliSecondsSinceEpoch();
+          auto lastT = this->getNonCorruptedTimestamp(firstInsance, simulatedVersion);
           //for statistics sake:
           auto end = std::chrono::high_resolution_clock::now();
           stats.end_time = end;
@@ -33,16 +44,16 @@ namespace armarx::armem::server::ltm::processor::filter
           this->lastTimesPerEntity[memID] = lastT;
           return true; //the first one is always accepted
         } else {
-
             auto lastTime = this->lastTimesPerEntity.at(memID);
 
             // check if any one of the instances for this snapshot were sent in the last x
             // milliseconds since a snapshot was accepted last for this entity:
-            e.forEachInstance([this, &instances_accepted, &current, &lastTime](armem::wm::EntityInstance& i){
-                int difference = std::abs(i.metadata().sentTime.toMilliSecondsSinceEpoch() - lastTime);
+            e.forEachInstance([this, &instances_accepted, &current, &lastTime, &simulatedVersion](armem::wm::EntityInstance& i){
+                auto t = this->getNonCorruptedTimestamp(i, simulatedVersion);
+                int difference = std::abs(t - lastTime);
                 if(difference > this->maxDifference){ //at least one instance is older than the last saved instance
                     instances_accepted = true;
-                    current = i.metadata().sentTime.toMilliSecondsSinceEpoch();
+                    current = this->getNonCorruptedTimestamp(i, simulatedVersion);
                 }
             });
 
@@ -66,6 +77,65 @@ namespace armarx::armem::server::ltm::processor::filter
         return instances_accepted;
     }
 
+    void
+    SnapshotFrequencyFilter::setNonCorruptedTimestampType(const armem::wm::EntitySnapshot &e){
+        auto firstIndex = e.getInstanceIndices()[0];
+        auto firstInsance = e.getInstance(firstIndex);
+        auto sentTime = firstInsance.metadata().sentTime;
+        auto arrivedTime = firstInsance.metadata().arrivedTime;
+        auto referencedTime = firstInsance.metadata().referencedTime;
+
+        ARMARX_DEBUG << VAROUT(sentTime.toMilliSecondsSinceEpoch());
+        ARMARX_DEBUG << VAROUT(arrivedTime.toMilliSecondsSinceEpoch());
+        ARMARX_DEBUG << VAROUT(referencedTime.toMilliSecondsSinceEpoch());
+
+        if(sentTime.toMilliSecondsSinceEpoch() < 946688400000){
+            // we assume the timestamp does not make sense if it is older than the year 2000
+            if(arrivedTime.toMilliSecondsSinceEpoch() < 946688400000){
+                if(referencedTime.toMilliSecondsSinceEpoch() < 946688400000){
+                    ARMARX_WARNING << "LTM recording does not work correctly, as frequency filter is used, but "
+                                   << "time sent, arrived and referenced are all corrupted. \n"
+                                   << "Accepting all snapshots.";
+                    this->nonCorruptedType = TimestampType::ALL_CORRUPTED;
+                } else {
+                    if(!corruptedWarningGiven){ //only print this warning once
+                        ARMARX_INFO << "Time sent and arrived for snapshot corrupted, using time referenced for filtering";
+                        corruptedWarningGiven = true;
+                    }
+                    //use time referenced from now on
+                    this->nonCorruptedType = TimestampType::REFERENCED;
+                }
+            } else {
+                if(!corruptedWarningGiven){ //only print this warning once
+                        ARMARX_INFO << "Time sent for snapshot corrupted, using time arrived for filtering";
+                        corruptedWarningGiven = true;
+                }
+                //use time arrived from now on
+                this->nonCorruptedType = TimestampType::ARRIVED;
+            }
+        } else {
+            this->nonCorruptedType = TimestampType::SENT;
+        }
+    }
+
+    int
+    SnapshotFrequencyFilter::getNonCorruptedTimestamp(const armem::wm::EntityInstance &i, bool simulatedVersion){
+        switch(this->nonCorruptedType) {
+            case TimestampType::SENT:
+                if(!simulatedVersion){
+                    return i.metadata().sentTime.toMilliSecondsSinceEpoch();
+                } else {
+                    [[fallthrough]];
+                }
+            case TimestampType::ARRIVED:
+                return i.metadata().arrivedTime.toMilliSecondsSinceEpoch();
+            case TimestampType::REFERENCED:
+                return i.metadata().referencedTime.toMilliSecondsSinceEpoch();
+            default:
+                return -1;
+        }
+    }
+    
     void
     SnapshotFrequencyFilter::configure(const nlohmann::json& json)
     {
diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/frequencyFilter/FrequencyFilter.h b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/frequencyFilter/FrequencyFilter.h
index e9c9e0021ac85603a775c02c359a2d700a44f54e..63e4493764e33d009b00b7b1de97001c27c49776 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/frequencyFilter/FrequencyFilter.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/frequencyFilter/FrequencyFilter.h
@@ -5,6 +5,13 @@
 
 namespace armarx::armem::server::ltm::processor::filter
 {
+    enum TimestampType{
+        NOT_SET = 0,
+        SENT = 1,
+        ARRIVED = 2,
+        REFERENCED = 3,
+        ALL_CORRUPTED = 4
+    };
 
     class SnapshotFrequencyFilter : public SnapshotFilter
     {
@@ -14,14 +21,20 @@ namespace armarx::armem::server::ltm::processor::filter
 
         SnapshotFrequencyFilter() = default;
 
-        virtual bool accept(const armem::wm::EntitySnapshot &e) override;
+        virtual bool accept(const armem::wm::EntitySnapshot &e, bool simulatedVersion) override;
         void configure(const nlohmann::json& json) override;
 
         FilterStatistics getFilterStatistics() override;
         std::string getName() override;
 
     private:
+        void setNonCorruptedTimestampType(const armem::wm::EntitySnapshot &e);
+        int getNonCorruptedTimestamp(const armem::wm::EntityInstance &i, bool simulatedVersion);
+
         std::map<MemoryID, std::int64_t> lastTimesPerEntity;
         int maxDifference = 0;
+        bool corruptedWarningGiven = false;
+        TimestampType nonCorruptedType = TimestampType::NOT_SET;
+
     };
 } // namespace armarx::armem::server::ltm::processor::filter
diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/importanceFilter/ImportanceFilter.cpp b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/importanceFilter/ImportanceFilter.cpp
index 0ae255a4d4488048c7786aa1fafa3d67f2538f77..06516bd7894d0974f2b9341952cfff1b6bc467de 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/importanceFilter/ImportanceFilter.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/importanceFilter/ImportanceFilter.cpp
@@ -4,7 +4,7 @@
 namespace armarx::armem::server::ltm::processor::filter
 {
 
-bool SnapshotImportanceFilter::accept(const armem::wm::EntitySnapshot &e)
+bool SnapshotImportanceFilter::accept(const armem::wm::EntitySnapshot &e, bool simulatedVersion)
 {
     auto start = std::chrono::high_resolution_clock::now();
     bool instances_accepted = false;
diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/importanceFilter/ImportanceFilter.h b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/importanceFilter/ImportanceFilter.h
index 929bb2e2ac6b03b31f9225cbda74b4a4b34f8e8d..5dcc76b57947a3a208dc1c3bf85ab190fce47dc3 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/importanceFilter/ImportanceFilter.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/importanceFilter/ImportanceFilter.h
@@ -23,7 +23,7 @@ public:
 
     SnapshotImportanceFilter() = default;
 
-    virtual bool accept(const armem::wm::EntitySnapshot& e) override;
+    virtual bool accept(const armem::wm::EntitySnapshot& e, bool simulatedVersion) override;
     void configure(const nlohmann::json& json) override;
 
     FilterStatistics getFilterStatistics() override;
diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h
index 289db221609ee4f157126a3fb898df00fd78f58f..935fb05989563d7cc4a2fda7cf4dc2bcf6ba5412 100644
--- a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h
+++ b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h
@@ -87,7 +87,7 @@ namespace armarx::armem::server::plugins
         virtual armem::prediction::data::EngineSupportMap
         getAvailableEngines(const ::Ice::Current&) override;
 
-        //test
+        //ReloadFromLTMOnStartup
         armem::CommitResult reloadFromLTM();
 
     public: