diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c
index 9c5f1a3..d4549e1 100644
--- a/panels/display/cc-display-panel.c
+++ b/panels/display/cc-display-panel.c
@@ -87,6 +87,8 @@ struct _CcDisplayPanelPrivate
 
   GDBusProxy *shell_proxy;
   GCancellable *shell_cancellable;
+
+  GtkWidget *outputs_listbox;
 };
 
 typedef struct
@@ -1988,12 +1990,130 @@ sanity_check_rotation (GnomeRROutputInfo *output)
 }
 
 static void
+dialog_response_cb (GtkDialog *dialog, gint response, gpointer user_data)
+{
+  CcDisplayPanel *panel = (CcDisplayPanel *)user_data;
+  CcDisplayPanelPrivate *priv = panel->priv;
+  gint i, old_width, old_height;
+  gboolean clone, was_clone, primary, was_primary, active;
+  GnomeRRRotation rotation;
+  GnomeRROutputInfo **outputs;
+
+  outputs = gnome_rr_config_get_outputs (priv->current_configuration);
+
+  rotation = gnome_rr_output_info_get_rotation (priv->current_output);
+
+  gnome_rr_output_info_get_geometry (priv->current_output, NULL, NULL,
+                                     &old_width, &old_height);
+
+  was_clone = clone = gnome_rr_config_get_clone (priv->current_configuration);
+  was_primary = primary = gnome_rr_output_info_get_primary (priv->current_output);
+  active = gnome_rr_output_info_is_active (priv->current_output);
+
+  if (response == GTK_RESPONSE_ACCEPT)
+    {
+      GtkListBoxRow *row;
+      gboolean active = TRUE;
+
+      if (g_hash_table_size (output_ids) > 1)
+        {
+          gint new_width, new_height;
+
+          gnome_rr_output_info_get_geometry (priv->current_output, NULL, NULL,
+                                             &new_width, &new_height);
+
+          row = gtk_list_box_get_selected_row (GTK_LIST_BOX (priv->outputs_listbox));
+
+          switch (gtk_list_box_row_get_index (row))
+            {
+            case DISPLAY_MODE_PRIMARY:
+              primary = TRUE;
+              clone = FALSE;
+              break;
+
+            case DISPLAY_MODE_MIRROR:
+              clone = TRUE;
+              break;
+
+            case DISPLAY_MODE_SECONDARY:
+              primary = FALSE;
+              clone = FALSE;
+              break;
+
+            case DISPLAY_MODE_OFF:
+              clone = FALSE;
+              active = FALSE;
+              break;
+            }
+
+          gnome_rr_output_info_set_active (priv->current_output, active);
+          gnome_rr_output_info_set_primary (priv->current_output, primary);
+          gnome_rr_config_set_clone (priv->current_configuration, clone);
+
+          for (i = 0; outputs[i]; i++)
+            {
+              if (!gnome_rr_output_info_is_active (outputs[i]))
+                continue;
+
+              if (clone)
+                {
+                  /* set all active outputs to the same size and position when
+                   * cloning */
+                  gnome_rr_output_info_set_geometry (outputs[i], 0, 0,
+                                                     new_width, new_height);
+                }
+              else if (outputs[i] != priv->current_output)
+                {
+                  /* ensure no other outputs are primary if this output is now
+                   * primary, or find another output to set as primary if this
+                   * output is no longer primary */
+
+                  gnome_rr_output_info_set_primary (outputs[i], !primary);
+                  if (!was_primary)
+                    break;
+                }
+            }
+
+          sanity_check_rotation (priv->current_output);
+
+          /* if the display was previously in clone mode, ensure the outputs
+           * are arranged correctly */
+          if ((was_clone && !clone))
+            lay_out_outputs_horizontally (panel);
+
+          if (!clone)
+            realign_outputs_after_resolution_change (panel,
+                                                     priv->current_output,
+                                                     old_width, old_height, rotation);
+        }
+      else
+        {
+          /* check rotation */
+          sanity_check_rotation (priv->current_output);
+        }
+
+      apply_current_configuration (panel);
+    }
+  else if (response != GTK_RESPONSE_NONE)
+    {
+      /* changes cancelled, so re-read the current configuration */
+      on_screen_changed (panel);
+    }
+
+  priv->rotate_left_button = NULL;
+  priv->rotate_right_button = NULL;
+  priv->res_combo = NULL;
+  gtk_widget_destroy (GTK_WIDGET(dialog));
+  priv->dialog = NULL;
+}
+
+static void
 show_setup_dialog (CcDisplayPanel *panel)
 {
   CcDisplayPanelPrivate *priv = panel->priv;
-  GtkWidget *listbox = NULL, *content_area, *item, *box, *frame, *preview;
+  GtkWidget *content_area, *item, *box, *frame, *preview;
   GtkWidget *label, *rotate_box;
-  gint i, width_mm, height_mm, old_width, old_height;
+  gint i, width_mm, height_mm;
   GnomeRROutput *output;
   gchar *str;
   gboolean clone, was_clone, primary, was_primary, active;
@@ -2001,7 +2121,7 @@ show_setup_dialog (CcDisplayPanel *panel)
   GtkCellRenderer *renderer;
   GnomeRRRotation rotation;
   gboolean show_rotation;
-  gint response, num_active_outputs = 0;
+  gint num_active_outputs = 0;
   GnomeRROutputInfo **outputs;
 
   outputs = gnome_rr_config_get_outputs (priv->current_configuration);
@@ -2022,6 +2142,8 @@ show_setup_dialog (CcDisplayPanel *panel)
                                               NULL);
   g_signal_connect (priv->dialog, "notify::has-toplevel-focus",
                     G_CALLBACK (dialog_toplevel_focus_changed), panel);
