diff --git a/eel/eel-stock-dialogs.c b/eel/eel-stock-dialogs.c
index 34712c8..ae72d86 100644
--- a/eel/eel-stock-dialogs.c
+++ b/eel/eel-stock-dialogs.c
@@ -395,8 +395,8 @@ show_message_dialog (const char *primary_text,
 	}
 	gtk_widget_show (GTK_WIDGET (dialog));
 
-	g_signal_connect (dialog, "response",
-			  G_CALLBACK (gtk_object_destroy), NULL);
+	g_signal_connect_after (dialog, "response",
+			  G_CALLBACK (gtk_widget_destroy), NULL);
 
 	return dialog;
 }
diff --git a/libnautilus-private/nautilus-mime-actions.c b/libnautilus-private/nautilus-mime-actions.c
index 77d933a..2c8cc95 100644
--- a/libnautilus-private/nautilus-mime-actions.c
+++ b/libnautilus-private/nautilus-mime-actions.c
@@ -1846,7 +1846,8 @@ activate_files (ActivateParameters *parameters)
 			uri = nautilus_file_get_activation_uri (file);
 			f = g_file_new_for_uri (uri);
 			nautilus_window_slot_info_open_location (parameters->slot_info,
-								 f, parameters->mode, flags, NULL);
+								 f, parameters->mode, flags, NULL,
+								 NULL, NULL);
 			g_object_unref (f);
 			g_free (uri);
 		}
diff --git a/libnautilus-private/nautilus-window-slot-info.c b/libnautilus-private/nautilus-window-slot-info.c
index 9adff6c..de5dc1f 100644
--- a/libnautilus-private/nautilus-window-slot-info.c
+++ b/libnautilus-private/nautilus-window-slot-info.c
@@ -108,7 +108,9 @@ nautilus_window_slot_info_open_location (NautilusWindowSlotInfo  *slot,
 					 GFile                   *location,
 					 NautilusWindowOpenMode   mode,
 					 NautilusWindowOpenFlags  flags,
-					 GList                   *selection)
+					 GList                   *selection,
+					 NautilusWindowGotoCallback callback,
+					 gpointer 		  userdata)
 {
 	g_assert (NAUTILUS_IS_WINDOW_SLOT_INFO (slot));
 
@@ -116,7 +118,9 @@ nautilus_window_slot_info_open_location (NautilusWindowSlotInfo  *slot,
 								       location,
 								       mode,
 								       flags,
-								       selection);
+								       selection,
+								       callback,
+								       userdata);
 }
 
 char *
diff --git a/libnautilus-private/nautilus-window-slot-info.h b/libnautilus-private/nautilus-window-slot-info.h
index bc4a066..3e61d7d 100644
--- a/libnautilus-private/nautilus-window-slot-info.h
+++ b/libnautilus-private/nautilus-window-slot-info.h
@@ -34,6 +34,10 @@
 #define NAUTILUS_IS_WINDOW_SLOT_INFO(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_WINDOW_SLOT_INFO))
 #define NAUTILUS_WINDOW_SLOT_INFO_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NAUTILUS_TYPE_WINDOW_SLOT_INFO, NautilusWindowSlotInfoIface))
 
+typedef void (* NautilusWindowGotoCallback) (NautilusWindow *window,
+                                             gboolean success,
+                                             gpointer userdata);
+
 typedef struct _NautilusWindowSlotInfoIface NautilusWindowSlotInfoIface;
 
 struct _NautilusWindowSlotInfoIface
@@ -72,7 +76,9 @@ struct _NautilusWindowSlotInfoIface
 				       GFile *location,
 				       NautilusWindowOpenMode mode,
 				       NautilusWindowOpenFlags flags,
-				       GList *selection);
+				       GList *selection,
+				       NautilusWindowGotoCallback callback,
+				       gpointer userdata);
 	void   (* make_hosting_pane_active) (NautilusWindowSlotInfo *slot);
 };
 
@@ -83,7 +89,9 @@ void                              nautilus_window_slot_info_open_location
 										 GFile                             *location,
 										 NautilusWindowOpenMode             mode,
 										 NautilusWindowOpenFlags            flags,
