diff --git a/thunar/thunar-launcher.c b/thunar/thunar-launcher.c
index 706515a4da67d4d4c7ad50432564b8b278155c1a..820c9867411c81053606b681d51d65c9d4da3c6c 100644
--- a/thunar/thunar-launcher.c
+++ b/thunar/thunar-launcher.c
@@ -949,7 +949,7 @@ thunar_launcher_update_idle (gpointer data)
            * Unfortunately this is not supported by GIO directly */
 
           /* drop the default application from the list */
-          applications = g_list_remove (applications, applications->data);
+          applications = g_list_delete_link (applications, applications);
         }
       else if (G_UNLIKELY (n_selected_files == 1))
         {
@@ -1048,6 +1048,13 @@ thunar_launcher_update_idle (gpointer data)
 
       /* FIXME Add desktop actions here. Unfortunately they are not supported by
        * GIO, so we'll have to roll our own thing here */
+
+      /* schedule an update of the "Send To" menu */
+      if (G_LIKELY (launcher->sendto_idle_id == 0))
+        {
+          launcher->sendto_idle_id = g_idle_add_full (G_PRIORITY_LOW, thunar_launcher_sendto_idle,
+                                                      launcher, thunar_launcher_sendto_idle_destroy);
+        }
     }
 
   return FALSE;
@@ -1063,21 +1070,74 @@ thunar_launcher_update_idle_destroy (gpointer data)
 
 
 
+static void
+thunar_launcher_update_check (ThunarLauncher *launcher)
+{
+  _thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher));
+
+  /* check if the menu is in a dirty state */
+  if (launcher->launcher_idle_id != 0)
+    {
+      /* stop the timeout */
+      g_source_remove (launcher->launcher_idle_id);
+
+      /* force an update */
+      thunar_launcher_update_idle (launcher);
+
+      /* ui update */
+      gtk_ui_manager_ensure_update (launcher->ui_manager);
+    }
+}
+
+
+
 static void
 thunar_launcher_update (ThunarLauncher *launcher)
 {
-  /* schedule an update of the launcher items */
-  if (G_LIKELY (launcher->launcher_idle_id == 0))
+  GSList    *proxies, *lp;
+  GtkWidget *menu;
+  gboolean   instant_update;
+
+  _thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher));
+
+  proxies = gtk_action_get_proxies (launcher->action_open);
+  instant_update = (proxies == NULL);
+  for (lp = proxies; lp != NULL; lp = lp->next)
     {
-      launcher->launcher_idle_id = g_idle_add_full (G_PRIORITY_LOW, thunar_launcher_update_idle,
-                                                    launcher, thunar_launcher_update_idle_destroy);
+      menu = gtk_widget_get_toplevel (lp->data);
+      if (G_LIKELY (menu != NULL))
+        {
+          /* instant update if a menu is visible */
+          if (gtk_widget_get_visible (menu))
+            instant_update = TRUE;
+
+          /* watch menu changes */
+          g_signal_handlers_disconnect_by_func (G_OBJECT (menu), G_CALLBACK (thunar_launcher_update_check), launcher);
+          g_signal_connect_swapped (G_OBJECT (menu), "show", G_CALLBACK (thunar_launcher_update_check), launcher);
+        }
     }
 
-  /* schedule an update of the "Send To" menu */
-  if (G_LIKELY (launcher->sendto_idle_id == 0))
+  /* stop pending timeouts */
+  if (launcher->launcher_idle_id != 0)
+    g_source_remove (launcher->launcher_idle_id);
+
+  if (instant_update)
+    {
+      /* directly update without interruption */
+      thunar_launcher_update_idle (launcher);
+    }
+  else
     {
-      launcher->sendto_idle_id = g_idle_add_full (G_PRIORITY_LOW + 50, thunar_launcher_sendto_idle,
-                                                  launcher, thunar_launcher_sendto_idle_destroy);
+      /* assume all actions are working */
+      gtk_action_set_sensitive (launcher->action_open, TRUE);
+      gtk_action_set_visible (launcher->action_open_with_other, TRUE);
+      gtk_action_set_visible (launcher->action_open_in_new_window, TRUE);
+      gtk_action_set_visible (launcher->action_open_in_new_tab, TRUE);
+      gtk_action_set_visible (launcher->action_open_with_other_in_menu, TRUE);
+
+      /* delayed update */
+      launcher->launcher_idle_id = g_timeout_add_seconds_full (G_PRIORITY_LOW, 5, thunar_launcher_update_idle,
+                                                               launcher, thunar_launcher_update_idle_destroy);
     }
 }
 