+  g_signal_connect (priv->dialog, "response",
+                    G_CALLBACK (dialog_response_cb), panel);
   gtk_dialog_set_default_response (GTK_DIALOG (priv->dialog), GTK_RESPONSE_ACCEPT);
   gtk_dialog_set_response_sensitive (GTK_DIALOG (priv->dialog), GTK_RESPONSE_ACCEPT, FALSE);
   gtk_window_set_resizable (GTK_WINDOW (priv->dialog), FALSE);
@@ -2181,51 +2303,45 @@ show_setup_dialog (CcDisplayPanel *panel)
       gtk_container_add (GTK_CONTAINER (box), frame);
       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
 
-      listbox = gtk_list_box_new ();
-      gtk_container_add (GTK_CONTAINER (frame), listbox);
-      gtk_list_box_set_header_func (GTK_LIST_BOX (listbox),
+      priv->outputs_listbox = gtk_list_box_new ();
+      gtk_container_add (GTK_CONTAINER (frame), priv->outputs_listbox);
+      gtk_list_box_set_header_func (GTK_LIST_BOX (priv->outputs_listbox),
                                     cc_list_box_update_header_func,
                                     NULL, NULL);
-      g_signal_connect (listbox, "row-selected",
+      g_signal_connect (priv->outputs_listbox, "row-selected",
                         G_CALLBACK (setup_listbox_row_activated), panel);
-      g_signal_connect_swapped (listbox, "row-selected",
+      g_signal_connect_swapped (priv->outputs_listbox, "row-selected",
                                 G_CALLBACK (gtk_widget_queue_draw), preview);
-      gtk_widget_show (listbox);
+      gtk_widget_show (priv->outputs_listbox);
 
       item = list_box_item (_("Primary"),
                             _("Show the top bar and Activities Overview on this display"));
-      gtk_container_add (GTK_CONTAINER (listbox), item);
+      gtk_container_add (GTK_CONTAINER (priv->outputs_listbox), item);
       if (primary)
-        gtk_list_box_select_row (GTK_LIST_BOX (listbox),
+        gtk_list_box_select_row (GTK_LIST_BOX (priv->outputs_listbox),
                                  GTK_LIST_BOX_ROW (item));
 
       item = list_box_item (_("Secondary Display"),
                             _("Join this display with another to create an extra workspace"));
-      gtk_container_add (GTK_CONTAINER (listbox), item);
+      gtk_container_add (GTK_CONTAINER (priv->outputs_listbox), item);
       if (!primary && !clone)
-        gtk_list_box_select_row (GTK_LIST_BOX (listbox),
+        gtk_list_box_select_row (GTK_LIST_BOX (priv->outputs_listbox),
                                  GTK_LIST_BOX_ROW (item));
 
-#if 0
-      item = list_box_item (_("Presentation"),
-                            _("Show slideshows and media only"));
-      gtk_container_add (GTK_CONTAINER (listbox), item);
-#endif
-
       /* translators: "Mirror" describes when both displays show the same view */
       item = list_box_item (_("Mirror"),
                             _("Show your existing view on both displays"));
-      gtk_container_add (GTK_CONTAINER (listbox), item);
+      gtk_container_add (GTK_CONTAINER (priv->outputs_listbox), item);
       if (clone && active)
-        gtk_list_box_select_row (GTK_LIST_BOX (listbox),
+        gtk_list_box_select_row (GTK_LIST_BOX (priv->outputs_listbox),
                                  GTK_LIST_BOX_ROW (item));
 
       item = list_box_item (_("Turn Off"),
                             _("Don't use this display"));
-      gtk_container_add (GTK_CONTAINER (listbox), item);
+      gtk_container_add (GTK_CONTAINER (priv->outputs_listbox), item);
 
       if (!active)
-        gtk_list_box_select_row (GTK_LIST_BOX (listbox),
+        gtk_list_box_select_row (GTK_LIST_BOX (priv->outputs_listbox),
                                  GTK_LIST_BOX_ROW (item));
     }
   else
@@ -2241,113 +2357,7 @@ show_setup_dialog (CcDisplayPanel *panel)
   gtk_container_add (GTK_CONTAINER (box), priv->config_grid);
   gtk_widget_show_all (box);
 
-  gnome_rr_output_info_get_geometry (priv->current_output, NULL, NULL,
-                                     &old_width, &old_height);
-
-  response = gtk_dialog_run (GTK_DIALOG (priv->dialog));
-  if (response == GTK_RESPONSE_ACCEPT)
-    {
-      GtkListBoxRow *row;
-      gboolean active = TRUE;
-
-      if (g_hash_table_size (output_ids) > 1)
-        {
-          gint new_width, new_height;
-
-          gnome_rr_output_info_get_geometry (priv->current_output, NULL, NULL,
-                                             &new_width, &new_height);
-
-          row = gtk_list_box_get_selected_row (GTK_LIST_BOX (listbox));
-
-          switch (gtk_list_box_row_get_index (row))
-            {
-            case DISPLAY_MODE_PRIMARY:
-              primary = TRUE;
-              clone = FALSE;
-              break;
-
-#if 0
-            case DISPLAY_MODE_PRESENTATION:
-              gnome_rr_config_set_clone (priv->current_configuration, FALSE);
-              primary = FALSE;
-              clone = FALSE;
-              break;
-#endif
-
-            case DISPLAY_MODE_MIRROR:
-              clone = TRUE;
-              break;
-
-            case DISPLAY_MODE_SECONDARY:
-              primary = FALSE;
-              clone = FALSE;
-              break;
-
-            case DISPLAY_MODE_OFF:
-              clone = FALSE;
-              active = FALSE;
-              break;
-            }
-
-          gnome_rr_output_info_set_active (priv->current_output, active);
-          gnome_rr_output_info_set_primary (priv->current_output, primary);
-          gnome_rr_config_set_clone (priv->current_configuration, clone);
-
-          for (i = 0; outputs[i]; i++)
-            {
-              if (!gnome_rr_output_info_is_active (outputs[i]))
-                continue;
-
-              if (clone)
-                {
-                  /* set all active outputs to the same size and position when
-                   * cloning */
-                  gnome_rr_output_info_set_geometry (outputs[i], 0, 0,
-                                                     new_width, new_height);
-                }
-              else if (outputs[i] != priv->current_output)
-                {
-                  /* ensure no other outputs are primary if this output is now
-                   * primary, or find another output to set as primary if this
-                   * output is no longer primary */
-
-                  gnome_rr_output_info_set_primary (outputs[i], !primary);
-                  if (!was_primary)
-                    break;
-                }
-            }
-
-          sanity_check_rotation (priv->current_output);
-
-          /* if the display was previously in clone mode, ensure the outputs
-           * are arranged correctly */
-          if ((was_clone && !clone))
-            lay_out_outputs_horizontally (panel);
-
-          if (!clone)
-            realign_outputs_after_resolution_change (panel,
-                                                     priv->current_output,
-                                                     old_width, old_height, rotation);
-        }
-      else
-        {
-          /* check rotation */
-          sanity_check_rotation (priv->current_output);
-        }
-
-      apply_current_configuration (panel);
-    }
-  else if (response != GTK_RESPONSE_NONE)
-    {
-      /* changes cancelled, so re-read the current configuration */
-      on_screen_changed (panel);
-    }
-
-  priv->rotate_left_button = NULL;
-  priv->rotate_right_button = NULL;
-  priv->res_combo = NULL;
-  gtk_widget_destroy (priv->dialog);
-  priv->dialog = NULL;
+  gtk_widget_show_all (priv->dialog);
 }
 
 static void
