Index: app/dialogs/file-save-dialog.c
===================================================================
--- app/dialogs/file-save-dialog.c	(revision 25497)
+++ app/dialogs/file-save-dialog.c	(working copy)
@@ -115,20 +115,16 @@ file_save_dialog_response (GtkWidget *sa
   gchar               *uri;
   gchar               *basename;
   GimpPlugInProcedure *save_proc;
-  gulong               handler_id;
 
   if (response_id != GTK_RESPONSE_OK)
     {
       if (! dialog->busy)
-        gtk_widget_hide (save_dialog);
+        gtk_widget_destroy (save_dialog);
 
       return;
     }
 
   gimp_file_dialog_set_sensitive (dialog, FALSE);
-  handler_id = g_signal_connect (dialog, "destroy",
-                                 G_CALLBACK (gtk_widget_destroyed),
-                                 &dialog);
 
   if (file_save_dialog_check_uri (save_dialog, gimp,
                                   &uri, &basename, &save_proc))
@@ -141,14 +137,14 @@ file_save_dialog_response (GtkWidget *sa
         {
           if (dialog)
             {
-              gtk_widget_hide (save_dialog);
+              GtkWindow *parent;
 
-              if (dialog->close_after_saving)
-                {
-                  GtkWindow *parent;
+              parent = gtk_window_get_transient_for (GTK_WINDOW (dialog));
 
-                  parent = gtk_window_get_transient_for (GTK_WINDOW (dialog));
+              gtk_widget_destroy (save_dialog);
 
+              if (dialog->close_after_saving)
+                {
                   if (GIMP_IS_DISPLAY_SHELL (parent))
                     {
                       GimpDisplay *display;
@@ -165,13 +161,6 @@ file_save_dialog_response (GtkWidget *sa
       g_free (uri);
       g_free (basename);
     }
-
-  /* dialog may have been destroyed while save plugin was running */
-  if (dialog)
-    {
-      gimp_file_dialog_set_sensitive (dialog, TRUE);
-      g_signal_handler_disconnect (dialog, handler_id);
-    }
 }
 
 static gboolean
Index: app/dialogs/file-open-dialog.c
===================================================================
--- app/dialogs/file-open-dialog.c	(revision 25497)
+++ app/dialogs/file-open-dialog.c	(working copy)
@@ -101,7 +101,7 @@ file_open_dialog_response (GtkWidget *op
   if (response_id != GTK_RESPONSE_OK)
     {
       if (! dialog->busy)
-        gtk_widget_hide (open_dialog);
+        gtk_widget_destroy (open_dialog);
 
       return;
     }
@@ -155,13 +155,11 @@ file_open_dialog_response (GtkWidget *op
 
   if (success)
     {
-      gtk_widget_hide (open_dialog);
-
       if (dialog->image)
         gimp_image_flush (dialog->image);
-    }
 
-  gimp_file_dialog_set_sensitive (dialog, TRUE);
+      gtk_widget_destroy (open_dialog);
+    }
 
   g_slist_foreach (uris, (GFunc) g_free, NULL);
   g_slist_free (uris);
Index: app/actions/file-commands.c
===================================================================
--- app/actions/file-commands.c	(revision 25497)
+++ app/actions/file-commands.c	(working copy)
@@ -73,8 +73,6 @@ static void   file_save_dialog_show     
                                             const gchar *title,
                                             gboolean     save_a_copy,
                                             gboolean     close_after_saving);
-static void   file_save_dialog_destroyed   (GtkWidget   *dialog,
-                                            GimpImage   *image);
 static void   file_new_template_callback   (GtkWidget   *widget,
                                             const gchar *name,
                                             gpointer     data);
@@ -488,28 +486,10 @@ file_save_dialog_show (GimpImage   *imag
 {
   GtkWidget *dialog;
 
-  dialog = g_object_get_data (G_OBJECT (image), "gimp-file-save-dialog");
-
-  if (! dialog)
-    {
-      dialog = gimp_dialog_factory_dialog_new (global_dialog_factory,
-                                               gtk_widget_get_screen (parent),
-                                               "gimp-file-save-dialog",
-                                               -1, FALSE);
-
-      if (dialog)
-        {
-          gtk_window_set_transient_for (GTK_WINDOW (dialog),
-                                        GTK_WINDOW (parent));
-
-          g_object_set_data_full (G_OBJECT (image),
-                                  "gimp-file-save-dialog", dialog,
-                                  (GDestroyNotify) gtk_widget_destroy);
-          g_signal_connect (dialog, "destroy",
-                            G_CALLBACK (file_save_dialog_destroyed),
-                            image);
-        }
-    }
+  dialog = gimp_dialog_factory_dialog_new (global_dialog_factory,
+                                           gtk_widget_get_screen (parent),
+                                           "gimp-file-save-dialog",
+                                           -1, FALSE);
 
   if (dialog)
     {
@@ -518,19 +498,16 @@ file_save_dialog_show (GimpImage   *imag
       gimp_file_dialog_set_image (GIMP_FILE_DIALOG (dialog),
                                   image, save_a_copy, close_after_saving);
 
+      parent = gtk_widget_get_toplevel (parent);
+
+      if (GTK_IS_WINDOW (parent))
+        gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
+
       gtk_window_present (GTK_WINDOW (dialog));
     }
 }
 
 static void
-file_save_dialog_destroyed (GtkWidget *dialog,
-                            GimpImage *image)
-{
-  if (GIMP_FILE_DIALOG (dialog)->image == image)
-    g_object_set_data (G_OBJECT (image), "gimp-file-save-dialog", NULL);
-}
-
-static void
 file_new_template_callback (GtkWidget   *widget,
                             const gchar *name,
                             gpointer     data)
