diff --git a/src/gs-manager.c b/src/gs-manager.c
index e8ffc0b..65b03f7 100644
--- a/src/gs-manager.c
+++ b/src/gs-manager.c
@@ -1374,6 +1374,63 @@ window_activity_cb (GSWindow  *window,
 }
 
 static void
+probe_randr (GSManager *manager)
+{
+        XRRScreenResources *resources;
+        GdkWindow *root;
+
+        /* This is XRRGetScreenResources(), *not* XRRGetScreenResourcesCurrent(), so that the X server
+         * will be forced to re-probe the graphics outputs.
+         */
+
+        root = gdk_screen_get_root_window (gdk_display_get_default_screen (gdk_display_get_default ()));
+        resources = XRRGetScreenResources (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+                                           GDK_WINDOW_XID (root));
+        if (resources)
+                XRRFreeScreenResources (resources);
+}
+
+static GdkFilterReturn
+window_event_filter_cb (GdkXEvent *xevent,
+                        GdkEvent *event,
+                        gpointer  data)
+{
+        GSManager *manager = data;
+        XEvent *xev;
+
+        xev = (XEvent *) xevent;
+
+        if (xev->type == KeyPress && xev->key.keycode == XF86Display) {
+                /* See http://bugzilla.gnome.org/show_bug.cgi?id=590188 - since gnome-screensaver has a keyboard grab,
+                 * then gnome-settings-daemon cannot catch the event if the user presses the XF86Display hotkey (e.g.
+                 * Fn-F7 on Thinkpads).  This would leave the user without a way of doing "re-detect my monitors" by
+                 * hand in case hotplug is not working.  So, we capture that event by ourselves, and probe RANDR
+                 * by hand.  This will cause the X server to re-probe the graphics outputs, and it will send the
+                 * appropriate events to gnome-settings-daemon in that case.  *Then* g-s-d will actually reconfigure
+                 * the monitors in an appropriate way, and gnome-screensaver will get notified about the changed monitors.
+                 */
+                probe_randr (manager);
+                return GDK_FILTER_REMOVE;
+        }
+
+        return GDK_FILTER_CONTINUE;
+}
+
+static void
+window_realize_cb (GSWindow *window,
+                   GSManager *manager)
+{
+        GdkWindow *w;
+
+        /* We install an event filter so that we can capture the XF86Display hotkey */
+
+        w = gtk_widget_get_window (GTK_WIDGET (window));
+        g_assert (w != NULL);
+
+        gdk_window_add_filter (w, window_event_filter_cb, manager);
+}
+
+static void
 disconnect_window_signals (GSManager *manager,
                            GSWindow  *window)
 {
@@ -1387,6 +1444,7 @@ disconnect_window_signals (GSManager *manager,
         g_signal_handlers_disconnect_by_func (window, window_obscured_cb, manager);
         g_signal_handlers_disconnect_by_func (window, window_unmap_cb, manager);
         g_signal_handlers_disconnect_by_func (window, window_grab_broken_cb, manager);
+        g_signal_handlers_disconnect_by_func (window, window_realize_cb, manager);
 }
 
 static void
@@ -1422,6 +1480,8 @@ connect_window_signals (GSManager *manager,
                                  G_CALLBACK (window_unmap_cb), manager, G_CONNECT_AFTER);
         g_signal_connect_object (window, "grab_broken_event",
                                  G_CALLBACK (window_grab_broken_cb), manager, G_CONNECT_AFTER);
+        g_signal_connect_object (window, "realize",
+                                 G_CALLBACK (window_realize_cb), manager, 0);
 }
 
 static void