-										 GList                             *selection);
+										 GList                             *selection,
+										 NautilusWindowGotoCallback 	    callback,
+										 gpointer 			    userdata);
 void                              nautilus_window_slot_info_set_status          (NautilusWindowSlotInfo            *slot,
 										 const char *status);
 void                              nautilus_window_slot_info_make_hosting_pane_active (NautilusWindowSlotInfo       *slot);
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index 0997a15..16145d4 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -868,7 +868,7 @@ open_location (FMDirectoryView *directory_view,
 			    "directory view open_location window=%p: %s", window, new_uri);
 	location = g_file_new_for_uri (new_uri);
 	nautilus_window_slot_info_open_location (directory_view->details->slot,
-						 location, mode, flags, NULL);
+						 location, mode, flags, NULL, NULL, NULL);
 	g_object_unref (location);
 }
 
diff --git a/src/file-manager/fm-tree-view.c b/src/file-manager/fm-tree-view.c
index de9523d..156cd97 100644
--- a/src/file-manager/fm-tree-view.c
+++ b/src/file-manager/fm-tree-view.c
@@ -362,6 +362,8 @@ got_activation_uri_callback (NautilusFile *file, gpointer callback_data)
 				 location, 
 				 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
 				 view->details->activation_flags,
+				 NULL,
+				 NULL,
 				 NULL);
 			g_object_unref (location);
 		} else {
@@ -392,6 +394,8 @@ got_activation_uri_callback (NautilusFile *file, gpointer callback_data)
 				 location,
 				 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
 				 view->details->activation_flags,
+				 NULL,
+				 NULL,
 				 NULL);
 			g_object_unref (location);
 		}
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index 26b2cf9..10835e8 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -718,7 +718,7 @@ open_window (NautilusApplication *application,
 			nautilus_window_go_home (window);
 		} else {
 			location = g_file_new_for_uri (uri);
-			nautilus_window_go_to (window, location);
+			nautilus_window_go_to (window, location, NULL, NULL);
 			g_object_unref (location);
 		}
 	} else {
@@ -1543,7 +1543,7 @@ autorun_show_window (GMount *mount, gpointer user_data)
 		window = nautilus_application_create_navigation_window (application, 
 									NULL, 
 									gdk_screen_get_default ());
-		nautilus_window_go_to (window, location);
+		nautilus_window_go_to (window, location, NULL, NULL);
 
 	} else {
 		nautilus_application_present_spatial_window (application, 
diff --git a/src/nautilus-bookmarks-window.c b/src/nautilus-bookmarks-window.c
index 98fc4c2..d417f6d 100644
--- a/src/nautilus-bookmarks-window.c
+++ b/src/nautilus-bookmarks-window.c
@@ -563,7 +563,7 @@ open_selected_bookmark (gpointer user_data, GdkScreen *screen)
 	}
 
 	if (NAUTILUS_IS_NAVIGATION_WINDOW (user_data)) {
-		nautilus_window_go_to (NAUTILUS_WINDOW (user_data), location);
+		nautilus_window_go_to (NAUTILUS_WINDOW (user_data), location, NULL, NULL);
 	} else if (NAUTILUS_IS_SPATIAL_WINDOW (user_data)) {
 		window = nautilus_application_present_spatial_window (application, 
 								      NULL,
@@ -575,7 +575,7 @@ open_selected_bookmark (gpointer user_data, GdkScreen *screen)
 			window = nautilus_application_create_navigation_window (application, 
 										NULL,
 										screen);
-			nautilus_window_go_to (window, location);
+			nautilus_window_go_to (window, location, NULL, NULL);
 		} else {
 			window = nautilus_application_present_spatial_window (application, 
 									      NULL,
diff --git a/src/nautilus-connect-server-dialog-nonmain.c b/src/nautilus-connect-server-dialog-nonmain.c
index 885f6a1..262bf0e 100644
--- a/src/nautilus-connect-server-dialog-nonmain.c
+++ b/src/nautilus-connect-server-dialog-nonmain.c
@@ -42,7 +42,7 @@ nautilus_connect_server_dialog_present_uri (NautilusApplication *application,
 		window = nautilus_application_create_navigation_window (application,
 									NULL,
 									gtk_widget_get_screen (widget));
-		nautilus_window_go_to (window, location);
+		nautilus_window_go_to (window, location, NULL, NULL);
 	} else {
 		nautilus_application_present_spatial_window (application,
 							     NULL,
diff --git a/src/nautilus-desktop-window.c b/src/nautilus-desktop-window.c
index b4219d0..cd26b6e 100644
--- a/src/nautilus-desktop-window.c
+++ b/src/nautilus-desktop-window.c
@@ -89,7 +89,7 @@ nautilus_desktop_window_update_directory (NautilusDesktopWindow *window)
 	
 	NAUTILUS_SPATIAL_WINDOW (window)->affect_spatial_window_on_next_location_change = TRUE;
 	location = g_file_new_for_uri (EEL_DESKTOP_URI);
-	nautilus_window_go_to (NAUTILUS_WINDOW (window), location);
+	nautilus_window_go_to (NAUTILUS_WINDOW (window), location, NULL, NULL);
 	g_object_unref (location);
 }
 
diff --git a/src/nautilus-history-sidebar.c b/src/nautilus-history-sidebar.c
index 08c6a9d..ef5f0c6 100644
--- a/src/nautilus-history-sidebar.c
+++ b/src/nautilus-history-sidebar.c
@@ -160,7 +160,7 @@ open_selected_item (NautilusHistorySidebar *sidebar,
 	nautilus_window_slot_info_open_location
 		(slot,
 		 location, NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE, 
-		 flags, NULL);
+		 flags, NULL, NULL, NULL);
 	g_object_unref (location);
 }
 
diff --git a/src/nautilus-location-bar.c b/src/nautilus-location-bar.c
index 52a618d..bd6e220 100644
--- a/src/nautilus-location-bar.c
+++ b/src/nautilus-location-bar.c
@@ -183,7 +183,7 @@ drag_data_received_callback (GtkWidget *widget,
 		for (i = 1; names[i] != NULL; ++i) {
 			new_window = nautilus_application_create_navigation_window (application, NULL, screen);
 			location = g_file_new_for_uri (names[i]);
-			nautilus_window_go_to (new_window, location);
+			nautilus_window_go_to (new_window, location, NULL, NULL);
 			g_object_unref (location);
 		}
 	}
diff --git a/src/nautilus-location-dialog.c b/src/nautilus-location-dialog.c
index 2a1f502..06a2729 100644
--- a/src/nautilus-location-dialog.c
+++ b/src/nautilus-location-dialog.c
@@ -70,6 +70,21 @@ nautilus_location_dialog_destroy (GtkObject *object)
 }
 
 static void
+open_cb (NautilusWindow *window, gboolean success, gpointer data)
+{
+	NautilusLocationDialog *dialog;
+
+	dialog = NAUTILUS_LOCATION_DIALOG (data);
+	if (success) {
+		/* everything is fine, kill the window */
+		gtk_widget_destroy (GTK_WIDGET (dialog));
+	} else {
+		/* display the window again */
+		gtk_widget_show (GTK_WIDGET (dialog));
+	}
+}
+
+static void
 open_current_location (NautilusLocationDialog *dialog)
 {
 	GFile *location;
@@ -77,7 +92,7 @@ open_current_location (NautilusLocationDialog *dialog)
 	
 	user_location = gtk_editable_get_chars (GTK_EDITABLE (dialog->details->entry), 0, -1);
 	location = g_file_parse_name (user_location);
-	nautilus_window_go_to (dialog->details->window, location);
+	nautilus_window_go_to (dialog->details->window, location, open_cb, dialog);
 	g_object_unref (location);
 	g_free (user_location);
 }
@@ -92,7 +107,7 @@ response_callback (NautilusLocationDialog *dialog,
 	switch (response_id) {
 	case RESPONSE_OPEN :
 		open_current_location (dialog);
-		gtk_widget_destroy (GTK_WIDGET (dialog));
+		gtk_widget_hide (GTK_WIDGET (dialog));
 		break;
 	case GTK_RESPONSE_NONE :
 	case GTK_RESPONSE_DELETE_EVENT :
diff --git a/src/nautilus-navigation-window-menus.c b/src/nautilus-navigation-window-menus.c
index ec48324..bb02c50 100644
--- a/src/nautilus-navigation-window-menus.c
+++ b/src/nautilus-navigation-window-menus.c
@@ -713,7 +713,7 @@ action_show_hide_search_callback (GtkAction *action,
 			location = g_file_new_for_path (g_get_home_dir ());
 		}
 
-		nautilus_window_go_to (NAUTILUS_WINDOW (window), location);
+		nautilus_window_go_to (NAUTILUS_WINDOW (window), location, NULL, NULL);
 		g_object_unref (location);
 
 		nautilus_navigation_window_hide_search (window);
diff --git a/src/nautilus-navigation-window-pane.c b/src/nautilus-navigation-window-pane.c
index 65359cf..b51f63e 100644
--- a/src/nautilus-navigation-window-pane.c
+++ b/src/nautilus-navigation-window-pane.c
@@ -267,7 +267,7 @@ path_bar_button_released_callback (GtkWidget *widget,
 			slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW_PANE (pane)->window);
 			nautilus_window_slot_info_open_location (slot, location,
 								 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
-								 flags, NULL);
+								 flags, NULL, NULL, NULL);
 			g_object_unref (location);
 			return TRUE;
 		}
diff --git a/src/nautilus-places-sidebar.c b/src/nautilus-places-sidebar.c
index 95c06eb..86e962f 100644
--- a/src/nautilus-places-sidebar.c
+++ b/src/nautilus-places-sidebar.c
@@ -1488,7 +1488,8 @@ volume_mounted_cb (GVolume *volume,
 			if ((sidebar->go_to_after_mount_flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) == 0) {
 				nautilus_window_slot_info_open_location (sidebar->go_to_after_mount_slot, location,
 									 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
-									 sidebar->go_to_after_mount_flags, NULL);
+									 sidebar->go_to_after_mount_flags, NULL,
+									 NULL, NULL);
 			} else {
 				NautilusWindow *cur, *new;
 				
@@ -1496,7 +1497,7 @@ volume_mounted_cb (GVolume *volume,
 				new = nautilus_application_create_navigation_window (cur->application,
 										     NULL,
 										     gtk_window_get_screen (GTK_WINDOW (cur)));
-				nautilus_window_go_to (new, location);
+				nautilus_window_go_to (new, location, NULL, NULL);
 			}
 		}
 
@@ -1563,7 +1564,7 @@ open_selected_bookmark (NautilusPlacesSidebar *sidebar,
 			slot = nautilus_window_info_get_active_slot (sidebar->window);
 			nautilus_window_slot_info_open_location (slot, location,
 								 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
-								 flags, NULL);
+								 flags, NULL, NULL, NULL);
 		} else {
 			NautilusWindow *cur, *new;
 			
@@ -1571,7 +1572,7 @@ open_selected_bookmark (NautilusPlacesSidebar *sidebar,
 			new = nautilus_application_create_navigation_window (cur->application,
 									     NULL,
 									     gtk_window_get_screen (GTK_WINDOW (cur)));
-			nautilus_window_go_to (new, location);
+			nautilus_window_go_to (new, location, NULL, NULL);
 		}
 		g_object_unref (location);
 		g_free (uri);
diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c
index 169fe87..e94925f 100644
--- a/src/nautilus-spatial-window.c
+++ b/src/nautilus-spatial-window.c
@@ -917,7 +917,7 @@ action_search_callback (GtkAction *action,
 
 	uri = nautilus_search_directory_generate_new_uri ();
 	f = g_file_new_for_uri (uri);
-	nautilus_window_go_to (window, f);
+	nautilus_window_go_to (window, f, NULL, NULL);
 	g_object_unref (f);
 	g_free (uri);
 }
diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c
index ac3d6bc..f17ccca 100644
--- a/src/nautilus-window-manage-views.c
+++ b/src/nautilus-window-manage-views.c
@@ -86,7 +86,9 @@ static void begin_location_change                     (NautilusWindowSlot
 						       GList                      *new_selection,
 						       NautilusLocationChangeType  type,
 						       guint                       distance,
-						       const char                 *scroll_pos);
+						       const char                 *scroll_pos,
+						       NautilusWindowGotoCallback open_callback,
+						       gpointer 		  open_callback_userdata);
 static void free_location_change                      (NautilusWindowSlot         *slot);
 static void end_location_change                       (NautilusWindowSlot         *slot);
 static void cancel_location_change                    (NautilusWindowSlot         *slot);
@@ -478,7 +480,9 @@ nautilus_window_slot_open_location_full (NautilusWindowSlot *slot,
 					 GFile *location,
 					 NautilusWindowOpenMode mode,
 					 NautilusWindowOpenFlags flags,
-					 GList *new_selection)
+					 GList *new_selection,
+					 NautilusWindowGotoCallback callback,
+					 gpointer userdata)
 {
 	NautilusWindow *window;
         NautilusWindow *target_window;
@@ -628,7 +632,8 @@ nautilus_window_slot_open_location_full (NautilusWindowSlot *slot,
 	}
 
         begin_location_change (target_slot, location, new_selection,
-                               NAUTILUS_LOCATION_CHANGE_STANDARD, 0, NULL);
+                               NAUTILUS_LOCATION_CHANGE_STANDARD, 0, NULL,
+			       callback, userdata);
 
 	/* Additionally, load this in all slots that have no location, this means
 	   we load both panes in e.g. a newly opened dual pane window. */
@@ -637,7 +642,8 @@ nautilus_window_slot_open_location_full (NautilusWindowSlot *slot,
 		slot = pane->active_slot;
 		if (slot->location == NULL && slot->pending_location == NULL) {
 			begin_location_change (slot, location, new_selection,
-					       NAUTILUS_LOCATION_CHANGE_STANDARD, 0, NULL);
+					       NAUTILUS_LOCATION_CHANGE_STANDARD, 0, NULL,
+					       callback, userdata);
 		}
 	}
 }
