diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
index 4d74cf11e2b5c208a30eb553c986a9636dabd562..ac0cfaa2420a1dd2d11d01b77a4fb38c02a62fc6 100644
--- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
+++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
@@ -105,22 +105,25 @@ namespace armarx::skills::gui
                 &PeriodicUpdateWidget::startTimerIfEnabled);
         connect(this, &SkillMemoryGUI::connectGui, skillGroupBox, &SkillGroupBox::connectGui);
 
-        // update cascade
-        connect(this, &SkillMemoryGUI::updateGui, skillGroupBox, &SkillGroupBox::updateGui);
+        // timer
+        connect(this->updateWidget,
+                &PeriodicUpdateWidget::update,
+                this->memory.get(),
+                &SkillManagerWrapper::updateFromMemory);
+
+        // updates
+        connect(this->memory.get(),
+                &SkillManagerWrapper::updateAvailable,
+                this,
+                &SkillMemoryGUI::updateGui);
+
+        connect(this, &SkillMemoryGUI::updateGui, this->skillGroupBox, &SkillGroupBox::updateGui);
 
-        // we don't want to update the skill details periodically, update can be triggered manually
-        /*
-        connect(
-            this, &SkillMemoryGUI::updateGui, skillDetailGroupBox, &SkillDetailGroupBox::updateGui);
-        */
         connect(this,
                 &SkillMemoryGUI::updateGui,
-                skillExecutionTreeWidget,
-                &SkillExecutionTreeWidget::updateExecutions);
+                this->skillExecutionTreeWidget,
+                &SkillExecutionTreeWidget::updateGui);
 
-        // timer -> update
-        connect(
-            this->updateWidget, &PeriodicUpdateWidget::update, this, &SkillMemoryGUI::updateGui);
 
         // stop all
         connect(stopAllButton,
diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
index 648f7cee806866a36363559267f68c537f203c1c..09c26b287bc62ebd08ff3ee58366285bfc419860 100644
--- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
+++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
@@ -52,10 +52,7 @@ namespace armarx::skills::gui
          */
         void connectGui(std::string observerName);
 
-        /**
-         * @brief Notify widgets to update themselves
-         */
-        void updateGui();
+        void updateGui(SkillManagerWrapper::Snapshot update);
 
     private:
         void setupUi();
diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
index 2699e41f2eb5dcd9e30c053a9c69e429b0496be4..780c2bb728874f9865d7147ee2a17be55e925527 100644
--- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
+++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
@@ -140,13 +140,14 @@ namespace armarx::skills::gui
     }
 
     void
-    SkillExecutionTreeWidget::updateExecutions()
+    SkillExecutionTreeWidget::updateGui(SkillManagerWrapper::Snapshot update)
     {
-        auto currentManagerStatuses = memory->getExecutions();
-        if (currentManagerStatuses.empty())
+        if (update.statuses.empty())
+        {
             return;
+        }
 
-        for (const auto& [k, v] : currentManagerStatuses)
+        for (const auto& [k, v] : update.statuses)
         {
             skills::SkillExecutionID executionId = k;
             skills::SkillStatusUpdate statusUpdate = v;
diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
index 795045302b4b47655e196e4cea566d53140f90d6..09fbdae081ed61aed705a278cbc903c053f30a80 100644
--- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
+++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
@@ -9,6 +9,7 @@
 
 namespace armarx::skills::gui
 {
+    using StatusMap = std::map<skills::SkillExecutionID, skills::SkillStatusUpdate>;
 
     class SkillExecutionTreeWidget : public QTreeWidget, public MemoryCommunicatorBase
     {
@@ -38,7 +39,7 @@ namespace armarx::skills::gui
 
     public slots:
         void disconnectGui();
-        void updateExecutions();
+        void updateGui(SkillManagerWrapper::Snapshot update);
 
     private slots:
         void executionSelectionChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous);
diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
index 25119c9a1c5957970765ca6fe63cdb506d34f4c0..5e88884733237797998522e242bfd88c6ab7ce74 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
@@ -221,8 +221,7 @@ namespace armarx::skills::gui
         snapshot.skills = fetchSkillsFromMemory();
 
         // notify registered widgets of update
-        emit skillUpdate(snapshot.skills);
-        emit statusUpdate(snapshot.statuses);
+        emit updateAvailable(this->snapshot);
     }
 
     const std::optional<ProviderID>
diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
index f6f797c8e76a4e7b97e1040df4126b5cd69a8c54..a3352ad1c7f5a79c77d9fa0b0430377b831133c6 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
@@ -67,10 +67,20 @@ namespace armarx::skills::gui
          */
         StatusMap getExecutions();
 
+        struct Snapshot
+        {
+            StatusMap statuses;
+            SkillMap skills;
+
+            // default constructor (construct empty)
+            Snapshot() : statuses({}), skills({})
+            {
+            }
+        };
+
     signals:
         void connectionUpdate(std::string const& message, std::string const& error);
-        void skillUpdate(SkillMap update);
-        void statusUpdate(StatusMap update);
+        void updateAvailable(Snapshot update);
 
     public slots:
         /**
@@ -101,17 +111,6 @@ namespace armarx::skills::gui
         armarx::skills::manager::dti::SkillManagerInterfacePrx memory;
         std::string currentSkillSearch = "";
 
-        struct Snapshot
-        {
-            StatusMap statuses;
-            SkillMap skills;
-
-            // default constructor (construct empty)
-            Snapshot() : statuses({}), skills({})
-            {
-            }
-        };
-
         Snapshot snapshot;
 
         /**
diff --git a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.h b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.h
index f777490cfba0c7d45b83f601ec69ea2d91903728..1723870bc6fb5a0c32c24efad41d17c9baf0fb58 100644
--- a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.h
+++ b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.h
@@ -32,14 +32,9 @@ namespace armarx::skills::gui
     signals:
         void disconnectGui();
 
-        /**
-         * @brief Notify widgets to update themselves
-         */
-        void updateGui();
-
     public slots:
         /**
-         * @brief Update subwidgets of an updated skill selection.
+         * @brief Notify subwidgets of an updated skill selection.
          * @param skillId
          */
         void updateSkillDetails(skills::SkillID& skillId);
diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp
index 91fb11c021677e96890a001a0538fc6cf98f4aa0..acb9219dc5ed5c7566b287dd4b8cccf4dd4c2f0d 100644
--- a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp
+++ b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp
@@ -64,11 +64,12 @@ namespace armarx::skills::gui
                 this,
                 &SkillGroupBox::updateSkillDetails);
 
+        // update
+        connect(
+            this, &SkillGroupBox::updateGui, this->skillTreeWidget, &SkillTreeWidget::updateGui);
+
         // disconnect
         connect(
             this, &SkillGroupBox::disconnectGui, skillTreeWidget, &SkillTreeWidget::disconnectGui);
-
-        // update cascade
-        connect(this, &SkillGroupBox::updateGui, skillTreeWidget, &SkillTreeWidget::updateSkills);
     }
 } // namespace armarx::skills::gui
diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h
index 2ac6044ba72807ef300ae48fa19fe53d9230d1f3..239247deb28f4694af0b783f6147e83bf49d52eb 100644
--- a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h
+++ b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h
@@ -36,10 +36,7 @@ namespace armarx::skills::gui
 
         void disconnectGui();
 
-        /**
-         * @brief Notify widgets to update themselves
-         */
-        void updateGui();
+        void updateGui(SkillManagerWrapper::Snapshot update);
 
     public slots:
         void connectGui(std::string observerName);
diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp
index 142a387ccbe0c7860b2f0f26169abcb9e74456c2..44cfa5be656dc612483d5ac732ecd23bae331480 100644
--- a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp
+++ b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp
@@ -25,10 +25,9 @@ namespace armarx::skills::gui
     }
 
     void
-    SkillTreeWidget::updateSkills()
+    SkillTreeWidget::updateGui(SkillManagerWrapper::Snapshot update)
     {
         setSortingEnabled(false);
-        const auto skills = memory->getSkills();
 
         // update tree view. Remove non-existing elements
         int i = 0;
@@ -38,7 +37,7 @@ namespace armarx::skills::gui
             auto providerName = providerItem->text(0).toStdString();
             skills::ProviderID providerId{.providerName = providerName};
 
-            if (skills.find(providerId) == skills.end())
+            if (update.skills.find(providerId) == update.skills.end())
             {
                 providerItem = nullptr; // reset
                 auto remove = this->takeTopLevelItem(i);
@@ -49,8 +48,8 @@ namespace armarx::skills::gui
             ++i;
 
             // sanity check
-            ARMARX_CHECK(skills.count(providerId) > 0);
-            auto& providedSkills = skills.at(providerId);
+            ARMARX_CHECK(update.skills.count(providerId) > 0);
+            auto& providedSkills = update.skills.at(providerId);
 
             int j = 0;
             while (j < providerItem->childCount())
@@ -75,7 +74,7 @@ namespace armarx::skills::gui
         }
 
         // update tree view. Add new elements
-        for (const auto& [providerId, providedSkills] : skills)
+        for (const auto& [providerId, providedSkills] : update.skills)
         {
             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 61ec5cc85314d0318a951e8216a620d1f1d9a7c8..d0fa3880d8ff65c20696835d89845c5e8f018a87 100644
--- a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h
+++ b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h
@@ -9,6 +9,8 @@
 
 namespace armarx::skills::gui
 {
+    using SkillMap =
+        std::map<skills::ProviderID, std::map<skills::SkillID, skills::SkillDescription>>;
 
     class SkillTreeWidget : public QTreeWidget, public MemoryCommunicatorBase
     {
@@ -42,7 +44,8 @@ namespace armarx::skills::gui
 
     public slots:
         void disconnectGui();
-        void updateSkills();
+
+        void updateGui(SkillManagerWrapper::Snapshot update);
 
     private slots:
         void skillSelectionChanged(QTreeWidgetItem* current, int column);