diff --git a/backend/comics/comics-document.c b/backend/comics/comics-document.c
index ff623d6..520b84f 100644
--- a/backend/comics/comics-document.c
+++ b/backend/comics/comics-document.c
@@ -111,7 +111,7 @@ comics_document_load (EvDocument *document,
 	GFile *file;
 	GFileInfo *file_info;
 	gchar *list_files_command = NULL, *std_out, *quoted_file;
-	const char *mime_type = NULL;
+	char *mime_type = NULL;
 	gchar **cbr_files;
 	gboolean success;
 	int i, retval;
@@ -125,7 +125,7 @@ comics_document_load (EvDocument *document,
 				       G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
 				       0, NULL, NULL);
 	if (file_info != NULL) {
-		mime_type = g_file_info_get_content_type (file_info);
+		mime_type = g_strdup (g_file_info_get_content_type (file_info));
 		g_object_unref (file_info);
 	}
 	g_object_unref (file);
diff --git a/configure.ac b/configure.ac
index 45a8eae..0ea6b17 100644
--- a/configure.ac
+++ b/configure.ac
@@ -47,7 +47,7 @@ dnl Check dependencies
 
 DBUS_GLIB_REQUIRED=0.70
 GTK_REQUIRED=2.10.0
-GLIB_REQUIRED=2.15.3
+GLIB_REQUIRED=2.15.4
 KEYRING_REQUIRED=0.4.0
 
 LIBGNOMEUI_REQUIRED=2.14.0
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 8913901..85e145e 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1465,11 +1465,20 @@ ev_window_close_dialogs (EvWindow *ev_window)
 }
 
 static void
-open_file_progress_cb (goffset   cur_bytes,
-		       goffset   tot_bytes,
-		       EvWindow *ev_window)
+file_async_ready_cb (GFile *source,
+		     GAsyncResult *async_result,
+		     EvWindow *ev_window)
 {
-	/* Do nothing right now */
+	gboolean result;
+	
+	result = g_file_copy_finish (source,
+				     async_result,
+				     NULL);
+	if (result) {
+		ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
+	}
+
+	g_object_unref (source);
 }
 
 void
@@ -1516,7 +1525,6 @@ ev_window_open_uri (EvWindow       *ev_window,
 
 	source_file = g_file_new_for_uri (uri);
 	if (!g_file_is_native (source_file) && !ev_window->priv->local_uri) {
-		gboolean             result;
 		char                *tmp_name;
 		char                *base_name;
 
@@ -1532,18 +1540,12 @@ ev_window_open_uri (EvWindow       *ev_window,
 		g_free (tmp_name);
 		
 		target_file = g_file_new_for_uri (ev_window->priv->local_uri);
-		
-		/* FIXME: we should make this async. In gnome-vfs it was. */
-		result = g_file_copy (source_file, target_file,
-				      0, NULL,
-				      (GFileProgressCallback) open_file_progress_cb,
-				      ev_window,
-				      NULL);
-		if (result) {
-			ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
-		}
 
-		g_object_unref (source_file);
+		g_file_copy_async (source_file, target_file,
+				   0, G_PRIORITY_DEFAULT, NULL,
+				   NULL, NULL, /* no progress callback */
+				   (GAsyncReadyCallback) file_async_ready_cb,
+				   ev_window);
 		g_object_unref (target_file);
 		return;
 	}
@@ -1906,34 +1908,28 @@ ev_window_setup_recent (EvWindow *ev_window)
 	g_list_free (items);
 }
 
-static void
-save_copy_progress_cb (goffset cur_bytes,
-		       goffset tot_bytes)
-{
-	/* Do nothing now */
-}
+typedef struct {
+	GFile *dest;
+	EvWindow *ev_window;
+} SaveRemoteData;
 
 static void
-ev_window_save_remote (EvWindow    *ev_window,
-		       GFile       *src,
-		       GFile       *dst)
+window_save_file_copy_ready_cb (GFile *src,
+				GAsyncResult *async_result,
+				SaveRemoteData *data)
 {
-	GError *err;
 	gboolean res;
+	GError *err;
 	
-	/* FIXME: make this async as it was in gnome-vfs */
-	res = g_file_copy (src, dst,
-			   G_FILE_COPY_OVERWRITE,
-			   NULL,
-			   (GFileProgressCallback) save_copy_progress_cb,
-			   NULL,
-			   &err);
+	res = g_file_copy_finish (src,
+				  async_result,
+				  &err);
 	if (!res) {
 		GtkWidget *dialog;
 		gchar     *name;
 
-		name = g_file_get_basename (dst);
-		dialog = gtk_message_dialog_new (NULL,
+		name = g_file_get_basename (data->dest);
+		dialog = gtk_message_dialog_new (GTK_WINDOW (data->ev_window),
 						 GTK_DIALOG_DESTROY_WITH_PARENT,
 						 GTK_MESSAGE_ERROR,
 						 GTK_BUTTONS_CLOSE,
@@ -1946,13 +1942,33 @@ ev_window_save_remote (EvWindow    *ev_window,
 				  NULL);
 		gtk_widget_show (dialog);
 		ev_tmp_file_unlink (src);
-		g_object_unref (src);
+
 		g_free (name);
+		g_error_free (err);
 	} else {
 		ev_tmp_file_unlink (src);
-		g_object_unref (src);
 	}
-		
+	
+	g_slice_free (SaveRemoteData, data);
+}
+
+static void
+ev_window_save_remote (EvWindow    *ev_window,
+		       GFile       *src,
+		       GFile       *dst)
+{
+	SaveRemoteData *data;
+
+	data = g_slice_new (SaveRemoteData);
+	data->ev_window = ev_window;
+	data->dest = dst;
+
+	g_file_copy_async (src, dst,
+			   G_FILE_COPY_OVERWRITE,
+			   G_PRIORITY_DEFAULT, NULL,
+			   NULL, NULL, /* no progress callback */
+			   (GAsyncReadyCallback) window_save_file_copy_ready_cb,
+			   data);		
 }
 
 static void