@@ -656,7 +662,7 @@ nautilus_window_slot_open_location (NautilusWindowSlot *slot,
 	
 	nautilus_window_slot_open_location_full (slot, location,
 						 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
-						 flags, NULL);
+						 flags, NULL, NULL, NULL);
 }
 
 void
@@ -673,7 +679,7 @@ nautilus_window_slot_open_location_with_selection (NautilusWindowSlot *slot,
 	}
 	nautilus_window_slot_open_location_full (slot, location,
 						 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
-						 flags, selection);
+						 flags, selection, NULL, NULL);
 }
 
 
@@ -694,7 +700,7 @@ nautilus_window_slot_go_home (NautilusWindowSlot *slot, gboolean new_tab)
 	home = g_file_new_for_path (g_get_home_dir ());
 	nautilus_window_slot_open_location_full (slot, home, 
 						 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE, 
-						 flags, NULL);
+						 flags, NULL, NULL, NULL);
 	g_object_unref (home);
 }
 
@@ -796,6 +802,8 @@ nautilus_window_slot_content_view_matches_iid (NautilusWindowSlot *slot,
  * @distance: If type is back or forward, the index into the back or forward chain. If
  * type is standard or reload, this is ignored, and must be 0.
  * @scroll_pos: The file to scroll to when the location is loaded.
+ * @open_callback: function to call when open has finished, successfully or not
+ * @open_callback_userdata: user defined data to callback function
  *
  * This is the core function for changing the location of a window. Every change to the
  * location begins here.
@@ -806,7 +814,9 @@ begin_location_change (NautilusWindowSlot *slot,
 		       GList *new_selection,
                        NautilusLocationChangeType type,
                        guint distance,
-                       const char *scroll_pos)
+                       const char *scroll_pos,
+		       NautilusWindowGotoCallback open_callback,
+		       gpointer open_callback_userdata)
 {
 	NautilusWindow *window;
         NautilusDirectory *directory;
@@ -839,6 +849,8 @@ begin_location_change (NautilusWindowSlot *slot,
 	slot->pending_selection = eel_g_object_list_copy (new_selection);
 
 	slot->pending_scroll_to = g_strdup (scroll_pos);
+	slot->open_callback = open_callback;
+	slot->open_callback_userdata = open_callback_userdata;
         
         directory = nautilus_directory_get (location);
 
@@ -1126,6 +1138,14 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
 		}
 		create_content_view (slot, view_id);
 		g_free (view_id);
+		if (window->details->active_pane->active_slot->open_callback) {
+			window->details->active_pane->active_slot->open_callback (
+					window, 
+					TRUE, 
+					window->details->active_pane->active_slot->open_callback_userdata);
+		}
+		window->details->active_pane->active_slot->open_callback = NULL;
+		window->details->active_pane->active_slot->open_callback_userdata = NULL;
 	} else {
 		display_view_selection_failure (window, file,
 						location, error);
@@ -1713,6 +1733,13 @@ end_location_change (NautilusWindowSlot *slot)
 	g_free (slot->pending_scroll_to);
 	slot->pending_scroll_to = NULL;
 
+	if (slot->open_callback) {
+		/* callback has not been called - call it with success */
+		slot->open_callback (NULL, TRUE, slot->open_callback_userdata);
+	}
+	slot->open_callback = NULL;
+	slot->open_callback_userdata = NULL;
+
 	free_location_change (slot);
 }
 
