[evolution] Migrate from CamelException to GError.



commit 137b0743ddfbd3bbc01c9813615ede91ddd9b954
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Jul 4 17:40:28 2010 -0400

    Migrate from CamelException to GError.

 calendar/gui/dialogs/comp-editor.c               |    2 +-
 composer/e-composer-autosave.c                   |    2 +-
 composer/e-composer-private.c                    |    2 +-
 composer/e-msg-composer.c                        |   74 +++--
 e-util/e-signature-utils.c                       |    4 +-
 em-format/em-format-quote.c                      |   22 +-
 em-format/em-format.c                            |  125 +++++----
 mail/e-mail-local.c                              |   18 +-
 mail/e-mail-migrate.c                            |   43 ++--
 mail/e-mail-reader.c                             |   21 +-
 mail/e-mail-store.c                              |   12 +-
 mail/em-composer-utils.c                         |   14 +-
 mail/em-composer-utils.h                         |    2 +-
 mail/em-folder-tree-model.c                      |   12 +-
 mail/em-folder-tree.c                            |   70 ++---
 mail/em-folder-utils.c                           |   85 ++++--
 mail/em-format-html-display.c                    |   25 +-
 mail/em-format-html.c                            |   72 +++--
 mail/em-html-stream.c                            |   30 ++-
 mail/em-inline-filter.c                          |    4 +-
 mail/em-subscribe-editor.c                       |   25 +-
 mail/em-sync-stream.c                            |   65 +++--
 mail/em-sync-stream.h                            |    9 +-
 mail/em-utils.c                                  |   66 ++---
 mail/em-utils.h                                  |    2 +-
 mail/importers/elm-importer.c                    |    2 +-
 mail/importers/evolution-mbox-importer.c         |    4 +-
 mail/importers/mail-importer.c                   |   16 +-
 mail/importers/mail-importer.h                   |    2 +-
 mail/importers/pine-importer.c                   |    2 +-
 mail/mail-folder-cache.c                         |    2 +-
 mail/mail-mt.c                                   |   17 +-
 mail/mail-mt.h                                   |    2 +-
 mail/mail-ops.c                                  |  356 +++++++++++++---------
 mail/mail-ops.h                                  |    4 +-
 mail/mail-send-recv.c                            |   34 +--
 mail/mail-session.c                              |   84 ++++--
 mail/mail-tools.c                                |   62 +++--
 mail/mail-tools.h                                |    8 +-
 mail/mail-vfolder.c                              |   19 +-
 mail/message-list.c                              |   39 +--
 modules/calendar/e-cal-attachment-handler.c      |    2 +-
 modules/mail/e-mail-attachment-handler.c         |   21 +-
 modules/mail/e-mail-shell-view.c                 |   14 +-
 plugins/audio-inline/audio-inline.c              |    6 +-
 plugins/bogo-junk-plugin/bf-junk-filter.c        |   13 +-
 plugins/dbx-import/dbx-importer.c                |  124 +++++---
 plugins/groupwise-features/install-shared.c      |   16 +-
 plugins/groupwise-features/proxy.c               |   11 +-
 plugins/groupwise-features/share-folder-common.c |   28 +-
 plugins/image-inline/image-inline.c              |    2 +-
 plugins/imap-features/imap-headers.c             |    6 +-
 plugins/itip-formatter/itip-formatter.c          |    4 +-
 plugins/mail-to-task/mail-to-task.c              |    2 +-
 plugins/mark-all-read/mark-all-read.c            |   29 +-
 plugins/pst-import/pst-importer.c                |   22 +-
 plugins/sa-junk-plugin/em-junk-filter.c          |   11 +-
 plugins/templates/templates.c                    |    7 +-
 plugins/tnef-attachments/tnef-plugin.c           |   10 +-
 plugins/vcard-inline/vcard-inline.c              |    2 +-
 po/POTFILES.in                                   |    2 +
 widgets/misc/e-account-combo-box.c               |    5 +-
 widgets/misc/e-attachment.c                      |    8 +-
 63 files changed, 979 insertions(+), 825 deletions(-)
---
diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c
index 5440d29..dcb8dde 100644
--- a/calendar/gui/dialogs/comp-editor.c
+++ b/calendar/gui/dialogs/comp-editor.c
@@ -2972,7 +2972,7 @@ comp_editor_get_mime_attach_list (CompEditor *editor)
 		byte_array = g_byte_array_new ();
 		stream = camel_stream_mem_new_with_byte_array (byte_array);
 
-		camel_data_wrapper_decode_to_stream (wrapper, stream);
+		camel_data_wrapper_decode_to_stream (wrapper, stream, NULL);
 		buffer = g_memdup (byte_array->data, byte_array->len);
 
 		camel_mime_part_set_content_id (mime_part, NULL);
diff --git a/composer/e-composer-autosave.c b/composer/e-composer-autosave.c
index 470157c..8863cf8 100644
--- a/composer/e-composer-autosave.c
+++ b/composer/e-composer-autosave.c
@@ -417,7 +417,7 @@ autosave_snapshot_cb (GFile *file,
 	camel_stream_mem_set_byte_array (
 		CAMEL_STREAM_MEM (camel_stream), buffer);
 	camel_data_wrapper_decode_to_stream (
-		CAMEL_DATA_WRAPPER (message), camel_stream);
+		CAMEL_DATA_WRAPPER (message), camel_stream, NULL);
 	g_object_unref (message);
 	g_object_unref (camel_stream);
 
diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c
index df29267..2e6dad6 100644
--- a/composer/e-composer-private.c
+++ b/composer/e-composer-private.c
@@ -110,7 +110,7 @@ msg_composer_url_requested_cb (GtkHTML *html,
 	array = g_byte_array_new ();
 	camel_stream = camel_stream_mem_new_with_byte_array (array);
 	wrapper = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
-	camel_data_wrapper_decode_to_stream (wrapper, camel_stream);
+	camel_data_wrapper_decode_to_stream (wrapper, camel_stream, NULL);
 
 	gtk_html_write (html, stream, (gchar *) array->data, array->len);
 
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index fb147d2..998461a 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -159,7 +159,7 @@ emcu_part_to_html (CamelMimePart *part, gssize *len, EMFormat *source)
 	em_format_part((EMFormat *) emfq, (CamelStream *)mem, part);
 	g_object_unref(emfq);
 
-	camel_stream_write((CamelStream *) mem, "", 1);
+	camel_stream_write((CamelStream *) mem, "", 1, NULL);
 	g_object_unref (mem);
 
 	text = (gchar *)buf->data;
@@ -618,7 +618,6 @@ build_message (EMsgComposer *composer,
 	CamelSession *session;
 	CamelStream *stream;
 	CamelMimePart *part;
-	CamelException ex;
 	GByteArray *data;
 	EAccount *account;
 	gchar *charset;
@@ -627,6 +626,7 @@ build_message (EMsgComposer *composer,
 	gboolean smime_sign;
 	gboolean smime_encrypt;
 	gint i;
+	GError *local_error = NULL;
 
 	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
 
@@ -746,7 +746,7 @@ build_message (EMsgComposer *composer,
 
 	/* construct the content object */
 	plain = camel_data_wrapper_new ();
-	camel_data_wrapper_construct_from_stream (plain, stream);
+	camel_data_wrapper_construct_from_stream (plain, stream, NULL);
 	g_object_unref (stream);
 
 	if (plain_encoding == CAMEL_TRANSFER_ENCODING_QUOTEDPRINTABLE) {
@@ -803,7 +803,7 @@ build_message (EMsgComposer *composer,
 			g_object_unref (mf);
 		}
 
-		camel_data_wrapper_construct_from_stream (html, stream);
+		camel_data_wrapper_construct_from_stream (html, stream, NULL);
 		g_object_unref (stream);
 		camel_data_wrapper_set_mime_type (html, "text/html; charset=utf-8");
 
@@ -892,8 +892,6 @@ build_message (EMsgComposer *composer,
 		current = CAMEL_DATA_WRAPPER (multipart);
 	}
 
-	camel_exception_init (&ex);
-
 	action = GTK_TOGGLE_ACTION (ACTION (PGP_SIGN));
 	pgp_sign = gtk_toggle_action_get_active (action);
 
@@ -961,10 +959,10 @@ build_message (EMsgComposer *composer,
 			camel_cipher_sign (
 				cipher, pgp_userid, account_hash_algo_to_camel_hash (
 				account ? e_account_get_string (account, E_ACCOUNT_PGP_HASH_ALGORITHM) : NULL),
-				part, npart, &ex);
+				part, npart, &local_error);
 			g_object_unref (cipher);
 
-			if (camel_exception_is_set (&ex)) {
+			if (local_error != NULL) {
 				g_object_unref (npart);
 				goto exception;
 			}
@@ -988,13 +986,13 @@ build_message (EMsgComposer *composer,
 					account->pgp_always_trust);
 			camel_cipher_encrypt (
 				cipher, pgp_userid, recipients,
-				part, npart, &ex);
+				part, npart, &local_error);
 			g_object_unref (cipher);
 
 			if (account && account->pgp_encrypt_to_self && pgp_userid)
 				g_ptr_array_set_size (recipients, recipients->len - 1);
 
-			if (camel_exception_is_set (&ex)) {
+			if (local_error != NULL) {
 				g_object_unref (npart);
 				goto exception;
 			}
@@ -1025,8 +1023,9 @@ build_message (EMsgComposer *composer,
 		if (smime_sign && (account == NULL ||
 				account->smime_sign_key == NULL ||
 				account->smime_sign_key[0] == 0)) {
-			camel_exception_set (
-				&ex, CAMEL_EXCEPTION_SYSTEM,
+			g_set_error (
+				&local_error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 				_("Cannot sign outgoing message: "
 				  "No signing certificate set for "
 				  "this account"));
@@ -1036,8 +1035,9 @@ build_message (EMsgComposer *composer,
 		if (smime_encrypt && (account == NULL ||
 				account->smime_sign_key == NULL ||
 				account->smime_sign_key[0] == 0)) {
-			camel_exception_set (
-				&ex, CAMEL_EXCEPTION_SYSTEM,
+			g_set_error (
+				&local_error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 				_("Cannot encrypt outgoing message: "
 				  "No encryption certificate set for "
 				  "this account"));
@@ -1070,10 +1070,10 @@ build_message (EMsgComposer *composer,
 					(account != NULL) ?
 					e_account_get_string (account,
 					E_ACCOUNT_SMIME_HASH_ALGORITHM) : NULL),
-				part, npart, &ex);
+				part, npart, &local_error);
 			g_object_unref (cipher);
 
-			if (camel_exception_is_set (&ex)) {
+			if (local_error != NULL) {
 				g_object_unref (npart);
 				goto exception;
 			}
@@ -1095,10 +1095,12 @@ build_message (EMsgComposer *composer,
 				(CamelSMIMEContext *) cipher, TRUE,
 				account->smime_encrypt_key);
 
-			camel_cipher_encrypt (cipher, NULL, recipients, part, (CamelMimePart *)new, &ex);
+			camel_cipher_encrypt (
+				cipher, NULL, recipients, part,
+				(CamelMimePart *) new, &local_error);
 			g_object_unref (cipher);
 
-			if (camel_exception_is_set (&ex))
+			if (local_error != NULL)
 				goto exception;
 
 			if (account->smime_encrypt_to_self)
@@ -1141,19 +1143,20 @@ skip_content:
 
 	return new;
 
- exception:
+exception:
 
 	if (part != CAMEL_MIME_PART (new))
 		g_object_unref (part);
 
 	g_object_unref (new);
 
-	if (ex.id != CAMEL_EXCEPTION_USER_CANCEL) {
-		e_alert_run_dialog_for_args ((GtkWindow *)composer, "mail-composer:no-build-message",
-			    camel_exception_get_description (&ex), NULL);
-	}
+	if (!g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+		e_alert_run_dialog_for_args (
+			(GtkWindow *) composer,
+			"mail-composer:no-build-message",
+			local_error->message, NULL);
 
-	camel_exception_clear (&ex);
+	g_error_free (local_error);
 
 	if (recipients) {
 		for (i=0; i<recipients->len; i++)
@@ -1478,12 +1481,14 @@ autosave_load_draft (const gchar *filename)
 
 	g_return_val_if_fail (filename != NULL, NULL);
 
-	if (!(stream = camel_stream_fs_new_with_name (filename, O_RDONLY, 0)))
+	stream = camel_stream_fs_new_with_name (
+		filename, O_RDONLY, 0, NULL);
+	if (stream == NULL)
 		return NULL;
 
 	msg = camel_mime_message_new ();
 	camel_data_wrapper_construct_from_stream (
-		CAMEL_DATA_WRAPPER (msg), stream);
+		CAMEL_DATA_WRAPPER (msg), stream, NULL);
 	g_object_unref (stream);
 
 	composer = e_msg_composer_new_with_message (msg);
@@ -2602,7 +2607,6 @@ handle_multipart_encrypted (EMsgComposer *composer,
 	CamelDataWrapper *content;
 	CamelMimePart *mime_part;
 	CamelSession *session;
-	CamelException ex;
 	CamelCipherValidity *valid;
 	GtkToggleAction *action = NULL;
 	const gchar *protocol;
@@ -2620,15 +2624,15 @@ handle_multipart_encrypted (EMsgComposer *composer,
 	if (action)
 		gtk_toggle_action_set_active (action, TRUE);
 
-	camel_exception_init (&ex);
 	session = e_msg_composer_get_session (composer);
 	cipher = camel_gpg_context_new (session);
 	mime_part = camel_mime_part_new ();
-	valid = camel_cipher_decrypt (cipher, multipart, mime_part, &ex);
+	valid = camel_cipher_decrypt (cipher, multipart, mime_part, NULL);
 	g_object_unref (cipher);
-	camel_exception_clear (&ex);
+
 	if (valid == NULL)
 		return;
+
 	camel_cipher_validity_free (valid);
 
 	content_type = camel_mime_part_get_content_type (mime_part);
@@ -3687,12 +3691,13 @@ e_msg_composer_add_inline_image_from_file (EMsgComposer *composer,
 	if (!g_file_test (dec_file_name, G_FILE_TEST_IS_REGULAR))
 		return NULL;
 
-	stream = camel_stream_fs_new_with_name (dec_file_name, O_RDONLY, 0);
+	stream = camel_stream_fs_new_with_name (
+		dec_file_name, O_RDONLY, 0, NULL);
 	if (!stream)
 		return NULL;
 
 	wrapper = camel_data_wrapper_new ();
-	camel_data_wrapper_construct_from_stream (wrapper, stream);
+	camel_data_wrapper_construct_from_stream (wrapper, stream, NULL);
 	g_object_unref (CAMEL_OBJECT (stream));
 
 	mime_type = e_util_guess_mime_type (dec_file_name, TRUE);
@@ -4166,13 +4171,14 @@ e_msg_composer_load_from_file (const gchar *filename)
 
 	g_return_val_if_fail (filename != NULL, NULL);
 
-	stream = camel_stream_fs_new_with_name (filename, O_RDONLY, 0);
+	stream = camel_stream_fs_new_with_name (
+		filename, O_RDONLY, 0, NULL);
 	if (stream == NULL)
 		return NULL;
 
 	msg = camel_mime_message_new ();
 	camel_data_wrapper_construct_from_stream (
-		CAMEL_DATA_WRAPPER (msg), stream);
+		CAMEL_DATA_WRAPPER (msg), stream, NULL);
 	g_object_unref (stream);
 
 	composer = e_msg_composer_new_with_message (msg);
diff --git a/e-util/e-signature-utils.c b/e-util/e-signature-utils.c
index 6a8258c..cf55c73 100644
--- a/e-util/e-signature-utils.c
+++ b/e-util/e-signature-utils.c
@@ -196,7 +196,7 @@ e_read_signature_file (ESignature *signature,
 	output_stream = camel_stream_mem_new ();
 	camel_stream_mem_set_byte_array (
 		CAMEL_STREAM_MEM (output_stream), buffer);
-	camel_stream_write_to_stream (input_stream, output_stream);
+	camel_stream_write_to_stream (input_stream, output_stream, NULL);
 	g_object_unref (output_stream);
 	g_object_unref (input_stream);
 
@@ -290,7 +290,7 @@ e_run_signature_script (const gchar *filename)
 			CAMEL_STREAM_MEM (output_stream), buffer);
 
 		input_stream = camel_stream_fs_new_with_fd (in_fds[0]);
-		camel_stream_write_to_stream (input_stream, output_stream);
+		camel_stream_write_to_stream (input_stream, output_stream, NULL);
 		g_object_unref (input_stream);
 
 		g_object_unref (output_stream);
diff --git a/em-format/em-format-quote.c b/em-format/em-format-quote.c
index 6ba72f4..aa666b2 100644
--- a/em-format/em-format-quote.c
+++ b/em-format/em-format-quote.c
@@ -155,7 +155,7 @@ emfq_format_clone(EMFormat *emf, CamelFolder *folder, const gchar *uid, CamelMim
 	EM_FORMAT_CLASS (parent_class)->format_clone (emf, folder, uid, msg, src);
 
 	gconf = gconf_client_get_default ();
-	camel_stream_reset(emfq->stream);
+	camel_stream_reset(emfq->stream, NULL);
 	if (gconf_client_get_bool(gconf, "/apps/evolution/mail/composer/top_signature", NULL))
 		emfq_format_empty_line(emf, emfq->stream, (CamelMimePart *)msg, NULL);
 	g_object_unref (gconf);
@@ -166,7 +166,7 @@ emfq_format_clone(EMFormat *emf, CamelFolder *folder, const gchar *uid, CamelMim
 	if (handle)
 		handle->handler(emf, emfq->stream, (CamelMimePart *)msg, handle, FALSE);
 
-	camel_stream_flush(emfq->stream);
+	camel_stream_flush(emfq->stream, NULL);
 
 	g_signal_emit_by_name(emf, "complete");
 }
@@ -428,7 +428,7 @@ emfq_format_message(EMFormat *emf, CamelStream *stream, CamelMimePart *part, con
 	em_format_part (emf, stream, part);
 
 	if (emfq->flags & EM_FORMAT_QUOTE_CITE)
-		camel_stream_write_string(stream, "</blockquote><!--+GtkHTML:<DATA class=\"ClueFlow\" clear=\"orig\">-->");
+		camel_stream_write_string(stream, "</blockquote><!--+GtkHTML:<DATA class=\"ClueFlow\" clear=\"orig\">-->", NULL);
 }
 
 static void
@@ -456,16 +456,16 @@ emfq_format_attachment(EMFormat *emf, CamelStream *stream, CamelMimePart *part,
 		gchar *text, *html;
 
 		camel_stream_write_string(stream,
-					  "<table border=1 cellspacing=0 cellpadding=0><tr><td><font size=-1>\n");
+					  "<table border=1 cellspacing=0 cellpadding=0><tr><td><font size=-1>\n", NULL);
 
 		/* output some info about it */
 		text = em_format_describe_part(part, mime_type);
 		html = camel_text_to_html(text, ((EMFormatQuote *)emf)->text_html_flags & CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS, 0);
-		camel_stream_write_string(stream, html);
+		camel_stream_write_string(stream, html, NULL);
 		g_free(html);
 		g_free(text);
 
-		camel_stream_write_string(stream, "</font></td></tr></table>");
+		camel_stream_write_string(stream, "</font></td></tr></table>", NULL);
 
 		handle->handler(emf, stream, part, handle, FALSE);
 	}
@@ -508,7 +508,7 @@ emfq_text_plain(EMFormatQuote *emfq, CamelStream *stream, CamelMimePart *part, E
 	g_object_unref (html_filter);
 
 	em_format_format_text((EMFormat *)emfq, (CamelStream *)filtered_stream, (CamelDataWrapper *)part);
-	camel_stream_flush((CamelStream *)filtered_stream);
+	camel_stream_flush((CamelStream *)filtered_stream, NULL);
 	g_object_unref (filtered_stream);
 }
 
@@ -521,9 +521,9 @@ emfq_text_enriched(EMFormatQuote *emfq, CamelStream *stream, CamelMimePart *part
 
 	if (!strcmp(info->mime_type, "text/richtext")) {
 		flags = CAMEL_MIME_FILTER_ENRICHED_IS_RICHTEXT;
-		camel_stream_write_string(stream, "\n<!-- text/richtext -->\n");
+		camel_stream_write_string(stream, "\n<!-- text/richtext -->\n", NULL);
 	} else {
-		camel_stream_write_string(stream, "\n<!-- text/enriched -->\n");
+		camel_stream_write_string(stream, "\n<!-- text/enriched -->\n", NULL);
 	}
 
 	enriched = camel_mime_filter_enriched_new(flags);
@@ -532,7 +532,7 @@ emfq_text_enriched(EMFormatQuote *emfq, CamelStream *stream, CamelMimePart *part
 		CAMEL_STREAM_FILTER (filtered_stream), enriched);
 	g_object_unref (enriched);
 
-	camel_stream_write_string(stream, "<br><hr><br>");
+	camel_stream_write_string(stream, "<br><hr><br>", NULL);
 	em_format_format_text((EMFormat *)emfq, (CamelStream *)filtered_stream, (CamelDataWrapper *)part);
 	g_object_unref (filtered_stream);
 }
@@ -540,7 +540,7 @@ emfq_text_enriched(EMFormatQuote *emfq, CamelStream *stream, CamelMimePart *part
 static void
 emfq_text_html(EMFormat *emf, CamelStream *stream, CamelMimePart *part, EMFormatHandler *info)
 {
-	camel_stream_write_string(stream, "\n<!-- text/html -->\n");
+	camel_stream_write_string(stream, "\n<!-- text/html -->\n", NULL);
 	em_format_format_text(emf, stream, (CamelDataWrapper *)part);
 }
 
diff --git a/em-format/em-format.c b/em-format/em-format.c
index 9c8e181..64918df 100644
--- a/em-format/em-format.c
+++ b/em-format/em-format.c
@@ -1189,7 +1189,7 @@ em_format_format_content(EMFormat *emf, CamelStream *stream, CamelMimePart *part
 	if (camel_content_type_is (dw->mime_type, "text", "*"))
 		em_format_format_text(emf, stream, (CamelDataWrapper *)part);
 	else
-		camel_data_wrapper_decode_to_stream(dw, stream);
+		camel_data_wrapper_decode_to_stream(dw, stream, NULL);
 }
 
 /**
@@ -1233,8 +1233,9 @@ em_format_format_text(EMFormat *emf, CamelStream *stream, CamelDataWrapper *dw)
 			CAMEL_STREAM_FILTER (filter_stream),
 			CAMEL_MIME_FILTER (windows));
 
-		camel_data_wrapper_decode_to_stream(dw, (CamelStream *)filter_stream);
-		camel_stream_flush((CamelStream *)filter_stream);
+		camel_data_wrapper_decode_to_stream (
+			dw, (CamelStream *)filter_stream, NULL);
+		camel_stream_flush((CamelStream *)filter_stream, NULL);
 		g_object_unref (filter_stream);
 
 		charset = camel_mime_filter_windows_real_charset (windows);
@@ -1262,14 +1263,18 @@ em_format_format_text(EMFormat *emf, CamelStream *stream, CamelDataWrapper *dw)
 	}
 	g_object_unref (gconf);
 
-	size = camel_data_wrapper_decode_to_stream(emf->mode == EM_FORMAT_SOURCE ? (CamelDataWrapper *)dw: camel_medium_get_content ((CamelMedium *)dw), (CamelStream *)filter_stream);
-	camel_stream_flush((CamelStream *)filter_stream);
+	size = camel_data_wrapper_decode_to_stream (
+		emf->mode == EM_FORMAT_SOURCE ?
+			(CamelDataWrapper *) dw :
+			camel_medium_get_content ((CamelMedium *)dw),
+		(CamelStream *)filter_stream, NULL);
+	camel_stream_flush((CamelStream *)filter_stream, NULL);
 	g_object_unref (filter_stream);
-	camel_stream_reset (mem_stream);
+	camel_stream_reset (mem_stream, NULL);
 
 	if (max == -1 || size == -1 || size < (max * 1024) || emf->composer) {
-		camel_stream_write_to_stream(mem_stream, (CamelStream *)stream);
-		camel_stream_flush((CamelStream *)stream);
+		camel_stream_write_to_stream(mem_stream, (CamelStream *)stream, NULL);
+		camel_stream_flush((CamelStream *)stream, NULL);
 	} else {
 		((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->format_optional(emf, stream, (CamelMimePart *)dw, mem_stream);
 	}
@@ -1337,10 +1342,10 @@ emf_application_xpkcs7mime (EMFormat *emf,
                             gboolean is_fallback)
 {
 	CamelCipherContext *context;
-	CamelException *ex;
 	CamelMimePart *opart;
 	CamelCipherValidity *valid;
 	struct _EMFormatCache *emfc;
+	GError *local_error = NULL;
 
 	/* should this perhaps run off a key of ".secured" ? */
 	emfc = g_hash_table_lookup(emf->inline_table, emf->part_id->str);
@@ -1349,16 +1354,17 @@ emf_application_xpkcs7mime (EMFormat *emf,
 		return;
 	}
 
-	ex = camel_exception_new();
-
 	context = camel_smime_context_new(emf->session);
 
 	emf->validity_found |= EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_SMIME;
 
 	opart = camel_mime_part_new();
-	valid = camel_cipher_decrypt(context, part, opart, ex);
+	valid = camel_cipher_decrypt(context, part, opart, &local_error);
 	if (valid == NULL) {
-		em_format_format_error(emf, stream, "%s", ex->desc?ex->desc:_("Could not parse S/MIME message: Unknown error"));
+		em_format_format_error (
+			emf, stream, "%s",
+			local_error->message ? local_error->message :
+			_("Could not parse S/MIME message: Unknown error"));
 		em_format_part_as(emf, stream, part, NULL);
 	} else {
 		if (emfc == NULL)
@@ -1373,7 +1379,6 @@ emf_application_xpkcs7mime (EMFormat *emf,
 
 	g_object_unref (opart);
 	g_object_unref (context);
-	camel_exception_free(ex);
 }
 #endif
 
@@ -1496,12 +1501,12 @@ emf_multipart_encrypted (EMFormat *emf,
                          gboolean is_fallback)
 {
 	CamelCipherContext *context;
-	CamelException *ex;
 	const gchar *protocol;
 	CamelMimePart *opart;
 	CamelCipherValidity *valid;
 	CamelMultipartEncrypted *mpe;
 	struct _EMFormatCache *emfc;
+	GError *local_error = NULL;
 
 	/* should this perhaps run off a key of ".secured" ? */
 	emfc = g_hash_table_lookup(emf->inline_table, emf->part_id->str);
@@ -1527,14 +1532,17 @@ emf_multipart_encrypted (EMFormat *emf,
 
 	emf->validity_found |= EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_PGP;
 
-	ex = camel_exception_new();
 	context = camel_gpg_context_new(emf->session);
 	opart = camel_mime_part_new();
-	valid = camel_cipher_decrypt(context, part, opart, ex);
+	valid = camel_cipher_decrypt(context, part, opart, &local_error);
 	if (valid == NULL) {
-		em_format_format_error(emf, stream, ex->desc?_("Could not parse PGP/MIME message"):_("Could not parse PGP/MIME message: Unknown error"));
-		if (ex->desc)
-			em_format_format_error(emf, stream, "%s", ex->desc);
+		em_format_format_error (
+			emf, stream, local_error->message ?
+			_("Could not parse PGP/MIME message") :
+			_("Could not parse PGP/MIME message: Unknown error"));
+		if (local_error->message != NULL)
+			em_format_format_error (
+				emf, stream, "%s", local_error->message);
 		em_format_part_as(emf, stream, part, "multipart/mixed");
 	} else {
 		if (emfc == NULL)
@@ -1550,14 +1558,13 @@ emf_multipart_encrypted (EMFormat *emf,
 	/* TODO: Make sure when we finalize this part, it is zero'd out */
 	g_object_unref (opart);
 	g_object_unref (context);
-	camel_exception_free(ex);
 }
 
 static void
 emf_write_related(EMFormat *emf, CamelStream *stream, EMFormatPURI *puri)
 {
 	em_format_format_content(emf, stream, puri->part);
-	camel_stream_close(stream);
+	camel_stream_close(stream, NULL);
 }
 
 /* RFC 2387 */
@@ -1634,7 +1641,7 @@ emf_multipart_related (EMFormat *emf,
 	g_string_append_printf(emf->part_id, ".related.%d", displayid);
 	em_format_part(emf, stream, display_part);
 	g_string_truncate(emf->part_id, partidlen);
-	camel_stream_flush(stream);
+	camel_stream_flush(stream, NULL);
 
 	link = g_queue_peek_head_link (emf->pending_uri_level->data);
 
@@ -1709,14 +1716,18 @@ emf_multipart_signed (EMFormat *emf,
 		em_format_format_error(emf, stream, _("Unsupported signature format"));
 		em_format_part_as(emf, stream, part, "multipart/mixed");
 	} else {
-		CamelException *ex = camel_exception_new();
 		CamelCipherValidity *valid;
+		GError *local_error = NULL;
 
-		valid = camel_cipher_verify(cipher, part, ex);
+		valid = camel_cipher_verify(cipher, part, &local_error);
 		if (valid == NULL) {
-			em_format_format_error(emf, stream, ex->desc?_("Error verifying signature"):_("Unknown error verifying signature"));
-			if (ex->desc)
-				em_format_format_error(emf, stream, "%s", ex->desc);
+			em_format_format_error (
+				emf, stream, local_error->message ?
+				_("Error verifying signature") :
+				_("Unknown error verifying signature"));
+			if (local_error->message != NULL)
+				em_format_format_error (
+					emf, stream, "%s", local_error->message);
 			em_format_part_as(emf, stream, part, "multipart/mixed");
 		} else {
 			if (emfc == NULL)
@@ -1729,7 +1740,7 @@ emf_multipart_signed (EMFormat *emf,
 			em_format_format_secure(emf, stream, cpart, valid);
 		}
 
-		camel_exception_free(ex);
+		g_error_free (local_error);
 		g_object_unref (cipher);
 	}
 }
@@ -1769,10 +1780,11 @@ emf_application_mbox (EMFormat *emf,
 
 	mem_stream = camel_stream_mem_new ();
 	camel_data_wrapper_decode_to_stream (
-		camel_medium_get_content (CAMEL_MEDIUM (mime_part)), mem_stream);
+		camel_medium_get_content (CAMEL_MEDIUM (mime_part)),
+		mem_stream, NULL);
 	camel_seekable_stream_seek (
-		CAMEL_SEEKABLE_STREAM (mem_stream), 0, CAMEL_STREAM_SET);
-	camel_mime_parser_init_with_stream (parser, mem_stream);
+		CAMEL_SEEKABLE_STREAM (mem_stream), 0, CAMEL_STREAM_SET, NULL);
+	camel_mime_parser_init_with_stream (parser, mem_stream, NULL);
 	g_object_unref (mem_stream);
 
 	/* Extract messages from the mbox. */
@@ -1783,7 +1795,7 @@ emf_application_mbox (EMFormat *emf,
 		message = camel_mime_message_new ();
 		mime_part = CAMEL_MIME_PART (message);
 
-		if (camel_mime_part_construct_from_parser (mime_part, parser) == -1) {
+		if (camel_mime_part_construct_from_parser (mime_part, parser, NULL) == -1) {
 			g_object_unref (message);
 			break;
 		}
@@ -1849,8 +1861,8 @@ emf_inlinepgp_signed(EMFormat *emf, CamelStream *stream, CamelMimePart *ipart, E
 	CamelDataWrapper *dw;
 	CamelMimePart *opart;
 	CamelStream *ostream;
-	CamelException *ex;
 	gchar *type;
+	GError *local_error = NULL;
 
 	if (!ipart) {
 		em_format_format_error(emf, stream, _("Unknown error verifying signature"));
@@ -1859,17 +1871,20 @@ emf_inlinepgp_signed(EMFormat *emf, CamelStream *stream, CamelMimePart *ipart, E
 
 	emf->validity_found |= EM_FORMAT_VALIDITY_FOUND_SIGNED | EM_FORMAT_VALIDITY_FOUND_PGP;
 
-	ex = camel_exception_new();
 	cipher = camel_gpg_context_new(emf->session);
 	/* Verify the signature of the message */
-	valid = camel_cipher_verify(cipher, ipart, ex);
+	valid = camel_cipher_verify(cipher, ipart, &local_error);
 	if (!valid) {
-		em_format_format_error(emf, stream, ex->desc?_("Error verifying signature"):_("Unknown error verifying signature"));
-		if (ex->desc)
-			em_format_format_error(emf, stream, "%s", ex->desc);
+		em_format_format_error (
+			emf, stream, local_error->message ?
+			_("Error verifying signature") :
+			_("Unknown error verifying signature"));
+		if (local_error->message)
+			em_format_format_error (
+				emf, stream, "%s", local_error->message);
 		em_format_format_source(emf, stream, ipart);
 		/* I think this will loop: em_format_part_as(emf, stream, part, "text/plain"); */
-		camel_exception_free(ex);
+		g_error_free (local_error);
 		g_object_unref (cipher);
 		return;
 	}
@@ -1887,8 +1902,9 @@ emf_inlinepgp_signed(EMFormat *emf, CamelStream *stream, CamelMimePart *ipart, E
 
 	/* Pass through the filters that have been setup */
 	dw = camel_medium_get_content ((CamelMedium *)ipart);
-	camel_data_wrapper_decode_to_stream(dw, (CamelStream *)filtered_stream);
-	camel_stream_flush((CamelStream *)filtered_stream);
+	camel_data_wrapper_decode_to_stream (
+		dw, (CamelStream *)filtered_stream, NULL);
+	camel_stream_flush((CamelStream *)filtered_stream, NULL);
 	g_object_unref (filtered_stream);
 
 	/* Create a new text/plain MIME part containing the signed content preserving the original part's Content-Type params */
@@ -1905,7 +1921,7 @@ emf_inlinepgp_signed(EMFormat *emf, CamelStream *stream, CamelMimePart *ipart, E
 	camel_content_type_unref (content_type);
 
 	dw = camel_data_wrapper_new ();
-	camel_data_wrapper_construct_from_stream (dw, ostream);
+	camel_data_wrapper_construct_from_stream (dw, ostream, NULL);
 	camel_data_wrapper_set_mime_type (dw, type);
 	g_free (type);
 
@@ -1922,7 +1938,6 @@ emf_inlinepgp_signed(EMFormat *emf, CamelStream *stream, CamelMimePart *ipart, E
 	g_object_unref (opart);
 	g_object_unref (ostream);
 	g_object_unref (cipher);
-	camel_exception_free(ex);
 }
 
 static void
@@ -1930,25 +1945,30 @@ emf_inlinepgp_encrypted(EMFormat *emf, CamelStream *stream, CamelMimePart *ipart
 {
 	CamelCipherContext *cipher;
 	CamelCipherValidity *valid;
-	CamelException *ex;
 	CamelMimePart *opart;
 	CamelDataWrapper *dw;
 	gchar *mime_type;
+	GError *local_error = NULL;
 
 	emf->validity_found |= EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_PGP;
 
 	cipher = camel_gpg_context_new(emf->session);
-	ex = camel_exception_new();
 	opart = camel_mime_part_new();
 	/* Decrypt the message */
-	valid = camel_cipher_decrypt (cipher, ipart, opart, ex);
+	valid = camel_cipher_decrypt (cipher, ipart, opart, &local_error);
 	if (!valid) {
-		em_format_format_error(emf, stream, ex->desc?_("Could not parse PGP message"):_("Could not parse PGP message: Unknown error"));
-		if (ex->desc)
-			em_format_format_error(emf, stream, "%s", ex->desc);
+		em_format_format_error (
+			emf, stream, _("Could not parse PGP message: "));
+		if (local_error->message != NULL)
+			em_format_format_error (
+				emf, stream, "%s", local_error->message);
+		else
+			em_format_format_error (
+				emf, stream, _("Unknown error"));
 		em_format_format_source(emf, stream, ipart);
 		/* I think this will loop: em_format_part_as(emf, stream, part, "text/plain"); */
-		camel_exception_free(ex);
+
+		g_error_free (local_error);
 		g_object_unref (cipher);
 		g_object_unref (opart);
 		return;
@@ -1974,7 +1994,6 @@ emf_inlinepgp_encrypted(EMFormat *emf, CamelStream *stream, CamelMimePart *ipart
 	/* Clean Up */
 	g_object_unref (opart);
 	g_object_unref (cipher);
-	camel_exception_free (ex);
 }
 
 static EMFormatHandler type_builtin_table[] = {
@@ -2043,7 +2062,7 @@ em_format_snoop_type (CamelMimePart *part)
 		byte_array = g_byte_array_new ();
 		stream = camel_stream_mem_new_with_byte_array (byte_array);
 
-		if (camel_data_wrapper_decode_to_stream (dw, stream) > 0) {
+		if (camel_data_wrapper_decode_to_stream (dw, stream, NULL) > 0) {
 			gchar *content_type;
 
 			content_type = g_content_type_guess (
diff --git a/mail/e-mail-local.c b/mail/e-mail-local.c
index 002865c..7b825c4 100644
--- a/mail/e-mail-local.c
+++ b/mail/e-mail-local.c
@@ -48,17 +48,15 @@ void
 e_mail_local_init (const gchar *data_dir)
 {
 	static gboolean initialized = FALSE;
-	CamelException ex;
 	CamelService *service;
 	CamelURL *url;
 	gchar *temp;
 	gint ii;
+	GError *local_error = NULL;
 
 	g_return_if_fail (!initialized);
 	g_return_if_fail (data_dir != NULL);
 
-	camel_exception_init (&ex);
-
 	url = camel_url_new ("mbox:", NULL);
 	temp = g_build_filename (data_dir, "local", NULL);
 	camel_url_set_path (url, temp);
@@ -66,10 +64,10 @@ e_mail_local_init (const gchar *data_dir)
 
 	temp = camel_url_to_string (url, 0);
 	service = camel_session_get_service (
-		session, temp, CAMEL_PROVIDER_STORE, &ex);
+		session, temp, CAMEL_PROVIDER_STORE, &local_error);
 	g_free (temp);
 
-	if (camel_exception_is_set (&ex))
+	if (local_error != NULL)
 		goto fail;
 
 	/* Populate the rest of the default_local_folders array. */
@@ -86,9 +84,7 @@ e_mail_local_init (const gchar *data_dir)
 		default_local_folders[ii].folder_uri = folder_uri;
 		default_local_folders[ii].folder = camel_store_get_folder (
 			CAMEL_STORE (service), display_name,
-			CAMEL_STORE_FOLDER_CREATE, &ex);
-
-		camel_exception_clear (&ex);
+			CAMEL_STORE_FOLDER_CREATE, NULL);
 	}
 
 	camel_url_free (url);
@@ -99,9 +95,11 @@ e_mail_local_init (const gchar *data_dir)
 	return;
 
 fail:
-	g_warning ("Could not initialize local store/folder: %s", ex.desc);
+	g_warning (
+		"Could not initialize local store/folder: %s",
+		local_error->message);
 
-	camel_exception_clear (&ex);
+	g_error_free (local_error);
 	camel_url_free (url);
 }
 
diff --git a/mail/e-mail-migrate.c b/mail/e-mail-migrate.c
index 7f59d16..202bbaa 100644
--- a/mail/e-mail-migrate.c
+++ b/mail/e-mail-migrate.c
@@ -533,7 +533,13 @@ update_states_in_main_thread (const struct _migrate_state_info * info)
 }
 
 static void
-migrate_folders(CamelStore *store, gboolean is_local, CamelFolderInfo *fi, const gchar *acc, CamelException *ex, gboolean *done, gint *nth_folder, gint total_folders)
+migrate_folders (CamelStore *store,
+                 gboolean is_local,
+                 CamelFolderInfo *fi,
+                 const gchar *acc,
+                 gboolean *done,
+                 gint *nth_folder,
+                 gint total_folders)
 {
 	CamelFolder *folder;
 
@@ -550,13 +556,13 @@ migrate_folders(CamelStore *store, gboolean is_local, CamelFolderInfo *fi, const
 		g_idle_add ((GSourceFunc) update_states_in_main_thread, info);
 
 		if (is_local)
-				folder = camel_store_get_folder (store, fi->full_name, CAMEL_STORE_IS_MIGRATING, ex);
+				folder = camel_store_get_folder (store, fi->full_name, CAMEL_STORE_IS_MIGRATING, NULL);
 		else
-				folder = camel_store_get_folder (store, fi->full_name, 0, ex);
+				folder = camel_store_get_folder (store, fi->full_name, 0, NULL);
 
 		if (folder != NULL)
 			camel_folder_summary_migrate_infos (folder->summary);
-		migrate_folders(store, is_local, fi->child, acc, ex, done, nth_folder, total_folders);
+		migrate_folders(store, is_local, fi->child, acc, done, nth_folder, total_folders);
 		fi = fi->next;
 	}
 
@@ -601,12 +607,11 @@ setup_local_store (EShellBackend *shell_backend,
 #ifndef G_OS_WIN32
 
 struct migrate_folders_to_db_structure {
-		gchar *account_name;
-		CamelException ex;
-		CamelStore *store;
-		CamelFolderInfo *info;
-		gboolean done;
-		gboolean is_local_store;
+	gchar *account_name;
+	CamelStore *store;
+	CamelFolderInfo *info;
+	gboolean done;
+	gboolean is_local_store;
 };
 
 static void
@@ -614,9 +619,10 @@ migrate_folders_to_db_thread (struct migrate_folders_to_db_structure *migrate_db
 {
 		gint num_of_folders = 0, nth_folder = 0;
 		count_folders (migrate_dbs->info, &num_of_folders);
-		migrate_folders (migrate_dbs->store, migrate_dbs->is_local_store, migrate_dbs->info,
-						migrate_dbs->account_name, &(migrate_dbs->ex), &(migrate_dbs->done),
-						&nth_folder, num_of_folders);
+		migrate_folders (
+			migrate_dbs->store, migrate_dbs->is_local_store,
+			migrate_dbs->info, migrate_dbs->account_name,
+			&(migrate_dbs->done), &nth_folder, num_of_folders);
 }
 
 static void
@@ -655,7 +661,6 @@ migrate_to_db (EShellBackend *shell_backend)
 			migrate_dbs.is_local_store = TRUE;
 		else
 			migrate_dbs.is_local_store = FALSE;
-		camel_exception_init (&migrate_dbs.ex);
 		migrate_dbs.account_name = _("On This Computer");
 		migrate_dbs.info = info;
 		migrate_dbs.store = store;
@@ -681,17 +686,13 @@ migrate_to_db (EShellBackend *shell_backend)
 		    && service->url[0]
 		    && strncmp(service->url, "mbox:", 5) != 0) {
 
-			CamelException ex;
-
-			camel_exception_init (&ex);
 			e_mail_store_add_by_uri (service->url, name);
 
-			store = (CamelStore *) camel_session_get_service (CAMEL_SESSION (session), service->url, CAMEL_PROVIDER_STORE, &ex);
-			info = camel_store_get_folder_info (store, NULL, CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST|CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, &ex);
+			store = (CamelStore *) camel_session_get_service (CAMEL_SESSION (session), service->url, CAMEL_PROVIDER_STORE, NULL);
+			info = camel_store_get_folder_info (store, NULL, CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST|CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, NULL);
 			if (info) {
 				struct migrate_folders_to_db_structure migrate_dbs;
 
-				migrate_dbs.ex = ex;
 				migrate_dbs.account_name = account->name;
 				migrate_dbs.info = info;
 				migrate_dbs.store = store;
@@ -702,8 +703,6 @@ migrate_to_db (EShellBackend *shell_backend)
 					g_main_context_iteration (NULL, TRUE);
 			} else
 				printf("%s:%s: failed to get folder infos \n", G_STRLOC, G_STRFUNC);
-			camel_exception_clear(&ex);
-
 		}
 		i++;
 		e_iterator_next (iter);
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index abfbf3b..795dfcd 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -1789,7 +1789,7 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
                                const gchar *message_uid,
                                CamelMimeMessage *message,
                                gpointer user_data,
-                               CamelException *ex)
+                               GError **error)
 {
 	EMailReader *reader = user_data;
 	EMailReaderPrivate *priv;
@@ -1874,24 +1874,19 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 			timeout_interval, (GSourceFunc)
 			mail_reader_message_read_cb, reader);
 
-	} else if (camel_exception_is_set (ex)) {
+	} else if (error != NULL && *error != NULL) {
 		gchar *string;
 
-		if (ex->id != CAMEL_EXCEPTION_OPERATION_IN_PROGRESS) {
-			/* Display the error inline and clear the exception. */
-			string = g_strdup_printf (
-					"<h2>%s</h2><p>%s</p>",
-					_("Unable to retrieve message"),
-					ex->desc);
-		} else {
-			string = g_strdup_printf (
-				_("Retrieving message '%s'"), cursor_uid);
-		}
+		/* Display the error inline and clear the exception. */
+		string = g_strdup_printf (
+			"<h2>%s</h2><p>%s</p>",
+			_("Unable to retrieve message"),
+			(*error)->message);
 
 		e_web_view_load_string (web_view, string);
 		g_free (string);
 
-		camel_exception_clear (ex);
+		g_clear_error (error);
 	}
 
 	/* We referenced this in the call to mail_get_messagex(). */
diff --git a/mail/e-mail-store.c b/mail/e-mail-store.c
index 3418404..6fd0c7e 100644
--- a/mail/e-mail-store.c
+++ b/mail/e-mail-store.c
@@ -303,17 +303,15 @@ e_mail_store_add_by_uri (const gchar *uri,
 {
 	CamelService *service;
 	CamelProvider *provider;
-	CamelException ex;
+	GError *local_error = NULL;
 
 	g_return_val_if_fail (uri != NULL, NULL);
 	g_return_val_if_fail (display_name != NULL, NULL);
 
-	camel_exception_init (&ex);
-
 	/* Load the service, but don't connect.  Check its provider,
 	 * and if this belongs in the folder tree model, add it. */
 
-	provider = camel_provider_get (uri, &ex);
+	provider = camel_provider_get (uri, &local_error);
 	if (provider == NULL)
 		goto fail;
 
@@ -321,7 +319,7 @@ e_mail_store_add_by_uri (const gchar *uri,
 		return NULL;
 
 	service = camel_session_get_service (
-		session, uri, CAMEL_PROVIDER_STORE, &ex);
+		session, uri, CAMEL_PROVIDER_STORE, &local_error);
 	if (service == NULL)
 		goto fail;
 
@@ -335,8 +333,8 @@ fail:
 	/* FIXME: Show an error dialog. */
 	g_warning (
 		"Couldn't get service: %s: %s", uri,
-		camel_exception_get_description (&ex));
-	camel_exception_clear (&ex);
+		local_error->message);
+	g_error_free (local_error);
 
 	return NULL;
 }
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index 4a41217..9cc0001 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -913,15 +913,15 @@ traverse_parts (GSList *clues, CamelMimeMessage *message, CamelDataWrapper *cont
 
 		byte_array = g_byte_array_new ();
 		stream = camel_stream_mem_new_with_byte_array (byte_array);
-		camel_data_wrapper_decode_to_stream (content, stream);
+		camel_data_wrapper_decode_to_stream (content, stream, NULL);
 
 		str = g_strndup ((gchar *) byte_array->data, byte_array->len);
 		g_object_unref (stream);
 
 		if (replace_variables (clues, message, &str)) {
 			stream = camel_stream_mem_new_with_buffer (str, strlen (str));
-			camel_stream_reset (stream);
-			camel_data_wrapper_construct_from_stream (content, stream);
+			camel_stream_reset (stream, NULL);
+			camel_data_wrapper_construct_from_stream (content, stream, NULL);
 			g_object_unref (stream);
 		}
 
@@ -1417,13 +1417,13 @@ em_utils_redirect_message_by_uid (CamelFolder *folder, const gchar *uid)
 }
 
 static void
-emu_handle_receipt_message(CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, CamelException *ex)
+emu_handle_receipt_message(CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, GError **error)
 {
 	if (msg)
 		em_utils_handle_receipt(folder, uid, msg);
 
 	/* we dont care really if we can't get the message */
-	camel_exception_clear(ex);
+	g_clear_error (error);
 }
 
 /* Message disposition notifications, rfc 2298 */
@@ -1541,7 +1541,7 @@ em_utils_send_receipt (CamelFolder *folder, CamelMimeMessage *message)
 	/* Translators: First %s is an email address, second %s is the subject of the email, third %s is the date */
 			     _("Your message to %s about \"%s\" on %s has been read."),
 			     self_address, message_subject, message_date);
-	camel_data_wrapper_construct_from_stream (receipt_text, stream);
+	camel_data_wrapper_construct_from_stream (receipt_text, stream, NULL);
 	g_object_unref (stream);
 
 	part = camel_mime_part_new ();
@@ -1569,7 +1569,7 @@ em_utils_send_receipt (CamelFolder *folder, CamelMimeMessage *message)
 			     "Original-Message-ID: %s\n"
 			     "Disposition: manual-action/MDN-sent-manually; displayed\n",
 			     ua, recipient, message_id);
-	camel_data_wrapper_construct_from_stream (receipt_data, stream);
+	camel_data_wrapper_construct_from_stream (receipt_data, stream, NULL);
 	g_object_unref (stream);
 
 	g_free (ua);
diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h
index 1eb0d1b..1a8c480 100644
--- a/mail/em-composer-utils.h
+++ b/mail/em-composer-utils.h
@@ -47,7 +47,7 @@ void em_utils_forward_messages (CamelFolder *folder, GPtrArray *uids, const gcha
 void em_utils_redirect_message (CamelMimeMessage *message);
 void em_utils_redirect_message_by_uid (CamelFolder *folder, const gchar *uid);
 
-void em_utils_forward_message_raw (CamelFolder *folder, CamelMimeMessage *message, const gchar *address, CamelException *ex);
+void em_utils_forward_message_raw (CamelFolder *folder, CamelMimeMessage *message, const gchar *address, GError **error);
 
 void em_utils_handle_receipt (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg);
 void em_utils_send_receipt   (CamelFolder *folder, CamelMimeMessage *message);
diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c
index 37552bb..f91bc85 100644
--- a/mail/em-folder-tree-model.c
+++ b/mail/em-folder-tree-model.c
@@ -206,7 +206,6 @@ account_changed_cb (EAccountList *accounts,
 	EMFolderTreeModelStoreInfo *si;
 	CamelProvider *provider;
 	CamelStore *store;
-	CamelException ex;
 	gchar *uri;
 
 	si = g_hash_table_lookup (model->priv->account_index, account);
@@ -219,22 +218,17 @@ account_changed_cb (EAccountList *accounts,
 	if (!account->enabled ||!(uri = account->source->url))
 		return;
 
-	camel_exception_init (&ex);
-	if (!(provider = camel_provider_get(uri, &ex))) {
-		camel_exception_clear (&ex);
+	if (!(provider = camel_provider_get(uri, NULL)))
 		return;
-	}
 
 	/* make sure the new store belongs in the tree */
 	if (!(provider->flags & CAMEL_PROVIDER_IS_STORAGE))
 		return;
 
 	store = (CamelStore *) camel_session_get_service (
-		session, uri, CAMEL_PROVIDER_STORE, &ex);
-	if (store == NULL) {
-		camel_exception_clear (&ex);
+		session, uri, CAMEL_PROVIDER_STORE, NULL);
+	if (store == NULL)
 		return;
-	}
 
 	em_folder_tree_model_add_store (model, store, account->name);
 	g_object_unref (store);
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index e0bace6..e9c39d5 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -191,7 +191,8 @@ folder_tree_get_folder_info__exec (struct _EMFolderTreeGetFolderInfo *m)
 {
 	guint32 flags = m->flags | CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
 
-	m->fi = camel_store_get_folder_info (m->store, m->top, flags, &m->base.ex);
+	m->fi = camel_store_get_folder_info (
+		m->store, m->top, flags, &m->base.error);
 }
 
 static void
@@ -226,7 +227,7 @@ folder_tree_get_folder_info__done (struct _EMFolderTreeGetFolderInfo *m)
 	gtk_tree_model_get_iter (model, &root, path);
 
 	/* if we had an error, then we need to re-set the load subdirs state and collapse the node */
-	if (!m->fi && camel_exception_is_set(&m->base.ex)) {
+	if (!m->fi && m->base.error != NULL) {
 		gtk_tree_store_set(
 			GTK_TREE_STORE (model), &root,
 			COL_BOOL_LOAD_SUBDIRS, TRUE, -1);
@@ -440,11 +441,9 @@ folder_tree_expand_node (const gchar *key,
 	model = gtk_tree_view_get_model (tree_view);
 
 	if ((account = e_get_account_by_uid (uid)) && account->enabled) {
-		CamelException ex;
-
-		camel_exception_init (&ex);
-		store = (CamelStore *) camel_session_get_service (session, account->source->url, CAMEL_PROVIDER_STORE, &ex);
-		camel_exception_clear (&ex);
+		store = (CamelStore *) camel_session_get_service (
+			session, account->source->url,
+			CAMEL_PROVIDER_STORE, NULL);
 
 		if (store == NULL)
 			return;
@@ -552,7 +551,6 @@ folder_tree_cell_edited_cb (EMFolderTree *folder_tree,
                             const gchar *new_name)
 {
 	CamelFolderInfo *folder_info;
-	CamelException ex;
 	CamelStore *store;
 	GtkTreeView *tree_view;
 	GtkTreeModel *model;
@@ -564,13 +562,12 @@ folder_tree_cell_edited_cb (EMFolderTree *folder_tree,
 	gchar **strv;
 	gpointer parent;
 	guint index;
+	GError *local_error = NULL;
 
 	/* XXX Consider splitting this into separate async functions:
 	 *     em_folder_tree_rename_folder_async()
 	 *     em_folder_tree_rename_folder_finish() */
 
-	camel_exception_init (&ex);
-
 	parent = gtk_widget_get_toplevel (GTK_WIDGET (folder_tree));
 	parent = gtk_widget_is_toplevel (parent) ? parent : NULL;
 
@@ -608,7 +605,7 @@ folder_tree_cell_edited_cb (EMFolderTree *folder_tree,
 
 	/* Check for duplicate folder name. */
 	folder_info = camel_store_get_folder_info (
-		store, new_full_name, CAMEL_STORE_FOLDER_INFO_FAST, &ex);
+		store, new_full_name, CAMEL_STORE_FOLDER_INFO_FAST, NULL);
 	if (folder_info != NULL) {
 		e_alert_run_dialog_for_args (
 			parent, "mail:no-rename-folder-exists",
@@ -618,16 +615,17 @@ folder_tree_cell_edited_cb (EMFolderTree *folder_tree,
 	}
 
 	/* XXX This needs to be asynchronous. */
-	camel_store_rename_folder (store, old_full_name, new_full_name, &ex);
-	if (camel_exception_is_set (&ex)) {
+	if (!camel_store_rename_folder (
+		store, old_full_name, new_full_name, &local_error)) {
 		e_alert_run_dialog_for_args (
 			parent, "mail:no-rename-folder",
-			old_full_name, new_full_name, ex.desc, NULL);
+			old_full_name, new_full_name,
+			local_error->message, NULL);
+		g_clear_error (&local_error);
 		goto exit;
 	}
 
 exit:
-	camel_exception_clear (&ex);
 
 	g_free (old_name);
 	g_free (old_full_name);
@@ -1471,7 +1469,6 @@ tree_drag_data_delete (GtkWidget *widget,
 	GtkTreePath *src_path;
 	gboolean is_store;
 	CamelStore *store;
-	CamelException ex;
 	GtkTreeIter iter;
 
 	if (!priv->drag_row || (src_path = gtk_tree_row_reference_get_path (priv->drag_row)))
@@ -1491,10 +1488,8 @@ tree_drag_data_delete (GtkWidget *widget,
 	if (is_store)
 		goto fail;
 
-	camel_exception_init(&ex);
-	camel_store_delete_folder(store, full_name, &ex);
-	if (camel_exception_is_set(&ex))
-		camel_exception_clear(&ex);
+	camel_store_delete_folder(store, full_name, NULL);
+
 fail:
 	gtk_tree_path_free(src_path);
 	g_free (full_name);
@@ -1514,7 +1509,6 @@ tree_drag_data_get (GtkWidget *widget,
 	GtkTreePath *src_path;
 	CamelFolder *folder;
 	CamelStore *store;
-	CamelException ex;
 	GtkTreeIter iter;
 
 	if (!priv->drag_row || !(src_path = gtk_tree_row_reference_get_path(priv->drag_row)))
@@ -1535,8 +1529,6 @@ tree_drag_data_get (GtkWidget *widget,
 	if (full_name == NULL)
 		goto fail;
 
-	camel_exception_init(&ex);
-
 	switch (info) {
 	case DND_DRAG_TYPE_FOLDER:
 		/* dragging to a new location in the folder tree */
@@ -1544,7 +1536,7 @@ tree_drag_data_get (GtkWidget *widget,
 		break;
 	case DND_DRAG_TYPE_TEXT_URI_LIST:
 		/* dragging to nautilus or something, probably */
-		if ((folder = camel_store_get_folder(store, full_name, 0, &ex))) {
+		if ((folder = camel_store_get_folder(store, full_name, 0, NULL))) {
 			GPtrArray *uids = camel_folder_get_uids(folder);
 
 			em_utils_selection_set_urilist(selection, folder, uids);
@@ -1556,8 +1548,6 @@ tree_drag_data_get (GtkWidget *widget,
 		abort();
 	}
 
-	if (camel_exception_is_set(&ex))
-		camel_exception_clear(&ex);
 fail:
 	gtk_tree_path_free(src_path);
 	g_free (full_name);
@@ -1597,7 +1587,7 @@ folder_tree_drop_folder(struct _DragDataReceivedAsync *m)
 
 	d(printf(" * Drop folder '%s' onto '%s'\n", data, m->full_name));
 
-	if (!(folder = mail_tool_uri_to_folder((gchar *)data, 0, &m->base.ex)))
+	if (!(folder = mail_tool_uri_to_folder((gchar *)data, 0, &m->base.error)))
 		return;
 
 	full_name = camel_folder_get_full_name (folder);
@@ -1648,14 +1638,15 @@ folder_tree_drop_async__exec (struct _DragDataReceivedAsync *m)
 		/* copy or move (aka rename) a folder */
 		folder_tree_drop_folder(m);
 	} else if (m->full_name == NULL) {
-		camel_exception_set (&m->base.ex, CAMEL_EXCEPTION_SYSTEM,
-				     _("Cannot drop message(s) into toplevel store"));
-	} else if ((folder = camel_store_get_folder (m->store, m->full_name, 0, &m->base.ex))) {
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			_("Cannot drop message(s) into toplevel store"));
+	} else if ((folder = camel_store_get_folder (m->store, m->full_name, 0, &m->base.error))) {
 		switch (m->info) {
 		case DND_DROP_TYPE_UID_LIST:
 			/* import a list of uids from another evo folder */
-			em_utils_selection_get_uidlist(m->selection, folder, m->move, &m->base.ex);
-			m->moved = m->move && !camel_exception_is_set(&m->base.ex);
+			em_utils_selection_get_uidlist(m->selection, folder, m->move, &m->base.error);
+			m->moved = m->move && (m->base.error == NULL);
 			break;
 		case DND_DROP_TYPE_MESSAGE_RFC822:
 			/* import a message/rfc822 stream */
@@ -2348,11 +2339,9 @@ em_folder_tree_set_selected_list (EMFolderTree *folder_tree, GList *list, gboole
 	for (;list;list = list->next) {
 		struct _selected_uri *u = g_malloc0(sizeof(*u));
 		CamelURL *url;
-		CamelException ex = { 0 };
 
 		u->uri = g_strdup(list->data);
-		u->store = (CamelStore *)camel_session_get_service (session, u->uri, CAMEL_PROVIDER_STORE, &ex);
-		camel_exception_clear(&ex);
+		u->store = (CamelStore *)camel_session_get_service (session, u->uri, CAMEL_PROVIDER_STORE, NULL);
 
 		url = camel_url_new(u->uri, NULL);
 		if (u->store == NULL || url == NULL) {
@@ -2704,14 +2693,11 @@ em_folder_tree_get_selected_folder (EMFolderTree *folder_tree)
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	gchar *full_name = NULL;
-	CamelException ex;
 	CamelStore *store = NULL;
 	CamelFolder *folder = NULL;
 
 	g_return_val_if_fail (EM_IS_FOLDER_TREE (folder_tree), NULL);
 
-	camel_exception_init (&ex);
-
 	tree_view = GTK_TREE_VIEW (folder_tree);
 	selection = gtk_tree_view_get_selection (tree_view);
 
@@ -2720,9 +2706,8 @@ em_folder_tree_get_selected_folder (EMFolderTree *folder_tree)
 				    COL_STRING_FULL_NAME, &full_name, -1);
 
 	if (store && full_name)
-		folder = camel_store_get_folder (store, full_name, CAMEL_STORE_FOLDER_INFO_FAST, &ex);
-
-	camel_exception_clear (&ex);
+		folder = camel_store_get_folder (
+			store, full_name, CAMEL_STORE_FOLDER_INFO_FAST, NULL);
 
 	return folder;
 }
@@ -2735,14 +2720,11 @@ em_folder_tree_get_selected_folder_info (EMFolderTree *folder_tree)
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	gchar *full_name = NULL, *name = NULL, *uri = NULL;
-	CamelException ex;
 	CamelStore *store = NULL;
 	CamelFolderInfo *fi = NULL;
 
 	g_return_val_if_fail (EM_IS_FOLDER_TREE (folder_tree), NULL);
 
-	camel_exception_init (&ex);
-
 	tree_view = GTK_TREE_VIEW (folder_tree);
 	selection = gtk_tree_view_get_selection (tree_view);
 
diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c
index ab810bf..c7fee4b 100644
--- a/mail/em-folder-utils.c
+++ b/mail/em-folder-utils.c
@@ -104,7 +104,9 @@ emft_copy_folders__exec (struct _EMCopyFolders *m)
 	const gchar *tmp;
 	gint fromlen;
 
-	if (!(fi = camel_store_get_folder_info (m->fromstore, m->frombase, flags, &m->base.ex)))
+	fi = camel_store_get_folder_info (
+		m->fromstore, m->frombase, flags, &m->base.error);
+	if (fi == NULL)
 		return;
 
 	pending = g_list_append (pending, fi);
@@ -144,8 +146,10 @@ emft_copy_folders__exec (struct _EMCopyFolders *m)
 			if ((info->flags & CAMEL_FOLDER_NOSELECT) == 0) {
 				d(printf ("this folder is selectable\n"));
 				if (m->tostore == m->fromstore && m->delete) {
-					camel_store_rename_folder (m->fromstore, info->full_name, toname->str, &m->base.ex);
-					if (camel_exception_is_set (&m->base.ex))
+					camel_store_rename_folder (
+						m->fromstore, info->full_name,
+						toname->str, &m->base.error);
+					if (m->base.error != NULL)
 						goto exception;
 
 					/* this folder no longer exists, unsubscribe it */
@@ -154,19 +158,28 @@ emft_copy_folders__exec (struct _EMCopyFolders *m)
 
 					deleted = 1;
 				} else {
-					if (!(fromfolder = camel_store_get_folder (m->fromstore, info->full_name, 0, &m->base.ex)))
+					fromfolder = camel_store_get_folder (
+						m->fromstore, info->full_name,
+						0, &m->base.error);
+					if (fromfolder == NULL)
 						goto exception;
 
-					if (!(tofolder = camel_store_get_folder (m->tostore, toname->str, CAMEL_STORE_FOLDER_CREATE, &m->base.ex))) {
+					tofolder = camel_store_get_folder (
+						m->tostore, toname->str,
+						CAMEL_STORE_FOLDER_CREATE,
+						&m->base.error);
+					if (tofolder == NULL) {
 						g_object_unref (fromfolder);
 						goto exception;
 					}
 
 					uids = camel_folder_get_uids (fromfolder);
-					camel_folder_transfer_messages_to (fromfolder, uids, tofolder, NULL, m->delete, &m->base.ex);
+					camel_folder_transfer_messages_to (
+						fromfolder, uids, tofolder,
+						NULL, m->delete, &m->base.error);
 					camel_folder_free_uids (fromfolder, uids);
 
-					if (m->delete && !camel_exception_is_set (&m->base.ex))
+					if (m->delete && m->base.error == NULL)
 						camel_folder_sync(fromfolder, TRUE, NULL);
 
 					g_object_unref (fromfolder);
@@ -174,7 +187,7 @@ emft_copy_folders__exec (struct _EMCopyFolders *m)
 				}
 			}
 
-			if (camel_exception_is_set (&m->base.ex))
+			if (m->base.error != NULL)
 				goto exception;
 			else if (m->delete && !deleted)
 				deleting = g_list_prepend (deleting, info);
@@ -265,21 +278,25 @@ emfu_copy_folder_selected (const gchar *uri, gpointer data)
 	CamelStore *fromstore = NULL, *tostore = NULL;
 	CamelStore *local_store;
 	const gchar *tobase = NULL;
-	CamelException ex;
 	CamelURL *url;
+	GError *local_error = NULL;
 
 	if (uri == NULL) {
 		g_free (cfd);
 		return;
 	}
 
-	camel_exception_init (&ex);
-
 	local_store = e_mail_local_get_store ();
 
-	if (!(fromstore = camel_session_get_store (session, cfd->fi->uri, &ex))) {
-		e_alert_run_dialog_for_args (e_shell_get_active_window (NULL),
-			    cfd->delete?"mail:no-move-folder-notexist":"mail:no-copy-folder-notexist", cfd->fi->full_name, uri, ex.desc, NULL);
+	fromstore = camel_session_get_store (
+		session, cfd->fi->uri, &local_error);
+	if (fromstore == NULL) {
+		e_alert_run_dialog_for_args (
+			e_shell_get_active_window (NULL),
+			cfd->delete ? "mail:no-move-folder-notexist" :
+			"mail:no-copy-folder-notexist",
+			cfd->fi->full_name, uri,
+			local_error->message, NULL);
 		goto fail;
 	}
 
@@ -293,9 +310,14 @@ emfu_copy_folder_selected (const gchar *uri, gpointer data)
 		goto fail;
 	}
 
-	if (!(tostore = camel_session_get_store (session, uri, &ex))) {
-		e_alert_run_dialog_for_args (e_shell_get_active_window (NULL),
-			    cfd->delete?"mail:no-move-folder-to-notexist":"mail:no-copy-folder-to-notexist", cfd->fi->full_name, uri, ex.desc, NULL);
+	tostore = camel_session_get_store (session, uri, &local_error);
+	if (tostore == NULL) {
+		e_alert_run_dialog_for_args (
+			e_shell_get_active_window (NULL),
+			cfd->delete ? "mail:no-move-folder-to-notexist" :
+			"mail:no-copy-folder-to-notexist",
+			cfd->fi->full_name, uri,
+			local_error->message, NULL);
 		goto fail;
 	}
 
@@ -315,7 +337,9 @@ fail:
 		g_object_unref (fromstore);
 	if (tostore)
 		g_object_unref (tostore);
-	camel_exception_clear (&ex);
+
+	g_clear_error (&local_error);
+
 	g_free (cfd);
 }
 
@@ -395,20 +419,20 @@ em_folder_utils_copy_folder (GtkWindow *parent,
 }
 
 static void
-emfu_delete_done (CamelFolder *folder, gboolean removed, CamelException *ex, gpointer data)
+emfu_delete_done (CamelFolder *folder, gboolean removed, GError **error, gpointer data)
 {
 	GtkWidget *dialog = data;
 
-	if (ex && camel_exception_is_set (ex)) {
+	if (error != NULL && *error != NULL) {
 		GtkWidget *w;
 
 		w = e_alert_dialog_new_for_args (
 			e_shell_get_active_window (NULL),
 			"mail:no-delete-folder",
 			camel_folder_get_full_name (folder),
-			camel_exception_get_description (ex), NULL);
+			(*error)->message, NULL);
 		em_utils_show_error_silent (w);
-		camel_exception_clear (ex);
+		g_clear_error (error);
 	}
 
 	if (dialog)
@@ -514,9 +538,9 @@ emfu_create_folder__exec (struct _EMCreateFolder *m)
 {
 	d(printf ("creating folder parent='%s' name='%s' full_name='%s'\n", m->parent, m->name, m->full_name));
 
-	if ((m->fi = camel_store_create_folder (m->store, m->parent, m->name, &m->base.ex))) {
+	if ((m->fi = camel_store_create_folder (m->store, m->parent, m->name, &m->base.error))) {
 		if (camel_store_supports_subscriptions (m->store))
-			camel_store_subscribe_folder (m->store, m->full_name, &m->base.ex);
+			camel_store_subscribe_folder (m->store, m->full_name, &m->base.error);
 	}
 }
 
@@ -601,7 +625,6 @@ emfu_popup_new_folder_response (EMFolderSelector *emfs, gint response, gpointer
 	EMFolderTreeModelStoreInfo *si;
 	GtkTreeModel *model;
 	const gchar *uri, *path;
-	CamelException ex;
 	CamelStore *store;
 	struct _EMCreateFolderTempData  *emcftd;
 
@@ -617,11 +640,10 @@ emfu_popup_new_folder_response (EMFolderSelector *emfs, gint response, gpointer
 
 	g_print ("DEBUG: %s (%s)\n", path, uri);
 
-	camel_exception_init (&ex);
-	if (!(store = (CamelStore *) camel_session_get_service (session, uri, CAMEL_PROVIDER_STORE, &ex))) {
-		camel_exception_clear (&ex);
+	store = (CamelStore *) camel_session_get_service (
+		session, uri, CAMEL_PROVIDER_STORE, NULL);
+	if (store == NULL)
 		return;
-	}
 
 	model = gtk_tree_view_get_model (GTK_TREE_VIEW (emfs->emft));
 	si = em_folder_tree_model_lookup_store_info (
@@ -654,7 +676,6 @@ emfu_popup_new_folder_response (EMFolderSelector *emfs, gint response, gpointer
 	}
 
 	g_object_unref (store);
-	camel_exception_clear (&ex);
 }
 
 /* FIXME: these functions must be documented */
@@ -702,7 +723,7 @@ emfu_unsubscribe_folder__exec (struct _folder_unsub_t *msg)
 	gint url_flags;
 
 	store = camel_session_get_store (
-		session, msg->folder_uri, &msg->base.ex);
+		session, msg->folder_uri, &msg->base.error);
 	if (store == NULL)
 		return;
 
@@ -715,7 +736,7 @@ emfu_unsubscribe_folder__exec (struct _folder_unsub_t *msg)
 		path = url->path + 1;
 
 	if (path != NULL)
-		camel_store_unsubscribe_folder (store, path, &msg->base.ex);
+		camel_store_unsubscribe_folder (store, path, &msg->base.error);
 
 	camel_url_free (url);
 }
diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c
index db13260..d49d797 100644
--- a/mail/em-format-html-display.c
+++ b/mail/em-format-html-display.c
@@ -426,14 +426,14 @@ efhd_format_attachment (EMFormat *emf,
 		stream, EM_FORMAT_HTML_VPAD
 		"<table cellspacing=0 cellpadding=0><tr><td>"
 		"<table width=10 cellspacing=0 cellpadding=0>"
-		"<tr><td></td></tr></table></td>");
+		"<tr><td></td></tr></table></td>", NULL);
 
 	camel_stream_printf (
 		stream, "<td><object classid=\"%s\"></object></td>", classid);
 
 	camel_stream_write_string (
 		stream, "<td><table width=3 cellspacing=0 cellpadding=0>"
-		"<tr><td></td></tr></table></td><td><font size=-1>");
+		"<tr><td></td></tr></table></td><td><font size=-1>", NULL);
 
 	/* output some info about it */
 	/* FIXME: should we look up mime_type from object again? */
@@ -441,13 +441,13 @@ efhd_format_attachment (EMFormat *emf,
 	html = camel_text_to_html (
 		text, EM_FORMAT_HTML (emf)->text_html_flags &
 		CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS, 0);
-	camel_stream_write_string (stream, html);
+	camel_stream_write_string (stream, html, NULL);
 	g_free (html);
 	g_free (text);
 
 	camel_stream_write_string (
 		stream, "</font></td></tr><tr></table>\n"
-		EM_FORMAT_HTML_VPAD);
+		EM_FORMAT_HTML_VPAD, NULL);
 
 	if (handle && info->shown)
 		handle->handler (emf, stream, part, handle, FALSE);
@@ -491,7 +491,7 @@ efhd_format_optional (EMFormat *emf,
 	camel_stream_write_string (
 		stream, EM_FORMAT_HTML_VPAD
 		"<table cellspacing=0 cellpadding=0><tr><td>"
-		"<h3><font size=-1 color=red>");
+		"<h3><font size=-1 color=red>", NULL);
 
 	html = camel_text_to_html (
 		_("Evolution cannot render this email as it is too "
@@ -499,19 +499,18 @@ efhd_format_optional (EMFormat *emf,
 		  "with an external text editor."),
 		EM_FORMAT_HTML (emf)->text_html_flags &
 		CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS, 0);
-	camel_stream_write_string (stream, html);
+	camel_stream_write_string (stream, html, NULL);
 	camel_stream_write_string (
-		stream, "</font></h3></td></tr></table>\n");
+		stream, "</font></h3></td></tr></table>\n", NULL);
 	camel_stream_write_string (
-		stream, "<table cellspacing=0 cellpadding=0><tr>");
+		stream, "<table cellspacing=0 cellpadding=0><tr>", NULL);
 	camel_stream_printf (
 		stream, "<td><object classid=\"%s\"></object>"
 		"</td></tr></table>", classid);
 
 	g_free(html);
 
-	camel_stream_write_string (
-		stream, EM_FORMAT_HTML_VPAD);
+	camel_stream_write_string (stream, EM_FORMAT_HTML_VPAD, NULL);
 
 	g_free (classid);
 }
@@ -681,8 +680,8 @@ efhd_write_image(EMFormat *emf, CamelStream *stream, EMFormatPURI *puri)
 
 	/* TODO: identical to efh_write_image */
 	d(printf("writing image '%s'\n", puri->cid));
-	camel_data_wrapper_decode_to_stream(dw, stream);
-	camel_stream_close(stream);
+	camel_data_wrapper_decode_to_stream(dw, stream, NULL);
+	camel_stream_close(stream, NULL);
 }
 
 static void
@@ -869,7 +868,7 @@ efhd_attachment_frame (EMFormat *emf,
 		info->handle->handler (
 			emf, stream, info->puri.part, info->handle, FALSE);
 
-	camel_stream_close (stream);
+	camel_stream_close (stream, NULL);
 }
 
 static void
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index 5454394..c63ed28 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -204,7 +204,7 @@ efh_format_exec (struct _format_msg *m)
 				(CamelMimePart *) m->message, handle, FALSE);
 	}
 
-	camel_stream_flush((CamelStream *)m->estream);
+	camel_stream_flush((CamelStream *)m->estream, NULL);
 
 	puri_level = format->pending_uri_level;
 	base = format->base;
@@ -244,8 +244,10 @@ efh_format_exec (struct _format_msg *m)
 			/* Closing this base stream can queue more jobs, so we need
 			   to check the list again after we've finished */
 			d(printf("out of jobs, closing root stream\n"));
-			camel_stream_write_string((CamelStream *)m->estream, "</body>\n</html>\n");
-			camel_stream_close((CamelStream *)m->estream);
+			camel_stream_write_string (
+				(CamelStream *) m->estream,
+				"</body>\n</html>\n", NULL);
+			camel_stream_close((CamelStream *)m->estream, NULL);
 			g_object_unref (m->estream);
 			m->estream = NULL;
 		}
@@ -274,7 +276,7 @@ efh_format_free (struct _format_msg *m)
 	d(printf("formatter freed\n"));
 	g_object_unref(m->format);
 	if (m->estream) {
-		camel_stream_close((CamelStream *)m->estream);
+		camel_stream_close((CamelStream *)m->estream, NULL);
 		g_object_unref (m->estream);
 	}
 	if (m->folder)
@@ -695,11 +697,11 @@ efh_format_source (EMFormat *emf,
 		CAMEL_STREAM_FILTER (filtered_stream), filter);
 	g_object_unref (filter);
 
-	camel_stream_write_string (stream, "<table><tr><td><tt>");
+	camel_stream_write_string (stream, "<table><tr><td><tt>", NULL);
 	em_format_format_text (emf, (CamelStream *) filtered_stream, dw);
 	g_object_unref (filtered_stream);
 
-	camel_stream_write_string(stream, "</tt></td></tr></table>");
+	camel_stream_write_string(stream, "</tt></td></tr></table>", NULL);
 }
 
 static void
@@ -720,18 +722,20 @@ efh_format_attachment (EMFormat *emf,
 		"<table width=10 cellspacing=0 cellpadding=0>"
 		"<tr><td></td></tr></table></td>"
 		"<td><table width=3 cellspacing=0 cellpadding=0>"
-		"<tr><td></td></tr></table></td><td><font size=-1>\n");
+		"<tr><td></td></tr></table></td><td><font size=-1>\n",
+		NULL);
 
 	/* output some info about it */
 	text = em_format_describe_part(part, mime_type);
 	html = camel_text_to_html (
 		text, ((EMFormatHTML *)emf)->text_html_flags &
 		CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS, 0);
-	camel_stream_write_string (stream, html);
+	camel_stream_write_string (stream, html, NULL);
 	g_free (html);
 	g_free (text);
 
-	camel_stream_write_string (stream, "</font></td></tr><tr></table>");
+	camel_stream_write_string (
+		stream, "</font></td></tr><tr></table>", NULL);
 
 	if (handle && em_format_is_inline (emf, emf->part_id->str, part, handle))
 		handle->handler (emf, stream, part, handle, FALSE);
@@ -1215,12 +1219,12 @@ em_format_html_file_part(EMFormatHTML *efh, const gchar *mime_type, const gchar
 	CamelDataWrapper *dw;
 	gchar *basename;
 
-	stream = camel_stream_fs_new_with_name(filename, O_RDONLY, 0);
+	stream = camel_stream_fs_new_with_name(filename, O_RDONLY, 0, NULL);
 	if (stream == NULL)
 		return NULL;
 
 	dw = camel_data_wrapper_new();
-	camel_data_wrapper_construct_from_stream(dw, stream);
+	camel_data_wrapper_construct_from_stream(dw, stream, NULL);
 	g_object_unref (stream);
 	if (mime_type)
 		camel_data_wrapper_set_mime_type(dw, mime_type);
@@ -1436,7 +1440,7 @@ static void emfh_gethttp(struct _EMFormatHTMLJob *job, gint cancelled)
 			break;
 		}
 		/* FIXME: progress reporting in percentage, can we get the length always?  do we care? */
-		n = camel_stream_read(instream, buffer, sizeof (buffer));
+		n = camel_stream_read(instream, buffer, sizeof (buffer), NULL);
 		if (n > 0) {
 			nread += n;
 			/* If we didn't get a valid Content-Length header, do not try to calculate percentage */
@@ -1445,18 +1449,18 @@ static void emfh_gethttp(struct _EMFormatHTMLJob *job, gint cancelled)
 				camel_operation_progress(NULL, pc_complete);
 			}
 			d(printf("  read %d bytes\n", n));
-			if (costream && camel_stream_write (costream, buffer, n) == -1) {
+			if (costream && camel_stream_write (costream, buffer, n, NULL) == -1) {
 				n = -1;
 				break;
 			}
 
-			camel_stream_write(job->stream, buffer, n);
+			camel_stream_write(job->stream, buffer, n, NULL);
 		}
 	} while (n>0);
 
 	/* indicates success */
 	if (n == 0)
-		camel_stream_close(job->stream);
+		camel_stream_close(job->stream, NULL);
 
 	if (costream) {
 		/* do not store broken files in a cache */
@@ -1709,8 +1713,9 @@ efh_text_plain (EMFormatHTML *efh,
 		camel_stream_filter_add (
 			CAMEL_STREAM_FILTER (filtered_stream),
 			CAMEL_MIME_FILTER (inline_filter));
-		camel_data_wrapper_decode_to_stream (dw, (CamelStream *)filtered_stream);
-		camel_stream_close((CamelStream *)filtered_stream);
+		camel_data_wrapper_decode_to_stream (
+			dw, (CamelStream *)filtered_stream, NULL);
+		camel_stream_close((CamelStream *)filtered_stream, NULL);
 		g_object_unref (filtered_stream);
 
 		mp = em_inline_filter_get_multipart(inline_filter);
@@ -1753,11 +1758,12 @@ efh_text_plain (EMFormatHTML *efh,
 				e_color_to_value (
 					&efh->priv->colors[
 					EM_FORMAT_HTML_COLOR_TEXT]));
-			camel_stream_write_string(stream, "<tt>\n" EFH_MESSAGE_START);
+			camel_stream_write_string (
+				stream, "<tt>\n" EFH_MESSAGE_START, NULL);
 			em_format_format_text((EMFormat *)efh, (CamelStream *)filtered_stream, (CamelDataWrapper *)newpart);
-			camel_stream_flush((CamelStream *)filtered_stream);
-			camel_stream_write_string(stream, "</tt>\n");
-			camel_stream_write_string(stream, "</div>\n");
+			camel_stream_flush((CamelStream *)filtered_stream, NULL);
+			camel_stream_write_string (stream, "</tt>\n", NULL);
+			camel_stream_write_string (stream, "</div>\n", NULL);
 		} else {
 			g_string_append_printf(((EMFormat *)efh)->part_id, ".inline.%d", i);
 			em_format_part((EMFormat *)efh, stream, newpart);
@@ -1777,9 +1783,11 @@ efh_text_enriched(EMFormatHTML *efh, CamelStream *stream, CamelMimePart *part, E
 
 	if (!strcmp(info->mime_type, "text/richtext")) {
 		flags = CAMEL_MIME_FILTER_ENRICHED_IS_RICHTEXT;
-		camel_stream_write_string( stream, "\n<!-- text/richtext -->\n");
+		camel_stream_write_string (
+			stream, "\n<!-- text/richtext -->\n", NULL);
 	} else {
-		camel_stream_write_string( stream, "\n<!-- text/enriched -->\n");
+		camel_stream_write_string (
+			stream, "\n<!-- text/enriched -->\n", NULL);
 	}
 
 	enriched = camel_mime_filter_enriched_new(flags);
@@ -1803,7 +1811,7 @@ efh_text_enriched(EMFormatHTML *efh, CamelStream *stream, CamelMimePart *part, E
 	em_format_format_text((EMFormat *)efh, (CamelStream *)filtered_stream, (CamelDataWrapper *)part);
 
 	g_object_unref (filtered_stream);
-	camel_stream_write_string(stream, "</div>");
+	camel_stream_write_string (stream, "</div>", NULL);
 }
 
 static void
@@ -1997,19 +2005,19 @@ efh_message_deliverystatus(EMFormatHTML *efh, CamelStream *stream, CamelMimePart
 		CAMEL_STREAM_FILTER (filtered_stream), html_filter);
 	g_object_unref (html_filter);
 
-	camel_stream_write_string(stream, "<tt>\n" EFH_MESSAGE_START);
+	camel_stream_write_string (stream, "<tt>\n" EFH_MESSAGE_START, NULL);
 	em_format_format_text((EMFormat *)efh, (CamelStream *)filtered_stream, (CamelDataWrapper *)part);
-	camel_stream_flush((CamelStream *)filtered_stream);
-	camel_stream_write_string(stream, "</tt>\n");
+	camel_stream_flush((CamelStream *)filtered_stream, NULL);
+	camel_stream_write_string (stream, "</tt>\n", NULL);
 
-	camel_stream_write_string(stream, "</div>");
+	camel_stream_write_string (stream, "</div>", NULL);
 }
 
 static void
 emfh_write_related(EMFormat *emf, CamelStream *stream, EMFormatPURI *puri)
 {
 	em_format_format_content(emf, stream, puri->part);
-	camel_stream_close(stream);
+	camel_stream_close(stream, NULL);
 }
 
 static void
@@ -2120,7 +2128,7 @@ efh_multipart_related(EMFormat *emf, CamelStream *stream, CamelMimePart *part, c
 	g_string_append_printf(emf->part_id, "related.%d", displayid);
 	em_format_part(emf, stream, display_part);
 	g_string_truncate(emf->part_id, partidlen);
-	camel_stream_flush(stream);
+	camel_stream_flush(stream, NULL);
 
 	/* queue a job to check for un-referenced parts to add as attachments */
 	job = em_format_html_job_new((EMFormatHTML *)emf, emfh_multipart_related_check, NULL);
@@ -2137,8 +2145,8 @@ efh_write_image(EMFormat *emf, CamelStream *stream, EMFormatPURI *puri)
 	CamelDataWrapper *dw = camel_medium_get_content ((CamelMedium *)puri->part);
 
 	d(printf("writing image '%s'\n", puri->cid));
-	camel_data_wrapper_decode_to_stream(dw, stream);
-	camel_stream_close(stream);
+	camel_data_wrapper_decode_to_stream(dw, stream, NULL);
+	camel_stream_close(stream, NULL);
 }
 
 static void
diff --git a/mail/em-html-stream.c b/mail/em-html-stream.c
index d86e2a3..f74ba8d 100644
--- a/mail/em-html-stream.c
+++ b/mail/em-html-stream.c
@@ -28,6 +28,7 @@
 
 #include <stdio.h>
 #include <gtk/gtk.h>
+#include <glib/gi18n-lib.h>
 #include "em-html-stream.h"
 
 #define d(x)
@@ -63,19 +64,24 @@ html_stream_dispose (GObject *object)
 
 	if (emhs->html_stream) {
 		/* set 'in finalise' flag */
-		camel_stream_close (CAMEL_STREAM (emhs));
+		camel_stream_close (CAMEL_STREAM (emhs), NULL);
 	}
 }
 
 static gssize
 html_stream_sync_write (CamelStream *stream,
                         const gchar *buffer,
-                        gsize n)
+                        gsize n,
+                        GError **error)
 {
 	EMHTMLStream *emhs = EM_HTML_STREAM (stream);
 
-	if (emhs->html == NULL)
+	if (emhs->html == NULL) {
+		g_set_error (
+			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			_("No HTML stream available"));
 		return -1;
+	}
 
 	if (emhs->html_stream == NULL)
 		emhs->html_stream = gtk_html_begin_full (
@@ -87,12 +93,17 @@ html_stream_sync_write (CamelStream *stream,
 }
 
 static gint
-html_stream_sync_flush (CamelStream *stream)
+html_stream_sync_flush (CamelStream *stream,
+                        GError **error)
 {
 	EMHTMLStream *emhs = (EMHTMLStream *)stream;
 
-	if (emhs->html_stream == NULL)
+	if (emhs->html_stream == NULL) {
+		g_set_error (
+			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			_("No HTML stream available"));
 		return -1;
+	}
 
 	gtk_html_flush (emhs->html);
 
@@ -100,12 +111,17 @@ html_stream_sync_flush (CamelStream *stream)
 }
 
 static gint
-html_stream_sync_close (CamelStream *stream)
+html_stream_sync_close (CamelStream *stream,
+                        GError **error)
 {
 	EMHTMLStream *emhs = (EMHTMLStream *)stream;
 
-	if (emhs->html_stream == NULL)
+	if (emhs->html_stream == NULL) {
+		g_set_error (
+			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			_("No HTML stream available"));
 		return -1;
+	}
 
 	gtk_html_stream_close (emhs->html_stream, GTK_HTML_STREAM_OK);
 	html_stream_cleanup (emhs);
diff --git a/mail/em-inline-filter.c b/mail/em-inline-filter.c
index c142ca2..b780256 100644
--- a/mail/em-inline-filter.c
+++ b/mail/em-inline-filter.c
@@ -92,12 +92,12 @@ inline_filter_add_part(EMInlineFilter *emif, const gchar *data, gint len)
 		camel_stream_filter_add (CAMEL_STREAM_FILTER (filter_stream), enc_filter);
 
 		/* properly encode content */
-		camel_data_wrapper_construct_from_stream (dw, filter_stream);
+		camel_data_wrapper_construct_from_stream (dw, filter_stream, NULL);
 
 		g_object_unref (enc_filter);
 		g_object_unref (filter_stream);
 	} else {
-		camel_data_wrapper_construct_from_stream (dw, mem);
+		camel_data_wrapper_construct_from_stream (dw, mem, NULL);
 	}
 	g_object_unref (mem);
 
diff --git a/mail/em-subscribe-editor.c b/mail/em-subscribe-editor.c
index 8152974..ceeb770 100644
--- a/mail/em-subscribe-editor.c
+++ b/mail/em-subscribe-editor.c
@@ -266,9 +266,13 @@ static void
 sub_folder_exec (struct _zsubscribe_msg *m)
 {
 	if (m->subscribe)
-		camel_store_subscribe_folder (m->sub->store, m->node->info->full_name, &m->base.ex);
+		camel_store_subscribe_folder (
+			m->sub->store, m->node->info->full_name,
+			&m->base.error);
 	else
-		camel_store_unsubscribe_folder (m->sub->store, m->node->info->full_name, &m->base.ex);
+		camel_store_unsubscribe_folder (
+			m->sub->store, m->node->info->full_name,
+			&m->base.error);
 }
 
 static void
@@ -285,7 +289,7 @@ sub_folder_done (struct _zsubscribe_msg *m)
 	if (m->sub->cancel)
 		return;
 
-	if (!camel_exception_is_set(&m->base.ex)) {
+	if (m->base.error == NULL) {
 		if (m->subscribe)
 			m->node->info->flags |= CAMEL_FOLDER_SUBSCRIBED;
 		else
@@ -451,7 +455,12 @@ sub_folderinfo_exec (struct _emse_folderinfo_msg *m)
 	if (m->seq == m->sub->seq) {
 		camel_operation_register (m->base.cancel);
 		/* get the full folder tree for search ability */
-		m->info = camel_store_get_folder_info (m->sub->store, NULL, CAMEL_STORE_FOLDER_INFO_NO_VIRTUAL | CAMEL_STORE_FOLDER_INFO_SUBSCRIPTION_LIST | CAMEL_STORE_FOLDER_INFO_RECURSIVE, &m->base.ex);
+		m->info = camel_store_get_folder_info (
+			m->sub->store, NULL,
+			CAMEL_STORE_FOLDER_INFO_NO_VIRTUAL |
+			CAMEL_STORE_FOLDER_INFO_SUBSCRIPTION_LIST |
+			CAMEL_STORE_FOLDER_INFO_RECURSIVE,
+			&m->base.error);
 		camel_operation_unregister (m->base.cancel);
 	}
 }
@@ -463,10 +472,10 @@ sub_folderinfo_done (struct _emse_folderinfo_msg *m)
 	if (m->sub->cancel || m->seq != m->sub->seq)
 		return;
 
-	if (camel_exception_is_set (&m->base.ex)) {
-		g_warning ("Error getting folder info from store: %s",
-			   camel_exception_get_description (&m->base.ex));
-	}
+	if (m->base.error != NULL)
+		g_warning (
+			"Error getting folder info from store: %s",
+			m->base.error->message);
 
 	if (m->info) {
 		if (m->node) {
diff --git a/mail/em-sync-stream.c b/mail/em-sync-stream.c
index d0dd6e7..238ccf0 100644
--- a/mail/em-sync-stream.c
+++ b/mail/em-sync-stream.c
@@ -29,6 +29,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <glib/gi18n-lib.h>
 #include <libedataserver/e-flag.h>
 
 #include "mail-mt.h"
@@ -41,6 +42,7 @@ enum _write_msg_t {
 
 struct _write_msg {
 	EMSyncStream *emss;
+	GError *error;
 	EFlag *done;
 
 	enum _write_msg_t op;
@@ -67,22 +69,23 @@ sync_stream_process_message (struct _write_msg *msg)
 	if (emss->buffer != NULL && emss->buffer->len > 0) {
 		EM_SYNC_STREAM_GET_CLASS (emss)->sync_write (
 			CAMEL_STREAM (emss), emss->buffer->str,
-			emss->buffer->len);
+			emss->buffer->len, &msg->error);
 		g_string_set_size (emss->buffer, 0);
 	}
 
 	switch (msg->op) {
 		case EMSS_WRITE:
 			EM_SYNC_STREAM_GET_CLASS (emss)->sync_write (
-				CAMEL_STREAM (emss), msg->string, msg->len);
+				CAMEL_STREAM (emss), msg->string,
+				msg->len, &msg->error);
 			break;
 		case EMSS_FLUSH:
 			EM_SYNC_STREAM_GET_CLASS (emss)->sync_flush (
-				CAMEL_STREAM (emss));
+				CAMEL_STREAM (emss), &msg->error);
 			break;
 		case EMSS_CLOSE:
 			EM_SYNC_STREAM_GET_CLASS (emss)->sync_close (
-				CAMEL_STREAM (emss));
+				CAMEL_STREAM (emss), &msg->error);
 			break;
 	}
 
@@ -93,12 +96,16 @@ sync_stream_process_message (struct _write_msg *msg)
 }
 
 static void
-sync_stream_sync_op (EMSyncStream *emss, enum _write_msg_t op,
-	      const gchar *string, gsize len)
+sync_stream_sync_op (EMSyncStream *emss,
+                     enum _write_msg_t op,
+                     const gchar *string,
+                     gsize len,
+                     GError **error)
 {
 	struct _write_msg msg;
 
 	msg.done = e_flag_new ();
+	msg.error = NULL;
 	msg.emss = emss;
 	msg.op = op;
 	msg.string = string;
@@ -113,6 +120,9 @@ sync_stream_sync_op (EMSyncStream *emss, enum _write_msg_t op,
 	e_flag_wait (msg.done);
 	e_flag_free (msg.done);
 
+	if (msg.error != NULL)
+		g_propagate_error (error, msg.error);
+
 	g_object_unref (emss);
 }
 
@@ -128,57 +138,74 @@ sync_stream_finalize (GObject *object)
 }
 
 static gssize
-sync_stream_write (CamelStream *stream, const gchar *string, gsize len)
+sync_stream_write (CamelStream *stream,
+                   const gchar *string,
+                   gsize len,
+                   GError **error)
 {
 	EMSyncStream *emss = EM_SYNC_STREAM (stream);
 
-	if (emss->cancel)
+	if (emss->cancel) {
+		g_set_error (
+			error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
+			_("Canceled"));
 		return -1;
+	}
 
 	if (mail_in_main_thread ()) {
-		EM_SYNC_STREAM_GET_CLASS (emss)->sync_write (stream, string, len);
+		EM_SYNC_STREAM_GET_CLASS (emss)->sync_write (stream, string, len, error);
 	} else if (emss->buffer != NULL) {
 		if (len < (emss->buffer->allocated_len - emss->buffer->len))
 			g_string_append_len (emss->buffer, string, len);
 		else
-			sync_stream_sync_op (emss, EMSS_WRITE, string, len);
+			sync_stream_sync_op (emss, EMSS_WRITE, string, len, error);
 	} else {
-		sync_stream_sync_op(emss, EMSS_WRITE, string, len);
+		sync_stream_sync_op(emss, EMSS_WRITE, string, len, error);
 	}
 
 	return (gssize) len;
 }
 
 static gint
-sync_stream_flush (CamelStream *stream)
+sync_stream_flush (CamelStream *stream,
+                   GError **error)
 {
 	EMSyncStream *emss = EM_SYNC_STREAM (stream);
 
-	if (emss->cancel)
+	if (emss->cancel) {
+		g_set_error (
+			error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
+			_("Canceled"));
 		return -1;
+	}
 
 	if (mail_in_main_thread ())
-		return EM_SYNC_STREAM_GET_CLASS (emss)->sync_flush (stream);
+		return EM_SYNC_STREAM_GET_CLASS (emss)->sync_flush (stream, error);
 	else
-		sync_stream_sync_op (emss, EMSS_FLUSH, NULL, 0);
+		sync_stream_sync_op (emss, EMSS_FLUSH, NULL, 0, error);
 
 	return 0;
 }
 
 static gint
-sync_stream_close (CamelStream *stream)
+sync_stream_close (CamelStream *stream,
+                   GError **error)
 {
 	EMSyncStream *emss = EM_SYNC_STREAM (stream);
 
-	if (emss->cancel)
+	if (emss->cancel) {
+		g_set_error (
+			error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
+			_("Canceled"));
 		return -1;
+	}
 
 	emss->idle_id = 0;
 
 	if (mail_in_main_thread ())
-		return EM_SYNC_STREAM_GET_CLASS (emss)->sync_close (stream);
+		return EM_SYNC_STREAM_GET_CLASS (emss)->sync_close (stream, error);
 	else
-		sync_stream_sync_op (emss, EMSS_CLOSE, NULL, 0);
+		sync_stream_sync_op (emss, EMSS_CLOSE, NULL, 0, error);
 
 	return 0;
 }
diff --git a/mail/em-sync-stream.h b/mail/em-sync-stream.h
index 5930790..806d79d 100644
--- a/mail/em-sync-stream.h
+++ b/mail/em-sync-stream.h
@@ -69,9 +69,12 @@ struct _EMSyncStreamClass {
 
 	gssize		(*sync_write)		(CamelStream *stream,
 						 const gchar *string,
-						 gsize len);
-	gint		(*sync_close)		(CamelStream *stream);
-	gint		(*sync_flush)		(CamelStream *stream);
+						 gsize len,
+						 GError **error);
+	gint		(*sync_close)		(CamelStream *stream,
+						 GError **error);
+	gint		(*sync_flush)		(CamelStream *stream,
+						 GError **error);
 };
 
 GType		em_sync_stream_get_type		(void);
diff --git a/mail/em-utils.c b/mail/em-utils.c
index 1e40087..aa147bf 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -567,10 +567,10 @@ em_utils_write_messages_to_stream(CamelFolder *folder, GPtrArray *uids, CamelStr
 		/* we need to flush after each stream write since we are writing to the same stream */
 		from = camel_mime_message_build_mbox_from(message);
 
-		if (camel_stream_write_string(stream, from) == -1
-		    || camel_stream_flush(stream) == -1
-		    || camel_data_wrapper_write_to_stream((CamelDataWrapper *)message, (CamelStream *)filtered_stream) == -1
-		    || camel_stream_flush((CamelStream *)filtered_stream) == -1)
+		if (camel_stream_write_string(stream, from, NULL) == -1
+		    || camel_stream_flush(stream, NULL) == -1
+		    || camel_data_wrapper_write_to_stream((CamelDataWrapper *)message, (CamelStream *)filtered_stream, NULL) == -1
+		    || camel_stream_flush((CamelStream *)filtered_stream, NULL) == -1)
 			res = -1;
 
 		g_free(from);
@@ -590,38 +590,36 @@ em_utils_write_messages_to_stream(CamelFolder *folder, GPtrArray *uids, CamelStr
 static gint
 em_utils_read_messages_from_stream(CamelFolder *folder, CamelStream *stream)
 {
-	CamelException *ex = camel_exception_new();
 	CamelMimeParser *mp = camel_mime_parser_new();
-	gint res = -1;
+	gboolean success = TRUE;
 
 	camel_mime_parser_scan_from(mp, TRUE);
-	camel_mime_parser_init_with_stream(mp, stream);
+	camel_mime_parser_init_with_stream(mp, stream, NULL);
 
 	while (camel_mime_parser_step(mp, NULL, NULL) == CAMEL_MIME_PARSER_STATE_FROM) {
 		CamelMimeMessage *msg;
+		gboolean success;
 
 		/* NB: de-from filter, once written */
 		msg = camel_mime_message_new();
-		if (camel_mime_part_construct_from_parser((CamelMimePart *)msg, mp) == -1) {
+		if (camel_mime_part_construct_from_parser((CamelMimePart *)msg, mp, NULL) == -1) {
 			g_object_unref (msg);
 			break;
 		}
 
-		camel_folder_append_message(folder, msg, NULL, NULL, ex);
+		success = camel_folder_append_message (
+			folder, msg, NULL, NULL, NULL);
 		g_object_unref (msg);
 
-		if (camel_exception_is_set (ex))
+		if (!success)
 			break;
 
 		camel_mime_parser_step(mp, NULL, NULL);
 	}
 
 	g_object_unref (mp);
-	if (!camel_exception_is_set(ex))
-		res = 0;
-	camel_exception_free(ex);
 
-	return res;
+	return success ? 0 : -1;
 }
 
 /**
@@ -700,7 +698,6 @@ em_utils_selection_get_message (GtkSelectionData *selection_data,
                                 CamelFolder *folder)
 {
 	CamelStream *stream;
-	CamelException *ex;
 	CamelMimeMessage *msg;
 	const guchar *data;
 	gint length;
@@ -711,15 +708,13 @@ em_utils_selection_get_message (GtkSelectionData *selection_data,
 	if (data == NULL || length == -1)
 		return;
 
-	ex = camel_exception_new();
 	stream = (CamelStream *)
 		camel_stream_mem_new_with_buffer ((gchar *)data, length);
 	msg = camel_mime_message_new();
-	if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, stream) == 0)
-		camel_folder_append_message(folder, msg, NULL, NULL, ex);
+	if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, stream, NULL) == 0)
+		camel_folder_append_message(folder, msg, NULL, NULL, NULL);
 	g_object_unref (msg);
 	g_object_unref (stream);
-	camel_exception_free(ex);
 }
 
 /**
@@ -767,7 +762,7 @@ void
 em_utils_selection_get_uidlist (GtkSelectionData *selection_data,
                                 CamelFolder *dest,
                                 gint move,
-                                CamelException *ex)
+                                GError **error)
 {
 	/* format: "uri\0uid1\0uid2\0uid3\0...\0uidn" */
 	gchar *inptr, *inend;
@@ -805,9 +800,9 @@ em_utils_selection_get_uidlist (GtkSelectionData *selection_data,
 		return;
 	}
 
-	folder = mail_tool_uri_to_folder((gchar *) data, 0, ex);
+	folder = mail_tool_uri_to_folder((gchar *) data, 0, error);
 	if (folder) {
-		camel_folder_transfer_messages_to(folder, uids, dest, NULL, move, ex);
+		camel_folder_transfer_messages_to(folder, uids, dest, NULL, move, error);
 		g_object_unref (folder);
 	}
 
@@ -1280,9 +1275,9 @@ em_utils_message_to_html (CamelMimeMessage *message, const gchar *credits, guint
 	g_object_unref (emfq);
 
 	if (append && *append)
-		camel_stream_write ((CamelStream*)mem, append, strlen (append));
+		camel_stream_write ((CamelStream*)mem, append, strlen (append), NULL);
 
-	camel_stream_write((CamelStream *)mem, "", 1);
+	camel_stream_write((CamelStream *)mem, "", 1, NULL);
 	g_object_unref (mem);
 
 	text = (gchar *)buf->data;
@@ -1331,13 +1326,10 @@ em_utils_empty_trash (GtkWidget *parent)
 	EAccountList *accounts;
 	EAccount *account;
 	EIterator *iter;
-	CamelException ex;
 
 	if (!em_utils_prompt_user((GtkWindow *) parent, "/apps/evolution/mail/prompts/empty_trash", "mail:ask-empty-trash", NULL))
 		return;
 
-	camel_exception_init (&ex);
-
 	accounts = e_get_account_list ();
 	iter = e_list_get_iterator ((EList *) accounts);
 	while (e_iterator_is_valid (iter)) {
@@ -1345,16 +1337,13 @@ em_utils_empty_trash (GtkWidget *parent)
 
 		/* make sure this is a valid source */
 		if (account->enabled && account->source->url) {
-			provider = camel_provider_get(account->source->url, &ex);
+			provider = camel_provider_get(account->source->url, NULL);
 			if (provider) {
 				/* make sure this store is a remote store */
 				if (provider->flags & CAMEL_PROVIDER_IS_STORAGE) {
 					mail_empty_trash (account, NULL, NULL);
 				}
 			}
-
-			/* clear the exception for the next round */
-			camel_exception_clear (&ex);
 		}
 
 		e_iterator_next (iter);
@@ -1406,22 +1395,18 @@ gchar *em_uri_from_camel(const gchar *curi)
 	const gchar *uid, *path;
 	gchar *euri, *tmp;
 	CamelProvider *provider;
-	CamelException ex;
 
 	/* Easiest solution to code that shouldnt be calling us */
 	if (!strncmp(curi, "email:", 6))
 		return g_strdup(curi);
 
-	camel_exception_init(&ex);
-	provider = camel_provider_get(curi, &ex);
+	provider = camel_provider_get(curi, NULL);
 	if (provider == NULL) {
-		camel_exception_clear(&ex);
 		d(printf("em uri from camel failed '%s'\n", curi));
 		return g_strdup(curi);
 	}
 
-	curl = camel_url_new(curi, &ex);
-	camel_exception_clear(&ex);
+	curl = camel_url_new(curi, NULL);
 	if (curl == NULL)
 		return g_strdup(curi);
 
@@ -1457,7 +1442,6 @@ gchar *em_uri_to_camel(const gchar *euri)
 	EAccountService *service;
 	CamelProvider *provider;
 	CamelURL *eurl, *curl;
-	CamelException ex = CAMEL_EXCEPTION_INITIALISER;
 	gchar *uid, *curi;
 
 	if (strncmp(euri, "email:", 6) != 0) {
@@ -1518,11 +1502,9 @@ gchar *em_uri_to_camel(const gchar *euri)
 	}
 
 	service = account->source;
-	if (!(provider = camel_provider_get (service->url, &ex))) {
-		camel_exception_clear (&ex);
+	provider = camel_provider_get (service->url, NULL);
+	if (provider == NULL)
 		return g_strdup (euri);
-	}
-	camel_exception_clear (&ex);
 
 	curl = camel_url_new(service->url, NULL);
 	if (provider->url_flags & CAMEL_URL_FRAGMENT_IS_PATH)
diff --git a/mail/em-utils.h b/mail/em-utils.h
index 1fde390..ac1f1a0 100644
--- a/mail/em-utils.h
+++ b/mail/em-utils.h
@@ -57,7 +57,7 @@ void em_utils_selection_get_mailbox(GtkSelectionData *data, CamelFolder *folder)
 void em_utils_selection_get_message(GtkSelectionData *data, CamelFolder *folder);
 /* FIXME: be nice if these also worked on CamelFolder's, no easy way to get uri from folder yet tho */
 void em_utils_selection_set_uidlist(GtkSelectionData *data, const gchar *uri, GPtrArray *uids);
-void em_utils_selection_get_uidlist(GtkSelectionData *data, CamelFolder *dest, gint move, CamelException *ex);
+void em_utils_selection_get_uidlist(GtkSelectionData *data, CamelFolder *dest, gint move, GError **error);
 void em_utils_selection_set_urilist(GtkSelectionData *data, CamelFolder *folder, GPtrArray *uids);
 void em_utils_selection_get_urilist(GtkSelectionData *data, CamelFolder *folder);
 
diff --git a/mail/importers/elm-importer.c b/mail/importers/elm-importer.c
index 937bfa5..87c94ff 100644
--- a/mail/importers/elm-importer.c
+++ b/mail/importers/elm-importer.c
@@ -205,7 +205,7 @@ elm_import_done(struct _elm_import_msg *m)
 {
 	printf("importing complete\n");
 
-	if (!camel_exception_is_set(&m->base.ex)) {
+	if (m->base.error == NULL) {
 		GConfClient *gconf;
 
 		gconf = gconf_client_get_default();
diff --git a/mail/importers/evolution-mbox-importer.c b/mail/importers/evolution-mbox-importer.c
index dc419dc..8467f2c 100644
--- a/mail/importers/evolution-mbox-importer.c
+++ b/mail/importers/evolution-mbox-importer.c
@@ -204,7 +204,7 @@ mbox_status_timeout(gpointer data)
 }
 
 static void
-mbox_import_done(gpointer data, CamelException *ex)
+mbox_import_done(gpointer data, GError **error)
 {
 	MboxImporter *importer = data;
 
@@ -330,7 +330,7 @@ mbox_get_preview (EImport *ei, EImportTarget *target, EImportImporter *im)
 		gchar *from;
 
 		msg = camel_mime_message_new();
-		if (camel_mime_part_construct_from_parser ((CamelMimePart *)msg, mp) == -1) {
+		if (camel_mime_part_construct_from_parser ((CamelMimePart *)msg, mp, NULL) == -1) {
 			g_object_unref (msg);
 			break;
 		}
diff --git a/mail/importers/mail-importer.c b/mail/importers/mail-importer.c
index 35abd83..7c49710 100644
--- a/mail/importers/mail-importer.c
+++ b/mail/importers/mail-importer.c
@@ -54,7 +54,7 @@ struct _import_mbox_msg {
 	gchar *uri;
 	CamelOperation *cancel;
 
-	void (*done)(gpointer data, CamelException *ex);
+	void (*done)(gpointer data, GError **error);
 	gpointer done_data;
 };
 
@@ -122,7 +122,8 @@ import_mbox_exec (struct _import_mbox_msg *m)
 	if (m->uri == NULL || m->uri[0] == 0)
 		folder = e_mail_local_get_folder (E_MAIL_FOLDER_INBOX);
 	else
-		folder = mail_tool_uri_to_folder(m->uri, CAMEL_STORE_FOLDER_CREATE, &m->base.ex);
+		folder = mail_tool_uri_to_folder (
+			m->uri, CAMEL_STORE_FOLDER_CREATE, &m->base.error);
 
 	if (folder == NULL)
 		return;
@@ -160,7 +161,7 @@ import_mbox_exec (struct _import_mbox_msg *m)
 			camel_operation_progress(NULL, pc);
 
 			msg = camel_mime_message_new();
-			if (camel_mime_part_construct_from_parser((CamelMimePart *)msg, mp) == -1) {
+			if (camel_mime_part_construct_from_parser((CamelMimePart *)msg, mp, NULL) == -1) {
 				/* set exception? */
 				g_object_unref (msg);
 				break;
@@ -179,11 +180,12 @@ import_mbox_exec (struct _import_mbox_msg *m)
 				flags |= decode_status(tmp);
 
 			camel_message_info_set_flags(info, flags, ~0);
-			camel_folder_append_message(folder, msg, info, NULL, &m->base.ex);
+			camel_folder_append_message (
+				folder, msg, info, NULL, &m->base.error);
 			camel_message_info_free(info);
 			g_object_unref (msg);
 
-			if (camel_exception_is_set(&m->base.ex))
+			if (m->base.error != NULL)
 				break;
 
 			camel_mime_parser_step(mp, NULL, NULL);
@@ -206,7 +208,7 @@ static void
 import_mbox_done (struct _import_mbox_msg *m)
 {
 	if (m->done)
-		m->done(m->done_data, &m->base.ex);
+		m->done(m->done_data, &m->base.error);
 }
 
 static void
@@ -227,7 +229,7 @@ static MailMsgInfo import_mbox_info = {
 };
 
 gint
-mail_importer_import_mbox(const gchar *path, const gchar *folderuri, CamelOperation *cancel, void (*done)(gpointer data, CamelException *), gpointer data)
+mail_importer_import_mbox(const gchar *path, const gchar *folderuri, CamelOperation *cancel, void (*done)(gpointer data, GError **), gpointer data)
 {
 	struct _import_mbox_msg *m;
 	gint id;
diff --git a/mail/importers/mail-importer.h b/mail/importers/mail-importer.h
index 15de575..01a69c9 100644
--- a/mail/importers/mail-importer.h
+++ b/mail/importers/mail-importer.h
@@ -46,7 +46,7 @@ EImportImporter *pine_importer_peek(void);
 #define MSG_FLAG_MARKED 0x0004
 #define MSG_FLAG_EXPUNGED 0x0008
 
-gint mail_importer_import_mbox(const gchar *path, const gchar *folderuri, CamelOperation *cancel, void (*done)(gpointer data, CamelException *), gpointer data);
+gint mail_importer_import_mbox(const gchar *path, const gchar *folderuri, CamelOperation *cancel, void (*done)(gpointer data, GError **), gpointer data);
 void mail_importer_import_mbox_sync(const gchar *path, const gchar *folderuri, CamelOperation *cancel);
 
 struct _MailImporterSpecial {
diff --git a/mail/importers/pine-importer.c b/mail/importers/pine-importer.c
index e6cc75e..354d53d 100644
--- a/mail/importers/pine-importer.c
+++ b/mail/importers/pine-importer.c
@@ -247,7 +247,7 @@ pine_import_done (struct _pine_import_msg *m)
 {
 	printf("importing complete\n");
 
-	if (!camel_exception_is_set(&m->base.ex)) {
+	if (m->base.error == NULL) {
 		GConfClient *gconf;
 
 		gconf = gconf_client_get_default();
diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c
index 7a8a206..d4c4e52 100644
--- a/mail/mail-folder-cache.c
+++ b/mail/mail-folder-cache.c
@@ -779,7 +779,7 @@ ping_store_exec (struct _ping_store_msg *m)
 			online = TRUE;
 	}
 	if (online)
-		camel_store_noop (m->store, &m->base.ex);
+		camel_store_noop (m->store, &m->base.error);
 }
 
 static void
diff --git a/mail/mail-mt.c b/mail/mail-mt.c
index 76a6ccc..9714481 100644
--- a/mail/mail-mt.c
+++ b/mail/mail-mt.c
@@ -76,7 +76,6 @@ mail_msg_new (MailMsgInfo *info)
 	msg->ref_count = 1;
 	msg->seq = mail_msg_seq++;
 	msg->cancel = camel_operation_new(mail_operation_status, GINT_TO_POINTER(msg->seq));
-	camel_exception_init(&msg->ex);
 	msg->priv = g_slice_new0 (MailMsgPrivate);
 	msg->priv->cancelable = TRUE;
 
@@ -146,7 +145,9 @@ mail_msg_free (MailMsg *mail_msg)
 		camel_operation_unref (mail_msg->cancel);
 	}
 
-	camel_exception_clear (&mail_msg->ex);
+	if (mail_msg->error != NULL)
+		g_error_free (mail_msg->error);
+
 	g_slice_free (MailMsgPrivate, mail_msg->priv);
 	g_slice_free1 (mail_msg->info->size, mail_msg);
 }
@@ -245,9 +246,9 @@ mail_msg_check_error (gpointer msg)
 	checkmem(m->priv);
 #endif
 
-	if (!camel_exception_is_set(&m->ex)
-	    || m->ex.id == CAMEL_EXCEPTION_USER_CANCEL
-	    || m->ex.id == CAMEL_EXCEPTION_FOLDER_INVALID_UID
+	if (m->error == NULL
+	    || g_error_matches (m->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)
+	    || g_error_matches (m->error, CAMEL_FOLDER_ERROR, CAMEL_FOLDER_ERROR_INVALID_UID)
 	    || (m->cancel && camel_operation_cancel_check (m->cancel)))
 		return;
 
@@ -260,7 +261,7 @@ mail_msg_check_error (gpointer msg)
 	if (g_hash_table_lookup(active_errors, m->info)) {
 		g_message (
 			"Error occurred while existing dialogue active:\n%s",
-			camel_exception_get_description(&m->ex));
+			m->error->message);
 		return;
 	}
 
@@ -270,12 +271,12 @@ mail_msg_check_error (gpointer msg)
 	    && (what = m->info->desc (m))) {
 		gd = (GtkDialog *) e_alert_dialog_new_for_args (
 			parent, "mail:async-error", what,
-			camel_exception_get_description(&m->ex), NULL);
+			m->error->message, NULL);
 		g_free(what);
 	} else
 		gd = (GtkDialog *) e_alert_dialog_new_for_args (
 			parent, "mail:async-error-nodescribe",
-			camel_exception_get_description(&m->ex), NULL);
+			m->error->message, NULL);
 
 	g_hash_table_insert(active_errors, m->info, gd);
 	g_signal_connect(gd, "response", G_CALLBACK(error_response), m->info);
diff --git a/mail/mail-mt.h b/mail/mail-mt.h
index 261b376..d8b4fc7 100644
--- a/mail/mail-mt.h
+++ b/mail/mail-mt.h
@@ -41,7 +41,7 @@ struct _MailMsg {
 	guint seq;	/* seq number for synchronisation */
 	gint priority;		/* priority (default = 0) */
 	CamelOperation *cancel;	/* a cancellation/status handle */
-	CamelException ex;	/* an initialised camel exception, upto the caller to use this */
+	GError *error;		/* up to the caller to use this */
 	MailMsgPrivate *priv;
 };
 
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index 5297614..ae2d12d 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -115,15 +115,17 @@ em_filter_folder_element_exec (struct _filter_mail_msg *m)
 	else
 		folder_uids = uids = camel_folder_get_uids (folder);
 
-	camel_filter_driver_filter_folder (m->driver, folder, m->cache, uids, m->delete, &m->base.ex);
-	camel_filter_driver_flush (m->driver, &m->base.ex);
+	camel_filter_driver_filter_folder (
+		m->driver, folder, m->cache, uids,
+		m->delete, &m->base.error);
+	camel_filter_driver_flush (m->driver, &m->base.error);
 
 	if (folder_uids)
 		camel_folder_free_uids (folder, folder_uids);
 
 	/* sync our source folder */
 	if (!m->cache)
-		camel_folder_sync (folder, FALSE, camel_exception_is_set (&m->base.ex) ? NULL : &m->base.ex);
+		camel_folder_sync (folder, FALSE, &m->base.error);
 	camel_folder_thaw (folder);
 
 	if (m->destination)
@@ -260,20 +262,26 @@ fetch_mail_exec (struct _fetch_mail_msg *m)
 	/* FIXME: this should support keep_on_server too, which would then perform a spool
 	   access thingy, right?  problem is matching raw messages to uid's etc. */
 	if (!strncmp (m->source_uri, "mbox:", 5)) {
-		gchar *path = mail_tool_do_movemail (m->source_uri, &fm->base.ex);
+		gchar *path = mail_tool_do_movemail (m->source_uri, &fm->base.error);
 
-		if (path && !camel_exception_is_set (&fm->base.ex)) {
+		if (path && fm->base.error == NULL) {
 			camel_folder_freeze (fm->destination);
-			camel_filter_driver_set_default_folder (fm->driver, fm->destination);
-			camel_filter_driver_filter_mbox (fm->driver, path, m->source_uri, &fm->base.ex);
+			camel_filter_driver_set_default_folder (
+				fm->driver, fm->destination);
+			camel_filter_driver_filter_mbox (
+				fm->driver, path, m->source_uri,
+				&fm->base.error);
 			camel_folder_thaw (fm->destination);
 
-			if (!camel_exception_is_set (&fm->base.ex))
+			if (fm->base.error == NULL)
 				g_unlink (path);
 		}
 		g_free (path);
 	} else {
-		CamelFolder *folder = fm->source_folder = mail_tool_get_inbox (m->source_uri, &fm->base.ex);
+		CamelFolder *folder;
+
+		folder = fm->source_folder =
+			mail_tool_get_inbox (m->source_uri, &fm->base.error);
 
 		if (folder) {
 			/* this handles 'keep on server' stuff, if we have any new uid's to copy
@@ -304,14 +312,14 @@ fetch_mail_exec (struct _fetch_mail_msg *m)
 					em_filter_folder_element_exec (fm);
 
 					/* need to uncancel so writes/etc. don't fail */
-					if (fm->base.ex.id == CAMEL_EXCEPTION_USER_CANCEL)
+					if (g_error_matches (fm->base.error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
 						camel_operation_uncancel(NULL);
 
 					/* save the cache of uids that we've just downloaded */
 					camel_uid_cache_save (cache);
 				}
 
-				if (fm->delete && !camel_exception_is_set (&fm->base.ex)) {
+				if (fm->delete && fm->base.error == NULL) {
 					/* not keep on server - just delete all the actual messages on the server */
 					for (i=0;i<folder_uids->len;i++) {
 						d(printf("force delete uid '%s'\n", (gchar *)folder_uids->pdata[i]));
@@ -319,7 +327,7 @@ fetch_mail_exec (struct _fetch_mail_msg *m)
 					}
 				}
 
-				if ((fm->delete || cache_uids) && !camel_exception_is_set (&fm->base.ex)) {
+				if ((fm->delete || cache_uids) && fm->base.error == NULL) {
 					/* expunge messages (downloaded so far) */
 					camel_folder_sync(folder, fm->delete, NULL);
 				}
@@ -448,7 +456,12 @@ static void report_status (struct _send_queue_msg *m, enum camel_filter_status_t
 
 /* send 1 message to a specific transport */
 static void
-mail_send_message (struct _send_queue_msg *m, CamelFolder *queue, const gchar *uid, const gchar *destination, CamelFilterDriver *driver, CamelException *ex)
+mail_send_message (struct _send_queue_msg *m,
+                   CamelFolder *queue,
+                   const gchar *uid,
+                   const gchar *destination,
+                   CamelFilterDriver *driver,
+                   GError **error)
 {
 	EAccount *account = NULL;
 	const CamelInternetAddress *iaddr;
@@ -463,8 +476,9 @@ mail_send_message (struct _send_queue_msg *m, CamelFolder *queue, const gchar *u
 	struct _camel_header_raw *xev, *header;
 	CamelMimeMessage *message;
 	gint i;
+	GError *local_error = NULL;
 
-	message = camel_folder_get_message(queue, uid, ex);
+	message = camel_folder_get_message(queue, uid, error);
 	if (!message)
 		return;
 
@@ -529,12 +543,13 @@ mail_send_message (struct _send_queue_msg *m, CamelFolder *queue, const gchar *u
 	}
 
 	if (camel_address_length(recipients) > 0) {
-		xport = camel_session_get_transport (session, transport_url ? transport_url : destination, ex);
-		if (camel_exception_is_set(ex))
+		xport = camel_session_get_transport (
+			session, transport_url ? transport_url :
+			destination, error);
+		if (xport == NULL)
 			goto exit;
 
-		camel_transport_send_to(xport, message, from, recipients, ex);
-		if (camel_exception_is_set(ex))
+		if (!camel_transport_send_to (xport, message, from, recipients, error))
 			goto exit;
 	}
 
@@ -564,30 +579,36 @@ mail_send_message (struct _send_queue_msg *m, CamelFolder *queue, const gchar *u
 	mail_tool_restore_xevolution_headers (message, xev);
 
 	if (driver) {
-		camel_filter_driver_filter_message (driver, message, info,
-						    NULL, NULL, NULL, "", ex);
+		camel_filter_driver_filter_message (
+			driver, message, info, NULL,
+			NULL, NULL, "", &local_error);
 
-		if (camel_exception_is_set (ex)) {
-			if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_USER_CANCEL)
+		if (local_error != NULL) {
+			if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
 				goto exit;
 
 			/* sending mail, filtering failed */
-			g_string_append_printf (err, _("Failed to apply outgoing filters: %s"),
-						camel_exception_get_description (ex));
+			g_string_append_printf (
+				err, _("Failed to apply outgoing filters: %s"),
+				local_error->message);
+
+			g_clear_error (&local_error);
 		}
 	}
 
-	camel_exception_clear (ex);
-
 	if (xport == NULL
 	    || !( ((CamelService *)xport)->provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER)) {
+		GError *local_error = NULL;
+
 		if (sent_folder_uri) {
-			folder = mail_tool_uri_to_folder (sent_folder_uri, 0, ex);
-			if (camel_exception_is_set(ex)) {
-				g_string_append_printf (err, _("Failed to append to %s: %s\n"
-							"Appending to local 'Sent' folder instead."),
-						sent_folder_uri, camel_exception_get_description (ex));
-				camel_exception_clear (ex);
+			folder = mail_tool_uri_to_folder (
+				sent_folder_uri, 0, &local_error);
+			if (folder == NULL) {
+				g_string_append_printf (
+					err, _("Failed to append to %s: %s\n"
+					"Appending to local 'Sent' folder instead."),
+					sent_folder_uri, local_error->message);
+				g_clear_error (&local_error);
 			}
 		}
 
@@ -596,11 +617,10 @@ mail_send_message (struct _send_queue_msg *m, CamelFolder *queue, const gchar *u
 			g_object_ref (folder);
 		}
 
-		camel_folder_append_message (folder, message, info, NULL, ex);
-		if (camel_exception_is_set (ex)) {
+		if (!camel_folder_append_message (folder, message, info, NULL, &local_error)) {
 			CamelFolder *sent_folder;
 
-			if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_USER_CANCEL)
+			if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
 				goto exit;
 
 			sent_folder = e_mail_local_get_folder (E_MAIL_FOLDER_SENT);
@@ -614,38 +634,49 @@ mail_send_message (struct _send_queue_msg *m, CamelFolder *queue, const gchar *u
 				g_string_append_printf (
 					err, _("Failed to append to %s: %s\n"
 					"Appending to local 'Sent' folder instead."),
-					description, camel_exception_get_description (ex));
+					description, local_error->message);
 				g_object_ref (sent_folder);
 				g_object_unref (folder);
 				folder = sent_folder;
 
-				camel_exception_clear (ex);
-				camel_folder_append_message (folder, message, info, NULL, ex);
+				g_clear_error (&local_error);
+				camel_folder_append_message (
+					folder, message, info, NULL, &local_error);
 			}
 
-			if (camel_exception_is_set (ex)) {
-				if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_USER_CANCEL)
+			if (local_error != NULL) {
+				if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
 					goto exit;
 
 				if (err->len)
 					g_string_append(err, "\n\n");
-				g_string_append_printf (err, _("Failed to append to local 'Sent' folder: %s"),
-						camel_exception_get_description (ex));
+				g_string_append_printf (
+					err, _("Failed to append to local 'Sent' folder: %s"),
+					local_error->message);
 			}
 		}
 	}
-	if (!camel_exception_is_set(ex)) {
-		camel_folder_set_message_flags (queue, uid, CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_SEEN, ~0);
-		/* Sync it to disk, since if it crashes in between, we keep sending it again on next start. */
+
+	if (local_error == NULL) {
+		camel_folder_set_message_flags (
+			queue, uid, CAMEL_MESSAGE_DELETED |
+			CAMEL_MESSAGE_SEEN, ~0);
+		/* Sync it to disk, since if it crashes in between,
+		 * we keep sending it again on next start. */
 		camel_folder_sync (queue, FALSE, NULL);
 	}
 
 	if (err->len) {
 		/* set the culmulative exception report */
-		camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, err->str);
+		g_set_error (
+			&local_error, CAMEL_ERROR,
+			CAMEL_ERROR_GENERIC, "%s", err->str);
 	}
 
 exit:
+	if (local_error != NULL)
+		g_propagate_error (error, local_error);
+
 	if (folder) {
 		camel_folder_sync(folder, FALSE, NULL);
 		g_object_unref (folder);
@@ -704,8 +735,8 @@ send_queue_exec (struct _send_queue_msg *m)
 {
 	CamelFolder *sent_folder;
 	GPtrArray *uids, *send_uids = NULL;
-	CamelException ex;
 	gint i, j;
+	GError *local_error = NULL;
 
 	d(printf("sending queue\n"));
 
@@ -742,8 +773,6 @@ send_queue_exec (struct _send_queue_msg *m)
 	if (!m->cancel)
 		camel_operation_start (NULL, _("Sending message"));
 
-	camel_exception_init (&ex);
-
 	/* NB: This code somewhat abuses the 'exception' stuff.  Apart from fatal problems, it is also
 	   used as a mechanism to accumualte warning messages and present them back to the user. */
 
@@ -754,21 +783,38 @@ send_queue_exec (struct _send_queue_msg *m)
 		if (!m->cancel)
 			camel_operation_progress (NULL, (i+1) * 100 / send_uids->len);
 
-		mail_send_message (m, m->queue, send_uids->pdata[i], m->destination, m->driver, &ex);
-		if (camel_exception_is_set (&ex)) {
-			if (ex.id != CAMEL_EXCEPTION_USER_CANCEL) {
+		mail_send_message (
+			m, m->queue, send_uids->pdata[i],
+			m->destination, m->driver, &local_error);
+		if (local_error != NULL) {
+			if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
 				/* merge exceptions into one */
-				if (camel_exception_is_set (&m->base.ex))
-					camel_exception_setv (&m->base.ex, CAMEL_EXCEPTION_SYSTEM, "%s\n\n%s", m->base.ex.desc, ex.desc);
-				else
-					camel_exception_xfer (&m->base.ex, &ex);
-				camel_exception_clear (&ex);
+				if (m->base.error != NULL) {
+					gchar *old_message;
+
+					old_message = g_strdup (
+						m->base.error->message);
+					g_clear_error (&m->base.error);
+					g_set_error (
+						&m->base.error, CAMEL_ERROR,
+						CAMEL_ERROR_GENERIC,
+						"%s\n\n%s", old_message,
+						local_error->message);
+					g_free (old_message);
+
+					g_clear_error (&local_error);
+				} else {
+					g_propagate_error (&m->base.error, local_error);
+					local_error = NULL;
+				}
 
 				/* keep track of the number of failures */
 				j++;
 			} else {
-				/* transfer the USER_CANCEL exeption to the async op exception and then break */
-				camel_exception_xfer (&m->base.ex, &ex);
+				/* transfer the USER_CANCEL error to the
+				 * async op exception and then break */
+				g_propagate_error (&m->base.error, local_error);
+				local_error = NULL;
 				break;
 			}
 		}
@@ -778,7 +824,7 @@ send_queue_exec (struct _send_queue_msg *m)
 
 	if (j > 0)
 		report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Failed to send %d of %d messages"), j, send_uids->len);
-	else if (m->base.ex.id == CAMEL_EXCEPTION_USER_CANCEL)
+	else if (g_error_matches (m->base.error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
 		report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Canceled."));
 	else
 		report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Complete."));
@@ -791,15 +837,11 @@ send_queue_exec (struct _send_queue_msg *m)
 	camel_folder_free_uids (m->queue, uids);
 	g_ptr_array_free (send_uids, TRUE);
 
-	if (j <= 0 && !camel_exception_is_set (&m->base.ex)) {
-		camel_folder_sync (m->queue, TRUE, &ex);
-		camel_exception_clear (&ex);
-	}
+	if (j <= 0 && m->base.error == NULL)
+		camel_folder_sync (m->queue, TRUE, NULL);
 
-	if (sent_folder) {
-		camel_folder_sync (sent_folder, FALSE, &ex);
-		camel_exception_clear (&ex);
-	}
+	if (sent_folder)
+		camel_folder_sync (sent_folder, FALSE, NULL);
 
 	if (!m->cancel)
 		camel_operation_end (NULL);
@@ -900,14 +942,17 @@ static void
 append_mail_exec (struct _append_msg *m)
 {
 	camel_mime_message_set_date(m->message, CAMEL_MESSAGE_DATE_CURRENT, 0);
-	camel_folder_append_message(m->folder, m->message, m->info, &m->appended_uid, &m->base.ex);
+	camel_folder_append_message(m->folder, m->message, m->info, &m->appended_uid, &m->base.error);
 }
 
 static void
 append_mail_done (struct _append_msg *m)
 {
 	if (m->done)
-		m->done(m->folder, m->message, m->info, !camel_exception_is_set(&m->base.ex), m->appended_uid, m->data);
+		m->done (
+			m->folder, m->message,
+			m->info, m->base.error == NULL,
+			m->appended_uid, m->data);
 }
 
 static void
@@ -980,8 +1025,8 @@ transfer_messages_exec (struct _transfer_msg *m)
 {
 	CamelFolder *dest;
 
-	dest = mail_tool_uri_to_folder (m->dest_uri, m->dest_flags, &m->base.ex);
-	if (camel_exception_is_set (&m->base.ex))
+	dest = mail_tool_uri_to_folder (m->dest_uri, m->dest_flags, &m->base.error);
+	if (dest == NULL)
 		return;
 
 	if (dest == m->source) {
@@ -993,7 +1038,7 @@ transfer_messages_exec (struct _transfer_msg *m)
 	camel_folder_freeze (m->source);
 	camel_folder_freeze (dest);
 
-	camel_folder_transfer_messages_to (m->source, m->uids, dest, NULL, m->delete, &m->base.ex);
+	camel_folder_transfer_messages_to (m->source, m->uids, dest, NULL, m->delete, &m->base.error);
 
 	/* make sure all deleted messages are marked as seen */
 
@@ -1015,7 +1060,7 @@ static void
 transfer_messages_done (struct _transfer_msg *m)
 {
 	if (m->done)
-		m->done (!camel_exception_is_set (&m->base.ex), m->data);
+		m->done (m->base.error == NULL, m->data);
 }
 
 static void
@@ -1089,18 +1134,18 @@ get_folderinfo_exec (struct _get_folderinfo_msg *m)
 {
 	guint32 flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
 
-	m->info = camel_store_get_folder_info (m->store, NULL, flags, &m->base.ex);
+	m->info = camel_store_get_folder_info (m->store, NULL, flags, &m->base.error);
 }
 
 static void
 get_folderinfo_done (struct _get_folderinfo_msg *m)
 {
-	if (!m->info && camel_exception_is_set (&m->base.ex)) {
+	if (!m->info && m->base.error != NULL) {
 		gchar *url;
 
 		url = camel_service_get_url (CAMEL_SERVICE (m->store));
 		w(g_warning ("Error getting folder info from store at %s: %s",
-			     url, camel_exception_get_description (&m->base.ex)));
+			     url, m->base.error->message));
 		g_free (url);
 	}
 
@@ -1234,7 +1279,7 @@ get_folder_desc (struct _get_folder_msg *m)
 static void
 get_folder_exec (struct _get_folder_msg *m)
 {
-	m->folder = mail_tool_uri_to_folder (m->uri, m->flags, &m->base.ex);
+	m->folder = mail_tool_uri_to_folder (m->uri, m->flags, &m->base.error);
 }
 
 static void
@@ -1376,7 +1421,7 @@ get_store_exec (struct _get_store_msg *m)
 
 	m->store = (CamelStore *) camel_session_get_service (session, m->uri,
 							     CAMEL_PROVIDER_STORE,
-							     &m->base.ex);
+							     &m->base.error);
 }
 
 static void
@@ -1430,7 +1475,7 @@ struct _remove_folder_msg {
 
 	CamelFolder *folder;
 	gboolean removed;
-	void (*done) (CamelFolder *folder, gboolean removed, CamelException *ex, gpointer data);
+	void (*done) (CamelFolder *folder, gboolean removed, GError **error, gpointer data);
 	gpointer data;
 };
 
@@ -1440,22 +1485,22 @@ remove_folder_desc (struct _remove_folder_msg *m)
 	return g_strdup_printf (_("Removing folder '%s'"), camel_folder_get_full_name (m->folder));
 }
 
-static void
-remove_folder_rec (CamelStore *store, CamelFolderInfo *fi, CamelException *ex)
+static gboolean
+remove_folder_rec (CamelStore *store, CamelFolderInfo *fi, GError **error)
 {
 	while (fi) {
 		CamelFolder *folder;
 
 		if (fi->child) {
-			remove_folder_rec (store, fi->child, ex);
-			if (camel_exception_is_set (ex))
-				return;
+			if (!remove_folder_rec (store, fi->child, error))
+				return FALSE;
 		}
 
 		d(printf ("deleting folder '%s'\n", fi->full_name));
 
-		if (!(folder = camel_store_get_folder (store, fi->full_name, 0, ex)))
-			return;
+		folder = camel_store_get_folder (store, fi->full_name, 0, error);
+		if (folder == NULL)
+			return FALSE;
 
 		if (!CAMEL_IS_VEE_FOLDER (folder)) {
 			GPtrArray *uids = camel_folder_get_uids (folder);
@@ -1477,12 +1522,13 @@ remove_folder_rec (CamelStore *store, CamelFolderInfo *fi, CamelException *ex)
 			camel_store_unsubscribe_folder (store, fi->full_name, NULL);
 
 		/* Then delete the folder from the store */
-		camel_store_delete_folder (store, fi->full_name, ex);
-		if (camel_exception_is_set (ex))
-			return;
+		if (!camel_store_delete_folder (store, fi->full_name, error))
+			return FALSE;
 
 		fi = fi->next;
 	}
+
+	return TRUE;
 }
 
 static void
@@ -1497,21 +1543,24 @@ remove_folder_exec (struct _remove_folder_msg *m)
 	full_name = camel_folder_get_full_name (m->folder);
 	parent_store = camel_folder_get_parent_store (m->folder);
 
-	fi = camel_store_get_folder_info (parent_store, full_name, CAMEL_STORE_FOLDER_INFO_RECURSIVE | CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, &m->base.ex);
-	if (camel_exception_is_set (&m->base.ex))
+	fi = camel_store_get_folder_info (
+		parent_store, full_name,
+		CAMEL_STORE_FOLDER_INFO_RECURSIVE |
+		CAMEL_STORE_FOLDER_INFO_FAST |
+		CAMEL_STORE_FOLDER_INFO_SUBSCRIBED,
+		&m->base.error);
+	if (fi == NULL)
 		return;
 
-	remove_folder_rec (parent_store, fi, &m->base.ex);
+	m->removed = remove_folder_rec (parent_store, fi, &m->base.error);
 	camel_store_free_folder_info (parent_store, fi);
-
-	m->removed = !camel_exception_is_set (&m->base.ex);
 }
 
 static void
 remove_folder_done (struct _remove_folder_msg *m)
 {
 	if (m->done)
-		m->done (m->folder, m->removed, &m->base.ex, m->data);
+		m->done (m->folder, m->removed, &m->base.error, m->data);
 }
 
 static void
@@ -1529,7 +1578,7 @@ static MailMsgInfo remove_folder_info = {
 };
 
 void
-mail_remove_folder (CamelFolder *folder, void (*done) (CamelFolder *folder, gboolean removed, CamelException *ex, gpointer data), gpointer data)
+mail_remove_folder (CamelFolder *folder, void (*done) (CamelFolder *folder, gboolean removed, GError **error, gpointer data), gpointer data)
 {
 	struct _remove_folder_msg *m;
 
@@ -1564,7 +1613,7 @@ sync_folder_desc (struct _sync_folder_msg *m)
 static void
 sync_folder_exec (struct _sync_folder_msg *m)
 {
-	camel_folder_sync(m->folder, FALSE, &m->base.ex);
+	camel_folder_sync(m->folder, FALSE, &m->base.error);
 }
 
 static void
@@ -1631,7 +1680,7 @@ sync_store_desc (struct _sync_store_msg *m)
 static void
 sync_store_exec (struct _sync_store_msg *m)
 {
-	camel_store_sync(m->store, m->expunge, &m->base.ex);
+	camel_store_sync(m->store, m->expunge, &m->base.error);
 }
 
 static void
@@ -1681,10 +1730,10 @@ refresh_folder_desc (struct _sync_folder_msg *m)
 static void
 refresh_folder_exec (struct _sync_folder_msg *m)
 {
-	/* camel_folder_sync (m->folder, FALSE, &m->base.ex); */
+	/* camel_folder_sync (m->folder, FALSE, &m->base.error); */
 
-	/* if (!camel_exception_is_set (&m->base.ex)) */
-		camel_folder_refresh_info(m->folder, &m->base.ex);
+	/* if (!camel_exception_is_set (&m->base.error)) */
+		camel_folder_refresh_info(m->folder, &m->base.error);
 }
 
 /* we just use the sync stuff where we can, since it would be the same */
@@ -1721,7 +1770,7 @@ expunge_folder_desc (struct _sync_folder_msg *m)
 static void
 expunge_folder_exec (struct _sync_folder_msg *m)
 {
-	camel_folder_expunge(m->folder, &m->base.ex);
+	camel_folder_expunge(m->folder, &m->base.error);
 }
 
 /* we just use the sync stuff where we can, since it would be the same */
@@ -1772,16 +1821,16 @@ empty_trash_exec (struct _empty_trash_msg *m)
 	gchar *uri;
 
 	if (m->account) {
-		trash = mail_tool_get_trash (m->account->source->url, FALSE, &m->base.ex);
+		trash = mail_tool_get_trash (m->account->source->url, FALSE, &m->base.error);
 	} else {
 		data_dir = mail_session_get_data_dir ();
 		uri = g_strdup_printf ("mbox:%s/local", data_dir);
-		trash = mail_tool_get_trash (uri, TRUE, &m->base.ex);
+		trash = mail_tool_get_trash (uri, TRUE, &m->base.error);
 		g_free (uri);
 	}
 
 	if (trash) {
-		camel_folder_expunge (trash, &m->base.ex);
+		camel_folder_expunge (trash, &m->base.error);
 		g_object_unref (trash);
 	}
 }
@@ -1848,7 +1897,7 @@ get_message_exec (struct _get_message_msg *m)
 	if (m->base.cancel && camel_operation_cancel_check (m->base.cancel))
 		m->message = NULL;
 	else
-		m->message = camel_folder_get_message (m->folder, m->uid, &m->base.ex);
+		m->message = camel_folder_get_message (m->folder, m->uid, &m->base.error);
 }
 
 static void
@@ -1899,14 +1948,14 @@ mail_get_message(CamelFolder *folder, const gchar *uid, void (*done) (CamelFolde
 	return id;
 }
 
-typedef void (*get_done)(CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, CamelException *);
+typedef void (*get_done)(CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, GError **error);
 
 static void
 get_messagex_done (struct _get_message_msg *m)
 {
 	if (m->done && !camel_operation_cancel_check (m->cancel)) {
 		get_done done = (get_done)m->done;
-		done(m->folder, m->uid, m->message, m->data, &m->base.ex);
+		done(m->folder, m->uid, m->message, m->data, &m->base.error);
 	}
 }
 
@@ -1921,8 +1970,15 @@ static MailMsgInfo get_messagex_info = {
 /* This is temporary, to avoid having to rewrite everything that uses
    mail_get_message; it adds an exception argument to the callback */
 gint
-mail_get_messagex(CamelFolder *folder, const gchar *uid, void (*done) (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, CamelException *),
-		 gpointer data, MailMsgDispatchFunc dispatch)
+mail_get_messagex (CamelFolder *folder,
+                   const gchar *uid,
+                   void (*done) (CamelFolder *folder,
+                                 const gchar *uid,
+                                 CamelMimeMessage *msg,
+                                 gpointer data,
+                                 GError **error),
+                   gpointer data,
+                   MailMsgDispatchFunc dispatch)
 {
 	struct _get_message_msg *m;
 	gint id;
@@ -1971,7 +2027,7 @@ get_messages_exec (struct _get_messages_msg *m)
 	for (i=0; i<m->uids->len; i++) {
 		gint pc = ((i+1) * 100) / m->uids->len;
 
-		message = camel_folder_get_message(m->folder, m->uids->pdata[i], &m->base.ex);
+		message = camel_folder_get_message(m->folder, m->uids->pdata[i], &m->base.error);
 		camel_operation_progress(m->base.cancel, pc);
 		if (message == NULL)
 			break;
@@ -2111,7 +2167,7 @@ save_messages_exec (struct _save_messages_msg *m)
 		CamelMimeMessage *message;
 		gint pc = ((i+1) * 100) / m->uids->len;
 
-		message = camel_folder_get_message(m->folder, m->uids->pdata[i], &m->base.ex);
+		message = camel_folder_get_message(m->folder, m->uids->pdata[i], &m->base.error);
 		camel_operation_progress(m->base.cancel, pc);
 		if (message == NULL)
 			break;
@@ -2120,14 +2176,21 @@ save_messages_exec (struct _save_messages_msg *m)
 
 		/* we need to flush after each stream write since we are writing to the same fd */
 		from = camel_mime_message_build_mbox_from(message);
-		if (camel_stream_write_string(stream, from) == -1
-		    || camel_stream_flush(stream) == -1
-		    || camel_data_wrapper_write_to_stream((CamelDataWrapper *)message, (CamelStream *)filtered_stream) == -1
-		    || camel_stream_flush((CamelStream *)filtered_stream) == -1
-		    || camel_stream_write_string(stream, "\n") == -1
-		    || camel_stream_flush(stream) == -1) {
-			camel_exception_setv(&m->base.ex, CAMEL_EXCEPTION_SYSTEM,
-					     _("Error saving messages to: %s:\n %s"), m->path, g_strerror(errno));
+		if (camel_stream_write_string (
+			stream, from, &m->base.error) == -1
+		    || camel_stream_flush(stream, &m->base.error) == -1
+		    || camel_data_wrapper_write_to_stream (
+			(CamelDataWrapper *) message,
+			(CamelStream *)filtered_stream, &m->base.error) == -1
+		    || camel_stream_flush (
+			(CamelStream *)filtered_stream, &m->base.error) == -1
+		    || camel_stream_write_string (
+			stream, "\n", &m->base.error) == -1
+		    || camel_stream_flush(stream, &m->base.error) == -1) {
+			g_prefix_error (
+				&m->base.error,
+				_("Error saving messages to: %s:\n"),
+				m->path);
 			g_free(from);
 			g_object_unref ((CamelObject *)message);
 			break;
@@ -2216,17 +2279,21 @@ save_part_exec (struct _save_part_msg *m)
 
 	if (!m->readonly) {
 		if (!(stream = camel_stream_vfs_new_with_uri (path, CAMEL_STREAM_VFS_CREATE))) {
-			camel_exception_setv (&m->base.ex, CAMEL_EXCEPTION_SYSTEM,
-					      _("Cannot create output file: %s:\n %s"),
-					      path, g_strerror (errno));
+			g_set_error (
+				&m->base.error, G_FILE_ERROR,
+				g_file_error_from_errno (errno),
+				_("Cannot create output file: %s:\n %s"),
+				path, g_strerror (errno));
 			if (path != m->path)
 				g_free (path);
 			return;
 		}
 	} else if (!(stream = camel_stream_vfs_new_with_uri (path, CAMEL_STREAM_VFS_CREATE))) {
-		camel_exception_setv (&m->base.ex, CAMEL_EXCEPTION_SYSTEM,
-				      _("Cannot create output file: %s:\n %s"),
-				      path, g_strerror (errno));
+		g_set_error (
+			&m->base.error, G_FILE_ERROR,
+			g_file_error_from_errno (errno),
+			_("Cannot create output file: %s:\n %s"),
+			path, g_strerror (errno));
 		if (path != m->path)
 			g_free (path);
 		return;
@@ -2237,11 +2304,10 @@ save_part_exec (struct _save_part_msg *m)
 
 	content = camel_medium_get_content (CAMEL_MEDIUM (m->part));
 
-	if (camel_data_wrapper_decode_to_stream (content, stream) == -1
-	    || camel_stream_flush (stream) == -1)
-		camel_exception_setv (&m->base.ex, CAMEL_EXCEPTION_SYSTEM,
-				      _("Could not write data: %s"),
-				      g_strerror (errno));
+	if (camel_data_wrapper_decode_to_stream (
+		content, stream, &m->base.error) == -1
+	    || camel_stream_flush (stream, &m->base.error) == -1)
+		g_prefix_error (&m->base.error, _("Could not write data: "));
 
 	g_object_unref (stream);
 }
@@ -2250,7 +2316,7 @@ static void
 save_part_done (struct _save_part_msg *m)
 {
 	if (m->done)
-		m->done (m->part, m->path, !camel_exception_is_set (&m->base.ex), m->data);
+		m->done (m->part, m->path, m->base.error == NULL, m->data);
 }
 
 static void
@@ -2307,14 +2373,14 @@ prep_offline_exec (struct _prep_offline_msg *m)
 	if (m->cancel)
 		camel_operation_register(m->cancel);
 
-	folder = mail_tool_uri_to_folder(m->uri, 0, &m->base.ex);
+	folder = mail_tool_uri_to_folder(m->uri, 0, &m->base.error);
 	if (folder) {
 		if (CAMEL_IS_DISCO_FOLDER(folder)) {
 			camel_disco_folder_prepare_for_offline((CamelDiscoFolder *)folder,
 							       "(match-all)",
-							       &m->base.ex);
+							       &m->base.error);
 		} else if (CAMEL_IS_OFFLINE_FOLDER (folder)) {
-			camel_offline_folder_downsync ((CamelOfflineFolder *) folder, "(match-all)", &m->base.ex);
+			camel_offline_folder_downsync ((CamelOfflineFolder *) folder, "(match-all)", &m->base.error);
 		}
 		/* prepare_for_offline should do this? */
 		/* of course it should all be atomic, but ... */
@@ -2398,31 +2464,31 @@ set_offline_exec (struct _set_offline_msg *m)
 		if (!m->offline) {
 			camel_disco_store_set_status (CAMEL_DISCO_STORE (m->store),
 						      CAMEL_DISCO_STORE_ONLINE,
-						      &m->base.ex);
+						      &m->base.error);
 			return;
 		} else if (camel_disco_store_can_work_offline (CAMEL_DISCO_STORE (m->store))) {
 			camel_disco_store_set_status (CAMEL_DISCO_STORE (m->store),
 						      CAMEL_DISCO_STORE_OFFLINE,
-						      &m->base.ex);
+						      &m->base.error);
 			return;
 		}
 	} else if (CAMEL_IS_OFFLINE_STORE (m->store)) {
 		if (!m->offline) {
 			camel_offline_store_set_network_state (CAMEL_OFFLINE_STORE (m->store),
 							       CAMEL_OFFLINE_STORE_NETWORK_AVAIL,
-							       &m->base.ex);
+							       &m->base.error);
 			return;
 		} else {
 			camel_offline_store_set_network_state (CAMEL_OFFLINE_STORE (m->store),
 							       CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL,
-							       &m->base.ex);
+							       &m->base.error);
 			return;
 		}
 	}
 
 	if (m->offline)
 		camel_service_disconnect (CAMEL_SERVICE (m->store),
-					  TRUE, &m->base.ex);
+					  TRUE, &m->base.error);
 }
 
 static void
@@ -2492,10 +2558,10 @@ prepare_offline_exec (struct _set_offline_msg *m)
 {
 	if (CAMEL_IS_DISCO_STORE (m->store)) {
 		camel_disco_store_prepare_for_offline (CAMEL_DISCO_STORE (m->store),
-					       &m->base.ex);
+					       &m->base.error);
 	} else if (CAMEL_IS_OFFLINE_STORE (m->store)) {
 		camel_offline_store_prepare_for_offline (CAMEL_OFFLINE_STORE (m->store),
-							 &m->base.ex);
+							 &m->base.error);
 	}
 }
 
@@ -2575,13 +2641,13 @@ check_service_exec (struct _check_msg *m)
 {
 	CamelService *service;
 
-	service = camel_session_get_service(session, m->url, m->type, &m->base.ex);
+	service = camel_session_get_service(session, m->url, m->type, &m->base.error);
 	if (!service) {
 		camel_operation_unregister(m->base.cancel);
 		return;
 	}
 
-	m->authtypes = camel_service_query_auth_types(service, &m->base.ex);
+	m->authtypes = camel_service_query_auth_types(service, &m->base.error);
 	g_object_unref (service);
 }
 
diff --git a/mail/mail-ops.h b/mail/mail-ops.h
index 506de4c..7a3f045 100644
--- a/mail/mail-ops.h
+++ b/mail/mail-ops.h
@@ -51,7 +51,7 @@ gint mail_get_message (CamelFolder *folder, const gchar *uid,
 
 gint
 mail_get_messagex(CamelFolder *folder, const gchar *uid,
-		  void (*done) (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, CamelException *),
+		  void (*done) (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, GError **error),
 		  gpointer data, MailMsgDispatchFunc dispatch);
 
 /* get several messages */
@@ -105,7 +105,7 @@ gint mail_get_folderinfo (CamelStore *store, CamelOperation *op,
 
 /* remove an existing folder */
 void mail_remove_folder (CamelFolder *folder,
-			 void (*done) (CamelFolder *folder, gboolean removed, CamelException *ex, gpointer data),
+			 void (*done) (CamelFolder *folder, gboolean removed, GError **error, gpointer data),
 			 gpointer data);
 
 /* transfer (copy/move) a folder */
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index 149b11d..6516925 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -122,7 +122,7 @@ struct _send_info {
 	struct _send_data *data;
 };
 
-static CamelFolder *receive_get_folder(CamelFilterDriver *d, const gchar *uri, gpointer data, CamelException *ex);
+static CamelFolder *receive_get_folder(CamelFilterDriver *d, const gchar *uri, gpointer data, GError **error);
 
 static struct _send_data *send_data = NULL;
 static GtkWidget *send_recv_dialog = NULL;
@@ -372,16 +372,13 @@ static send_info_t
 get_receive_type(const gchar *url)
 {
 	CamelProvider *provider;
-	CamelException ex;
 
 	/* HACK: since mbox is ALSO used for native evolution trees now, we need to
 	   fudge this to treat it as a special 'movemail' source */
 	if (!strncmp(url, "mbox:", 5))
 		return SEND_RECEIVE;
 
-	camel_exception_init (&ex);
-	provider = camel_provider_get(url, &ex);
-	camel_exception_clear (&ex);
+	provider = camel_provider_get(url, NULL);
 
 	if (!provider)
 		return SEND_INVALID;
@@ -792,7 +789,7 @@ receive_done (const gchar *uri, gpointer data)
    This can also be used to hook into which folders are being updated, and occasionally
    let them refresh */
 static CamelFolder *
-receive_get_folder(CamelFilterDriver *d, const gchar *uri, gpointer data, CamelException *ex)
+receive_get_folder(CamelFilterDriver *d, const gchar *uri, gpointer data, GError **error)
 {
 	struct _send_info *info = data;
 	CamelFolder *folder;
@@ -806,7 +803,7 @@ receive_get_folder(CamelFilterDriver *d, const gchar *uri, gpointer data, CamelE
 		g_object_ref (oldinfo->folder);
 		return oldinfo->folder;
 	}
-	folder = mail_tool_uri_to_folder (uri, 0, ex);
+	folder = mail_tool_uri_to_folder (uri, 0, error);
 	if (!folder)
 		return NULL;
 
@@ -838,12 +835,8 @@ receive_get_folder(CamelFilterDriver *d, const gchar *uri, gpointer data, CamelE
 static void
 get_folders (CamelStore *store, GPtrArray *folders, CamelFolderInfo *info)
 {
-	CamelException ex;
-
-	camel_exception_init (&ex);
-
 	while (info) {
-		if (camel_store_can_refresh_folder (store, info, &ex)) {
+		if (camel_store_can_refresh_folder (store, info, NULL)) {
 			CamelURL *url = camel_url_new (info->uri, NULL);
 
 			if (url && (!camel_url_get_param (url, "noselect") || !g_str_equal (camel_url_get_param (url, "noselect"), "yes")))
@@ -852,7 +845,6 @@ get_folders (CamelStore *store, GPtrArray *folders, CamelFolderInfo *info)
 			if (url)
 				camel_url_free (url);
 		}
-		camel_exception_clear (&ex);
 
 		get_folders (store, folders, info->child);
 		info = info->next;
@@ -879,21 +871,19 @@ refresh_folders_exec (struct _refresh_folders_msg *m)
 {
 	gint i;
 	CamelFolder *folder;
-	CamelException ex = CAMEL_EXCEPTION_INITIALISER;
+	GError *local_error = NULL;
 
 	get_folders (m->store, m->folders, m->finfo);
 
 	for (i=0;i<m->folders->len;i++) {
-		folder = mail_tool_uri_to_folder(m->folders->pdata[i], 0, &ex);
+		folder = mail_tool_uri_to_folder(m->folders->pdata[i], 0, &local_error);
 		if (folder) {
-			camel_folder_sync (folder, FALSE, &ex);
-			camel_exception_clear(&ex);
-			camel_folder_refresh_info(folder, &ex);
-			camel_exception_clear(&ex);
+			camel_folder_sync (folder, FALSE, NULL);
+			camel_folder_refresh_info(folder, NULL);
 			g_object_unref (folder);
-		} else if (camel_exception_is_set(&ex)) {
-			g_warning ("Failed to refresh folders: %s", camel_exception_get_description (&ex));
-			camel_exception_clear (&ex);
+		} else if (local_error != NULL) {
+			g_warning ("Failed to refresh folders: %s", local_error->message);
+			g_clear_error (&local_error);
 		}
 
 		if (camel_operation_cancel_check(m->info->cancel))
diff --git a/mail/mail-session.c b/mail/mail-session.c
index 8714823..e2da638 100644
--- a/mail/mail-session.c
+++ b/mail/mail-session.c
@@ -89,16 +89,16 @@ struct _MailSessionClass {
 static gchar *mail_data_dir;
 static gchar *mail_config_dir;
 
-static gchar *get_password(CamelSession *session, CamelService *service, const gchar *domain, const gchar *prompt, const gchar *item, guint32 flags, CamelException *ex);
-static gboolean forget_password(CamelSession *session, CamelService *service, const gchar *domain, const gchar *item, CamelException *ex);
+static gchar *get_password(CamelSession *session, CamelService *service, const gchar *domain, const gchar *prompt, const gchar *item, guint32 flags, GError **error);
+static gboolean forget_password(CamelSession *session, CamelService *service, const gchar *domain, const gchar *item, GError **error);
 static gboolean alert_user(CamelSession *session, CamelSessionAlertType type, const gchar *prompt, gboolean cancel);
-static CamelFilterDriver *get_filter_driver(CamelSession *session, const gchar *type, CamelException *ex);
+static CamelFilterDriver *get_filter_driver(CamelSession *session, const gchar *type, GError **error);
 static gboolean lookup_addressbook(CamelSession *session, const gchar *name);
 
 static void ms_thread_status(CamelSession *session, CamelSessionThreadMsg *msg, const gchar *text, gint pc);
 static gpointer ms_thread_msg_new(CamelSession *session, CamelSessionThreadOps *ops, guint size);
 static void ms_thread_msg_free(CamelSession *session, CamelSessionThreadMsg *m);
-static void ms_forward_to (CamelSession *session, CamelFolder *folder, CamelMimeMessage *message, const gchar *address, CamelException *ex);
+static gboolean ms_forward_to (CamelSession *session, CamelFolder *folder, CamelMimeMessage *message, const gchar *address, GError **error);
 
 GType mail_session_get_type (void);
 
@@ -175,8 +175,13 @@ make_key (CamelService *service, const gchar *item)
 /* ********************************************************************** */
 
 static gchar *
-get_password (CamelSession *session, CamelService *service, const gchar *domain,
-	      const gchar *prompt, const gchar *item, guint32 flags, CamelException *ex)
+get_password (CamelSession *session,
+              CamelService *service,
+              const gchar *domain,
+              const gchar *prompt,
+              const gchar *item,
+              guint32 flags,
+              GError **error)
 {
 	gchar *url;
 	gchar *ret = NULL;
@@ -266,7 +271,10 @@ get_password (CamelSession *session, CamelService *service, const gchar *domain,
 	g_free(url);
 
 	if (ret == NULL)
-		camel_exception_set(ex, CAMEL_EXCEPTION_USER_CANCEL, _("User canceled operation."));
+		g_set_error (
+			error, G_IO_ERROR,
+			G_IO_ERROR_CANCELLED,
+			_("User canceled operation."));
 
 	return ret;
 }
@@ -276,7 +284,7 @@ forget_password (CamelSession *session,
                  CamelService *service,
                  const gchar *domain,
                  const gchar *item,
-                 CamelException *ex)
+                 GError **error)
 {
 	gchar *key = make_key (service, item);
 
@@ -466,9 +474,12 @@ alert_user(CamelSession *session, CamelSessionAlertType type, const gchar *promp
 }
 
 static CamelFolder *
-get_folder (CamelFilterDriver *d, const gchar *uri, gpointer data, CamelException *ex)
+get_folder (CamelFilterDriver *d,
+            const gchar *uri,
+            gpointer data,
+            GError **error)
 {
-	return mail_tool_uri_to_folder(uri, 0, ex);
+	return mail_tool_uri_to_folder (uri, 0, error);
 }
 
 static void
@@ -517,7 +528,7 @@ session_system_beep (CamelFilterDriver *driver, gpointer user_data)
 }
 
 static CamelFilterDriver *
-main_get_filter_driver (CamelSession *session, const gchar *type, CamelException *ex)
+main_get_filter_driver (CamelSession *session, const gchar *type, GError **error)
 {
 	CamelFilterDriver *driver;
 	EFilterRule *rule = NULL;
@@ -599,10 +610,11 @@ main_get_filter_driver (CamelSession *session, const gchar *type, CamelException
 }
 
 static CamelFilterDriver *
-get_filter_driver (CamelSession *session, const gchar *type, CamelException *ex)
+get_filter_driver (CamelSession *session, const gchar *type, GError **error)
 {
-	return (CamelFilterDriver *) mail_call_main (MAIL_CALL_p_ppp, (MailMainFunc) main_get_filter_driver,
-						     session, type, ex);
+	return (CamelFilterDriver *) mail_call_main (
+		MAIL_CALL_p_ppp, (MailMainFunc) main_get_filter_driver,
+		session, type, error);
 }
 
 /* TODO: This is very temporary, until we have a better way to do the progress reporting,
@@ -664,8 +676,12 @@ forward_to_flush_outbox_cb (gpointer data)
 }
 
 static void
-ms_forward_to_cb (CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info,
-		  gint queued, const gchar *appended_uid, gpointer data)
+ms_forward_to_cb (CamelFolder *folder,
+                  CamelMimeMessage *msg,
+                  CamelMessageInfo *info,
+                  gint queued,
+                  const gchar *appended_uid,
+                  gpointer data)
 {
 	static guint preparing_flush = 0;
 
@@ -681,8 +697,12 @@ ms_forward_to_cb (CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *
 	}
 }
 
-static void
-ms_forward_to (CamelSession *session, CamelFolder *folder, CamelMimeMessage *message, const gchar *address, CamelException *ex)
+static gboolean
+ms_forward_to (CamelSession *session,
+               CamelFolder *folder,
+               CamelMimeMessage *message,
+               const gchar *address,
+               GError **error)
 {
 	EAccount *account;
 	CamelMimeMessage *forward;
@@ -693,28 +713,34 @@ ms_forward_to (CamelSession *session, CamelFolder *folder, CamelMimeMessage *mes
 	struct _camel_header_raw *xev;
 	gchar *subject;
 
-	g_return_if_fail (folder != NULL);
-	g_return_if_fail (message != NULL);
-	g_return_if_fail (address != NULL);
+	g_return_val_if_fail (folder != NULL, FALSE);
+	g_return_val_if_fail (message != NULL, FALSE);
+	g_return_val_if_fail (address != NULL, FALSE);
 
 	if (!*address) {
-		camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("No destination address provided, forward of the message has been cancelled."));
-		return;
+		g_set_error (
+			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			_("No destination address provided, forward "
+			  "of the message has been cancelled."));
+		return FALSE;
 	}
 
 	account = em_utils_guess_account_with_recipients (message, folder);
 	if (!account) {
-		camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("No account found to use, forward of the message has been cancelled."));
-		return;
+		g_set_error (
+			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			_("No account found to use, forward of the "
+			  "message has been cancelled."));
+		return FALSE;
 	}
 
 	forward = camel_mime_message_new ();
 
 	/* make copy of the message, because we are going to modify it */
 	mem = camel_stream_mem_new ();
-	camel_data_wrapper_write_to_stream ((CamelDataWrapper *)message, mem);
-	camel_seekable_stream_seek (CAMEL_SEEKABLE_STREAM (mem), 0, CAMEL_STREAM_SET);
-	camel_data_wrapper_construct_from_stream ((CamelDataWrapper *)forward, mem);
+	camel_data_wrapper_write_to_stream ((CamelDataWrapper *)message, mem, NULL);
+	camel_seekable_stream_seek (CAMEL_SEEKABLE_STREAM (mem), 0, CAMEL_STREAM_SET, NULL);
+	camel_data_wrapper_construct_from_stream ((CamelDataWrapper *)forward, mem, NULL);
 	g_object_unref (mem);
 
 	/* clear previous recipients */
@@ -758,6 +784,8 @@ ms_forward_to (CamelSession *session, CamelFolder *folder, CamelMimeMessage *mes
 	out_folder = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
 	camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
 	mail_append_mail (out_folder, forward, info, ms_forward_to_cb, NULL);
+
+	return TRUE;
 }
 
 gchar *
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
index e9470c9..22dfb54 100644
--- a/mail/mail-tools.c
+++ b/mail/mail-tools.c
@@ -44,16 +44,16 @@
 /* **************************************** */
 
 CamelFolder *
-mail_tool_get_inbox (const gchar *url, CamelException *ex)
+mail_tool_get_inbox (const gchar *url, GError **error)
 {
 	CamelStore *store;
 	CamelFolder *folder;
 
-	store = camel_session_get_store (session, url, ex);
+	store = camel_session_get_store (session, url, error);
 	if (!store)
 		return NULL;
 
-	folder = camel_store_get_inbox (store, ex);
+	folder = camel_store_get_inbox (store, error);
 	g_object_unref (store);
 
 	return folder;
@@ -74,21 +74,22 @@ is_local_provider (CamelStore *store)
 }
 
 CamelFolder *
-mail_tool_get_trash (const gchar *url, gint connect, CamelException *ex)
+mail_tool_get_trash (const gchar *url, gint connect, GError **error)
 {
 	CamelStore *store;
 	CamelFolder *trash;
 
 	if (connect)
-		store = camel_session_get_store (session, url, ex);
+		store = camel_session_get_store (session, url, error);
 	else
-		store = (CamelStore *) camel_session_get_service (session, url, CAMEL_PROVIDER_STORE, ex);
+		store = (CamelStore *) camel_session_get_service (
+			session, url, CAMEL_PROVIDER_STORE, error);
 
 	if (!store)
 		return NULL;
 
 	if (connect || ((CamelService *) store)->status == CAMEL_SERVICE_CONNECTED || is_local_provider (store))
-		trash = camel_store_get_trash (store, ex);
+		trash = camel_store_get_trash (store, error);
 	else
 		trash = NULL;
 
@@ -100,7 +101,7 @@ mail_tool_get_trash (const gchar *url, gint connect, CamelException *ex)
 #ifndef G_OS_WIN32
 
 static gchar *
-mail_tool_get_local_movemail_path (const guchar *uri, CamelException *ex)
+mail_tool_get_local_movemail_path (const guchar *uri, GError **error)
 {
 	guchar *safe_uri, *c;
 	const gchar *data_dir;
@@ -116,8 +117,11 @@ mail_tool_get_local_movemail_path (const guchar *uri, CamelException *ex)
 	path = g_build_filename (data_dir, "spool", NULL);
 
 	if (g_stat(path, &st) == -1 && g_mkdir_with_parents(path, 0700) == -1) {
-		camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, _("Could not create spool directory '%s': %s"),
-				     path, g_strerror(errno));
+		g_set_error (
+			error, G_FILE_ERROR,
+			g_file_error_from_errno (errno),
+			_("Could not create spool directory '%s': %s"),
+			path, g_strerror(errno));
 		g_free(path);
 		return NULL;
 	}
@@ -132,33 +136,37 @@ mail_tool_get_local_movemail_path (const guchar *uri, CamelException *ex)
 #endif
 
 gchar *
-mail_tool_do_movemail (const gchar *source_url, CamelException *ex)
+mail_tool_do_movemail (const gchar *source_url, GError **error)
 {
 #ifndef G_OS_WIN32
 	gchar *dest_path;
 	struct stat sb;
 	CamelURL *uri;
+	gboolean success;
 
-	uri = camel_url_new(source_url, ex);
+	uri = camel_url_new(source_url, error);
 	if (uri == NULL)
 		return NULL;
 
 	if (strcmp(uri->protocol, "mbox") != 0) {
 		/* This is really only an internal error anyway */
-		camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID,
-				      _("Trying to movemail a non-mbox source '%s'"),
-				      source_url);
+		g_set_error (
+			error, CAMEL_SERVICE_ERROR,
+			CAMEL_SERVICE_ERROR_URL_INVALID,
+			_("Trying to movemail a non-mbox source '%s'"),
+			source_url);
 		camel_url_free(uri);
 		return NULL;
 	}
 
 	/* Set up our destination. */
-	dest_path = mail_tool_get_local_movemail_path ((guchar *)source_url, ex);
+	dest_path = mail_tool_get_local_movemail_path (
+		(guchar *) source_url, error);
 	if (dest_path == NULL)
 		return NULL;
 
 	/* Movemail from source (source_url) to dest_path */
-	camel_movemail (uri->path, dest_path, ex);
+	success = camel_movemail (uri->path, dest_path, error);
 	camel_url_free(uri);
 
 	if (g_stat (dest_path, &sb) < 0 || sb.st_size == 0) {
@@ -167,7 +175,7 @@ mail_tool_do_movemail (const gchar *source_url, CamelException *ex)
 		return NULL;
 	}
 
-	if (camel_exception_is_set (ex)) {
+	if (!success) {
 		g_free (dest_path);
 		return NULL;
 	}
@@ -275,7 +283,7 @@ mail_tool_make_message_attachment (CamelMimeMessage *message)
 }
 
 CamelFolder *
-mail_tool_uri_to_folder (const gchar *uri, guint32 flags, CamelException *ex)
+mail_tool_uri_to_folder (const gchar *uri, guint32 flags, GError **error)
 {
 	CamelURL *url;
 	CamelStore *store = NULL;
@@ -294,19 +302,23 @@ mail_tool_uri_to_folder (const gchar *uri, guint32 flags, CamelException *ex)
 		/* FIXME?: the filter:get_folder callback should do this itself? */
 		curi = em_uri_to_camel(uri);
 		if (uri == NULL) {
-			camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, _("Invalid folder: '%s'"), uri);
+			g_set_error (
+				error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+				_("Invalid folder: '%s'"), uri);
 			return NULL;
 		}
 		uri = curi;
 	}
 
-	url = camel_url_new (uri + offset, ex);
+	url = camel_url_new (uri + offset, error);
 	if (!url) {
 		g_free(curi);
 		return NULL;
 	}
 
-	store = (CamelStore *)camel_session_get_service(session, uri+offset, CAMEL_PROVIDER_STORE, ex);
+	store = (CamelStore *) camel_session_get_service (
+		session, uri + offset, CAMEL_PROVIDER_STORE, error);
 	if (store) {
 		const gchar *name;
 
@@ -323,11 +335,11 @@ mail_tool_uri_to_folder (const gchar *uri, guint32 flags, CamelException *ex)
 
 		if (offset) {
 			if (offset == 7)
-				folder = camel_store_get_trash (store, ex);
+				folder = camel_store_get_trash (store, error);
 			else if (offset == 6)
-				folder = camel_store_get_junk (store, ex);
+				folder = camel_store_get_junk (store, error);
 		} else
-			folder = camel_store_get_folder (store, name, flags, ex);
+			folder = camel_store_get_folder (store, name, flags, error);
 		g_object_unref (store);
 	}
 
diff --git a/mail/mail-tools.h b/mail/mail-tools.h
index 544c360..01c800f 100644
--- a/mail/mail-tools.h
+++ b/mail/mail-tools.h
@@ -27,14 +27,14 @@
 #include <camel/camel.h>
 
 /* Get the "inbox" for a url (uses global session) */
-CamelFolder *mail_tool_get_inbox (const gchar *url, CamelException *ex);
+CamelFolder *mail_tool_get_inbox (const gchar *url, GError **error);
 
 /* Get the "trash" for a url (uses global session) */
-CamelFolder *mail_tool_get_trash (const gchar *url, gint connect, CamelException *ex);
+CamelFolder *mail_tool_get_trash (const gchar *url, gint connect, GError **error);
 
 /* Does a camel_movemail into the local movemail folder
  * and returns the path to the new movemail folder that was created. which shoudl be freed later */
-gchar *mail_tool_do_movemail (const gchar *source_url, CamelException *ex);
+gchar *mail_tool_do_movemail (const gchar *source_url, GError **error);
 
 struct _camel_header_raw *mail_tool_remove_xevolution_headers (CamelMimeMessage *message);
 void mail_tool_restore_xevolution_headers (CamelMimeMessage *message, struct _camel_header_raw *);
@@ -46,7 +46,7 @@ gchar *mail_tool_generate_forward_subject (CamelMimeMessage *msg);
 CamelMimePart *mail_tool_make_message_attachment (CamelMimeMessage *message);
 
 /* Parse the ui into a real CamelFolder any way we know how. */
-CamelFolder *mail_tool_uri_to_folder (const gchar *uri, guint32 flags, CamelException *ex);
+CamelFolder *mail_tool_uri_to_folder (const gchar *uri, guint32 flags, GError **error);
 
 GHashTable *mail_lookup_url_table (CamelMimeMessage *mime_message);
 
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
index 3e9199a..23fd566 100644
--- a/mail/mail-vfolder.c
+++ b/mail/mail-vfolder.c
@@ -98,13 +98,9 @@ vfolder_setup_exec (struct _setup_msg *m)
 	while (l && !vfolder_shutdown) {
 		d(printf(" Adding uri: %s\n", (gchar *)l->data));
 
-		folder = mail_tool_uri_to_folder (l->data, 0, &m->base.ex);
-		if (folder) {
-			list = g_list_append(list, folder);
-		} else {
-			g_warning("Could not open vfolder source: %s", (gchar *)l->data);
-			camel_exception_clear(&m->base.ex);
-		}
+		folder = mail_tool_uri_to_folder (l->data, 0, NULL);
+		if (folder != NULL)
+			list = g_list_append (list, folder);
 		l = l->next;
 	}
 
@@ -258,7 +254,7 @@ vfolder_adduri_exec (struct _adduri_msg *m)
 	}
 
 	if (folder == NULL)
-		folder = mail_tool_uri_to_folder (m->uri, 0, &m->base.ex);
+		folder = mail_tool_uri_to_folder (m->uri, 0, &m->base.error);
 
 	if (folder != NULL) {
 		l = m->folders;
@@ -1014,7 +1010,6 @@ vfolder_load_storage(void)
 	EFilterRule *rule;
 	gchar *xmlfile;
 	GConfClient *gconf;
-	CamelException ex;
 
 	G_LOCK (vfolder_hash);
 
@@ -1028,19 +1023,15 @@ vfolder_load_storage(void)
 
 	G_UNLOCK (vfolder_hash);
 
-	camel_exception_init (&ex);
-
 	/* first, create the vfolder store, and set it up */
 	data_dir = mail_session_get_data_dir ();
 	storeuri = g_strdup_printf("vfolder:%s/vfolder", data_dir);
-	vfolder_store = camel_session_get_store(session, storeuri, &ex);
+	vfolder_store = camel_session_get_store(session, storeuri, NULL);
 	if (vfolder_store == NULL) {
 		g_warning("Cannot open vfolder store - no vfolders available");
 		return;
 	}
 
-	camel_exception_clear (&ex);
-
 	g_signal_connect (
 		vfolder_store, "folder-deleted",
 		G_CALLBACK (store_folder_deleted_cb), NULL);
diff --git a/mail/message-list.c b/mail/message-list.c
index ecb6301..fdf275b 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -1456,14 +1456,15 @@ get_trimmed_subject (CamelMessageInfo *info)
 }
 
 static gpointer
-ml_tree_value_at_ex (ETreeModel *etm, ETreePath path, gint col, CamelMessageInfo *msg_info, MessageList *message_list)
+ml_tree_value_at_ex (ETreeModel *etm,
+                     ETreePath path,
+                     gint col,
+                     CamelMessageInfo *msg_info,
+                     MessageList *message_list)
 {
-	CamelException ex;
 	const gchar *str;
 	guint32 flags;
 
-	camel_exception_init (&ex);
-
 	g_return_val_if_fail (msg_info != NULL, NULL);
 
 	switch (col) {
@@ -1644,17 +1645,16 @@ ml_tree_value_at_ex (ETreeModel *etm, ETreePath path, gint col, CamelMessageInfo
 		account = mail_config_get_account_by_source_url (url);
 
 		if (account) {
-			curl = camel_url_new (url, &ex);
+			curl = camel_url_new (url, NULL);
 			location = g_strconcat (account->name, ":", curl->path, NULL);
 		} else {
 			/* Local account */
 			euri = em_uri_from_camel(url);
-			curl = camel_url_new (euri, &ex);
+			curl = camel_url_new (euri, NULL);
 			if (curl->host && !strcmp(curl->host, "local") && curl->user && !strcmp(curl->user, "local"))
 				location = g_strconcat (_("On This Computer"), ":",curl->path, NULL);
 		}
 
-		camel_exception_clear (&ex);
 		camel_url_free (curl);
 		g_free (url);
 		g_free (euri);
@@ -2160,7 +2160,10 @@ ml_drop_async_exec (struct _drop_msg *m)
 {
 	switch (m->info) {
 	case DND_X_UID_LIST:
-		em_utils_selection_get_uidlist(m->selection, m->folder, m->action == GDK_ACTION_MOVE, &m->base.ex);
+		em_utils_selection_get_uidlist (
+			m->selection, m->folder,
+			m->action == GDK_ACTION_MOVE,
+			&m->base.error);
 		break;
 	case DND_MESSAGE_RFC822:
 		em_utils_selection_get_message(m->selection, m->folder);
@@ -2181,7 +2184,7 @@ ml_drop_async_done (struct _drop_msg *m)
 		success = FALSE;
 		delete = FALSE;
 	} else {
-		success = !camel_exception_is_set (&m->base.ex);
+		success = (m->base.error == NULL);
 		delete = success && m->move && !m->moved;
 	}
 
@@ -3684,15 +3687,12 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g
 	gboolean hide_deleted;
 	GConfClient *gconf;
 	CamelStore *folder_store;
-	CamelException ex;
 
 	g_return_if_fail (IS_MESSAGE_LIST (message_list));
 
 	if (message_list->folder == folder)
 		return;
 
-	camel_exception_init (&ex);
-
 	if (message_list->seen_id) {
 		g_source_remove (message_list->seen_id);
 		message_list->seen_id = 0;
@@ -4392,7 +4392,8 @@ regen_list_exec (struct _regen_list_msg *m)
 	} else {
 		gboolean store_has_vjunk = folder_store_supports_vjunk_folder (m->folder);
 
-		searchuids = uids = camel_folder_search_by_expression (m->folder, expr, &m->base.ex);
+		searchuids = uids = camel_folder_search_by_expression (
+			m->folder, expr, &m->base.error);
 		/* If m->changes is not NULL, then it means we are called from folder_changed event,
 		   thus we will keep the selected message to be sure it doesn't disappear because
 		   it no longer belong to our search filter. */
@@ -4430,7 +4431,7 @@ regen_list_exec (struct _regen_list_msg *m)
 		}
 	}
 
-	if (camel_exception_is_set (&m->base.ex))
+	if (m->base.error != NULL)
 		return;
 
 	e_profile_event_emit("list.threaduids", m->folder->full_name, 0);
@@ -4446,17 +4447,11 @@ regen_list_exec (struct _regen_list_msg *m)
 			else
 				m->tree = camel_folder_thread_messages_new (m->folder, uids, m->thread_subject);
 		} else {
-			CamelException ex;
-
 			camel_folder_sort_uids (m->ml->folder, uids);
 			m->summary = g_ptr_array_new ();
 
-			camel_exception_init (&ex);
-			camel_folder_summary_prepare_fetch_all (m->folder->summary, &ex);
-			if (camel_exception_is_set (&ex)) {
-				g_warning ("Exception while reloading: %s\n", camel_exception_get_description (&ex));
-				camel_exception_clear (&ex);
-			}
+			camel_folder_summary_prepare_fetch_all (
+				m->folder->summary, NULL);
 
 			for (i = 0; i < uids->len; i++) {
 				info = camel_folder_get_message_info (m->folder, uids->pdata[i]);
diff --git a/modules/calendar/e-cal-attachment-handler.c b/modules/calendar/e-cal-attachment-handler.c
index ce88a18..ce811bf 100644
--- a/modules/calendar/e-cal-attachment-handler.c
+++ b/modules/calendar/e-cal-attachment-handler.c
@@ -80,7 +80,7 @@ attachment_handler_get_component (EAttachment *attachment)
 	stream = camel_stream_mem_new ();
 	camel_stream_mem_set_byte_array (CAMEL_STREAM_MEM (stream), buffer);
 	wrapper = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
-	camel_data_wrapper_decode_to_stream (wrapper, stream);
+	camel_data_wrapper_decode_to_stream (wrapper, stream, NULL);
 	g_object_unref (stream);
 
 	component = e_cal_util_parse_ics_string ((gchar *) buffer->data);
diff --git a/modules/mail/e-mail-attachment-handler.c b/modules/mail/e-mail-attachment-handler.c
index 55de059..3240c56 100644
--- a/modules/mail/e-mail-attachment-handler.c
+++ b/modules/mail/e-mail-attachment-handler.c
@@ -181,13 +181,13 @@ mail_attachment_handler_message_rfc822 (EAttachmentView *view,
 	length = gtk_selection_data_get_length (selection_data);
 
 	stream = camel_stream_mem_new ();
-	camel_stream_write (stream, data, length);
-	camel_stream_reset (stream);
+	camel_stream_write (stream, data, length, NULL);
+	camel_stream_reset (stream, NULL);
 
 	message = camel_mime_message_new ();
 	wrapper = CAMEL_DATA_WRAPPER (message);
 
-	if (camel_data_wrapper_construct_from_stream (wrapper, stream) == -1)
+	if (camel_data_wrapper_construct_from_stream (wrapper, stream, NULL) == -1)
 		goto exit;
 
 	store = e_attachment_view_get_store (view);
@@ -221,7 +221,6 @@ mail_attachment_handler_x_uid_list (EAttachmentView *view,
                                     guint time)
 {
 	static GdkAtom atom = GDK_NONE;
-	CamelException ex = CAMEL_EXCEPTION_INITIALISER;
 	CamelDataWrapper *wrapper;
 	CamelMimeMessage *message;
 	CamelMultipart *multipart;
@@ -236,6 +235,7 @@ mail_attachment_handler_x_uid_list (EAttachmentView *view,
 	gpointer parent;
 	gint length;
 	guint ii;
+	GError *local_error = NULL;
 
 	if (G_UNLIKELY (atom == GDK_NONE))
 		atom = gdk_atom_intern_static_string ("x-uid-list");
@@ -276,14 +276,14 @@ mail_attachment_handler_x_uid_list (EAttachmentView *view,
 		goto exit;
 
 	/* The first string is the folder URI. */
-	folder = mail_tool_uri_to_folder (data, 0, &ex);
+	folder = mail_tool_uri_to_folder (data, 0, &local_error);
 	if (folder == NULL)
 		goto exit;
 
 	/* Handle one message. */
 	if (uids->len == 1) {
 		message = camel_folder_get_message (
-			folder, uids->pdata[0], &ex);
+			folder, uids->pdata[0], &local_error);
 		if (message == NULL)
 			goto exit;
 
@@ -307,7 +307,7 @@ mail_attachment_handler_x_uid_list (EAttachmentView *view,
 
 	for (ii = 0; ii < uids->len; ii++) {
 		message = camel_folder_get_message (
-			folder, uids->pdata[ii], &ex);
+			folder, uids->pdata[ii], &local_error);
 		if (message == NULL) {
 			g_object_unref (multipart);
 			goto exit;
@@ -346,7 +346,7 @@ mail_attachment_handler_x_uid_list (EAttachmentView *view,
 	g_object_unref (multipart);
 
 exit:
-	if (camel_exception_is_set (&ex)) {
+	if (local_error != NULL) {
 		const gchar *folder_name = data;
 
 		if (folder != NULL)
@@ -354,10 +354,9 @@ exit:
 
 		e_alert_run_dialog_for_args (
 			parent, "mail-composer:attach-nomessages",
-			folder_name, camel_exception_get_description (&ex),
-			NULL);
+			folder_name, local_error->message, NULL);
 
-		camel_exception_clear (&ex);
+		g_clear_error (&local_error);
 	}
 
 	if (folder != NULL)
diff --git a/modules/mail/e-mail-shell-view.c b/modules/mail/e-mail-shell-view.c
index e69ae55..3bee268 100644
--- a/modules/mail/e-mail-shell-view.c
+++ b/modules/mail/e-mail-shell-view.c
@@ -551,38 +551,28 @@ all_accounts:
 	/* Add local folders. */
 	iter = mail_vfolder_get_sources_local ();
 	while (iter != NULL) {
-		CamelException ex;
-
-		camel_exception_init (&ex);
-
 		folder_uri = iter->data;
-		folder = mail_tool_uri_to_folder (folder_uri, 0, &ex);
+		folder = mail_tool_uri_to_folder (folder_uri, 0, NULL);
 
 		if (folder != NULL)
 			list = g_list_append (list, folder);
 		else
 			g_warning ("Could not open vfolder source: %s", folder_uri);
 
-		camel_exception_clear (&ex);
 		iter = g_list_next (iter);
 	}
 
 	/* Add remote folders. */
 	iter = mail_vfolder_get_sources_remote ();
 	while (iter != NULL) {
-		CamelException ex;
-
-		camel_exception_init (&ex);
-
 		folder_uri = iter->data;
-		folder = mail_tool_uri_to_folder (folder_uri, 0, &ex);
+		folder = mail_tool_uri_to_folder (folder_uri, 0, NULL);
 
 		if (folder != NULL)
 			list = g_list_append (list, folder);
 		else
 			g_warning ("Could not open vfolder source: %s", folder_uri);
 
-		camel_exception_clear (&ex);
 		iter = g_list_next (iter);
 	}
 
diff --git a/plugins/audio-inline/audio-inline.c b/plugins/audio-inline/audio-inline.c
index 983bf12..802490a 100644
--- a/plugins/audio-inline/audio-inline.c
+++ b/plugins/audio-inline/audio-inline.c
@@ -208,10 +208,10 @@ org_gnome_audio_inline_play_clicked (GtkWidget *button, EMFormatHTMLPObject *pob
 
 		d(printf ("audio inline formatter: write to temp file %s\n", po->filename));
 
-		stream = camel_stream_fs_new_with_name (po->filename, O_RDWR | O_CREAT | O_TRUNC, 0600);
+		stream = camel_stream_fs_new_with_name (po->filename, O_RDWR | O_CREAT | O_TRUNC, 0600, NULL);
 		data = camel_medium_get_content (CAMEL_MEDIUM (po->part));
-		camel_data_wrapper_decode_to_stream (data, stream);
-		camel_stream_flush (stream);
+		camel_data_wrapper_decode_to_stream (data, stream, NULL);
+		camel_stream_flush (stream, NULL);
 		g_object_unref (stream);
 
 		d(printf ("audio inline formatter: init gst playbin\n"));
diff --git a/plugins/bogo-junk-plugin/bf-junk-filter.c b/plugins/bogo-junk-plugin/bf-junk-filter.c
index 6cc2e80..2bd72f9 100644
--- a/plugins/bogo-junk-plugin/bf-junk-filter.c
+++ b/plugins/bogo-junk-plugin/bf-junk-filter.c
@@ -83,7 +83,7 @@ static gboolean em_junk_bf_unicode = TRUE;
 static void
 init_db (void)
 {
-	CamelStream *stream = camel_stream_fs_new_with_name (WELCOME_MESSAGE, O_RDONLY, 0);
+	CamelStream *stream = camel_stream_fs_new_with_name (WELCOME_MESSAGE, O_RDONLY, 0, NULL);
 	CamelMimeParser *parser = camel_mime_parser_new ();
 	CamelMimeMessage *msg = camel_mime_message_new ();
 	const gchar *argv[] = {
@@ -93,11 +93,11 @@ init_db (void)
 		NULL
 	};
 
-	camel_mime_parser_init_with_stream (parser, stream);
+	camel_mime_parser_init_with_stream (parser, stream, NULL);
 	camel_mime_parser_scan_from (parser, FALSE);
 	g_object_unref (stream);
 
-	camel_mime_part_construct_from_parser ((CamelMimePart *) msg, parser);
+	camel_mime_part_construct_from_parser ((CamelMimePart *) msg, parser, NULL);
 	g_object_unref (parser);
 
 	d(fprintf (stderr, "Initing the bogofilter DB with Welcome message\n"));
@@ -164,9 +164,10 @@ retry:
 	}
 
 	stream = camel_stream_fs_new_with_fd (bf_in);
-	camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (msg), stream);
-	camel_stream_flush (stream);
-	camel_stream_close (stream);
+	camel_data_wrapper_write_to_stream (
+		CAMEL_DATA_WRAPPER (msg), stream, NULL);
+	camel_stream_flush (stream, NULL);
+	camel_stream_close (stream, NULL);
 	g_object_unref (stream);
 
 #ifndef G_OS_WIN32
diff --git a/plugins/dbx-import/dbx-importer.c b/plugins/dbx-import/dbx-importer.c
index 8126e85..608a981 100644
--- a/plugins/dbx-import/dbx-importer.c
+++ b/plugins/dbx-import/dbx-importer.c
@@ -105,7 +105,6 @@ typedef struct {
 	gint status_pc;
 	gint status_timeout_id;
 	CamelOperation *status;
-	CamelException ex;
 
 	guint32 *indices;
 	guint32 index_count;
@@ -310,7 +309,9 @@ static gboolean dbx_load_index_table(DbxImporter *m, guint32 pos, guint32 *index
 	d(printf("Loading index table at 0x%x\n", pos));
 
 	if (dbx_pread(m->dbx_fd, &tindex, sizeof(tindex), pos) != sizeof(tindex)) {
-		camel_exception_setv(&m->base.ex, 1, "Failed to read table index from DBX file");
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Failed to read table index from DBX file");
 		return FALSE;
 	}
 	tindex.anotherTablePtr = GUINT32_FROM_LE(tindex.anotherTablePtr);
@@ -318,8 +319,10 @@ static gboolean dbx_load_index_table(DbxImporter *m, guint32 pos, guint32 *index
 	tindex.indexCount = GUINT32_FROM_LE(tindex.indexCount);
 
 	if (tindex.self != pos) {
-		camel_exception_setv(&m->base.ex, 1, "Corrupt DBX file: Index table at 0x%x does not point to itself",
-				     pos);
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Corrupt DBX file: Index table at 0x%x does not "
+			"point to itself", pos);
 		return FALSE;
 	}
 
@@ -336,7 +339,10 @@ static gboolean dbx_load_index_table(DbxImporter *m, guint32 pos, guint32 *index
 
 	for (i = 0; i < tindex.ptrCount; i++) {
 		if (dbx_pread(m->dbx_fd, &index, sizeof(index), pos) != sizeof(index)) {
-			camel_exception_setv(&m->base.ex, 1, "Failed to read index entry from DBX file");
+			g_set_error (
+				&m->base.error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+				"Failed to read index entry from DBX file");
 			return FALSE;
 		}
 		index.indexptr = GUINT32_FROM_LE(index.indexptr);
@@ -344,9 +350,12 @@ static gboolean dbx_load_index_table(DbxImporter *m, guint32 pos, guint32 *index
 		index.indexCount = GUINT32_FROM_LE(index.indexCount);
 		
 		if (*index_ofs == m->index_count) {
-			camel_exception_setv(&m->base.ex, 1,
-					     "Corrupt DBX file: Seems to contain more than %d entries claimed in its header\n",
-					     m->index_count);
+			g_set_error (
+				&m->base.error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+				"Corrupt DBX file: Seems to contain more "
+				"than %d entries claimed in its header",
+				m->index_count);
 			return FALSE;
 		}
 		m->indices[(*index_ofs)++] = index.indexptr;
@@ -364,12 +373,16 @@ static gboolean dbx_load_indices(DbxImporter *m)
 	guint32 index_ofs = 0;
 
 	if (dbx_pread(m->dbx_fd, &indexptr, 4, INDEX_POINTER) != 4) {
-		camel_exception_setv(&m->base.ex, 1, "Failed to read first index pointer from DBX file");
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Failed to read first index pointer from DBX file");
 		return FALSE;
 	}
 
 	if (dbx_pread(m->dbx_fd, &itemcount, 4, ITEM_COUNT) != 4) {
-		camel_exception_setv(&m->base.ex, 1, "Failed to read item count from DBX file");
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Failed to read item count from DBX file");
 		return FALSE;
 	}
 
@@ -385,9 +398,10 @@ static gboolean dbx_load_indices(DbxImporter *m)
 	d(printf("Loaded %d of %d indices\n", index_ofs, m->index_count));
 
 	if (index_ofs < m->index_count) {
-		camel_exception_setv(&m->base.ex, 1,
-				     "Corrupt DBX file: Seems to contain fewer than %d entries claimed in its header\n",
-				     m->index_count);
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Corrupt DBX file: Seems to contain fewer than %d "
+			"entries claimed in its header", m->index_count);
 		return FALSE;
 	}
 	return TRUE;
@@ -410,9 +424,11 @@ dbx_read_mail_body (DbxImporter *m, guint32 offset, gint bodyfd)
 		d(printf("Reading mail data chunk from %x\n", offset));
 
 		if (dbx_pread(m->dbx_fd, &hdr, sizeof(hdr), offset) != sizeof(hdr)) {
-			camel_exception_setv(&m->base.ex, 1,
-					     "Failed to read mail data block from DBX file at offset %x\n",
-					     offset);
+			g_set_error (
+				&m->base.error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+				"Failed to read mail data block from "
+				"DBX file at offset %x", offset);
 			return FALSE;
 		}
 		hdr.self = GUINT32_FROM_LE(hdr.self);
@@ -420,9 +436,11 @@ dbx_read_mail_body (DbxImporter *m, guint32 offset, gint bodyfd)
 		hdr.nextaddress = GUINT32_FROM_LE(hdr.nextaddress);
 
 		if (hdr.self != offset) {
-			camel_exception_setv(&m->base.ex, 1,
-					     "Corrupt DBX file: Mail data block at 0x%x does not point to itself",
-					     offset);
+			g_set_error (
+				&m->base.error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+				"Corrupt DBX file: Mail data block at "
+				"0x%x does not point to itself", offset);
 			return FALSE;
 		}
 
@@ -433,15 +451,19 @@ dbx_read_mail_body (DbxImporter *m, guint32 offset, gint bodyfd)
 		}
 		d(printf("Reading %d bytes from %lx\n", hdr.blocksize, offset + sizeof(hdr)));
 		if (dbx_pread(m->dbx_fd, buffer, hdr.blocksize, offset + sizeof(hdr)) != hdr.blocksize) {
-			camel_exception_setv(&m->base.ex, 1,
-					     "Failed to read mail data from DBX file at offset %x\n",
-					     offset + sizeof(hdr));
+			g_set_error (
+				&m->base.error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+				"Failed to read mail data from DBX file "
+				"at offset %x",
+				offset + sizeof(hdr));
 			return FALSE;
 		}
 		if (write(bodyfd, buffer, hdr.blocksize) != hdr.blocksize) {
-			camel_exception_setv(&m->base.ex, 1,
-					     "Failed to write mail data to temporary file\n",
-					     offset + sizeof(hdr));
+			g_set_error (
+				&m->base.error,
+				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+				"Failed to write mail data to temporary file");
 			return FALSE;
 		}
 		offset = hdr.nextaddress;
@@ -458,25 +480,29 @@ dbx_read_email (DbxImporter *m, guint32 offset, gint bodyfd, gint *flags)
 	int i;
 
 	if (dbx_pread(m->dbx_fd, &hdr, sizeof(hdr), offset) != sizeof(hdr)) {
-		camel_exception_setv(&m->base.ex, 1,
-				     "Failed to read mail header from DBX file at offset %x\n",
-				     offset);
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Failed to read mail header from DBX file at offset %x",
+			offset);
 		return FALSE;
 	}
 	hdr.self = GUINT32_FROM_LE(hdr.self);
 	hdr.size = GUINT32_FROM_LE(hdr.size);
 
 	if (hdr.self != offset) {
-		camel_exception_setv(&m->base.ex, 1, "Corrupt DBX file: Mail header at 0x%x does not point to itself",
-				     offset);
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Corrupt DBX file: Mail header at 0x%x does not "
+			"point to itself", offset);
 		return FALSE;
 	}
 	buffer = g_malloc(hdr.size);
 	offset += sizeof(hdr);
 	if (dbx_pread(m->dbx_fd, buffer, hdr.size, offset) != hdr.size) {
-		camel_exception_setv(&m->base.ex, 1,
-				     "Failed to read mail data block from DBX file at offset %x\n",
-				     offset);
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Failed to read mail data block from DBX file "
+			"at offset %x", offset);
 		g_free(buffer);
 		return FALSE;
 	}
@@ -529,7 +555,7 @@ dbx_import_file (DbxImporter *m)
 	m->parent_uri = g_strdup (((EImportTargetURI *)m->target)->uri_dest); /* Destination folder, was set in our widget */
 
 	camel_operation_start (NULL, _("Importing '%s'"), filename);
-	folder = mail_tool_uri_to_folder (m->parent_uri, CAMEL_STORE_FOLDER_CREATE, &m->base.ex);
+	folder = mail_tool_uri_to_folder (m->parent_uri, CAMEL_STORE_FOLDER_CREATE, &m->base.error);
 	if (!folder)
 		return;
 	d(printf("importing to %s\n", camel_folder_get_full_name(folder)));
@@ -541,7 +567,9 @@ dbx_import_file (DbxImporter *m)
 	g_free (filename);
 
 	if (m->dbx_fd == -1) {
-		camel_exception_setv(&m->base.ex, 1, "Failed to open import file\n");
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Failed to open import file");
 		goto out;
 	}
 
@@ -550,7 +578,9 @@ dbx_import_file (DbxImporter *m)
 
 	tmpfile = e_mkstemp("dbx-import-XXXXXX");
 	if (tmpfile == -1) {
-		camel_exception_setv(&m->base.ex, 1, "Failed to create temporary file for import\n");
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"Failed to create temporary file for import");
 		goto out;
 	}
 
@@ -560,6 +590,7 @@ dbx_import_file (DbxImporter *m)
 		CamelMimeParser *mp;
 		gint dbx_flags = 0;
 		gint flags = 0;
+		gboolean success;
 
 		camel_operation_progress(NULL, 100 * i / m->index_count);
 		camel_operation_progress(m->status, 100 * i / m->index_count);
@@ -567,7 +598,7 @@ dbx_import_file (DbxImporter *m)
 		if (!dbx_read_email(m, m->indices[i], tmpfile, &dbx_flags)) {
 			d(printf("Cannot read email index %d at %x\n",
 				 i, m->indices[i]));
-			if (camel_exception_is_set(&m->base.ex))
+			if (m->base.error != NULL)
 				goto out;
 			missing++;
 			continue;
@@ -585,7 +616,7 @@ dbx_import_file (DbxImporter *m)
 		camel_mime_parser_init_with_fd(mp, tmpfile);
 
 		msg = camel_mime_message_new();
-		if (camel_mime_part_construct_from_parser((CamelMimePart *)msg, mp) == -1) {
+		if (camel_mime_part_construct_from_parser((CamelMimePart *)msg, mp, NULL) == -1) {
 			/* set exception? */
 			g_object_unref (msg);
 			g_object_unref (mp);
@@ -594,11 +625,12 @@ dbx_import_file (DbxImporter *m)
 
 		info = camel_message_info_new(NULL);
 		camel_message_info_set_flags(info, flags, ~0);
-		camel_folder_append_message(folder, msg, info, NULL, &m->base.ex);
+		success = camel_folder_append_message (
+			folder, msg, info, NULL, &m->base.error);
 		camel_message_info_free(info);
 		g_object_unref (msg);
-			
-		if (camel_exception_is_set(&m->base.ex)) {
+
+		if (!success) {
 			g_object_unref(mp);
 			break;
 		}
@@ -611,10 +643,12 @@ dbx_import_file (DbxImporter *m)
 	camel_folder_sync(folder, FALSE, NULL);
 	camel_folder_thaw(folder);
 	g_object_unref(folder);
-	if (missing && !camel_exception_is_set(&m->base.ex)) {
-		camel_exception_setv(&m->base.ex, 1,
-				     "%d messages imported correctly; %d message bodies were not present in the DBX file",
-				     m->index_count - missing, missing);
+	if (missing && m->base.error == NULL) {
+		g_set_error (
+			&m->base.error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+			"%d messages imported correctly; %d message "
+			"bodies were not present in the DBX file",
+			m->index_count - missing, missing);
 	}
 	camel_operation_end(NULL);
 }
diff --git a/plugins/groupwise-features/install-shared.c b/plugins/groupwise-features/install-shared.c
index d2addbf..55a3fb1 100644
--- a/plugins/groupwise-features/install-shared.c
+++ b/plugins/groupwise-features/install-shared.c
@@ -58,7 +58,6 @@ install_folder_response (EMFolderSelector *emfs, gint response, gpointer *data)
 	gchar *parent_name;
 	gchar *container_id;
 	const gchar *item_id;
-	CamelException ex;
 	CamelStore *store;
 	CamelFolder *folder;
 	EAccount *account;
@@ -91,9 +90,9 @@ install_folder_response (EMFolderSelector *emfs, gint response, gpointer *data)
 			else
 				parent_name = NULL;
 		}
-		camel_exception_init (&ex);
-		if (!(store = (CamelStore *) camel_session_get_service (session, uri, CAMEL_PROVIDER_STORE, &ex))) {
-			camel_exception_clear (&ex);
+		store = (CamelStore *) camel_session_get_service (
+			session, uri, CAMEL_PROVIDER_STORE, NULL);
+		if (store == NULL) {
 			g_strfreev (names);
 			return;
 		}
@@ -116,9 +115,8 @@ install_folder_response (EMFolderSelector *emfs, gint response, gpointer *data)
 				account = mail_config_get_account_by_source_url (uri);
 				uri = account->source->url;
 				em_folder_tree_model_remove_store (model, store);
-				camel_exception_init (&ex);
-				if (!(provider = camel_provider_get(uri, &ex))) {
-					camel_exception_clear (&ex);
+				provider = camel_provider_get (uri, NULL);
+				if (provider == NULL) {
 					g_strfreev (names);
 					return;
 				}
@@ -208,8 +206,8 @@ org_gnome_popup_wizard (EPlugin *ep, EMEventTargetMessage *target)
 
 		byte_array = g_byte_array_new ();
 		stream = camel_stream_mem_new_with_byte_array (byte_array);
-		camel_data_wrapper_write_to_stream (dw, stream);
-		camel_stream_write (stream, "", 1);
+		camel_data_wrapper_write_to_stream (dw, stream, NULL);
+		camel_stream_write (stream, "", 1, NULL);
 
 		from_addr = camel_mime_message_get_from ((CamelMimeMessage *)target->message);
 		if (from_addr && camel_internet_address_get(from_addr, 0, &name, &email)) {
diff --git a/plugins/groupwise-features/proxy.c b/plugins/groupwise-features/proxy.c
index c539974..fb0e786 100644
--- a/plugins/groupwise-features/proxy.c
+++ b/plugins/groupwise-features/proxy.c
@@ -642,7 +642,6 @@ org_gnome_proxy (EPlugin *epl, EConfigHookItemFactoryData *data)
 	proxyDialog *prd;
 	proxyDialogPrivate *priv;
 	CamelOfflineStore *store;
-	CamelException ex;
 	gint pag_num;
 
 	target_account = (EMConfigTargetAccount *)data->config->target;
@@ -650,11 +649,11 @@ org_gnome_proxy (EPlugin *epl, EConfigHookItemFactoryData *data)
 	/* We are using some g_object_set on this. We shuold also avoid double-free later. So reffing */
 	g_object_ref (account);
 
-	camel_exception_init (&ex);
-	if (!(store = (CamelOfflineStore *) camel_session_get_service (session, e_account_get_string(account, E_ACCOUNT_SOURCE_URL), CAMEL_PROVIDER_STORE, &ex))) {
-		camel_exception_clear (&ex);
+	store = (CamelOfflineStore *) camel_session_get_service (
+		session, e_account_get_string (account, E_ACCOUNT_SOURCE_URL),
+		CAMEL_PROVIDER_STORE, NULL);
+	if (store == NULL)
 		return NULL;
-	}
 
 	if (g_strrstr (e_account_get_string(account, E_ACCOUNT_SOURCE_URL), "groupwise://"))
 	{
@@ -717,7 +716,7 @@ org_gnome_proxy (EPlugin *epl, EConfigHookItemFactoryData *data)
 	}
 
 	g_object_unref (store);
-	camel_exception_clear (&ex);
+
 	return NULL;
 }
 
diff --git a/plugins/groupwise-features/share-folder-common.c b/plugins/groupwise-features/share-folder-common.c
index 91758da..5323165 100644
--- a/plugins/groupwise-features/share-folder-common.c
+++ b/plugins/groupwise-features/share-folder-common.c
@@ -66,7 +66,6 @@ refresh_folder_tree (EMFolderTreeModel *model, CamelStore *store)
 {
 	gchar *uri;
 	EAccount *account;
-	CamelException ex;
 	CamelProvider *provider;
 
 	uri = camel_url_to_string (((CamelService *) store)->url, CAMEL_URL_HIDE_ALL);
@@ -78,11 +77,10 @@ refresh_folder_tree (EMFolderTreeModel *model, CamelStore *store)
 	uri = account->source->url;
 	em_folder_tree_model_remove_store (model, store);
 
-	camel_exception_init (&ex);
-	if (!(provider = camel_provider_get(uri, &ex))) {
-		camel_exception_clear (&ex);
+	provider = camel_provider_get (uri, NULL);
+	if (provider == NULL)
 		return;
-	}
+
 	if (!(provider->flags & CAMEL_PROVIDER_IS_STORAGE))
 		return;
 	em_folder_tree_model_add_store (model, store, account->name);
@@ -143,9 +141,9 @@ create_folder_exec (struct _EMCreateFolder *m)
 {
 	d(printf ("creating folder parent='%s' name='%s' full_name='%s'\n", m->parent, m->name, m->full_name));
 
-	if ((m->fi = camel_store_create_folder (m->store, m->parent, m->name, &m->base.ex))) {
+	if ((m->fi = camel_store_create_folder (m->store, m->parent, m->name, &m->base.error))) {
 		if (camel_store_supports_subscriptions (m->store))
-			camel_store_subscribe_folder (m->store, m->full_name, &m->base.ex);
+			camel_store_subscribe_folder (m->store, m->full_name, &m->base.error);
 	}
 }
 
@@ -239,7 +237,6 @@ users_dialog_response(GtkWidget *dialog, gint response, struct ShareInfo *ssi)
 	struct _EMFolderTreeModelStoreInfo *si;
 	EMFolderSelector *emfs = ssi->emfs;
 	const gchar *uri, *path;
-	CamelException ex;
 	CamelStore *store;
 
 	if (response != GTK_RESPONSE_OK) {
@@ -253,11 +250,10 @@ users_dialog_response(GtkWidget *dialog, gint response, struct ShareInfo *ssi)
 
 	d(printf ("Creating new folder: %s (%s)\n", path, uri));
 
-	camel_exception_init (&ex);
-	if (!(store = (CamelStore *) camel_session_get_service (session, uri, CAMEL_PROVIDER_STORE, &ex))) {
-		camel_exception_clear (&ex);
+	store = (CamelStore *) camel_session_get_service (
+		session, uri, CAMEL_PROVIDER_STORE, NULL);
+	if (store == NULL)
 		return;
-	}
 
 	if (!(si = em_folder_tree_model_lookup_store_info (ssi->model, store))) {
 		g_assert_not_reached ();
@@ -293,7 +289,6 @@ new_folder_response (EMFolderSelector *emfs, gint response, EMFolderTreeModel *m
 	struct ShareInfo *ssi;
 	const gchar *uri;
 	EGwConnection *cnc;
-	CamelException ex;
 	CamelStore *store;
 
 	ssi = g_new0(struct ShareInfo, 1);
@@ -304,11 +299,10 @@ new_folder_response (EMFolderSelector *emfs, gint response, EMFolderTreeModel *m
 
 	/* i want store at this point to get cnc not sure proper or not*/
 	uri = em_folder_selector_get_selected_uri (emfs);
-	camel_exception_init (&ex);
-	if (!(store = (CamelStore *) camel_session_get_service (session, uri, CAMEL_PROVIDER_STORE, &ex))) {
-		camel_exception_clear (&ex);
+	store = (CamelStore *) camel_session_get_service (
+		session, uri, CAMEL_PROVIDER_STORE, NULL);
+	if (store == NULL)
 		return;
-	}
 
 	cnc = get_cnc (store);
 	users_dialog = gtk_dialog_new_with_buttons (
diff --git a/plugins/image-inline/image-inline.c b/plugins/image-inline/image-inline.c
index 5548948..41b4a89 100644
--- a/plugins/image-inline/image-inline.c
+++ b/plugins/image-inline/image-inline.c
@@ -361,7 +361,7 @@ org_gnome_image_inline_decode (ImageInlinePObject *image_object)
 	/* Stream takes ownership of the byte array. */
 	stream = camel_stream_mem_new_with_byte_array (array);
 	data_wrapper = camel_medium_get_content (medium);
-	camel_data_wrapper_decode_to_stream (data_wrapper, stream);
+	camel_data_wrapper_decode_to_stream (data_wrapper, stream, NULL);
 
 	/* Don't trust the content type in the MIME part.  It could
 	 * be lying or it could be "application/octet-stream".  Let
diff --git a/plugins/imap-features/imap-headers.c b/plugins/imap-features/imap-headers.c
index 910986e..f03c08e 100644
--- a/plugins/imap-features/imap-headers.c
+++ b/plugins/imap-features/imap-headers.c
@@ -88,7 +88,6 @@ imap_headers_commit (EPlugin *efp, EConfigHookItemFactoryData *data)
 		EAccount *temp = NULL;
 		EAccountList *accounts = e_get_account_list ();
 		CamelURL *url = NULL;
-		CamelException ex;
 		GtkTreeModel *model;
 		GtkTreeIter iter;
 		GString *str;
@@ -98,7 +97,7 @@ imap_headers_commit (EPlugin *efp, EConfigHookItemFactoryData *data)
 
 		temp = mail_config_get_account_by_source_url (account->source->url);
 
-		url = camel_url_new (e_account_get_string(account, E_ACCOUNT_SOURCE_URL), &ex);
+		url = camel_url_new (e_account_get_string(account, E_ACCOUNT_SOURCE_URL), NULL);
 
 		model = gtk_tree_view_get_model (ui->custom_headers_tree);
 		if (gtk_tree_model_get_iter_first(model, &iter)) {
@@ -261,7 +260,6 @@ org_gnome_imap_headers (EPlugin *epl, EConfigHookItemFactoryData *data)
 	EAccount *account;
 	GtkWidget *vbox;
 	CamelURL *url = NULL;
-	CamelException ex;
 	GtkBuilder *builder;
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
@@ -290,7 +288,7 @@ org_gnome_imap_headers (EPlugin *epl, EConfigHookItemFactoryData *data)
 	ui->remove_header = GTK_BUTTON(e_builder_get_widget (builder, "removeHeader"));
 	ui->entry_header = GTK_ENTRY (e_builder_get_widget (builder, "customHeaderEntry"));
 
-	url = camel_url_new (e_account_get_string(account, E_ACCOUNT_SOURCE_URL), &ex);
+	url = camel_url_new (e_account_get_string(account, E_ACCOUNT_SOURCE_URL), NULL);
 
 	ui->store = gtk_tree_store_new (1, G_TYPE_STRING);
 	gtk_tree_view_set_model (ui->custom_headers_tree, GTK_TREE_MODEL(ui->store));
diff --git a/plugins/itip-formatter/itip-formatter.c b/plugins/itip-formatter/itip-formatter.c
index c2e3846..cbefc53 100644
--- a/plugins/itip-formatter/itip-formatter.c
+++ b/plugins/itip-formatter/itip-formatter.c
@@ -2569,7 +2569,7 @@ format_itip (EPlugin *ep, EMFormatHookTarget *target)
 
 	byte_array = g_byte_array_new ();
 	stream = camel_stream_mem_new_with_byte_array (byte_array);
-	camel_data_wrapper_decode_to_stream (content, stream);
+	camel_data_wrapper_decode_to_stream (content, stream, NULL);
 
 	if (byte_array->len == 0)
 		puri->vcalendar = NULL;
@@ -2751,6 +2751,6 @@ itip_attachment_frame(EMFormat *emf, CamelStream *stream, EMFormatPURI *puri)
 
 	d(printf("writing to frame content, handler is '%s'\n", info->handle->mime_type));
 	info->handle->handler(emf, stream, info->puri.part, info->handle, FALSE);
-	camel_stream_close(stream);
+	camel_stream_close(stream, NULL);
 }
 
diff --git a/plugins/mail-to-task/mail-to-task.c b/plugins/mail-to-task/mail-to-task.c
index 55a230a..504dca6 100644
--- a/plugins/mail-to-task/mail-to-task.c
+++ b/plugins/mail-to-task/mail-to-task.c
@@ -203,7 +203,7 @@ set_description (ECalComponent *comp, CamelMimeMessage *message)
 
 	byte_array = g_byte_array_new ();
 	stream = camel_stream_mem_new_with_byte_array (byte_array);
-	camel_data_wrapper_decode_to_stream (content, stream);
+	camel_data_wrapper_decode_to_stream (content, stream, NULL);
 	str = g_strndup ((gchar *) byte_array->data, byte_array->len);
 	g_object_unref (stream);
 
diff --git a/plugins/mark-all-read/mark-all-read.c b/plugins/mark-all-read/mark-all-read.c
index 826a596..8e7c158 100644
--- a/plugins/mark-all-read/mark-all-read.c
+++ b/plugins/mark-all-read/mark-all-read.c
@@ -343,29 +343,31 @@ mark_all_as_read (CamelFolder *folder)
 	camel_folder_free_uids (folder, uids);
 }
 
-static void
+static gboolean
 mar_all_sub_folders (CamelStore *store,
                      CamelFolderInfo *fi,
-                     CamelException *ex)
+                     GError **error)
 {
 	while (fi) {
 		CamelFolder *folder;
 
 		if (fi->child) {
-			mar_all_sub_folders (store, fi->child, ex);
-			if (camel_exception_is_set (ex))
-				return;
+			if (!mar_all_sub_folders (store, fi->child, error))
+				return FALSE;
 		}
 
-		if (!(folder = camel_store_get_folder (store, fi->full_name, 0, ex)))
-			return;
+		folder = camel_store_get_folder (
+			store, fi->full_name, 0, error);
+		if (folder == NULL)
+			return FALSE;
 
-		if (!CAMEL_IS_VEE_FOLDER (folder)) {
+		if (!CAMEL_IS_VEE_FOLDER (folder))
 			mark_all_as_read (folder);
-		}
 
 		fi = fi->next;
 	}
+
+	return TRUE;
 }
 
 static void
@@ -375,7 +377,6 @@ mar_got_folder (gchar *folder_uri,
 {
 	CamelFolderInfo *folder_info;
 	CamelStore *parent_store;
-	CamelException ex;
 	const gchar *full_name;
 	gint response;
 
@@ -383,17 +384,15 @@ mar_got_folder (gchar *folder_uri,
 	if (!folder)
 		return;
 
-	camel_exception_init (&ex);
-
 	full_name = camel_folder_get_full_name (folder);
 	parent_store = camel_folder_get_parent_store (folder);
 
 	folder_info = camel_store_get_folder_info (
 		parent_store, full_name,
 		CAMEL_STORE_FOLDER_INFO_RECURSIVE |
-		CAMEL_STORE_FOLDER_INFO_FAST, &ex);
+		CAMEL_STORE_FOLDER_INFO_FAST, NULL);
 
-	if (camel_exception_is_set (&ex))
+	if (folder_info == NULL)
 		goto exit;
 
 	response = prompt_user (folder_info->child != NULL);
@@ -404,7 +403,7 @@ mar_got_folder (gchar *folder_uri,
 	if (response == MARK_ALL_READ_CURRENT_FOLDER)
 		mark_all_as_read (folder);
 	else if (response == MARK_ALL_READ_WITH_SUBFOLDERS)
-		mar_all_sub_folders (parent_store, folder_info, &ex);
+		mar_all_sub_folders (parent_store, folder_info, NULL);
 
 exit:
 	camel_store_free_folder_info (parent_store, folder_info);
diff --git a/plugins/pst-import/pst-importer.c b/plugins/pst-import/pst-importer.c
index 84706b7..13a4868 100644
--- a/plugins/pst-import/pst-importer.c
+++ b/plugins/pst-import/pst-importer.c
@@ -116,7 +116,6 @@ struct _PstImporter {
 	gint status_pc;
 	gint status_timeout_id;
 	CamelOperation *status;
-	CamelException ex;
 
 	pst_file pst;
 
@@ -453,7 +452,7 @@ pst_import_file (PstImporter *m)
 	camel_operation_start (NULL, _("Importing '%s'"), filename);
 
 	if (GPOINTER_TO_INT (g_datalist_get_data (&m->target->data, "pst-do-mail"))) {
-		mail_tool_uri_to_folder (m->parent_uri, CAMEL_STORE_FOLDER_CREATE, &m->base.ex);
+		mail_tool_uri_to_folder (m->parent_uri, CAMEL_STORE_FOLDER_CREATE, &m->base.error);
 	}
 
 	ret = pst_init (&m->pst, filename);
@@ -704,7 +703,7 @@ pst_create_folder (PstImporter *m)
 
 			*pos = '\0';
 
-			folder = mail_tool_uri_to_folder (dest, CAMEL_STORE_FOLDER_CREATE, &m->base.ex);
+			folder = mail_tool_uri_to_folder (dest, CAMEL_STORE_FOLDER_CREATE, &m->base.error);
 			g_object_unref (folder);
 			*pos = '/';
 		}
@@ -716,7 +715,7 @@ pst_create_folder (PstImporter *m)
 		g_object_unref (m->folder);
 	}
 
-	m->folder = mail_tool_uri_to_folder (m->folder_uri, CAMEL_STORE_FOLDER_CREATE, &m->base.ex);
+	m->folder = mail_tool_uri_to_folder (m->folder_uri, CAMEL_STORE_FOLDER_CREATE, &m->base.error);
 
 }
 
@@ -769,6 +768,7 @@ pst_process_email (PstImporter *m, pst_item *item)
 	CamelMimePart *part;
 	CamelMessageInfo *info;
 	pst_item_attach *attach;
+	gboolean success;
 
 	if (m->folder == NULL) {
 		pst_create_folder (m);
@@ -822,7 +822,7 @@ pst_process_email (PstImporter *m, pst_item *item)
 		/*g_message ("  Email headers... %s...", item->email->header);*/
 
 		stream = camel_stream_mem_new_with_buffer (item->email->header.str, strlen (item->email->header.str));
-		if (camel_data_wrapper_construct_from_stream ((CamelDataWrapper *)msg, stream) == -1)
+		if (camel_data_wrapper_construct_from_stream ((CamelDataWrapper *)msg, stream, NULL) == -1)
 			g_warning ("Error reading headers, skipped");
 
 	} else {
@@ -916,16 +916,16 @@ pst_process_email (PstImporter *m, pst_item *item)
 	if (item->flags & 0x08)
 		camel_message_info_set_flags (info, CAMEL_MESSAGE_DRAFT, ~0);
 
-	camel_folder_append_message (m->folder, msg, info, NULL, &m->ex);
+	success = camel_folder_append_message (
+		m->folder, msg, info, NULL, NULL);
 	camel_message_info_free (info);
 	g_object_unref (msg);
 
 	camel_folder_sync (m->folder, FALSE, NULL);
 	camel_folder_thaw (m->folder);
 
-	if (camel_exception_is_set (&m->ex)) {
+	if (!success) {
 		g_critical ("Exception!");
-		camel_exception_clear (&m->ex);
 		return;
 	}
 
@@ -1232,7 +1232,7 @@ set_cal_attachments (ECal *cal, ECalComponent *ec, PstImporter *m, pst_item_atta
 			continue;
 		}
 
-		if (!(stream = camel_stream_fs_new_with_name (path, O_WRONLY | O_CREAT | O_TRUNC, 0666))) {
+		if (!(stream = camel_stream_fs_new_with_name (path, O_WRONLY | O_CREAT | O_TRUNC, 0666, NULL))) {
 			g_warning ("Could not create stream for file %s - %s", path, g_strerror (errno));
 			attach = attach->next;
 			continue;
@@ -1240,8 +1240,8 @@ set_cal_attachments (ECal *cal, ECalComponent *ec, PstImporter *m, pst_item_atta
 
 		content = camel_medium_get_content (CAMEL_MEDIUM (part));
 
-		if (camel_data_wrapper_decode_to_stream (content, stream) == -1
-			|| camel_stream_flush (stream) == -1)
+		if (camel_data_wrapper_decode_to_stream (content, stream, NULL) == -1
+			|| camel_stream_flush (stream, NULL) == -1)
 		{
 			g_warning ("Could not write attachment to %s: %s", path, g_strerror (errno));
 			g_object_unref (stream);
diff --git a/plugins/sa-junk-plugin/em-junk-filter.c b/plugins/sa-junk-plugin/em-junk-filter.c
index 537831a..edfb896 100644
--- a/plugins/sa-junk-plugin/em-junk-filter.c
+++ b/plugins/sa-junk-plugin/em-junk-filter.c
@@ -186,12 +186,13 @@ pipe_to_sa_full (CamelMimeMessage *msg, const gchar *in, const gchar **argv, gin
 	if (msg) {
 		stream = camel_stream_fs_new_with_fd (fds[1]);
 
-		camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (msg), stream);
-		camel_stream_flush (stream);
-		camel_stream_close (stream);
+		camel_data_wrapper_write_to_stream (
+			CAMEL_DATA_WRAPPER (msg), stream, NULL);
+		camel_stream_flush (stream, NULL);
+		camel_stream_close (stream, NULL);
 		g_object_unref (stream);
 	} else if (in) {
-		camel_write (fds[1], in, strlen (in));
+		camel_write (fds[1], in, strlen (in), NULL);
 		close (fds[1]);
 	}
 
@@ -203,7 +204,7 @@ pipe_to_sa_full (CamelMimeMessage *msg, const gchar *in, const gchar **argv, gin
 		memstream = (CamelStreamMem *) camel_stream_mem_new ();
 		camel_stream_mem_set_byte_array (memstream, output_buffer);
 
-		camel_stream_write_to_stream (stream, (CamelStream *) memstream);
+		camel_stream_write_to_stream (stream, (CamelStream *) memstream, NULL);
 		g_object_unref (stream);
 		g_byte_array_append (output_buffer, (guchar *)"", 1);
 
diff --git a/plugins/templates/templates.c b/plugins/templates/templates.c
index 74e167a..5bf3eb7 100644
--- a/plugins/templates/templates.c
+++ b/plugins/templates/templates.c
@@ -483,9 +483,10 @@ create_new_message (CamelFolder *folder, const gchar *uid, CamelMimeMessage *mes
 	/* make the exact copy of the template message, with all
 	   its attachments and message structure */
 	mem = camel_stream_mem_new ();
-	camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (template), mem);
-	camel_stream_reset (mem);
-	camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (new), mem);
+	camel_data_wrapper_write_to_stream (
+		CAMEL_DATA_WRAPPER (template), mem, NULL);
+	camel_stream_reset (mem, NULL);
+	camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (new), mem, NULL);
 	g_object_unref (mem);
 
 	/* Add the headers from the message we are replying to, so CC and that
diff --git a/plugins/tnef-attachments/tnef-plugin.c b/plugins/tnef-attachments/tnef-plugin.c
index 8bb5341..35f152a 100644
--- a/plugins/tnef-attachments/tnef-plugin.c
+++ b/plugins/tnef-attachments/tnef-plugin.c
@@ -86,14 +86,14 @@ org_gnome_format_tnef(gpointer ep, EMFormatHookTarget *t)
 
 	name = g_build_filename(tmpdir, ".evo-attachment.tnef", NULL);
 
-	out = camel_stream_fs_new_with_name(name, O_RDWR|O_CREAT, 0666);
+	out = camel_stream_fs_new_with_name(name, O_RDWR|O_CREAT, 0666, NULL);
 	if (out == NULL)
 	    goto fail;
 	content = camel_medium_get_content ((CamelMedium *)t->part);
 	if (content == NULL)
 		goto fail;
-	if (camel_data_wrapper_decode_to_stream(content, out) == -1
-	    || camel_stream_close(out) == -1) {
+	if (camel_data_wrapper_decode_to_stream(content, out, NULL) == -1
+	    || camel_stream_close(out, NULL) == -1) {
 		g_object_unref (out);
 		goto fail;
 	}
@@ -136,9 +136,9 @@ org_gnome_format_tnef(gpointer ep, EMFormatHookTarget *t)
 
 		path = g_build_filename(tmpdir, d->d_name, NULL);
 
-		stream = camel_stream_fs_new_with_name(path, O_RDONLY, 0);
+		stream = camel_stream_fs_new_with_name(path, O_RDONLY, 0, NULL);
 		content = camel_data_wrapper_new();
-		camel_data_wrapper_construct_from_stream(content, stream);
+		camel_data_wrapper_construct_from_stream(content, stream, NULL);
 		g_object_unref (stream);
 
 		part = camel_mime_part_new();
diff --git a/plugins/vcard-inline/vcard-inline.c b/plugins/vcard-inline/vcard-inline.c
index 0b77562..dffc407 100644
--- a/plugins/vcard-inline/vcard-inline.c
+++ b/plugins/vcard-inline/vcard-inline.c
@@ -99,7 +99,7 @@ org_gnome_vcard_inline_decode (VCardInlinePObject *vcard_object,
 	/* Stream takes ownership of the byte array. */
 	stream = camel_stream_mem_new_with_byte_array (array);
 	data_wrapper = camel_medium_get_content (medium);
-	camel_data_wrapper_decode_to_stream (data_wrapper, stream);
+	camel_data_wrapper_decode_to_stream (data_wrapper, stream, NULL);
 
 	/* because the result is not NULL-terminated */
 	g_byte_array_append (array, padding, 2);
diff --git a/po/POTFILES.in b/po/POTFILES.in
index c41eb6a..24a793e 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -205,8 +205,10 @@ mail/em-folder-utils.c
 mail/em-format-html-display.c
 mail/em-format-html-print.c
 mail/em-format-html.c
+mail/em-html-stream.c
 mail/em-junk.c
 mail/em-subscribe-editor.c
+mail/em-sync-stream.c
 mail/em-utils.c
 mail/em-vfolder-editor.c
 mail/em-vfolder-rule.c
diff --git a/widgets/misc/e-account-combo-box.c b/widgets/misc/e-account-combo-box.c
index 7d34a29..e2306ba 100644
--- a/widgets/misc/e-account-combo-box.c
+++ b/widgets/misc/e-account-combo-box.c
@@ -107,7 +107,6 @@ static gboolean
 account_combo_box_test_account (EAccount *account)
 {
 	CamelStore *store;
-	CamelException ex;
 	const gchar *url;
 	gboolean writable = FALSE;
 
@@ -124,15 +123,13 @@ account_combo_box_test_account (EAccount *account)
 		return TRUE;
 
 	/* Account must be writable. */
-	camel_exception_init (&ex);
 	url = e_account_get_string (account, E_ACCOUNT_SOURCE_URL);
 	store = CAMEL_STORE (camel_session_get_service (
-		camel_session, url, CAMEL_PROVIDER_STORE, &ex));
+		camel_session, url, CAMEL_PROVIDER_STORE, NULL));
 	if (store != NULL) {
 		writable = (store->mode & CAMEL_STORE_WRITE);
 		g_object_unref (store);
 	}
-	camel_exception_clear (&ex);
 
 	return writable;
 }
diff --git a/widgets/misc/e-attachment.c b/widgets/misc/e-attachment.c
index 1872de6..56659ae 100644
--- a/widgets/misc/e-attachment.c
+++ b/widgets/misc/e-attachment.c
@@ -1080,7 +1080,7 @@ e_attachment_add_to_multipart (EAttachment *attachment,
 			CAMEL_STREAM_FILTER (filtered_stream),
 			CAMEL_MIME_FILTER (filter));
 		camel_data_wrapper_decode_to_stream (
-			wrapper, filtered_stream);
+			wrapper, filtered_stream, NULL);
 		g_object_unref (filtered_stream);
 		g_object_unref (stream);
 
@@ -1563,9 +1563,9 @@ attachment_load_finish (LoadContext *load_context)
 	size = g_memory_output_stream_get_data_size (output_stream);
 
 	stream = camel_stream_mem_new_with_buffer (data, size);
-	camel_data_wrapper_construct_from_stream (wrapper, stream);
+	camel_data_wrapper_construct_from_stream (wrapper, stream, NULL);
 	camel_data_wrapper_set_mime_type (wrapper, mime_type);
-	camel_stream_close (stream);
+	camel_stream_close (stream, NULL);
 	g_object_unref (stream);
 
 	mime_part = camel_mime_part_new ();
@@ -2498,7 +2498,7 @@ attachment_save_got_output_stream (SaveContext *save_context)
 	stream = camel_stream_mem_new ();
 	camel_stream_mem_set_byte_array (CAMEL_STREAM_MEM (stream), buffer);
 	wrapper = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
-	camel_data_wrapper_decode_to_stream (wrapper, stream);
+	camel_data_wrapper_decode_to_stream (wrapper, stream, NULL);
 	g_object_unref (stream);
 
 	/* Load the buffer into a GMemoryInputStream.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]