diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
index 5e88884733237797998522e242bfd88c6ab7ce74..1b7b492b5c24dcc87f536eccb2dffae29a94ca89 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
@@ -74,16 +74,20 @@ namespace armarx::skills::gui
         return true;
     }
 
-    void
-    SkillManagerWrapper::filterSkillUpdate(
-        std::map<skills::manager::dto::SkillID, skills::manager::dto::SkillDescription>& update)
+    SkillManagerWrapper::Snapshot
+    SkillManagerWrapper::filterUpdate(Snapshot update)
     {
         // empty search => do not filter
         if (this->currentSkillSearch.empty())
         {
-            return;
+            return update;
         }
 
+        Snapshot filtered;
+
+        // for now we don't change the executions
+        filtered.statuses = update.statuses;
+
         std::vector<std::string> substrings;
 
         {
@@ -95,18 +99,27 @@ namespace armarx::skills::gui
         }
 
 
-        for (auto it = update.begin(); it != update.end();)
+        for (auto& provider_and_descrMap : update.skills)
         {
-            if (not matches(simox::alg::to_lower(skills::SkillID::FromIce(it->first).skillName),
-                            substrings))
-            {
-                it = update.erase(it);
-            }
-            else
+            using DescriptionMap = std::map<skills::SkillID, skills::SkillDescription>;
+
+            DescriptionMap& descriptionMap = provider_and_descrMap.second;
+            skills::ProviderID provider = provider_and_descrMap.first;
+
+            for (auto& skill_and_description : descriptionMap)
             {
-                ++it;
+                skills::SkillID sid = skill_and_description.first;
+                skills::SkillDescription descr = skill_and_description.second;
+
+                if (matches(simox::alg::to_lower(sid.skillName), substrings))
+                {
+                    // add to map
+                    filtered.skills[provider][sid] = descr;
+                }
             }
         }
+
+        return filtered;
     }
 
     SkillMap
@@ -125,9 +138,6 @@ namespace armarx::skills::gui
 
             auto managerSkills = memory->getSkillDescriptions();
 
-            this->filterSkillUpdate(managerSkills);
-
-
             for (const auto& [sid, desc] : managerSkills)
             {
                 auto description = skills::SkillDescription::FromIce(desc);
@@ -179,6 +189,7 @@ namespace armarx::skills::gui
     SkillManagerWrapper::acceptSearchRequest(std::string const& search)
     {
         this->currentSkillSearch = search;
+        emit searchAccepted();
     }
 
     void
@@ -221,7 +232,7 @@ namespace armarx::skills::gui
         snapshot.skills = fetchSkillsFromMemory();
 
         // notify registered widgets of update
-        emit updateAvailable(this->snapshot);
+        emit updateAvailable(filterUpdate(snapshot));
     }
 
     const std::optional<ProviderID>
@@ -252,7 +263,10 @@ namespace armarx::skills::gui
     SkillManagerWrapper::getSkills()
     {
         std::scoped_lock l(mutex_snapshot);
-        return snapshot.skills;
+
+        Snapshot filtered = filterUpdate(snapshot);
+
+        return filtered.skills;
     }
 
     StatusMap
diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
index a3352ad1c7f5a79c77d9fa0b0430377b831133c6..e191e1f963d82b29abeafe0535fe5f50a384bda3 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
@@ -81,6 +81,7 @@ namespace armarx::skills::gui
     signals:
         void connectionUpdate(std::string const& message, std::string const& error);
         void updateAvailable(Snapshot update);
+        void searchAccepted();
 
     public slots:
         /**
@@ -126,11 +127,10 @@ namespace armarx::skills::gui
         StatusMap fetchExecutionsFromMemory();
 
         /**
-         * @brief Modifies the given map to match the search.
-         * @param update The map to modify.
+         * @brief Returns the given snapshot, matching the search.
+         * @param update The snapshot to modify.
          */
-        void filterSkillUpdate(std::map<skills::manager::dto::SkillID,
-                                        skills::manager::dto::SkillDescription>& update);
+        Snapshot filterUpdate(Snapshot update);
 
         // config
         // TODO: perhaps use proper config file for the gui
diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp
index acb9219dc5ed5c7566b287dd4b8cccf4dd4c2f0d..bec357e6054091c294bc04c8dbad0ae6aee900d5 100644
--- a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp
+++ b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp
@@ -18,6 +18,18 @@ namespace armarx::skills::gui
         setTitle(QString::fromStdString(observerName));
     }
 
+    void
+    SkillGroupBox::updateGui(SkillManagerWrapper::Snapshot update)
+    {
+        skillTreeWidget->updateGui(update.skills);
+    }
+
+    void
+    SkillGroupBox::searchCallback()
+    {
+        this->skillTreeWidget->updateGui(memory->getSkills());
+    }
+
     void
     SkillGroupBox::setupUi()
     {
@@ -58,16 +70,16 @@ namespace armarx::skills::gui
                 &SkillGroupBox::searchRequest,
                 this->memory.get(),
                 &SkillManagerWrapper::acceptSearchRequest);
+        connect(memory.get(),
+                &SkillManagerWrapper::searchAccepted,
+                this,
+                &SkillGroupBox::searchCallback);
 
         connect(skillTreeWidget,
                 &SkillTreeWidget::updateSkillDetails,
                 this,
                 &SkillGroupBox::updateSkillDetails);
 
-        // update
-        connect(
-            this, &SkillGroupBox::updateGui, this->skillTreeWidget, &SkillTreeWidget::updateGui);
-
         // disconnect
         connect(
             this, &SkillGroupBox::disconnectGui, skillTreeWidget, &SkillTreeWidget::disconnectGui);
diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h
index 239247deb28f4694af0b783f6147e83bf49d52eb..11604f2a24710b35faf10b129c2e9c63f35d8051 100644
--- a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h
+++ b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h
@@ -36,11 +36,14 @@ namespace armarx::skills::gui
 
         void disconnectGui();
 
-        void updateGui(SkillManagerWrapper::Snapshot update);
-
     public slots:
         void connectGui(std::string observerName);
 
+        void updateGui(SkillManagerWrapper::Snapshot update);
+
+        // is called, after the search has been accepted in the memory wrapper.
+        void searchCallback();
+
     private slots:
         /**
          * Takes string from line edit and emits the search request.
diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp
index 44cfa5be656dc612483d5ac732ecd23bae331480..a9ebcdd98cfbde9b54abcb929504dd384e0a7c5f 100644
--- a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp
+++ b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp
@@ -25,7 +25,7 @@ namespace armarx::skills::gui
     }
 
     void
-    SkillTreeWidget::updateGui(SkillManagerWrapper::Snapshot update)
+    SkillTreeWidget::updateGui(SkillMap update)
     {
         setSortingEnabled(false);
 
@@ -37,7 +37,7 @@ namespace armarx::skills::gui
             auto providerName = providerItem->text(0).toStdString();
             skills::ProviderID providerId{.providerName = providerName};
 
-            if (update.skills.find(providerId) == update.skills.end())
+            if (update.find(providerId) == update.end())
             {
                 providerItem = nullptr; // reset
                 auto remove = this->takeTopLevelItem(i);
@@ -48,8 +48,8 @@ namespace armarx::skills::gui
             ++i;
 
             // sanity check
-            ARMARX_CHECK(update.skills.count(providerId) > 0);
-            auto& providedSkills = update.skills.at(providerId);
+            ARMARX_CHECK(update.count(providerId) > 0);
+            auto& providedSkills = update.at(providerId);
 
             int j = 0;
             while (j < providerItem->childCount())
@@ -74,7 +74,7 @@ namespace armarx::skills::gui
         }
 
         // update tree view. Add new elements
-        for (const auto& [providerId, providedSkills] : update.skills)
+        for (const auto& [providerId, providedSkills] : update)
         {
             bool newProvider = false;
             QTreeWidgetItem* providerItem = nullptr;
diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h
index d0fa3880d8ff65c20696835d89845c5e8f018a87..f94bdcaae2d62dd45dc10f8a98f6916117a0eb4d 100644
--- a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h
+++ b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h
@@ -45,7 +45,7 @@ namespace armarx::skills::gui
     public slots:
         void disconnectGui();
 
-        void updateGui(SkillManagerWrapper::Snapshot update);
+        void updateGui(SkillMap update);
 
     private slots:
         void skillSelectionChanged(QTreeWidgetItem* current, int column);