@@ -1828,7 +1855,7 @@ nautilus_window_report_view_failed (NautilusWindow *window,
 	if (fallback_load_location != NULL) {
 		/* We loose the pending selection change here, but who cares... */
 		begin_location_change (slot, fallback_load_location, NULL,
-				       NAUTILUS_LOCATION_CHANGE_FALLBACK, 0, NULL);
+				       NAUTILUS_LOCATION_CHANGE_FALLBACK, 0, NULL, NULL, NULL);
 		g_object_unref (fallback_load_location);
 	}
 
@@ -1837,6 +1864,26 @@ nautilus_window_report_view_failed (NautilusWindow *window,
 	}
 }
 
+typedef struct {
+	NautilusWindowGotoCallback callback;
+	gpointer userdata;
+} ErrorCallbackParameter;
+
+static void
+error_message_response_callback (GtkDialog *dialog,
+				 int response_id,
+				 gpointer data)
+{
+	ErrorCallbackParameter *params;
+
+	params = data;
+
+	if (params->callback) {
+		params->callback (NULL, FALSE, params->userdata);
+	}
+	g_free (params);
+}
+
 static void
 display_view_selection_failure (NautilusWindow *window, NautilusFile *file,
 				GFile *location, GError *error)
@@ -1847,6 +1894,7 @@ display_view_selection_failure (NautilusWindow *window, NautilusFile *file,
 	char *detail_message;
 	char *scheme_string;
 	GtkDialog *dialog;
+	ErrorCallbackParameter *params;
 
 	/* Some sort of failure occurred. How 'bout we tell the user? */
 	full_uri_for_display = g_file_get_parse_name (location);
@@ -1933,14 +1981,26 @@ display_view_selection_failure (NautilusWindow *window, NautilusFile *file,
 		detail_message = g_strdup_printf (_("Error: %s\nPlease select another viewer and try again."), error->message);
 	}
 	
+	params = g_new (ErrorCallbackParameter, 1);
+	params->callback = window->details->active_pane->active_slot->open_callback;
+	params->userdata = window->details->active_pane->active_slot->open_callback_userdata;
+
 	dialog = eel_show_error_dialog (error_message, detail_message, NULL);
 	
 	g_free (uri_for_display);
+
+	g_signal_connect (dialog,
+			  "response",
+			  G_CALLBACK (error_message_response_callback),
+			  params);
+
+	window->details->active_pane->active_slot->open_callback = NULL;
+	window->details->active_pane->active_slot->open_callback_userdata = NULL;
+
 	g_free (error_message);
 	g_free (detail_message);
 }
 
