diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp
index 96ad7fed33e9be2813679f6ab20405f85300fc57..5f99047a649e80be511efd37c1cfbc8ac438031a 100644
--- a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp
+++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp
@@ -51,11 +51,11 @@ namespace armarx::viz
         return "UNKNOWN";
     }
 
-    static void updateVisualizationCB(void* data, SoSensor* sensor)
-    {
-        auto* visu = static_cast<CoinVisualizer*>(data);
-        visu->update();
-    }
+    //    static void updateVisualizationCB(void* data, SoSensor* sensor)
+    //    {
+    //        auto* visu = static_cast<CoinVisualizer*>(data);
+    //        visu->update();
+    //    }
 
     struct TimedBlock
     {
@@ -89,10 +89,10 @@ namespace armarx::viz
                    &CoinVisualizerWrapper::onUpdateFailure);
         root = new SoSeparator;
 
-        timerSensor = new SoTimerSensor(updateVisualizationCB, this);
+        //timerSensor = new SoTimerSensor(updateVisualizationCB, this);
 
-        float cycleTimeMS = 33.0f;
-        timerSensor->setInterval(SbTime(cycleTimeMS / 1000.0f));
+        //float cycleTimeMS = 33.0f;
+        //timerSensor->setInterval(SbTime(cycleTimeMS / 1000.0f));
     }
 
     CoinVisualizer::~CoinVisualizer()
@@ -115,8 +115,8 @@ namespace armarx::viz
         state = CoinVisualizerState::STARTING;
         stateStorage = storage;
 
-        SoSensorManager* sensor_mgr = SoDB::getSensorManager();
-        sensor_mgr->insertTimerSensor(timerSensor);
+        //SoSensorManager* sensor_mgr = SoDB::getSensorManager();
+        //sensor_mgr->insertTimerSensor(timerSensor);
     }
 
     void CoinVisualizer::stop()
@@ -272,6 +272,10 @@ namespace armarx::viz
 
     void CoinVisualizer::update()
     {
+        {
+            std::lock_guard lock(timingMutex);
+            lastTiming.updateToggle = (lastTiming.updateToggle + 1) % 10;
+        }
         switch (state)
         {
             case CoinVisualizerState::STARTING:
@@ -312,6 +316,7 @@ namespace armarx::viz
                 // We should restart the pull for updates so it can run in parallel
                 data::LayerUpdates currentUpdates = pulledUpdates;
                 updateResult = CoinVisualizerUpdateResult::WAITING;
+                timing.waitStart = time_start;
                 storage->begin_pullUpdatesSince(currentUpdates.revision, callback);
 
                 auto layerIDsBefore = getLayerIDs();
@@ -343,6 +348,7 @@ namespace armarx::viz
                     // Copy the timing result
                     std::lock_guard lock(timingMutex);
                     timing.counter = lastTiming.counter + 1;
+                    timing.updateToggle = lastTiming.updateToggle;
                     lastTiming = std::move(timing);
                 }
             }
@@ -350,7 +356,13 @@ namespace armarx::viz
             case CoinVisualizerUpdateResult::WAITING:
             {
                 // Still waiting for result
-            } break;
+                {
+                    // Copy the timing result
+                    std::lock_guard lock(timingMutex);
+                    lastTiming.waitDuration = IceUtil::Time::now() - lastTiming.waitStart;
+                }
+            }
+            break;
             case CoinVisualizerUpdateResult::FAILURE:
             {
                 std::unique_lock<std::mutex> lock(stateMutex);
diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.h b/source/RobotAPI/components/ArViz/Coin/Visualizer.h
index 5cb71b0fecc568e06b42ae49d8f8e9525104feea..49ad2a51bd6f70dfddac1785296b8abc07ba08c9 100644
--- a/source/RobotAPI/components/ArViz/Coin/Visualizer.h
+++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.h
@@ -174,6 +174,11 @@ namespace armarx::viz
         IceUtil::Time layersChanged = IceUtil::Time::seconds(0);
         IceUtil::Time total = IceUtil::Time::seconds(0);
 
+        IceUtil::Time waitStart = IceUtil::Time::seconds(0);
+        IceUtil::Time waitDuration = IceUtil::Time::seconds(0);
+
+        int updateToggle = 0;
+
         int counter = 0;
     };
 
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
index 44d9c0aa5a71bee4a4095077a3aca2525cb0437a..4f7372a5e178ed8ec895049ef094af354d297ee2 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
@@ -65,6 +65,9 @@ namespace armarx
 
         widget.setupUi(getWidget());
 
+        updateTimer = new QTimer(this);
+        connect(updateTimer, &QTimer::timeout, this, QOverload<>::of(&This::onUpdate));
+
         timingObserverTimer = new QTimer(this);
         connect(timingObserverTimer, &QTimer::timeout, this, QOverload<>::of(&This::onTimingObserverUpdate));
 
@@ -186,6 +189,7 @@ namespace armarx
         changeMode(ArVizWidgetMode::Live);
 
         timingObserverTimer->start(33);
+        updateTimer->start(33);
     }
 
     void ArVizWidgetController::onDisconnectGui()
@@ -440,10 +444,15 @@ namespace armarx
         layerTreeChanged(nullptr, 0);
     }
 
+    void ArVizWidgetController::onUpdate()
+    {
+        visualizer.update();
+    }
+
     void ArVizWidgetController::onTimingObserverUpdate()
     {
         viz::CoinVisualizer_UpdateTiming timing = visualizer.getTiming();
-        if (timing.counter > lastTiming.counter)
+        //if (timing.counter > lastTiming.counter)
         {
             if (debugObserver)
             {
@@ -453,6 +462,8 @@ namespace armarx
                 timingMap["1.2 apply, updateElements (ms)"] = new Variant(timing.applyTotal.updateElements.toMilliSecondsDouble());
                 timingMap["1.3 apply, removeElements (ms)"] = new Variant(timing.applyTotal.removeElements.toMilliSecondsDouble());
                 timingMap["2. layers (ms)"] = new Variant(timing.layersChanged.toMilliSecondsDouble());
+                timingMap["3. wait duration (ms)"] = new Variant(timing.waitDuration.toMilliSecondsDouble());
+                timingMap["4. update toggle"] = new Variant(timing.updateToggle);
                 timingMap["total (ms)"] = new Variant(timing.total.toMilliSecondsDouble());
 
                 timings.push_back(timing.total.toMilliSecondsDouble());
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
index 7a3a0bfa34330ecf32509b24d2e1d420e4016d0f..31383a63ea78c510ec781951ff56b5fdbcafee06 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
@@ -140,6 +140,7 @@ namespace armarx
         void showAllLayers(bool visible);
         void showFilteredLayers(bool visible);
 
+        void onUpdate();
         void onTimingObserverUpdate();
 
 
@@ -174,6 +175,7 @@ namespace armarx
 
         QPointer<SimpleConfigDialog> configDialog;
 
+        QTimer* updateTimer;
         QTimer* timingObserverTimer;
         viz::CoinVisualizer_UpdateTiming lastTiming;
         StringVariantBaseMap timingMap;