@@ -1263,6 +1323,11 @@ thunar_launcher_action_open (GtkAction      *action,
   _thunar_return_if_fail (GTK_IS_ACTION (action));
   _thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher));
 
+  /* force update if still dirty */
+  thunar_launcher_update_check (launcher);
+  if (!gtk_action_get_sensitive (action))
+    return;
+
   /* check if we have a mime handler associated with the action */
   app_info = g_object_get_qdata (G_OBJECT (action), thunar_launcher_handler_quark);
   if (G_LIKELY (app_info != NULL))
@@ -1272,19 +1337,22 @@ thunar_launcher_action_open (GtkAction      *action,
       thunar_launcher_open_paths (app_info, selected_paths, launcher);
       thunar_g_file_list_free (selected_paths);
     }
-  else if (g_list_length (launcher->selected_files) == 1)
-    {
-      thunar_browser_poke_file (THUNAR_BROWSER (launcher),
-                                launcher->selected_files->data, launcher->widget,
-                                thunar_launcher_poke_file_finish, NULL);
-    }
-  else
+  else if (launcher->selected_files != NULL)
     {
-      /* resolve files one after another until none is left. Open/execute
-       * the resolved files/directories when all this is done at a later
-       * stage */
-      poke_data = thunar_launcher_poke_data_new (launcher->selected_files);
-      thunar_launcher_poke_files (launcher, poke_data);
+      if (launcher->selected_files->next == NULL)
+        {
+          thunar_browser_poke_file (THUNAR_BROWSER (launcher),
+                                    launcher->selected_files->data, launcher->widget,
+                                    thunar_launcher_poke_file_finish, NULL);
+        }
+      else
+        {
+          /* resolve files one after another until none is left. Open/execute
+           * the resolved files/directories when all this is done at a later
+           * stage */
+           poke_data = thunar_launcher_poke_data_new (launcher->selected_files);
+           thunar_launcher_poke_files (launcher, poke_data);
+        }
     }
 }
 
@@ -1297,6 +1365,11 @@ thunar_launcher_action_open_with_other (GtkAction      *action,
   _thunar_return_if_fail (GTK_IS_ACTION (action));
   _thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher));
 
+  /* force update if still dirty */
+  thunar_launcher_update_check (launcher);
+  if (!gtk_action_get_visible (action))
+    return;
+
   /* verify that we have atleast one selected file */
   if (G_LIKELY (launcher->selected_files != NULL))
     {
@@ -1314,6 +1387,11 @@ thunar_launcher_action_open_in_new_window (GtkAction      *action,
   _thunar_return_if_fail (GTK_IS_ACTION (action));
   _thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher));
 
+  /* force update if still dirty */
+  thunar_launcher_update_check (launcher);
+  if (!gtk_action_get_visible (action))
+    return;
+
   /* open the selected directories in new windows */
   thunar_launcher_open_windows (launcher, launcher->selected_files);
 }
@@ -1330,6 +1408,11 @@ thunar_launcher_action_open_in_new_tab (GtkAction      *action,
   _thunar_return_if_fail (GTK_IS_ACTION (action));
   _thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher));
 
+  /* force update if still dirty */
+  thunar_launcher_update_check (launcher);
+  if (!gtk_action_get_visible (action))
+    return;
+
   /* open all selected directories in a new tab */
   selected_files = thunar_g_file_list_copy (launcher->selected_files);
   for (lp = selected_files; lp != NULL; lp = lp->next)