diff --git a/src/scriptable/scriptable.cpp b/src/scriptable/scriptable.cpp
index 149c618cc4c219e08644f5f2259534bac87b116d..e07325e0aa745bb7a3b0e1e561966c84f7f67fa9 100644
--- a/src/scriptable/scriptable.cpp
+++ b/src/scriptable/scriptable.cpp
@@ -2624,27 +2624,40 @@ void Scriptable::runMenuCommandFilters()
 
     const QString menuItemProperty = QLatin1String("menuItem");
     const QString enabledProperty = QLatin1String("enabled");
+    bool running = false;
+    bool restart = false;
     connect(&timer, &QTimer::timeout, &loop, [&]() {
         if ( bytes.isEmpty() )
             return;
 
-        const int currentRun = bytes.toInt();
+        if (running) {
+            restart = true;
+            return;
+        }
+        running = true;
 
-        getActionData(actionId);
-        const QStringList matchCommands =
-            m_data.value(COPYQ_MIME_PREFIX "match-commands").toStringList();
+        do {
+            restart = false;
+            const int currentRun = bytes.toInt();
 
-        PerformanceLogger logger( QLatin1String("Menu item filters") );
+            getActionData(actionId);
+            const QStringList matchCommands =
+                m_data.value(COPYQ_MIME_PREFIX "match-commands").toStringList();
 
-        for (int i = 0; i < matchCommands.length(); ++i) {
-            const auto obj = m_engine->newObject();
-            m_engine->globalObject().setProperty(menuItemProperty, obj);
-            const bool enabled = canExecuteCommandFilter(matchCommands[i]);
-            QVariantMap menuItem = toDataMap(obj);
-            menuItem[enabledProperty] = enabled && menuItem.value(enabledProperty, true).toBool();
-            if ( !m_proxy->enableMenuItem(actionId, currentRun, i, menuItem) )
-                break;
-        }
+            PerformanceLogger logger( QLatin1String("Menu item filters") );
+
+            for (int i = 0; i < matchCommands.length(); ++i) {
+                const auto obj = m_engine->newObject();
+                m_engine->globalObject().setProperty(menuItemProperty, obj);
+                const bool enabled = canExecuteCommandFilter(matchCommands[i]);
+                QVariantMap menuItem = toDataMap(obj);
+                menuItem[enabledProperty] = enabled && menuItem.value(enabledProperty, true).toBool();
+                if ( restart || !m_proxy->enableMenuItem(actionId, currentRun, i, menuItem) )
+                    break;
+            }
+        } while (restart);
+
+        running = false;
     });
 
     emit receiveData();