diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index c4ad28ab1f6880f59adb4ca7eda5e4e8a8a65007..30525916e26ba1f2568ea9dfceef89f2fded353f 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -40,8 +40,9 @@ set(LIB_FILES
     core/workingmemory/EntitySnapshot.cpp
     core/workingmemory/Memory.cpp
     core/workingmemory/ProviderSegment.cpp
-    core/workingmemory/Visitor.cpp
     core/workingmemory/ice_conversions.cpp
+    core/workingmemory/visitor/Visitor.cpp
+    core/workingmemory/visitor/FunctionalVisitor.cpp
 
     core/longtermmemory/CoreSegment.cpp
     core/longtermmemory/Entity.cpp
@@ -137,8 +138,10 @@ set(LIB_HEADERS
     core/workingmemory/EntitySnapshot.h
     core/workingmemory/Memory.h
     core/workingmemory/ProviderSegment.h
-    core/workingmemory/Visitor.h
     core/workingmemory/ice_conversions.h
+    core/workingmemory/visitor.h
+    core/workingmemory/visitor/Visitor.h
+    core/workingmemory/visitor/FunctionalVisitor.h
 
     core/longtermmemory/CoreSegment.h
     core/longtermmemory/Entity.h
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/visitor.h b/source/RobotAPI/libraries/armem/core/workingmemory/visitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..815ee1b34908dc5916e7d909e709bc735409f63c
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#include "visitor/FunctionalVisitor.h"
+#include "visitor/Visitor.h"
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Visitor.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.cpp
similarity index 100%
rename from source/RobotAPI/libraries/armem/core/workingmemory/Visitor.cpp
rename to source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.cpp
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..ba0fd3d6ff3879210b7933c3eea62c6a87762172
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/FunctionalVisitor.h
@@ -0,0 +1,107 @@
+#pragma once
+
+#include <functional>
+
+#include "Visitor.h"
+
+
+namespace armarx::armem::wm
+{
+
+    /**
+     * @brief A `Visitor` which can be parametrized by `std::function`
+     * instead of inheriting and overriding.
+     */
+    class FunctionalVisitor : public Visitor
+    {
+    public:
+
+        FunctionalVisitor();
+        virtual ~FunctionalVisitor() override;
+
+        bool visitEnter(Memory& memory) override
+        {
+            return memoryFn ? memoryFn(memory) : Visitor::visitEnter(memory);
+        }
+        bool visitEnter(CoreSegment& coreSegment) override
+        {
+            return coreSegmentFn ? coreSegmentFn(coreSegment) : Visitor::visitEnter(coreSegment);
+        }
+        bool visitEnter(ProviderSegment& providerSegment) override
+        {
+            return providerSegmentFn ? providerSegmentFn(providerSegment) : Visitor::visitEnter(providerSegment);
+        }
+        bool visitEnter(Entity& entity) override
+        {
+            return entityFn ? entityFn(entity) : Visitor::visitEnter(entity);
+        }
+        bool visitEnter(EntitySnapshot& snapshot) override
+        {
+            return snapshotFn ? snapshotFn(snapshot) : Visitor::visitEnter(snapshot);
+        }
+
+        bool visit(EntityInstance& instance) override
+        {
+            return instanceFn ? instanceFn(instance) : Visitor::visit(instance);
+        }
+
+
+
+        // Const versions
+
+        bool applyTo(const Memory& memory);
+        bool applyTo(const CoreSegment& coreSegment);
+        bool applyTo(const ProviderSegment& providerSegment);
+        bool applyTo(const Entity& entity);
+        bool applyTo(const EntitySnapshot& snapshot);
+        bool applyTo(const EntityInstance& instance);
+
+
+        bool visitEnter(const Memory& memory) override
+        {
+            return memoryFn ? constMemoryFn(memory) : Visitor::visitEnter(memory);
+        }
+        bool visitEnter(const CoreSegment& coreSegment) override
+        {
+            return coreSegmentFn ? constCoreSegmentFn(coreSegment) : Visitor::visitEnter(coreSegment);
+        }
+        bool visitEnter(const ProviderSegment& providerSegment) override
+        {
+            return providerSegmentFn ? constProviderSegmentFn(providerSegment) : Visitor::visitEnter(providerSegment);
+        }
+        bool visitEnter(const Entity& entity) override
+        {
+            return entityFn ? constEntityFn(entity) : Visitor::visitEnter(entity);
+        }
+        bool visitEnter(const EntitySnapshot& snapshot) override
+        {
+            return memoryFn ? constSnapshotFn(snapshot) : Visitor::visitEnter(snapshot);
+        }
+
+        bool visit(const EntityInstance& instance) override
+        {
+            return instanceFn ? constInstanceFn(instance) : Visitor::visit(instance);
+        }
+
+
+        std::function<bool(Memory& memory)> memoryFn;
+        std::function<bool(const Memory& memory)> constMemoryFn;
+
+        std::function<bool(CoreSegment& coreSegment)> coreSegmentFn;
+        std::function<bool(const CoreSegment& coreSegment)> constCoreSegmentFn;
+
+        std::function<bool(ProviderSegment& providerSegment)> providerSegmentFn;
+        std::function<bool(const ProviderSegment& providerSegment)> constProviderSegmentFn;
+
+        std::function<bool(Entity& entity)> entityFn;
+        std::function<bool(const Entity& entity)> constEntityFn;
+
+        std::function<bool(EntitySnapshot& snapshot)> snapshotFn;
+        std::function<bool(const EntitySnapshot& snapshot)> constSnapshotFn;
+
+        std::function<bool(EntityInstance& instance)> instanceFn;
+        std::function<bool(const EntityInstance& instance)> constInstanceFn;
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ede63a494a7aff26c54ba1d7149200c91be7d987
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.cpp
@@ -0,0 +1,191 @@
+#include "Visitor.h"
+
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
+#include <RobotAPI/libraries/armem/core/error.h>
+
+
+namespace armarx::armem::wm
+{
+
+    Visitor::Visitor()
+    {
+    }
+
+    Visitor::~Visitor()
+    {
+    }
+
+    bool Visitor::applyTo(Memory& memory)
+    {
+        bool cont = true;
+        visitEnter(memory);
+        for (auto& [_, coreSeg] : memory)
+        {
+            if (!applyTo(coreSeg))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(memory);
+        return cont;
+    }
+
+    bool Visitor::applyTo(CoreSegment& coreSegment)
+    {
+        bool cont = true;
+        visitEnter(coreSegment);
+        for (auto& [_, provSeg] : coreSegment)
+        {
+            if (!applyTo(provSeg))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(coreSegment);
+        return cont;
+    }
+
+    bool Visitor::applyTo(ProviderSegment& providerSegment)
+    {
+        bool cont = true;
+        visitEnter(providerSegment);
+        for (auto& [_, entity] : providerSegment)
+        {
+            if (!applyTo(entity))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(providerSegment);
+        return cont;
+    }
+
+    bool Visitor::applyTo(Entity& entity)
+    {
+        bool cont = true;
+        visitEnter(entity);
+        for (auto& [_, snapshot] : entity)
+        {
+            if (!applyTo(snapshot))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(entity);
+        return cont;
+    }
+
+    bool Visitor::applyTo(EntitySnapshot& snapshot)
+    {
+        bool cont = true;
+        visitEnter(snapshot);
+        for (auto& instance : snapshot)
+        {
+            if (!applyTo(instance))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(snapshot);
+        return cont;
+    }
+
+    bool Visitor::applyTo(EntityInstance& instance)
+    {
+        return visit(instance);
+    }
+
+
+    bool Visitor::applyTo(const Memory& memory)
+    {
+        bool cont = true;
+        visitEnter(memory);
+        for (const auto& [_, coreSeg] : memory)
+        {
+            if (!applyTo(coreSeg))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(memory);
+        return cont;
+    }
+
+    bool Visitor::applyTo(const CoreSegment& coreSegment)
+    {
+        bool cont = true;
+        visitEnter(coreSegment);
+        for (const auto& [_, provSeg] : coreSegment)
+        {
+            if (!applyTo(provSeg))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(coreSegment);
+        return cont;
+    }
+
+    bool Visitor::applyTo(const ProviderSegment& providerSegment)
+    {
+        bool cont = true;
+        visitEnter(providerSegment);
+        for (const auto& [_, entity] : providerSegment)
+        {
+            if (!applyTo(entity))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(providerSegment);
+        return cont;
+    }
+
+    bool Visitor::applyTo(const Entity& entity)
+    {
+        bool cont = true;
+        visitEnter(entity);
+        for (const auto& [_, snapshot] : entity)
+        {
+            if (!applyTo(snapshot))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(entity);
+        return cont;
+    }
+
+    bool Visitor::applyTo(const EntitySnapshot& snapshot)
+    {
+        bool cont = true;
+        visitEnter(snapshot);
+        for (const auto& instance : snapshot)
+        {
+            if (!applyTo(instance))
+            {
+                cont = false;
+                break;
+            }
+        }
+        visitExit(snapshot);
+        return cont;
+    }
+
+    bool Visitor::applyTo(const EntityInstance& instance)
+    {
+        return visit(instance);
+    }
+
+}
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Visitor.h b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.h
similarity index 98%
rename from source/RobotAPI/libraries/armem/core/workingmemory/Visitor.h
rename to source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.h
index c0a3854a242c030113eeb46409c172563660294a..fa789fcf0b6876ec5d9fa0ff1a3944b4e3bf3fd3 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/Visitor.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/visitor/Visitor.h
@@ -12,7 +12,7 @@ namespace armarx::armem::wm
 
 
     /**
-     * @brief A visitor for the hierarchical Memory data structure.
+     * @brief A visitor for the hierarchical memory data structure.
      */
     class Visitor
     {