diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
index ab27694..98207d6 100644
--- a/mail/e-mail-browser.c
+++ b/mail/e-mail-browser.c
@@ -362,6 +362,7 @@ mail_browser_dispose (GObject *object)
 	}
 
 	if (priv->message_list != NULL) {
+		g_signal_handlers_disconnect_matched (priv->message_list, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, object);
 		g_object_unref (priv->message_list);
 		priv->message_list = NULL;
 	}
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 5689a96..2d272cb 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -1828,6 +1828,13 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 	g_object_unref (reader);
 }
 
+static void
+cancel_mail_msg (gpointer msg_id)
+{
+	if (msg_id)
+		mail_msg_cancel (GPOINTER_TO_INT (msg_id));
+}
+
 static gboolean
 mail_reader_message_selected_timeout_cb (EMailReader *reader)
 {
@@ -1871,10 +1878,11 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader)
 				g_object_ref (reader),
 				mail_msg_fast_ordered_push);
 
-			g_object_set_data (
+			g_object_set_data_full (
 				G_OBJECT (reader),
 				"preview-get-message-op-id",
-				GINT_TO_POINTER (op_id));
+				GINT_TO_POINTER (op_id),
+				(GDestroyNotify) cancel_mail_msg);
 		}
 	} else
 		em_format_format (EM_FORMAT (html_display), NULL, NULL, NULL);
@@ -1891,14 +1899,10 @@ mail_reader_message_selected_cb (EMailReader *reader,
 {
 	GSource *source;
 	const gchar *key;
-	gpointer data;
 	MessageList *message_list;
 
 	/* First cancel any previous message fetching. */
-	key = "preview-get-message-op-id";
-	data = g_object_get_data (G_OBJECT (reader), key);
-	if (data != NULL)
-		mail_msg_cancel (GPOINTER_TO_INT (data));
+	g_object_set_data (G_OBJECT (reader), "preview-get-message-op-id", NULL);
 
 	/* then cancel the seen timer */
 	message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader));
