diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp
index 9bedd0780f2ac27cbff41ef5b7cdd723e3d8da82..84521faef049c7daa41bdae48051ae3cc2363bb6 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp
@@ -70,7 +70,11 @@ namespace armarx
 
     void ControlDevicesWidget::controlDeviceStatusChanged(const ControlDeviceStatus& status)
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex, std::defer_lock};
+        if (!guard.try_lock_for(std::chrono::microseconds(100)))
+        {
+            return;
+        }
         if (statusUpdates[status.deviceName].timestampUSec < status.timestampUSec)
         {
             statusUpdates[status.deviceName] = status;
@@ -98,7 +102,7 @@ namespace armarx
     {
         auto temp = robotUnit->getControlDeviceDescriptions();
         {
-            std::lock_guard<std::recursive_mutex> guard {mutex};
+            std::unique_lock<std::recursive_timed_mutex> guard {mutex};
             resetData = std::move(temp);
         }
     }
@@ -116,7 +120,7 @@ namespace armarx
 
     void ControlDevicesWidget::add(const ControlDeviceDescription& desc)
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         if (entries.count(desc.deviceName))
         {
             return;
@@ -126,7 +130,7 @@ namespace armarx
 
     void ControlDevicesWidget::update(const ControlDeviceStatus& status)
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         if (!robotUnit || ! robotUnit->isRunning())
         {
             return;
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp
index 03ce425d248f8408c418884f4e8a11c12134a2ae..f4462a47070fa62ea3d76d35a11b41075186e1ac 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp
@@ -90,7 +90,7 @@ namespace armarx
     void NJointControllerClassesWidget::nJointControllerClassAdded(std::string name)
     {
         RobotUnitInterfacePrx ru;
-        std::unique_lock<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         if (!robotUnit)
         {
             return;
@@ -155,7 +155,7 @@ namespace armarx
     {
         auto temp = robotUnit->getNJointControllerClassDescriptions();
         {
-            std::lock_guard<std::recursive_mutex> guard {mutex};
+            std::unique_lock<std::recursive_timed_mutex> guard {mutex};
             for (NJointControllerClassDescription& ds : temp)
             {
                 nJointControllerClassDescriptions[ds.className] = std::move(ds);
@@ -216,7 +216,7 @@ namespace armarx
 
     void NJointControllerClassesWidget::add(const  NJointControllerClassDescription& desc)
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         if (entries.count(desc.className))
         {
             return;
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp
index d0289b8aebee6d7f45a67b08747393d60ed30fe0..554ee4780dfabfbb8f75508a3f4f1c9edc2a35b8 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp
@@ -89,7 +89,11 @@ namespace armarx
 
     void NJointControllersWidget::nJointControllerStatusChanged(const NJointControllerStatus& status)
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex, std::defer_lock};
+        if (!guard.try_lock_for(std::chrono::microseconds(100)))
+        {
+            return;
+        }
         if (statusUpdates[status.instanceName].timestampUSec < status.timestampUSec)
         {
             statusUpdates[status.instanceName] = status;
@@ -108,7 +112,7 @@ namespace armarx
 
     void NJointControllersWidget::onPushButtonStopAll_clicked()
     {
-        if(robotUnit)
+        if (robotUnit)
         {
             robotUnit->switchNJointControllerSetup({});
         }
@@ -133,7 +137,7 @@ namespace armarx
     void NJointControllersWidget::nJointControllerCreated(std::string name)
     {
         RobotUnitInterfacePrx ru;
-        std::unique_lock<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         if (isResetting || !robotUnit || entries.count(name))
         {
             return;
@@ -151,7 +155,7 @@ namespace armarx
 
     void NJointControllersWidget::nJointControllerDeleted(std::string name)
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         controllersDeleted.emplace(name);
         QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
     }
@@ -226,7 +230,7 @@ namespace armarx
     {
         auto temp = robotUnit->getNJointControllerDescriptionsWithStatuses();
         {
-            std::lock_guard<std::recursive_mutex> guard {mutex};
+            std::unique_lock<std::recursive_timed_mutex> guard {mutex};
             for (NJointControllerDescriptionWithStatus& ds : temp)
             {
                 controllersCreated[ds.description.instanceName] = std::move(ds);
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp
index 995cfff50c5f8d22264412b2a9563ed11901551a..f4b419b4ba44f79de6809b76ccc8361232ae1eff 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp
@@ -39,7 +39,7 @@ namespace armarx
         {
             return;
         }
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         resetCount = 0;
         getResettigLabel().setText("Resetting... " + QString::number(resetCount));
         getStackedWidget().setCurrentIndex(0);
@@ -54,14 +54,14 @@ namespace armarx
     {
         isResetting = true;
         gotResetData = false;
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         robotUnit = ru;
         QMetaObject::invokeMethod(this, "doReset", Qt::QueuedConnection);
     }
 
     void RobotUnitWidgetBase::doReset()
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         clearAll();
         getTreeWidget().clear();
         addFilter();
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h
index 7a6a122a0844a67a74b40275b19269cb769172ba..09ab24e9ed7c1a0bbe5b7476d3898b0d4e49901c 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h
@@ -75,7 +75,7 @@ namespace armarx
         void timerEvent(QTimerEvent*) override;
 
         RobotUnitInterfacePrx robotUnit;
-        mutable std::recursive_mutex mutex;
+        mutable std::recursive_timed_mutex mutex;
         std::atomic_bool gotResetData {false};
         int resetTimerId {0};
         int resetCount {0};
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp
index a6ff6b745f836627ed69acde04d2dbb7f14293f4..87ed1e20e1b65e7df4e9c35c7da41c5383aa93c4 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp
@@ -54,7 +54,11 @@ namespace armarx
 
     void SensorDevicesWidget::sensorDeviceStatusChanged(const SensorDeviceStatus& status)
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex, std::defer_lock};
+        if (!guard.try_lock_for(std::chrono::microseconds(100)))
+        {
+            return;
+        }
         if (statusUpdates[status.deviceName].timestampUSec < status.timestampUSec)
         {
             statusUpdates[status.deviceName] = status;
@@ -86,7 +90,7 @@ namespace armarx
     {
         auto temp = robotUnit->getSensorDeviceDescriptions();
         {
-            std::lock_guard<std::recursive_mutex> guard {mutex};
+            std::unique_lock<std::recursive_timed_mutex> guard {mutex};
             resetData = std::move(temp);
         }
     }
@@ -104,7 +108,7 @@ namespace armarx
 
     void SensorDevicesWidget::add(const SensorDeviceDescription& desc)
     {
-        std::lock_guard<std::recursive_mutex> guard {mutex};
+        std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         if (!entries.count(desc.deviceName))
         {
             entries[desc.deviceName] = new SensorDevicesWidgetEntry(*this, *(ui->treeWidget), desc);