diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.cpp b/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.cpp
index 57f673dc5680ea14392374da3f10da6f94e132f5..9929d045c43ef7fb60fd7d8ca221b0b55483b879 100644
--- a/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.cpp
+++ b/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.cpp
@@ -16,7 +16,8 @@ namespace armarx
 
     PluginCache::PluginCache(ArmarXManagerPtr manager) :
         cachePath(GetIconCachePath()),
-        manager(manager)
+        manager(manager),
+        s(settingsOrganization, settingsApplicationName)
     {
         QDir dir(cachePath);
         if (!dir.exists())
@@ -24,7 +25,7 @@ namespace armarx
             dir.mkpath(".");
         }
 
-        QSettings s(settingsOrganization, settingsApplicationName);
+
         auto map = s.value("widgets").toMap();
         for (QString key : map.keys())
         {
@@ -32,11 +33,12 @@ namespace armarx
             QStringList keyparts = key.split(":");
             if (w.size() == 3)
             {
-                pluginData[key].pluginPath = keyparts[0];
-                pluginData[key].lastModified = QDateTime::fromMSecsSinceEpoch(w[0].toLongLong());
-                pluginData[key].hash = w[1].toAscii();
+                auto& elem = pluginData[keyparts[0]];
+                elem.pluginPath = keyparts[0];
+                elem.lastModified = QDateTime::fromMSecsSinceEpoch(w[0].toLongLong());
+                elem.hash = w[1].toAscii();
                 ARMARX_INFO_S << "Widget: " << w[2];
-                pluginData[key].widgets[w[2]] = ArmarXWidgetInfoPtr();
+                elem.widgets[w[2]] = ArmarXWidgetInfoPtr();
             }
         }
     }
@@ -71,7 +73,8 @@ namespace armarx
                 }
                 else if (getHash(pluginPath) == elem.hash)
                 {
-                    ARMARX_DEBUG_S << "Same hash";
+                    ARMARX_DEBUG_S << "Same hash - timestamps " << info.lastModified().toString() << " <> " << elem.lastModified.toString() ;
+                    updateLastModifiedTimestamp(pluginPath);
                     found = true;
                 }
                 else
@@ -223,7 +226,7 @@ namespace armarx
 
     void PluginCache::clearCacheFile()
     {
-        QSettings s(settingsOrganization, settingsApplicationName);
+        ScopedRecursiveLock lock(cacheMutex);
         s.clear();
     }
 
@@ -239,6 +242,24 @@ namespace armarx
         return hashData.toHex();
     }
 
+    void PluginCache::updateLastModifiedTimestamp(const QString& pluginPath)
+    {
+        QDateTime time = QFileInfo(pluginPath).lastModified();
+        ScopedRecursiveLock lock(cacheMutex);
+        QMap<QString, QVariant> widgetMap = s.value("widgets").toMap();
+        ARMARX_DEBUG_S << "Updating last modified timestamp of plugin " << pluginPath << " to " << time.toString();
+        auto& pluginDataElement = pluginData[pluginPath];
+        for (auto & widget : pluginDataElement.widgets)
+        {
+            widgetMap[pluginPath + ":" + widget.first] = QString::number(time.toMSecsSinceEpoch()) + ":" + pluginDataElement.hash + ":" + widget.first;
+        }
+
+        assert(QString::number(time.toMSecsSinceEpoch()).toLongLong() == time.toMSecsSinceEpoch());
+
+        pluginDataElement.lastModified = time;
+        s.setValue("widgets", widgetMap);
+    }
+
     void PluginCache::writeToCache(const QString& pluginPath)
     {
         auto start = IceUtil::Time::now();
@@ -246,8 +267,9 @@ namespace armarx
         ARMARX_DEBUG_S << "Hashing took " << (IceUtil::Time::now() - start).toMicroSecondsDouble();
         QSharedPointer<QPluginLoader> loader(new QPluginLoader(pluginPath));
         auto widgets = loadPlugin(loader);
-        QSettings s(settingsOrganization, settingsApplicationName);
+        copyResourcesToCache();
         ARMARX_INFO_S << "Writing plugin " << pluginPath << " to cache";
+        ScopedRecursiveLock lock(cacheMutex);
         QMap<QString, QVariant> widgetMap = s.value("widgets").toMap();
         QDateTime time = QFileInfo(pluginPath).lastModified();
         for (auto & elem : widgets)
@@ -258,8 +280,7 @@ namespace armarx
 
         s.setValue("widgets", widgetMap);
 
-        copyResourcesToCache();
-        ScopedRecursiveLock lock(cacheMutex);
+
         pluginData[pluginPath] = {loader, pluginPath, hashData, time, widgets};
 
     }
@@ -267,13 +288,17 @@ namespace armarx
     PluginData PluginCache::loadFromCache(const QString& widgetName)
     {
         ARMARX_INFO_S << "Loading widget " << widgetName << " from cache ";
-        QSettings s(settingsOrganization, settingsApplicationName);
+
         QString pluginPath;
         QSharedPointer<QPluginLoader> loader;
         WidgetCreatorMap widgets;
         QDateTime time;
         QByteArray hash;
-        auto map = s.value("widgets").toMap();
+        QMap<QString, QVariant> map;
+        {
+            ScopedRecursiveLock lock(cacheMutex);
+            map = s.value("widgets").toMap();
+        }
         for (auto key : map.keys())
         {
             QStringList w = map[key].toString().split(":");
diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.h b/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.h
index 864ee7b0faa311b956d3408f3b5d5387ab5aedc8..877ebad93b4101380ce90187545fccb1182b5022 100644
--- a/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.h
+++ b/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.h
@@ -50,12 +50,14 @@ namespace armarx
         QByteArray getHash(const QString& pluginPath);
 
     protected:
+        void updateLastModifiedTimestamp(const QString& pluginPath);
         void writeToCache(const QString& pluginPath);
         PluginData loadFromCache(const QString& pluginPath);
         WidgetCreatorMap loadPlugin(QSharedPointer<QPluginLoader> loader);
         const QString cachePath;
         QMap<QString, PluginData> pluginData;
         ArmarXManagerPtr manager;
+        QSettings s;
         mutable RecursiveMutex cacheMutex;
         std::future<void> preloadFuture;
         bool shutdown = false;