-
 void
 nautilus_window_slot_stop_loading (NautilusWindowSlot *slot)
 {
@@ -2049,7 +2109,7 @@ nautilus_navigation_window_back_or_forward (NautilusNavigationWindow *window,
 		nautilus_window_slot_open_location_full (slot, location,
 							 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
 							 NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB,
-							 NULL);
+							 NULL, NULL, NULL);
 	} else {
         	char *scroll_pos;
 		
@@ -2059,7 +2119,9 @@ nautilus_navigation_window_back_or_forward (NautilusNavigationWindow *window,
 			 location, NULL,
 			 back ? NAUTILUS_LOCATION_CHANGE_BACK : NAUTILUS_LOCATION_CHANGE_FORWARD,
 			 distance,
-			 scroll_pos);
+			 scroll_pos,
+			 NULL,
+			 NULL);
 
 		g_free (scroll_pos);
 	}
@@ -2093,7 +2155,8 @@ nautilus_window_slot_reload (NautilusWindowSlot *slot)
 	}
 	begin_location_change
 		(slot, location, selection,
-		 NAUTILUS_LOCATION_CHANGE_RELOAD, 0, current_pos);
+		 NAUTILUS_LOCATION_CHANGE_RELOAD, 0, current_pos,
+		 NULL, NULL);
         g_free (current_pos);
 	g_object_unref (location);
 	eel_g_object_list_free (selection);
diff --git a/src/nautilus-window-slot.h b/src/nautilus-window-slot.h
index ce276d8..e89d8c8 100644
--- a/src/nautilus-window-slot.h
+++ b/src/nautilus-window-slot.h
@@ -107,6 +107,9 @@ struct NautilusWindowSlot {
 	GError *mount_error;
 	gboolean tried_mount;
 
+	NautilusWindowGotoCallback open_callback;
+	gpointer open_callback_userdata;
+
 	GCancellable *find_mount_cancellable;
 
 	gboolean visible;
@@ -136,7 +139,9 @@ void			nautilus_window_slot_open_location_full       (NautilusWindowSlot	*slot,
 								       GFile			*location,
 								       NautilusWindowOpenMode	 mode,
 								       NautilusWindowOpenFlags	 flags,
-								       GList			*new_selection);
+								       GList			*new_selection,
+								       NautilusWindowGotoCallback open_callback,
+								       gpointer 		 open_callback_userdata);
 void			nautilus_window_slot_stop_loading	      (NautilusWindowSlot	*slot);
 
 void			nautilus_window_slot_set_content_view	      (NautilusWindowSlot	*slot,
@@ -150,10 +155,15 @@ void                    nautilus_window_slot_connect_content_view     (NautilusW
 void                    nautilus_window_slot_disconnect_content_view  (NautilusWindowSlot       *slot,
 								       NautilusView             *view);
 
+#define nautilus_window_slot_go_to_full(slot,location, new_tab, callback, userdata) \
+	nautilus_window_slot_open_location_full(slot, location, NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE, \
+						(new_tab ? NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB : 0), \
+						NULL, callback, userdata)
+
 #define nautilus_window_slot_go_to(slot,location, new_tab) \
 	nautilus_window_slot_open_location_full(slot, location, NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE, \
 						(new_tab ? NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB : 0), \
-						NULL)
+						NULL, NULL, NULL)
 
 #define nautilus_window_slot_go_to_with_selection(slot,location,new_selection) \
 	nautilus_window_slot_open_location_with_selection(slot, location, new_selection, FALSE)
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index df54f48..4f7ecfe 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -234,11 +234,14 @@ nautilus_window_sync_status (NautilusWindow *window)
 }
 
 void
-nautilus_window_go_to (NautilusWindow *window, GFile *location)
+nautilus_window_go_to (NautilusWindow *window, 
+		       GFile *location, 
+		       NautilusWindowGotoCallback callback,
+		       gpointer userdata)
 {
 	g_return_if_fail (NAUTILUS_IS_WINDOW (window));
 
-	nautilus_window_slot_go_to (window->details->active_pane->active_slot, location, FALSE);
+	nautilus_window_slot_go_to_full (window->details->active_pane->active_slot, location, FALSE, callback, userdata);
 }
 
 void
@@ -291,7 +294,7 @@ nautilus_window_go_up (NautilusWindow *window, gboolean close_behind, gboolean n
 	nautilus_window_slot_open_location_full (slot, parent, 
 						 NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
 						 flags,
-						 selection);
+						 selection, NULL, NULL);
 	
 	g_object_unref (parent);
 	
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index 2c9e3c1..f172de4 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -34,6 +34,7 @@
 #include <libnautilus-private/nautilus-bookmark.h>
 #include <libnautilus-private/nautilus-window-info.h>
 #include <libnautilus-private/nautilus-search-directory.h>
+#include <libnautilus-private/nautilus-window-slot-info.h>
 #include "nautilus-application.h"
 #include "nautilus-information-panel.h"
 #include "nautilus-side-pane.h"
@@ -132,7 +133,9 @@ void             nautilus_window_disconnect_content_view (NautilusWindow    *win
 							  NautilusView      *view);
 
 void             nautilus_window_go_to                (NautilusWindow    *window,
-                                                       GFile             *location);
+                                                       GFile             *location,
+                                                       NautilusWindowGotoCallback callback,
+                                                       gpointer          cb_userdata);
 void             nautilus_window_go_to_with_selection (NautilusWindow    *window,
                                                        GFile             *location,
                                                        GList             *new_selection);
